diff --git a/.dumi/theme/locale/pluginInfo.ts b/.dumi/theme/locale/pluginInfo.ts index 8a76e6005c..7f8b588c15 100644 --- a/.dumi/theme/locale/pluginInfo.ts +++ b/.dumi/theme/locale/pluginInfo.ts @@ -25,6 +25,19 @@ export default { enterpriseEdition: '企業版', commercialBaseUrl: 'https://www.nocobase.com' }, + 'ru-RU': { + info: 'Информация', + deprecatedInfo: 'УСТАРЕЛО', + bundledPluginMessage: 'Эта функция предоставляется коммерческим плагином {plugins}, входящим в состав {edition}, и не требует дополнительной покупки.', + commercialEdition: 'коммерческое издание', + pluginMessage: 'Эта функция предоставляется {commercial}плагином {plugins}.{license}', + commercial: 'Коммерческим', + licenseDetails: 'Для получения более подробной информации, пожалуйста, ознакомьтесь с {license}.', + commercialLicense: 'Коммерческая лицензия', + deprecatedMessage: '⚠️ Эта функция устарела и не рекомендуется для использования в новых проектах.', + enterpriseEdition: 'корпоративная версия', + commercialBaseUrl: 'https://www.nocobase.com' + }, 'en-US': { info: 'INFO', deprecatedInfo: 'DEPRECATED', @@ -38,4 +51,4 @@ export default { enterpriseEdition: 'enterprise edition', commercialBaseUrl: 'https://www.nocobase.com' } -}; \ No newline at end of file +}; diff --git a/.dumi/theme/slots/LangSwitch/index.tsx b/.dumi/theme/slots/LangSwitch/index.tsx index 0e947f96ec..5d18555b1b 100644 --- a/.dumi/theme/slots/LangSwitch/index.tsx +++ b/.dumi/theme/slots/LangSwitch/index.tsx @@ -26,6 +26,7 @@ const LangSwitch: React.FC = () => { { code: 'en', label: 'English', hostname: 'docs.nocobase.com' }, { code: 'cn', label: '简体中文', hostname: 'docs-cn.nocobase.com' }, { code: 'ja', label: '日本語', hostname: 'docs-jp.nocobase.com' }, + { code: 'ru', label: 'Русский', hostname: 'docs-ru.nocobase.com' }, ]; const currentLang = languages.find(lang => lang.hostname === hostname); diff --git a/.dumirc.ts b/.dumirc.ts index 0aecb6dee6..633f8ebdb1 100644 --- a/.dumirc.ts +++ b/.dumirc.ts @@ -28,6 +28,8 @@ if (lang==='zh-CN'){ site_url = "https://docs-cn.nocobase.com" }else if (lang==='ja-JP'){ site_url = "https://docs-jp.nocobase.com" +}else if (lang==='ru-RU'){ + site_url = "https://docs-ru.nocobase.com" }else { site_url = "https://docs.nocobase.com" } diff --git a/README.md b/README.md index 83159f76e6..fb9135b4cc 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,8 @@ yarn dev:en yarn dev:fr # または、日本語のドキュメントを実行する yarn dev:ja +# или запустите русскоязычный раздел +yarn dev:ru ``` Note: `yarn dev` and `yarn dev:en` cannot be run at the same time diff --git a/docs/config/handbook.ts b/docs/config/handbook.ts index b352f70962..39ec56ab38 100644 --- a/docs/config/handbook.ts +++ b/docs/config/handbook.ts @@ -4,6 +4,7 @@ export default [ 'title.fr-FR': 'Guide', 'title.zh-CN': '指南', 'title.ja-JP': 'ガイド', + 'title.ru-RU': 'Руководство', link: '/handbook', }, { @@ -11,6 +12,7 @@ export default [ 'title.fr-FR': 'Modélisation des données', 'title.zh-CN': '数据建模', 'title.ja-JP': 'データモデリング', + 'title.ru-RU': 'Моделирование данных', type: 'group', children: [ { @@ -18,6 +20,7 @@ export default [ 'title.fr-FR': "Vue d'ensemble", 'title.zh-CN': '概述', 'title.ja-JP': '概要', + 'title.ru-RU': 'Обзор', link: '/handbook/data-modeling', }, { @@ -25,12 +28,14 @@ export default [ 'title.fr-FR': 'Sources de données', 'title.zh-CN': '数据源', 'title.ja-JP': 'データソース', + 'title.ru-RU': 'Источники данных', children: [ { title: 'Data source manager', 'title.fr-FR': 'Gestionnaire de sources de données', 'title.zh-CN': '数据源管理', 'title.ja-JP': 'データソースマネージャー', + 'title.ru-RU': 'Управление источниками данных', link: '/handbook/data-source-manager', }, { @@ -38,6 +43,7 @@ export default [ 'title.fr-FR': 'Source de données principale', 'title.zh-CN': '主数据源', 'title.ja-JP': 'メインデータソース', + 'title.ru-RU': 'Основной источник данных', // subTitle: '@nocobase/plugin-collection-manager', link: '/handbook/data-source-main', }, @@ -46,12 +52,14 @@ export default [ 'title.fr-FR': 'Sources de données externes (Bases de données)', 'title.zh-CN': '外部数据源(数据库)', 'title.ja-JP': '外部データソース(データベース)', + 'title.ru-RU': 'Внешние источники данных (Базы данных)', children: [ { title: 'Overview', 'title.fr-FR': "Vue d'ensemble", 'title.zh-CN': '介绍', 'title.ja-JP': '概要', + 'title.ru-RU': 'Обзор', link: '/handbook/data-source-manager/external-database', }, { @@ -59,6 +67,7 @@ export default [ 'title.fr-FR': 'MySQL externe', 'title.zh-CN': '外部 MySQL', 'title.ja-JP': '外部 MySQL', + 'title.ru-RU': 'Внешние MySQL', // subTitle: '@nocobase/plugin-data-source-external-mysql', link: '/handbook/data-source-external-mysql', }, @@ -67,6 +76,7 @@ export default [ 'title.fr-FR': 'MariaDB externe', 'title.zh-CN': '外部 MariaDB', 'title.ja-JP': '外部 MariaDB', + 'title.ru-RU': 'Внешние MariaDB', // subTitle: '@nocobase/plugin-data-source-external-mariadb', link: '/handbook/data-source-external-mariadb', }, @@ -75,6 +85,7 @@ export default [ 'title.fr-FR': 'PostgreSQL externe', 'title.zh-CN': '外部 PostgreSQL', 'title.ja-JP': '外部 PostgreSQL', + 'title.ru-RU': 'Внешние PostgreSQL', // subTitle: '@nocobase/plugin-data-source-external-postgres', link: '/handbook/data-source-external-postgres', }, @@ -83,6 +94,7 @@ export default [ 'title.fr-FR': 'MSSQL externe', 'title.zh-CN': '外部 MSSQL', 'title.ja-JP': '外部 MSSQL', + 'title.ru-RU': 'Внешние MSSQL', // subTitle: '@nocobase/plugin-data-source-external-mysql', link: '/handbook/data-source-external-mssql', }, @@ -91,6 +103,7 @@ export default [ 'title.fr-FR': 'Oracle externe', 'title.zh-CN': '外部 Oracle', 'title.ja-JP': '外部 Oracle', + 'title.ru-RU': 'Внешние Oracle', // subTitle: '@nocobase/plugin-data-source-external-mysql', link: '/handbook/data-source-external-oracle', }, @@ -101,6 +114,7 @@ export default [ 'title.fr-FR': 'Bases de données: principale vs externe', 'title.zh-CN': '主、外部数据库对比', 'title.ja-JP': 'メイン・外部データベース比較', + 'title.ru-RU': 'Основные и внешние базы данных', link: '/handbook/data-modeling/main-vs-external-data-sources', }, { @@ -108,6 +122,7 @@ export default [ 'title.fr-FR': 'Source de données API REST', 'title.zh-CN': 'REST API 数据源', 'title.ja-JP': 'REST API データソース', + 'title.ru-RU': 'REST API источник данных', // subTitle: '@nocobase/plugin-data-source-external-postgres', link: '/handbook/data-source-rest-api', }, @@ -116,6 +131,7 @@ export default [ 'title.fr-FR': 'Source de données KingbaseES', 'title.zh-CN': '人大金仓(KingbaseES)数据源', 'title.ja-JP': '人大金仓(KingbaseES)データソース', + 'title.ru-RU': '人大金仓(KingbaseES)источник данных', link: '/handbook/data-source-kingbase', }, { @@ -123,6 +139,7 @@ export default [ 'title.fr-FR': 'Outil de gestion des ER', 'title.zh-CN': '类 ER 工具', 'title.ja-JP': 'ER図のようなツール', + 'title.ru-RU': 'ER диаграмма-подобный инструмент', // subTitle: '@nocobase/plugin-graph-collection-manager', link: '/handbook/graph-collection-manager', }, @@ -185,12 +202,14 @@ export default [ 'title.fr-FR': 'Collections', 'title.zh-CN': '数据表', 'title.ja-JP': 'コレクション', + 'title.ru-RU': 'Коллекции', children: [ { title: 'Overview', 'title.fr-FR': "Vue d'ensemble", 'title.zh-CN': '概述', 'title.ja-JP': '概要', + 'title.ru-RU': 'Обзор', link: '/handbook/data-modeling/collection', }, { @@ -198,6 +217,7 @@ export default [ 'title.fr-FR': 'Collection générale', 'title.zh-CN': '普通表', 'title.ja-JP': '一般コレクション', + 'title.ru-RU': 'Обычная коллекция', link: '/handbook/data-source-main/general-collection', }, { @@ -205,6 +225,7 @@ export default [ 'title.fr-FR': 'Collection héritée', 'title.zh-CN': '继承表', 'title.ja-JP': '継承コレクション', + 'title.ru-RU': 'Наследуемая коллекция', link: '/handbook/data-source-main/inheritance-collection', }, { @@ -212,6 +233,7 @@ export default [ 'title.fr-FR': 'Collection de fichiers', 'title.zh-CN': '文件表', 'title.ja-JP': 'ファイルコレクション', + 'title.ru-RU': 'Файловая коллекция', link: '/handbook/file-manager/file-collection', }, { @@ -219,6 +241,7 @@ export default [ 'title.fr-FR': 'Arborescences', 'title.zh-CN': '树表', 'title.ja-JP': '木構造コレクション', + 'title.ru-RU': 'Деревовая коллекция', link: '/handbook/collection-tree', }, { @@ -226,6 +249,7 @@ export default [ 'title.fr-FR': 'Collection de calendriers', 'title.zh-CN': '日历表', 'title.ja-JP': 'カレンダーコレクション', + 'title.ru-RU': 'Коллекция календарей', link: '/handbook/calendar/calendar-collection', }, { @@ -233,6 +257,7 @@ export default [ 'title.fr-FR': "Collection d'expressions", 'title.zh-CN': '表达式表', 'title.ja-JP': '式コレクション', + 'title.ru-RU': 'Коллекция выражений', link: '/handbook/collection-expression/collection', }, { @@ -240,6 +265,7 @@ export default [ 'title.fr-FR': 'Collection SQL', 'title.zh-CN': 'SQL 表', 'title.ja-JP': 'SQLコレクション', + 'title.ru-RU': 'Коллекция SQL', link: '/handbook/collection-sql', }, { @@ -247,6 +273,7 @@ export default [ 'title.fr-FR': 'Collection de vues', 'title.zh-CN': '数据库视图', 'title.ja-JP': 'ビューコレクション', + 'title.ru-RU': 'Коллекция представлений', link: '/handbook/collection-view', }, { @@ -254,6 +281,7 @@ export default [ 'title.fr-FR': 'Collection de données étrangères(FDW)', 'title.zh-CN': '外部数据表', 'title.ja-JP': '外部データコレクション(FDW)', + 'title.ru-RU': 'Коллекция внешних данных(FDW)', link: '/handbook/collection-fdw', }, ], @@ -263,12 +291,14 @@ export default [ 'title.fr-FR': 'Collection de champs', 'title.zh-CN': '数据表字段', 'title.ja-JP': 'コレクションフィールド', + 'title.ru-RU': 'Коллекция полей', children: [ { title: 'Overview', 'title.fr-FR': "Vue d'ensemble", 'title.zh-CN': '概述', 'title.ja-JP': '概要', + 'title.ru-RU': 'Обзор', // subTitle: '@nocobase/plugin-data-source-external-mariadb', link: '/handbook/data-modeling/collection-fields', }, @@ -277,6 +307,7 @@ export default [ 'title.fr-FR': 'Validation', 'title.zh-CN': '字段验证', 'title.ja-JP': '検証', + 'title.ru-RU': 'Валидация', link: '/handbook/data-modeling/collection-fields/validation', }, { @@ -284,12 +315,14 @@ export default [ 'title.fr-FR': 'Basic', 'title.zh-CN': '基本类型', 'title.ja-JP': '基本タイプ', + 'title.ru-RU': 'Основные типы', children: [ { title: 'Single text', 'title.fr-FR': 'Texte simple', 'title.zh-CN': '单行文本', 'title.ja-JP': '単一行テキスト', + 'title.ru-RU': 'Одиночный текст', link: '/handbook/data-modeling/collection-fields/basic/input', }, { @@ -297,6 +330,7 @@ export default [ 'title.fr-FR': 'Texte long', 'title.zh-CN': '多行文本', 'title.ja-JP': '複数行テキスト', + 'title.ru-RU': 'Длинный текст', link: '/handbook/data-modeling/collection-fields/basic/textarea', }, { @@ -304,6 +338,7 @@ export default [ 'title.fr-FR': 'Téléphone', 'title.zh-CN': '手机号码', 'title.ja-JP': '電話番号', + 'title.ru-RU': 'Телефон', link: '/handbook/data-modeling/collection-fields/basic/phone', }, { @@ -311,6 +346,7 @@ export default [ 'title.fr-FR': 'Email', 'title.zh-CN': '电子邮箱', 'title.ja-JP': '電子メール', + 'title.ru-RU': 'Электронная почта', link: '/handbook/data-modeling/collection-fields/basic/email', }, { @@ -318,6 +354,7 @@ export default [ 'title.fr-FR': 'URL', 'title.zh-CN': 'URL', 'title.ja-JP': 'URL', + 'title.ru-RU': 'URL', link: '/handbook/data-modeling/collection-fields/basic/url', }, { @@ -325,6 +362,7 @@ export default [ 'title.fr-FR': 'Entier', 'title.zh-CN': '整数', 'title.ja-JP': '整数', + 'title.ru-RU': 'Целое число', link: '/handbook/data-modeling/collection-fields/basic/integer', }, { @@ -332,6 +370,7 @@ export default [ 'title.fr-FR': 'Nombre', 'title.zh-CN': '数字', 'title.ja-JP': '数値', + 'title.ru-RU': 'Число', link: '/handbook/data-modeling/collection-fields/basic/number', }, { @@ -339,6 +378,7 @@ export default [ 'title.fr-FR': 'Pourcentage', 'title.zh-CN': '百分比', 'title.ja-JP': 'パーセント', + 'title.ru-RU': 'Процент', link: '/handbook/data-modeling/collection-fields/basic/percent', }, { @@ -346,6 +386,7 @@ export default [ 'title.fr-FR': 'Mot de passe', 'title.zh-CN': '密码', 'title.ja-JP': 'パスワード', + 'title.ru-RU': 'Пароль', link: '/handbook/data-modeling/collection-fields/basic/password', }, { @@ -353,6 +394,7 @@ export default [ 'title.fr-FR': 'Couleur', 'title.zh-CN': '颜色', 'title.ja-JP': '色', + 'title.ru-RU': 'Цвет', link: '/handbook/data-modeling/collection-fields/basic/color', }, { @@ -360,6 +402,7 @@ export default [ 'title.fr-FR': 'Icône', 'title.zh-CN': '图标', 'title.ja-JP': 'アイコン', + 'title.ru-RU': 'Иконка', link: '/handbook/data-modeling/collection-fields/basic/icon', }, ], @@ -369,12 +412,14 @@ export default [ 'title.fr-FR': 'Selection', 'title.zh-CN': '选择类型', 'title.ja-JP': '選択タイプ', + 'title.ru-RU': 'Выборы', children: [ { title: 'Checkbox', 'title.fr-FR': 'Checkbox', 'title.zh-CN': '勾选', 'title.ja-JP': 'チェックボックス', + 'title.ru-RU': 'Чекбокс', link: '/handbook/data-modeling/collection-fields/choices/checkbox', }, { @@ -382,6 +427,7 @@ export default [ 'title.fr-FR': 'Selection simple', 'title.zh-CN': '下拉菜单(单选)', 'title.ja-JP': '単一選択', + 'title.ru-RU': 'Одиночный выбор', link: '/handbook/data-modeling/collection-fields/choices/select', }, { @@ -389,6 +435,7 @@ export default [ 'title.fr-FR': 'Selection multiple', 'title.zh-CN': '下拉菜单(多选)', 'title.ja-JP': '複数選択', + 'title.ru-RU': 'Множественный выбор', link: '/handbook/data-modeling/collection-fields/choices/multiple-select', }, { @@ -396,6 +443,7 @@ export default [ 'title.fr-FR': 'Groupe Radio', 'title.zh-CN': '单选框', 'title.ja-JP': 'ラジオボタン', + 'title.ru-RU': 'Группа радио', link: '/handbook/data-modeling/collection-fields/choices/radio-group', }, { @@ -403,6 +451,7 @@ export default [ 'title.fr-FR': 'Groupe Checkbox', 'title.zh-CN': '复选框', 'title.ja-JP': 'チェックボックスグループ', + 'title.ru-RU': 'Группа чекбоксов', link: '/handbook/data-modeling/collection-fields/choices/checkbox-group', }, { @@ -410,6 +459,7 @@ export default [ 'title.fr-FR': 'China region', 'title.zh-CN': '中国行政区', 'title.ja-JP': '中国の行政区', + 'title.ru-RU': 'Китайская область', link: '/handbook/field-china-region', }, ], @@ -419,12 +469,14 @@ export default [ 'title.fr-FR': 'Média', 'title.zh-CN': '多媒体', 'title.ja-JP': 'メディア', + 'title.ru-RU': 'Медиа', children: [ { title: 'Markdown', 'title.fr-FR': 'Markdown', 'title.zh-CN': 'Markdown', 'title.ja-JP': 'Markdown', + 'title.ru-RU': 'Markdown', link: '/handbook/data-modeling/collection-fields/media/markdown', }, { @@ -432,6 +484,7 @@ export default [ 'title.fr-FR': 'Markdown(Vditor)', 'title.zh-CN': 'Markdown(Vditor)', 'title.ja-JP': 'Markdown(Vditor)', + 'title.ru-RU': 'Markdown(Vditor)', link: '/handbook/field-markdown-vditor', }, { @@ -439,6 +492,7 @@ export default [ 'title.fr-FR': 'Rich text', 'title.zh-CN': '富文本', 'title.ja-JP': 'リッチテキスト', + 'title.ru-RU': 'Rich text', link: '/handbook/data-modeling/collection-fields/media/rich-text', }, { @@ -446,6 +500,7 @@ export default [ 'title.fr-FR': 'Attachment(Assocation)', 'title.zh-CN': '附件(关系)', 'title.ja-JP': '添付ファイル(Assocation)', + 'title.ru-RU': 'Attachment(Assocation)', link: '/handbook/file-manager/field-attachment', }, { @@ -453,6 +508,7 @@ export default [ 'title.fr-FR': 'Attachment(URL)', 'title.zh-CN': '附件(URL)', 'title.ja-JP': '添付ファイル(URL)', + 'title.ru-RU': 'Attachment(URL)', link: '/handbook/field-attachment-url', }, ], @@ -462,12 +518,14 @@ export default [ 'title.fr-FR': 'Date et heure', 'title.zh-CN': '日期 & 时间', 'title.ja-JP': '日付と時間', + 'title.ru-RU': 'Дата и время', children: [ { title: 'Overview', 'title.fr-FR': "Vue d'ensemble", 'title.zh-CN': '概述', 'title.ja-JP': '概要', + 'title.ru-RU': 'Обзор', link: '/handbook/data-modeling/collection-fields/datetime', }, { @@ -475,6 +533,7 @@ export default [ 'title.fr-FR': 'Date et heure(avec time zone)', 'title.zh-CN': '日期时间(含时区)', 'title.ja-JP': '日付と時間(タイムゾーンあり)', + 'title.ru-RU': 'Дата и время(с time zone)', link: '/handbook/data-modeling/collection-fields/datetime/datetime', }, { @@ -482,6 +541,7 @@ export default [ 'title.fr-FR': 'Date et heure(sans time zone)', 'title.zh-CN': '日期时间(不含时区)', 'title.ja-JP': '日付と時間(タイムゾーンなし)', + 'title.ru-RU': 'Дата и время(без time zone)', link: '/handbook/data-modeling/collection-fields/datetime/datetime-without-tz', }, { @@ -489,6 +549,7 @@ export default [ 'title.fr-FR': 'Timestamp Unix', 'title.zh-CN': 'Unix 时间戳', 'title.ja-JP': 'Unix タイムスタンプ', + 'title.ru-RU': 'Unix timestamp', link: '/handbook/data-modeling/collection-fields/datetime/unix-timestamp', }, { @@ -496,6 +557,7 @@ export default [ 'title.fr-FR': 'Date(sans heure)', 'title.zh-CN': '日期(不含时间)', 'title.ja-JP': '日付(時間なし)', + 'title.ru-RU': 'Дата(без времени)', link: '/handbook/data-modeling/collection-fields/datetime/date', }, { @@ -503,6 +565,7 @@ export default [ 'title.fr-FR': 'Heure', 'title.zh-CN': '时间', 'title.ja-JP': '時間', + 'title.ru-RU': 'Время', link: '/handbook/data-modeling/collection-fields/datetime/time', }, ], @@ -518,6 +581,7 @@ export default [ 'title.fr-FR': 'Point', 'title.zh-CN': '点', 'title.ja-JP': '点', + 'title.ru-RU': 'Точка', link: '/handbook/data-modeling/collection-fields/geometric/point', }, { @@ -525,6 +589,7 @@ export default [ 'title.fr-FR': 'Ligne', 'title.zh-CN': '线', 'title.ja-JP': '線', + 'title.ru-RU': 'Линия', link: '/handbook/data-modeling/collection-fields/geometric/line', }, { @@ -532,6 +597,7 @@ export default [ 'title.fr-FR': 'Cercle', 'title.zh-CN': '圆', 'title.ja-JP': '円', + 'title.ru-RU': 'Круг', link: '/handbook/data-modeling/collection-fields/geometric/circle', }, { @@ -539,6 +605,7 @@ export default [ 'title.fr-FR': 'Polygone', 'title.zh-CN': '多边形', 'title.ja-JP': '多角形', + 'title.ru-RU': 'Полигон', link: '/handbook/data-modeling/collection-fields/geometric/polygon', }, ], @@ -554,6 +621,7 @@ export default [ 'title.fr-FR': 'UUID', 'title.zh-CN': 'UUID', 'title.ja-JP': 'UUID', + 'title.ru-RU': 'UUID', link: '/handbook/data-modeling/collection-fields/advanced/uuid', }, { @@ -561,6 +629,7 @@ export default [ 'title.fr-FR': 'Nano ID', 'title.zh-CN': 'Nano ID', 'title.ja-JP': 'Nano ID', + 'title.ru-RU': 'Nano ID', link: '/handbook/data-modeling/collection-fields/advanced/nano-id', }, { @@ -568,6 +637,7 @@ export default [ 'title.fr-FR': 'Sort', 'title.zh-CN': '排序', 'title.ja-JP': 'ソート', + 'title.ru-RU': 'Сортировка', link: '/handbook/field-sort', }, { @@ -575,6 +645,7 @@ export default [ 'title.fr-FR': 'Formule', 'title.zh-CN': '计算公式', 'title.ja-JP': '計算式', + 'title.ru-RU': 'Формула', link: '/handbook/field-formula', }, { @@ -582,6 +653,7 @@ export default [ 'title.fr-FR': 'Séquence', 'title.zh-CN': '自动编码', 'title.ja-JP': '自動エンコード', + 'title.ru-RU': 'Автоматический код', link: '/handbook/field-sequence', }, { @@ -589,6 +661,7 @@ export default [ 'title.fr-FR': 'JSON', 'title.zh-CN': 'JSON', 'title.ja-JP': 'JSON', + 'title.ru-RU': 'JSON', link: '/handbook/data-modeling/collection-fields/advanced/json', }, { @@ -596,6 +669,7 @@ export default [ 'title.fr-FR': 'Collection select', 'title.zh-CN': '数据表选择器', 'title.ja-JP': 'コレクションセレクター', + 'title.ru-RU': 'Селектор коллекций', link: '/handbook/data-modeling/collection-fields/advanced/collection-select', }, { @@ -603,6 +677,7 @@ export default [ 'title.fr-FR': 'Chiffrement', 'title.zh-CN': '加密', 'title.ja-JP': '暗号化', + 'title.ru-RU': 'Шифрование', link: '/handbook/field-encryption', }, ], @@ -618,6 +693,7 @@ export default [ 'title.fr-FR': 'Créé le', 'title.zh-CN': '创建日期', 'title.ja-JP': '作成日', + 'title.ru-RU': 'Создано', link: '/handbook/data-modeling/collection-fields/system-info/created-at', }, { @@ -625,6 +701,7 @@ export default [ 'title.fr-FR': 'Modifié le', 'title.zh-CN': '最后修改日期', 'title.ja-JP': '最終更新日', + 'title.ru-RU': 'Последнее обновление в', link: '/handbook/data-modeling/collection-fields/system-info/updated-at', }, { @@ -632,6 +709,7 @@ export default [ 'title.fr-FR': 'Créé par', 'title.zh-CN': '创建人', 'title.ja-JP': '作成者', + 'title.ru-RU': 'Создатель', link: '/handbook/users/field-created-by', }, { @@ -639,6 +717,7 @@ export default [ 'title.fr-FR': 'Modifié par', 'title.zh-CN': '最后修改人', 'title.ja-JP': '最終更新者', + 'title.ru-RU': 'Последнее обновление', link: '/handbook/users/field-updated-by', }, { @@ -646,6 +725,7 @@ export default [ 'title.fr-FR': 'Table OID', 'title.zh-CN': 'Table OID', 'title.ja-JP': 'テーブルOID', + 'title.ru-RU': 'Table OID', link: '/handbook/data-modeling/collection-fields/system-info/table-oid', }, ], @@ -661,6 +741,7 @@ export default [ 'title.fr-FR': "Vue d'ensemble", 'title.zh-CN': '概述', 'title.ja-JP': '概要', + 'title.ru-RU': 'Обзор', link: '/handbook/data-modeling/collection-fields/associations', }, { @@ -668,6 +749,7 @@ export default [ 'title.fr-FR': 'Un à un', 'title.zh-CN': '一对一', 'title.ja-JP': '一対一', + 'title.ru-RU': 'Один к одному', link: '/handbook/data-modeling/collection-fields/associations/o2o', }, { @@ -675,6 +757,7 @@ export default [ 'title.fr-FR': 'Un à plusieurs', 'title.zh-CN': '一对多', 'title.ja-JP': '一対多', + 'title.ru-RU': 'Один к многим', link: '/handbook/data-modeling/collection-fields/associations/o2m', }, { @@ -682,6 +765,7 @@ export default [ 'title.fr-FR': 'Plusieurs à un', 'title.zh-CN': '多对一', 'title.ja-JP': '多対一', + 'title.ru-RU': 'Многие к одному', link: '/handbook/data-modeling/collection-fields/associations/m2o', }, { @@ -689,6 +773,7 @@ export default [ 'title.fr-FR': 'Plusieurs à plusieurs', 'title.zh-CN': '多对多', 'title.ja-JP': '多対多', + 'title.ru-RU': 'Многие к многим', link: '/handbook/data-modeling/collection-fields/associations/m2m', }, { @@ -696,6 +781,7 @@ export default [ 'title.fr-FR': 'Plusieurs à plusieurs (tableau)', 'title.zh-CN': '多对多(数组)', 'title.ja-JP': '多対多(配列)', + 'title.ru-RU': 'Многие к многим(массив)', link: '/handbook/field-m2m-array', }, ], @@ -709,6 +795,7 @@ export default [ 'title.fr-FR': 'Interface utilisateur(UI)', 'title.zh-CN': '配置界面', 'title.ja-JP': 'UI編集', + 'title.ru-RU': 'Редактор UI', type: 'group', children: [ { @@ -716,6 +803,7 @@ export default [ 'title.fr-FR': 'Mode éditeur UI', 'title.zh-CN': '界面配置模式', 'title.ja-JP': 'UIエディタモード', + 'title.ru-RU': 'Режим редактора UI', link: '/handbook/ui/ui-editor', }, { @@ -723,6 +811,7 @@ export default [ 'title.fr-FR': 'Menu', 'title.zh-CN': '菜单', 'title.ja-JP': 'メニュー', + 'title.ru-RU': 'Меню', link: '/handbook/ui/menus', }, { @@ -730,6 +819,7 @@ export default [ 'title.fr-FR': 'Page', 'title.zh-CN': '页面', 'title.ja-JP': 'ページ', + 'title.ru-RU': 'Страница', link: '/handbook/ui/pages', }, { @@ -737,6 +827,7 @@ export default [ 'title.fr-FR': 'Pop-up', 'title.zh-CN': '弹窗', 'title.ja-JP': 'ポップアップ', + 'title.ru-RU': 'Попап', link: '/handbook/ui/pop-up', }, { @@ -750,6 +841,7 @@ export default [ 'title.fr-FR': "Vue d'ensemble", 'title.zh-CN': '概述', 'title.ja-JP': '概要', + 'title.ru-RU': 'Обзор', link: '/handbook/ui/blocks', }, { @@ -763,6 +855,7 @@ export default [ 'title.fr-FR': 'Tableau', 'title.zh-CN': '表格', 'title.ja-JP': 'テーブル', + 'title.ru-RU': 'Таблица', link: '/handbook/ui/blocks/data-blocks/table', }, { @@ -770,6 +863,7 @@ export default [ 'title.fr-FR': 'Form', 'title.zh-CN': '表单', 'title.ja-JP': 'フォーム', + 'title.ru-RU': 'Форма', link: '/handbook/ui/blocks/data-blocks/form', }, { @@ -777,6 +871,7 @@ export default [ 'title.fr-FR': 'Détails', 'title.zh-CN': '详情', 'title.ja-JP': '詳細', + 'title.ru-RU': 'Детали', link: '/handbook/ui/blocks/data-blocks/details', }, { @@ -784,6 +879,7 @@ export default [ 'title.fr-FR': 'Liste', 'title.zh-CN': '列表', 'title.ja-JP': 'リスト', + 'title.ru-RU': 'Список', link: '/handbook/ui/blocks/data-blocks/list', }, { @@ -791,6 +887,7 @@ export default [ 'title.fr-FR': 'Grille', 'title.zh-CN': '网格卡片', 'title.ja-JP': 'グリッドカード', + 'title.ru-RU': 'Карточка', link: '/handbook/ui/blocks/data-blocks/grid-card', }, { @@ -798,6 +895,7 @@ export default [ 'title.fr-FR': 'Calendar', 'title.zh-CN': '日历', 'title.ja-JP': 'カレンダー', + 'title.ru-RU': 'Календарь', link: '/handbook/calendar', }, { @@ -805,6 +903,7 @@ export default [ 'title.fr-FR': 'Gantt', 'title.zh-CN': '甘特图', 'title.ja-JP': 'ガントチャート', + 'title.ru-RU': 'Гантт', link: '/handbook/block-gantt', }, { @@ -812,6 +911,7 @@ export default [ 'title.fr-FR': 'Kanban', 'title.zh-CN': '看板', 'title.ja-JP': 'カンバン', + 'title.ru-RU': 'Канбан', link: '/handbook/block-kanban', }, { @@ -819,6 +919,7 @@ export default [ 'title.fr-FR': 'Carte', 'title.zh-CN': '地图', 'title.ja-JP': '地図', + 'title.ru-RU': 'Карта', link: '/handbook/block-map', }, { @@ -826,6 +927,7 @@ export default [ 'title.fr-FR': 'Graphiques', 'title.zh-CN': '图表', 'title.ja-JP': 'チャート', + 'title.ru-RU': 'Графики', link: '/handbook/data-visualization/', }, { @@ -833,6 +935,7 @@ export default [ 'title.fr-FR': 'Formulaire multi-étapes', 'title.zh-CN': '分步表单', 'title.ja-JP': '多段階フォーム', + 'title.ru-RU': 'Пошаковая форма', link: '/handbook/block-multi-step-from', }, ], @@ -842,12 +945,14 @@ export default [ 'title.fr-FR': 'Blocs filtre', 'title.zh-CN': '筛选区块', 'title.ja-JP': 'フィルターブロック', + 'title.ru-RU': 'Блоки фильтра', children: [ { title: 'Form', 'title.fr-FR': 'Formulaire', 'title.zh-CN': '表单', 'title.ja-JP': 'フォーム', + 'title.ru-RU': 'Форма', link: '/handbook/ui/blocks/filter-blocks/form', }, { @@ -855,6 +960,7 @@ export default [ 'title.fr-FR': 'Réduire', 'title.zh-CN': '折叠面板', 'title.ja-JP': '折りたたみパネル', + 'title.ru-RU': 'Сворачивание', link: '/handbook/ui/blocks/filter-blocks/collapse', }, { @@ -862,6 +968,7 @@ export default [ 'title.fr-FR': 'Arborescence', 'title.zh-CN': '树', 'title.ja-JP': '木構造', + 'title.ru-RU': 'Дерево', link: '/handbook/block-tree', }, ], @@ -877,6 +984,7 @@ export default [ 'title.fr-FR': 'Markdown', 'title.zh-CN': 'Markdown', 'title.ja-JP': 'Markdown', + 'title.ru-RU': 'Markdown', link: '/handbook/ui/blocks/other-blocks/markdown', }, { @@ -884,6 +992,7 @@ export default [ 'title.fr-FR': 'iframe', 'title.zh-CN': 'iframe', 'title.ja-JP': 'iframe', + 'title.ru-RU': 'iframe', link: '/handbook/block-iframe', }, { @@ -891,6 +1000,7 @@ export default [ 'title.fr-FR': 'Action panel', 'title.zh-CN': '操作面板', 'title.ja-JP': 'アクションパネル', + 'title.ru-RU': 'Панель действий', link: '/handbook/block-action-panel', }, { @@ -898,6 +1008,7 @@ export default [ 'title.fr-FR': 'Workflow: manuel', 'title.zh-CN': '工作流:人工待办', 'title.ja-JP': 'ワークフロー:手動タスク', + 'title.ru-RU': 'Рабочий процесс:ручная задача', link: '/handbook/ui/blocks/other-blocks/workflow-manual-todos', }, { @@ -905,6 +1016,7 @@ export default [ 'title.fr-FR': 'Workflow: Approbation', 'title.zh-CN': '工作流:审批', 'title.ja-JP': 'ワークフロー:承認', + 'title.ru-RU': 'Рабочий процесс:одобрение', link: '/handbook/ui/blocks/other-blocks/workflow-approval', }, // { @@ -919,6 +1031,7 @@ export default [ 'title.fr-FR': 'Template de blocs', 'title.zh-CN': '区块模板', 'title.ja-JP': 'ブロックテンプレート', + 'title.ru-RU': 'Шаблоны блоков', link: '/handbook/block-template', }, { @@ -926,12 +1039,14 @@ export default [ 'title.fr-FR': 'Paramètre de blocs', 'title.zh-CN': '区块设置项', 'title.ja-JP': 'ブロック設定', + 'title.ru-RU': 'Настройки блоков', children: [ { title: 'Set the data scope', 'title.fr-FR': 'Data scope', 'title.zh-CN': '设置数据范围', 'title.ja-JP': 'データ範囲を設定', + 'title.ru-RU': 'Установить диапазон данных', link: '/handbook/ui/blocks/block-settings/data-scope', }, { @@ -939,6 +1054,7 @@ export default [ 'title.fr-FR': 'Règle de tri par défaut', 'title.zh-CN': '设置排序规则', 'title.ja-JP': 'デフォルトのソートルールを設定', + 'title.ru-RU': 'Установить правила сортировки по умолчанию', link: '/handbook/ui/blocks/block-settings/sorting-rule', }, { @@ -946,6 +1062,7 @@ export default [ 'title.fr-FR': 'Mode de chargement des données', 'title.zh-CN': '设置数据加载方式', 'title.ja-JP': 'データ読み込みモードを設定', + 'title.ru-RU': 'Установить режим загрузки данных', link: '/handbook/ui/blocks/block-settings/loading-mode', }, { @@ -953,6 +1070,7 @@ export default [ 'title.fr-FR': 'Connecter des blocs de données', 'title.zh-CN': '连接数据区块', 'title.ja-JP': 'データブロックを接続', + 'title.ru-RU': 'Соединить блоки данных', link: '/handbook/ui/blocks/block-settings/connect-block', }, { @@ -960,6 +1078,7 @@ export default [ 'title.fr-FR': 'Restaurer le modèle', 'title.zh-CN': '恢复到模板', 'title.ja-JP': 'テンプレートに戻す', + 'title.ru-RU': 'Вернуться к шаблону', link: '/handbook/block-template', }, { @@ -967,6 +1086,7 @@ export default [ 'title.fr-FR': 'Enregistrer comme modèle', 'title.zh-CN': '保存为模板', 'title.ja-JP': 'テンプレートとして保存', + 'title.ru-RU': 'Сохранить как шаблон', link: '/handbook/block-template', }, { @@ -974,6 +1094,7 @@ export default [ 'title.fr-FR': 'Règle de dépendance des champs', 'title.zh-CN': '字段联动规则', 'title.ja-JP': 'フィールド連動ルール', + 'title.ru-RU': 'Правила связи полей', link: '/handbook/ui/blocks/block-settings/field-linkage-rule', }, { @@ -981,6 +1102,7 @@ export default [ 'title.fr-FR': 'Règle de dépendance des blocs', 'title.zh-CN': '区块联动规则', 'title.ja-JP': 'ブロック連動ルール', + 'title.ru-RU': 'Правила связи блоков', link: '/handbook/ui/blocks/block-settings/block-linkage-rule', }, { @@ -988,6 +1110,7 @@ export default [ 'title.fr-FR': 'Titre de bloc', 'title.zh-CN': '编辑区块标题', 'title.ja-JP': 'ブロックタイトルを編集', + 'title.ru-RU': 'Изменить заголовок блока', link: '/handbook/ui/blocks/block-settings/block-title', }, { @@ -995,6 +1118,7 @@ export default [ 'title.fr-FR': 'Hauteur', 'title.zh-CN': '设置区块高度', 'title.ja-JP': 'ブロックの高さを設定', + 'title.ru-RU': 'Установить высоту блока', link: '/handbook/ui/blocks/block-settings/block-height', }, { @@ -1002,6 +1126,7 @@ export default [ 'title.fr-FR': 'Disposition', 'title.zh-CN': '布局', 'title.ja-JP': 'レイアウト', + 'title.ru-RU': 'Расположение', link: '/handbook/ui/blocks/block-settings/block-layout', }, { @@ -1009,6 +1134,7 @@ export default [ 'title.fr-FR': 'Suppression', 'title.zh-CN': '删除区块', 'title.ja-JP': 'ブロックを削除', + 'title.ru-RU': 'Удалить блок', link: '/handbook/ui/blocks/block-settings/block-delete', }, ], @@ -1020,12 +1146,14 @@ export default [ 'title.fr-FR': 'Champs', 'title.zh-CN': '字段', 'title.ja-JP': 'フィールド', + 'title.ru-RU': 'Поля', children: [ { title: 'Overview', 'title.fr-FR': "Vue d'ensemble", 'title.zh-CN': '概述', 'title.ja-JP': '概要', + 'title.ru-RU': 'Обзор', link: '/handbook/ui/fields', }, { @@ -1033,12 +1161,14 @@ export default [ 'title.fr-FR': 'Paramètres communs', 'title.zh-CN': '通用配置项', 'title.ja-JP': '一般設定', + 'title.ru-RU': 'Общие настройки', children: [ { title: 'Table column', 'title.fr-FR': 'Colonne de tableau', 'title.zh-CN': '表格字段', 'title.ja-JP': 'テーブルカラム', + 'title.ru-RU': 'Таблица', link: '/handbook/ui/fields/generic/table-column', }, { @@ -1046,6 +1176,7 @@ export default [ 'title.fr-FR': 'Formulaire', 'title.zh-CN': '表单字段', 'title.ja-JP': 'フォームフィールド', + 'title.ru-RU': 'Форма', link: '/handbook/ui/fields/generic/form-item', }, { @@ -1053,6 +1184,7 @@ export default [ 'title.fr-FR': 'Détails', 'title.zh-CN': '详情字段', 'title.ja-JP': '詳細フィールド', + 'title.ru-RU': 'Детали', link: '/handbook/ui/fields/generic/detail-form-item', }, { @@ -1060,6 +1192,7 @@ export default [ 'title.fr-FR': "Formulaire d'édition en masse", 'title.zh-CN': '批量编辑表单', 'title.ja-JP': 'バルク編集フォーム', + 'title.ru-RU': 'Форма редактирования в массе', link: '/handbook/ui/fields/generic/bulk-edit-form-item', }, { @@ -1067,6 +1200,7 @@ export default [ 'title.fr-FR': 'Filtres', 'title.zh-CN': '筛选表单', 'title.ja-JP': 'フィルターフォーム', + 'title.ru-RU': 'Форма фильтра', link: '/handbook/ui/fields/generic/filter-form-item', }, { @@ -1074,6 +1208,7 @@ export default [ 'title.fr-FR': 'Réduire', 'title.zh-CN': '折叠面板', 'title.ja-JP': '折りたたみパネル', + 'title.ru-RU': 'Сворачивание', link: '/handbook/ui/fields/generic/filter-collapse-item', }, ], @@ -1083,12 +1218,14 @@ export default [ 'title.fr-FR': 'Paramètres spécifiques', 'title.zh-CN': '特有配置项', 'title.ja-JP': '特有設定', + 'title.ru-RU': 'Специальные настройки', children: [ { title: 'Date picker', 'title.fr-FR': 'Choix de date', 'title.zh-CN': '时间日期', 'title.ja-JP': '日付ピッカー', + 'title.ru-RU': 'Выбор даты', link: '/handbook/ui/fields/specific/date-picker', }, { @@ -1096,6 +1233,7 @@ export default [ 'title.fr-FR': 'Choix en cascade', 'title.zh-CN': '级联选择', 'title.ja-JP': 'カスケードセレクト', + 'title.ru-RU': 'Каскадный выбор', link: '/handbook/ui/fields/specific/cascade-select', }, { @@ -1103,6 +1241,7 @@ export default [ 'title.fr-FR': 'Imbrication', 'title.zh-CN': '子表单', 'title.ja-JP': 'ネスター', + 'title.ru-RU': 'Вложенный', link: '/handbook/ui/fields/specific/nester', }, { @@ -1110,6 +1249,7 @@ export default [ 'title.fr-FR': 'Imbrication popup', 'title.zh-CN': '子表单(弹窗)', 'title.ja-JP': 'ポップオーバーネスター', + 'title.ru-RU': 'Вложенный попап', link: '/handbook/ui/fields/specific/popover-nester', }, { @@ -1117,6 +1257,7 @@ export default [ 'title.fr-FR': 'Selecteur', 'title.zh-CN': '选择器', 'title.ja-JP': 'セレクター', + 'title.ru-RU': 'Выбор', link: '/handbook/ui/fields/specific/select', }, { @@ -1124,6 +1265,7 @@ export default [ 'title.fr-FR': "Selection d'enregisrement", 'title.zh-CN': '数据选择器', 'title.ja-JP': 'レコードピッカー', + 'title.ru-RU': 'Выбор данных', link: '/handbook/ui/fields/specific/picker', }, { @@ -1131,6 +1273,7 @@ export default [ 'title.fr-FR': 'Sous table', 'title.zh-CN': '子表格', 'title.ja-JP': 'サブテーブル', + 'title.ru-RU': 'Подтаблица', link: '/handbook/ui/fields/specific/sub-table', }, { @@ -1138,6 +1281,7 @@ export default [ 'title.fr-FR': 'Sous détails', 'title.zh-CN': '子详情', 'title.ja-JP': 'サブ詳細', + 'title.ru-RU': 'Поддетали', link: '/handbook/ui/fields/specific/sub-detail', }, { @@ -1145,6 +1289,7 @@ export default [ 'title.fr-FR': 'Titre', 'title.zh-CN': '标题', 'title.ja-JP': 'タイトル', + 'title.ru-RU': 'Заголовок', link: '/handbook/ui/fields/specific/title', }, { @@ -1152,6 +1297,7 @@ export default [ 'title.fr-FR': 'Tag', 'title.zh-CN': '标签', 'title.ja-JP': 'タグ', + 'title.ru-RU': 'Тег', link: '/handbook/ui/fields/specific/tag', }, { @@ -1159,6 +1305,7 @@ export default [ 'title.fr-FR': 'Gestionnaire de fichier', 'title.zh-CN': '文件管理器', 'title.ja-JP': 'ファイルマネージャー', + 'title.ru-RU': 'Менеджер файлов', link: '/handbook/ui/fields/specific/file-manager', }, { @@ -1166,6 +1313,7 @@ export default [ 'title.fr-FR': 'Masque', 'title.zh-CN': '掩码', 'title.ja-JP': '掩码', + 'title.ru-RU': 'Маска', link: '/handbook/field-component-mask', }, ], @@ -1175,12 +1323,14 @@ export default [ 'title.fr-FR': 'Paramètres de champs', 'title.zh-CN': '字段配置项', 'title.ja-JP': 'フィールド設定', + 'title.ru-RU': 'Настройки полей', children: [ { title: 'Required', 'title.fr-FR': 'Requis', 'title.zh-CN': '必填', 'title.ja-JP': '必須', + 'title.ru-RU': 'Обязательно', link: '/handbook/ui/fields/field-settings/required', }, { @@ -1188,6 +1338,7 @@ export default [ 'title.fr-FR': 'Valeur par défaut', 'title.zh-CN': '默认值', 'title.ja-JP': 'デフォルト値', + 'title.ru-RU': 'Значение по умолчанию', link: '/handbook/ui/fields/field-settings/default-value', }, { @@ -1195,6 +1346,7 @@ export default [ 'title.fr-FR': 'Règle de validation', 'title.zh-CN': '验证规则', 'title.ja-JP': '検証ルール', + 'title.ru-RU': 'Правила валидации', link: '/handbook/ui/fields/field-settings/validation-rules', }, { @@ -1202,6 +1354,7 @@ export default [ 'title.fr-FR': 'Format de nombre', 'title.zh-CN': '数值格式化', 'title.ja-JP': '数値フォーマット', + 'title.ru-RU': 'Формат числа', link: '/handbook/ui/fields/field-settings/number-format', }, { @@ -1209,6 +1362,7 @@ export default [ 'title.fr-FR': 'Périmètre de données', 'title.zh-CN': '设置数据范围', 'title.ja-JP': 'データ範囲を設定', + 'title.ru-RU': 'Установить диапазон данных', link: '/handbook/ui/fields/field-settings/data-scope', }, { @@ -1216,6 +1370,7 @@ export default [ 'title.fr-FR': 'Titre', 'title.zh-CN': '标题字段', 'title.ja-JP': 'タイトルフィールド', + 'title.ru-RU': 'Заголовок поля', link: '/handbook/ui/fields/field-settings/title-field', }, { @@ -1223,6 +1378,7 @@ export default [ 'title.fr-FR': 'Pattern', 'title.zh-CN': '显示模式', 'title.ja-JP': '表示パターン', + 'title.ru-RU': 'Шаблон', link: '/handbook/ui/fields/field-settings/pattern', }, { @@ -1230,6 +1386,7 @@ export default [ 'title.fr-FR': 'Modifier le titre', 'title.zh-CN': '编辑字段标题', 'title.ja-JP': 'フィールドタイトルを編集', + 'title.ru-RU': 'Изменить заголовок поля', link: '/handbook/ui/fields/field-settings/edit-title', }, { @@ -1237,6 +1394,7 @@ export default [ 'title.fr-FR': 'Afficher le titre', 'title.zh-CN': '显示标题', 'title.ja-JP': '表示タイトル', + 'title.ru-RU': 'Показать заголовок', link: '/handbook/ui/fields/field-settings/display-title', }, { @@ -1244,6 +1402,7 @@ export default [ 'title.fr-FR': 'Modifier la description', 'title.zh-CN': '编辑描述', 'title.ja-JP': '説明を編集', + 'title.ru-RU': 'Изменить описание', link: '/handbook/ui/fields/field-settings/edit-description', }, { @@ -1251,6 +1410,7 @@ export default [ 'title.fr-FR': "Modifier l'infobulle", 'title.zh-CN': '编辑提示信息', 'title.ja-JP': 'ツールチップを編集', + 'title.ru-RU': 'Изменить подсказку', link: '/handbook/ui/fields/field-settings/edit-tooltip', }, { @@ -1258,6 +1418,7 @@ export default [ 'title.fr-FR': 'Composant du champ', 'title.zh-CN': '字段组件', 'title.ja-JP': 'フィールドコンポーネント', + 'title.ru-RU': 'Компонент поля', link: '/handbook/ui/fields/field-settings/field-component', }, { @@ -1265,6 +1426,7 @@ export default [ 'title.fr-FR': 'Style', 'title.zh-CN': '样式', 'title.ja-JP': 'スタイル', + 'title.ru-RU': 'Стиль', link: '/handbook/ui/fields/field-settings/style', }, { @@ -1272,6 +1434,7 @@ export default [ 'title.fr-FR': 'Enable scan', 'title.zh-CN': '扫码录入', 'title.ja-JP': 'スキャン入力', + 'title.ru-RU': 'Включить сканирование', link: '/handbook/ui/fields/field-settings/enable-scan', }, ], @@ -1281,6 +1444,7 @@ export default [ 'title.fr-FR': 'Composant de champ associé', 'title.zh-CN': '关系字段组件', 'title.ja-JP': '関連フィールドコンポーネント', + 'title.ru-RU': 'Компонент связанного поля', link: '/handbook/ui/fields/association-field', }, ], @@ -1290,12 +1454,14 @@ export default [ 'title.fr-FR': 'Actions', 'title.zh-CN': '操作', 'title.ja-JP': 'アクション', + 'title.ru-RU': 'Действия', children: [ { title: 'Overview', 'title.fr-FR': "Vue d'ensemble", 'title.zh-CN': '概述', 'title.ja-JP': '概要', + 'title.ru-RU': 'Обзор', link: '/handbook/ui/actions', }, { @@ -1303,12 +1469,14 @@ export default [ 'title.fr-FR': 'Parmètres communs', 'title.zh-CN': '通用配置项', 'title.ja-JP': '一般設定', + 'title.ru-RU': 'Общие настройки', children: [ { title: 'Linkage rule', 'title.fr-FR': 'Règles de liaison', 'title.zh-CN': '联动规则', 'title.ja-JP': '連動ルール', + 'title.ru-RU': 'Правила связи', link: '/handbook/ui/actions/action-settings/linkage-rule', }, { @@ -1316,6 +1484,7 @@ export default [ 'title.fr-FR': "Mode d'ouverture", 'title.zh-CN': '打开方式', 'title.ja-JP': 'オープンモード', + 'title.ru-RU': 'Режим открытия', link: '/handbook/ui/actions/action-settings/open-mode', }, { @@ -1323,6 +1492,7 @@ export default [ 'title.fr-FR': 'Taille de popup', 'title.zh-CN': '弹窗尺寸', 'title.ja-JP': 'ポップアップサイズ', + 'title.ru-RU': 'Размер попапа', link: '/handbook/ui/actions/action-settings/popup-size', }, { @@ -1330,6 +1500,7 @@ export default [ 'title.fr-FR': 'Confirmation secondaire', 'title.zh-CN': '二次确认', 'title.ja-JP': '二次確認', + 'title.ru-RU': 'Вторичная подтверждение', link: '/handbook/ui/actions/action-settings/double-check', }, { @@ -1337,6 +1508,7 @@ export default [ 'title.fr-FR': 'Liaison de workflows', 'title.zh-CN': '绑定工作流', 'title.ja-JP': 'ワークフローをバインド', + 'title.ru-RU': 'Связать с рабочим процессом', link: '/handbook/ui/actions/action-settings/bind-workflow', }, { @@ -1344,6 +1516,7 @@ export default [ 'title.fr-FR': 'Assignation de valeurs de champ', 'title.zh-CN': '字段赋值', 'title.ja-JP': 'フィールド値を割り当て', + 'title.ru-RU': 'Присвоить значения полям', link: '/handbook/ui/actions/action-settings/assign-values', }, { @@ -1351,6 +1524,7 @@ export default [ 'title.fr-FR': 'Modification de boutons', 'title.zh-CN': '编辑按钮', 'title.ja-JP': 'ボタンを編集', + 'title.ru-RU': 'Изменить кнопку', link: '/handbook/ui/actions/action-settings/edit-button', }, { @@ -1358,6 +1532,7 @@ export default [ 'title.fr-FR': 'Après soumission en succès', 'title.zh-CN': '提交成功后', 'title.ja-JP': '送信成功後', + 'title.ru-RU': 'После успешной отправки', link: '/handbook/ui/actions/action-settings/affter-successful', }, ], @@ -1367,12 +1542,14 @@ export default [ 'title.fr-FR': "Types d'action", 'title.zh-CN': '操作类型', 'title.ja-JP': 'アクションタイプ', + 'title.ru-RU': 'Типы действий', children: [ { title: 'View', 'title.fr-FR': 'Vue', 'title.zh-CN': '查看', 'title.ja-JP': '表示', + 'title.ru-RU': 'Просмотр', link: '/handbook/ui/actions/types/view', }, { @@ -1380,6 +1557,7 @@ export default [ 'title.fr-FR': 'Filtre', 'title.zh-CN': '筛选', 'title.ja-JP': 'フィルター', + 'title.ru-RU': 'Фильтр', link: '/handbook/ui/actions/types/filter', }, { @@ -1387,6 +1565,7 @@ export default [ 'title.fr-FR': 'Ajouter un nouveau type', 'title.zh-CN': '添加', 'title.ja-JP': '追加', + 'title.ru-RU': 'Добавить', link: '/handbook/ui/actions/types/add-new', }, { @@ -1394,6 +1573,7 @@ export default [ 'title.fr-FR': 'Lien', 'title.zh-CN': '链接', 'title.ja-JP': 'リンク', + 'title.ru-RU': 'Ссылка', link: '/handbook/ui/actions/types/link', }, { @@ -1401,6 +1581,7 @@ export default [ 'title.fr-FR': 'Modifier', 'title.zh-CN': '编辑', 'title.ja-JP': '編集', + 'title.ru-RU': 'Изменить', link: '/handbook/ui/actions/types/edit', }, { @@ -1408,6 +1589,7 @@ export default [ 'title.fr-FR': 'Supprimer', 'title.zh-CN': '删除', 'title.ja-JP': '削除', + 'title.ru-RU': 'Удалить', link: '/handbook/ui/actions/types/delete', }, { @@ -1415,6 +1597,7 @@ export default [ 'title.fr-FR': 'Rafraichir', 'title.zh-CN': '刷新', 'title.ja-JP': 'リフレッシュ', + 'title.ru-RU': 'Обновить', link: '/handbook/ui/actions/types/refresh', }, { @@ -1422,6 +1605,7 @@ export default [ 'title.fr-FR': 'Ajouter', 'title.zh-CN': '添加记录', 'title.ja-JP': 'レコードを追加', + 'title.ru-RU': 'Добавить запись', link: '/handbook/ui/actions/types/add-record', }, { @@ -1429,6 +1613,7 @@ export default [ 'title.fr-FR': 'Pop-up personalisée', 'title.zh-CN': '自定义弹窗', 'title.ja-JP': 'カスタムポップアップ', + 'title.ru-RU': 'Кастомный попап', link: '/handbook/ui/actions/types/pop-up', }, { @@ -1436,6 +1621,7 @@ export default [ 'title.fr-FR': 'Mettre à jour', 'title.zh-CN': '更新记录', 'title.ja-JP': 'レコードを更新', + 'title.ru-RU': 'Обновить запись', link: '/handbook/ui/actions/types/update-record', }, { @@ -1443,6 +1629,7 @@ export default [ 'title.fr-FR': 'Enregistrer', 'title.zh-CN': '保存记录', 'title.ja-JP': 'レコードを保存', + 'title.ru-RU': 'Сохранить запись', link: '/handbook/ui/actions/types/save-record', }, { @@ -1450,6 +1637,7 @@ export default [ 'title.fr-FR': 'Soumettre', 'title.zh-CN': '提交', 'title.ja-JP': '送信', + 'title.ru-RU': 'Отправить', link: '/handbook/ui/actions/types/submit', }, { @@ -1457,6 +1645,7 @@ export default [ 'title.fr-FR': 'Déclencher un workflow', 'title.zh-CN': '触发工作流', 'title.ja-JP': 'ワークフローをトリガー', + 'title.ru-RU': 'Запустить рабочий процесс', link: '/handbook/ui/actions/types/trigger-workflow', }, { @@ -1464,6 +1653,7 @@ export default [ 'title.fr-FR': 'Modifier en masse', 'title.zh-CN': '批量编辑', 'title.ja-JP': 'バルク編集', + 'title.ru-RU': 'Массовый редактор', link: '/handbook/action-bulk-edit', }, { @@ -1471,6 +1661,7 @@ export default [ 'title.fr-FR': 'Mettre à jour en masse', 'title.zh-CN': '批量更新', 'title.ja-JP': 'バルク更新', + 'title.ru-RU': 'Массовый обновление', link: '/handbook/action-bulk-update', }, { @@ -1478,6 +1669,7 @@ export default [ 'title.fr-FR': 'Requête personnalisée', 'title.zh-CN': '自定义请求', 'title.ja-JP': 'カスタムリクエスト', + 'title.ru-RU': 'Кастомный запрос', link: '/handbook/action-custom-request', }, { @@ -1485,6 +1677,7 @@ export default [ 'title.fr-FR': 'Duppliquer', 'title.zh-CN': '复制', 'title.ja-JP': '複製', + 'title.ru-RU': 'Дубликат', link: '/handbook/action-duplicate', }, { @@ -1492,12 +1685,15 @@ export default [ 'title.fr-FR': 'Imprimer', 'title.zh-CN': '打印', 'title.ja-JP': '印刷', + 'title.ru-RU': 'Печать', link: '/handbook/action-print', }, { title: 'Template print', 'title.fr-FR': "Template d'impression", 'title.zh-CN': '模板打印', + 'title.ja-JP': 'テンプレート印刷', + 'title.ru-RU': 'Шаблон печати', link: '/handbook/action-template-print', }, @@ -1506,11 +1702,13 @@ export default [ 'title.fr-FR': 'Importer', 'title.zh-CN': '导入', 'title.ja-JP': 'インポート', + 'title.ru-RU': 'Импорт', link: '/handbook/action-import', }, { title: 'Import Pro', 'title.zh-CN': '导入 Pro', + 'title.ru-RU': 'Импорт Pro', link: '/handbook/action-import-pro', }, { @@ -1518,11 +1716,13 @@ export default [ 'title.fr-FR': 'Exporter', 'title.zh-CN': '导出', 'title.ja-JP': 'エクスポート', + 'title.ru-RU': 'Экспорт', link: '/handbook/action-export', }, { title: 'Export Pro', 'title.zh-CN': '导出 Pro', + 'title.ru-RU': 'Экспорт Pro', link: '/handbook/action-export-pro', }, { @@ -1530,6 +1730,7 @@ export default [ 'title.fr-FR': 'Scanner un QR code', 'title.zh-CN': '扫二维码', 'title.ja-JP': 'QRコードをスキャン', + 'title.ru-RU': 'Сканировать QR код', link: '/handbook/action-qr-scan', }, ], @@ -1539,6 +1740,7 @@ export default [ 'title.fr-FR': 'Contrôle des droits opérationnels', 'title.zh-CN': '操作权限', 'title.ja-JP': '操作権限', + 'title.ru-RU': 'Контроль доступа', link: '/handbook/ui/actions/permission', }, ], @@ -1548,6 +1750,7 @@ export default [ 'title.fr-FR': 'Variables', 'title.zh-CN': '变量', 'title.ja-JP': '変数', + 'title.ru-RU': 'Переменные', link: '/handbook/ui/variables', }, { @@ -1555,29 +1758,34 @@ export default [ 'title.fr-FR': 'Règle de dépendance', 'title.zh-CN': '联动规则', 'title.ja-JP': '連動ルール(れんどうルール)', + 'title.ru-RU': 'Правила связи', link: '/handbook/ui/linkage-rule', }, { title: 'Template engines', 'title.fr-FR': 'Moteur de template', 'title.zh-CN': '模板引擎', + 'title.ru-RU': 'Шаблоны', children: [ { title: 'JSON template', 'title.fr-FR': 'Template JSON', 'title.zh-CN': 'JSON 模板', + 'title.ru-RU': 'JSON шаблон', link: '/handbook/template-json', }, { title: 'String template', 'title.fr-FR': 'Template String', 'title.zh-CN': '字符串模板', + 'title.ru-RU': 'Строка шаблона', link: '/handbook/template-string', }, { title: 'Handlebars', 'title.fr-FR': 'Template Handlebars', 'title.zh-CN': 'Handlebars', + 'title.ru-RU': 'Handlebars', link: '/handbook/template-handlebars', }, ], @@ -1589,16 +1797,19 @@ export default [ { title: 'Overview', 'title.zh-CN': '概述', + 'title.ru-RU': 'Обзор', link: '/handbook/calculation-engines', }, { title: 'Formula', 'title.zh-CN': 'Formula', + 'title.ru-RU': 'Формула', link: '/handbook/calculation-engines/formula', }, { title: 'Mathjs', 'title.zh-CN': 'Mathjs', + 'title.ru-RU': 'Mathjs', link: '/handbook/calculation-engines/mathjs', }, ], @@ -1608,6 +1819,7 @@ export default [ 'title.fr-FR': 'Mobile', 'title.zh-CN': '移动端', 'title.ja-JP': 'モバイル', + 'title.ru-RU': 'Мобильная', link: '/handbook/mobile', }, { @@ -1615,6 +1827,7 @@ export default [ 'title.fr-FR': 'Variables personnalisées', 'title.zh-CN': '自定义变量', 'title.ja-JP': 'カスタム変数', + 'title.ru-RU': 'Кастомные переменные', link: '/handbook/custom-variables', }, ], @@ -1624,6 +1837,7 @@ export default [ 'title.fr-FR': 'Core modules', 'title.zh-CN': '核心模块', 'title.ja-JP': 'コアモジュール', + 'title.ru-RU': 'Ядро', type: 'group', children: [ { @@ -1631,12 +1845,14 @@ export default [ 'title.fr-FR': 'Utilisateurs et droits', 'title.zh-CN': '用户和权限', 'title.ja-JP': 'ユーザーと権限', + 'title.ru-RU': 'Пользователи и права', children: [ { title: 'Users', 'title.fr-FR': 'Utilisateurs', 'title.zh-CN': '用户', 'title.ja-JP': 'ユーザー', + 'title.ru-RU': 'Пользователи', // subTitle: '@nocobase/plugin-users', link: '/handbook/users', }, @@ -1645,12 +1861,14 @@ export default [ 'title.fr-FR': 'Rôles et droits', 'title.zh-CN': '角色和权限', 'title.ja-JP': '役割と権限', + 'title.ru-RU': 'Роли и права', children: [ { title: 'Overview', 'title.fr-FR': "Vue d'ensemble", 'title.zh-CN': '概述', 'title.ja-JP': '概要', + 'title.ru-RU': 'Обзор', link: '/handbook/acl', }, { @@ -1658,6 +1876,7 @@ export default [ 'title.fr-FR': 'Gestion des départements', 'title.zh-CN': '使用手册', 'title.ja-JP': 'ユーザーマニュアル', + 'title.ru-RU': 'Пользовательский мануал', link: '/handbook/acl/manual', }, ], @@ -1667,12 +1886,14 @@ export default [ 'title.fr-FR': 'Départements', 'title.zh-CN': '部门', 'title.ja-JP': '部門', + 'title.ru-RU': 'Департаменты', children: [ { title: 'Overview', 'title.fr-FR': "Vue d'ensemble", 'title.zh-CN': '概述', 'title.ja-JP': '概要', + 'title.ru-RU': 'Обзор', link: '/handbook/departments', }, { @@ -1680,6 +1901,7 @@ export default [ 'title.fr-FR': 'Gestion des départements', 'title.zh-CN': '使用手册', 'title.ja-JP': 'ユーザーマニュアル', + 'title.ru-RU': 'Пользовательский мануал', link: '/handbook/departments/manual', }, ], @@ -1693,22 +1915,26 @@ export default [ title: 'Synchronization management', 'title.fr-FR': 'Synchronisation des données utilisateurs', 'title.zh-CN': '同步管理', + 'title.ru-RU': 'Синхронизация данных пользователей', link: '/handbook/user-data-sync', }, { title: 'Data sources', 'title.fr-FR': 'Sources de données', 'title.zh-CN': '数据源', + 'title.ru-RU': 'Источники данных', children: [ { title: 'HTTP API', 'title.fr-FR': 'HTTP API', + 'title.ru-RU': 'HTTP API', link: '/handbook/user-data-sync/sources/api', }, { title: 'WeCom', 'title.fr-FR': 'WeCom', 'title.zh-CN': '企业微信', + 'title.ru-RU': 'ВебКом', link: '/handbook/wecom/user-data-sync', }, ], @@ -1717,17 +1943,20 @@ export default [ title: 'Development', 'title.fr-FR': 'Développement', 'title.zh-CN': '开发指南', + 'title.ru-RU': 'Разработка', children: [ { title: 'Extending Synchronized Data Sources', 'title.zh-CN': '扩展同步数据源', 'title.ja-JP': '拡張された同期データソース', + 'title.ru-RU': 'Расширение синхронизированных данных источников', link: '/handbook/user-data-sync/dev/source', }, { title: 'Extending Sync Target Resources', 'title.zh-CN': '扩展同步目标资源', 'title.ja-JP': '同期対象リソースの拡張', + 'title.ru-RU': 'Расширение синхронизированных целевых ресурсов', link: '/handbook/user-data-sync/dev/resource', }, ], @@ -1741,12 +1970,14 @@ export default [ 'title.fr-FR': 'Authentication & Verification', 'title.zh-CN': '认证和验证', 'title.ja-JP': 'Authentication & Verification', + 'title.ru-RU': 'Аутентификация и верификация', children: [ { title: 'Authentication', 'title.fr-FR': 'Authentification', 'title.zh-CN': '用户认证', 'title.ja-JP': 'ユーザー認証', + 'title.ru-RU': 'Аутентификация', // subTitle: '@nocobase/plugin-auth', children: [ { @@ -1754,6 +1985,7 @@ export default [ 'title.fr-FR': "Vue d'ensemble", 'title.zh-CN': '概述', 'title.ja-JP': '概要', + 'title.ru-RU': 'Обзор', link: '/handbook/auth', }, { @@ -1761,6 +1993,7 @@ export default [ 'title.fr-FR': "Gestion de l'authentification", 'title.zh-CN': '使用手册', 'title.ja-JP': 'ユーザーマニュアル', + 'title.ru-RU': 'Пользовательские инструкции', link: '/handbook/auth/user', }, { @@ -1768,17 +2001,20 @@ export default [ 'title.fr-FR': 'Développement', 'title.zh-CN': '开发指南', 'title.ja-JP': '開発ガイド', + 'title.ru-RU': 'Разработка', children: [ { title: 'Extend Authentication Type', 'title.zh-CN': '扩展认证类型', 'title.ja-JP': '認証タイプの拡張', + 'title.ru-RU': 'Расширение типа аутентификации', link: '/handbook/auth/dev/guide', }, { title: 'API Reference', 'title.zh-CN': 'API 参考', 'title.ja-JP': 'API 参考', + 'title.ru-RU': 'API 参考', link: '/handbook/auth/dev/api', }, ], @@ -1790,6 +2026,7 @@ export default [ 'title.fr-FR': 'Authentification - SMS', 'title.zh-CN': '用户认证 - 短信', 'title.ja-JP': 'ユーザー認証 - SMS', + 'title.ru-RU': 'Аутентификация - SMS', // subTitle: '@nocobase/plugin-sms-auth', link: '/handbook/auth-sms', }, @@ -1798,6 +2035,7 @@ export default [ 'title.fr-FR': 'Authentification - CAS', 'title.zh-CN': '用户认证 - CAS', 'title.ja-JP': 'ユーザー認証 - CAS', + 'title.ru-RU': 'Аутентификация - CAS', // subTitle: '@nocobase/plugin-cas', link: '/handbook/auth-cas', }, @@ -1807,12 +2045,14 @@ export default [ 'title.zh-CN': '用户认证 - OIDC', 'title.ja-JP': 'ユーザー認証 - OIDC', // subTitle: '@nocobase/plugin-oidc', + 'title.ru-RU': 'Аутентификация - OIDC', children: [ { title: 'User manual', 'title.fr-FR': 'OIDC', 'title.zh-CN': '使用手册', 'title.ja-JP': 'ユーザーマニュアル', + 'title.ru-RU': 'Пользовательские инструкции', link: '/handbook/auth-oidc', }, { @@ -1820,17 +2060,20 @@ export default [ 'title.fr-FR': 'Exemple', 'title.zh-CN': '示例', 'title.ja-JP': '例', + 'title.ru-RU': 'Пример', children: [ { title: 'Sign in with Google', 'title.zh-CN': '谷歌登录', 'title.ja-JP': 'Googleでサインイン', + 'title.ru-RU': 'Войти с Google', link: '/handbook/auth-oidc/example/google', }, { title: 'Microsoft Entra ID', 'title.zh-CN': '微软登录', 'title.ja-JP': 'MicroSoft Entra ID', + 'title.ru-RU': 'Microsoft Entra ID', link: '/handbook/auth-oidc/example/microsoft', }, ], @@ -1842,6 +2085,7 @@ export default [ 'title.fr-FR': 'Authentification - SAML', 'title.zh-CN': '用户认证 - SAML', 'title.ja-JP': 'ユーザー認証 - SAML', + 'title.ru-RU': 'Аутентификация - SAML', // subTitle: '@nocobase/plugin-saml', children: [ { @@ -1849,6 +2093,7 @@ export default [ 'title.fr-FR': 'SAML', 'title.zh-CN': '使用手册', 'title.ja-JP': 'ユーザーマニュアル', + 'title.ru-RU': 'Пользовательские инструкции', link: '/handbook/auth-saml', }, { @@ -1856,11 +2101,13 @@ export default [ 'title.fr-FR': 'Exemple', 'title.zh-CN': '示例', 'title.ja-JP': '例', + 'title.ru-RU': 'Пример', children: [ { title: 'Sign in with Google', 'title.zh-CN': '谷歌登录', 'title.ja-JP': 'Googleでサインイン', + 'title.ru-RU': 'Войти с Google', link: '/handbook/auth-saml/example/google', }, ], @@ -1872,6 +2119,7 @@ export default [ 'title.fr-FR': 'Authentification - LDAP', 'title.zh-CN': '用户认证 - LDAP', 'title.ja-JP': 'ユーザー認証 - LDAP', + 'title.ru-RU': 'Аутентификация - LDAP', // subTitle: '@nocobase/plugin-saml', children: [ { @@ -1879,6 +2127,7 @@ export default [ 'title.fr-FR': 'LDAP', 'title.zh-CN': '使用手册', 'title.ja-JP': 'ユーザーマニュアル', + 'title.ru-RU': 'Пользовательские инструкции', link: '/handbook/auth-ldap', }, ], @@ -1888,6 +2137,7 @@ export default [ 'title.fr-FR': 'Authentification - DingTalk', 'title.zh-CN': '用户认证 - 钉钉', 'title.ja-JP': 'ユーザー認証 - DingTalk', + 'title.ru-RU': 'Аутентификация - DingTalk', link: '/handbook/auth-dingtalk', }, { @@ -1895,6 +2145,7 @@ export default [ 'title.fr-FR': 'Authentification -WeCom', 'title.zh-CN': '用户认证 - 企业微信', 'title.ja-JP': 'ユーザー認証 - WeCom', + 'title.ru-RU': 'Аутентификация - WeCom', link: '/handbook/wecom/auth', }, { @@ -1902,6 +2153,7 @@ export default [ 'title.fr-FR': 'Clés API', 'title.zh-CN': 'API 密钥', 'title.ja-JP': 'APIキー', + 'title.ru-RU': 'API ключи', // subTitle: '@nocobase/plugin-verification', link: '/handbook/api-keys', }, @@ -1910,6 +2162,7 @@ export default [ 'title.fr-FR': 'Two-factor authentication (2FA)', 'title.zh-CN': '双因素身份认证 (2FA)', 'title.ja-JP': 'Two-factor authentication (2FA)', + 'title.ru-RU': 'Двухфакторная аутентификация (2FA)', link: '/handbook/two-factor-authentication', }, { @@ -1917,6 +2170,7 @@ export default [ 'title.fr-FR': 'Vérification', 'title.zh-CN': '验证', 'title.ja-JP': '検証', + 'title.ru-RU': 'Верификация', // subTitle: '@nocobase/plugin-verification', children: [ { @@ -1924,6 +2178,7 @@ export default [ 'title.fr-FR': "Vue d'ensemble", 'title.zh-CN': '概述', 'title.ja-JP': '概要', + 'title.ru-RU': 'Обзор', link: '/handbook/verification', }, { @@ -1931,23 +2186,27 @@ export default [ 'title.fr-FR': 'Développement', 'title.zh-CN': '开发指南', 'title.ja-JP': '開発ガイド', + 'title.ru-RU': 'Разработка', children: [ { title: 'Extend verification type', 'title.zh-CN': '扩展验证类型', 'title.ja-JP': 'Extend verification type', + 'title.ru-RU': 'Расширение типа верификации', link: '/handbook/verification/dev/type', }, { title: 'Extend verification scene', 'title.zh-CN': '扩展验证场景', 'title.ja-JP': 'Extend verification scene', + 'title.ru-RU': 'Расширение сценария верификации', link: '/handbook/verification/dev/scene', }, { title: 'API reference', 'title.zh-CN': 'API 参考', 'title.ja-JP': 'API 参考', + 'title.ru-RU': 'Ссылка на API', link: '/handbook/verification/dev/api', }, ], @@ -1959,12 +2218,14 @@ export default [ 'title.fr-FR': 'Verification - SMS', 'title.zh-CN': '验证 - 短信', 'title.ja-JP': 'Verification - SMS', + 'title.ru-RU': 'Верификация - SMS', children: [ { title: 'User manual', 'title.fr-FR': "Gestion de l'authentification", 'title.zh-CN': '使用手册', 'title.ja-JP': 'ユーザーマニュアル', + 'title.ru-RU': 'Пользовательские инструкции', link: '/handbook/verification/sms', }, { @@ -1972,6 +2233,7 @@ export default [ 'title.fr-FR': 'Extend SMS provider', 'title.zh-CN': '扩展短信服务商', 'title.ja-JP': 'Extend SMS provider', + 'title.ru-RU': 'Расширение SMS провайдера', link: '/handbook/verification/sms/dev', }, ], @@ -1981,6 +2243,7 @@ export default [ 'title.fr-FR': 'Verification - TOTP authenticator', 'title.zh-CN': '验证 - TOTP 认证器', 'title.ja-JP': 'Verification - SMS', + 'title.ru-RU': 'Верификация - TOTP 认证器', link: '/handbook/verification-totp-authenticator', }, ], @@ -1990,33 +2253,39 @@ export default [ 'title.fr-FR': 'Notifications', 'title.zh-CN': '通知', 'title.ja-JP': '通知', + 'title.ru-RU': 'Уведомления', children: [ { title: 'Notification manager', 'title.fr-FR': 'Gestionnaire de notifications', 'title.zh-CN': '通知管理', 'title.ja-JP': '通知管理', + 'title.ru-RU': 'Уведомления', children: [ { title: 'Overview', 'title.fr-FR': "Vue d'ensemble", 'title.zh-CN': '概述', 'title.ja-JP': '概要', + 'title.ru-RU': 'Обзор', link: '/handbook/notification-manager', }, { title: 'Development', 'title.fr-FR': 'Développement', 'title.zh-CN': '开发指南', + 'title.ru-RU': 'Разработка', children: [ { title: 'Notification Extension', 'title.zh-CN': '扩展通知渠道类型', + 'title.ru-RU': 'Расширение типа уведомления', link: '/handbook/notification-manager/development/extension', }, { title: 'Notification API', 'title.zh-CN': '扩展通知API', + 'title.ru-RU': 'Расширение API уведомления', link: '/handbook/notification-manager/development/api', }, ], @@ -2028,6 +2297,7 @@ export default [ 'title.fr-FR': 'Notification: message In-App', 'title.zh-CN': '通知:站内信', 'title.ja-JP': '通知:アプリ内メッセージ', + 'title.ru-RU': 'Уведомление:Сообщение в приложении', link: '/handbook/notification-in-app-message', }, { @@ -2035,12 +2305,14 @@ export default [ 'title.fr-FR': 'Notification: Email', 'title.zh-CN': '通知:电子邮件', 'title.ja-JP': '通知:メール', + 'title.ru-RU': 'Уведомление:Электронная почта', link: '/handbook/notification-email', }, { title: 'Notification: WeCom', 'title.fr-FR': 'Notification: WeCom', 'title.zh-CN': '通知:企业微信', + 'title.ru-RU': 'Уведомление:WeCom', link: '/handbook/wecom/notification', }, ], @@ -2050,12 +2322,14 @@ export default [ 'title.fr-FR': 'Gestionnaire de fichiers', 'title.zh-CN': '文件管理器', 'title.ja-JP': 'ファイルマネージャー', + 'title.ru-RU': 'Файловый менеджер', children: [ { title: 'Overview', 'title.fr-FR': "Vue d'ensemble", 'title.zh-CN': '概述', 'title.ja-JP': '概要', + 'title.ru-RU': 'Обзор', link: '/handbook/file-manager', }, { @@ -2063,6 +2337,7 @@ export default [ 'title.fr-FR': 'Collection de fichiers', 'title.zh-CN': '文件表', 'title.ja-JP': 'ファイルコレクション', + 'title.ru-RU': 'Коллекция файлов', link: '/handbook/file-manager/file-collection', }, { @@ -2070,6 +2345,7 @@ export default [ 'title.fr-FR': 'Champ de fichier', 'title.zh-CN': '附件字段', 'title.ja-JP': '添付フィールド', + 'title.ru-RU': 'Прикрепленное поле', link: '/handbook/file-manager/field-attachment', }, { @@ -2077,11 +2353,13 @@ export default [ 'title.fr-FR': 'Stockage des fichiers', 'title.zh-CN': '文件存储引擎', 'title.ja-JP': 'ファイルストレージエンジン', + 'title.ru-RU': 'Хранилище файлов', children: [ { title: 'Overview', 'title.zh-CN': '概述', 'title.ja-JP': '概要', + 'title.ru-RU': 'Обзор', link: '/handbook/file-manager/storage', }, { @@ -2089,6 +2367,7 @@ export default [ 'title.fr-FR': 'Stockage local', 'title.zh-CN': '文件存储:本地', 'title.ja-JP': 'ファイルストレージ:ローカル', + 'title.ru-RU': 'Локальное хранилище файлов', link: '/handbook/file-manager/storage/local', }, { @@ -2096,6 +2375,7 @@ export default [ 'title.fr-FR': 'Stockage OSS', 'title.zh-CN': '文件存储:OSS', 'title.ja-JP': 'ファイルストレージ:OSS', + 'title.ru-RU': 'Хранилище OSS файлов', link: '/handbook/file-manager/storage/aliyun-oss', }, { @@ -2103,6 +2383,7 @@ export default [ 'title.fr-FR': 'Stockage S3', 'title.zh-CN': '文件存储:S3', 'title.ja-JP': 'ファイルストレージ:S3', + 'title.ru-RU': 'Хранилище S3 файлов', link: '/handbook/file-manager/storage/amazon-s3', }, { @@ -2110,12 +2391,14 @@ export default [ 'title.fr-FR': 'Stockage COS', 'title.zh-CN': '文件存储:COS', 'title.ja-JP': 'ファイルストレージ:COS', + 'title.ru-RU': 'Хранилище COS файлов', link: '/handbook/file-manager/storage/tencent-cos', }, { title: 'File storage: S3(Pro)', 'title.zh-CN': '文件存储:S3(Pro)', 'title.ja-JP': 'ファイルストレージ:S3(Pro)', + 'title.ru-RU': 'Хранилище S3(Pro) файлов', link: '/handbook/file-manager/storage/s3-pro', }, ], @@ -2124,12 +2407,14 @@ export default [ title: 'HTTP API', 'title.fr-FR': 'HTTP API', 'title.zh-CN': 'HTTP API', + 'title.ru-RU': 'HTTP API', link: '/handbook/file-manager/http-api', }, { title: 'Development', 'title.fr-FR': 'Développement', 'title.zh-CN': '扩展开发', + 'title.ru-RU': 'Разработка', link: '/handbook/file-manager/development', }, { @@ -2137,12 +2422,14 @@ export default [ 'title.fr-FR': 'Plugins associés', 'title.zh-CN': '相关插件', 'title.ja-JP': '関連プラグイン', + 'title.ru-RU': 'Связанные плагины', children: [ { title: 'File Previewer (Office)', 'title.fr-FR': 'Aperçu des fichiers (Office)', 'title.zh-CN': '文件预览(Office)', 'title.ja-JP': 'ファイルプレビュー(Office)', + 'title.ru-RU': 'Предпросмотр файлов (Office)', link: '/handbook/file-previewer-office', }, ], @@ -2154,12 +2441,14 @@ export default [ 'title.fr-FR': 'Log et suppervision', 'title.zh-CN': '日志和监控', 'title.ja-JP': 'ログと監視', + 'title.ru-RU': 'Логирование и мониторинг', children: [ { title: 'Logger', 'title.fr-FR': 'Log', 'title.zh-CN': '日志', 'title.ja-JP': 'ログ', + 'title.ru-RU': 'Лог', // subTitle: '@nocobase/plugin-logger', link: '/handbook/logger', }, @@ -2168,6 +2457,7 @@ export default [ 'title.fr-FR': 'Télémétrie - Prometheus', 'title.zh-CN': '遥测 - Prometheus', 'title.ja-JP': 'テレメトリ - Prometheus', + 'title.ru-RU': 'Телеметрия - Prometheus', // subTitle: '@nocobase/plugin-telemetry-prometheus', link: '/handbook/telemetry-prometheus', }, @@ -2176,6 +2466,7 @@ export default [ 'title.fr-FR': "Log d'audit", 'title.zh-CN': '审计日志', 'title.ja-JP': '監査ログ', + 'title.ru-RU': 'Логирование аудита', // subTitle: '@nocobase/plugin-audit-logs', link: '/handbook/audit-logs', }, @@ -2186,12 +2477,14 @@ export default [ 'title.fr-FR': 'Visualisation des données', 'title.zh-CN': '数据可视化', 'title.ja-JP': 'データビジュアライゼーション', + 'title.ru-RU': 'Визуализация данных', children: [ { title: 'Overview', 'title.fr-FR': "Vue d'ensemble", 'title.zh-CN': '概述', 'title.ja-JP': '概要', + 'title.ru-RU': 'Обзор', link: '/handbook/data-visualization', }, { @@ -2199,12 +2492,14 @@ export default [ 'title.fr-FR': 'Documentation', 'title.zh-CN': '使用手册', 'title.ja-JP': 'ユーザーマニュアル', + 'title.ru-RU': 'Пользовательские инструкции', children: [ { title: 'Basic usage', 'title.fr-FR': 'Utilisation de base', 'title.zh-CN': '基本使用', 'title.ja-JP': '基本的な使い方', + 'title.ru-RU': 'Основное использование', type: 'group', children: [ { @@ -2212,6 +2507,7 @@ export default [ 'title.fr-FR': 'Graphiques', 'title.zh-CN': '图表区块', 'title.ja-JP': 'チャートブロック', + 'title.ru-RU': 'Блок диаграммы', link: '/handbook/data-visualization/user/chart-block', }, { @@ -2219,6 +2515,7 @@ export default [ 'title.fr-FR': 'Configuration de graphique', 'title.zh-CN': '配置图表', 'title.ja-JP': 'チャートを設定', + 'title.ru-RU': 'Настройка диаграммы', link: '/handbook/data-visualization/user/Configure', }, { @@ -2226,6 +2523,7 @@ export default [ 'title.fr-FR': 'Filtres', 'title.zh-CN': '筛选区块', 'title.ja-JP': 'フィルターブロック', + 'title.ru-RU': 'Фильтр блока', link: '/handbook/data-visualization/user/filter', }, ], @@ -2233,48 +2531,56 @@ export default [ { title: 'Ant design charts', 'title.fr-FR': 'Graphique Ant', + 'title.ru-RU': 'График Ant', type: 'group', children: [ { title: 'Overview', 'title.zh-CN': '概览', 'title.ja-JP': '概要', + 'title.ru-RU': 'Обзор', link: '/handbook/data-visualization/antd-charts/overview', }, { title: 'Line', 'title.zh-CN': '折线图', 'title.ja-JP': 'ラインチャート', + 'title.ru-RU': 'Линия', link: '/handbook/data-visualization/antd-charts/line', }, { title: 'Column', 'title.zh-CN': '柱状图', 'title.ja-JP': 'コラムチャート', + 'title.ru-RU': 'Столбец', link: '/handbook/data-visualization/antd-charts/column', }, { title: 'Bar', 'title.zh-CN': '条形图', 'title.ja-JP': 'バーチャート', + 'title.ru-RU': 'Бар', link: '/handbook/data-visualization/antd-charts/bar', }, { title: 'Pie', 'title.zh-CN': '饼图', 'title.ja-JP': 'パイチャート', + 'title.ru-RU': 'Пи', link: '/handbook/data-visualization/antd-charts/pie', }, { title: 'Dual Axes', 'title.zh-CN': '双轴图', 'title.ja-JP': 'デュアルアクシス', + 'title.ru-RU': 'Двойная ось', link: '/handbook/data-visualization/antd-charts/dual-axes', }, { title: 'Scatter', 'title.zh-CN': '散点图', 'title.ja-JP': '散布図', + 'title.ru-RU': 'Рассеяние', link: '/handbook/data-visualization/antd-charts/scatter', }, ], @@ -2282,24 +2588,28 @@ export default [ { title: 'Ant design', 'title.fr-FR': 'Design Ant', + 'title.ru-RU': 'Дизайн Ant', type: 'group', children: [ { title: 'Overview', 'title.zh-CN': '概览', 'title.ja-JP': '概要', + 'title.ru-RU': 'Обзор', link: '/handbook/data-visualization/antd/overview', }, { title: 'Table', 'title.zh-CN': '表格', 'title.ja-JP': 'テーブル', + 'title.ru-RU': 'Таблица', link: '/handbook/data-visualization/antd/table', }, { title: 'Statistic', 'title.zh-CN': '统计', 'title.ja-JP': '統計', + 'title.ru-RU': 'Статистика', link: '/handbook/data-visualization/antd/statistic', }, ], @@ -2312,72 +2622,84 @@ export default [ title: 'ECharts Overview', 'title.zh-CN': 'ECharts 概览', 'title.ja-JP': 'ECharts概要', + 'title.ru-RU': 'ECharts обзор', link: '/handbook/data-visualization-echarts', }, { title: 'Line', 'title.zh-CN': '折线图', 'title.ja-JP': 'ラインチャート', + 'title.ru-RU': 'Линия', link: '/handbook/data-visualization-echarts/line', }, { title: 'Column', 'title.zh-CN': '柱状图', 'title.ja-JP': 'コラムチャート', + 'title.ru-RU': 'Столбец', link: '/handbook/data-visualization-echarts/column', }, { title: 'Bar', 'title.zh-CN': '条形图', 'title.ja-JP': 'バーチャート', + 'title.ru-RU': 'Бар', link: '/handbook/data-visualization-echarts/bar', }, { title: 'Diverging Bar', 'title.zh-CN': '分岐条形图', 'title.ja-JP': 'ダイバージングバーチャート', + 'title.ru-RU': 'Бар расхождения', link: '/handbook/data-visualization-echarts/diverging-bar', }, { title: 'Pie', 'title.zh-CN': '饼图', 'title.ja-JP': 'パイチャート', + 'title.ru-RU': 'Пи', link: '/handbook/data-visualization-echarts/pie', }, { title: 'Area', 'title.zh-CN': '面积图', 'title.ja-JP': 'エリアチャート', + 'title.ru-RU': 'Площадь', link: '/handbook/data-visualization-echarts/area', }, { title: 'Scatter', 'title.zh-CN': '散点图', 'title.ja-JP': '散布図', + 'title.ru-RU': 'Рассеяние', link: '/handbook/data-visualization-echarts/scatter', }, { title: 'Funnel', 'title.zh-CN': '漏斗图', 'title.ja-JP': 'ファネルチャート', + 'title.ru-RU': 'Воронка', link: '/handbook/data-visualization-echarts/funnel', }, { title: 'Radar', 'title.zh-CN': '雷达图', 'title.ja-JP': 'レーダーチャート', + 'title.ru-RU': 'Радар', link: '/handbook/data-visualization-echarts/radar', }, { title: 'Treemap', 'title.zh-CN': '矩形树图', 'title.ja-JP': 'ツリーマップ', + 'title.ru-RU': 'Древовидная карта', link: '/handbook/data-visualization-echarts/treemap', }, { title: 'Word Cloud', 'title.zh-CN': '词云图', 'title.ja-JP': 'ワードクラウド', + 'title.ru-RU': 'Облако слов', link: '/handbook/data-visualization-echarts/wordcloud', }, ], @@ -2389,10 +2711,12 @@ export default [ 'title.fr-FR': 'Développement', 'title.zh-CN': '开发指南', 'title.ja-JP': '開発ガイド', + 'title.ru-RU': 'Разработка', children: [ { title: 'Extend chart types', 'title.fr-FR': 'Extension de type de graphique', + 'title.ru-RU': 'Расширение типа графика', 'title.zh-CN': '扩展图表类型', 'title.ja-JP': 'チャートタイプを拡張', link: '/handbook/data-visualization/dev/', @@ -2402,6 +2726,7 @@ export default [ 'title.fr-FR': "Exemple d'intégration ECharts", 'title.zh-CN': 'ECharts 集成示例', 'title.ja-JP': 'ECharts統合の例', + 'title.ru-RU': 'Пример интеграции ECharts', link: '/handbook/data-visualization/step-by-step', }, ], @@ -2411,6 +2736,7 @@ export default [ 'title.fr-FR': 'FAQ', 'title.zh-CN': '常见问题', 'title.ja-JP': 'よくある質問', + 'title.ru-RU': 'Часто задаваемые вопросы', link: '/handbook/data-visualization/faq', }, ], @@ -2420,6 +2746,7 @@ export default [ 'title.fr-FR': 'Gestionnaire multi-App', 'title.zh-CN': '多应用管理', 'title.ja-JP': 'マルチアプリ管理', + 'title.ru-RU': 'Мульти-приложение', // subTitle: '@nocobase/plugin-api-doc', link: '/handbook/multi-app-manager', // children: ['/plugins/api-doc'], @@ -2428,17 +2755,20 @@ export default [ title: 'Email manager', 'title.zh-CN': '邮件管理', 'title.ja-JP': 'メール管理', + 'title.ru-RU': 'Менеджер электронной почты', children: [ { title: 'Administrator configuration', 'title.zh-CN': '管理员配置', 'title.ja-JP': '管理者設定', + 'title.ru-RU': 'Администраторская конфигурация', link: '/handbook/email-manager/usage-admin', }, { title: 'User manual', 'title.zh-CN': '使用手册', 'title.ja-JP': 'ユーザーマニュアル', + 'title.ru-RU': 'Пользовательская инструкция', link: '/handbook/email-manager/usage-user', }, ], @@ -2447,6 +2777,7 @@ export default [ title: 'Routes', 'title.zh-CN': '路由', 'title.ja-JP': 'ルート', + 'title.ru-RU': 'Маршруты', link: '/handbook/routes', }, ], @@ -2456,18 +2787,21 @@ export default [ 'title.fr-FR': 'Workflow', 'title.zh-CN': '工作流', 'title.ja-JP': 'ワークフロー', + 'title.ru-RU': 'Workflow', type: 'group', children: [ { title: 'Overview', 'title.zh-CN': '概述', 'title.ja-JP': '概述', + 'title.ru-RU': 'Обзор', link: '/handbook/workflow', }, { title: 'Quick Start', 'title.zh-CN': '快速开始', 'title.ja-JP': 'クイックスタート', + 'title.ru-RU': 'Быстрый старт', link: '/handbook/workflow/quick-start', }, { @@ -2475,29 +2809,34 @@ export default [ 'title.fr-FR': 'Avancé', 'title.zh-CN': '进阶理解', 'title.ja-JP': '高度な理解', + 'title.ru-RU': 'Расширенное понимание', children: [ { title: 'Variables', 'title.zh-CN': '变量', 'title.ja-JP': '変数', + 'title.ru-RU': 'Переменные', link: '/handbook/workflow/advanced/variables', }, { title: 'Executions', 'title.zh-CN': '执行计划', 'title.ja-JP': '実行計画', + 'title.ru-RU': 'Выполнения', link: '/handbook/workflow/advanced/executions', }, { title: 'Revisions Management', 'title.zh-CN': '版本管理', 'title.ja-JP': 'バージョン管理', + 'title.ru-RU': 'Управление версиями', link: '/handbook/workflow/advanced/revisions', }, { title: 'Options', 'title.zh-CN': '高级配置', 'title.ja-JP': '高级配置', + 'title.ru-RU': 'Дополнительные настройки', link: '/handbook/workflow/advanced/options', }, ], @@ -2507,53 +2846,62 @@ export default [ 'title.fr-FR': 'Déclencheurs', 'title.zh-CN': '触发器', 'title.ja-JP': 'トリガー', + 'title.ru-RU': 'Триггеры', children: [ { title: 'Overview', 'title.zh-CN': '概览', 'title.ja-JP': '概要', + 'title.ru-RU': 'Обзор', link: '/handbook/workflow/triggers', }, { title: 'Collection Event', 'title.zh-CN': '数据表事件', 'title.ja-JP': 'データテーブルイベント', + 'title.ru-RU': 'Событие данных таблицы', link: '/handbook/workflow/triggers/collection', }, { title: 'Schedule', 'title.zh-CN': '定时任务', 'title.ja-JP': '定期タスク', + 'title.ru-RU': 'Расписание', link: '/handbook/workflow/triggers/schedule', }, { title: 'Pre-Action Event', 'title.zh-CN': '操作前事件', 'title.ja-JP': '操作前イベント', + 'title.ru-RU': 'Событие перед действием', link: '/handbook/workflow/triggers/pre-action', }, { title: 'Custom Action Trigger', 'title.zh-CN': '自定义操作触发器', 'title.ja-JP': 'カスタムアクショントリガー', + 'title.ru-RU': 'Треггер пользовательского действия', link: '/handbook/workflow/triggers/custom-action', }, { title: 'Post-Action Event', 'title.zh-CN': '操作后事件', 'title.ja-JP': '操作後のイベント', + 'title.ru-RU': 'Событие после действия', link: '/handbook/workflow/triggers/post-action', }, { title: 'Approval', 'title.zh-CN': '审批', 'title.ja-JP': '承認', + 'title.ru-RU': 'Аппробация', link: '/handbook/workflow/triggers/approval', }, { title: 'Webhook', 'title.zh-CN': 'Webhook', 'title.ja-JP': 'Webhook', + 'title.ru-RU': 'Webhook', link: '/handbook/workflow/triggers/webhook', }, ], @@ -2563,11 +2911,13 @@ export default [ 'title.fr-FR': 'Noeuds', 'title.zh-CN': '节点', 'title.ja-JP': 'ノード', + 'title.ru-RU': 'Узлы', children: [ { title: 'Nodes Overview', 'title.zh-CN': '概览', 'title.ja-JP': '概要', + 'title.ru-RU': 'Обзор', link: '/handbook/workflow/nodes', }, { @@ -2575,42 +2925,49 @@ export default [ 'title.fr-FR': 'Contrôle du workflow', 'title.zh-CN': '流程控制类', 'title.ja-JP': 'フロー制御', + 'title.ru-RU': 'Управление workflow', type: 'group', children: [ { title: 'Condition', 'title.zh-CN': '条件', 'title.ja-JP': '条件', + 'title.ru-RU': 'Условие', link: '/handbook/workflow/nodes/condition', }, { title: 'Delay', 'title.zh-CN': '延时', 'title.ja-JP': '遅延', + 'title.ru-RU': 'Задержка', link: '/handbook/workflow/nodes/delay', }, { title: 'End', 'title.zh-CN': '结束', 'title.ja-JP': '終了', + 'title.ru-RU': 'Конец', link: '/handbook/workflow/nodes/end', }, { title: 'Loop', 'title.zh-CN': '循环', 'title.ja-JP': 'ループ', + 'title.ru-RU': 'Цикл', link: '/handbook/workflow/nodes/loop', }, { title: 'Parallel', 'title.zh-CN': '并行', 'title.ja-JP': '並行', + 'title.ru-RU': 'Параллельно', link: '/handbook/workflow/nodes/parallel', }, { title: 'Variable', 'title.zh-CN': '变量', 'title.ja-JP': '変数', + 'title.ru-RU': 'Переменная', link: '/handbook/workflow/nodes/variable', }, '/handbook/workflow/nodes/subflow', @@ -2619,6 +2976,7 @@ export default [ title: 'Variable', 'title.zh-CN': '变量', 'title.ja-JP': '変数', + 'title.ru-RU': 'Переменная', link: '/handbook/workflow/nodes/variable', }, ], @@ -2634,30 +2992,35 @@ export default [ title: 'Calculation', 'title.zh-CN': '计算', 'title.ja-JP': '計算', + 'title.ru-RU': 'Расчет', link: '/handbook/workflow/nodes/calculation', }, { title: 'Date Calculation', 'title.zh-CN': '日期计算', 'title.ja-JP': '日付計算', + 'title.ru-RU': 'Дата расчета', link: '/handbook/workflow/nodes/date-calculation', }, { title: 'Dynamic Calculation', 'title.zh-CN': '动态计算', 'title.ja-JP': '動的計算', + 'title.ru-RU': 'Динамический расчет', link: '/handbook/workflow/nodes/dynamic-calculation', }, { title: 'JSON Calculation', 'title.zh-CN': 'JSON 计算', 'title.ja-JP': 'JSONクエリ', + 'title.ru-RU': 'JSON запрос', link: '/handbook/workflow/nodes/json-query', }, { title: 'JSON Variable Mapping', 'title.zh-CN': 'JSON 变量映射', 'title.ja-JP': 'JSON 变量映射', + 'title.ru-RU': 'JSON переменная mapping', link: '/handbook/workflow/nodes/json-variable-mapping', }, ], @@ -2667,42 +3030,49 @@ export default [ 'title.fr-FR': 'Actions', 'title.zh-CN': '数据表操作', 'title.ja-JP': 'コレクションアクション', + 'title.ru-RU': 'Действия данных таблицы', type: 'group', children: [ { title: 'Create', 'title.zh-CN': '创建', 'title.ja-JP': '作成', + 'title.ru-RU': 'Создать', link: '/handbook/workflow/nodes/create', }, { title: 'Update', 'title.zh-CN': '更新', 'title.ja-JP': '更新', + 'title.ru-RU': 'Обновить', link: '/handbook/workflow/nodes/update', }, { title: 'Destroy', 'title.zh-CN': '删除', 'title.ja-JP': '删除', + 'title.ru-RU': 'Удалить', link: '/handbook/workflow/nodes/destroy', }, { title: 'Query', 'title.zh-CN': '查询', 'title.ja-JP': 'クエリ', + 'title.ru-RU': 'Запрос', link: '/handbook/workflow/nodes/query', }, { title: 'Aggregate', 'title.zh-CN': '聚合', 'title.ja-JP': '集約', + 'title.ru-RU': 'Агрегат', link: '/handbook/workflow/nodes/aggregate', }, { title: 'SQL', 'title.zh-CN': 'SQL', 'title.ja-JP': 'SQL', + 'title.ru-RU': 'SQL', link: '/handbook/workflow/nodes/sql', }, ], @@ -2712,24 +3082,28 @@ export default [ 'title.fr-FR': 'Manuel', 'title.zh-CN': '人工处理', 'title.ja-JP': '手動処理', + 'title.ru-RU': 'Ручной', type: 'group', children: [ { title: 'Manual', 'title.zh-CN': '人工处理', 'title.ja-JP': '手動処理', + 'title.ru-RU': 'Ручной', link: '/handbook/workflow/nodes/manual', }, { title: 'Approval', 'title.zh-CN': '审批', 'title.ja-JP': '承認', + 'title.ru-RU': 'Утверждение', link: '/handbook/workflow/nodes/approval', }, { title: 'CC', 'title.zh-CN': '抄送', 'title.ja-JP': '抄送', + 'title.ru-RU': 'CC', link: '/handbook/workflow/nodes/cc', }, ], @@ -2739,30 +3113,35 @@ export default [ 'title.fr-FR': 'Etendu', 'title.zh-CN': '扩展类型', 'title.ja-JP': '拡張タイプ', + 'title.ru-RU': 'Расширенный тип', type: 'group', children: [ { title: 'JavaScript', 'title.zh-CN': 'JavaScript 脚本', 'title.ja-JP': 'JavaScript スクリプト', + 'title.ru-RU': 'JavaScript скрипт', link: '/handbook/workflow/nodes/javascript', }, { title: 'Request', 'title.zh-CN': '请求', 'title.ja-JP': 'リクエスト', + 'title.ru-RU': 'Запрос', link: '/handbook/workflow/nodes/request', }, { title: 'Response', 'title.zh-CN': '响应', 'title.ja-JP': 'レスポンス', + 'title.ru-RU': 'Ответ', link: '/handbook/workflow/nodes/response', }, { title: 'Response Message', 'title.zh-CN': '响应消息', 'title.ja-JP': 'レスポンスメッセージ', + 'title.ru-RU': 'Ответ сообщение', link: '/handbook/workflow/nodes/response-message', }, ], @@ -2774,29 +3153,34 @@ export default [ 'title.fr-FR': 'Développement', 'title.zh-CN': '开发指南', 'title.ja-JP': '開発ガイド', + 'title.ru-RU': 'Разработка', children: [ { title: 'Overview', 'title.zh-CN': '概览', 'title.ja-JP': '概要', + 'title.ru-RU': 'Обзор', link: '/handbook/workflow/development', }, { title: 'Trigger', 'title.zh-CN': '触发器', 'title.ja-JP': 'トリガー', + 'title.ru-RU': 'Триггер', link: '/handbook/workflow/development/trigger', }, { title: 'Instruction', 'title.zh-CN': '指令', 'title.ja-JP': 'インストラクション', + 'title.ru-RU': 'Инструкция', link: '/handbook/workflow/development/instruction', }, { title: 'API Reference', 'title.zh-CN': 'API 参考', 'title.ja-JP': 'API 参考', + 'title.ru-RU': 'API справка', link: '/handbook/workflow/development/api', }, ], @@ -2806,42 +3190,49 @@ export default [ 'title.fr-FR': 'Plugins associés', 'title.zh-CN': '相关插件', 'title.ja-JP': '関連プラグイン', + 'title.ru-RU': 'Связанные плагины', children: [ { title: 'Post-Action Event', 'title.fr-FR': 'Post-action Event', 'title.zh-CN': '操作后事件', 'title.ja-JP': 'アクション後トリガー', + 'title.ru-RU': 'Событие после действия', subTitle: '@nocobase/plugin-workflow-action-trigger', children: [ { title: 'Overview', 'title.zh-CN': '概述', 'title.ja-JP': '概要', + 'title.ru-RU': 'Обзор', link: '/handbook/workflow-action-trigger', }, { title: 'Trigger', 'title.zh-CN': '触发器', 'title.ja-JP': 'トリガー', + 'title.ru-RU': 'Триггер', link: '/handbook/workflow-action-trigger/trigger', }, { title: 'Action', 'title.zh-CN': '操作', 'title.ja-JP': 'アクション', + 'title.ru-RU': 'Действие', link: '/handbook/workflow-action-trigger/action', }, { title: 'Example', 'title.zh-CN': '示例', 'title.ja-JP': '例', + 'title.ru-RU': 'Пример', link: '/handbook/workflow-action-trigger/example', }, { title: 'HTTP API', 'title.zh-CN': 'HTTP API', 'title.ja-JP': 'HTTP API', + 'title.ru-RU': 'HTTP API', link: '/handbook/workflow-action-trigger/http-api', }, ], @@ -2851,6 +3242,7 @@ export default [ 'title.fr-FR': 'Aggregate', 'title.zh-CN': '聚合查询', 'title.ja-JP': '集約クエリ', + 'title.ru-RU': 'Агрегат запрос', subTitle: '@nocobase/plugin-workflow-aggregate', link: '/handbook/workflow-aggregate', }, @@ -2859,54 +3251,63 @@ export default [ 'title.fr-FR': 'Approval', 'title.zh-CN': '审批', 'title.ja-JP': '承認', + 'title.ru-RU': 'Утверждение', subTitle: '@nocobase/plugin-workflow-approval', children: [ { title: 'Overview', 'title.zh-CN': '概述', 'title.ja-JP': '概要', + 'title.ru-RU': 'Обзор', link: '/handbook/workflow-approval', }, { title: 'Trigger', 'title.zh-CN': '触发器', 'title.ja-JP': 'トリガー', + 'title.ru-RU': 'Триггер', link: '/handbook/workflow-approval/trigger', }, { title: 'Node', 'title.zh-CN': '节点', 'title.ja-JP': 'ノード', + 'title.ru-RU': 'Узел', link: '/handbook/workflow-approval/node', }, { title: 'Action', 'title.zh-CN': '操作', 'title.ja-JP': 'アクション', + 'title.ru-RU': 'Действие', link: '/handbook/workflow-approval/action', }, { title: 'Block', 'title.zh-CN': '区块', 'title.ja-JP': 'ブロック', + 'title.ru-RU': 'Блок', link: '/handbook/workflow-approval/block', }, { title: 'Workflow tasks', 'title.zh-CN': '流程待办', 'title.ja-JP': '流程待办', + 'title.ru-RU': 'Задачи workflow', link: '/handbook/workflow-approval/tasks', }, { title: 'Advanced', 'title.zh-CN': '高级', 'title.ja-JP': '高度', + 'title.ru-RU': 'Расширенный', link: '/handbook/workflow-approval/advanced', }, { title: 'HTTP API', 'title.zh-CN': 'HTTP API', 'title.ja-JP': 'HTTP API', + 'title.ru-RU': 'HTTP API', link: '/handbook/workflow-approval/http-api', }, ], @@ -2916,6 +3317,7 @@ export default [ 'title.fr-FR': 'CC', 'title.zh-CN': '抄送', 'title.ja-JP': 'CC', + 'title.ru-RU': 'CC', subTitle: '@nocobase/plugin-workflow-cc', link: '/handbook/workflow-cc', }, @@ -2924,36 +3326,42 @@ export default [ 'title.fr-FR': "Déclencheur d'action personnalisé", 'title.zh-CN': '自定义操作事件', 'title.ja-JP': 'カスタムアクショントリガー', + 'title.ru-RU': 'Событие после действия', subTitle: '@nocobase/plugin-workflow-custom-action-trigger', children: [ { title: 'Overview', 'title.zh-CN': '概述', 'title.ja-JP': '概要', + 'title.ru-RU': 'Обзор', link: '/handbook/workflow-custom-action-trigger', }, { title: 'Trigger', 'title.zh-CN': '触发器', 'title.ja-JP': 'トリガー', + 'title.ru-RU': 'Триггер', link: '/handbook/workflow-custom-action-trigger/trigger', }, { title: 'Action', 'title.zh-CN': '操作', 'title.ja-JP': 'アクション', + 'title.ru-RU': 'Действие', link: '/handbook/workflow-custom-action-trigger/action', }, { title: 'Example', 'title.zh-CN': '示例', 'title.ja-JP': '例', + 'title.ru-RU': 'Пример', link: '/handbook/workflow-custom-action-trigger/example', }, { title: 'HTTP API', 'title.zh-CN': 'HTTP API', 'title.ja-JP': 'HTTP API', + 'title.ru-RU': 'HTTP API', link: '/handbook/workflow-custom-action-trigger/http-api', }, ], @@ -2963,6 +3371,7 @@ export default [ 'title.fr-FR': 'Calcul de date', 'title.zh-CN': '日期计算', 'title.ja-JP': '日付計算', + 'title.ru-RU': 'Дата расчета', subTitle: '@nocobase/plugin-workflow-date-calculation', link: '/handbook/workflow-date-calculation', }, @@ -2971,6 +3380,7 @@ export default [ 'title.fr-FR': 'Retard', 'title.zh-CN': '延时', 'title.ja-JP': '遅延', + 'title.ru-RU': 'Задержка', subTitle: '@nocobase/plugin-workflow-delay', link: '/handbook/workflow-delay', }, @@ -2979,24 +3389,28 @@ export default [ 'title.fr-FR': 'Calcul dynamique', 'title.zh-CN': '动态表达式', 'title.ja-JP': '動的計算', + 'title.ru-RU': 'Динамический расчет', subTitle: '@nocobase/plugin-workflow-dynamic-calculation', children: [ { title: 'Overview', 'title.zh-CN': '概述', 'title.ja-JP': '概要', + 'title.ru-RU': 'Обзор', link: '/handbook/workflow-dynamic-calculation', }, { title: 'Collection', 'title.zh-CN': '数据表', 'title.ja-JP': '式のコレクション', + 'title.ru-RU': 'Колекция', link: '/handbook/workflow-dynamic-calculation/collection', }, { title: 'Node', 'title.zh-CN': '节点', 'title.ja-JP': 'ノード', + 'title.ru-RU': 'Узел', link: '/handbook/workflow-dynamic-calculation/node', }, ], @@ -3006,6 +3420,7 @@ export default [ 'title.fr-FR': 'JavaScript', 'title.zh-CN': 'JavaScript 脚本', 'title.ja-JP': 'JavaScript スクリプト', + 'title.ru-RU': 'JavaScript скрипт', subTitle: '@nocobase/plugin-workflow-javascript', link: '/handbook/workflow-javascript', }, @@ -3014,6 +3429,7 @@ export default [ 'title.zh-CN': 'JSON 计算', 'title.ja-JP': 'JSON 計算', 'title.fr-FR': 'Requête JSON', + 'title.ru-RU': 'JSON расчет', subTitle: '@nocobase/plugin-workflow-json-query', link: '/handbook/workflow-json-query', }, @@ -3021,6 +3437,7 @@ export default [ title: 'JSON Variable Mapping', 'title.zh-CN': 'JSON 变量映射', 'title.ja-JP': 'JSON 変数映射', + 'title.ru-RU': 'JSON переменная карта', subTitle: '@nocobase/plugin-workflow-json-variable-mapping', link: '/handbook/workflow-json-variable-mapping', }, @@ -3029,6 +3446,7 @@ export default [ 'title.fr-FR': 'Boucle', 'title.zh-CN': '循环', 'title.ja-JP': 'ループ', + 'title.ru-RU': 'Цикл', subTitle: '@nocobase/plugin-workflow-loop', link: '/handbook/workflow-loop', }, @@ -3037,30 +3455,35 @@ export default [ 'title.fr-FR': 'Processus manuel', 'title.zh-CN': '人工处理', 'title.ja-JP': '手動処理', + 'title.ru-RU': 'Ручной процесс', subTitle: '@nocobase/plugin-workflow-manual', children: [ { title: 'Overview', 'title.zh-CN': '概述', 'title.ja-JP': '概要', + 'title.ru-RU': 'Обзор', link: '/handbook/workflow-manual', }, { title: 'Node', 'title.zh-CN': '节点', 'title.ja-JP': 'ノード', + 'title.ru-RU': 'Узел', link: '/handbook/workflow-manual/node', }, { title: 'Block', 'title.zh-CN': '区块', 'title.ja-JP': 'ブロック', + 'title.ru-RU': 'Блок', link: '/handbook/workflow-manual/block', }, { title: 'Example', 'title.zh-CN': '示例', 'title.ja-JP': '例', + 'title.ru-RU': 'Пример', link: '/handbook/workflow-manual/example', }, ], @@ -3070,6 +3493,7 @@ export default [ 'title.fr-FR': 'Parallèle', 'title.zh-CN': '并行分支', 'title.ja-JP': '並行分岐', + 'title.ru-RU': 'Параллельный', subTitle: '@nocobase/plugin-workflow-parallel', link: '/handbook/workflow-parallel', }, @@ -3078,6 +3502,7 @@ export default [ 'title.fr-FR': 'Requête HTTP', 'title.zh-CN': 'HTTP 请求', 'title.ja-JP': 'HTTPリクエスト', + 'title.ru-RU': 'HTTP запрос', subTitle: '@nocobase/plugin-workflow-request', link: '/handbook/workflow-request', }, @@ -3086,6 +3511,7 @@ export default [ 'title.fr-FR': 'Déclencheur avant Action', 'title.zh-CN': '操作前事件', 'title.ja-JP': 'アクション前トリガー', + 'title.ru-RU': 'Событие перед действием', subTitle: '@nocobase/plugin-workflow-request-interceptor', link: '/handbook/workflow-request-interceptor', children: [ @@ -3093,36 +3519,42 @@ export default [ title: 'Overview', 'title.zh-CN': '概述', 'title.ja-JP': '概要', + 'title.ru-RU': 'Обзор', link: '/handbook/workflow-request-interceptor', }, { title: 'Trigger', 'title.zh-CN': '触发器', 'title.ja-JP': 'トリガー', + 'title.ru-RU': 'Триггер', link: '/handbook/workflow-request-interceptor/trigger', }, { title: 'Action', 'title.zh-CN': '操作', 'title.ja-JP': 'アクション', + 'title.ru-RU': 'Действие', link: '/handbook/workflow-request-interceptor/action', }, { title: 'Advanced', 'title.zh-CN': '高级', 'title.ja-JP': '高度', + 'title.ru-RU': 'Расширенный', link: '/handbook/workflow-request-interceptor/advanced', }, { title: 'Example', 'title.zh-CN': '示例', 'title.ja-JP': '例', + 'title.ru-RU': 'Пример', link: '/handbook/workflow-request-interceptor/example', }, { title: 'HTTP API', 'title.zh-CN': 'HTTP API', 'title.ja-JP': 'HTTP API', + 'title.ru-RU': 'HTTP API', link: '/handbook/workflow-request-interceptor/http-api', }, ], @@ -3132,6 +3564,7 @@ export default [ 'title.fr-FR': 'Message de réponse', 'title.zh-CN': '响应消息', 'title.ja-JP': 'レスポンスメッセージ', + 'title.ru-RU': 'Сообщение ответа', subTitle: '@nocobase/plugin-workflow-response-message', link: '/handbook/workflow-response-message', }, @@ -3140,6 +3573,7 @@ export default [ 'title.fr-FR': 'Action SQL', 'title.zh-CN': 'SQL 操作', 'title.ja-JP': 'SQLアクション', + 'title.ru-RU': 'SQL действие', subTitle: '@nocobase/plugin-workflow-sql', link: '/handbook/workflow-sql', }, @@ -3147,6 +3581,7 @@ export default [ title: 'Sub-flow', 'title.zh-CN': '子流程', 'title.ja-JP': '子流程', + 'title.ru-RU': 'Подпроцесс', subTitle: '@nocobase/plugin-workflow-subflow', link: '/handbook/workflow-subflow', }, @@ -3155,6 +3590,7 @@ export default [ 'title.fr-FR': 'Variable', 'title.zh-CN': '变量', 'title.ja-JP': '変数', + 'title.ru-RU': 'Переменная', subTitle: '@nocobase/plugin-workflow-variable', link: '/handbook/workflow-variable', }, @@ -3163,6 +3599,7 @@ export default [ 'title.fr-FR': 'Déclencheur Webhook', 'title.zh-CN': 'Webhook 触发器', 'title.ja-JP': 'Webhook トリガー', + 'title.ru-RU': 'Событие Webhook', subTitle: '@nocobase/plugin-workflow-webhook', link: '/handbook/workflow-webhook', }, @@ -3175,6 +3612,7 @@ export default [ 'title.fr-FR': 'Gestion du système', 'title.zh-CN': '系统管理', 'title.ja-JP': 'システム管理', + 'title.ru-RU': 'Системное управление', type: 'group', children: [ { @@ -3182,6 +3620,7 @@ export default [ 'title.fr-FR': 'Gestionnaire de plugins', 'title.zh-CN': '插件管理', 'title.ja-JP': 'プラグイン管理', + 'title.ru-RU': 'Управление плагинами', link: '/handbook/plugin-manager', }, { @@ -3189,6 +3628,7 @@ export default [ 'title.fr-FR': 'Paramètrage système', 'title.zh-CN': '系统设置', 'title.ja-JP': 'システム設定', + 'title.ru-RU': 'Системные настройки', // subTitle: '@nocobase/plugin-system-settings', link: '/handbook/system-settings', }, @@ -3197,6 +3637,7 @@ export default [ 'title.fr-FR': 'Langues', 'title.zh-CN': '语言设置', 'title.ja-JP': '言語設定', + 'title.ru-RU': 'Языковые настройки', // subTitle: '@nocobase/plugin-system-settings', link: '/handbook/system-settings/language-settings', }, @@ -3205,6 +3646,7 @@ export default [ 'title.fr-FR': 'Editeur de thèmes', 'title.zh-CN': '主题编辑器', 'title.ja-JP': 'テーマエディタ', + 'title.ru-RU': 'Редактор тем', // subTitle: '@nocobase/plugin-theme-editor', link: '/handbook/theme-editor', }, @@ -3213,6 +3655,7 @@ export default [ 'title.fr-FR': 'Localisation', 'title.zh-CN': '本地化管理', 'title.ja-JP': 'ローカリゼーション管理', + 'title.ru-RU': 'Локализация', // subTitle: '@nocobase/plugin-localization-management', link: '/handbook/localization-management', }, @@ -3221,6 +3664,7 @@ export default [ 'title.zh-CN': '变量和密钥', 'title.ja-JP': '変数と秘密', 'title.fr-FR': 'Variables and secrets', + 'title.ru-RU': 'Переменные и секреты', // subTitle: '@nocobase/plugin-backups', link: '/handbook/environment-variables', }, @@ -3229,6 +3673,7 @@ export default [ 'title.fr-FR': 'Gestionnaire de sauvegardes', 'title.zh-CN': '备份管理器', 'title.ja-JP': 'バックアップマネージャー', + 'title.ru-RU': 'Менеджер резервных копий', // subTitle: '@nocobase/plugin-backups', link: '/handbook/backups', }, @@ -3236,6 +3681,7 @@ export default [ title: 'Migration manager', 'title.zh-CN': '迁移管理', 'title.ja-JP': '迁移管理', + 'title.ru-RU': 'Миграция менеджер', // subTitle: '@nocobase/plugin-backups', link: '/handbook/migration-manager', }, @@ -3243,6 +3689,7 @@ export default [ title: 'Release management', 'title.zh-CN': '发布管理', 'title.ja-JP': '发布管理', + 'title.ru-RU': 'Менеджер выпуска', // subTitle: '@nocobase/plugin-backups', link: '/handbook/release-management', }, @@ -3251,6 +3698,7 @@ export default [ { title: 'AI integration', 'title.zh-CN': 'AI 集成', + 'title.ru-RU': 'AI интеграция', type: 'group', children: [ // { @@ -3261,29 +3709,35 @@ export default [ { title: 'LLM service management', 'title.zh-CN': 'LLM 服务管理', + 'title.ru-RU': 'LLM сервис менеджер', link: '/handbook/ai/service', }, { title: 'Workflow', 'title.zh-CN': '工作流', + 'title.ru-RU': 'Workflow', children: [ { title: 'LLM node', 'title.zh-CN': 'LLM 节点', + 'title.ru-RU': 'LLM узел', children: [ { title: 'Text chat', 'title.zh-CN': '文本对话', + 'title.ru-RU': 'Текстовый чат', link: '/handbook/ai/workflow/nodes/llm/chat', }, { title: 'Multimodal Chat', 'title.zh-CN': '多模态对话', + 'title.ru-RU': 'Мультимодальный чат', link: '/handbook/ai-ee/workflow/nodes/llm/multimodal-chat', }, { title: 'Structured output', 'title.zh-CN': '结构化输出', + 'title.ru-RU': 'Структурированный вывод', link: '/handbook/ai-ee/workflow/nodes/llm/structured-output', }, ], @@ -3296,42 +3750,49 @@ export default [ title: 'Security', 'title.zh-CN': '安全性', 'title.ja-JP': 'あんぜんせい', + 'title.ru-RU': 'Безопасность', type: 'group', children: [ { title: 'Security guide', 'title.zh-CN': '安全指南', 'title.ja-JP': 'あんぜんガイドライン', + 'title.ru-RU': 'Безопасность', link: '/handbook/security', }, { title: 'Token policy', 'title.zh-CN': 'Token 策略', 'title.ja-JP': 'トークンポリシー', + 'title.ru-RU': 'Политика токена', link: '/handbook/token-policy', }, { title: 'Password policy', 'title.zh-CN': '密码策略', 'title.ja-JP': 'パスワードポリシー', + 'title.ru-RU': 'Политика пароля', link: '/handbook/password-policy', }, { title: 'User lockout', 'title.zh-CN': '用户锁定', 'title.ja-JP': 'ユーザーロック', + 'title.ru-RU': 'Блокировка пользователя', link: '/handbook/password-policy/user-lockout', }, { title: 'IP restriction', 'title.zh-CN': 'IP 限制', 'title.ja-JP': 'IP restriction', + 'title.ru-RU': 'Ограничение IP', link: '/handbook/IP-restriction', }, { title: 'Audit logs', 'title.zh-CN': '审计日志', 'title.ja-JP': '审计日志', + 'title.ru-RU': 'Журнал аудита', link: '/handbook/audit-logger', }, { @@ -3339,6 +3800,7 @@ export default [ 'title.fr-FR': 'Two-factor authentication (2FA)', 'title.zh-CN': '双因素身份认证 (2FA)', 'title.ja-JP': 'Two-factor authentication (2FA)', + 'title.ru-RU': 'Двухфакторная аутентификация (2FA)', link: '/handbook/two-factor-authentication', }, ], @@ -3348,6 +3810,7 @@ export default [ 'title.fr-FR': 'Autres', 'title.zh-CN': '其他', 'title.ja-JP': 'その他', + 'title.ru-RU': 'Другие', type: 'group', children: [ { @@ -3355,6 +3818,7 @@ export default [ 'title.fr-FR': 'Doc API', 'title.zh-CN': 'API 文档', 'title.ja-JP': 'APIドキュメント', + 'title.ru-RU': 'API документ', // subTitle: '@nocobase/plugin-api-doc', link: '/handbook/api-doc', // children: ['/plugins/api-doc'], @@ -3364,6 +3828,7 @@ export default [ 'title.fr-FR': 'Intégration', 'title.zh-CN': '嵌入', 'title.ja-JP': '埋め込み', + 'title.ru-RU': 'Встроенный', link: '/handbook/embed', }, { @@ -3371,6 +3836,7 @@ export default [ 'title.fr-FR': 'Personnaliser la marque', 'title.zh-CN': '自定义品牌', 'title.ja-JP': 'カスタムブランド', + 'title.ru-RU': 'Брендирование', link: '/handbook/custom-brand', }, { @@ -3378,6 +3844,7 @@ export default [ 'title.fr-FR': 'Formulaire public', 'title.zh-CN': '公开表单', 'title.ja-JP': '公开表单', + 'title.ru-RU': 'Публичный формат', link: '/handbook/public-forms', }, { @@ -3385,6 +3852,7 @@ export default [ 'title.fr-FR': 'Filtre à mots-clés multiples', 'title.zh-CN': '多关键词筛选', 'title.ja-JP': 'マルチキーワードフィルター', + 'title.ru-RU': 'Многоключевой фильтр', link: '/handbook/multi-keyword-filter', }, ], diff --git a/docs/config/manual.ts b/docs/config/manual.ts index 211c6dc76f..032b490da1 100644 --- a/docs/config/manual.ts +++ b/docs/config/manual.ts @@ -4,6 +4,7 @@ export default [ title: 'Quick Start', 'title.zh-CN': '快速上手', 'title.ja-JP': 'クイックスタート', + 'title.ru-RU': 'Быстрый старт', type: 'group', children: [ '/manual/quick-start/the-first-app', @@ -15,6 +16,7 @@ export default [ title: '功能导航', 'title.zh-CN': '功能导航', 'title.ja-JP': '機能ナビゲーション', + 'title.ru-RU': 'Навигация', type: 'group', children: [ { diff --git a/docs/config/nav.ts b/docs/config/nav.ts index b8414e27d3..bfb97b5292 100644 --- a/docs/config/nav.ts +++ b/docs/config/nav.ts @@ -4,6 +4,7 @@ export default [ 'title.fr-FR': 'Bienvenue', 'title.zh-CN': '欢迎', 'title.ja-JP': 'ようこそ', + 'title.ru-RU': 'Добро пожаловать', link: '/welcome/introduction', }, { @@ -11,6 +12,7 @@ export default [ 'title.fr-FR': 'Manuel', 'title.zh-CN': '使用手册', 'title.ja-JP': 'ハンドブック', + 'title.ru-RU': 'Руководство', link: '/handbook', }, { @@ -18,6 +20,7 @@ export default [ 'title.fr-FR': 'Développement de plugin', 'title.zh-CN': '插件开发', 'title.ja-JP': 'プラグイン開発', + 'title.ru-RU': 'Разработка плагинов', link: '/development', }, { @@ -25,6 +28,7 @@ export default [ 'title.fr-FR': 'Exemples de plugin', 'title.zh-CN': '插件示例', 'title.ja-JP': 'プラグインサンプル', + 'title.ru-RU': 'Пример плагина', link: '/plugin-samples' }, { @@ -32,6 +36,7 @@ export default [ 'title.fr-FR': 'Référence API', 'title.zh-CN': 'API 参考', 'title.ja-JP': 'API リファレンス', + 'title.ru-RU': 'Документация API', link: '/api', }, { @@ -39,9 +44,11 @@ export default [ 'title.fr-FR': 'Accueil Nocobase', 'title.zh-CN': 'NocoBase 首页', 'title.ja-JP': 'NocoBase ホーム', + 'title.ru-RU': 'NocoBase Россия', link: 'https://www.nocobase.com', 'link.fr-FR': 'https://www.nocobase.com/fr/', 'link.zh-CN': 'https://www.nocobase.com/cn/', 'link.ja-JP': 'https://www.nocobase.com/ja/', + 'link.ru-RU': 'https://www.nocobase.com/ru/', }, ] diff --git a/docs/config/welcome.ts b/docs/config/welcome.ts index 038fe62be8..adf2358090 100644 --- a/docs/config/welcome.ts +++ b/docs/config/welcome.ts @@ -4,6 +4,7 @@ export default [ 'title.fr-FR': 'Bienvenue', 'title.zh-CN': '欢迎', 'title.ja-JP': 'ようこそ', + 'title.ru-RU': 'Добро пожаловать', type: 'group', children: [ '/welcome/introduction', @@ -18,6 +19,7 @@ export default [ 'title.fr-FR': 'Démarrer', 'title.zh-CN': '快速开始', 'title.ja-JP': '始めに', + 'title.ru-RU': 'Начиная', type: 'group', children: [ { @@ -25,12 +27,16 @@ export default [ 'title.fr-FR': 'Installation', 'title.zh-CN': '安装', 'title.ja-JP': 'インストール', + 'title.ru-RU': 'Установка', children: [ '/welcome/getting-started/installation', '/welcome/getting-started/installation/docker-compose', '/welcome/getting-started/installation/create-nocobase-app', '/welcome/getting-started/installation/git-clone', // '/welcome/getting-started/installation/install-plugin', + ...(process.env.DOC_LANG === 'ru-RU' + ? ['/welcome/getting-started/installation/timeweb'] + : []), ], }, { @@ -38,6 +44,7 @@ export default [ 'title.fr-FR': 'Upgrading', 'title.zh-CN': '升级', 'title.ja-JP': 'アップグレード', + 'title.ru-RU': 'Обновление', children: [ '/welcome/getting-started/upgrading', '/welcome/getting-started/upgrading/docker-compose', @@ -50,6 +57,7 @@ export default [ 'title.fr-FR': 'Déploiement', 'title.zh-CN': '部署', 'title.ja-JP': 'デプロイ', + 'title.ru-RU': 'Развертывание', children: [ '/welcome/getting-started/deployment', '/welcome/getting-started/deployment/docker-compose', @@ -76,6 +84,7 @@ export default [ title: 'How to deploy faster', 'title.zh-CN': '如何部署才更快', 'title.ja-JP': 'デプロイの最適化', + 'title.ru-RU': 'Быстрая установка', link: 'https://www.nocobase.com/en/tutorials/how-to-deploy-nocobase-faster', 'link.zh-CN': 'https://www.nocobase.com/cn/tutorials/how-to-deploy-nocobase-faster', 'link.ja-JP': 'https://www.nocobase.com/ja/tutorials/how-to-deploy-nocobase-faster', @@ -142,6 +151,7 @@ export default [ 'title.fr-FR': 'Communauté', 'title.zh-CN': '社区', 'title.ja-JP': 'コミュニティ', + 'title.ru-RU': 'Сообщество', type: 'group', children: [ '/welcome/community/contributing', diff --git a/docs/ru-RU/_partials/commercial-installation.md b/docs/ru-RU/_partials/commercial-installation.md new file mode 100644 index 0000000000..4e45a79fd2 --- /dev/null +++ b/docs/ru-RU/_partials/commercial-installation.md @@ -0,0 +1,5 @@ +## Установка + +Этот плагин является коммерческим, его необходимо загрузить и активировать через менеджер плагинов: + +![](https://static-docs.nocobase.com/20240323162741.png) diff --git a/docs/ru-RU/api/acl/acl.md b/docs/ru-RU/api/acl/acl.md new file mode 100644 index 0000000000..e570c24614 --- /dev/null +++ b/docs/ru-RU/api/acl/acl.md @@ -0,0 +1,145 @@ +# ACL (Управление доступом) + +## Обзор + +`ACL` - это модуль управления правами доступа в NocoBase, отвечающий за: + +- Управление ролями пользователей +- Регистрацию и назначение разрешений +- Оценку политик доступа и контроль + +### Основные понятия + +- **Ресурс (Resource)**: Коллекции или кастомные ресурсы. См. [`@nocobase/resourcer`](../resourcer/resource-manager.md) +- **Действие (Action)**: Операции с ресурсом (создание, чтение, обновление, удаление и др.) +- **Стратегия (Strategy)**: Глобальные настройки прав для ролей +- **Сниппет (Snippet)**: Набор операций для централизованного управления правами + +## Методы класса + +### `define()` - Определение роли + +```typescript +define(options: DefineOptions): ACLRole +``` + +**Параметры:** +```typescript +interface DefineOptions { + role: string; // Уникальный идентификатор роли + strategy?: string | AvailableStrategyOptions; // Глобальная стратегия + actions?: ResourceActionsOptions; // Настройки прав для действий + snippets?: string[]; // Сниппеты доступа +} +``` + +### `can()` - Проверка прав + +```typescript +can(options: CanArgs): CanResult | null +``` + +**Пример:** +```typescript +const result = acl.can({ + role: 'admin', + resource: 'users', + action: 'delete' +}); +``` + +### `registerSnippet()` - Регистрация сниппета + +```typescript +registerSnippet(snippet: SnippetOptions) +``` + +**Пример:** +```typescript +acl.registerSnippet({ + name: 'content.*', + actions: ['posts:create', 'posts:update'] +}); +``` + +### `setAvailableAction()` - Настройка допустимых действий + +```typescript +setAvailableAction(name: string, options: AvailableActionOptions) +``` + +### `setAvailableStrategy()` - Настройка стратегий + +```typescript +setAvailableStrategy(name: string, options: AvailableStrategyOptions) +``` + +### `allow()` - Разрешение операций + +```typescript +allow(resourceName: string, actionNames: string[] | string, condition?: string | ConditionFunc) +``` + +**Примеры:** +```typescript +// Публичный доступ +acl.allow('posts', 'read', 'public'); + +// Только для авторизованных +acl.allow('users', 'update', 'loggedIn'); +``` + +### `addFixedParams()` - Добавление параметров + +```typescript +addFixedParams(resource: string, action: string, merger: Merger) +``` + +### Middleware + +```typescript +// Добавление middleware +acl.use(async (ctx, next) => { + // Логика проверки прав + await next(); +}); + +// Стандартное middleware ACL +acl.middleware(); +``` + +## Практическое применение + +1. **Создание роли администратора:** +```typescript +acl.define({ + role: 'admin', + strategy: { + allowConfigure: true, + resource: '*' + } +}); +``` + +2. **Ограничение доступа:** +```typescript +acl.define({ + role: 'author', + actions: { + 'posts:create': { own: true }, + 'posts:update': { + own: true, + fields: ['title', 'content'] + } + } +}); +``` + +3. **Кастомная проверка:** +```typescript +acl.allow('orders', 'cancel', async (ctx) => { + return ctx.state.currentUser.isManager; +}); +``` + +Система ACL в NocoBase предоставляет гибкий механизм для реализации сложных сценариев контроля доступа с возможностью тонкой настройки под конкретные бизнес-требования. diff --git a/docs/ru-RU/api/actions.md b/docs/ru-RU/api/actions.md new file mode 100644 index 0000000000..96c092e947 --- /dev/null +++ b/docs/ru-RU/api/actions.md @@ -0,0 +1,239 @@ +# @nocobase/actions + +## Обзор + +Пакет `@nocobase/actions` инкапсулирует часто используемые CRUD-методы. При регистрации в [ResourceManager](./resourcer/resource-manager) автоматически добавляет CRUD-интерфейсы к системным ресурсам. + +### Базовое использование + +```typescript +import * as actions from `@nocobase/actions`; + +const resourceManager = new ResourceManager({ + // ...опции +}); + +resourceManager.registerActionHandlers(actions); +``` + +## Методы действий + +### create + +Создает ресурс. `POST /api/<ресурс>:create`. + +```shell +curl "http://localhost:13000/api/users:create" \ + -X POST \ + -H "Content-Type: application/json" \ + -d '{"username": "admin"}' +``` + +#### Тело запроса + +| Параметр | Тип | Описание | +|----------------|------|--------------------------------------------| +| `[key: string]`| `any`| Пары ключ-значение полей ресурса | + +### list + +Получает список ресурсов. `GET /api/<ресурс>:list`. + +```shell +curl -X GET http://localhost:13000/api/users:list +``` + +#### Параметры + +| Параметр | Тип | Описание | По умолчанию | +|-----------|-----------|----------------------------------------------------------------|--------------| +| `filter` | `Filter` | Параметры фильтрации, см. [Операторы фильтрации](./database/operators) | - | +| `fields` | `string[]`| Получаемые поля | - | +| `except` | `string[]`| Исключаемые поля | - | +| `appends` | `string[]`| Добавляемые связанные поля | - | +| `sort` | `string[]`| Параметры сортировки | - | +| `paginate`| `boolean` | Использовать ли пагинацию | `true` | +| `page` | `number` | Номер текущей страницы | `1` | +| `pageSize`| `number` | Количество элементов на странице | `20` | + +### get + +Получает конкретный ресурс. `GET /api/<ресурс>:get`. + +```shell +curl -X GET http://localhost:13000/api/users:get?filterByTk=1 +``` + +#### Параметры + +| Параметр | Тип | Описание | +|-------------|-------------------|----------------------------------------------------------------| +| `filterByTk`| `number \| string`| Фильтрация по первичному ключу | +| `filter` | `Filter` | Параметры фильтрации, см. [Операторы фильтрации](./database/operators) | +| `fields` | `string[]` | Получаемые поля | +| `except` | `string[]` | Исключаемые поля | +| `appends` | `string[]` | Добавляемые связанные поля | + +### update + +Обновляет один или несколько ресурсов. `PUT /api/<ресурс>:update`. + +```shell +curl "http://localhost:13000/api/users:update?filterByTk=1" \ + -X PUT \ + -H "Content-Type: application/json" \ + -d '{"username": "admin"}' +``` + +#### Параметры + +| Параметр | Тип | Описание | +|-------------|-------------------|----------------------------------------------------------------| +| `filter` | `Filter` | Параметры фильтрации, см. [Операторы фильтрации](./database/operators) | +| `filterByTk`| `number \| string`| Фильтрация по первичному ключу | + +*Примечание: Должен быть указан хотя бы один из параметров `filter` или `filterByTk`.* + +#### Тело запроса + +| Параметр | Тип | Описание | +|----------------|------|--------------------------------------------| +| `[key: string]`| `any`| Пары ключ-значение полей ресурса | + +### destroy + +Удаляет один или несколько ресурсов. `DELETE /api/<ресурс>:destroy`. + +```shell +curl -X DELETE http://localhost:13000/api/users:destroy?filterByTk=1 +``` + +#### Параметры + +| Параметр | Тип | Описание | +|-------------|-------------------|----------------------------------------------------------------| +| `filter` | `Filter` | Параметры фильтрации, см. [Операторы фильтрации](./database/operators) | +| `filterByTk`| `number \| string`| Фильтрация по первичному ключу | + +*Примечание: Должен быть указан хотя бы один из параметров `filter` или `filterByTk`.* + +### firstOrCreate + +Получает или создает ресурс. `POST /api/<ресурс>:firstOrCreate`. + +```shell +curl "http://localhost:13000/api/users:firstOrCreate?filterKeys[]=username" \ + -X POST \ + -H "Content-Type: application/json" \ + -d '{"username": "admin", "nickname": "Admin"}' +``` + +#### Параметры + +| Параметр | Тип | Описание | +|-------------|-----------|---------------------------------------------------------| +| `filterKeys`| `string[]`| Поля в теле запроса для поиска существующих ресурсов | + +#### Тело запроса + +| Параметр | Тип | Описание | +|----------------|------|--------------------------------------------| +| `[key: string]`| `any`| Пары ключ-значение полей ресурса | + +### updateOrCreate + +Обновляет или создает ресурс. `POST /api/<ресурс>:updateOrCreate`. + +```shell +curl "http://localhost:13000/api/users:updateOrCreate?filterKeys[]=username" \ + -X POST \ + -H "Content-Type: application/json" \ + -d '{"username": "admin", "nickname": "Admin"}' +``` + +#### Параметры + +| Параметр | Тип | Описание | +|-------------|-----------|---------------------------------------------------------| +| `filterKeys`| `string[]`| Поля в теле запроса для поиска существующих ресурсов | + +#### Тело запроса + +| Параметр | Тип | Описание | +|----------------|------|--------------------------------------------| +| `[key: string]`| `any`| Пары ключ-значение полей ресурса | + +### move + +Перемещает ресурсы, изменяя порядок. Обычно используется для сортировки перетаскиванием на страницах. `POST /api/<ресурс>:move`. + +```shell +curl -X POST "http://localhost:13000/api/users:move?sourceId=1&targetId=2" +``` + +#### Параметры + +| Параметр | Тип | Описание | По умолчанию | +|--------------|---------------------------|----------------------------------------------------------|--------------| +| `sourceId` | `targetKey` | ID элемента для перемещения | - | +| `targetId` | `targetKey` | ID элемента для обмена позициями | - | +| `sortField` | `string` | Название поля, где хранится сортировка | `sort` | +| `targetScope`| `string` | Область сортировки (ресурс может сортироваться по разным областям) | - | +| `sticky` | `boolean` | Закреплять ли перемещаемый элемент | - | +| `method` | `insertAfter` \| `prepend`| Метод вставки: вставить после или перед | - | + +### set + +Устанавливает ассоциированные объекты для ресурса. `POST /api/<ресурс>/<ключ_ресурса>/<ассоциация>:set`. + +```shell +curl "http://localhost:13000/api/users/1/roles:set" \ + -X POST \ + -H "Content-Type: application/json" \ + -d '["admin", "member"]' +``` + +#### Тело запроса + +- `TargetKey | TargetKey[]` - Массив первичных ключей ассоциированных объектов. + +### add + +Добавляет ассоциированные объекты к ресурсу. `POST /api/<ресурс>/<ключ_ресурса>/<ассоциация>:add`. + +```shell +curl "http://localhost:13000/api/users/1/roles:add" \ + -X POST \ + -H "Content-Type: application/json" \ + -d '["admin"]' +``` + +#### Тело запроса + +- `TargetKey | TargetKey[]` - Массив первичных ключей ассоциированных объектов. + +### remove + +Удаляет ассоциированные объекты из ресурса. `POST /api/<ресурс>/<ключ_ресурса>/<ассоциация>:remove`. + +```shell +curl "http://localhost:13000/api/users/1/roles:remove" \ + -X POST \ + -H "Content-Type: application/json" \ + -d '["admin"]' +``` + +#### Тело запроса + +- `TargetKey | TargetKey[]` - Массив первичных ключей ассоциированных объектов. + +### toggle + +Переключает ассоциированные объекты для ресурса - добавляет, если их нет, или удаляет, если они есть. `POST /api/<ресурс>/<ключ_ресурса>/<ассоциация>:toggle`. + +```shell +curl "http://localhost:13000/api/users/1/roles:toggle" \ + -X POST \ + -H "Content-Type: application/json" \ + -d '["admin", "member"]' +``` diff --git a/docs/ru-RU/api/auth/auth-manager.md b/docs/ru-RU/api/auth/auth-manager.md new file mode 100644 index 0000000000..79b416b938 --- /dev/null +++ b/docs/ru-RU/api/auth/auth-manager.md @@ -0,0 +1,175 @@ +# AuthManager + +## Обзор + +`AuthManager` — это модуль управления аутентификацией пользователей в NocoBase, предназначенный для регистрации различных типов аутентификации. + +### Базовое использование + +```ts +const authManager = new AuthManager({ + // Ключ для получения идентификатора текущего аутентификатора из заголовка запроса + authKey: 'X-Authenticator', +}); + +// Установка методов для хранения и получения аутентификаторов в AuthManager +authManager.setStorer({ + get: async (name: string) => { + return db.getRepository('authenticators').find({ filter: { name } }); + }, +}); + +// Регистрация типа аутентификации +authManager.registerTypes('basic', { + auth: BasicAuth, + title: 'Пароль', +}); + +// Использование middleware аутентификации +app.resourceManager.use(authManager.middleware()); +``` + +### Основные понятия + +- **Тип аутентификации (`AuthType`)**: различные способы аутентификации, например: по паролю, по SMS, OIDC, SAML и т.д. +- **Аутентификатор (Authenticator)**: сущность, хранящаяся в базе данных, связанная с конфигурацией определённого типа аутентификации (`AuthType`). Для одного типа может существовать несколько аутентификаторов, каждый из которых предоставляет отдельную схему аутентификации. +- **Имя аутентификатора**: уникальный идентификатор аутентификатора, используемый для определения того, какая аутентификация применяется в текущем запросе. + +## Методы класса + +### `constructor()` + +Конструктор, создающий экземпляр `AuthManager`. + +#### Сигнатура + +- `constructor(options: AuthManagerOptions)` + +#### Типы + +```ts +export interface JwtOptions { + secret: string; + expiresIn?: string; +} + +export type AuthManagerOptions = { + authKey: string; + default?: string; + jwt?: JwtOptions; +}; +``` + +#### Подробности + +##### AuthManagerOptions + +| Атрибут | Тип | Описание | По умолчанию | +|----------|----------------------------|--------------------------------------------------------------------------|--------------------| +| `authKey`| `string` | Опциональный ключ для хранения идентификатора аутентификатора в заголовке запроса | `X-Authenticator` | +| `default`| `string` | Опционально, идентификатор аутентификатора по умолчанию | `basic` | +| `jwt` | [`JwtOptions`](#jwtoptions)| Опционально, настройка JWT для аутентификации | — | + +##### JwtOptions + +| Атрибут | Тип | Описание | По умолчанию | +|------------|--------|------------------------------|-------------| +| `secret` | `string` | Секретный ключ токена | `X-Authenticator` | +| `expiresIn`| `string` | Опционально, срок действия токена | `7d` | + +### `setStorer()` + +Устанавливает методы для хранения и получения данных аутентификаторов. + +#### Сигнатура + +- `setStorer(storer: Storer)` + +#### Типы + +```ts +export interface Authenticator = { + authType: string; + options: Record; + [key: string]: any; +}; + +export interface Storer { + get: (name: string) => Promise; +} +``` + +#### Подробности + +##### Authenticator + +| Атрибут | Тип | Описание | +|-----------|----------------------|-----------------------------------| +| `authType`| `string` | Тип аутентификации | +| `options` | `Record`| Конфигурационные параметры аутентификатора | + +##### Storer + +`Storer` — интерфейс для хранения аутентификаторов, содержит один метод: + +- `get(name: string): Promise` — получение аутентификатора по его идентификатору. В NocoBase фактически возвращаемый тип — это [AuthModel](../../handbook/auth/dev/api#authmodel). + +### `registerTypes()` + +Регистрирует новый тип аутентификации. + +#### Сигнатура + +- `registerTypes(authType: string, authConfig: AuthConfig)` + +#### Типы + +```ts +export type AuthExtend = new (config: Config) => T; + +type AuthConfig = { + auth: AuthExtend; // Класс аутентификации. + title?: string; // Отображаемое имя типа аутентификации. +}; +``` + +#### Подробности + +| Атрибут | Тип | Описание | +|--------|-------------------|-------------------------------------------------------------------| +| `auth` | `AuthExtend`| Реализация типа аутентификации, см. [Auth](./auth.md) | +| `title`| `string` | Опционально. Название типа аутентификации, отображаемое в интерфейсе | + +### `listTypes()` + +Возвращает список зарегистрированных типов аутентификации. + +#### Сигнатура + +- `listTypes(): { name: string; title: string }[]` + +#### Подробности + +| Атрибут | Тип | Описание | +|--------|--------|---------------------------------| +| `name` | `string`| Идентификатор типа аутентификации| +| `title`| `string`| Название типа аутентификации | + +### `get()` + +Получает аутентификатор по имени. + +#### Сигнатура + +- `get(name: string, ctx: Context)` + +#### Подробности + +| Атрибут | Тип | Описание | +|--------|---------|------------------------| +| `name` | `string`| Идентификатор аутентификатора | +| `ctx` | `Context`| Контекст запроса | + +### `middleware()` + +Middleware аутентификации. Получает текущий аутентификатор и выполняет аутентификацию пользователя. diff --git a/docs/ru-RU/api/auth/auth.md b/docs/ru-RU/api/auth/auth.md new file mode 100644 index 0000000000..8d93891399 --- /dev/null +++ b/docs/ru-RU/api/auth/auth.md @@ -0,0 +1,115 @@ +# Аутентификация (Auth) + +## Обзор + +`Auth` - это абстрактный класс для типов аутентификации пользователей, определяющий интерфейсы, необходимые для завершения процесса аутентификации. Для добавления новых типов аутентификации необходимо наследоваться от класса `Auth` и реализовать его методы. Базовую реализацию можно посмотреть в [BaseAuth](./base-auth.md). + +```ts +interface IAuth { + user: Model; + // Проверка статуса аутентификации и возврат текущего пользователя + check(): Promise; + signIn(): Promise; + signUp(): Promise; + signOut(): Promise; +} + +export abstract class Auth implements IAuth { + abstract user: Model; + abstract check(): Promise; + // ... +} + +class CustomAuth extends Auth { + // check: Аутентификация + async check() { + // ... + } +} +``` + +## Свойства экземпляра + +### `user` + +Информация об аутентифицированном пользователе. + +#### Сигнатура + +- `abstract user: Model` + +## Методы класса + +### `constructor()` + +Конструктор, создает экземпляр `Auth`. + +#### Сигнатура + +- `constructor(config: AuthConfig)` + +#### Типы + +```ts +export type AuthConfig = { + authenticator: Authenticator; + options: { + [key: string]: any; + }; + ctx: Context; +}; +``` + +#### Детали + +##### AuthConfig + +| Атрибут | Тип | Описание | +| -------------- | ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------- | +| `authenticator` | [`Authenticator`](./auth-manager#authenticator) | Модель аутентификатора, фактический тип в приложениях NocoBase - [AuthModel](../../handbook/auth/dev/api.md#authmodel) | +| `options` | `Record` | Конфигурации, связанные с аутентификатором | +| `ctx` | `Context` | Контекст запроса | + +### `check()` + +Аутентификация пользователя, возвращает информацию о пользователе. Это абстрактный метод, который должны реализовывать все типы аутентификации. + +#### Сигнатура + +- `abstract check(): Promise` + +### `signIn()` + +Вход пользователя в систему. + +#### Сигнатура + +- `signIn(): Promise` + +### `signUp()` + +Регистрация пользователя. + +#### Сигнатура + +- `signUp(): Promise` + +### `signOut()` + +Выход пользователя из системы. + +#### Сигнатура + +- `signOut(): Promise` + +## Дополнительная информация + +Для реализации кастомной аутентификации: + +1. Создайте класс, наследующийся от `Auth` +2. Реализуйте обязательные методы (`check`, `signIn` и др.) +3. Зарегистрируйте ваш аутентификатор в системе NocoBase + +Пример базовой реализации можно найти в документации по [BaseAuth](./base-auth.md). + +Все методы возвращают Promise, что позволяет реализовывать асинхронные операции аутентификации (например, проверку через внешние API). diff --git a/docs/ru-RU/api/auth/base-auth.md b/docs/ru-RU/api/auth/base-auth.md new file mode 100644 index 0000000000..7034946427 --- /dev/null +++ b/docs/ru-RU/api/auth/base-auth.md @@ -0,0 +1,70 @@ +# BaseAuth + +## Обзор + +`BaseAuth` наследуется от абстрактного класса [Auth](./auth.md) и служит базовой реализацией типов аутентификации пользователей, используя JWT в качестве метода аутентификации. В большинстве случаев расширение типов аутентификации можно реализовать путём наследования от `BaseAuth`, а не прямого наследования от абстрактного класса `Auth`. + +```ts +class BasicAuth extends BaseAuth { + constructor(config: AuthConfig) { + // Устанавливаем коллекцию пользователей + const userCollection = config.ctx.db.getCollection('users'); + super({ ...config, userCollection }); + } + + // Логика аутентификации пользователя, вызывается через `auth.signIn` + // Возвращает данные пользователя + async validate() { + const ctx = this.ctx; + const { values } = ctx.action.params; + // ... + return user; + } +} +``` + +## Методы класса + +### `constructor()` + +Конструктор, создающий экземпляр `BaseAuth`. + +#### Сигнатура + +- `constructor(config: AuthConfig & { userCollection: Collection })` + +#### Подробности + +| Параметр | Тип | Описание | +|------------------|-------------|-----------------------------------------------------------------------------------------------------------| +| `config` | `AuthConfig`| См. [Auth - AuthConfig](./auth.md#authconfig) | +| `userCollection` | `Collection`| Коллекция пользователей, например: `db.getCollection('users')`, см. [База данных - Коллекция](../database/collection) | + +### `user()` + +Геттер и сеттер для получения и установки информации о пользователе. По умолчанию использует объект `ctx.state.currentUser`. + +#### Сигнатура + +- `set user()` +- `get user()` + +### `check()` + +Выполняет аутентификацию по токену из запроса и возвращает данные пользователя. + +### `signIn()` + +Вход пользователя в систему, генерирует токен. + +### `signUp()` + +Регистрация нового пользователя. + +### `signOut()` + +Выход пользователя из системы, приводит к аннулированию токена. + +### `validate()` \* + +Основная логика аутентификации. Вызывается при вызове метода `signIn`, определяет, может ли пользователь успешно войти в систему. diff --git a/docs/ru-RU/api/cache/cache-manager.md b/docs/ru-RU/api/cache/cache-manager.md new file mode 100644 index 0000000000..4e7195d0d8 --- /dev/null +++ b/docs/ru-RU/api/cache/cache-manager.md @@ -0,0 +1,160 @@ +# Менеджер кэширования (CacheManager) + +## Обзор + +CacheManager основан на [node-cache-manager](https://github.com/node-cache-manager/node-cache-manager) и предоставляет систему управления кэшированием для NocoBase. Встроенные типы кэша: + +- **memory**: Использует стандартный lru-cache из node-cache-manager +- **redis**: Поддержка Redis через node-cache-manager-redis-yet + +Дополнительные типы можно расширять и регистрировать через API. + +### Основные понятия + +- **Store (Хранилище)**: Определяет способ кэширования, включая фабричный метод для создания кэшей и другие настройки. Каждое хранилище имеет уникальный идентификатор. + +- **Фабричный метод хранилища**: Методы из node-cache-manager для создания кэшей (например, `memory` или `redisStore`). Соответствует параметру [`StoreOptions`](#storeoptions). + +- **Cache (Кэш)**: Класс NocoBase для работы с кэшем. Каждый экземпляр Cache имеет уникальный ID как пространство имен. + +## Методы класса + +### `constructor()` + +#### Сигнатура +```ts +constructor(options?: CacheManagerOptions) +``` + +#### Типы +```ts +type CacheManagerOptions = { + defaultStore?: string; + stores?: { + [storeType: string]: StoreOptions; + }; +}; + +type StoreOptions = { + store?: 'memory' | FactoryStore; + close?: (store: Store) => Promise; + [key: string]: any; +}; +``` + +#### Параметры + +##### CacheManagerOptions + +| Параметр | Тип | Описание | +|---------------|-------------------------------|-----------------------------------| +| `defaultStore`| `string` | ID хранилища по умолчанию | +| `stores` | `Record`| Регистрация типов хранилищ | + +##### StoreOptions + +| Параметр | Тип | Описание | +|--------------|---------------------------------------|-----------------------------------| +| `store` | `memory` \| `FactoryStore`| Фабричный метод хранилища | +| `close` | `(store: Store) => Promise` | Метод закрытия соединения | +| `[key: string]` | `any` | Доп. настройки хранилища | + +#### Настройки по умолчанию +```ts +{ + defaultStore: 'memory', + stores: { + memory: { + store: 'memory', + max: 2000, + }, + redis: { + store: redisStore, + close: async (redis) => { + await redis.client.quit(); + }, + }, + }, +} +``` + +Пример использования: +```ts +const cacheManager = new CacheManager({ + stores: { + defaultStore: 'redis', + redis: { + url: 'redis://localhost:6379', + }, + }, +}); +``` + +### `registerStore()` + +Регистрация нового хранилища. + +Пример: +```ts +cacheManager.registerStore({ + name: 'redis', + store: redisStore, + close: async (redis) => { + await redis.client.quit(); + }, + url: 'xxx', +}); +``` + +#### Сигнатура +```ts +registerStore(options: { name: string } & StoreOptions) +``` + +### `createCache()` + +Создание экземпляра кэша. + +Пример: +```ts +await cacheManager.createCache({ + name: 'default', + store: 'memory', + prefix: 'mycache', + max: 2000, +}); +``` + +#### Сигнатура +```ts +createCache(options: { + name: string; + prefix?: string; + store?: string; + [key: string]: any; +}): Promise +``` + +#### Параметры + +| Параметр | Тип | Описание | +|----------|----------|-----------------------------------| +| `name` | `string` | Уникальный ID кэша | +| `store` | `string` | ID хранилища (по умолчанию - defaultStore) | +| `prefix` | `string` | Префикс для ключей кэша | +| `[key: string]` | `any` | Доп. настройки хранилища | + +## Использование кэша + +После создания кэша можно использовать методы: +- `get(key)` - получение значения +- `set(key, value, ttl?)` - запись значения +- `del(key)` - удаление значения +- `reset()` - очистка всего кэша + +Пример: +```ts +const cache = await cacheManager.createCache({name: 'myapp'}); +await cache.set('user:1', {name: 'John'}, 3600); +const user = await cache.get('user:1'); +``` diff --git a/docs/ru-RU/api/cache/cache.md b/docs/ru-RU/api/cache/cache.md new file mode 100644 index 0000000000..ec48a551b5 --- /dev/null +++ b/docs/ru-RU/api/cache/cache.md @@ -0,0 +1,60 @@ +# Кэш (Cache) + +## Основные методы + +Вы можете ознакомиться с документацией [node-cache-manager](https://github.com/node-cache-manager/node-cache-manager). + +- `get()` — получить значение по ключу +- `set()` — установить значение по ключу +- `del()` — удалить значение по ключу +- `reset()` — очистить весь кэш +- `wrap()` — получить значение из кэша или выполнить функцию и закэшировать результат +- `mset()` — массовая установка значений (множественная запись) +- `mget()` — массовое получение значений (множественное чтение) +- `mdel()` — массовое удаление значений по ключам +- `keys()` — получить список всех ключей в кэше +- `ttl()` — получить оставшееся время жизни (в миллисекундах) для ключа + +## Другие методы + +### `wrapWithCondition()` + +Аналогичен методу `wrap()`, но позволяет решить, использовать ли кэширование, на основе заданных условий. + +```ts +async wrapWithCondition( + key: string, + fn: () => T | Promise, + options?: { + // Внешний параметр, управляющий использованием кэша + useCache?: boolean; + // Определяет, следует ли кэшировать результат, на основе возвращаемых данных + isCacheable?: (val: unknown) => boolean | Promise; + ttl?: Milliseconds; + }, +): Promise +``` + +### `setValueInObject()` + +Изменяет значение определённого поля в объекте, хранящемся в кэше. + +```ts +async setValueInObject(key: string, objectKey: string, value: unknown) +``` + +### `getValueInObject()` + +Получает значение определённого поля из объекта, хранящегося в кэше. + +```ts +async getValueInObject(key: string, objectKey: string) +``` + +### `delValueInObject()` + +Удаляет определённое поле из объекта, хранящегося в кэше. + +```ts +async delValueInObject(key: string, objectKey: string) +``` diff --git a/docs/ru-RU/api/cli.md b/docs/ru-RU/api/cli.md new file mode 100644 index 0000000000..fb82556734 --- /dev/null +++ b/docs/ru-RU/api/cli.md @@ -0,0 +1,357 @@ +# @nocobase/cli + +CLI NocoBase предназначен для помощи в разработке, сборке и развертывании приложений NocoBase. + + + +CLI NocoBase поддерживает два режима работы: ts-node и node. + +- Режим ts-node (по умолчанию): используется в среде разработки, поддерживает компиляцию в реальном времени, но с относительно медленным откликом. +- Режим node: используется в производственной среде, обеспечивает быстрый отклик, но требует предварительной компиляции всего исходного кода с помощью команды `yarn nocobase build`. + + + +## Инструкция по использованию + +```bash +$ yarn nocobase -h + +Использование: nocobase [команда] [опции] + +Опции: + -h, --help + +Команды: + console + db:auth Проверка успешности подключения к базе данных + db:sync Создание таблиц и полей в базе данных на основе конфигурации коллекций + install Установка приложения + start Запуск приложения в производственной среде + build Компиляция и упаковка приложения + clean Удаление скомпилированных файлов + dev Запуск приложения в режиме разработки с компиляцией в реальном времени + doc Разработка документации + test Тестирование + umi + upgrade Обновление + migrator Миграция данных + pm Менеджер плагинов + help +``` + +## Использование в шаблоне приложения + +Секция `scripts` в файле `package.json` шаблона приложения выглядит следующим образом: + +```json +{ + "scripts": { + "dev": "nocobase dev", + "start": "nocobase start", + "clean": "nocobase clean", + "build": "nocobase build", + "test": "nocobase test", + "pm": "nocobase pm", + "postinstall": "nocobase postinstall" + } +} +``` + +## Расширение командной строки + +CLI NocoBase построен на основе [commander](https://github.com/tj/commander.js). Вы можете свободно добавлять расширенные команды в файл `app/server/index.ts`: + +```ts +const app = new Application(config); + +app.command('hello').action(() => {}); +``` + +или в плагине: + +```ts +class MyPlugin extends Plugin { + beforeLoad() { + this.app.command('hello').action(() => {}); + } +} +``` + +Вызов в терминале: + +```bash +$ yarn nocobase hello +``` + +## Встроенные команды + +Отсортированы по частоте использования. + +### `dev` + +Запускает приложение и компилирует код в реальном времени в режиме разработки. + + +Если NocoBase ещё не установлен, он будет автоматически установлен (см. команду `install`). + + +```bash +Использование: nocobase dev [опции] + +Опции: + -p, --port [порт] + --client + --server + -h, --help +``` + +Примеры: + +```bash +# Запуск приложения в режиме разработки с компиляцией в реальном времени +yarn nocobase dev +# Запуск только серверной части +yarn nocobase dev --server +# Запуск только клиентской части +yarn nocobase dev --client +``` + +### `start` + +Запускает приложение в производственной среде. Требует предварительной сборки кода командой yarn build. + + + +- Если NocoBase ещё не установлен, он будет автоматически установлен (см. команду `install`). +- Если были внесены изменения в исходный код, его необходимо пересобрать (см. команду `build`). + + + +```bash +$ yarn nocobase start -h + +Использование: nocobase start [опции] + +Опции: + -p, --port + -s, --silent + -h, --help +``` + +Пример: + +```bash +# Запуск приложения в производственной среде +yarn nocobase start +``` +# Команды CLI NocoBase + +## `install` + +Установка системы. + +```bash +$ yarn nocobase install -h + +Использование: nocobase install [опции] + +Опции: + -f, --force Принудительная переустановка + -c, --clean Полная очистка базы данных + -s, --silent Тихий режим + -l, --lang [язык] Язык интерфейса + -e, --root-email Email администратора + -p, --root-password <пароль> Пароль администратора + -n, --root-nickname [никнейм] Никнейм администратора + -h, --help Справка +``` + +Примеры: + +```bash +# Первоначальная установка +yarn nocobase install -l ru-RU -e admin@nocobase.com -p admin123 + +# Переустановка с удалением таблиц NocoBase +yarn nocobase install -f -l ru-RU -e admin@nocobase.com -p admin123 + +# Полная очистка базы и переустановка +yarn nocobase install -c -l ru-RU -e admin@nocobase.com -p admin123 +``` + + + +Разница между `-f/--force` и `-c/--clean`: + +- `-f` удаляет только таблицы NocoBase +- `-c` полностью очищает всю базу данных + + + +## `upgrade` + +Обновление системы. + +```bash +yarn nocobase upgrade +``` + +## `test` + +Запуск тестов (на базе Jest) с поддержкой всех [опций jest-cli](https://jestjs.io/docs/cli). + +```bash +$ yarn nocobase test -h + +Использование: nocobase test [опции] + +Опции: + -c, --db-clean Очистка базы перед запуском тестов + -h, --help Справка +``` + +Примеры: + +```bash +# Все тесты +yarn nocobase test + +# Тесты в указанной директории +yarn nocobase test packages/core/server + +# Конкретный тестовый файл +yarn nocobase test packages/core/database/src/__tests__/database.test.ts + +# С очисткой базы +yarn nocobase test -c +``` + +## `build` + +Сборка проекта для production. + +```bash +# Все пакеты +yarn nocobase build + +# Указанные пакеты +yarn nocobase build app/server app/client +``` + +## `clean` + +Удаление скомпилированных файлов. + +```bash +yarn clean +# Эквивалентно: +yarn rimraf -rf packages/*/*/{lib,esm,es,dist} +``` + +## `doc` + +Работа с документацией. + +```bash +# Запуск сервера документации +yarn doc --lang=ru-RU + +# Сборка документации +yarn doc build + +# Просмотр собранной документации +yarn doc serve --lang=ru-RU +``` + +## `db:auth` + +Проверка подключения к базе данных. + +```bash +$ yarn nocobase db:auth -h + +Использование: nocobase db:auth [опции] + +Опции: + -r, --retry [попытки] Количество попыток подключения + -h, --help Справка +``` + +## `db:sync` + +Синхронизация структуры базы данных с конфигурацией коллекций. + +```bash +$ yarn nocobase db:sync -h + +Использование: nocobase db:sync [опции] + +Опции: + -f, --force Принудительная синхронизация + -h, --help Справка +``` +### `migrator` + +Миграция данных. + +```bash +$ yarn nocobase migrator + +Позиционные аргументы: + + up Применяет ожидающие миграции + down Откатывает миграции + pending Выводит список ожидающих миграций + executed Выводит список выполненных миграций + create Создаёт файл миграции +``` + +### `pm` + +Менеджер плагинов. + +```bash +# Создать плагин +yarn pm create hello +# Зарегистрировать плагин +yarn pm add hello +# Включить плагин +yarn pm enable hello +# Отключить плагин +yarn pm disable hello +# Удалить плагин +yarn pm remove hello +``` + +Ещё не реализовано: + +```bash +# Обновить плагин +yarn pm upgrade hello +# Опубликовать плагин +yarn pm publish hello +``` + +### `umi` + +`app/client` построен на основе [umi](https://umijs.org/), вы можете запускать другие связанные команды через `nocobase umi`. + +```bash +# Сгенерировать кэш .umi, необходимый для среды разработки +yarn nocobase umi generate tmp +``` + +### `help` + +Команда справки. Также можно использовать параметры `-h` или `--help`. + +```bash +# Просмотр всех команд CLI +yarn nocobase help +# Использовать -h +yarn nocobase -h +# Или --help +yarn nocobase --help +# Просмотр опций команды db:sync +yarn nocobase db:sync -h +``` diff --git a/docs/ru-RU/api/client/application.md b/docs/ru-RU/api/client/application.md new file mode 100644 index 0000000000..0a1e37911a --- /dev/null +++ b/docs/ru-RU/api/client/application.md @@ -0,0 +1,65 @@ +# Класс Application + +## Конструктор + +### `constructor()` + +Создает экземпляр приложения. + +**Сигнатура** +- `constructor(options: ApplicationOptions)` + +**Пример использования** +```ts +const app = new Application({ + apiClient: { + baseURL: process.env.API_BASE_URL, // Базовый URL API + }, + dynamicImport: (name: string) => { + // Динамическая загрузка плагинов + return import(`../plugins/${name}`); + }, +}); +``` + +## Основные методы + +### use() + +Добавляет провайдеры в приложение. Встроенные провайдеры включают: + +- `APIClientProvider` - для работы с API +- `I18nextProvider` - для интернационализации +- `AntdConfigProvider` - для конфигурации Ant Design +- `SystemSettingsProvider` - для системных настроек +- `PluginManagerProvider` - для управления плагинами +- `SchemaComponentProvider` - для работы с компонентами схем +- `SchemaInitializerProvider` - для инициализации схем +- `BlockSchemaComponentProvider` - для блоковых компонентов схем +- `AntdSchemaComponentProvider` - для Ant Design компонентов схем +- `ACLProvider` - для управления доступом +- `RemoteDocumentTitleProvider` - для удаленного управления заголовком документа + +### render() + +Основной метод для рендеринга приложения. + +**Пример использования** +```ts +import { Application } from '@nocobase/client'; + +// Создание экземпляра приложения +export const app = new Application({ + apiClient: { + baseURL: process.env.API_BASE_URL, + }, + dynamicImport: (name: string) => { + return import(`../plugins/${name}`); + }, +}); + +// Экспорт компонента для рендеринга +export default app.render(); +``` + +Этот класс представляет собой ядро клиентской части приложения NocoBase, предоставляя все необходимые провайдеры и методы для работы с интерфейсом, плагинами и API. diff --git a/docs/ru-RU/api/client/extensions/acl.md b/docs/ru-RU/api/client/extensions/acl.md new file mode 100644 index 0000000000..b6a187dbb0 --- /dev/null +++ b/docs/ru-RU/api/client/extensions/acl.md @@ -0,0 +1,41 @@ +# ACL (Управление доступом) + +## Компоненты + +### `` +Поставщик контекста управления доступом. Обеспечивает функционал контроля прав для дочерних компонентов. + +### `` +Провайдер для проверки ролей пользователей. Определяет доступные действия на основе роли. + +### `` +Поставщик прав доступа к коллекциям данных. Управляет разрешениями для работы с конкретными коллекциями. + +### `` +Провайдер контроля доступа к действиям. Определяет, какие операции доступны пользователю. + +### `` +Поставщик прав доступа к полям коллекций. Обеспечивает тонкую настройку видимости и редактирования полей. + +### `` +Компонент для управления доступом к пунктам меню. Скрывает/показывает элементы интерфейса на основе прав пользователя. + +## Хуки + +### `useACLContext()` +Хук для доступа к контексту управления доступом. Возвращает: +- Методы проверки прав +- Текущие настройки ACL +- Функции для изменения прав + +### `useACLRoleContext()` +Хук для работы с контекстом ролей. Позволяет: +- Получать информацию о текущей роли +- Проверять доступные для роли действия +- Менять текущую роль (если есть права) + +### `useRoleRecheck()` +Хук для повторной проверки прав роли. Используется при: +- Изменении прав роли +- Обновлении данных пользователя +- Смене контекста приложения diff --git a/docs/ru-RU/api/client/extensions/block-provider.md b/docs/ru-RU/api/client/extensions/block-provider.md new file mode 100644 index 0000000000..5878ed62e2 --- /dev/null +++ b/docs/ru-RU/api/client/extensions/block-provider.md @@ -0,0 +1,25 @@ +# BlockProvider + +## Методы ядра + +### `BlockProvider` + +### `useBlockRequestContext()` + +## Встроенные компоненты BlockProvider + +### `CalendarBlockProvider` + +### `TableFieldProvider` + +### `TableBlockProvider` + +### `TableSelectorProvider` + +### `FormBlockProvider` + +### `FormFieldProvider` + +### `DetailsBlockProvider` + +### `Канбан блок ` diff --git a/docs/ru-RU/api/client/extensions/collection-manager.md b/docs/ru-RU/api/client/extensions/collection-manager.md new file mode 100644 index 0000000000..cbb0887cad --- /dev/null +++ b/docs/ru-RU/api/client/extensions/collection-manager.md @@ -0,0 +1,128 @@ +# Менеджер коллекций (CollectionManager) + +## Компоненты + +### CollectionManagerProvider + +Основной провайдер для управления коллекциями: + +```jsx + +``` + +### CollectionProvider + +Провайдер отдельной коллекции: + +```jsx +const collection = { + name: 'tests', + fields: [ + { + type: 'string', + name: 'title', + interface: 'input', + uiSchema: { + type: 'string', + 'x-component': 'Input', + }, + }, + ], +}; + +``` + +Если параметр `collection` не передан, коллекция будет получена из CollectionManagerProvider по имени: + +```jsx +const collections = [ + { + name: 'tests', + fields: [ + { + type: 'string', + name: 'title', + interface: 'input', + uiSchema: { + type: 'string', + 'x-component': 'Input', + }, + }, + ], + }, +]; + + + +``` + +### CollectionFieldProvider + +Провайдер поля коллекции: + +```jsx +const field = { + type: 'string', + name: 'title', + interface: 'input', + uiSchema: { + type: 'string', + 'x-component': 'Input', + }, +}; + +``` + +Если параметр `field` не передан, поле будет получено из CollectionProvider по имени: + +```jsx + + + +``` + +### CollectionField + +Универсальный компонент поля, который должен использоваться с `` только в схемах. Получает схему поля из CollectionProvider по имени и расширяет конфигурацию через схему, где расположен CollectionField. + +```ts +{ + name: 'title', + 'x-decorator': 'FormItem', + 'x-decorator-props': {}, + 'x-component': 'CollectionField', + 'x-component-props': {}, + properties: {}, +} +``` + +## Хуки + +### useCollectionManager() + +Используется с ``: + +```jsx +const { collections, get } = useCollectionManager(); +``` + +### useCollection() + +Используется с ``: + +```jsx +const { name, fields, getField, findField, resource } = useCollection(); +``` + +### useCollectionField() + +Используется с ``: + +```jsx +const { name, uiSchema, resource } = useCollectionField(); +``` + +Для работы с `resource` необходимо использовать `` для предоставления контекста записи текущей строки таблицы данных. diff --git a/docs/ru-RU/api/client/extensions/schema-component.md b/docs/ru-RU/api/client/extensions/schema-component.md new file mode 100644 index 0000000000..e772523d49 --- /dev/null +++ b/docs/ru-RU/api/client/extensions/schema-component.md @@ -0,0 +1,14 @@ +# Поддерживаемые компоненты Schema + +## Общие + +- DndContext +- Сортируемый элемент + +## И дизайн + +- Действие +- Элемент блока +- Календарь +- Элемент карточки +- Каскадер diff --git a/docs/ru-RU/api/client/index.md b/docs/ru-RU/api/client/index.md new file mode 100644 index 0000000000..78d434a889 --- /dev/null +++ b/docs/ru-RU/api/client/index.md @@ -0,0 +1,3 @@ +# Обзор + +тест diff --git a/docs/ru-RU/api/client/router.md b/docs/ru-RU/api/client/router.md new file mode 100644 index 0000000000..6728a84084 --- /dev/null +++ b/docs/ru-RU/api/client/router.md @@ -0,0 +1,185 @@ +# Маршрутизатор (Router) + +## API + +### Инициализация + +```tsx | pure +const app = new Application({ + router: { + type: 'browser', // тип по умолчанию — `browser` + }, +}); + +// или +const app = new Application({ + router: { + type: 'memory', + initialEntries: ['/'], + }, +}); +``` + +### Добавление маршрута + +#### Базовое использование + +```tsx | pure +import { RouteObject } from 'react-router-dom'; +const app = new Application(); + +const Hello = () => { + return
Привет
; +}; + +// Первый аргумент — имя маршрута, второй — объект `RouteObject` +app.router.add('root', { + path: '/', + element: , +}); + +app.router.add('root', { + path: '/', + Component: Hello, +}); +``` + +#### Компонент как строка + +```tsx | pure +app.addComponents({ + Hello, +}); +app.router.add('root', { + path: '/', + Component: 'Hello', +}); +``` + +#### Вложенные маршруты + +```tsx | pure +import { Outlet } from 'react-router-dom'; + +const Layout = () => { + return ( +
+ Главная + О нас + + +
+ ); +}; + +const Home = () => { + return
Главная
; +}; + +const About = () => { + return
О нас
; +}; + +app.router.add('root', { + element: , +}); +app.router.add('root.home', { + path: '/home', + element: , +}); +app.router.add('root.about', { + path: '/about', + element: , +}); +``` + +Будет сгенерирована следующая структура маршрутов: + +```tsx | pure +{ + element: , + children: [ + { + path: '/home', + element: + }, + { + path: '/about', + element: + } + ] +} +``` + +### Удаление маршрута + +```tsx | pure +// Удаление маршрута по имени +app.router.remove('root.home'); +app.router.remove('hello'); +``` + +#### Маршрутизатор в плагине + +```tsx | pure +class MyPlugin extends Plugin { + async load() { + // Добавление маршрута + this.app.router.add('hello', { + path: '/hello', + element:
привет
, + }); + + // Удаление маршрута + this.app.router.remove('world'); + } +} +``` + +## Пример + +```tsx +/** + * defaultShowCode: true + */ +import React from 'react'; +import { Link, Outlet } from 'react-router-dom'; +import { Application } from '@nocobase/client'; + +const Home = () =>

Главная

; +const About = () =>

О нас

; + +const Layout = () => { + return ( +
+
+ Главная, О нас +
+ +
+ ); +}; + +const app = new Application({ + router: { + type: 'memory', + initialEntries: ['/'], + }, +}); + +app.router.add('root', { + element: , +}); + +app.router.add('root.home', { + path: '/', + element: , +}); + +app.router.add('root.about', { + path: '/about', + element: , +}); + +export default app.getRootComponent(); +``` diff --git a/docs/ru-RU/api/client/schema-designer/schema-component.md b/docs/ru-RU/api/client/schema-designer/schema-component.md new file mode 100644 index 0000000000..dc95cf8d79 --- /dev/null +++ b/docs/ru-RU/api/client/schema-designer/schema-component.md @@ -0,0 +1,17 @@ +# SchemaComponent + +## Основные компоненты + +### `` + +### `` + +### `` + +## Основные методы + +### `createDesignable()` + +### `useDesignable()` + +### `useCompile()` diff --git a/docs/ru-RU/api/client/schema-designer/schema-initializer.md b/docs/ru-RU/api/client/schema-designer/schema-initializer.md new file mode 100644 index 0000000000..f6e13230dc --- /dev/null +++ b/docs/ru-RU/api/client/schema-designer/schema-initializer.md @@ -0,0 +1,27 @@ +# SchemaInitializer + +Используется для инициализации различных схем. Недавно добавленная схема может быть вставлена в любое место существующего узла схемы, включая: + +```ts +{ + properties: { + // beforeBegin - Insert in front of the current node + node1: { + properties: { + // afterBegin - Insert in front of the first child node of the current node + // ... + // beforeEnd - After the last child node of the current node + }, + }, + // afterEnd - After the current node + }, +} +``` + +Ядро SchemaInitializer включает в себя `` и ``. `` используется для создания кнопки выпадающего меню схемы, а параметрами выпадающего меню являются ``. + +### `` + +### `` + +### `` diff --git a/docs/ru-RU/api/client/schema-designer/schema-settings.md b/docs/ru-RU/api/client/schema-designer/schema-settings.md new file mode 100644 index 0000000000..edcf5ffdc4 --- /dev/null +++ b/docs/ru-RU/api/client/schema-designer/schema-settings.md @@ -0,0 +1,25 @@ +# Настройки Schema + +### `` + +### `` + +### `` + +### `` + +### `` + +### `` + +### `` + +### `` + +### `` + +### `` + +### `` + +### `` diff --git a/docs/ru-RU/api/data-source-manager/data-source.md b/docs/ru-RU/api/data-source-manager/data-source.md new file mode 100644 index 0000000000..ac4a98c8e7 --- /dev/null +++ b/docs/ru-RU/api/data-source-manager/data-source.md @@ -0,0 +1,73 @@ +# DataSource (абстрактный класс) + +Абстрактный класс `DataSource` представляет собой источник данных, которым может быть база данных, API и т.д. + +## Члены класса + +### collectionManager + +Экземпляр CollectionManager для источника данных, должен реализовывать интерфейс [`ICollectionManager`](/api/data-source-manager/i-collection-manager). + +### resourceManager + +Экземпляр resourceManager для источника данных. См.: [`resourceManager`](/api/resourcer/resource-manager) + +### acl + +Экземпляр ACL (управление доступом) для источника данных. См.: [`ACL`](/api/acl/acl) + +## API + +### constructor() + +Конструктор, создает экземпляр `DataSource`. + +#### Сигнатура: +- `constructor(options: DataSourceOptions)` + +### init() + +Функция инициализации, вызывается сразу после `constructor`. + +#### Сигнатура: +- `init(options: DataSourceOptions)` + +### name + +#### Сигнатура: +- `get name()` + +Возвращает имя экземпляра источника данных. + +### middleware() + +Получает middleware DataSource, используемый для подключения к Server и обработки запросов. + +### testConnection() + +Статический метод, вызываемый при проверке соединения. Может использоваться для валидации параметров. Конкретная логика реализуется подклассами. + +#### Сигнатура: +- `static testConnection(options?: any): Promise` + +### load() + +#### Сигнатура: +- `async load(options: any = {})` + +Операция загрузки источника данных. Логика реализуется подклассами. + +### createCollectionManager() + +#### Сигнатура: +- `abstract createCollectionManager(options?: any): ICollectionManager` + +Создает экземпляр CollectionManager для источника данных. Логика реализуется подклассами. + +### createResourceManager() + +Создает экземпляр ResourceManager для источника данных. Подклассы могут переопределить реализацию. По умолчанию создает `ResourceManager` из `@nocobase/resourcer`. + +### createACL() + +Создает экземпляр ACL для DataSource. Подклассы могут переопределить реализацию. По умолчанию создает `ACL` из `@nocobase/acl`. diff --git a/docs/ru-RU/api/data-source-manager/i-collection-manager.md b/docs/ru-RU/api/data-source-manager/i-collection-manager.md new file mode 100644 index 0000000000..89d0074a70 --- /dev/null +++ b/docs/ru-RU/api/data-source-manager/i-collection-manager.md @@ -0,0 +1,111 @@ +# ICollectionManager (Интерфейс менеджера коллекций) + +Интерфейс `ICollectionManager` используется для управления экземплярами `Collection` в источниках данных. + +## API методы + +### registerFieldTypes() + +Регистрирует типы полей в коллекции. + +```typescript +registerFieldTypes(types: Record): void +``` + +### registerFieldInterfaces() + +Регистрирует интерфейсы для коллекции. + +```typescript +registerFieldInterfaces(interfaces: Record): void +``` + +### registerCollectionTemplates() + +Регистрирует шаблоны коллекций. + +```typescript +registerCollectionTemplates(templates: Record): void +``` + +### registerModels() + +Регистрирует модели данных. + +```typescript +registerModels(models: Record): void +``` + +### registerRepositories() + +Регистрирует репозитории данных. + +```typescript +registerRepositories(repositories: Record): void +``` + +### getRegisteredRepository() + +Получает экземпляр зарегистрированного репозитория. + +```typescript +getRegisteredRepository(key: string): IRepository +``` + +### defineCollection() + +Определяет новую коллекцию. + +```typescript +defineCollection(options: CollectionOptions): ICollection +``` + +### extendCollection() + +Изменяет свойства существующей коллекции. + +```typescript +extendCollection(collectionOptions: CollectionOptions, mergeOptions?: MergeOptions): ICollection +``` + +### hasCollection() + +Проверяет существование коллекции. + +```typescript +hasCollection(name: string): boolean +``` + +### getCollection() + +Получает экземпляр коллекции. + +```typescript +getCollection(name: string): ICollection +``` + +### getCollections() + +Получает все экземпляры коллекций. + +```typescript +getCollections(): Array +``` + +### getRepository() + +Получает экземпляр репозитория. + +```typescript +getRepository(name: string, sourceId?: string | number): IRepository +``` + +### sync() + +Синхронизирует источник данных (логика реализуется в подклассах). + +```typescript +sync(): Promise +``` + +Этот интерфейс предоставляет полный набор методов для управления коллекциями данных, их типами полей, интерфейсами, шаблонами, моделями и репозиториями в системе NocoBase. diff --git a/docs/ru-RU/api/data-source-manager/i-collection.md b/docs/ru-RU/api/data-source-manager/i-collection.md new file mode 100644 index 0000000000..073715bdce --- /dev/null +++ b/docs/ru-RU/api/data-source-manager/i-collection.md @@ -0,0 +1,71 @@ +# ICollection (Интерфейс коллекции) + +Интерфейс `ICollection` представляет модель данных, содержащую информацию о названии модели, полях, ассоциациях и других характеристиках. + +```typescript +export interface ICollection { + repository: IRepository; // Репозиторий коллекции + + updateOptions(options: any): void; // Обновление параметров + + setField(name: string, options: any): IField; // Установка поля + + removeField(name: string): void; // Удаление поля + + getFields(): Array; // Получение всех полей + + getField(name: string): IField; // Получение конкретного поля + + [key: string]: any; // Динамические свойства +} +``` + +## Основные компоненты + +### repository + +Экземпляр `Repository`, к которому принадлежит данная коллекция. + +## Методы API + +### updateOptions() + +Обновляет параметры коллекции. + +```typescript +updateOptions(options: any): void +``` + +### setField() + +Добавляет или изменяет поле в коллекции. + +```typescript +setField(name: string, options: any): IField +``` + +### removeField() + +Удаляет поле из коллекции. + +```typescript +removeField(name: string): void +``` + +### getFields() + +Возвращает массив всех полей коллекции. + +```typescript +getFields(): Array +``` + +### getField() + +Получает конкретное поле коллекции по имени. + +```typescript +getField(name: string): IField +``` + +Этот интерфейс предоставляет базовый функционал для работы с коллекциями данных в системе, позволяя управлять их структурой и свойствами. diff --git a/docs/ru-RU/api/data-source-manager/i-field.md b/docs/ru-RU/api/data-source-manager/i-field.md new file mode 100644 index 0000000000..87ab01f928 --- /dev/null +++ b/docs/ru-RU/api/data-source-manager/i-field.md @@ -0,0 +1,41 @@ +# IField (Интерфейс поля) + +Интерфейс `IField` определяет структуру, которую должны реализовывать поля в системе. + +```typescript +export type FieldOptions = { + name: string; // Название поля + field: string; // Идентификатор поля + rawType: string; // Исходный тип данных + type: string; // Тип поля + description?: string; // Описание поля (опционально) + interface?: string; // Интерфейс поля + uiSchema?: any; // Схема пользовательского интерфейса + possibleTypes?: string[]; // Допустимые типы данных + defaultValue?: any; // Значение по умолчанию + primaryKey: boolean; // Является ли первичным ключом + unique: boolean; // Уникальное ли поле + allowNull?: boolean; // Допускает ли null-значения + autoIncrement?: boolean; // Автоинкрементное ли поле + [key: string]: any; // Дополнительные свойства +}; + +export interface IField { + options: FieldOptions; // Конфигурационные параметры поля +} +``` + +## Свойства + +### options + +- **Тип**: `FieldOptions` + +Объект конфигурации, содержащий все параметры и настройки поля. Включает такие свойства как: +- базовые атрибуты (имя, тип) +- метаданные (описание) +- особенности работы (уникальность, обязательность) +- настройки отображения в интерфейсе +- технические параметры (первичный ключ, автоинкремент) + +Этот интерфейс обеспечивает стандартизированное описание полей данных в системе, что позволяет единообразно работать с ними на всех уровнях приложения. diff --git a/docs/ru-RU/api/data-source-manager/i-model.md b/docs/ru-RU/api/data-source-manager/i-model.md new file mode 100644 index 0000000000..7dd0239b1f --- /dev/null +++ b/docs/ru-RU/api/data-source-manager/i-model.md @@ -0,0 +1,15 @@ +# IModel + +Интерфейс `IModel` определяет основные свойства и методы объекта модели. + +```typescript +export interface IModel { + toJSON: () => any; +} +``` + +## API + +### toJSON() + +Преобразует объект модели в формат JSON. diff --git a/docs/ru-RU/api/data-source-manager/i-repository.md b/docs/ru-RU/api/data-source-manager/i-repository.md new file mode 100644 index 0000000000..33d32b4847 --- /dev/null +++ b/docs/ru-RU/api/data-source-manager/i-repository.md @@ -0,0 +1,67 @@ +# IRepository (Интерфейс репозитория) + +Интерфейс `IRepository` определяет набор методов для выполнения CRUD-операций (Создание, Чтение, Обновление, Удаление) над моделями данных. + +## API методы + +### find() + +Возвращает список моделей, соответствующих параметрам запроса. + +```typescript +find(options?: any): Promise +``` + +### findOne() + +Возвращает первую модель, соответствующую параметрам запроса. Если найдено несколько моделей, возвращает только первую. + +```typescript +findOne(options?: any): Promise +``` + +### count() + +Возвращает количество моделей, соответствующих параметрам запроса. + +```typescript +count(options?: any): Promise +``` + +### findAndCount() + +Возвращает одновременно список моделей и их количество, соответствующих параметрам запроса. + +```typescript +findAndCount(options?: any): Promise<[IModel[], Number]> +``` + +### create() + +Создает новый объект модели данных. + +```typescript +create(options: any): void +``` + +### update() + +Обновляет объект модели данных на основе условий запроса. + +```typescript +update(options: any): void +``` + +### destroy() + +Удаляет объект модели данных на основе условий запроса. + +```typescript +destroy(options: any): void +``` + +Этот интерфейс предоставляет стандартизированный набор методов для работы с данными, что позволяет: +- Унифицировать доступ к данным из разных источников +- Реализовывать сложные запросы к данным +- Управлять жизненным циклом объектов моделей +- Оптимизировать работу с данными через комбинированные методы (например, findAndCount) diff --git a/docs/ru-RU/api/data-source-manager/index.md b/docs/ru-RU/api/data-source-manager/index.md new file mode 100644 index 0000000000..e5b513e750 --- /dev/null +++ b/docs/ru-RU/api/data-source-manager/index.md @@ -0,0 +1,54 @@ +# DataSourceManager (Менеджер источников данных) + +`DataSourceManager` - это класс для управления несколькими экземплярами источников данных (`dataSource`). + +## API методы + +### add() +Добавляет экземпляр источника данных. + +```typescript +add(dataSource: DataSource, options: any = {}): Promise +``` + +### use() +Добавляет глобальное middleware для экземпляра источника данных. + +### middleware() +Получает middleware текущего экземпляра DataSourceManager, которое можно использовать для обработки HTTP-запросов. + +### afterAddDataSource() +Хук-функция, которая срабатывает после добавления нового источника данных. + +```typescript +afterAddDataSource(hook: DataSourceHook) + +type DataSourceHook = (dataSource: DataSource) => void; +``` + +### registerDataSourceType() +Регистрирует тип источника данных и соответствующий ему класс. + +```typescript +registerDataSourceType(type: string, dataSourceClass: typeof DataSource) +``` + +### getDataSourceType() +Получает класс источника данных по его типу. + +```typescript +getDataSourceType(type: string): typeof DataSource +``` + +### buildDataSourceByType() +Создает экземпляр источника данных на основе зарегистрированного типа и параметров. + +```typescript +buildDataSourceByType(type: string, options: any): DataSource +``` + +Этот менеджер позволяет: +1. Централизованно управлять множеством источников данных +2. Регистрировать новые типы источников данных +3. Обрабатывать события жизненного цикла источников +4. Обеспечивать единую точку входа для HTTP-запросов diff --git a/docs/ru-RU/api/database/collection.md b/docs/ru-RU/api/database/collection.md new file mode 100644 index 0000000000..3fb9b0ceeb --- /dev/null +++ b/docs/ru-RU/api/database/collection.md @@ -0,0 +1,181 @@ +# Коллекция (Collection) + +## Обзор + +Класс `Collection` используется для определения модели данных в системе, включая имя модели, поля, индексы, связи и другую информацию. Обычно вызывается через метод `collection` экземпляра `Database`. + +```javascript +const { Database } = require('@nocobase/database') + +// Создание экземпляра базы данных +const db = new Database({...}); + +// Определение модели данных +db.collection({ + name: 'users', + fields: [ + // Скалярное поле + { + name: 'name', + type: 'string', + }, + + // Связь + { + name: 'profile', + type: 'hasOne' // Также 'hasMany', 'belongsTo', 'belongsToMany' + } + ], +}); +``` + +## Конструктор + +**Сигнатура** +```typescript +constructor(options: CollectionOptions, context: CollectionContext) +``` + +**Параметры** + +| Параметр | Тип | По умолчанию | Описание | +|----------------------|------------------------------|--------------|--------------------------------------------------------------------------| +| `options.name` | `string` | - | Идентификатор коллекции | +| `options.tableName` | `string` | - | Имя таблицы в БД (если не указано, используется `options.name`) | +| `options.fields` | `FieldOptions[]` | - | Определение полей | +| `options.model` | `string \| ModelStatic`| - | Тип модели Sequelize | +| `options.repository` | `string \| RepositoryType` | - | Тип репозитория данных | +| `options.sortable` | `string \| boolean \| object`| - | Настройка сортируемых полей | +| `options.autoGenId` | `boolean` | `true` | Автогенерация первичного ключа | +| `context.database` | `Database` | - | Экземпляр базы данных | + +**Пример** +```typescript +const posts = new Collection( + { + name: 'posts', + fields: [ + { type: 'string', name: 'title' }, + { type: 'double', name: 'price' }, + ], + }, + { database: db } // Существующий экземпляр БД +); +``` + +## Свойства экземпляра + +- `options` - Исходные параметры конфигурации таблицы +- `context` - Контекст (экземпляр базы данных) +- `name` - Имя таблицы данных +- `db` - Экземпляр базы данных +- `filterTargetKey` - Имя поля первичного ключа +- `isThrough` - Является ли промежуточной таблицей +- `model` - Соответствующий тип модели Sequelize +- `repository` - Экземпляр репозитория данных + +## Методы работы с полями + +### `getField()` +Получить поле по имени. + +```typescript +getField(name: string): Field +``` + +### `setField()` +Установить поле. + +```typescript +setField(name: string, options: FieldOptions): Field +``` + +### `setFields()` +Установить несколько полей. + +```typescript +setFields(fields: FieldOptions[], resetFields = true): Field[] +``` + +### `removeField()` +Удалить поле. + +```typescript +removeField(name: string): void | Field +``` + +### `resetFields()` +Сбросить все поля. + +```typescript +resetFields(): void +``` + +### `hasField()` +Проверить наличие поля. + +```typescript +hasField(name: string): boolean +``` + +### `findField()` +Найти поле по условию. + +```typescript +findField(predicate: (field: Field) => boolean): Field | undefined +``` + +### `forEachField()` +Итерироваться по полям. + +```typescript +forEachField(callback: (field: Field) => void): void +``` + +## Методы работы с индексами + +### `addIndex()` +Добавить индекс. + +```typescript +addIndex(index: string | string[] | object) +``` + +### `removeIndex()` +Удалить индекс. + +```typescript +removeIndex(fields: string[]) +``` + +## Методы работы с таблицей + +### `remove()` +Удалить таблицу. + +```typescript +remove(): void +``` + +## Методы работы с БД + +### `sync()` +Синхронизировать таблицу с БД. + +```typescript +sync(): Promise +``` + +### `existsInDb()` +Проверить существование таблицы в БД. + +```typescript +existsInDb(options?: Transactionable): Promise +``` + +### `removeFromDb()` +Удалить таблицу из БД. + +```typescript +removeFromDb(): Promise +``` diff --git a/docs/ru-RU/api/database/field.md b/docs/ru-RU/api/database/field.md new file mode 100644 index 0000000000..54660fc789 --- /dev/null +++ b/docs/ru-RU/api/database/field.md @@ -0,0 +1,142 @@ +# Поле (Field) + +## Обзор + +Абстрактный класс для управления полями таблицы данных. Является базовым классом для всех типов полей. + +См. [Расширение типов полей](/development/server/collections-fields#extended-field-types) для создания пользовательских полей. + +## Конструктор + +Обычно не вызывается напрямую, а используется через `db.collection({ fields: [] })`. + +**Сигнатура** +```typescript +constructor(options: FieldOptions, context: FieldContext) +``` + +**Параметры** + +| Параметр | Тип | Описание | +|--------------------|----------------|-----------------------------------| +| `options.name` | `string` | Название поля | +| `options.type` | `string` | Тип поля (должен быть зарегистрирован) | +| `context.database` | `Database` | Экземпляр базы данных | +| `context.collection` | `Collection` | Экземпляр коллекции | + +## Свойства экземпляра + +- `name` - Название поля +- `type` - Тип поля +- `dataType` - Тип данных поля +- `options` - Параметры конфигурации +- `context` - Контекст поля + +## Методы конфигурации + +### `on()` +Подписка на события таблицы. + +```typescript +on(eventName: string, listener: (...args: any[]) => void) +``` + +### `off()` +Отписка от событий. + +```typescript +off(eventName: string, listener: (...args: any[]) => void) +``` + +### `bind()` +Вызывается при добавлении поля в таблицу. + +```typescript +bind() +``` + +### `unbind()` +Вызывается при удалении поля. + +```typescript +unbind() +``` + +### `get()` +Получить значение параметра. + +```typescript +get(key: string): any +``` + +### `merge()` +Объединить параметры. + +```typescript +merge(options: { [key: string]: any }): void +``` + +### `remove()` +Удалить поле (только из памяти). + +```typescript +remove() +``` + +## Методы работы с БД + +### `removeFromDb()` +Удалить поле из БД. + +```typescript +removeFromDb(options?: Transactionable): Promise +``` + +### `existsInDb()` +Проверить наличие поля в БД. + +```typescript +existsInDb(options?: Transactionable): Promise +``` + +## Встроенные типы полей + +### Базовые типы +- `'boolean'` - Логический тип +- `'integer'` - Целое число (32 бита) +- `'bigInt'` - Длинное целое (64 бита) +- `'double'` - Число с плавающей точкой +- `'string'` - Строка +- `'text'` - Текст +- `'date'` - Дата +- `'json'` - JSON + +### Специальные типы NocoBase +- `'password'` - Пароль (шифрование scrypt) +- `'formula'` - Формула (mathjs) +- `'radio'` - Радиокнопка (только одно true) +- `'sort'` - Сортировка +- `'uid'` - Короткий случайный ID + +### Типы связей +- `'belongsTo'` - Принадлежность (многие к одному) +- `'hasOne'` - Имеет один (один к одному) +- `'hasMany'` - Имеет много (один ко многим) +- `'belongsToMany'` - Многие ко многим + +**Пример связи:** +```typescript +// Пост принадлежит автору +{ + type: 'belongsTo', + name: 'author', + target: 'users' +} + +// Пост имеет много тегов +{ + type: 'belongsToMany', + name: 'tags', + through: 'postsTags' +} +``` diff --git a/docs/ru-RU/api/database/index.md b/docs/ru-RU/api/database/index.md new file mode 100644 index 0000000000..2205c28026 --- /dev/null +++ b/docs/ru-RU/api/database/index.md @@ -0,0 +1,1215 @@ +# База данных (Database) + +## Обзор + +Database - это инструмент для взаимодействия с базами данных в NocoBase, предоставляющий удобные функции для no-code и low-code приложений. Поддерживаемые СУБД: + +- SQLite 3.8.8+ +- MySQL 8.0.17+ +- PostgreSQL 10.0+ + +### Подключение к базе данных + +В конструкторе `Database` можно настроить подключение к БД, передав параметр `options`. + +```javascript +const { Database } = require('@nocobase/database'); + +// Конфигурация для SQLite +const database = new Database({ + dialect: 'sqlite', + storage: 'path/to/database.sqlite' +}) + +// Конфигурация для MySQL/PostgreSQL +const database = new Database({ + dialect: /* 'postgres' или 'mysql' */, + database: 'database', + username: 'username', + password: 'password', + host: 'localhost', + port: 'port' +}) +``` + +Подробные параметры конфигурации смотрите в разделе [Конструктор](#constructor). + +### Определение структуры данных + +`Database` определяет структуру БД через `Collection`, где каждый объект `Collection` представляет таблицу в базе данных. + +```javascript +// Определение коллекции +const UserCollection = database.collection({ + name: 'users', + fields: [ + { + name: 'name', + type: 'string', + }, + { + name: 'age', + type: 'integer', + }, + ], +}); +``` + +После определения структуры используйте метод `sync()` для синхронизации с базой данных. + +```javascript +await database.sync(); +``` + +Подробнее об использовании `Collection` см. в [документации Collection](/api/database/collection). + +### CRUD операции с данными + +`Database` работает с данными через `Repository`. + +```javascript +const UserRepository = UserCollection.repository(); + +// Создание +await UserRepository.create({ + name: 'Mark', + age: 18, +}); + +// Запрос +const user = await UserRepository.findOne({ + filter: { + name: 'Mark', + }, +}); + +// Обновление +await UserRepository.update({ + values: { + age: 20, + }, +}); + +// Удаление +await UserRepository.destroy(user.id); +``` + +Подробнее о CRUD операциях см. в [документации Repository](/api/database/repository). + +## Конструктор + +**Сигнатура** + +- `constructor(options: DatabaseOptions)` + +Создаёт экземпляр базы данных. + +**Параметры** + +| Имя | Тип | По умолчанию | Описание | +|--------------------------|----------------|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------| +| `options.host` | `string` | `'localhost'` | Хост базы данных | +| `options.port` | `number` | — | Порт службы базы данных, значение по умолчанию зависит от типа используемой СУБД | +| `options.username` | `string` | — | Имя пользователя базы данных | +| `options.password` | `string` | — | Пароль базы данных | +| `options.database` | `string` | — | Название базы данных | +| `options.dialect` | `string` | `'mysql'` | Тип базы данных | +| `options.storage?` | `string` | `':memory:'` | Режим хранения для SQLite | +| `options.logging?` | `boolean` | `false` | Включить логирование | +| `options.define?` | `Object` | `{}` | Параметры по умолчанию для определения таблиц | +| `options.tablePrefix?` | `string` | `''` | Расширение NocoBase, префикс таблиц | +| `options.migrator?` | `UmzugOptions` | `{}` | Расширение NocoBase, параметры мигратора, см. [Umzug](https://github.com/sequelize/umzug/blob/main/src/types.ts#L15) для реализации | + +## Методы миграций + +### `addMigration()` + +Добавляет один файл миграции. + +**Сигнатура** + +- `addMigration(options: MigrationItem)` + +**Параметры** + +| Имя | Тип | По умолчанию | Описание | +|----------------------|--------------------|--------------|-------------------------------------------| +| `options.name` | `string` | — | Название файла миграции | +| `options.context?` | `string` | — | Контекст файла миграции | +| `options.migration?` | `typeof Migration` | — | Пользовательский тип миграции | +| `options.up` | `Function` | — | Метод `up` в файле миграции | +| `options.down` | `Function` | — | Метод `down` в файле миграции | + +**Пример** + +```ts +db.addMigration({ + name: '20220916120411-test-1', + async up() { + const queryInterface = this.context.db.sequelize.getQueryInterface(); + await queryInterface.query(/* ваши SQL-запросы миграции */); + }, +}); +``` + +### `addMigrations()` + +Добавляет файлы миграций из указанной директории. + +**Сигнатура** + +- `addMigrations(options: AddMigrationsOptions): void` + +**Параметры** + +| Имя | Тип | По умолчанию | Описание | +|----------------------|------------|------------------|----------------------------------------------| +| `options.directory` | `string` | `''` | Директория с файлами миграций | +| `options.extensions` | `string[]` | `['js', 'ts']` | Расширения файлов | +| `options.namespace?` | `string` | `''` | Пространство имён (namespace) | +| `options.context?` | `Object` | `{ db }` | Контекст файлов миграций | + +**Пример** + +```ts +db.addMigrations({ + directory: path.resolve(__dirname, './migrations'), + namespace: 'test', +}); +``` + +## Вспомогательные методы + +### `inDialect()` + +Проверяет, является ли текущий тип базы данных указанным. + +**Сигнатура** + +- `inDialect(dialect: string[]): boolean` + +**Параметры** + +| Имя | Тип | По умолчанию | Описание | +|-----------|------------|--------------|---------------------------------------------------------------| +| `dialect` | `string[]` | — | Тип базы данных: возможные значения — `mysql`, `postgres`, `sqlite` | + +### `getTablePrefix()` + +Возвращает префикс имени таблицы из конфигурации. + +**Сигнатура** + +- `getTablePrefix(): string` + +## Конфигурация таблиц данных + +### `collection()` + +Определяет таблицу данных. Работает аналогично методу `define` из Sequelize — создаёт структуру таблицы только в памяти. Для сохранения в базе данных необходимо вызвать метод `sync`. + +**Сигнатура** + +- `collection(options: CollectionOptions): Collection` + +**Параметры** + +Все параметры `options` соответствуют параметрам конструктора класса `Collection`, см. [Collection](/api/database/collection#Constructor). + +**События** + +- `'beforeDefineCollection'`: срабатывает перед созданием таблицы. +- `'afterDefineCollection'`: срабатывает после создания таблицы. + +**Пример** + +```ts +db.collection({ + name: 'books', + fields: [ + { + type: 'string', + name: 'title', + }, + { + type: 'float', + name: 'price', + }, + ], +}); + +// синхронизировать коллекцию как таблицу в базе данных +await db.sync(); +``` + +### `getCollection()` + +Получает ранее определённую таблицу данных. + +**Сигнатура** + +- `getCollection(name: string): Collection` + +**Параметры** + +| Имя | Тип | По умолчанию | Описание | +|--------|----------|--------------|----------------| +| `name` | `string` | — | Имя таблицы | + +**Пример** + +```ts +const collection = db.getCollection('books'); +``` + +### `hasCollection()` + +Проверяет, определена ли таблица данных с указанным именем. + +**Сигнатура** + +- `hasCollection(name: string): boolean` + +**Параметры** + +| Имя | Тип | По умолчанию | Описание | +|--------|----------|--------------|----------------| +| `name` | `string` | — | Имя таблицы | + +**Пример** + +```ts +db.collection({ name: 'books' }); + +db.hasCollection('books'); // true + +db.hasCollection('authors'); // false +``` + +### `removeCollection()` + +Удаляет определённую таблицу данных. Удаление происходит только из памяти. Чтобы изменения были сохранены в базе данных, необходимо вызвать метод `sync`. + +**Сигнатура** + +- `removeCollection(name: string): void` + +**Параметры** + +| Имя | Тип | По умолчанию | Описание | +|--------|----------|--------------|----------------| +| `name` | `string` | — | Имя таблицы | + +**События** + +- `'beforeRemoveCollection'`: срабатывает перед удалением таблицы. +- `'afterRemoveCollection'`: срабатывает после удаления таблицы. + +**Пример** + +```ts +db.collection({ name: 'books' }); + +db.removeCollection('books'); +``` + +### `import()` + +Загружает все файлы из указанной директории в память и использует их как конфигурацию коллекций. + +**Сигнатура** + +- `async import(options: { directory: string; extensions?: ImportFileExtension[] }): Promise>` + +**Параметры** + +| Имя | Тип | По умолчанию | Описание | +|---------------------|------------|------------------|------------------------------------------| +| `options.directory` | `string` | — | Путь к директории для импорта | +| `options.extensions`| `string[]` | `['ts', 'js']` | Расширения файлов для сканирования | + +**Пример** + +Файл `./collections/books.ts` содержит следующую конфигурацию: + +```ts +export default { + name: 'books', + fields: [ + { + type: 'string', + name: 'title', + }, + ], +}; +``` + +Импортируем конфигурации при загрузке плагина: + +```ts +class Plugin { + async load() { + await this.app.db.import({ + directory: path.resolve(__dirname, './collections'), + }); + } +} +``` + +## Регистрация и получение расширений + +### `registerFieldTypes()` + +Регистрирует пользовательский тип поля. + +**Сигнатура** + +- `registerFieldTypes(fieldTypes: MapOf): void` + +**Параметры** + +`fieldTypes` — это объект с парами ключ-значение, где ключ — имя типа поля, а значение — класс типа поля. + +**Пример** + +```ts +import { Field } from '@nocobase/database'; + +class MyField extends Field { + // ... +} + +db.registerFieldTypes({ + myField: MyField, +}); +``` + +### `registerModels()` + +Регистрирует пользовательский класс модели данных. + +**Сигнатура** + +- `registerModels(models: MapOf>): void` + +**Параметры** + +`models` — объект с парами ключ-значение, где ключ — имя модели данных, а значение — класс модели. + +**Пример** + +```ts +import { Model } from '@nocobase/database'; + +class MyModel extends Model { + // ... +} + +db.registerModels({ + myModel: MyModel, +}); + +db.collection({ + name: 'myCollection', + model: 'myModel', +}); +``` + +### `registerRepositories()` + +Регистрирует пользовательский класс репозитория данных. + +**Сигнатура** + +- `registerRepositories(repositories: MapOf): void` + +**Параметры** + +`repositories` — объект с парами ключ-значение, где ключ — имя репозитория, а значение — класс репозитория. + +**Пример** + +```ts +import { Repository } from '@nocobase/database'; + +class MyRepository extends Repository { + // ... +} + +db.registerRepositories({ + myRepository: MyRepository, +}); + +db.collection({ + name: 'myCollection', + repository: 'myRepository', +}); +``` + +### `registerOperators()` + +Регистрирует пользовательский оператор запроса данных. + +**Сигнатура** + +- `registerOperators(operators: MapOf): void` + +**Параметры** + +`operators` — объект с парами ключ-значение, где ключ — имя оператора, а значение — функция, возвращающая условие сравнения. + +**Пример** + +```ts +db.registerOperators({ + $dateOn(value) { + return { + [Op.and]: [ + { [Op.gte]: stringToDate(value) }, + { [Op.lt]: getNextDay(value) }, + ], + }; + }, +}); + +db.getRepository('books').count({ + filter: { + createdAt: { + // зарегистрированный оператор + $dateOn: '2020-01-01', + }, + }, +}); +``` + +### `getModel()` + +Возвращает зарегистрированный класс модели данных. Если пользовательский класс модели не был зарегистрирован ранее, возвращается класс модели по умолчанию из Sequelize. Имя по умолчанию совпадает с именем, заданным при определении коллекции. + +**Сигнатура** + +- `getModel(name: string): Model` + +**Параметры** + +| Имя | Тип | По умолчанию | Описание | +|--------|----------|--------------|------------------------------| +| `name` | `string` | — | Имя зарегистрированной модели| + +**Пример** + +```ts +db.registerModels({ + books: class MyModel extends Model {}, +}); + +const ModelClass = db.getModel('books'); + +console.log(ModelClass.prototype instanceof MyModel); // true +``` + +> **Примечание**: Класс модели, полученный через `getModel()`, строго не равен классу, переданному при регистрации, но он от него наследуется. Поскольку Sequelize модифицирует свойства класса модели во время инициализации, NocoBase автоматически обрабатывает это наследование. Все определения работают корректно, за исключением того, что сами классы не являются одинаковыми (не равны по ссылке).> + +### `getRepository()` + +Получает определённый класс репозитория данных. Если пользовательский класс репозитория не был зарегистрирован ранее, возвращается класс репозитория по умолчанию из NocoBase. Имя по умолчанию совпадает с именем, заданным при определении коллекции. + +Класс репозитория в основном используется для операций CRUD (создание, чтение, обновление, удаление) на основе модели данных. Подробнее см. [Repository](/api/database/repository). + +**Сигнатура** + +- `getRepository(name: string): Repository` +- `getRepository(name: string, relationId?: string | number): Repository` + +**Параметры** + +| Имя | Тип | По умолчанию | Описание | +|-------------|---------------------|--------------|-----------------------------------------------| +| `name` | `string` | — | Имя зарегистрированного репозитория данных | +| `relationId`| `string` \| `number`| — | Значение внешнего ключа для связанных данных | + +Если имя содержит связь в формате `'таблица.связь'`, возвращается репозиторий связанных данных. Если указан второй параметр, репозиторий будет использоваться (запросы, изменения и т.д.) с учётом значения внешнего ключа в связанных данных. + +**Пример** + +Предположим, есть две таблицы: `posts` (посты) и `authors` (авторы), причём в таблице `posts` есть внешний ключ, ссылающийся на `authors`: + +```ts +const AuthorsRepo = db.getRepository('authors'); +const author1 = await AuthorsRepo.create({ name: 'author1' }); + +const PostsRepo = db.getRepository('authors.posts', author1.id); +const post1 = await PostsRepo.create({ title: 'post1' }); +console.assert(post1.authorId === author1.id); // true +``` + +## События базы данных + +### `on()` + +Подписывается на события базы данных. + +**Сигнатура** + +- `on(event: string, listener: (...args: any[]) => void | Promise): void` + +**Параметры** + +| Имя | Тип | По умолчанию | Описание | +|-----------|----------|--------------|------------------| +| `event` | `string` | — | Имя события | +| `listener`| `Function`| — | Обработчик события| + +Имена событий по умолчанию поддерживают события моделей Sequelize. Глобальные события прослушиваются по имени ``, события отдельной модели — по имени `<имя_модели>.`. + +См. раздел [Встроенные события](#built-in-events) для описания параметров и подробных примеров всех встроенных типов событий. + +### `off()` + +Удаляет обработчик события. + +**Сигнатура** + +- `off(name: string, listener: Function): void` + +**Параметры** + +| Имя | Тип | По умолчанию | Описание | +|-----------|----------|--------------|------------------| +| `name` | `string` | — | Имя события | +| `listener`| `Function`| — | Обработчик события| + +**Пример** + +```ts +const listener = async (model, options) => { + console.log(model); +}; + +db.on('afterCreate', listener); + +db.off('afterCreate', listener); +``` + +## Операции с базой данных + +### `auth()` + +Проверка подключения к базе данных. Может использоваться для убеждения, что приложение установило соединение с БД. + +**Сигнатура** + +- `auth(options: QueryOptions & { retry?: number } = {}): Promise` + +**Параметры** + +| Имя | Тип | По умолчанию | Описание | +|-----------------------|----------------------|--------------|-----------------------------------------------| +| `options?` | `Object` | — | Параметры проверки | +| `options.retry?` | `number` | `10` | Количество попыток при неудачной проверке | +| `options.transaction?`| `Transaction` | — | Объект транзакции | +| `options.logging?` | `boolean \| Function`| `false` | Выводить ли логи | + +**Пример** + +```ts +await db.auth(); +``` + +### `reconnect()` + +Повторное подключение к базе данных. + +**Пример** + +```ts +await db.reconnect(); +``` + +### `closed()` + +Проверяет, закрыто ли соединение с базой данных. + +**Сигнатура** + +- `closed(): boolean` + +### `close()` + +Закрывает соединение с базой данных. Аналогично `sequelize.close()`. + +### `sync()` + +Синхронизирует структуру таблиц базы данных. Аналогично `sequelize.sync()`. Подробнее о параметрах см. в [документации Sequelize](https://sequelize.org/api/v6/class/src/sequelize.js~sequelize#instance-method-sync). + +### `clean()` + +Очищает базу данных — удаляет все таблицы данных. + +**Сигнатура** + +- `clean(options: CleanOptions): Promise` + +**Параметры** + +| Имя | Тип | По умолчанию | Описание | +|-----------------------|---------------|--------------|-----------------------------------| +| `options.drop` | `boolean` | `false` | Удалять ли все таблицы | +| `options.skip` | `string[]` | — | Имена таблиц, которые нужно пропустить | +| `options.transaction` | `Transaction` | — | Объект транзакции | + +**Пример** + +Удалить все таблицы, кроме таблицы `users`: + +```ts +await db.clean({ + drop: true, + skip: ['users'], +}); +``` + +## Экспорт на уровне пакета + +### `defineCollection()` + +Создаёт конфигурацию таблицы данных. + +**Сигнатура** + +- `defineCollection(name: string, config: CollectionOptions): CollectionOptions` + +**Параметры** + +| Имя | Тип | По умолчанию | Описание | +|--------------------|--------------------|--------------|-------------------------------------------------| +| `collectionOptions`| `CollectionOptions`| — | Все параметры те же, что и у `db.collection()` | + +**Пример** + +Файл конфигурации таблицы, который будет импортирован через `db.import()`: + +```ts +import { defineCollection } from '@nocobase/database'; + +export default defineCollection({ + name: 'users', + fields: [ + { + type: 'string', + name: 'name', + }, + ], +}); +``` + +### `extendCollection()` + +Расширяет конфигурацию уже загруженной в память таблицы данных. В основном используется для модификации конфигураций, загруженных через метод `import()`. Это метод верхнего уровня из пакета `@nocobase/database`, который вызывается не через экземпляр `db`, а напрямую. Также можно использовать алиас `extend`. + +**Сигнатура** + +- `extendCollection(collectionOptions: CollectionOptions, mergeOptions?: MergeOptions): ExtendedCollectionOptions` + +**Параметры** + +| Имя | Тип | По умолчанию | Описание | +|--------------------|--------------------|--------------|----------------------------------------------------------------------| +| `collectionOptions`| `CollectionOptions`| — | Параметры аналогичны `db.collection()` | +| `mergeOptions?` | `MergeOptions` | — | Параметры для [deepmerge](https://npmjs.com/package/deepmerge) | + +**Пример** + +Исходное определение таблицы `books` (файл `books.ts`): + +```ts +export default { + name: 'books', + fields: [{ name: 'title', type: 'string' }], +}; +``` + +Расширение определения таблицы `books` (файл `books.extend.ts`): + +```ts +import { extend } from '@nocobase/database'; + +// Расширяем существующую конфигурацию +export default extend({ + name: 'books', + fields: [{ name: 'price', type: 'number' }], +}); +``` + +Если оба файла будут загружены через `import()`, после применения `extend()` таблица `books` будет содержать два поля: `title` и `price`. + +Этот метод особенно полезен при расширении структуры таблиц, уже определённых в существующем плагине. + +--- + +## Встроенные события + +Следующие события вызываются на соответствующих этапах жизненного цикла базы данных. Подписаться на них можно с помощью метода `on()`, чтобы выполнять определённые действия и удовлетворять бизнес-требования. + +### `'beforeSync'` / `'afterSync'` + +События, вызываемые до или после синхронизации новой конфигурации структуры таблицы (полей, индексов и т.д.) с базой данных. Обычно срабатывают при вызове `collection.sync()` (внутренний вызов) — используются для логической обработки специальных полей или расширений. + +**Сигнатура** + +```ts +on(eventName: `${string}.beforeSync` | 'beforeSync' | `${string}.afterSync` | 'afterSync', listener: SyncListener): this +``` + +**Типы** + +```ts +import type { SyncOptions, HookReturn } from 'sequelize/types'; + +type SyncListener = (options?: SyncOptions) => HookReturn; +``` + +**Пример** + +```ts +const users = db.collection({ + name: 'users', + fields: [{ type: 'string', name: 'username' }], +}); + +// Событие перед синхронизацией всех таблиц +db.on('beforeSync', async (options) => { + // выполнить какие-то действия +}); + +// Событие после синхронизации таблицы "users" +db.on('users.afterSync', async (options) => { + // выполнить какие-то действия +}); + +await users.sync(); +``` + +--- + +### `'beforeValidate'` / `'afterValidate'` + +Перед созданием или обновлением данных выполняется валидация на основе правил, заданных в коллекции. Соответствующие события срабатывают до и после этой валидации. Вызываются при вызове `repository.create()` или `repository.update()`. + +**Сигнатура** + +```ts +on(eventName: `${string}.beforeValidate` | 'beforeValidate' | `${string}.afterValidate` | 'afterValidate', listener: ValidateListener): this +``` + +**Типы** + +```ts +import type { ValidationOptions } from 'sequelize/types/lib/instance-validator'; +import type { HookReturn } from 'sequelize/types'; +import type { Model } from '@nocobase/database'; + +type ValidateListener = ( + model: Model, + options?: ValidationOptions, +) => HookReturn; +``` + +**Пример** + +```ts +db.collection({ + name: 'tests', + fields: [ + { + type: 'string', + name: 'email', + validate: { + isEmail: true, + }, + }, + ], +}); + +// Событие до валидации для всех моделей +db.on('beforeValidate', async (model, options) => { + // выполнить какие-то действия +}); + +// Событие до валидации только для модели "tests" +db.on('tests.beforeValidate', async (model, options) => { + // выполнить какие-то действия +}); + +// Событие после валидации для всех моделей +db.on('afterValidate', async (model, options) => { + // выполнить какие-то действия +}); + +// Событие после валидации только для модели "tests" +db.on('tests.afterValidate', async (model, options) => { + // выполнить какие-то действия +}); + +const repository = db.getRepository('tests'); +await repository.create({ + values: { + email: 'abc', // будет проверен на соответствие формату email + }, +}); + +// или +await repository.update({ + filterByTk: 1, + values: { + email: 'abc', // будет проверен на соответствие формату email + }, +}); +``` + +### `'beforeCreate'` / `'afterCreate'` + +События, вызываемые до или после создания одной записи данных. Срабатывают при вызове `repository.create()`. + +**Сигнатура** + +```ts +on(eventName: `${string}.beforeCreate` | 'beforeCreate' | `${string}.afterCreate` | 'afterCreate', listener: CreateListener): this +``` + +**Типы** + +```ts +import type { CreateOptions, HookReturn } from 'sequelize/types'; +import type { Model } from '@nocobase/database'; + +export type CreateListener = ( + model: Model, + options?: CreateOptions, +) => HookReturn; +``` + +**Пример** + +```ts +db.on('beforeCreate', async (model, options) => { + // выполнить какие-то действия +}); + +db.on('books.afterCreate', async (model, options) => { + const { transaction } = options; + const result = await model.constructor.findByPk(model.id, { + transaction, + }); + console.log(result); +}); +``` + +--- + +### `'beforeUpdate'` / `'afterUpdate'` + +События, вызываемые до или после обновления одной записи данных. Срабатывают при вызове `repository.update()`. + +**Сигнатура** + +```ts +on(eventName: `${string}.beforeUpdate` | 'beforeUpdate' | `${string}.afterUpdate` | 'afterUpdate', listener: UpdateListener): this +``` + +**Типы** + +```ts +import type { UpdateOptions, HookReturn } from 'sequelize/types'; +import type { Model } from '@nocobase/database'; + +export type UpdateListener = ( + model: Model, + options?: UpdateOptions, +) => HookReturn; +``` + +**Пример** + +```ts +db.on('beforeUpdate', async (model, options) => { + // выполнить какие-то действия +}); + +db.on('books.afterUpdate', async (model, options) => { + // выполнить какие-то действия +}); +``` + +--- + +### `'beforeSave'` / `'afterSave'` + +События, вызываемые до или после создания или обновления одной записи данных. Срабатывают при вызове `repository.create()` или `repository.update()`. + +**Сигнатура** + +```ts +on(eventName: `${string}.beforeSave` | 'beforeSave' | `${string}.afterSave` | 'afterSave', listener: SaveListener): this +``` + +**Типы** + +```ts +import type { SaveOptions, HookReturn } from 'sequelize/types'; +import type { Model } from '@nocobase/database'; + +export type SaveListener = (model: Model, options?: SaveOptions) => HookReturn; +``` + +**Пример** + +```ts +db.on('beforeSave', async (model, options) => { + // выполнить какие-то действия +}); + +db.on('books.afterSave', async (model, options) => { + // выполнить какие-то действия +}); +``` + +--- + +### `'beforeDestroy'` / `'afterDestroy'` + +События, вызываемые до или после удаления одной записи данных. Срабатывают при вызове `repository.destroy()`. + +**Сигнатура** + +```ts +on(eventName: `${string}.beforeDestroy` | 'beforeDestroy' | `${string}.afterDestroy` | 'afterDestroy', listener: DestroyListener): this +``` + +**Типы** + +```ts +import type { DestroyOptions, HookReturn } from 'sequelize/types'; +import type { Model } from '@nocobase/database'; + +export type DestroyListener = ( + model: Model, + options?: DestroyOptions, +) => HookReturn; +``` + +**Пример** + +```ts +db.on('beforeDestroy', async (model, options) => { + // выполнить какие-то действия +}); + +db.on('books.afterDestroy', async (model, options) => { + // выполнить какие-то действия +}); +``` + +--- + +### `'afterCreateWithAssociations'` + +Событие, вызываемое после создания записи, содержащей иерархические (связанные) данные. Срабатывает при вызове `repository.create()`. + +**Сигнатура** + +```ts +on(eventName: `${string}.afterCreateWithAssociations` | 'afterCreateWithAssociations', listener: CreateWithAssociationsListener): this +``` + +**Типы** + +```ts +import type { CreateOptions, HookReturn } from 'sequelize/types'; +import type { Model } from '@nocobase/database'; + +export type CreateWithAssociationsListener = ( + model: Model, + options?: CreateOptions, +) => HookReturn; +``` + +**Пример** + +```ts +db.on('afterCreateWithAssociations', async (model, options) => { + // выполнить какие-то действия +}); + +db.on('books.afterCreateWithAssociations', async (model, options) => { + // выполнить какие-то действия +}); +``` + +--- + +### `'afterUpdateWithAssociations'` + +Событие, вызываемое после обновления записи, содержащей иерархические (связанные) данные. Срабатывает при вызове `repository.update()`. + +**Сигнатура** + +```ts +on(eventName: `${string}.afterUpdateWithAssociations` | 'afterUpdateWithAssociations', listener: UpdateWithAssociationsListener): this +``` + +**Типы** + +```ts +import type { UpdateOptions, HookReturn } from 'sequelize/types'; +import type { Model } from '@nocobase/database'; + +export type UpdateWithAssociationsListener = ( + model: Model, + options?: UpdateOptions, +) => HookReturn; +``` + +**Пример** + +```ts +db.on('afterUpdateWithAssociations', async (model, options) => { + // выполнить какие-то действия +}); + +db.on('books.afterUpdateWithAssociations', async (model, options) => { + // выполнить какие-то действия +}); +``` + +--- + +### `'afterSaveWithAssociations'` + +Событие, вызываемое после создания или обновления записи, содержащей иерархические (связанные) данные. Срабатывает при вызове `repository.create()` или `repository.update()`. + +**Сигнатура** + +```ts +on(eventName: `${string}.afterSaveWithAssociations` | 'afterSaveWithAssociations', listener: SaveWithAssociationsListener): this +``` + +**Типы** + +```ts +import type { SaveOptions, HookReturn } from 'sequelize/types'; +import type { Model } from '@nocobase/database'; + +export type SaveWithAssociationsListener = ( + model: Model, + options?: SaveOptions, +) => HookReturn; +``` + +**Пример** + +```ts +db.on('afterSaveWithAssociations', async (model, options) => { + // выполнить какие-то действия +}); + +db.on('books.afterSaveWithAssociations', async (model, options) => { + // выполнить какие-то действия +}); +``` + +--- + +### `'beforeDefineCollection'` + +Событие, вызываемое перед определением таблицы данных, например, при вызове `db.collection()`. + +> **Примечание**: Это синхронное событие. + +**Сигнатура** + +```ts +on(eventName: 'beforeDefineCollection', listener: BeforeDefineCollectionListener): this +``` + +**Типы** + +```ts +import type { CollectionOptions } from '@nocobase/database'; + +export type BeforeDefineCollectionListener = ( + options: CollectionOptions, +) => void; +``` + +**Пример** + +```ts +db.on('beforeDefineCollection', (options) => { + // выполнить какие-то действия +}); +``` + +--- + +### `'afterDefineCollection'` + +Событие, вызываемое после определения таблицы данных, например, при вызове `db.collection()`. + +> **Примечание**: Это синхронное событие. + +**Сигнатура** + +```ts +on(eventName: 'afterDefineCollection', listener: AfterDefineCollectionListener): this +``` + +**Типы** + +```ts +import type { Collection } from '@nocobase/database'; + +export type AfterDefineCollectionListener = (collection: Collection) => void; +``` + +**Пример** + +```ts +db.on('afterDefineCollection', (collection) => { + // выполнить какие-то действия +}); +``` + +--- + +### `'beforeRemoveCollection'` / `'afterRemoveCollection'` + +События, вызываемые до или после удаления таблицы данных из памяти, например, при вызове `db.removeCollection()`. + +> **Примечание**: Это синхронные события. + +**Сигнатура** + +```ts +on(eventName: 'beforeRemoveCollection' | 'afterRemoveCollection', listener: RemoveCollectionListener): this +``` + +**Типы** + +```ts +import type { Collection } from '@nocobase/database'; + +export type RemoveCollectionListener = (collection: Collection) => void; +``` + +**Пример** + +```ts +db.on('beforeRemoveCollection', (collection) => { + // выполнить какие-то действия +}); + +db.on('afterRemoveCollection', (collection) => { + // выполнить какие-то действия +}); +``` diff --git a/docs/ru-RU/api/database/interfaces/base-interface.md b/docs/ru-RU/api/database/interfaces/base-interface.md new file mode 100644 index 0000000000..8fc3cf3473 --- /dev/null +++ b/docs/ru-RU/api/database/interfaces/base-interface.md @@ -0,0 +1,34 @@ +# BaseInterface (Базовый интерфейс) + +## Обзор + +BaseInterface является базовым классом для всех типов интерфейсов. Пользователи могут расширять этот класс для реализации собственной логики интерфейсов. + +```typescript +class CustomInterface extends BaseInterface { + async toValue(value: string, ctx?: any): Promise { + // Пользовательская логика преобразования в значение + } + + toString(value: any, ctx?: any) { + // Пользовательская логика преобразования в строку + } +} +// Регистрация интерфейса +db.interfaceManager.registerInterfaceType('customInterface', CustomInterface) +``` + +## Интерфейсы + +### toValue(value: string, ctx?: any): Promise + +Преобразует внешнюю строку в фактическое значение интерфейса, которое может быть напрямую передано в Repository для операций записи. + +### toString(value: any, ctx?: any) + +Преобразует фактическое значение интерфейса в строковый тип, который может использоваться для экспорта или отображения. + +Основные особенности: +1. **toValue** - выполняет десериализацию данных (например, преобразование строки JSON в объект) +2. **toString** - выполняет сериализацию данных (например, преобразование объекта в строку JSON) +3. Параметр **ctx** предоставляет контекст выполнения (например, текущего пользователя или запрос) diff --git a/docs/ru-RU/api/database/operators.md b/docs/ru-RU/api/database/operators.md new file mode 100644 index 0000000000..2f52a17d6e --- /dev/null +++ b/docs/ru-RU/api/database/operators.md @@ -0,0 +1,831 @@ +# Операторы фильтрации + +Используются в параметрах фильтрации методов `find`, `findOne`, `findAndCount`, `count` и других API репозитория: + +```ts +const repository = db.getRepository('books'); + +repository.find({ + filter: { + title: { + $eq: 'Весна и Осень', + }, + }, +}); +``` + +Для поддержки JSON NocoBase определяет операторы запроса как строки, начинающиеся с символа `$`. + +Кроме того, NocoBase предоставляет API для расширения операторов. Подробнее см. [`db.registerOperators()`](../database#registeroperators). + +## Общие операторы + +### `$eq` + +Проверяет, равно ли значение поля указанному значению. Аналог оператора `=` в SQL. + +**Пример** + +```ts +repository.find({ + filter: { + title: { + $eq: 'Весна и Осень', + }, + }, +}); +``` + +Эквивалентно `title: 'Весна и Осень'`. + +### `$ne` + +Проверяет, не равно ли значение поля указанному значению. Аналог оператора `!=` в SQL. + +**Пример** + +```ts +repository.find({ + filter: { + title: { + $ne: 'Весна и Осень', + }, + }, +}); +``` + +### `$is` + +Проверяет, является ли значение поля указанным значением. Аналог оператора `IS` в SQL. + +**Пример** + +```ts +repository.find({ + filter: { + title: { + $is: null, + }, + }, +}); +``` + +### `$not` + +Проверяет, не является ли значение поля указанным значением. Аналог оператора `IS NOT` в SQL. + +**Пример** + +```ts +repository.find({ + filter: { + title: { + $not: null, + }, + }, +}); +``` + +### `$col` + +Проверяет, равно ли значение поля значению другого поля. Аналог оператора `=` в SQL. + +**Пример** + +```ts +repository.find({ + filter: { + title: { + $col: 'name', + }, + }, +}); +``` + +### `$in` + +Проверяет, содержится ли значение поля в указанном массиве. Аналог оператора `IN` в SQL. + +**Пример** + +```ts +repository.find({ + filter: { + title: { + $in: ['Весна и Осень', 'Эпоха воюющих государств'], + }, + }, +}); +``` + +### `$notIn` + +Проверяет, не содержится ли значение поля в указанном массиве. Аналог оператора `NOT IN` в SQL. + +**Пример** + +```ts +repository.find({ + filter: { + title: { + $notIn: ['Весна и Осень', 'Эпоха воюющих государств'], + }, + }, +}); +``` + +### `$empty` + +Проверяет, пусто ли поле. Для строкового поля — пустая ли строка, для массива — пуст ли массив. + +**Пример** + +```ts +repository.find({ + filter: { + title: { + $empty: true, + }, + }, +}); +``` + +### `$notEmpty` + +Проверяет, не пусто ли поле. Для строкового поля — не пустая ли строка, для массива — не пуст ли массив. + +**Пример** + +```ts +repository.find({ + filter: { + title: { + $notEmpty: true, + }, + }, +}); +``` + +## Логические операторы + +### `$and` + +Логическое И. Аналог `AND` в SQL. + +**Пример** + +```ts +repository.find({ + filter: { + $and: [{ title: 'Книга песен' }, { isbn: '1234567890' }], + }, +}); +``` + +### `$or` + +Логическое ИЛИ. Аналог `OR` в SQL. + +**Пример** + +```ts +repository.find({ + filter: { + $or: [ + { title: 'Книга песен' }, + { publishedAt: { $lt: '0000-00-00T00:00:00Z' } }, + ], + }, +}); +``` + +## Операторы для полей типа Boolean + +Для полей с типом: `type: 'boolean'` + +### `$isFalsy` + +Проверяет, является ли значение логического поля ложным. Значения `false`, `0` и `NULL` считаются ложными (`$isFalsy: true`). + +**Пример** + +```ts +repository.find({ + filter: { + isPublished: { + $isFalsy: true, + }, + }, +}); +``` + +### `$isTruly` + +Проверяет, является ли значение логического поля истинным. Значения `true` и `1` считаются истинными (`$isTruly: true`). + +**Пример** + +```ts +repository.find({ + filter: { + isPublished: { + $isTruly: true, + }, + }, +}); +``` + +## Операторы для числовых типов + +Для полей числовых типов, включая: + +- `type: 'integer'` +- `type: 'float'` +- `type: 'double'` +- `type: 'real'` +- `type: 'decimal'` + +### `$gt` + +Проверяет, больше ли значение поля указанного значения. Аналог `>` в SQL. + +**Пример** + +```ts +repository.find({ + filter: { + price: { + $gt: 100, + }, + }, +}); +``` + +### `$gte` + +Проверяет, больше ли или равно ли значение поля указанному значению. Аналог `>=` в SQL. + +**Пример** + +```ts +repository.find({ + filter: { + price: { + $gte: 100, + }, + }, +}); +``` + +### `$lt` + +Проверяет, меньше ли значение поля указанного значения. Аналог `<` в SQL. + +**Пример** + +```ts +repository.find({ + filter: { + price: { + $lt: 100, + }, + }, +}); +``` + +### `$lte` + +Проверяет, меньше ли или равно ли значение поля указанному значению. Аналог `<=` в SQL. + +**Пример** + +```ts +repository.find({ + filter: { + price: { + $lte: 100, + }, + }, +}); +``` + +### `$between` + +Проверяет, находится ли значение поля в диапазоне между двумя указанными значениями. Аналог оператора `BETWEEN` в SQL. + +**Пример** + +```ts +repository.find({ + filter: { + price: { + $between: [100, 200], + }, + }, +}); +``` + +### `$notBetween` + +Проверяет, находится ли значение поля **не** в диапазоне между двумя указанными значениями. Аналог оператора `NOT BETWEEN` в SQL. + +**Пример** + +```ts +repository.find({ + filter: { + price: { + $notBetween: [100, 200], + }, + }, +}); +``` + +## Операторы для строковых полей + +Для полей строкового типа: `type: 'string'`. + +### `$includes` + +Проверяет, содержит ли строка указанную подстроку. + +**Пример** + +```ts +repository.find({ + filter: { + title: { + $includes: 'Три столпа китайской культуры', + }, + }, +}); +``` + +### `$notIncludes` + +Проверяет, **не** содержит ли строка указанную подстроку. + +**Пример** + +```ts +repository.find({ + filter: { + title: { + $notIncludes: 'Три столпа китайской культуры', + }, + }, +}); +``` + +### `$startsWith` + +Проверяет, начинается ли строка с указанной подстроки. + +**Пример** + +```ts +repository.find({ + filter: { + title: { + $startsWith: 'Три столпа китайской культуры', + }, + }, +}); +``` + +### `$notStatsWith` + +Проверяет, **не** начинается ли строка с указанной подстроки. +*(Примечание: вероятно, опечатка в оригинале — должно быть `$notStartsWith`.)* + +**Пример** + +```ts +repository.find({ + filter: { + title: { + $notStatsWith: 'Три столпа китайской культуры', + }, + }, +}); +``` + +### `$endsWith` + +Проверяет, заканчивается ли строка указанной подстрокой. + +**Пример** + +```ts +repository.find({ + filter: { + title: { + $endsWith: 'Три столпа китайской культуры', + }, + }, +}); +``` + +### `$notEndsWith` + +Проверяет, **не** заканчивается ли строка указанной подстрокой. + +**Пример** + +```ts +repository.find({ + filter: { + title: { + $notEndsWith: 'Три столпа китайской культуры', + }, + }, +}); +``` + +### `$like` + +Проверяет, содержит ли значение поля указанную строку. Аналог оператора `LIKE` в SQL. + +**Пример** + +```ts +repository.find({ + filter: { + title: { + $like: 'Компьютер', + }, + }, +}); +``` + +### `$notLike` + +Проверяет, **не** содержит ли значение поля указанную строку. Аналог оператора `NOT LIKE` в SQL. + +**Пример** + +```ts +repository.find({ + filter: { + title: { + $notLike: 'Компьютер', + }, + }, +}); +``` + +### `$iLike` + +Проверяет, содержит ли значение поля указанную строку без учёта регистра. Аналог оператора `ILIKE` в SQL (только для PostgreSQL). + +**Пример** + +```ts +repository.find({ + filter: { + title: { + $iLike: 'Компьютер', + }, + }, +}); +``` + +### `$notILike` + +Проверяет, **не** содержит ли значение поля указанную строку без учёта регистра. Аналог оператора `NOT ILIKE` в SQL (только для PostgreSQL). + +**Пример** + +```ts +repository.find({ + filter: { + title: { + $notILike: 'Компьютер', + }, + }, +}); +``` + +### `$regexp` + +Проверяет, соответствует ли значение поля указанному регулярному выражению. Аналог оператора `REGEXP` в SQL (только для PostgreSQL). + +**Пример** + +```ts +repository.find({ + filter: { + title: { + $regexp: '^Компьютер', + }, + }, +}); +``` + +### `$notRegexp` + +Проверяет, **не** соответствует ли значение поля указанному регулярному выражению. Аналог оператора `NOT REGEXP` в SQL (только для PostgreSQL). + +**Пример** + +```ts +repository.find({ + filter: { + title: { + $notRegexp: '^Компьютер', + }, + }, +}); +``` + +### `$iRegexp` + +Проверяет, соответствует ли значение поля указанному регулярному выражению без учёта регистра. Аналог оператора `~*` в SQL (только для PostgreSQL). + +**Пример** + +```ts +repository.find({ + filter: { + title: { + $iRegexp: '^КОМПЬЮТЕР', + }, + }, +}); +``` + +### `$notIRegexp` + +Проверяет, **не** соответствует ли значение поля указанному регулярному выражению без учёта регистра. Аналог оператора `!~*` в SQL (только для PostgreSQL). + +**Пример** + +```ts +repository.find({ + filter: { + title: { + $notIRegexp: '^КОМПЬЮТЕР', + }, + }, +}); +``` + +## Операторы для полей типа дата + +Для полей с типом: `type: 'date'`. + +### `$dateOn` + +Проверяет, попадает ли значение даты в указанный день. + +**Пример** + +```ts +repository.find({ + filter: { + createdAt: { + $dateOn: '2021-01-01', + }, + }, +}); +``` + +### `$dateNotOn` + +Проверяет, **не** попадает ли значение даты в указанный день. + +**Пример** + +```ts +repository.find({ + filter: { + createdAt: { + $dateNotOn: '2021-01-01', + }, + }, +}); +``` + +### `$dateBefore` + +Проверяет, находится ли значение даты до указанного момента, то есть меньше переданного значения. + +**Пример** + +```ts +repository.find({ + filter: { + createdAt: { + $dateBefore: '2021-01-01T00:00:00.000Z', + }, + }, +}); +``` + +### `$dateNotBefore` + +Проверяет, не находится ли значение поля даты **до** указанного момента, то есть значение должно быть **равно или больше** переданного. + +**Пример** + +```ts +repository.find({ + filter: { + createdAt: { + $dateNotBefore: '2021-01-01T00:00:00.000Z', + }, + }, +}); +``` + +--- + +### `$dateAfter` + +Проверяет, находится ли значение поля даты **после** указанного момента, то есть значение должно быть **больше** переданного. + +**Пример** + +```ts +repository.find({ + filter: { + createdAt: { + $dateAfter: '2021-01-01T00:00:00.000Z', + }, + }, +}); +``` + +--- + +### `$dateNotAfter` + +Проверяет, не находится ли значение поля даты **после** указанного момента, то есть значение должно быть **меньше или равно** переданному. +*(Примечание: в описании оригинала, вероятно, ошибка — должно быть "меньше или равно", а не "равно или больше".)* + +**Пример** + +```ts +repository.find({ + filter: { + createdAt: { + $dateNotAfter: '2021-01-01T00:00:00.000Z', + }, + }, +}); +``` + +--- + +## Операторы для полей типа массив + +Для полей с типом: `type: 'array'`. + +### `$match` + +Проверяет, совпадают ли значения массива со значениями указанного массива (полное совпадение). + +**Пример** + +```ts +repository.find({ + filter: { + tags: { + $match: ['литература', 'история'], + }, + }, +}); +``` + +--- + +### `$notMatch` + +Проверяет, **не** совпадают ли значения массива со значениями указанного массива. + +**Пример** + +```ts +repository.find({ + filter: { + tags: { + $notMatch: ['литература', 'история'], + }, + }, +}); +``` + +--- + +### `$anyOf` + +Проверяет, содержит ли массив **хотя бы одно** из значений указанного массива. + +**Пример** + +```ts +repository.find({ + filter: { + tags: { + $anyOf: ['литература', 'история'], + }, + }, +}); +``` + +--- + +### `$noneOf` + +Проверяет, **не содержит ни одного** из значений указанного массива. + +**Пример** + +```ts +repository.find({ + filter: { + tags: { + $noneOf: ['литература', 'история'], + }, + }, +}); +``` + +--- + +### `$arrayEmpty` + +Проверяет, является ли массив пустым. + +**Пример** + +```ts +repository.find({ + filter: { + tags: { + $arrayEmpty: true, + }, + }, +}); +``` + +--- + +### `$arrayNotEmpty` + +Проверяет, **не** является ли массив пустым. + +**Пример** + +```ts +repository.find({ + filter: { + tags: { + $arrayNotEmpty: true, + }, + }, +}); +``` + +--- + +## Операторы для связанных полей + +Для проверки существования связи. Поддерживаются типы полей: + +- `type: 'hasOne'` +- `type: 'hasMany'` +- `type: 'belongsTo'` +- `type: 'belongsToMany'` + +### `$exists` + +Проверяет, существует ли связанная запись. + +**Пример** + +```ts +repository.find({ + filter: { + author: { + $exists: true, + }, + }, +}); +``` + +### `$notExists` + +Проверяет, **не** существует ли связанная запись. + +**Пример** + +```ts +repository.find({ + filter: { + author: { + $notExists: true, + }, + }, +}); +``` diff --git a/docs/ru-RU/api/database/relation-repository/belongs-to-many-repository.md b/docs/ru-RU/api/database/relation-repository/belongs-to-many-repository.md new file mode 100644 index 0000000000..ba76caa8ac --- /dev/null +++ b/docs/ru-RU/api/database/relation-repository/belongs-to-many-repository.md @@ -0,0 +1,123 @@ +# BelongsToManyRepository (Репозиторий связи "многие ко многим") + +`BelongsToManyRepository` - это репозиторий для работы со связями типа "многие ко многим" (`BelongsToMany`). + +В отличие от других типов связей, связь "многие ко многим" требует наличия промежуточной таблицы. В NocoBase эта таблица может создаваться автоматически или указываться явно при определении связи. + +## Методы класса + +### `find()` + +Поиск связанных объектов. + +```typescript +async find(options?: FindOptions): Promise +``` + +Параметры запроса аналогичны [`Repository.find()`](../repository.md#find). + +### `findOne()` + +Поиск одного связанного объекта. + +```typescript +async findOne(options?: FindOneOptions): Promise +``` + +### `count()` + +Получение количества записей, соответствующих условиям. + +```typescript +async count(options?: CountOptions) +``` + +### `findAndCount()` + +Поиск данных с одновременным получением их количества. + +```typescript +async findAndCount(options?: FindAndCountOptions): Promise<[any[], number]> +``` + +### `create()` + +Создание связанных объектов. + +```typescript +async create(options?: CreateOptions): Promise +``` + +### `update()` + +Обновление связанных объектов по условиям. + +```typescript +async update(options?: UpdateOptions): Promise +``` + +### `destroy()` + +Удаление связанных объектов. + +```typescript +async destroy(options?: TargetKey | TargetKey[] | DestroyOptions): Promise +``` + +### `add()` + +Добавление новых связанных объектов. + +```typescript +async add( + options: TargetKey | TargetKey[] | PrimaryKeyWithThroughValues | PrimaryKeyWithThroughValues[] | AssociatedOptions +): Promise +``` + +Можно передавать: +- `targetKey` связанного объекта +- `targetKey` вместе со значениями полей промежуточной таблицы + +**Пример:** +```typescript +// Просто ID +PostTagRepository.add([t1.id, t2.id]); + +// С данными промежуточной таблицы +PostTagRepository.add([ + [t1.id, { tagged_at: '123' }], + [t2.id, { tagged_at: '456' }], +]); +``` + +### `set()` + +Установка связанных объектов. + +```typescript +async set( + options: TargetKey | TargetKey[] | PrimaryKeyWithThroughValues | PrimaryKeyWithThroughValues[] | AssociatedOptions, +): Promise +``` + +Параметры аналогичны методу `add()`. + +### `remove()` + +Удаление связи с указанными объектами. + +```typescript +async remove(options: TargetKey | TargetKey[] | AssociatedOptions) +``` + +### `toggle()` + +Переключение состояния связи. + +Полезно для сценариев типа "добавить/удалить из избранного". + +```typescript +async toggle(options: TargetKey | { tk?: TargetKey; transaction?: Transaction }): Promise +``` + +Метод автоматически проверяет наличие связи и либо добавляет, либо удаляет её. diff --git a/docs/ru-RU/api/database/relation-repository/belongs-to-repository.md b/docs/ru-RU/api/database/relation-repository/belongs-to-repository.md new file mode 100644 index 0000000000..81245fa943 --- /dev/null +++ b/docs/ru-RU/api/database/relation-repository/belongs-to-repository.md @@ -0,0 +1,3 @@ +## BelongsToRepository + +Интерфейс такой же, как у [HasOneRepository](./has-one-repository.md). `BelongsToRepository` - это хранилище для обработки отношений `belongsTo`, и оно предоставляет несколько удобных методов для обработки отношений `belongsTo`. diff --git a/docs/ru-RU/api/database/relation-repository/has-many-repository.md b/docs/ru-RU/api/database/relation-repository/has-many-repository.md new file mode 100644 index 0000000000..994826c1eb --- /dev/null +++ b/docs/ru-RU/api/database/relation-repository/has-many-repository.md @@ -0,0 +1,96 @@ +# HasManyRepository (Репозиторий связи "один ко многим") + +`HasManyRepository` - это репозиторий для работы со связями типа "один ко многим" (`HasMany`). + +## Методы класса + +### `find()` + +Поиск связанных объектов. + +```typescript +async find(options?: FindOptions): Promise +``` + +Параметры запроса аналогичны [`Repository.find()`](../repository.md#find). + +### `findOne()` + +Поиск одного связанного объекта. + +```typescript +async findOne(options?: FindOneOptions): Promise +``` + +### `count()` + +Получение количества записей, соответствующих условиям. + +```typescript +async count(options?: CountOptions) +``` + +### `findAndCount()` + +Поиск данных с одновременным получением их количества. + +```typescript +async findAndCount(options?: FindAndCountOptions): Promise<[any[], number]> +``` + +### `create()` + +Создание связанных объектов. + +```typescript +async create(options?: CreateOptions): Promise +``` + +### `update()` + +Обновление связанных объектов по условиям. + +```typescript +async update(options?: UpdateOptions): Promise +``` + +### `destroy()` + +Удаление связанных объектов. + +```typescript +async destroy(options?: TK | DestroyOptions): Promise +``` + +### `add()` + +Добавление связей между объектами. + +```typescript +async add(options: TargetKey | TargetKey[] | AssociatedOptions) +``` + +Параметры: +- `tk` - идентификатор связанного объекта (может быть массивом) +- Поддержка транзакций + +### `remove()` + +Удаление связи с указанными объектами. + +```typescript +async remove(options: TargetKey | TargetKey[] | AssociatedOptions) +``` + +Параметры аналогичны методу `add()`. + +### `set()` + +Установка связанных объектов для текущей связи. + +```typescript +async set(options: TargetKey | TargetKey[] | AssociatedOptions) +``` + +Параметры аналогичны методу `add()`. + diff --git a/docs/ru-RU/api/database/relation-repository/has-one-repository.md b/docs/ru-RU/api/database/relation-repository/has-one-repository.md new file mode 100644 index 0000000000..04ce6df087 --- /dev/null +++ b/docs/ru-RU/api/database/relation-repository/has-one-repository.md @@ -0,0 +1,142 @@ +# HasOneRepository (Репозиторий связи "один к одному") + +## Обзор + +`HasOneRepository` - это репозиторий для работы со связями типа "один к одному" (`HasOne`). + +```typescript +// Определение коллекций +const User = db.collection({ + name: 'users', + fields: [ + { type: 'hasOne', name: 'profile' }, // Связь один-к-одному + { type: 'string', name: 'name' }, + ], +}); + +const Profile = db.collection({ + name: 'profiles', + fields: [{ type: 'string', name: 'avatar' }], +}); + +// Создание пользователя +const user = await User.repository.create({ + values: { name: 'u1' }, +}); + +// Получение репозитория связи +const userProfileRepository = User.repository + .relation('profile') + .of(user.get('id')); + +// Или прямая инициализация +new HasOneRepository(User, 'profile', user.get('id')); +``` + +## Методы класса + +### `find()` + +Поиск связанного объекта. + +```typescript +async find(options?: SingleRelationFindOption): Promise | null> +``` + +**Параметры:** +```typescript +interface SingleRelationFindOption extends Transactionable { + fields?: Fields; // Поля для выборки + except?: Except; // Исключаемые поля + appends?: Appends; // Дополнительные поля + filter?: Filter; // Условия фильтрации +} +``` + +**Пример:** +```typescript +const profile = await UserProfileRepository.find(); +// Возвращает null, если связанный объект не существует +``` + +### `create()` + +Создание связанного объекта. + +```typescript +async create(options?: CreateOptions): Promise +``` + +**Пример:** +```typescript +const profile = await UserProfileRepository.create({ + values: { avatar: 'avatar1' }, +}); +``` + +### `update()` + +Обновление связанного объекта. + +```typescript +async update(options: UpdateOptions): Promise +``` + +**Пример:** +```typescript +const profile = await UserProfileRepository.update({ + values: { avatar: 'avatar2' }, +}); +``` + +### `remove()` + +Удаление связи (без удаления самого объекта). + +```typescript +async remove(options?: Transactionable): Promise +``` + +**Пример:** +```typescript +await UserProfileRepository.remove(); +``` + +### `destroy()` + +Удаление связанного объекта. + +```typescript +async destroy(options?: Transactionable): Promise +``` + +**Пример:** +```typescript +await UserProfileRepository.destroy(); +``` + +### `set()` + +Установка связанного объекта. + +```typescript +async set(options: TargetKey | SetOption): Promise +``` + +**Параметры:** +```typescript +interface SetOption extends Transactionable { + tk?: TargetKey; // Идентификатор связанного объекта +} +``` + +**Пример:** +```typescript +const newProfile = await Profile.repository.create({ + values: { avatar: 'avatar2' }, +}); + +await UserProfileRepository.set(newProfile.get('id')); +``` + +Все методы поддерживают работу с транзакциями через параметр `transaction`. Если транзакция не передана, методы создают внутреннюю транзакцию автоматически. diff --git a/docs/ru-RU/api/database/relation-repository/index.md b/docs/ru-RU/api/database/relation-repository/index.md new file mode 100644 index 0000000000..926d2dbf60 --- /dev/null +++ b/docs/ru-RU/api/database/relation-repository/index.md @@ -0,0 +1,56 @@ +# RelationRepository (Репозиторий для связей) + +`RelationRepository` - это объект `Repository` для работы с реляционными связями, позволяющий выполнять операции над связанными данными без их предварительной загрузки. На основе `RelationRepository` реализованы специализированные репозитории для каждого типа связей: + +- [`HasOneRepository`](#has-one-repository) (один-к-одному) +- `HasManyRepository` (один-ко-многим) +- `BelongsToRepository` (многие-к-одному) +- `BelongsToManyRepository` (многие-ко-многим) + +## Конструктор + +**Сигнатура** + +- `constructor(sourceCollection: Collection, association: string, sourceKeyValue: string | number)` + +**Параметры** + +| Название параметра | Тип | Значение по умолчанию | Описание | +|--------------------|-------------------|-----------------------|-----------------------------------------------------------| +| `sourceCollection` | `Collection` | - | Коллекция, содержащая ссылку в отношении | +| `association` | `string` | - | Название связи | +| `sourceKeyValue` | `string \| number`| - | Ключевое значение соответствующей ссылки в отношении | + +## Свойства базового класса + +### `db: Database` + +Объект базы данных + +### `sourceCollection` + +Коллекция, содержащая ссылку в отношении + +### `targetCollection` + +Коллекция, на которую ссылается отношение + +### `association` + +Объект ассоциации Sequelize, соответствующий текущей связи + +### `associationField` + +Поле в коллекции, соответствующее текущей связи + +### `sourceKeyValue` + +Ключевое значение соответствующей ссылки в отношении + +## Основные особенности + +1. Позволяет работать со связанными данными без их явной загрузки +2. Предоставляет единый интерфейс для разных типов связей +3. Автоматически определяет тип связи и соответствующее поведение +4. Поддерживает транзакции на уровне базы данных +5. Интегрирован с системой коллекций NocoBase diff --git a/docs/ru-RU/api/database/repository.md b/docs/ru-RU/api/database/repository.md new file mode 100644 index 0000000000..c22c5c4686 --- /dev/null +++ b/docs/ru-RU/api/database/repository.md @@ -0,0 +1,693 @@ +# Репозиторий (Repository) + +## Обзор + +Для любого объекта `Collection` можно получить соответствующий объект `Repository`, чтобы выполнять операции чтения и записи с таблицей данных. + +```javascript +const { UserCollection } = require('./collections'); + +const UserRepository = UserCollection.repository; + +const user = await UserRepository.findOne({ + filter: { + id: 1, + }, +}); + +user.name = 'новое имя'; +await user.save(); +``` + +### Запросы + +#### Базовые запросы + +На объекте `Repository` можно вызывать методы `find*` для выполнения запросов. Все методы запроса поддерживают параметр `filter` для фильтрации данных. + +```javascript +// SELECT * FROM users WHERE id = 1 +userRepository.find({ + filter: { + id: 1, + }, +}); +``` + +#### Операторы + +Параметр `filter` в `Repository` также поддерживает множество операторов для более сложных запросов. + +```javascript +// SELECT * FROM users WHERE age > 18 +userRepository.find({ + filter: { + age: { + $gt: 18, + }, + }, +}); + +// SELECT * FROM users WHERE age > 18 OR name LIKE '%张%' +userRepository.find({ + filter: { + $or: [{ age: { $gt: 18 } }, { name: { $like: '%张%' } }], + }, +}); +``` + +Более подробную информацию об операторах см. в разделе [Операторы фильтрации](/api/database/operators). + +#### Управление полями + +Управляйте выводимыми полями с помощью параметров `fields`, `except` и `appends` при выполнении запроса. + +- `fields`: указывает, какие поля включить в результат +- `except`: исключает указанные поля из результата +- `appends`: добавляет связанные поля в результат + +```javascript +// Результат содержит только поля id и name +userRepository.find({ + fields: ['id', 'name'], +}); + +// Результат не содержит поле password +userRepository.find({ + except: ['password'], +}); + +// Результат содержит данные связанных объектов posts +userRepository.find({ + appends: ['posts'], +}); +``` + +#### Запросы по связанным полям + +Параметр `filter` поддерживает фильтрацию по связанным полям, например: + +```javascript +// Найти пользователей, у которых связанные посты имеют заголовок "post title" +userRepository.find({ + filter: { + 'posts.title': 'post title', + }, +}); +``` + +Связанные поля могут быть вложенными: + +```javascript +// Найти пользователей, у которых в комментариях к постам содержится "keywords" +await userRepository.find({ + filter: { + 'posts.comments.content': { + $like: '%keywords%', + }, + }, +}); +``` + +#### Сортировка + +Управляйте порядком сортировки с помощью параметра `sort`. + +```javascript +// SELECT * FROM users ORDER BY age +await userRepository.find({ + sort: 'age', +}); + +// SELECT * FROM users ORDER BY age DESC +await userRepository.find({ + sort: '-age', +}); + +// SELECT * FROM users ORDER BY age DESC, name ASC +await userRepository.find({ + sort: ['-age', 'name'], +}); +``` + +Поддерживается сортировка по полям связанных объектов: + +```javascript +await userRepository.find({ + sort: 'profile.createdAt', +}); +``` + +### Создание + +#### Базовое создание + +Создавайте новые объекты данных с помощью `Repository`. + +```javascript +await userRepository.create({ + name: 'Mark', + age: 18, +}); +// INSERT INTO users (name, age) VALUES ('Mark', 18) + +// Массовое создание +await userRepository.create([ + { + name: 'Mark', + age: 18, + }, + { + name: 'Alex', + age: 20, + }, +]); +``` + +#### Создание связей + +Можно создавать связанные объекты одновременно с созданием основного объекта. Как и в запросах, поддерживаются вложенные связи. Например: + +```javascript +await userRepository.create({ + name: 'Mark', + age: 18, + posts: [ + { + title: 'заголовок поста', + content: 'содержание поста', + tags: [ + { + name: 'тег1', + }, + { + name: 'тег2', + }, + ], + }, + ], +}); +// При создании пользователя также создаётся пост, связанный с ним, и теги, связанные с постом +``` + +Если связанный объект уже существует в базе данных, можно передать его ID, чтобы установить с ним связь. + +```javascript +const tag1 = await tagRepository.findOne({ + filter: { + name: 'тег1', + }, +}); + +await userRepository.create({ + name: 'Mark', + age: 18, + posts: [ + { + title: 'заголовок поста', + content: 'содержание поста', + tags: [ + { + id: tag1.id, // установить связь с существующим объектом + }, + { + name: 'тег2', + }, + ], + }, + ], +}); +``` + +### Обновление + +#### Базовое обновление + +После получения объекта данных можно напрямую изменить его свойства (объект `Model`) и затем вызвать метод `save()` для сохранения изменений. + +```javascript +const user = await userRepository.findOne({ + filter: { + name: 'Mark', + }, +}); + +user.age = 20; +await user.save(); +``` + +Объект данных `Model` наследуется от Sequelize Model. Подробнее о работе с `Model` см. в [Sequelize Model](https://sequelize.org/master/manual/model-basics.html). + +Также можно обновлять данные через `Repository`: + +```javascript +// Обновить записи, соответствующие условию фильтрации +await userRepository.update({ + filter: { + name: 'Mark', + }, + values: { + age: 20, + }, +}); +``` + +Управляйте полями для обновления с помощью параметров `whitelist` и `blacklist`, например: + +```javascript +await userRepository.update({ + filter: { + name: 'Mark', + }, + values: { + age: 20, + name: 'Alex', + }, + whitelist: ['age'], // Обновлять только поле age +}); +``` + +#### Обновление связанных полей + +При обновлении можно устанавливать связанные объекты, например: + +```javascript +const tag1 = await tagRepository.findOne({ + filter: { + id: 1, + }, +}); + +await postRepository.update({ + filter: { + id: 1, + }, + values: { + title: 'новый заголовок поста', + tags: [ + { + id: tag1.id, // связать с tag1 + }, + { + name: 'тег2', // создать новый тег и связать с ним + }, + ], + }, +}); + +await postRepository.update({ + filter: { + id: 1, + }, + values: { + tags: null, // отвязать пост от тегов + }, +}); +``` + +### Удаление + +Вызовите метод `destroy()` в `Repository` для удаления записей. Для удаления необходимо указать условие фильтрации. + +```javascript +await userRepository.destroy({ + filter: { + status: 'blocked', + }, +}); +``` + +## Конструктор + +Как правило, конструктор не вызывается напрямую разработчиком. Экземпляр создаётся автоматически при указании соответствующего типа репозитория, зарегистрированного в параметре `db.collection()`. Тип репозитория регистрируется с помощью `db.registerRepositories()`. + +**Сигнатура** + +- `constructor(collection: Collection)` + +**Пример** + +```ts +import { Repository } from '@nocobase/database'; + +class MyRepository extends Repository { + async myQuery(sql) { + return this.database.sequelize.query(sql); + } +} + +db.registerRepositories({ + books: MyRepository, +}); + +db.collection({ + name: 'books', + // здесь указывается зарегистрированный репозиторий + repository: 'books', +}); + +await db.sync(); + +const books = db.getRepository('books') as MyRepository; +await books.myQuery('SELECT * FROM books;'); +``` + +## Экземплярные свойства + +### `database` + +Экземпляр менеджера базы данных, в контексте которого работает репозиторий. + +### `collection` + +Соответствующий экземпляр менеджера таблицы данных. + +### `model` + +Соответствующий класс модели данных. + +## Методы экземпляра + +### `find()` + +Находит набор данных из базы данных по заданным условиям фильтрации, сортировке и другим параметрам. + +**Сигнатура** + +- `async find(options?: FindOptions): Promise` + +**Типы** + +```typescript +type Filter = FilterWithOperator | FilterWithValue | FilterAnd | FilterOr; +type Appends = string[]; +type Except = string[]; +type Fields = string[]; +type Sort = string[] | string; + +interface SequelizeFindOptions { + limit?: number; + offset?: number; +} + +interface FilterByTk { + filterByTk?: TargetKey; +} + +interface CommonFindOptions extends Transactionable { + filter?: Filter; + fields?: Fields; + appends?: Appends; + except?: Except; + sort?: Sort; +} + +type FindOptions = SequelizeFindOptions & CommonFindOptions & FilterByTk; +``` + +**Подробное описание** + +#### `filter: Filter` + +Условия запроса для фильтрации результатов. В передаваемых параметрах `key` — имя поля, `value` — соответствующее значение. Можно использовать операторы и комбинировать условия фильтрации. + +```typescript +// Найти записи с именем "foo" и возрастом больше 18 +repository.find({ + filter: { + name: 'foo', + age: { + $gt: 18, + }, + }, +}); +``` + +Подробнее об операторах см. в разделе [Операторы](./operators.md). + +#### `filterByTk: TargetKey` + +Поиск данных по `TargetKey` — это сокращённый способ указать параметр `filter`. Поле `TargetKey` можно [настроить](./collection.md#filtertargetkey) в `Collection`, по умолчанию используется первичный ключ (`primaryKey`). + +```typescript +// По умолчанию найти запись с id = 1 +repository.find({ + filterByTk: 1, +}); +``` + +#### `fields: string[]` + +Список запрашиваемых колонок. Используется для управления тем, какие поля данных будут возвращены. При использовании этого параметра возвращаются только указанные поля. + +#### `except: string[]` + +Исключаемые колонки. Используется для управления выводом полей — указанные поля не будут включены в результат. + +#### `appends: string[]` + +Дополнительные колонки. Используется для загрузки связанных данных. При указании этого параметра возвращаются также данные из указанных связанных полей. + +#### `sort: string[] | string` + +Задаёт порядок сортировки результатов запроса. Параметр — имя поля. По умолчанию сортировка по возрастанию (`asc`). Чтобы отсортировать по убыванию (`desc`), перед именем поля нужно поставить символ `-`. Например, `['-id', 'name']` означает сортировку по `id desc, name asc`. + +#### `limit: number` + +Ограничивает количество возвращаемых результатов, аналог `LIMIT` в SQL. + +#### `offset: number` + +Смещение для запроса, аналог `OFFSET` в SQL. + +**Пример** + +```ts +const posts = db.getRepository('posts'); + +const results = await posts.find({ + filter: { + createdAt: { + $gt: '2022-01-01T00:00:00.000Z', + }, + }, + fields: ['title'], + appends: ['user'], +}); +``` + +--- + +### `findOne()` + +Находит одну запись из базы данных по заданным условиям. Аналог `Model.findOne()` в Sequelize. + +**Сигнатура** + +- `async findOne(options?: FindOneOptions): Promise` + + + +**Пример** + +```ts +const posts = db.getRepository('posts'); + +const result = await posts.findOne({ + filterByTk: 1, +}); +``` + +--- + +### `count()` + +Подсчитывает количество записей, соответствующих заданным условиям. Аналог `Model.count()` в Sequelize. + +**Сигнатура** + +- `count(options?: CountOptions): Promise` + +**Типы** + +```typescript +interface CountOptions + extends Omit, + Transactionable { + filter?: Filter; +} +``` + +**Пример** + +```ts +const books = db.getRepository('books'); + +const count = await books.count({ + filter: { + title: 'Три столпа китайской культуры', + }, +}); +``` + +--- + +### `findAndCount()` + +Находит набор данных по заданным условиям и возвращает одновременно сами данные и их количество. Аналог `Model.findAndCountAll()` в Sequelize. + +**Сигнатура** + +- `async findAndCount(options?: FindAndCountOptions): Promise<[Model[], number]>` + +**Типы** + +```typescript +type FindAndCountOptions = Omit< + SequelizeAndCountOptions, + 'where' | 'include' | 'order' +> & + CommonFindOptions; +``` + +### `findAndCount()` + +**Подробное описание** + +Параметры запроса те же, что и у метода `find()`. Возвращается массив, где первый элемент — результаты запроса, а второй — общее количество найденных записей. + +--- + +### `create()` + +Добавляет новую запись в таблицу данных. Аналог `Model.create()` в Sequelize. Если создаваемый объект содержит связанные поля, то соответствующие связанные записи также будут созданы или обновлены одновременно. + +**Сигнатура** + +- `async create(options: CreateOptions): Promise` + + + +**Пример** + +```ts +const posts = db.getRepository('posts'); + +const result = await posts.create({ + values: { + title: 'Заметки о релизе NocoBase 1.0', + tags: [ + // Обновление данных, если указан первичный ключ связанной таблицы + { id: 1 }, + // Создание новой записи, если первичный ключ не указан + { name: 'NocoBase' }, + ], + }, +}); +``` + +--- + +### `createMany()` + +Добавляет несколько новых записей в таблицу данных. Эквивалентно многократному вызову метода `create()`. + +**Сигнатура** + +- `createMany(options: CreateManyOptions): Promise` + +**Типы** + +```typescript +interface CreateManyOptions extends BulkCreateOptions { + records: Values[]; +} +``` + +**Подробное описание** + +- `records`: массив объектов данных, которые необходимо создать. +- `transaction`: объект транзакции. Если параметр транзакции не передан, метод автоматически создаст внутреннюю транзакцию. + +**Пример** + +```ts +const posts = db.getRepository('posts'); + +const results = await posts.createMany({ + records: [ + { + title: 'Заметки о релизе NocoBase 1.0', + tags: [ + // Обновление записи по id + { id: 1 }, + // Создание новой записи + { name: 'NocoBase' }, + ], + }, + { + title: 'Заметки о релизе NocoBase 1.1', + tags: [{ id: 1 }], + }, + ], +}); +``` + +--- + +### `update()` + +Обновляет данные в таблице. Аналог `Model.update()` в Sequelize. Если обновляемый объект содержит связанные поля, то соответствующие связанные записи также будут созданы или обновлены. + +**Сигнатура** + +- `async update(options: UpdateOptions): Promise` + + + +**Пример** + +```ts +const posts = db.getRepository('posts'); + +const result = await posts.update({ + filterByTk: 1, + values: { + title: 'Заметки о релизе NocoBase 1.0', + tags: [ + // Обновление по id + { id: 1 }, + // Создание новой записи + { name: 'NocoBase' }, + ], + }, +}); +``` + +--- + +### `destroy()` + +Удаляет данные из таблицы. Аналог `Model.destroy()` в Sequelize. + +**Сигнатура** + +- `async destroy(options?: TargetKey | TargetKey[] | DestroyOptions): Promise` + +**Типы** + +```typescript +interface DestroyOptions extends SequelizeDestroyOptions { + filter?: Filter; + filterByTk?: TargetKey | TargetKey[]; + truncate?: boolean; + context?: any; +} +``` + +**Подробное описание** + +- `filter`: задаёт условия фильтрации для удаляемых записей. Подробнее об использовании фильтра см. в методе [`find()`](#find). +- `filterByTk`: указывает первичный ключ (или массив ключей) записи, которую нужно удалить. Это сокращённый способ задать условие фильтрации по первичному ключу.tering conditions by TargetKey. +- `truncate`: Whether to empty the table data, this parameter is valid if no `filter` or `filterByTk` parameter is passed. +- `transaction`: Transaction object. If no transaction parameter is passed, the method will automatically create an internal transaction. diff --git a/docs/ru-RU/api/database/shared.md b/docs/ru-RU/api/database/shared.md new file mode 100644 index 0000000000..97da70c781 --- /dev/null +++ b/docs/ru-RU/api/database/shared.md @@ -0,0 +1,8 @@ +**Параметры** + +| Имя параметра | Тип | По умолчанию | Описание | +|-------------------------|---------------|--------------|-----------------------------------------------------------| +| `options.values` | `M` | `{}` | Объект данных, который будет вставлен | +| `options.whitelist?` | `string[]` | — | Белый список для поля `values`; будут сохранены только поля, указанные в списке | +| `options.blacklist?` | `string[]` | — | Чёрный список для поля `values`; поля из списка сохранены не будут | +| `options.transaction?` | `Transaction` | — | Транзакция | diff --git a/docs/ru-RU/api/database/shared/create-options.md b/docs/ru-RU/api/database/shared/create-options.md new file mode 100644 index 0000000000..2ad597e64b --- /dev/null +++ b/docs/ru-RU/api/database/shared/create-options.md @@ -0,0 +1,43 @@ +# Типы и интерфейсы для создания записей + +## Типы + +```typescript +type WhiteList = string[]; // Тип для белого списка полей +type BlackList = string[]; // Тип для черного списка полей +type AssociationKeysToBeUpdate = string[]; // Тип для списка связей, которые нужно обновить +``` + +## Интерфейс CreateOptions + +```typescript +interface CreateOptions extends SequelizeCreateOptions { + values?: Values; // Объект данных для создаваемой записи + whitelist?: WhiteList; // Список разрешенных для записи полей + blacklist?: BlackList; // Список запрещенных для записи полей + updateAssociationValues?: AssociationKeysToBeUpdate; // Список связей для обновления + context?: any; // Контекст выполнения +} +``` + +## Детализация параметров + +1. **values** + Объект данных, содержащий значения для создаваемой записи. + +2. **whitelist** + Определяет, какие поля в объекте данных **разрешены для записи**. + *Если параметр не передан, по умолчанию разрешены все поля.* + +3. **blacklist** + Определяет, какие поля в объекте данных **запрещены для записи**. + *Если параметр не передан, по умолчанию разрешены все поля.* + +4. **transaction** + Объект транзакции. Если параметр не передан, метод автоматически создает внутреннюю транзакцию. + +5. **updateAssociationValues** + Список связей, которые необходимо обновить при создании записи. + +6. **context** + Контекст выполнения операции, может содержать дополнительную информацию (например, данные пользователя). diff --git a/docs/ru-RU/api/database/shared/destroy-options.md b/docs/ru-RU/api/database/shared/destroy-options.md new file mode 100644 index 0000000000..cc9f9606a9 --- /dev/null +++ b/docs/ru-RU/api/database/shared/destroy-options.md @@ -0,0 +1,31 @@ +# Интерфейс DestroyOptions + +```typescript +interface DestroyOptions extends SequelizeDestroyOptions { + filter?: Filter; // Условия фильтрации для удаляемых записей + filterByTk?: TargetKey | TargetKey[]; // Фильтрация по целевому ключу + truncate?: boolean; // Флаг очистки таблицы + context?: any; // Контекст выполнения +} +``` + +## Описание параметров + +1. **filter** + Определяет условия фильтрации для удаляемых записей. + *Подробнее об использовании Filter см. в методе [`find()`](#find).* + +2. **filterByTk** + Позволяет указать условия фильтрации по целевому ключу (TargetKey). + *Может принимать как одиночное значение ключа, так и массив ключей.* + +3. **truncate** + Флаг, определяющий нужно ли очищать всю таблицу. + *Действительно только если не переданы параметры `filter` или `filterByTk`.* + +4. **transaction** + Объект транзакции. + *Если параметр не указан, метод автоматически создает внутреннюю транзакцию.* + +5. **context** + Контекст выполнения операции, может содержать дополнительную информацию. diff --git a/docs/ru-RU/api/database/shared/find-one.md b/docs/ru-RU/api/database/shared/find-one.md new file mode 100644 index 0000000000..709460ef38 --- /dev/null +++ b/docs/ru-RU/api/database/shared/find-one.md @@ -0,0 +1,22 @@ +# Тип FindOneOptions + +```typescript +type FindOneOptions = Omit; +``` + +**Описание параметров** + +Большинство параметров совпадают с параметрами метода `find()`. Основное отличие заключается в том, что `findOne()` возвращает только одну запись, поэтому: + +1. Параметр `limit` исключен из типа, так как: + - Для `findOne()` всегда подразумевается выбор только одной записи + - Лимит автоматически устанавливается в значение `1` + +2. Метод всегда возвращает: + - Единственный объект данных (если запись найдена) + - `null` (если запись не найдена) + +**Особенности работы:** +- Поддерживает все остальные параметры фильтрации и сортировки из `FindOptions` +- Оптимизирован для поиска единичной записи +- Автоматически добавляет ограничение `LIMIT 1` в SQL-запрос diff --git a/docs/ru-RU/api/database/shared/find-options.md b/docs/ru-RU/api/database/shared/find-options.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/ru-RU/api/database/shared/transaction.md b/docs/ru-RU/api/database/shared/transaction.md new file mode 100644 index 0000000000..dd16182272 --- /dev/null +++ b/docs/ru-RU/api/database/shared/transaction.md @@ -0,0 +1 @@ +- `транзакция`: объект транзакции. Если параметр транзакции не передан, метод автоматически создаст внутреннюю транзакцию. diff --git a/docs/ru-RU/api/database/shared/update-options.md b/docs/ru-RU/api/database/shared/update-options.md new file mode 100644 index 0000000000..fe12cca43a --- /dev/null +++ b/docs/ru-RU/api/database/shared/update-options.md @@ -0,0 +1,45 @@ +# Интерфейс UpdateOptions + +```typescript +interface UpdateOptions extends Omit { + values: Values; // Объект данных для обновления + filter?: Filter; // Условия фильтрации записей + filterByTk?: TargetKey; // Фильтрация по целевому ключу + whitelist?: WhiteList; // Белый список полей + blacklist?: BlackList; // Черный список полей + updateAssociationValues?: AssociationKeysToBeUpdate; // Связи для обновления + context?: any; // Контекст выполнения +} +``` + +## Детализация параметров + +1. **values** (обязательный) + Объект данных, содержащий новые значения для обновляемых записей. + +2. **filter** + Условия фильтрации записей для обновления. + *Подробнее об использовании Filter см. в методе [`find()`](#find).* + +3. **filterByTk** + Позволяет указать целевую запись для обновления по первичному ключу. + +4. **whitelist** + Список полей, которые разрешено обновлять. + *Только указанные поля будут изменены.* + +5. **blacklist** + Список полей, которые запрещено обновлять. + *Указанные поля останутся без изменений.* + +6. **transaction** + Объект транзакции. + *Если не указан, создается автоматически.* + +7. **updateAssociationValues** + Список связей, которые нужно обновить вместе с основной записью. + +8. **context** + Дополнительный контекст выполнения операции. + +**Важно!** Должен быть указан хотя бы один из параметров: `filterByTk` или `filter`. diff --git a/docs/ru-RU/api/field/markdown-vditor/index.md b/docs/ru-RU/api/field/markdown-vditor/index.md new file mode 100644 index 0000000000..b8ac3c05f1 --- /dev/null +++ b/docs/ru-RU/api/field/markdown-vditor/index.md @@ -0,0 +1,7 @@ +# markdown + +## Пример + +Это встроенный редактор Markdown: + + diff --git a/docs/ru-RU/api/handlebars-helpers/array.md b/docs/ru-RU/api/handlebars-helpers/array.md new file mode 100644 index 0000000000..0a01b67363 --- /dev/null +++ b/docs/ru-RU/api/handlebars-helpers/array.md @@ -0,0 +1,545 @@ +# Массив + +## {{after}} + +Возвращает все элементы массива, следующие после указанного индекса. Противоположность вспомогательной функции [before](#before). + +**Параметры** + +* `array` **{Array}**: Коллекция +* `n` **{Number}**: Начальный индекс (количество элементов, которые нужно исключить) +* `returns` **{Array}**: Массив, исключающий `n` первых элементов. + +**Пример** + +```handlebars + +{{after array 1}} + +``` + +## {{arrayify}} + +Преобразует заданное значение `value` в массив. + +**Параметры** + +* `value` **{any}** +* `returns` **{Array}** + +**Пример** + +```handlebars +{{arrayify "foo"}} + +``` + +## {{before}} + +Возвращает все элементы коллекции, расположенные до указанного количества. Противоположность [after](#after). + +**Параметры** + +* `array` **{Array}** +* `n` **{Number}** +* `returns` **{Array}**: Массив, исключающий элементы после указанного числа. + +**Пример** + +```handlebars + +{{before array 2}} + +``` + +## {{eachIndex}} + +**Параметры** + +* `array` **{Array}** +* `options` **{Object}** +* `returns` **{String}** + +**Пример** + +```handlebars + +{{#eachIndex array}} + {{item}} — это {{index}} +{{/eachIndex}} +``` + +## {{filter}} + +Блочный хелпер, который фильтрует заданный массив и отображает блок для значений, оцениваемых как `true`, в противном случае возвращается блок `else`. + +**Параметры** + +* `array` **{Array}** +* `value` **{any}** +* `options` **{Object}** +* `returns` **{String}** + +**Пример** + +```handlebars + +{{#filter array "foo"}}AAA{{else}}BBB{{/filter}} + +``` + +## {{first}} + +Возвращает первый элемент или первые `n` элементов массива. + +**Параметры** + +* `array` **{Array}** +* `n` **{Number}**: Количество элементов для возврата, начиная с `0`. +* `returns` **{Array}** + +**Пример** + +```handlebars +{{first "['a', 'b', 'c', 'd', 'e']" 2}} + +``` + +## {{forEach}} + +Перебирает каждый элемент массива и предоставляет текущий элемент в качестве контекста внутреннему блоку. Помимо текущего элемента массива, хелпер предоставляет следующие переменные: + +* `index` — индекс текущего элемента +* `total` — общее количество элементов +* `isFirst` — `true`, если элемент первый +* `isLast` — `true`, если элемент последний + +Также доступна приватная переменная `@index`, а дополнительные приватные переменные могут быть заданы через хэш-аргументы. + +**Параметры** + +* `array` **{Array}** +* `returns` **{String}** + +**Пример** + +```handlebars + + +{{#forEach accounts}} + + {{ name }} + {{#unless isLast}}, {{/unless}} +{{/forEach}} +``` + +## {{inArray}} + +Блочный хелпер, который отображает блок, если массив содержит заданное `value`. Можно указать блок `else`, который будет отображаться, если значение не найдено. + +**Параметры** + +* `array` **{Array}** +* `value` **{any}** +* `options` **{Object}** +* `returns` **{String}** + +**Пример** + +```handlebars + +{{#inArray array "d"}} + foo +{{else}} + bar +{{/inArray}} + +``` + +## {{isArray}} + +Возвращает `true`, если `value` является массивом ES5. + +**Параметры** + +* `value` **{any}**: Значение для проверки. +* `returns` **{Boolean}** + +**Пример** + +```handlebars +{{isArray "abc"}} + + + +{{isArray array}} + +``` + +## {{itemAt}} + +Возвращает элемент из `array` по индексу `idx`. + +**Параметры** + +* `array` **{Array}** +* `idx` **{Number}** +* `returns` **{any}** `value` + +**Пример** + +```handlebars + +{{itemAt array 1}} + +``` + +## {{join}} + +Объединяет все элементы массива в строку, при этом можно указать разделитель (по умолчанию — запятая). + +**Параметры** + +* `array` **{Array}** +* `separator` **{String}**: Разделитель. По умолчанию: `,`. +* `returns` **{String}** + +**Пример** + +```handlebars + +{{join array}} + + +{{join array '-'}} + +``` + +## {{equalsLength}} + +Возвращает `true`, если длина заданного `value` равна указанному `length`. Может использоваться как блочный или встроенный хелпер. + +**Параметры** + +* `value` **{Array|String}** +* `length` **{Number}** +* `options` **{Object}** +* `returns` **{String}** + +## {{last}} + +Возвращает последний элемент или последние `n` элементов массива или строки. Противоположность [first](#first). + +**Параметры** + +* `value` **{Array|String}**: Массив или строка. +* `n` **{Number}**: Количество элементов для возврата с конца. +* `returns` **{Array}** + +**Пример** + +```handlebars + + +{{last value}} + + +{{last value 2}} + + +{{last value 3}} + +``` + +## {{length}} + +Возвращает длину заданной строки или массива. + +**Параметры** + +* `value` **{Array|Object|String}** +* `returns` **{Number}**: Длина значения. + +**Пример** + +```handlebars +{{length '["a", "b", "c"]'}} + + + +{{length myArray}} + + + +{{length myObject}} + +``` + +## {{lengthEqual}} + +Псевдоним для [equalsLength](#equalsLength) + +## {{map}} + +Возвращает новый массив, созданный путём вызова функции `fn` для каждого элемента заданного массива `array`. + +**Параметры** + +* `array` **{Array}**: исходный массив +* `fn` **{Function}**: функция, применяемая к каждому элементу +* `returns` **{Array}**: новый массив с результатами применения функции + +**Пример** + +```handlebars + +{{map array double}} + +``` + +## {{pluck}} + +Преобразует массив объектов в массив значений указанного свойства `prop`. Для доступа к вложенным свойствам можно использовать точечную нотацию (в виде строки). + +**Параметры** + +* `collection` **{Array|Object}**: массив или объект для обработки +* `prop` **{String}**: имя свойства (поддерживается `dot.notation`) +* `returns` **{Array}**: массив значений свойства + +**Пример** + +```handlebars + +{{pluck items "data.title"}} + +``` + +## {{reverse}} + +Разворачивает элементы массива или символы строки в обратном порядке. + +**Параметры** + +* `value` **{Array|String}**: массив или строка +* `returns` **{Array|String}**: развернутый массив или строка + +**Пример** + +```handlebars + +{{reverse value}} + + + +{{reverse value}} + +``` + +## {{some}} + +Блочный хелпер, который отображает содержимое блока, если функция-итератор `iter` возвращает `true` хотя бы для одного элемента массива. + +**Параметры** + +* `array` **{Array}**: массив для проверки +* `iter` **{Function}**: функция-итератор (предикат) +* `options` **{Options}**: объект опций Handlebars +* `returns` **{String}**: результат рендеринга + +**Пример** + +```handlebars + +{{#some array isString}} + Отобразить, если в массиве есть строка. +{{else}} + Отобразить, если нет. +{{/some}} + +``` + +## {{sort}} + +Сортирует заданный массив. Если передан массив объектов, можно указать имя свойства `key` для сортировки. Также можно передать функцию сортировки. + +**Параметры** + +* `array` **{Array}**: массив для сортировки +* `key` **{String|Function}**: свойство объекта или функция сортировки + +**Пример** + +```handlebars + +{{sort array}} + +``` + +## {{sortBy}} + +Сортирует массив. Поддерживает сортировку по одному или нескольким свойствам или с помощью функции сортировки. + +**Параметры** + +* `array` **{Array}**: массив для сортировки +* `props` **{String|Function}**: одно или несколько свойств или функции сортировки + +**Пример** + +```handlebars + +{{sortBy array "a"}} + +``` + +## {{withAfter}} + +Использует элементы массива, находящиеся **после** указанного индекса, как контекст внутри блока. Противоположность [withBefore](#withBefore). + +**Параметры** + +* `array` **{Array}** +* `idx` **{Number}**: индекс, после которого берутся элементы +* `options` **{Object}**: опции Handlebars +* `returns` **{String}**: результат рендеринга + +**Пример** + +```handlebars + +{{#withAfter array 3}} + {{this}} +{{/withAfter}} + +``` + +## {{withBefore}} + +Использует элементы массива, находящиеся **до** указанного индекса, как контекст внутри блока. Противоположность [withAfter](#withAfter). + +**Параметры** + +* `array` **{Array}** +* `idx` **{Number}**: индекс, до которого берутся элементы +* `options` **{Object}** +* `returns` **{String}** + +**Пример** + +```handlebars + +{{#withBefore array 3}} + {{this}} +{{/withBefore}} + +``` + +## {{withFirst}} + +Использует первый элемент коллекции как контекст внутри блока. Противоположность [withLast](#withLast). + +**Параметры** + +* `array` **{Array}** +* `idx` **{Number}**: (не используется, вероятно, ошибка в документации) +* `options` **{Object}** +* `returns` **{String}** + +**Пример** + +```handlebars + +{{#withFirst array}} + {{this}} +{{/withFirst}} + +``` + +## {{withGroup}} + +Блочный хелпер, который разбивает массив на группы заданного размера. + +**Параметры** + +* `array` **{Array}**: массив для группировки +* `size` **{Number}**: размер каждой группы +* `options` **{Object}**: опции Handlebars +* `returns` **{String}** + +**Пример** + +```handlebars + +{{#withGroup array 4}} + {{#each this}} + {{.}} + {{/each}} +
+{{/withGroup}} + +``` + +## {{withLast}} + +Использует последний элемент (или `n` последних) массива как контекст внутри блока. Противоположность [withFirst](#withFirst). + +**Параметры** + +* `array` **{Array}** +* `idx` **{Number}**: количество элементов с конца (по умолчанию 1) +* `options` **{Object}** +* `returns` **{String}** + +**Пример** + +```handlebars + +{{#withLast array}} + {{this}} +{{/withLast}} + +``` + +## {{withSort}} + +Блочный хелпер, который сортирует коллекцию и использует отсортированную коллекцию как контекст внутри блока. + +**Параметры** + +* `array` **{Array}** +* `prop` **{String}**: свойство для сортировки (опционально) +* `options` **{Object}**: можно указать `reverse="true"` для обратной сортировки +* `returns` **{String}** + +**Пример** + +```handlebars + +{{#withSort array}}{{this}}{{/withSort}} + +``` + +## {{unique}} + +Блочный хелпер, возвращающий массив с удалёнными дубликатами. Наиболее полезен в сочетании с хелпером [each](#each). + +**Параметры** + +* `array` **{Array}**: исходный массив +* `options` **{Object}** +* `returns` **{Array}**: массив без дубликатов + +**Пример** + +```handlebars + +{{#each (unique array)}}{{.}}{{/each}} + +``` diff --git a/docs/ru-RU/api/handlebars-helpers/comparison.md b/docs/ru-RU/api/handlebars-helpers/comparison.md new file mode 100644 index 0000000000..2dd116adc6 --- /dev/null +++ b/docs/ru-RU/api/handlebars-helpers/comparison.md @@ -0,0 +1,338 @@ +# Сравнение + +## {{and}} + +Хелпер, который отображает блок, если **оба** переданных значения истинны. Если указан обратный блок (inverse block), он будет отображён в случае ложного значения. Может использоваться как блоковый хелпер, inline-хелпер или подвыражение. + +**Параметры** + +* `a` **{any}** +* `b` **{any}** +* `options` **{Object}**: Объект options, предоставляемый Handlebars. +* `returns` **{String}** + +**Пример** + +```handlebars + +{{#and great magnificent}}A{{else}}B{{/and}} + +``` + +## {{compare}} + +Отображает блок, если сравнение первого и третьего аргументов возвращает `true`. Второй аргумент — это [арифметический оператор](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators), который используется для сравнения. Можно также указать обратный блок для отображения в случае ложного значения. + +**Параметры** + +* `a` **{}** +* `operator` **{}**: Оператор сравнения. Операторы должны быть заключены в кавычки: `">"`, `"="`, `"<="` и т.д. +* `b` **{}** +* `options` **{Object}**: Объект options, предоставляемый Handlebars. +* `returns` **{String}**: Блок или обратный блок, если указан и результат ложный. + +## {{contains}} + +Блоковый хелпер, который отображает блок, если `collection` содержит значение `value` (используется строгое сравнение `===`). Если указан обратный блок, он будет отображён, если значение не найдено. Если задан `startIndex` (может быть отрицательным), поиск начнётся с указанного индекса (или от конца коллекции, если индекс отрицательный). + +**Параметры** + +* `collection` **{Array|Object|String}**: Коллекция для проверки. +* `value` **{any}**: Значение для поиска. +* `[startIndex=0]` **{Number}**: Начальный индекс (опционально). +* `options` **{Object}**: Объект options, предоставляемый Handlebars. + +**Пример** + +```handlebars + +{{#contains array "d"}} + Это не будет отображено. +{{else}} + Это будет отображено. +{{/contains}} +``` + +## {{default}} + +Возвращает первое значение, которое не является `undefined`, в противном случае возвращает значение по умолчанию. + +**Параметры** + +* `value` **{any}** +* `defaultValue` **{any}** +* `returns` **{String}** + +## {{eq}} + +Блоковый хелпер, который отображает блок, если `a` **равно** `b`. Если указан обратный блок, он будет отображён в случае ложного значения. Можно использовать хеш-аргумент `compare=""` для второго значения. + +**Параметры** + +* `a` **{String}** +* `b` **{String}** +* `options` **{Object}**: Объект options, предоставляемый Handlebars. +* `returns` **{String}**: Блок или обратный блок, если указан и результат ложный. + +## {{gt}} + +Блоковый хелпер, который отображает блок, если `a` **больше** `b`. Если указан обратный блок, он будет отображён в случае ложного значения. Можно использовать хеш-аргумент `compare=""` для второго значения. + +**Параметры** + +* `a` **{String}** +* `b` **{String}** +* `options` **{Object}**: Объект options, предоставляемый Handlebars. +* `returns` **{String}**: Блок или обратный блок, если указан и результат ложный. + +## {{gte}} + +Блоковый хелпер, который отображает блок, если `a` **больше или равно** `b`. Если указан обратный блок, он будет отображён в случае ложного значения. Можно использовать хеш-аргумент `compare=""` для второго значения. + +**Параметры** + +* `a` **{String}** +* `b` **{String}** +* `options` **{Object}**: Объект options, предоставляемый Handlebars. +* `returns` **{String}**: Блок или обратный блок, если указан и результат ложный. + +## {{has}} + +Блоковый хелпер, который отображает блок, если `value` содержит `pattern`. Если указан обратный блок, он будет отображён в случае ложного значения. + +**Параметры** + +* `val` **{any}**: Значение для проверки. +* `pattern` **{any}**: Шаблон для поиска. +* `options` **{Object}**: Объект options, предоставляемый Handlebars. +* `returns` **{String}** + +## {{isEmpty}} + +Inline, подвыражение или блоковый хелпер, который возвращает `true` (или блок), если переданная коллекция пуста, и `false` (или обратный блок, если указан), если коллекция не пуста. + +**Параметры** + +* `collection` **{Object}** +* `options` **{Object}** +* `returns` **{String}** + +**Пример** + +```handlebars + +{{#isEmpty array}}AAA{{else}}BBB{{/isEmpty}} + + + +{{isEmpty array}} + +``` + +## {{isFalsey}} + +Возвращает `true`, если переданное значение `value` является ложным (falsey). Использует библиотеку [falsey](https://github.com/jonschlinkert/falsey) для сравнений. + +**Параметры** + +* `val` **{any}** +* `options` **{Options}** +* `returns` **{Boolean}** + +## {{isTruthy}} + +Возвращает `true`, если переданное значение `value` является истинным (truthy). Использует библиотеку [falsey](https://github.com/jonschlinkert/falsey) для сравнений. + +**Параметры** + +* `val` **{any}** +* `options` **{Options}** +* `returns` **{Boolean}** + +## {{ifEven}} + +Возвращает `true`, если переданное значение является чётным числом. + +**Параметры** + +* `number` **{Number}** +* `options` **{Object}**: Объект options, предоставляемый Handlebars. +* `returns` **{String}**: Блок или обратный блок, если указан и результат ложный. + +**Пример** + +```handlebars +{{#ifEven value}} + отобразить A +{{else}} + отобразить B +{{/ifEven}} +``` + +## {{ifNth}} + +Условно отображает блок, если остаток от деления операнда `a` на `b` равен нулю. Если указан обратный блок, он будет отображён, если остаток **не равен нулю**. + +**Параметры** + +* **{}**: {Number} +* **{}**: {Number} +* `options` **{Object}**: Объект options, предоставляемый Handlebars. +* `returns` **{String}**: Блок или обратный блок, если указан и результат ложный. + +## {{ifOdd}} + +Блоковый хелпер, который отображает блок, если `value` является **нечётным числом**. Если указан обратный блок, он будет отображён в случае ложного значения. + +**Параметры** + +* `value` **{Object}** +* `options` **{Object}**: Объект options, предоставляемый Handlebars. +* `returns` **{String}**: Блок или обратный блок, если указан и результат ложный. + +**Пример** + +```handlebars +{{#ifOdd value}} + отобразить A +{{else}} + отобразить B +{{/ifOdd}} +``` + +## {{is}} + +Блоковый хелпер, который отображает блок, если `a` **равно** `b`. Если указан обратный блок, он будет отображён в случае ложного значения. Похож на `eq`, но не использует строгое сравнение. + +**Параметры** + +* `a` **{any}** +* `b` **{any}** +* `options` **{Object}**: Объект options, предоставляемый Handlebars. +* `returns` **{String}** + +## {{isnt}} + +Блоковый хелпер, который отображает блок, если `a` **не равно** `b`. Если указан обратный блок, он будет отображён в случае ложного значения. Похож на `unlessEq`, но не использует строгое сравнение. + +**Параметры** + +* `a` **{String}** +* `b` **{String}** +* `options` **{Object}**: Объект options, предоставляемый Handlebars. +* `returns` **{String}** + +## {{lt}} + +Блоковый хелпер, который отображает блок, если `a` **меньше** `b`. Если указан обратный блок, он будет отображён в случае ложного значения. Можно использовать хеш-аргумент `compare=""` для второго значения. + +**Параметры** + +* `context` **{Object}** +* `options` **{Object}**: Объект options, предоставляемый Handlebars. +* `returns` **{String}**: Блок или обратный блок, если указан и результат ложный. + +## {{lte}} + +Блоковый хелпер, который отображает блок, если `a` **меньше или равно** `b`. Если указан обратный блок, он будет отображён в случае ложного значения. Можно использовать хеш-аргумент `compare=""` для второго значения. + +**Параметры** + +* `a` **{Sring}** +* `b` **{Sring}** +* `options` **{Object}**: Объект options, предоставляемый Handlebars. +* `returns` **{String}**: Блок или обратный блок, если указан и результат ложный. + +## {{neither}} + +Блоковый хелпер, который отображает блок, если **ни одно из** переданных значений не является истинным. Если указан обратный блок, он будет отображён в случае ложного значения. + +**Параметры** + +* `a` **{any}** +* `b` **{any}** +* `options` **{}**: Объект options, предоставляемый Handlebars. +* `returns` **{String}**: Блок или обратный блок, если указан и результат ложный. + +## {{not}} + +Возвращает `true`, если `val` является ложным (falsey). Может использоваться как блоковый или inline-хелпер. + +**Параметры** + +* `val` **{String}** +* `options` **{Object}**: Объект options, предоставляемый Handlebars. +* `returns` **{String}** + +## {{or}} + +Блоковый хелпер, который отображает блок, если **хотя бы одно из** переданных значений является истинным. Если указан обратный блок, он будет отображён в случае ложного значения. + +**Параметры** + +* `arguments` **{...any}**: Переменное количество аргументов. +* `options` **{Object}**: Объект options, предоставляемый Handlebars. +* `returns` **{String}**: Блок или обратный блок, если указан и результат ложный. + +**Пример** + +```handlebars +{{#or a b c}} + Если хотя бы одно значение истинно, это будет отображено. +{{/or}} +``` + +## {{unlessEq}} + +Блоковый хелпер, который всегда отображает обратный блок, **если `a` не равно `b`**. + +**Параметры** + +* `a` **{String}** +* `b` **{String}** +* `options` **{Object}**: Объект options, предоставляемый Handlebars. +* `returns` **{String}**: Обратный блок по умолчанию или блок, если результат ложный. + +## {{unlessGt}} + +Блоковый хелпер, который всегда отображает обратный блок, **если `a` не больше `b`**. + +**Параметры** + +* `a` **{Object}**: Значение по умолчанию. +* `b` **{Object}**: Значение для сравнения. +* `options` **{Object}**: Объект options, предоставляемый Handlebars. +* `returns` **{String}**: Обратный блок по умолчанию или блок, если результат ложный. + +## {{unlessLt}} + +Блоковый хелпер, который всегда отображает обратный блок, **если `a` не меньше `b`**. + +**Параметры** + +* `a` **{Object}**: Значение по умолчанию. +* `b` **{Object}**: Значение для сравнения. +* `options` **{Object}**: Объект options, предоставляемый Handlebars. +* `returns` **{String}**: Блок или обратный блок, если указан и результат ложный. + +## {{unlessGteq}} + +Блоковый хелпер, который всегда отображает обратный блок, **если `a` не больше или равно `b`**. + +**Параметры** + +* `a` **{any}** +* `b` **{any}** +* `options` **{Object}**: Объект options, предоставляемый Handlebars. +* `returns` **{String}**: Блок или обратный блок, если указан и результат ложный. + +## {{unlessLteq}} + +Блоковый хелпер, который всегда отображает обратный блок, **если `a` не меньше или равно `b`**. + +**Параметры** + +* `a` **{any}** +* `b` **{any}** +* `options` **{Object}**: Объект options, предоставляемый Handlebars. +* `returns` **{String}**: Блок или обратный блок, если указан и результат ложный. diff --git a/docs/ru-RU/api/handlebars-helpers/core.md b/docs/ru-RU/api/handlebars-helpers/core.md new file mode 100644 index 0000000000..380557c9e0 --- /dev/null +++ b/docs/ru-RU/api/handlebars-helpers/core.md @@ -0,0 +1,112 @@ +# Встроенные хелперы + +Ссылка: [https://handlebarsjs.com/guide/builtin-helpers.html](https://handlebarsjs.com/guide/builtin-helpers.html) + +## {{if}} + +Отображает блок, если заданное условие является истинным (truthy). + +**Параметры** + +* `condition` **{Any}**: Условие для проверки. + +**Возвращает** + +Содержимое блока, если условие истинно; в противном случае ничего не возвращает. + +**Пример** + +```handlebars +{{#if condition}} + Этот текст отобразится, если условие истинно. +{{/if}} +``` + +--- + +## {{unless}} + +Отображает блок, если заданное условие является ложным (falsy). Противоположность хелперу `if`. + +**Параметры** + +* `condition` **{Any}**: Условие для проверки. + +**Возвращает** + +Содержимое блока, если условие ложно; в противном случае ничего не возвращает. + +**Пример** + +```handlebars +{{#unless condition}} + Этот текст отобразится, если условие ложно. +{{/unless}} +``` + +--- + +## {{each}} + +Перебирает элементы массива или объекта и отображает блок для каждого элемента. + +**Параметры** + +* `collection` **{Array|Object}**: Массив или объект для перебора. + +**Возвращает** + +Отображает блок для каждого элемента коллекции. + +**Пример** + +```handlebars +{{#each items}} +
  • {{this}}
  • +{{/each}} +``` + +--- + +## {{with}} + +Отображает блок с указанным контекстом. Позволяет установить контекст для блока, упрощая доступ к вложенным свойствам. + +**Параметры** + +* `context` **{Any}**: Контекст, который будет использоваться внутри блока. + +**Возвращает** + +Отображает блок с указанным контекстом. + +**Пример** + +```handlebars +{{#with person}} +

    Имя: {{name}}

    +

    Возраст: {{age}}

    +{{/with}} +``` + +--- + +## {{lookup}} + +Находит значение по указанному ключу в объекте. Этот хелпер полезен для доступа к динамическим ключам. + +**Параметры** + +* `context` **{Object}**: Объект, в котором нужно найти ключ. +* `key` **{String|Number}**: Ключ для поиска. + +**Возвращает** + +Значение указанного ключа в объекте. + +**Пример** + +```handlebars +{{lookup person "name"}} + +``` diff --git a/docs/ru-RU/api/handlebars-helpers/date.md b/docs/ru-RU/api/handlebars-helpers/date.md new file mode 100644 index 0000000000..5089458093 --- /dev/null +++ b/docs/ru-RU/api/handlebars-helpers/date.md @@ -0,0 +1,20 @@ +# Дата + +## {{dateFormat}} + +Хелпер `dateFormat` в Handlebars используется для форматирования даты с использованием библиотеки day.js. Он принимает два обязательных аргумента и третий необязательный аргумент для указания часового пояса. + +**Параметры** + +* `datetime` **{String}**: Дата и время для форматирования. +* `format` **{String}**: Строка формата даты (например, "YYYY-MM-DD HH:mm:ss"). +* `timezone` **{String}**: Часовой пояс (опционально). +* `returns` **{String}**: Отформатированная строка даты. + +**Пример** + +```handlebars +{{dateFormat now "YYYY-MM-DD HH:mm:ss"}} +{{dateFormat now "YYYY-MM-DD HH:mm:ss" "Asia/Tokyo"}} +{{dateFormat now "YYYY-MM-DD HH:mm:ss" "UTC"}} +``` diff --git a/docs/ru-RU/api/handlebars-helpers/html.md b/docs/ru-RU/api/handlebars-helpers/html.md new file mode 100644 index 0000000000..221c134383 --- /dev/null +++ b/docs/ru-RU/api/handlebars-helpers/html.md @@ -0,0 +1,4 @@ +# HTML + +## {{qrcode}} + diff --git a/docs/ru-RU/api/handlebars-helpers/i18n.md b/docs/ru-RU/api/handlebars-helpers/i18n.md new file mode 100644 index 0000000000..d2f3e6a441 --- /dev/null +++ b/docs/ru-RU/api/handlebars-helpers/i18n.md @@ -0,0 +1,16 @@ +# I18n + +## {{t}} + +**Параметры** + +* `ключ` **{String}** +* `ns` **{String}** +* `returns' **{String}** + +**Пример** + +```handlebars +{{t "Today"}} +{{t "Permissions" "@nocobase/plugin-acl"}} +``` diff --git a/docs/ru-RU/api/handlebars-helpers/index.md b/docs/ru-RU/api/handlebars-helpers/index.md new file mode 100644 index 0000000000..68e5b5931f --- /dev/null +++ b/docs/ru-RU/api/handlebars-helpers/index.md @@ -0,0 +1,17 @@ +# Хелперы Handlebars + +| Категория | Описание | +| :--- | :--- | +| **Core** (Основные) | Встроенные хелперы | +| **Array** (Массивы) | Операции и методы, связанные с массивами | +| **Comparison** (Сравнение) | Операторы сравнения и связанные методы | +| **Date** (Дата) | Операции и методы, связанные с обработкой даты и времени | +| **HTML** | Контент, связанный с HTML-документами и элементами | +| **I18n** | Поддержка интернационализации и многязычности | +| **Math** (Математика) | Математические функции и вычисления | +| **Number** (Числа) | Контент, связанный с обработкой и форматированием чисел | +| **Object** (Объекты) | Методы, связанные с операциями и свойствами объектов | +| **Path** (Пути) | Операции с путями и контент, связанный с файловой системой | +| **Regex** | Регулярные выражения и их использование | +| **String** (Строки) | Методы, связанные с манипуляцией и операциями со строками | +| **URL** | Контент, связанный с разбором и построением URL | diff --git a/docs/ru-RU/api/handlebars-helpers/math.md b/docs/ru-RU/api/handlebars-helpers/math.md new file mode 100644 index 0000000000..965797ed67 --- /dev/null +++ b/docs/ru-RU/api/handlebars-helpers/math.md @@ -0,0 +1,147 @@ +# Математические операции + +## {{abs}} + +Возвращает модуль числа `a`. + +**Параметры** +* `a` **{Number}** +* `returns` **{Number}** + +## {{add}} + +Возвращает сумму `a` и `b`. + +**Параметры** +* `a` **{Number}** +* `b` **{Number}** +* `returns` **{Number}** + +## {{avg}} + +Возвращает среднее значение всех чисел в массиве. + +**Параметры** +* `array` **{Array}**: Массив чисел для вычисления +* `returns` **{Number}** + +**Пример** +```handlebars +{{avg "[1, 2, 3, 4, 5]"}} + +``` + +## {{ceil}} + +Округляет число вверх (Math.ceil()). + +**Параметры** +* `value` **{Number}** +* `returns` **{Number}** + +## {{divide}} + +Делит `a` на `b`. + +**Параметры** +* `a` **{Number}**: числитель +* `b` **{Number}**: знаменатель + +## {{floor}} + +Округляет число вниз (Math.floor()). + +**Параметры** +* `value` **{Number}** +* `returns` **{Number}** + +## {{minus}} + +Возвращает разность `a` и `b`. + +**Параметры** +* `a` **{Number}** +* `b` **{Number}** + +## {{modulo}} + +Возвращает остаток от деления. + +**Параметры** +* `a` **{Number}** +* `b` **{Number}** +* `returns` **{Number}** + +## {{multiply}} + +Возвращает произведение `a` и `b`. + +**Параметры** +* `a` **{Number}**: множимое +* `b` **{Number}**: множитель +* `returns` **{Number}** + +## {{plus}} + +Складывает `a` и `b`. + +**Параметры** +* `a` **{Number}**: слагаемое +* `b` **{Number}**: слагаемое + +## {{random}} + +Генерирует случайное число в заданном диапазоне. + +**Параметры** +* `min` **{Number}** +* `max` **{Number}** +* `returns` **{String}** + +## {{remainder}} + +Возвращает остаток от деления `a` на `b`. + +**Параметры** +* `a` **{Number}**: делимое +* `b` **{Number}**: делитель + +## {{round}} + +Округляет число по правилам математики. + +**Параметры** +* `number` **{Number}** +* `returns` **{Number}** + +## {{subtract}} + +Возвращает разность `a` и `b`. + +**Параметры** +* `a` **{Number}** +* `b` **{Number}** +* `returns` **{Number}** + +## {{sum}} + +Возвращает сумму всех чисел в массиве. + +**Параметры** +* `array` **{Array}**: Массив чисел для сложения +* `returns` **{Number}** + +**Пример** +```handlebars +{{sum "[1, 2, 3, 4, 5]"}} + +``` + +## {{times}} + +Умножает `a` на `b`. + +**Параметры** +* `a` **{Number}**: множимое +* `b` **{Number}**: множитель +* `returns` **{Number}** diff --git a/docs/ru-RU/api/handlebars-helpers/number.md b/docs/ru-RU/api/handlebars-helpers/number.md new file mode 100644 index 0000000000..f363080910 --- /dev/null +++ b/docs/ru-RU/api/handlebars-helpers/number.md @@ -0,0 +1,116 @@ +# Числа + +## {{bytes}} + +Форматирует число, представляя его эквивалент в байтах. Если передана строка, будет отформатирована и возвращена её длина. + +**Примеры:** +* `'foo'` → `3 B` +* `13661855` → `13.66 MB` +* `825399` → `825.39 kB` +* `1396` → `1.4 kB` + +**Параметры** +* `number` **{Number|String}**: Число или строка для форматирования. +* `returns` **{String}**: Отформатированная строка с размером в байтах. + +--- + +## {{addCommas}} + +Добавляет запятые в числа для улучшения читаемости (разделение разрядов). + +**Параметры** +* `num` **{Number}**: Число для форматирования. +* `returns` **{Number}**: Число с добавленными запятыми (в виде строки). + +--- + +## {{phoneNumber}} + +Преобразует строку или число в форматированный номер телефона. + +**Параметры** +* `num` **{Number|String}**: Номер телефона для форматирования, например, `8005551212`. +* `returns` **{Number}**: Отформатированный номер телефона: `(800) 555-1212`. + +--- + +## {{toAbbr}} + +Сокращает число до указанного количества знаков после запятой (`precision`). Предназначено для общих чисел, а не для размеров в байтах. + +**Параметры** +* `number` **{Number}**: Число для сокращения. +* `precision` **{Number}**: Количество знаков после запятой. +* `returns` **{String}**: Сокращённое число в виде строки (например, `1.2K`, `3.5M`). + +--- + +## {{toExponential}} + +Возвращает строку, представляющую заданное число в экспоненциальной (научной) нотации. + +**Параметры** +* `number` **{Number}**: Число для преобразования. +* `fractionDigits` **{Number}**: (Опционально) Количество цифр после десятичной точки. По умолчанию — столько, сколько необходимо. +* `returns` **{Number}**: Строка с числом в экспоненциальной форме. + +**Пример** +```handlebars +{{toExponential number digits}}; +``` + +--- + +## {{toFixed}} + +Форматирует заданное число с использованием нотации с фиксированной точкой. + +**Параметры** +* `number` **{Number}**: Число для форматирования. +* `digits` **{Number}**: (Опционально) Количество цифр после десятичной точки (от 0 до 20). По умолчанию — 0. +* `returns` **{String}**: Строка, представляющая число с фиксированной точностью. + +**Пример** +```handlebars +{{toFixed "1.1234" 2}} +//=> '1.12' +``` + +--- + +## {{toFloat}} + +Преобразует значение в число с плавающей точкой (тип `float`). + +**Параметры** +* `number` **{Number}**: Значение для преобразования. +* `returns` **{Number}**: Число с плавающей точкой. + +--- + +## {{toInt}} + +Преобразует значение в целое число (тип `int`). + +**Параметры** +* `number` **{Number}**: Значение для преобразования. +* `returns` **{Number}**: Целое число. + +--- + +## {{toPrecision}} + +Возвращает строку, представляющую число с указанной точностью (общим количеством значащих цифр). + +**Параметры** +* `number` **{Number}**: Число для преобразования. +* `precision` **{Number}**: (Опционально) Количество значащих цифр. Если значение не в диапазоне от 1 до 100, будет приведено к `0`. +* `returns` **{String}**: Строка с числом, округлённым до указанной точности, в нотации с фиксированной точкой или экспоненциальной. + +**Пример** +```handlebars +{{toPrecision "1.1234" 2}} +//=> '1.1' +``` diff --git a/docs/ru-RU/api/handlebars-helpers/object.md b/docs/ru-RU/api/handlebars-helpers/object.md new file mode 100644 index 0000000000..0d1b3300f4 --- /dev/null +++ b/docs/ru-RU/api/handlebars-helpers/object.md @@ -0,0 +1,182 @@ +# Объект + +## {{extend}} + +Расширяет контекст свойствами других объектов. Выполняется поверхностное слияние (shallow merge), чтобы избежать изменения исходного контекста. + +**Параметры** + +* `objects` **{Object}**: Один или несколько объектов для расширения. +* `returns` **{Object}**: Новый объект с объединёнными свойствами. + +--- + +## {{forIn}} + +Блочный хелпер, перебирающий все перечисляемые свойства объекта (включая унаследованные), делая каждый ключ и значение доступными в контексте. + +**Параметры** + +* `context` **{Object}**: Объект для перебора. +* `options` **{Object}**: Объект опций Handlebars. +* `returns` **{String}**: Результат рендеринга блока. + +--- + +## {{forOwn}} + +Блочный хелпер, перебирающий только **собственные** (не унаследованные) перечисляемые свойства объекта, делая каждый ключ и значение доступными в контексте. + +**Параметры** + +* `obj` **{Object}**: Объект для перебора. +* `options` **{Object}** +* `returns` **{String}** + +--- + +## {{toPath}} + +Принимает аргументы и, если они строки или числа, преобразует их в строку пути к свойству объекта с точечной нотацией (например, `a.b.c`). + +**Параметры** + +* `prop` **{String|Number}**: Сегменты свойства (может быть несколько). +* `returns` **{String}**: Строка пути, например, `"a.b.c"`. + +--- + +## {{get}} + +Использует путь к свойству (`a.b.c`) для получения значения (или вложенного значения) из контекста. Работает как обычный хелпер или блочный хелпер. + +**Параметры** + +* `prop` **{String}**: Имя свойства, можно использовать точечную нотацию для вложенных свойств. +* `context` **{Object}**: Объект контекста. +* `options` **{Object}**: Объект опций Handlebars (если используется как блочный хелпер). +* `returns` **{any}**: Значение найденного свойства. + +**Пример** + +```handlebars +{{get "user.profile.name" context}} +``` + +--- + +## {{getObject}} + +Использует путь к свойству (`a.b.c`) для получения объекта из контекста. Отличается от `get` тем, что возвращает сам объект, включая указанный ключ. Этот хелпер **не работает** как блочный. + +**Параметры** + +* `prop` **{String}**: Путь к свойству (с поддержкой точечной нотации). +* `context` **{Object}**: Контекстный объект. +* `returns` **{Object}**: Объект, содержащий указанное свойство. + +**Пример** + +```handlebars + +{{getObject "user" context}} + +``` + +--- + +## {{hasOwn}} + +Возвращает `true`, если `key` является собственным (не унаследованным) перечисляемым свойством заданного объекта `context`. + +**Параметры** + +* `key` **{String}**: Имя свойства. +* `context` **{Object}**: Объект для проверки. +* `returns` **{Boolean}** + +**Пример** + +```handlebars +{{hasOwn context "name"}} +``` + +--- + +## {{isObject}} + +Возвращает `true`, если `value` является объектом (включая массивы и функции, если не делать строгую проверку). + +**Параметры** + +* `value` **{any}**: Значение для проверки. +* `returns` **{Boolean}** + +**Пример** + +```handlebars +{{isObject "foo"}} + +``` + +--- + +## {{JSONparse}} + +Разбирает переданную строку с помощью `JSON.parse`. + +**Параметры** + +* `string` **{String}**: Строка в формате JSON для разбора. + +**Пример** + +```handlebars + +{{JSONparse string}} + +``` + +--- + +## {{JSONstringify}} + +Преобразует объект в строку с помощью `JSON.stringify`. + +**Параметры** + +* `obj` **{Object}**: Объект для преобразования в строку. +* `returns` **{String}**: JSON-строка. + +**Пример** + +```handlebars + +{{JSONstringify object}} + +``` + +--- + +## {{merge}} + +Глубоко объединяет (deep merge) свойства указанных объектов с контекстом. + +**Параметры** + +* `object` **{Object}**: Целевой объект. Передайте пустой объект, чтобы создать глубокую копию. +* `objects` **{Object}**: Один или несколько объектов для слияния. +* `returns` **{Object}**: Новый объект с объединёнными свойствами. + +--- + +## {{pick}} + +Выбирает указанные свойства из объекта контекста. + +**Параметры** + +* `properties` **{Array|String}**: Одно или несколько имён свойств для выбора. +* `context` **{Object}**: Объект, из которого выбираются свойства. +* `options` **{Object}**: Объект опций Handlebars. +* `returns` **{Object}**: Объект, содержащий выбранные свойства. Если используется как блочный хелпер, выбранные значения передаются во внутренний блок как контекст. Если ни одного свойства не найдено, выполняется блок `else` (обратный блок). diff --git a/docs/ru-RU/api/handlebars-helpers/path.md b/docs/ru-RU/api/handlebars-helpers/path.md new file mode 100644 index 0000000000..af7d8b87fd --- /dev/null +++ b/docs/ru-RU/api/handlebars-helpers/path.md @@ -0,0 +1,153 @@ +# Пути + +## {{absolute}} + +Получает сегмент пути к директории из указанного `filepath`. +*(Примечание: в параметрах ошибка — `ext` должно быть `filepath`)* + +**Параметры** + +* `filepath` **{String}**: Путь к файлу. +* `returns` **{String}**: Путь к директории. + +**Пример** + +```handlebars +{{absolute "docs/toc.md"}} + +``` + +--- + +## {{dirname}} + +Получает сегмент пути к директории из указанного `filepath`. + +**Параметры** + +* `filepath` **{String}**: Путь к файлу. +* `returns` **{String}**: Путь к директории. + +**Пример** + +```handlebars +{{dirname "docs/toc.md"}} + +``` + +--- + +## {{relative}} + +Возвращает относительный путь из `a` в `b`. + +**Параметры** + +* `a` **{String}**: Исходный путь. +* `b` **{String}**: Конечный путь. +* `returns` **{String}**: Относительный путь от `a` к `b`. + +**Пример** + +```handlebars +{{relative "docs/a.md" "docs/b.md"}} + +``` + +--- + +## {{basename}} + +Получает имя файла (включая расширение) из указанного `filepath`. + +**Параметры** + +* `filepath` **{String}**: Путь к файлу. +* `returns` **{String}**: Имя файла. + +**Пример** + +```handlebars +{{basename "docs/toc.md"}} + +``` + +--- + +## {{stem}} + +Получает "основу" имени файла (без расширения) из указанного `filepath`. + +**Параметры** + +* `filepath` **{String}**: Путь к файлу. +* `returns` **{String}**: Имя файла без расширения. + +**Пример** + +```handlebars +{{stem "docs/toc.md"}} + +``` + +--- + +## {{extname}} + +Получает расширение файла из указанного `filepath`. + +**Параметры** + +* `filepath` **{String}**: Путь к файлу. +* `returns` **{String}**: Расширение файла, включая точку (например, `.md`). + +**Пример** + +```handlebars +{{extname "docs/toc.md"}} + +``` + +--- + +## {{resolve}} + +Преобразует относительный путь в абсолютный. + +**Параметры** + +* `filepath` **{String}**: Относительный путь к файлу. +* `returns` **{String}**: Абсолютный путь к файлу. + +**Пример** + +```handlebars +{{resolve "docs/toc.md"}} + +``` + +--- + +## {{segments}} + +Получает определённые сегменты пути к файлу, указав диапазон индексов массива (разделённого `/`), и объединяет их обратно в строку. + +**Параметры** + +* `filepath` **{String}**: Путь к файлу, который будет разбит на сегменты. +* `start` **{Number}**: Начальный индекс (включительно). +* `end` **{Number}**: Конечный индекс (включительно). +* `returns` **{String}**: Объединённый путь из выбранных сегментов. + +**Пример** + +```handlebars +{{segments "a/b/c/d" "2" "3"}} + + +{{segments "a/b/c/d" "1" "3"}} + + +{{segments "a/b/c/d" "1" "2"}} + +``` diff --git a/docs/ru-RU/api/handlebars-helpers/regex.md b/docs/ru-RU/api/handlebars-helpers/regex.md new file mode 100644 index 0000000000..6072b065ec --- /dev/null +++ b/docs/ru-RU/api/handlebars-helpers/regex.md @@ -0,0 +1,36 @@ +# Регулярные выражения + +## {{toRegex}} + +Преобразует строку в регулярное выражение. + +**Параметры** +* `str` **{String}**: Строка для преобразования +* `returns` **{RegExp}**: Объект регулярного выражения + +**Пример** +```handlebars +{{toRegex "foo"}} + +``` + +## {{test}} + +Проверяет, соответствует ли строка регулярному выражению. Можно передать готовое регулярное выражение или использовать хелпер [toRegex](#toregex) как подвыражение. + +**Параметры** +* `str` **{String}**: Проверяемая строка +* `regex` **{RegExp|String}**: Регулярное выражение или строка для преобразования +* `returns` **{Boolean}**: Результат проверки + +**Примеры** +```handlebars +{{test "bar" (toRegex "foo")}} + +{{test "foobar" (toRegex "foo")}} + +{{test "foobar" (toRegex "^foo$")}} + +``` + + diff --git a/docs/ru-RU/api/handlebars-helpers/string.md b/docs/ru-RU/api/handlebars-helpers/string.md new file mode 100644 index 0000000000..202d137df3 --- /dev/null +++ b/docs/ru-RU/api/handlebars-helpers/string.md @@ -0,0 +1,609 @@ +# Строки + +## {{append}} + +Добавляет указанный `suffix` к заданной строке. + +**Параметры** + +* `str` **{String}** +* `suffix` **{String}** +* `returns` **{String}** + +**Пример** + +```handlebars + +{{append item.stem ".html"}} + +``` + +## {{camelcase}} + +Преобразует символы в заданной строке в camelCase. + +**Параметры** + +* `string` **{String}**: Строка для преобразования. +* `returns` **{String}** + +**Пример** + +```handlebars +{{camelcase "foo bar baz"}}; + +``` + +## {{capitalize}} + +Делает первую букву в предложении заглавной. + +**Параметры** + +* `str` **{String}** +* `returns` **{String}** + +**Пример** + +```handlebars +{{capitalize "foo bar baz"}} + +``` + +## {{capitalizeAll}} + +Делает первую букву каждого слова в строке заглавной. + +**Параметры** + +* `str` **{String}** +* `returns` **{String}** + +**Пример** + +```handlebars +{{capitalizeAll "foo bar baz"}} + +``` + +## {{center}} + +Центрирует строку, используя неразрывные пробелы. + +**Параметры** + +* `str` **{String}** +* `spaces` **{String}** +* `returns` **{String}** + +## {{chop}} + +Удаляет лишние пробелы и небуквенные символы с начала и конца строки. + +**Параметры** + +* `string` **{String}**: Строка для обработки. +* `returns` **{String}** + +**Пример** + +```handlebars +{{chop "_ABC_"}} + + +{{chop "-ABC-"}} + + +{{chop " ABC "}} + +``` + +## {{dashcase}} + +Преобразует символы в строке в dash-case. Заменяет небуквенные символы и точки на дефисы. + +**Параметры** + +* `string` **{String}** +* `returns` **{String}** + +**Пример** + +```handlebars +{{dashcase "a-b-c d_e"}} + +``` + +## {{dotcase}} + +Преобразует символы в строке в dot.case. + +**Параметры** + +* `string` **{String}** +* `returns` **{String}** + +**Пример** + +```handlebars +{{dotcase "a-b-c d_e"}} + +``` + +## {{downcase}} + +Преобразует все символы в строке в нижний регистр. Аналог [lowercase](#lowercase). + +**Параметры** + +* `string` **{String}** +* `returns` **{String}** + +**Пример** + +```handlebars +{{downcase "aBcDeF"}} + +``` + +## {{ellipsis}} + +Обрезает строку до указанной длины и добавляет многоточие (`…`). + +**Параметры** + +* `str` **{String}** +* `length` **{Number}**: Желаемая длина строки. +* `returns` **{String}**: Обрезанная строка. + +**Пример** + +```handlebars +{{ellipsis (sanitize "foo bar baz"), 7}} + +{{ellipsis "foo bar baz", 7}} + +``` + +## {{hyphenate}} + +Заменяет пробелы в строке на дефисы. + +**Параметры** + +* `str` **{String}** +* `returns` **{String}** + +**Пример** + +```handlebars +{{hyphenate "foo bar baz qux"}} + +``` + +## {{isString}} + +Возвращает `true`, если значение является строкой. + +**Параметры** + +* `value` **{String}** +* `returns` **{Boolean}** + +**Пример** + +```handlebars +{{isString "foo"}} + +``` + +## {{lowercase}} + +Преобразует все символы в строке в нижний регистр. + +**Параметры** + +* `str` **{String}** +* `returns` **{String}** + +**Пример** + +```handlebars +{{lowercase "Foo BAR baZ"}} + +``` + +## {{occurrences}} + +Возвращает количество вхождений подстроки в заданной строке. + +**Параметры** + +* `str` **{String}** +* `substring` **{String}** +* `returns` **{Number}**: Количество вхождений. + +**Пример** + +```handlebars +{{occurrences "foo bar foo bar baz" "foo"}} + +``` + +## {{pascalcase}} + +Преобразует символы в строке в PascalCase. + +**Параметры** + +* `string` **{String}** +* `returns` **{String}** + +**Пример** + +```handlebars +{{pascalcase "foo bar baz"}} + +``` + +## {{pathcase}} + +Преобразует символы в строке в path/case. + +**Параметры** + +* `string` **{String}** +* `returns` **{String}** + +**Пример** + +```handlebars +{{pathcase "a-b-c d_e"}} + +``` + +## {{plusify}} + +Заменяет пробелы в строке на знаки плюса. + +**Параметры** + +* `str` **{String}**: Входная строка. +* `returns` **{String}**: Строка с пробелами, заменёнными на плюсы. + +**Пример** + +```handlebars +{{plusify "foo bar baz"}} + +``` + +## {{prepend}} + +Добавляет указанный `prefix` в начало строки. + +**Параметры** + +* `str` **{String}** +* `prefix` **{String}** +* `returns` **{String}** + +**Пример** + +```handlebars + +{{prepend val "foo-"}} + +``` + +## {{raw}} + +Выводит блок без обработки шаблонов Mustache внутри него. + +**Параметры** + +* `options` **{Object}** +* `returns` **{String}** + +**Пример** + +```handlebars +{{{{#raw}}}} +{{foo}} +{{{{/raw}}}} + +``` + +## {{remove}} + +Удаляет все вхождения подстроки из строки. + +**Параметры** + +* `str` **{String}** +* `substring` **{String}** +* `returns` **{String}** + +**Пример** + +```handlebars +{{remove "a b a b a b" "a "}} + +``` + +## {{removeFirst}} + +Удаляет первое вхождение подстроки из строки. + +**Параметры** + +* `str` **{String}** +* `substring` **{String}** +* `returns` **{String}** + +**Пример** + +```handlebars +{{remove "a b a b a b" "a"}} + +``` + +## {{replace}} + +Заменяет все вхождения подстроки `a` на подстроку `b`. + +**Параметры** + +* `str` **{String}** +* `a` **{String}** +* `b` **{String}** +* `returns` **{String}** + +**Пример** + +```handlebars +{{replace "a b a b a b" "a" "z"}} + +``` + +## {{replaceFirst}} + +Заменяет первое вхождение подстроки `a` на подстроку `b`. + +**Параметры** + +* `str` **{String}** +* `a` **{String}** +* `b` **{String}** +* `returns` **{String}** + +**Пример** + +```handlebars +{{replace "a b a b a b" "a" "z"}} + +``` + +## {{reverse}} + +Переворачивает строку. + +**Параметры** + +* `str` **{String}** +* `returns` **{String}** + +**Пример** + +```handlebars +{{reverse "abcde"}} + +``` + +## {{sentence}} + +Преобразует строку в sentence case (первая буква каждого предложения заглавная). + +**Параметры** + +* `str` **{String}** +* `returns` **{String}** + +**Пример** + +```handlebars +{{sentence "hello world. goodbye world."}} + +``` + +## {{snakecase}} + +Преобразует символы в строке в snake_case. + +**Параметры** + +* `string` **{String}** +* `returns` **{String}** + +**Пример** + +```handlebars +{{snakecase "a-b-c d_e"}} + +``` + +## {{split}} + +Разделяет строку по указанному символу. + +**Параметры** + +* `string` **{String}**: Строка для разделения. +* `returns` **{String}** `character`: По умолчанию — пустая строка. + +**Пример** + +```handlebars +{{split "a,b,c" ","}} + +``` + +## {{startsWith}} + +Проверяет, начинается ли строка с указанного префикса. + +**Параметры** + +* `prefix` **{String}** +* `testString` **{String}** +* `options` **{String}** +* `returns` **{String}** + +**Пример** + +```handlebars +{{#startsWith "Goodbye" "Hello, world!"}} + Упс +{{else}} + Бро, ты вообще "Hello, world!"? +{{/startsWith}} +``` + +## {{titleize}} + +Преобразует строку в Title Case (каждое слово с заглавной буквы). + +**Параметры** + +* `str` **{String}** +* `returns` **{String}** + +**Пример** + +```handlebars +{{titleize "this is title case"}} + +``` + +## {{trim}} + +Удаляет лишние пробелы с начала и конца строки. + +**Параметры** + +* `string` **{String}**: Строка для обработки. +* `returns` **{String}** + +**Пример** + +```handlebars +{{trim " ABC "}} + +``` + +## {{trimLeft}} + +Удаляет лишние пробелы с начала строки. + +**Параметры** + +* `string` **{String}**: Строка для обработки. +* `returns` **{String}** + +**Пример** + +```handlebars +{{trim " ABC "}} + +``` + +## {{trimRight}} + +Удаляет лишние пробелы с конца строки. + +**Параметры** + +* `string` **{String}**: Строка для обработки. +* `returns` **{String}** + +**Пример** + +```handlebars +{{trimRight " ABC "}} + +``` + +## {{truncate}} + +Обрезает строку до указанной длины. См. также [ellipsis](#ellipsis). + +**Параметры** + +* `str` **{String}** +* `limit` **{Number}**: Желаемая длина строки. +* `suffix` **{String}**: Опционально, строка для обозначения обрезки (по умолчанию — многоточие `…`). +* `returns` **{String}**: Обрезанная строка. + +**Пример** + +```handlebars +truncate("foo bar baz", 7); + +truncate(sanitize("foo bar baz", 7)); + +``` + +## {{truncateWords}} + +Обрезает строку до указанного количества слов. См. также [truncate](#truncate). + +**Параметры** + +* `str` **{String}** +* `limit` **{Number}**: Желаемое количество слов. +* `suffix` **{String}**: Опционально, строка для обозначения обрезки. +* `returns` **{String}**: Обрезанная строка. + +**Пример** + +```handlebars +truncateWords("foo bar baz", 1); + +truncateWords("foo bar baz", 2); + +truncateWords("foo bar baz", 3); + +``` + +## {{upcase}} + +Преобразует все символы в строке в верхний регистр. Аналог [uppercase](#uppercase). + +**Параметры** + +* `string` **{String}** +* `returns` **{String}** + +**Пример** + +```handlebars +{{upcase "aBcDeF"}} + +``` + +## {{uppercase}} + +Преобразует все символы в строке в верхний регистр. Если используется как блок, преобразует весь блок. Не поддерживает инверсные блоки. + +**Параметры** + +* `str` **{String}**: Строка для преобразования. +* `options` **{Object}**: Объект опций Handlebars. +* `returns` **{String}** + +**Пример** + +```handlebars +{{uppercase "aBcDeF"}} + +``` diff --git a/docs/ru-RU/api/handlebars-helpers/url.md b/docs/ru-RU/api/handlebars-helpers/url.md new file mode 100644 index 0000000000..e1833e1087 --- /dev/null +++ b/docs/ru-RU/api/handlebars-helpers/url.md @@ -0,0 +1,81 @@ +# URL + +## {{encodeURI}} + +Кодирует компонент Uniform Resource Identifier (URI), заменяя определённые символы на одну, две, три или четыре escape-последовательности, представляющие UTF-8 кодировку символа. + +**Параметры** + +* `str` **{String}**: Не закодированная строка +* `возвращает` **{String}**: Закодированная строка + +## {{escape}} + +Экранирует заданную строку, заменяя символы на escape-последовательности. Полезно для использования строки в URL и т.п. + +**Параметры** + +* `str` **{String}** +* `возвращает` **{String}**: Экранированная строка. + +## {{decodeURI}} + +Декодирует компонент Uniform Resource Identifier (URI). + +**Параметры** + +* `str` **{String}** +* `возвращает` **{String}** + +## {{url_encode}} + +Псевдоним для [encodeURI](#encodeuri). + +## {{url_decode}} + +Псевдоним для [decodeURI](#decodeuri). + +## {{urlResolve}} + +Принимает базовый URL и URL-адрес (href) и разрешает их так, как это сделал бы браузер для тега-ссылки (anchor). + +**Параметры** + +* `base` **{String}** +* `href` **{String}** +* `возвращает` **{String}** + +## {{urlParse}} + +Разбирает строку `url` в объект. + +**Параметры** + +* `str` **{String}**: Строка URL +* `возвращает` **{String}**: Возвращает строковое представление JSON + +## {{stripQuerystring}} + +Удаляет строку запроса (query string) из указанного `url`. + +**Параметры** + +* `url` **{String}** +* `возвращает` **{String}**: URL без строки запроса + +## {{stripProtocol}} + +Удаляет протокол из `url`. Полезно при отображении медиа-ресурсов, которые могут использовать протокол 'http' на защищённых соединениях. + +**Параметры** + +* `str` **{String}** +* `возвращает` **{String}**: URL с удалённым HTTP-протоколом + +**Пример** + +```handlebars + +{{stripProtocol url}} + +``` diff --git a/docs/ru-RU/api/http/index.md b/docs/ru-RU/api/http/index.md new file mode 100644 index 0000000000..148891a5de --- /dev/null +++ b/docs/ru-RU/api/http/index.md @@ -0,0 +1,303 @@ +# Обзор HTTP API NocoBase + +HTTP API NocoBase разработан на основе концепции "Ресурсы и Действия" (Resource & Action), представляя собой расширенную версию REST API. Поддерживаемые операции включают, но не ограничиваются созданием, чтением, обновлением и удалением данных. Действия с ресурсами могут быть произвольно расширены в NocoBase. + +## Ресурсы + +В NocoBase ресурсы представлены в двух формах: + +- `<коллекция>` +- `<коллекция>.<ассоциация>` + + + +- Коллекция - это набор абстрактных данных +- Ассоциация - связанные данные коллекции +- Ресурс включает как коллекции, так и их ассоциации + + + +### Примеры + +- `posts` - Посты +- `posts.user` - Автор поста +- `posts.tags` - Теги поста + +## Действия + +Действия с ресурсами обозначаются через `:<действие>`: + +- `<коллекция>:<действие>` +- `<коллекция>.<ассоциация>:<действие>` + +Встроенные глобальные действия для коллекций и ассоциаций: + +- `create` - Создать +- `get` - Получить +- `list` - Получить список +- `update` - Обновить +- `destroy` - Удалить +- `move` - Переместить + +Специальные действия для ассоциаций: + +- `set` - Установить +- `add` - Добавить +- `remove` - Удалить +- `toggle` - Переключить + +### Примеры + +- `posts:create` - Создать пост +- `posts.user:get` - Получить автора поста +- `posts.tags:add` - Добавить теги к посту (связать существующие теги) + +## URL запросов + +```bash + /api/<коллекция>:<действие> + /api/<коллекция>:<действие>/<индекс_коллекции> + /api/<коллекция>/<индекс_коллекции>/<ассоциация>:<действие> + /api/<коллекция>/<индекс_коллекции>/<ассоциация>:<действие>/<индекс_ассоциации> +``` + +### Примеры + +Ресурс posts: + +```bash +POST /api/posts:create +GET /api/posts:list +GET /api/posts:get/1 +POST /api/posts:update/1 +POST /api/posts:destroy/1 +``` + +Ресурс posts.comments: + +```bash +POST /api/posts/1/comments:create +GET /api/posts/1/comments:list +GET /api/posts/1/comments:get/1 +POST /api/posts/1/comments:update/1 +POST /api/posts/1/comments:destroy/1 +``` + +Ресурс posts.tags: + +```bash +POST /api/posts/1/tags:create +GET /api/posts/1/tags:get +GET /api/posts/1/tags:list +POST /api/posts/1/tags:update +POST /api/posts/1/tags:destroy +POST /api/posts/1/tags:add +GET /api/posts/1/tags:remove +``` + +## Локализация ресурсов + +- Ресурсы коллекции идентифицируются по `индекс_коллекции`, который должен быть уникальным +- Ресурсы ассоциации идентифицируются парой `индекс_коллекции` и `индекс_ассоциации`, где только их комбинация должна быть уникальной + +При запросе деталей ассоциации URL должен содержать оба индекса, так как `индекс_ассоциации` может повторяться. + +Например, для `tables.fields` (поля таблиц): + +```bash +GET /api/tables/table1/fields/title +GET /api/tables/table2/fields/title +``` + +Обе таблицы содержат поле title, которое уникально в пределах одной таблицы, но может повторяться в других таблицах. + +## Параметры запросов + +Параметры могут передаваться в: +- Заголовках (headers) +- Параметрах строки запроса (query string) +- Теле запроса (для GET-запросов тело не используется) + +Специальные параметры: + +- `filter` - Фильтрация данных (для запросов) +- `filterByTk` - Фильтр по полю tk (для уточнения данных) +- `sort` - Сортировка (для запросов) +- `fields` - Поля для вывода (для запросов) +- `appends` - Дополнительные связанные поля (для запросов) +- `except` - Исключаемые поля (для запросов) +- `whitelist` - Белый список полей (для создания/обновления) +- `blacklist` - Черный список полей (для создания/обновления) + +### filter + +Фильтрация данных: + +```bash +# Простой вариант +GET /api/posts?filter[status]=publish +# Рекомендуемый формат JSON (требует encodeURIComponent) +GET /api/posts?filter={"status":"published"} + +# Операторы фильтрации +GET /api/posts?filter[status.$eq]=publish +GET /api/posts?filter={"status.$eq":"published"} + +# Логические операторы +GET /api/posts?filter={"$and": [{"status.$eq":"published"}, {"title.$includes":"a"}]} +GET /api/posts?filter={"$or": [{"status.$eq":"pending"}, {"status.$eq":"draft"}]} + +# Фильтрация по ассоциациям +GET /api/posts?filter[user.email.$includes]=gmail +GET /api/posts?filter={"user.email.$includes":"gmail"} +``` + +[Подробнее об операторах фильтрации](http-api/filter-operators) + +### filterByTk + +Фильтрация по полю `tk`. При стандартных настройках: + +- Для ресурсов коллекции: `tk` — это первичный ключ таблицы данных. +- Для ассоциативных ресурсов: `tk` — это поле `targetKey` ассоциации. + +```bash +GET /api/posts:get?filterByTk=1&fields=name,title&appends=tags +``` + +### sort + +Сортировка. Чтобы отсортировать по убыванию, добавьте `-` перед названием поля. + +```bash +# Сортировка по полю createdAt по возрастанию +GET /api/posts:get?sort=createdAt +# Сортировка по полю createdAt по убыванию +GET /api/posts:get?sort=-createdAt +# Совместная сортировка по нескольким полям: createdAt — по убыванию, title — по возрастанию (A–Z) +GET /api/posts:get?sort=-createdAt,title +``` + +### fields + +Поля данных для вывода. + +```bash +GET /api/posts:list?fields=name,title + +Ответ 200 (application/json) +{ + "data": [ + { + "name": "", + "title": "" + } + ], + "meta": {} +} +``` + +### appends + +Дополнительные поля связанных данных (связанные ресурсы). + +### except + +Исключает указанные поля из вывода (не возвращаются). Используется в операциях, связанных с запросами. + +### whitelist + +Белый список полей. + +```bash +POST /api/posts:create?whitelist=title + +{ + "title": "Мой первый пост", + "date": "2022-05-19" # Поле date будет отфильтровано и не попадёт в базу данных +} +``` + +### blacklist + +Чёрный список полей. + +```bash +POST /api/posts:create?blacklist=date + +# Поле date будет отфильтровано и не попадёт в базу данных +{ + "title": "Мой первый пост" +} +``` + +## Ответ на запрос + +Формат ответа: + +```ts +type ResponseResult = { + data?: any; // Основные данные + meta?: any; // Дополнительная информация + errors?: ResponseError[]; // Ошибки +}; + +type ResponseError = { + code?: string; + message: string; +}; +``` + +### Примеры + +Получение списка: + +```bash +GET /api/posts:list + +Ответ 200 (application/json) + +{ + data: [ + { + id: 1 + } + ], + meta: { + count: 1, + page: 1, + pageSize: 1, + totalPage: 1 + } +} +``` + +Просмотр деталей: + +```bash +GET /api/posts:get/1 + +Ответ 200 (application/json) + +{ + data: { + id: 1 + } +} +``` + +Ошибка: + +```bash +POST /api/posts:create + +Ответ 400 (application/json) + +{ + errors: [ + { + message: 'имя обязательно для заполнения', + } + ] +} +``` diff --git a/docs/ru-RU/api/http/rest-api.md b/docs/ru-RU/api/http/rest-api.md new file mode 100644 index 0000000000..f5131a9116 --- /dev/null +++ b/docs/ru-RU/api/http/rest-api.md @@ -0,0 +1,160 @@ +# REST API + +HTTP API NocoBase является надмножеством REST API, а стандартный CRUD API также поддерживает RESTful-стиль. + +## Ресурсы коллекций + +### Создание записи в коллекции + +**HTTP API** +``` +POST /api/<коллекция>:create + +{} # тело в формате JSON +``` + +**REST API** +``` +POST /api/<коллекция> + +{} # тело в формате JSON +``` + +### Просмотр списка записей коллекции + +**HTTP API** +``` +GET /api/<коллекция>:list +``` + +**REST API** +``` +GET /api/<коллекция> +``` + +### Просмотр деталей записи коллекции + +**HTTP API** +``` +GET /api/<коллекция>:get?filterByTk=<индекс_коллекции> +GET /api/<коллекция>:get/<индекс_коллекции> +``` + +**REST API** +``` +GET /api/<коллекция>/<индекс_коллекции> +``` + +### Обновление записи в коллекции + +**HTTP API** +``` +POST /api/<коллекция>:update?filterByTk=<индекс_коллекции> + +{} # тело в формате JSON + +# Или +POST /api/<коллекция>:update/<индекс_коллекции> + +{} # тело в формате JSON +``` + +**REST API** +``` +PUT /api/<коллекция>/<индекс_коллекции> + +{} # тело в формате JSON +``` + +### Удаление записи из коллекции + +**HTTP API** +``` +POST /api/<коллекция>:destroy?filterByTk=<индекс_коллекции> +# Или +POST /api/<коллекция>:destroy/<индекс_коллекции> +``` + +**REST API** +``` +DELETE /api/<коллекция>/<индекс_коллекции> +``` + +## Ассоциативные ресурсы (связанные данные) + +### Создание ассоциированной записи + +**HTTP API** +``` +POST /api/<коллекция>/<индекс_коллекции>/<ассоциация>:create + +{} # тело в формате JSON +``` + +**REST API** +``` +POST /api/<коллекция>/<индекс_коллекции>/<ассоциация> + +{} # тело в формате JSON +``` + +### Просмотр списка ассоциированных записей + +**HTTP API** +``` +GET /api/<коллекция>/<индекс_коллекции>/<ассоциация>:list +``` + +**REST API** +``` +GET /api/<коллекция>/<индекс_коллекции>/<ассоциация> +``` + +### Просмотр деталей ассоциированной записи + +**HTTP API** +``` +GET /api/<коллекция>/<индекс_коллекции>/<ассоциация>:get?filterByTk=<индекс_ассоциации> +# Или +GET /api/<коллекция>/<индекс_коллекции>/<ассоциация>:get/<индекс_ассоциации> +``` + +**REST API** +``` +GET /api/<коллекция>/<индекс_коллекции>/<ассоциация>:get/<индекс_ассоциации> +``` + +### Обновление ассоциированной записи + +**HTTP API** +``` +POST /api/<коллекция>/<индекс_коллекции>/<ассоциация>:update?filterByTk=<индекс_ассоциации> + +{} # тело в формате JSON + +# Или +POST /api/<коллекция>/<индекс_коллекции>/<ассоциация>:update/<индекс_ассоциации> + +{} # тело в формате JSON +``` + +**REST API** +``` +PUT /api/<коллекция>/<индекс_коллекции>/<ассоциация>:update/<индекс_ассоциации> + +{} # тело в формате JSON +``` + +### Удаление ассоциированной записи + +**HTTP API** +``` +POST /api/<коллекция>/<индекс_коллекции>/<ассоциация>:destroy?filterByTk=<индекс_ассоциации> +# Или +POST /api/<коллекция>/<индекс_коллекции>/<ассоциация>:destroy/<индекс_ассоциации> +``` + +**REST API** +``` +DELETE /api/<коллекция>/<индекс_коллекции>/<ассоциация>/<индекс_ассоциации> +``` diff --git a/docs/ru-RU/api/index.md b/docs/ru-RU/api/index.md new file mode 100644 index 0000000000..cf91ede20a --- /dev/null +++ b/docs/ru-RU/api/index.md @@ -0,0 +1,17 @@ +# Обзор + +| Модуль | Пакет | Описание | +| ----------------------------------------------------------------------------------------------------- | ------------------------- | ------------------------------------- | +| [Сервер](/api/server/application) | `@nocobase/server` | Приложение на стороне сервера | +| [База данных](/api/database) | `@nocobase/database` | Слой доступа к базе данных | +| [Resourcer](/api/resourcer/resource-manager) | `@nocobase/resourcer` | Управление ресурсами и маршрутизация | +| [ACL](/api/acl/acl) | `@nocobase/acl` | Управление доступом (Access Control) | +| [Auth](/api/auth/auth-manager) | `@nocobase/auth` | Аутентификация пользователей | +| Клиент | `@nocobase/client` | Приложение на стороне клиента | +| [Кэш](/api/cache/cache-manager) | `@nocobase/cache` | Кэширование на стороне сервера | +| [Логгер](/api/logger) | `@nocobase/logger` | Ведение логов на стороне сервера | +| [Телеметрия](/api/telemetry/telemetry) | `@nocobase/telemetry` | Сбор телеметрии на стороне сервера | +| [CLI](/api/cli) | `@nocobase/cli` | Командная строка NocoBase | +| [SDK](/api/sdk) | `@nocobase/sdk` | SDK NocoBase | +| [Действия](/api/actions) | `@nocobase/actions` | Встроенные операции с ресурсами | +| [Тестирование](/api/test/server) | `@nocobase/test` | Автоматизированное тестирование | diff --git a/docs/ru-RU/api/logger.md b/docs/ru-RU/api/logger.md new file mode 100644 index 0000000000..64e0ed09e9 --- /dev/null +++ b/docs/ru-RU/api/logger.md @@ -0,0 +1,160 @@ +# @nocobase/logger + +## Создание логгера + +### `createLogger()` + +Создаёт пользовательский логгер. + +#### Сигнатура + +```ts +createLogger(options: LoggerOptions) +``` + +#### Тип + +```ts +interface LoggerOptions extends Omit { + dirname?: string; + filename?: string; + format?: 'logfmt' | 'json' | 'delimiter' | 'console' | winston.Logform.Format; + transports?: ('console' | 'file' | 'dailyRotateFile' | winston.transport)[]; +} +``` + +#### Параметры + +- `dirname`: Каталог для сохранения логов. +- `filename`: Имя файла логов. +- `format`: Формат вывода логов. +- `transports`: Методы (каналы) вывода логов. + +--- + +### `createSystemLogger()` + +Создаёт системные логи выполнения приложения, выводимые указанным способом. См. [Плагин логгера — Системный лог](../plugins/logger/index.md#system-log). + +#### Сигнатура + +```ts +createSystemLogger(options: SystemLoggerOptions) +``` + +#### Тип + +```ts +export interface SystemLoggerOptions extends LoggerOptions { + seperateError?: boolean; // выводить ошибки отдельно, по умолчанию true +} +``` + +#### Параметры + +- `seperateError`: Определяет, следует ли отдельно выводить логи уровня `error`. + +--- + +### `app.createLogger()` + +#### Определение + +```ts +class Application { + createLogger(options: LoggerOptions) { + const { dirname } = options; + return createLogger({ + ...options, + dirname: getLoggerFilePath(this.name || 'main', dirname || ''), + }); + } +} +``` + +Если `dirname` задан как относительный путь, файлы логов будут сохраняться в каталоге, названном по имени текущего приложения. + +--- + +### `plugin.createLogger()` + +Использование аналогично `app.createLogger()`. + +#### Определение + +```ts +class Plugin { + createLogger(options: LoggerOptions) { + return this.app.createLogger(options); + } +} +``` + +--- + +## Конфигурация + +### `getLoggerLevel()` + +```ts +getLoggerLevel(): 'debug' | 'info' | 'warn' | 'error' +``` + +Возвращает текущий уровень логирования, заданный в системе. + +--- + +### `getLoggerFilePath()` + +```ts +getLoggerFilePath(...paths: string[]): string +``` + +Объединяет переданные пути в один, на основе каталога логов, заданного в конфигурации системы. + +--- + +### `getLoggerTransports()` + +```ts +getLoggerTransports(): ('console' | 'file' | 'dailyRotateFile')[] +``` + +Возвращает методы (каналы) вывода логов, настроенные в системе. + +--- + +### `getLoggerFormat()` + +```ts +getLoggerFormat(): 'logfmt' | 'json' | 'delimiter' | 'console' +``` + +Возвращает формат логов, заданный в системе. + +--- + +## Каналы вывода (Transports) + +Предопределённые методы вывода логов. + +- `Transports.console` +- `Transports.file` +- `Transports.dailyRotateFile` + +#### Пример использования + +```ts +import { Transports } from '@nocobase/logger'; + +const transport = Transports.console({ + // ... +}); +``` + +--- + +## Ссылки + +- [Руководство — Логгер](../handbook/logger/index.md) +- [Плагин логгера](../plugins/logger/index.md) diff --git a/docs/ru-RU/api/resourcer/action.md b/docs/ru-RU/api/resourcer/action.md new file mode 100644 index 0000000000..ec11984754 --- /dev/null +++ b/docs/ru-RU/api/resourcer/action.md @@ -0,0 +1,173 @@ +# ctx.action + +## Обзор + +После обработки запроса на операцию с ресурсом middleware [`resourceManager.middleware()`](./resource-manager#middleware), важные параметры запроса сохраняются в `ctx.action` для использования последующими middleware. + +## API + +### resourceName + +`ctx.action.resourceName` + +Имя ресурса. Может иметь две формы: + +- `a` - Операция с ресурсом `a` +- `a.b` - Операция с ассоциированным объектом `b` ресурса `a` + +### actionName + +`ctx.action.actionName` + +Название действия. + +### sourceId + +`ctx.action.sourceId` + +Когда объект операции является ассоциированным объектом ресурса, представляет значение первичного ключа соответствующего ресурса. Например: при `resourceName` равном `a.b`, `sourceId` представляет значение первичного ключа `a`. + +### params + +Параметры запроса. + +- Параметры URL можно получить напрямую из `ctx.action.params` + +```ts +const { filterByTk } = ctx.action.params; +``` + +- Параметры тела запроса можно получить через `ctx.action.params.values` + +### mergeParams() + +Объединяет содержимое параметров с параметрами запроса. + +```ts +ctx.action.mergeParams( + { + filter: { + name: 'foo', + }, + fields: ['id', 'name'], + except: ['name'], + sort: ['id'], + page: 1, + pageSize: 10, + values: { + name: 'foo', + }, + }, + { + filter: 'and', + fields: 'union', + except: 'union', + sort: 'overwrite', + page: 'overwrite', + pageSize: 'overwrite', + values: 'deepMerge', + }, +); + +ctx.action.mergeParams( + { + filter: {}, + }, + { + filter: (x, y) => { + // ... + }, + }, +); +``` + +#### Сигнатура + +- `mergeParams(params: ActionParams, strategies: MergeStrategies = {})` + +#### Типы + +```ts +export interface ActionParams { + filterByTk?: any; + fields?: string[]; + appends?: string[]; + except?: string[]; + whitelist?: string[]; + blacklist?: string[]; + filter?: FilterOptions; + sort?: string[]; + page?: number; + pageSize?: number; + values?: any; + [key: string]: any; +} + +type MergeStrategyType = + | 'merge' + | 'deepMerge' + | 'overwrite' + | 'andMerge' + | 'orMerge' + | 'intersect' + | 'union'; +type MergeStrategyFunc = (x: any, y: any) => any; +export type MergeStrategy = MergeStrategyType | MergeStrategyFunc; +export interface MergeStrategies { + [key: string]: MergeStrategy; +} +``` + +#### Подробности + +| Свойство | Тип | Описание | +| ----------- | ------------------------------------------------------- | --------------------------------------------------------- | +| `params` | [`ActionParams`](#actionparams) | Параметры запроса | +| `strategies`| [`{ [key: string]: MergeStrategies }`](#mergestrategies)| Стратегии слияния для различных полей параметров запроса | + +Стандартные `strategies`: + +```ts +{ + filter: 'andMerge', + fields: 'intersect', + appends: 'union', + except: 'union', + whitelist: 'intersect', + blacklist: 'intersect', + sort: 'overwrite', +}; +``` + +##### ActionParams + +| Свойство | Тип | Описание | +| -------------- | ----------- | ----------------------------------------------------------------------- | +| `filterByTk` | `any` | Значение первичного ключа операционного ресурса | +| `filter` | `Filter` | Параметры фильтрации (см. [Filter Operators](./database/operators)) | +| `fields` | `string[]` | Получаемые поля | +| `except` | `string[]` | Исключаемые поля | +| `appends` | `string[]` | Добавляемые связанные поля | +| `whitelist` | `string[]` | Белый список полей | +| `blacklist` | `string[]` | Черный список полей | +| `sort` | `string[]` | Параметры сортировки | +| `page` | `number` | Текущая страница | +| `pageSize` | `number` | Количество элементов данных на странице | +| `values` | `any` | Тело запроса | +| `[key: string]`| `any` | Другие расширенные конфигурации | + +##### MergeStrategies + +Предопределенные стратегии слияния или пользовательские функции слияния. + +Предопределенные стратегии: + +| Название стратегии | Описание | +| ------------------ | --------------------------------------------- | +| `merge` | `Object.assign` | +| `deepMerge` | Глубокое рекурсивное слияние | +| `overwrite` | Перезапись | +| `andMerge` | Слияние параметров фильтра с оператором `$and`| +| `orMerge` | Слияние параметров фильтра с оператором `$or` | +| `intersect` | Пересечение | +| `union` | Объединение | diff --git a/docs/ru-RU/api/resourcer/middleware.md b/docs/ru-RU/api/resourcer/middleware.md new file mode 100644 index 0000000000..3f893903bc --- /dev/null +++ b/docs/ru-RU/api/resourcer/middleware.md @@ -0,0 +1,191 @@ +# Мидлвары (Промежуточное ПО) + +Мидлвары в NocoBase похожи на мидлвары в Koa, но обладают расширенными возможностями для упрощения расширения функциональности. +Определённые мидлвары можно вставлять и использовать в различных местах, например, в роутере ресурсов (resourcer), а момент их вызова определяется разработчиком. + +## Конструктор + +### Сигнатура + +```js +constructor(options: Function) +constructor(options: MiddlewareOptions) +``` + +### Параметры + +| Имя | Тип | По умолчанию | Описание | +|-----------|----------------------|--------------|------------------------------------------| +| `options` | `Function` | — | Функция-обработчик мидлвара | +| `options` | `MiddlewareOptions` | — | Объект настроек мидлвара | +| `options.only` | `string[]` | — | Разрешены только указанные действия | +| `options.except` | `string[]` | — | Исключённые действия (не будут обработаны)| +| `options.handler` | `Function` | — | Функция-обработчик | + +### Примеры + +**Простое определение:** + +```js +const middleware = new Middleware((ctx, next) => { + await next(); +}); +``` + +**Определение с параметрами:** + +```js +const middleware = new Middleware({ + only: ['create', 'update'], + async handler(ctx, next) { + await next(); + }, +}); +``` + +## Методы экземпляра + +### `getHandler()` + +Возвращает скомпонованную цепочку обработчиков. + +#### Пример + +Следующий мидлвар при запросе выведет сначала `1`, затем `2`: + +```js +const middleware = new Middleware((ctx, next) => { + console.log(1); + await next(); +}); + +middleware.use(async (ctx, next) => { + console.log(2); + await next(); +}); + +app.resourcer.use(middleware.getHandler()); +``` + +--- + +### `use()` + +Добавляет функцию-мидлвар в текущую цепочку. Используется для расширения функциональности мидлвара. +См. пример в `getHandler()`. + +#### Сигнатура + +```js +use(middleware: Function) +``` + +#### Параметры + +| Имя | Тип | По умолчанию | Описание | +|------------|------------|--------------|------------------------------| +| `middleware` | `Function` | — | Функция-обработчик мидлвара | + +--- + +### `disuse()` + +Удаляет ранее добавленную функцию-мидлвар из текущей цепочки. + +#### Сигнатура + +```js +disuse(middleware: Function) +``` + +#### Параметры + +| Имя | Тип | По умолчанию | Описание | +|------------|------------|--------------|------------------------------| +| `middleware` | `Function` | — | Функция-обработчик мидлвара | + +#### Пример + +В этом примере при запросе будет выведено только `1`. Вывод `2` из `fn1` выполняться не будет: + +```js +const middleware = new Middleware((ctx, next) => { + console.log(1); + await next(); +}); + +async function fn1(ctx, next) { + console.log(2); + await next(); +} + +middleware.use(fn1); + +app.resourcer.use(middleware.getHandler()); + +middleware.disuse(fn1); +``` + +--- + +### `canAccess()` + +Проверяет, должен ли текущий мидлвар быть вызван для указанного действия. Обычно используется внутри `resourcer`. + +#### Сигнатура + +```js +canAccess(name: string): boolean +``` + +#### Параметры + +| Имя | Тип | По умолчанию | Описание | +|---------|----------|--------------|------------------------| +| `name` | `string` | — | Название действия | + +--- + +## Другие экспорты + +### `branch()` + +Создаёт "ветвящийся" мидлвар, позволяющий выбирать разные обработчики в зависимости от контекста. + +#### Сигнатура + +```js +branch(map: { [key: string]: Function }, reducer: Function, options): Function +``` + +#### Параметры + +| Имя | Тип | По умолчанию | Описание | +|---------------------|-----------------------------|--------------------|--------------------------------------------------------------------------| +| `map` | `{ [key: string]: Function }` | — | Таблица соответствия обработчиков; ключи определяются функцией `reducer` | +| `reducer` | `(ctx) => string` | — | Функция, вычисляющая ключ ветви на основе контекста | +| `options?` | `Object` | — | Дополнительные настройки ветвления | +| `options.keyNotFound?` | `Function` | `ctx.throw(404)` | Обработчик, вызываемый, если ключ не найден | +| `options.handlerNotSet?` | `Function` | `ctx.throw(404)` | Обработчик, вызываемый, если для ключа не задан обработчик | + +#### Пример + +Определяет, как действовать дальше при аутентификации, в зависимости от параметра `authenticator` в URL: + +```js +app.resourcer.use( + branch( + { + password: async (ctx, next) => { + // Обработка аутентификации по паролю + }, + sms: async (ctx, next) => { + // Обработка аутентификации по SMS + }, + }, + (ctx) => { + return ctx.action.params.authenticator ?? 'password'; + } + ) +); +``` diff --git a/docs/ru-RU/api/resourcer/resource-manager.md b/docs/ru-RU/api/resourcer/resource-manager.md new file mode 100644 index 0000000000..af26926076 --- /dev/null +++ b/docs/ru-RU/api/resourcer/resource-manager.md @@ -0,0 +1,258 @@ +# ResourceManager + +## Обзор + +`ResourceManager` - это модуль управления ресурсами в NocoBase, используемый для определения ресурсов и регистрации методов операций с ними. + +## Методы класса + +### `define()` + +Определяет ресурс. + +```ts +app.resourceManager.define({ + name: 'auth', + actions: { + check: async (ctx, next) => { + // ... + await next(); + }, + }, +}); +``` + +#### Сигнатура + +- `define(options: ResourceOptions): Resource` + +#### Типы + +```ts +export interface ResourceOptions { + name: string; + type?: ResourceType; + actions?: { + [key: string]: ActionType; + }; + only?: Array; + except?: Array; + middleware?: MiddlewareType; + middlewares?: MiddlewareType; +} + +export type ResourceType = + | 'single' + | 'hasOne' + | 'hasMany' + | 'belongsTo' + | 'belongsToMany'; + +export type ActionType = HandlerType | ActionOptions; +export type HandlerType = ( + ctx: ResourcerContext, + next: () => Promise, +) => any; +export interface ActionOptions { + values?: any; + fields?: string[]; + appends?: string[]; + except?: string[]; + whitelist?: string[]; + blacklist?: string[]; + filter?: FilterOptions; + sort?: string[]; + page?: number; + pageSize?: number; + maxPageSize?: number; + middleware?: MiddlewareType; + middlewares?: MiddlewareType; + handler?: HandlerType; + [key: string]: any; +} +``` + +#### Подробности + +##### ResourceOptions + +| Свойство | Тип | Описание | По умолчанию | +| ------------- | --------------------------------------------- | ------------------- | ------------ | +| `name` | `string` | Имя ресурса | - | +| `type` | `ResourceType` | Тип ресурса | `single` | +| `actions` | [`{ [key: string]: ActionType }`](#actiontype)| Действия | - | +| `only` | `ActionName[]` | Белый список действий | - | +| `except` | `ActionName[]` | Черный список действий | - | +| `middleware` | `MiddlewareType` | Middleware | - | +| `middlewares` | `MiddlewareType` | Middlewares | - | + +##### ActionType + +Существует два типа методов действий: + +- `HandlerType` + +Определяет метод операции напрямую через middleware. Пример: + +```ts +app.resourceManager.define({ + name: 'users', + actions: { + updateProfile: async (ctx, next) => { + // ... + await next(); + }, + }, +}); +``` + +- `ActionOptions` + +Используется для переопределения параметров запроса существующей операции. Пример: + +```ts +app.resourceManager.define({ + name: 'users', + actions: { + list: { + fields: [], + filter: {}, + // ... + }, + }, +}); +``` + +| Свойство | Тип | Описание | +| -------------- | --------------- | ----------------------------------------------------------------------- | +| `values` | `any` | Значения по умолчанию для запроса действия | +| `filter` | `Filter` | Параметры фильтрации (см. [Filter Operators](../database/operators.md)) | +| `fields` | `string[]` | Получаемые поля | +| `except` | `string[]` | Исключаемые поля | +| `appends` | `string[]` | Добавляемые связанные поля | +| `whitelist` | `string[]` | Белый список полей | +| `blacklist` | `string[]` | Черный список полей | +| `sort` | `string[]` | Параметры сортировки | +| `page` | `number` | Текущая страница | +| `pageSize` | `number` | Количество элементов на странице | +| `maxPageSize` | `number` | Максимальное количество элементов на странице | +| `middleware` | `MiddlewareType`| Middleware | +| `middlewares` | `MiddlewareType`| Middlewares | +| `handler` | `HandlerType` | Метод выполнения действия | +| `[key: string]`| `any` | Другие расширенные конфигурации | + +### `registerActionHandlers()` + +Регистрирует методы действий. + +#### Сигнатура + +- `registerActionHandler(name: ActionName, handler: HandlerType)` + +#### Типы + +```ts +export type DefaultActionType = + | 'list' + | 'create' + | 'get' + | 'update' + | 'destroy' + | 'set' + | 'add' + | 'remove'; +export type ActionName = DefaultActionType | Omit; + +export type HandlerType = ( + ctx: ResourcerContext, + next: () => Promise, +) => any; +``` + +#### Подробности + +| Свойство | Тип | Описание | +| --------- | ------------ | ----------------------------------------------------------------------------------------------------------------------------- | +| `name` | `ActionName` | Имя действия:
    1. Как обычная строка - регистрирует действия для всех ресурсов
    2. В форме `<ресурс>:<действие>` - регистрирует действия для конкретных ресурсов | +| `handler` | `HandlerType`| Middleware для действия | + +### `isDefined()` + +Проверяет, определен ли ресурс. + +#### Сигнатура + +- `isDefined(name: string)` + +#### Подробности + +| Свойство | Тип | Описание | +| -------- | ------- | ---------- | +| `name` | `string`| Имя ресурса | + +### `import()` + +Загружает конфигурации ресурсов из указанной директории. + +```ts +// ./resources/demo.ts +export default { + name: 'demo', + actions: { + async list(ctx, next) { + // ... + await next(); + }, + }, +}; + +const resourceManager = new ResourceManager(); +await resourceManager.import({ + directory: path.resolve(__dirname, 'resources'), +}); +``` + +#### Сигнатура + +- `import(options: ImportOptions): Promise>` + +#### Типы + +```ts +export interface ImportOptions { + directory: string; + extensions?: string[]; +} +``` + +#### Подробности + +| Свойство | Тип | Описание | Значение по умолчанию | +| ------------ | --------- | ---------------------- | ----------------------- | +| `directory` | `string` | Путь к директории | - | +| `extensions` | `string[]`| Опционально, расширения файлов | `['js', 'ts', 'json']` | + +### `use()` + +Добавляет middleware для `ResourceManager`. + +```ts +resourceManager.use(async () => { + return async function (ctx, next) { + // ... + await next(); + }; +}); +``` + +#### Сигнатура + +- `use(middlewares: HandlerType | HandlerType[], options: ToposortOptions = {})` + +#### Подробности + +См. [Middleware](../../development/server/middleware.md). + +### `middleware()` + +Middleware для `ResourceManager`, обрабатывает параметры запроса (см. [ctx.action](./action.md)) и выполняет методы операций. diff --git a/docs/ru-RU/api/resourcer/resource.md b/docs/ru-RU/api/resourcer/resource.md new file mode 100644 index 0000000000..2da7dbb834 --- /dev/null +++ b/docs/ru-RU/api/resourcer/resource.md @@ -0,0 +1,120 @@ +# Ресурс + +Ресурс используется для определения экземпляра ресурса. Экземпляры ресурсов, управляемые `resourcer`, могут быть доступны через HTTP-запросы. + +## Конструктор + +Создаёт экземпляр ресурса. Обычно используется не напрямую, а через вызов метода `define()` у `resourcer`. + +### Сигнатура + +```js +constructor(options: ResourceOptions, resourcer: Resourcer) +``` + +### Параметры + +| Имя | Тип | По умолчанию | Описание | +|-----|-----|--------------|----------| +| `options.name` | `string` | — | Название ресурса, соответствует адресу ресурса в маршруте URL | +| `options.type` | `string` | `'single'` | Тип ресурса. Допустимые значения: `'single'`, `'hasOne'`, `'hasMany'`, `'belongsTo'`, `'belongsToMany'` | +| `options.actions` | `Object` | — | Список действий, которые можно выполнять с ресурсом. Подробности в примере | +| `options.middlewares` | `MiddlewareType \| MiddlewareType[]` | — | Список мидлваров, применяемых ко всем операциям данного ресурса. Подробности в примере | +| `options.only` | `ActionName[]` | `[]` | Белый список глобальных действий. Если массив не пуст, доступны только действия, указанные в нём | +| `options.except` | `ActionName[]` | `[]` | Чёрный список глобальных действий. Если массив не пуст, все действия, кроме указанных, будут доступны | +| `resourcer` | `Resourcer` | — | Экземпляр `resourcer` | + +### Пример + +```js +app.resourcer.define({ + name: 'books', + actions: { + // Расширенное действие + publish(ctx, next) { + ctx.body = 'ok'; + }, + }, + middleware: [ + // Расширенный мидлвар + async (ctx, next) => { + await next(); + }, + ], +}); +``` + +## Элементы экземпляра + +### `options` + +Настройки текущего ресурса. + +### `resourcer` + +Экземпляр `resourcer`, которому принадлежит данный ресурс. + +### `middlewares` + +Зарегистрированные мидлвары. + +### `actions` + +Таблица зарегистрированных действий. + +### `except` + +Действия, исключённые из доступа. + +## Методы экземпляра + +### `getName()` + +Возвращает имя текущего ресурса. + +#### Сигнатура + +```js +getName(): string +``` + +#### Пример + +```js +const resource = app.resourcer.define({ + name: 'books', +}); + +resource.getName(); // 'books' +``` + +### `getAction()` + +Возвращает действие с указанным именем. + +#### Сигнатура + +```js +getAction(name: string): Action +``` + +#### Параметры + +| Имя | Тип | По умолчанию | Описание | +|-----|-----|--------------|----------| +| `name` | `string` | — | Название действия | + +#### Пример + +```js +const resource = app.resourcer.define({ + name: 'books', + actions: { + publish(ctx, next) { + ctx.body = 'ok'; + }, + }, +}); + +resource.getAction('publish'); // [Function: publish] +``` diff --git a/docs/ru-RU/api/sdk/auth.md b/docs/ru-RU/api/sdk/auth.md new file mode 100644 index 0000000000..0f08853c13 --- /dev/null +++ b/docs/ru-RU/api/sdk/auth.md @@ -0,0 +1,70 @@ +# Аутентификация (Auth) + +## Обзор + +Класс `Auth` в основном используется для получения информации о пользователе на стороне клиента, а также для вызова API, связанных с аутентификацией пользователя. + +## Свойства экземпляра + +### `locale` + +Язык, используемый текущим пользователем. + +### `role` + +Роль, используемая текущим пользователем. + +### `token` + +Токен для доступа к API. + +### `authenticator` + +Метод аутентификации (authenticator), используемый для входа текущего пользователя. См. [Аутентификация пользователя](../../handbook/auth/user.md). + +## Статические методы класса + +### `signIn()` + +Вход пользователя в систему (авторизация). + +#### Сигнатура + +- `async signIn(values: any, authenticator?: string): Promise>` + +#### Параметры + +| Параметр | Тип | Описание | +|------------------|----------|-----------------------------------------------| +| `values` | `any` | Параметры запроса к API входа в систему | +| `authenticator` | `string` | Идентификатор метода аутентификации, используемый при входе | + +### `signUp()` + +Регистрация пользователя. + +#### Сигнатура + +- `async signUp(values: any, authenticator?: string): Promise>` + +#### Параметры + +| Параметр | Тип | Описание | +|------------------|----------|---------------------------------------------------| +| `values` | `any` | Параметры запроса к API регистрации | +| `authenticator` | `string` | Идентификатор метода аутентификации при регистрации | + +### `signOut()` + +Выход пользователя из системы. + +#### Сигнатура + +- `async signOut(values: any, authenticator?: string): Promise>` + +#### Параметры + +| Параметр | Тип | Описание | +|------------------|----------|-----------------------------------------------| +| `values` | `any` | Параметры запроса к API выхода | +| `authenticator` | `string` | Идентификатор метода аутентификации при выходе | diff --git a/docs/ru-RU/api/sdk/index.md b/docs/ru-RU/api/sdk/index.md new file mode 100644 index 0000000000..a94b57313a --- /dev/null +++ b/docs/ru-RU/api/sdk/index.md @@ -0,0 +1,151 @@ +# APIClient + +## Обзор + +`APIClient` - это обертка на основе `axios`, используемая для выполнения HTTP-запросов к ресурсам NocoBase на клиентской стороне. + +### Базовое использование + +```ts +class PluginSampleAPIClient extends Plugin { + async load() { + const res = await this.app.apiClient.request({ + // ... + }); + } +} +``` + +## Свойства экземпляра + +### `axios` + +Экземпляр `axios`, предоставляющий доступ к API `axios`, например `apiClient.axios.interceptors`. + +### `auth` + +Класс аутентификации на клиентской стороне, см. [Auth](./auth.md). + +### `storage` + +Класс клиентского хранилища, см. [Storage](./storage.md). + +## Методы класса + +### `constructor()` + +Конструктор для создания экземпляра `APIClient`. + +#### Сигнатура + +- `constructor(instance?: APIClientOptions)` + +#### Типы + +```ts +interface ExtendedOptions { + authClass?: any; + storageClass?: any; +} + +export type APIClientOptions = + | AxiosInstance + | (AxiosRequestConfig & ExtendedOptions); +``` + +### `request()` + +Выполняет HTTP-запрос. + +#### Сигнатура + +- `request, D = any>(config: AxiosRequestConfig | ResourceActionOptions): Promise` + +#### Типы + +```ts +type ResourceActionOptions

    = { + resource?: string; + resourceOf?: any; + action?: string; + params?: P; +}; +``` + +#### Подробности + +##### AxiosRequestConfig + +Стандартные параметры запроса axios. См. Request Config. + +```ts +const res = await apiClient.request({ url: '' }); +``` + +##### ResourceActionOptions + +Параметры для операций с ресурсами NocoBase. + +```ts +const res = await apiClient.request({ + resource: 'users', + action: 'list', + params: { + pageSize: 10, + }, +}); +``` + +| Свойство | Тип | Описание | +| --------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------- | +| `resource` | `string`| 1. Имя ресурса, например `a`
    2. Имя ассоциированного объекта, например `a.b` | +| `resourceOf` | `any` | Значение первичного ключа ресурса, когда `resource` является именем ассоциированного объекта. Например, для `a.b` - значение первичного ключа `a`. | +| `action` | `string`| Имя действия | +| `params` | `any` | Объект параметров запроса (в основном URL-параметры), тело запроса передается в `params.values` | +| `params.values` | `any` | Объект тела запроса | + +### `resource()` + +Получает объект с методами для операций с ресурсами NocoBase. + +```ts +const resource = apiClient.resource('users'); + +await resource.create({ + values: { + username: 'admin', + }, +}); + +const res = await resource.list({ + page: 2, + pageSize: 20, +}); +``` + +#### Сигнатура + +- `resource(name: string, of?: any, headers?: AxiosRequestHeaders): IResource` + +#### Типы + +```ts +export interface ActionParams { + filterByTk?: any; + [key: string]: any; +} + +type ResourceAction = (params?: ActionParams) => Promise; + +export type IResource = { + [key: string]: ResourceAction; +}; +``` + +#### Подробности + +| Параметр | Тип | Описание | +| -------- | -------------------- | ---------------------------------------------------------------------------------------------------------------------------- | +| `name` | `string` | Имя ресурса, например `a`
    2. Имя ассоциированного объекта, например `a.b` | +| `of` | `any` | Значение первичного ключа ресурса, когда `resource` является именем ассоциированного объекта. Например, для `a.b` - значение первичного ключа `a`. | +| `headers`| `AxiosRequestHeaders`| HTTP-заголовки, которые будут отправляться с последующими запросами операций с ресурсами | diff --git a/docs/ru-RU/api/sdk/storage.md b/docs/ru-RU/api/sdk/storage.md new file mode 100644 index 0000000000..1b3608ce89 --- /dev/null +++ b/docs/ru-RU/api/sdk/storage.md @@ -0,0 +1,54 @@ +# Хранилище (Storage) + +## Обзор + +Класс `Storage` используется для хранения данных на стороне клиента. По умолчанию применяется `localStorage`. + +### Базовое использование + +```ts +export abstract class Storage { + abstract clear(): void; + abstract getItem(key: string): string | null; + abstract removeItem(key: string): void; + abstract setItem(key: string, value: string): void; +} + +export class CustomStorage extends Storage { + // ... +} +``` + +## Методы класса + +### `setItem()` + +Сохраняет данные в хранилище. + +#### Сигнатура + +- `setItem(key: string, value: string): void` + +### `getItem()` + +Извлекает данные из хранилища по ключу. + +#### Сигнатура + +- `getItem(key: string): string | null` + +### `removeItem()` + +Удаляет данные из хранилища по указанному ключу. + +#### Сигнатура + +- `removeItem(key: string): void` + +### `clear()` + +Очищает всё содержимое хранилища. + +#### Сигнатура + +- `clear(): void` diff --git a/docs/ru-RU/api/server/application.md b/docs/ru-RU/api/server/application.md new file mode 100644 index 0000000000..d3ba62b039 --- /dev/null +++ b/docs/ru-RU/api/server/application.md @@ -0,0 +1,368 @@ +# Приложение (Application) + +## Обзор + +`Application` - это центральный модуль сервера NocoBase, основанный на расширениях [Koa](https://koajs.com). Отвечает за основную логику инициализации приложения и управление его жизненным циклом. + +## Конструктор + +### `constructor()` + +#### Сигнатура + +- `constructor(public options: ApplicationOptions)` + +#### Типы + +```typescript +export type PluginType = string | typeof Plugin; +export type PluginConfiguration = PluginType | [PluginType, any]; + +export interface ResourceManagerOptions { + prefix?: string; +} + +export interface AppLoggerOptions { + request: RequestLoggerOptions; + system: SystemLoggerOptions; +} + +export interface AppTelemetryOptions extends TelemetryOptions { + enabled?: boolean; +} + +export interface ApplicationOptions { + database?: IDatabaseOptions | Database; + cacheManager?: CacheManagerOptions; + resourceManager?: ResourceManagerOptions; + bodyParser?: any; + cors?: any; + dataWrapping?: boolean; + registerActions?: boolean; + i18n?: i18n | InitOptions; + plugins?: PluginConfiguration[]; + acl?: boolean; + logger?: AppLoggerOptions; + name?: string; + authManager?: AuthManagerOptions; + telemetry?: AppTelemetryOptions; +} +``` + +#### Детали + +##### ApplicationOptions + +| Свойство | Тип | Описание | +| ----------------- | --------------------------------------- | ----------------------------------------------------------------- | +| `name` | `string` | Идентификатор приложения | +| `database` | `IDatabaseOptions` \| `DataBase` | Конфигурация или экземпляр `DataBase` | +| `cacheManager` | `CacheManagerOptions` | Конфигурация `CacheManager` | +| `resourceManager` | [`ResourcerOptions`](#resourceroptions) | Конфигурация управления ресурсами | +| `authManager` | `AuthManagerOptions` | Конфигурация аутентификации пользователей | +| `bodyParser` | `bodyParser.Options` | Параметры для middleware `@koa/bodyparser` | +| `cors` | `any` | Параметры для middleware `@koa/cors` | +| `dataWrapping` | `boolean` | Форматировать ли данные ответа | +| `registerActions` | `boolean` | Регистрировать ли CRUD-интерфейсы для таблиц данных по умолчанию | +| `i18n` | `i18n` \| `InitOptions` | Экземпляр или конфигурация инициализации `i18n` | +| `plugins` | `PluginConfiguration[]` | Имена встроенных плагинов или массив экземпляров | +| `acl` | `boolean` | Включить контроль доступа | +| `logger` | [`AppLoggerOptions`](#apploggeroptions) | Конфигурация логирования | +| `telemetry` | `AppTelemetryOptions` | Конфигурация телеметрии | + +##### ResourcerOptions + +| Свойство | Тип | Описание | +| -------- | ------- | ---------------------- | +| `prefix` | `string`| Префикс API ресурсов | + +##### AppLoggerOptions + +| Свойство | Тип | Описание | +| --------- | --------------------- | --------------------------------------------------------------------- | +| `request` | `RequestLoggerOptions` | См. [Logger - requestLogger()](../logger.md#requestlogger) | +| `system` | `SystemLoggerOptions` | См. [Logger - createSystemLogger()](../logger.md#createsystemlogger) | + +## Свойства экземпляра + +### `name` + +Идентификатор приложения. По умолчанию `main`. + +### `version` + +Управление версиями приложения. Версия доступна через `version.get()`. + +### `mainDataSource` + +Основной источник данных. + +### `db` + +Экземпляр `DataBase` для основного источника данных. См. [DataBase](../database/index.md). + +### `acl` + +Экземпляр `ACL`. См. [ACL](../acl/acl.md). + +### `log` + +Системные логи. См. [Logger](../logger.md). + +### `logger` + +Аналог `log`. + +### `cache` + +Кэш приложения, экземпляр `Cache`. См. [Cache](../cache/cache.md). + +### `cli` + +Методы командной строки приложения. + +### `i18n` + +Интернационализация. Экземпляр `i18n`. + +### `telemetry` + +Экземпляр `Telemetry`. См. [Telemetry](../telemetry/telemetry.md). + +### `pm` + +Управление плагинами. См. [PluginManager](./plugin-manager). + +### `dataSourceManager` + +Управление источниками данных. См. [DataSourceManager](../data-source-manager/). + +### `resourceManager` + +Управление ресурсами. См. [ResourceManager](../resourcer/resource-manager.md). + +### `cacheManager` + +Управление кэшем. См. [CacheManager](../cache/cache-manager.md). + +### `authManager` + +Управление аутентификацией. См. [AuthManager](../auth/auth-manager.md). + +### `auditManager` + +Аудит ресурсов. См. [AuditManager](./audit-manager). + +### `cronJobManager` + +Управление cron-задачами. + +### `localeManager` + +Управление локализацией. + +## Методы жизненного цикла + +### `load()` + +Загружает приложение и выполняет инициализацию. + +#### Сигнатура + +- `load(options?: LoadOptions): Promise` + +#### Типы + +```typescript +interface LoadOptions { + reload?: boolean; + hooks?: boolean; + sync?: boolean; + [key: string]: any; +} +``` + +#### Детали + +| Свойство | Тип | Описание | По умолчанию | +| --------------- | -------- | --------------------------------------------------- | ------------ | +| `reload` | `boolean`| Является ли операцией перезагрузки | `false` | +| `hooks` | `boolean`| Вызывать ли хуки `beforeLoad` / `afterLoad` | `true` | +| `sync` | `boolean`| Синхронизировать ли изменения таблиц данных | `false` | +| `[key: string]` | `any` | Дополнительная конфигурация для хуков | - | + +### `reload()` + +Перезагружает приложение, выполняя повторную инициализацию. + +#### Сигнатура + +- `reload(options?: LoadOptions): Promise` + +### `start()` + +Запускает приложение для обработки запросов. + +#### Сигнатура + +- `start(options: StartOptions = {}): Promise` + +#### Типы + +```typescript +interface StartOptions { + checkInstall?: boolean; +} +``` + +#### Детали + +| Свойство | Тип | Описание | По умолчанию | +| -------------- | -------- | ------------------------------------------------------ | ------------ | +| `checkInstall` | `boolean`| Проверять ли установку приложения | `false` | + +### `restart()` + +Перезапускает приложение, выполняя `reload()` и `start()`. + +#### Сигнатура + +- `restart(options: StartOptions = {}): Promise` + +### `install()` + +Устанавливает приложение, включая инициализацию, синхронизацию таблиц, установку плагинов и перезапуск. + +#### Сигнатура + +- `install(options: InstallOptions = {}): Promise` + +#### Детали + +| Свойство | Тип | Описание | По умолчанию | +| -------- | -------- | -------------------------------------------------------------------- | ------------ | +| `force` | `boolean`| Переустанавливать ли приложение, если оно уже установлено | `false` | + +### `upgrade()` + +Обновляет приложение, выполняя миграции плагинов и перезапуская его. + +#### Сигнатура + +- `upgrade(): Promise` + +### `stop()` + +Останавливает приложение, закрывая соединения с БД, кэш и телеметрию. + +#### Сигнатура + +- `stop(): Promise` + +### `destroy()` + +Уничтожает приложение (аналогично `stop()`). + +#### Сигнатура + +- `destroy(): Promise` + +### `isInstalled()` + +Проверяет установку приложения. + +#### Сигнатура + +- `isInstalled(): Promise` + +### `isStarted()` + +Проверяет запуск приложения. + +#### Сигнатура + +- `isStarted(): Promise` + +## Другие методы + +### `on()` + +Подписывается на события приложения. См. [emitter.on()](https://nodejs.org/api/events.html#emitteroneventname-listener). + +#### Сигнатура + +- `on(eventName: string | symbol, listener: (...args: any[]) => void): this` + +### `off()` + +Отписывается от событий. См. [emitter.off()](https://nodejs.org/api/events.html#emitteroffeventname-listener). + +#### Сигнатура + +- `off(eventName: string | symbol, listener: (...args: any[]) => void): this` + +### `use()` + +Добавляет middleware приложения. См. [Koa - Application](https://koajs.com/#application). + +### `command()` + +Добавляет команды CLI. + +#### Сигнатура + +- `command(name: string, desc?: string, opts?: CommandOptions): AppCommand` + +#### Детали + +| Свойство | Тип | Описание | +| -------- | --------------- | ------------------------------------------------------------------------------ | +| `name` | `string` | Имя команды | +| `desc` | `string` | Описание команды | +| `opts` | `CommandOptions`| Конфигурация команды (см. [Commander.js](https://github.com/tj/commander.js)) | + +### `runCommand()` + +Выполняет команды приложения. + +#### Сигнатура + +- `runCommand(command: string, ...args: any[])` + +### `authenticate()` + +Проверяет соединение с БД и версию. + +#### Сигнатура + +- `authenticate(): Promise` + +## События + +### `'beforeLoad'` / `'afterLoad'` + +Вызываются до и после [`load()`](#load) и [`reload()`](#reload). + +### `'beforeReload'` / `'afterReload'` + +Вызываются до и после [`reload()`](#reload). + +### `'beforeInstall'` / `'afterInstall'` + +Вызываются до и после [`install()`](#install). + +### `'beforeUpgrade'` / `'afterUpgrade'` + +Вызываются до и после [`upgrade()`](#upgrade). + +### `'beforeStart'` / `'afterStart'` + +Вызываются до и после [`start()`](#start). + +### `'beforeStop'` / `'afterStop'` + +Вызываются до и после [`stop()`](#stop) и [`destroy()`](#destroy). `'beforeStop'` также перед [`restart()`](#restart). + +### `'beforeDestroy'` / `'afterDestroy'` + +Вызываются до и после [`destroy()`](#destroy). diff --git a/docs/ru-RU/api/server/audit-manager.md b/docs/ru-RU/api/server/audit-manager.md new file mode 100644 index 0000000000..adc9f53b13 --- /dev/null +++ b/docs/ru-RU/api/server/audit-manager.md @@ -0,0 +1,141 @@ +# AuditManager + +## Обзор + +`AuditManager` — это модуль управления аудитом ресурсов в NocoBase, используемый для регистрации интерфейсов ресурсов, участвующих в аудите. + +### Базовое использование + +```ts +import { Plugin } from '@nocobase/server'; + +class PluginCustomAuditResourceServer extends Plugin { + async load() { + this.app.auditManager.registerAction('resource:action'); + } +} +``` + +## Методы класса + +### `setLogger()` + +Устанавливает способ вывода аудит-логов. + +```ts +const auditManager = new AuditManager(); +auditManager.setLogger({ + log: async (auditLog: AuditLog) => console.log(auditLog); +}) +``` + +#### Сигнатура + +- `setLogger(logger: AuditLogger)` + +#### Типы + +```ts +export interface AuditLog { + uuid: string; + dataSource: string; + resource: string; + action: string; + sourceCollection?: string; + sourceRecordUK?: string; + targetCollection?: string; + targetRecordUK?: string; + userId: string; + roleName: string; + ip: string; + ua: string; + status: number; + metadata?: Record; +} + +export interface AuditLogger { + log(auditLog: AuditLog): Promise; +} +``` + +### `registerAction()` + +Регистрирует операцию с ресурсом, участвующую в аудите. + +#### Сигнатура + +- `registerAction(action: Action)` + +#### Типы + +```ts +export interface UserInfo { + userId?: string; + roleName?: string; +} + +export interface SourceAndTarget { + sourceCollection?: string; + sourceRecordUK?: string; + targetCollection?: string; + targetRecordUK?: string; +} + +type Action = + | string + | { + name: string; + getMetaData?: (ctx: Context) => Promise>; + getUserInfo?: (ctx: Context) => Promise; + getSourceAndTarget?: (ctx: Context) => Promise; + }; +``` + +#### Подробности + +Поддерживается несколько способов записи: + +1. Действует для всех ресурсов + +```ts +registerActions(['create']); +``` + +2. Действует для всех операций определённого ресурса — `resource:*` + +```ts +registerActions(['app:*']); +``` + +3. Действует для определённой операции определённого ресурса — `resource:action` + +```ts +registerAction(['pm:update']); +``` + +4. Поддерживается передача кастомных функций `getMetaData`, `getUserInfo`, `getSourceAndTarget` для конкретной операции + +```ts +registerActions([ + 'create', + { name: 'auth:signIn', getMetaData, getUserInfo, getSourceAndTarget }, +]); +``` + +При пересечении зарегистрированных интерфейсов приоритет имеет более детальная (точная) регистрация. Например: + +1. `registerActions('create')` + +2. `registerAction({ name: 'user:*', getMetaData })` + +3. `registerAction({ name: 'user:create', getMetaData })` + +Для интерфейса `user:create` будет применяться вариант `3`. + +### `registerActions()` + +Регистрирует несколько операций с ресурсами, участвующих в аудите. + +#### Сигнатура + +- `registerActions(actions: Action[])` diff --git a/docs/ru-RU/api/server/migration.md b/docs/ru-RU/api/server/migration.md new file mode 100644 index 0000000000..803e379dc0 --- /dev/null +++ b/docs/ru-RU/api/server/migration.md @@ -0,0 +1,61 @@ +# Миграция + +`Migration` — это класс в NocoBase, используемый для скриптов обновления, обычно применяемых для синхронизации изменений, связанных с базой данных. + +## Свойства экземпляра + +### `appVersion` + +Текущая версия приложения. Скрипт будет выполнен только в том случае, если версия совпадает. + +```typescript +export default class extends Migration { + appVersion = '<=1.0.0-alpha.1'; + // ... +} +``` + +### `on` + +Момент запуска скрипта обновления. Значение по умолчанию — `afterLoad`. См. [Приложение — События](./application.md#events). + +```typescript +export default class extends Migration { + on = 'afterLoad'; + // ... +} +``` + +### `app` + +Экземпляр `Application` текущего приложения. См. [Приложение](./application.md). + +### `pm` + +Экземпляр `PluginManager` текущего приложения. См. [PluginManager](./plugin-manager.md). + +### `plugin` + +Экземпляр `Plugin` текущего плагина. См. [Плагин](./plugin.md). + +### `db` + +Экземпляр `DataBase` текущего приложения. См. [База данных](../database/index.md). + +### `sequelize` + +Экземпляр `Sequelize`. См. [Sequelize](https://sequelize.org/). + +### `queryInterface` + +См. [Sequelize — Интерфейс запросов](https://sequelize.org/docs/v6/other-topics/query-interface/). + +## Методы экземпляра + +### `up()` + +Метод, выполняющий обновление (миграцию вперёд). + +### `down()` + +Метод, выполняющий откат обновления (миграцию назад). diff --git a/docs/ru-RU/api/server/plugin-manager.md b/docs/ru-RU/api/server/plugin-manager.md new file mode 100644 index 0000000000..3f766659ee --- /dev/null +++ b/docs/ru-RU/api/server/plugin-manager.md @@ -0,0 +1,138 @@ +# Менеджер плагинов (PluginManager) + +`PluginManager` - это менеджер плагинов для NocoBase. + +## Свойства экземпляра + +### `repository` + +Экземпляр `Repository` для таблицы данных плагинов. См. [DataBase - Repository](../database/repository.md). + +## Методы экземпляра + +### `addPreset()` + +Добавляет встроенный системный плагин. Встроенные плагины включены по умолчанию и не отображаются в списке клиентского менеджера плагинов. + +#### Сигнатура + +- `addPreset(plugin: string | typeof Plugin, options: any = {})` + +#### Детали + +| Параметр | Тип | Описание | +| -------- | -------------------------- | --------------------- | +| `plugin` | `string` \| `typeof Plugin`| Имя или экземпляр плагина | +| `options`| `any` | Настройки плагина | + +### `getPlugins()` + +Получает все экземпляры плагинов текущего приложения. + +#### Сигнатура + +- `getPlugins(): Map>` + +### `getAliases()` + +Получает все имена плагинов. + +#### Сигнатура + +- `getAliases(): IterableIterator` + +### `get()` + +Получает конкретный плагин. + +#### Сигнатура + +- `get(name: string | typeof Plugin): Plugin` + +### `has()` + +Проверяет существование плагина. + +#### Сигнатура + +- `has(name: string | typeof Plugin): boolean` + +### `create()` + +Создает плагин и генерирует директорию плагина. + +#### Сигнатура + +- `create(pluginName: string, options?: { forceRecreate?: boolean }): Promise` + +#### Детали + +| Параметр | Тип | Описание | По умолчанию | +| ---------------------- | -------- | ----------------------------------------------------------- | ------------ | +| `pluginName` | `string` | Имя плагина | - | +| `options.forceRecreate`| `boolean`| Удалять ли существующую директорию плагина и создавать заново | `false` | + +### `add()` + +Добавляет или обновляет плагин. + +#### Сигнатура + +- `add(plugin?: any, options: any = {}, insert = false, isUpgrade = false): Promise` + +#### Детали + +| Параметр | Тип | Описание | По умолчанию | +| ---------- | -------------------------- | ------------------------------- | ------------ | +| `plugin` | `string` \| `typeof Plugin`| Имя или экземпляр плагина | - | +| `options` | `any` | Конфигурация плагина | - | +| `insert` | `boolean` | Добавлять ли записи в таблицу плагинов | `false` | +| `isUpgrade`| `boolean` | Является ли обновлением плагина | `false` | + +### `load()` + +Загружает все включенные плагины. + +#### Сигнатура + +- `load(): Promise` + +### `install()` + +Устанавливает все включенные плагины, которые еще не установлены. + +#### Сигнатура + +- `install(): Promise` + +### `enable()` + +Включает один или несколько отключенных плагинов. + +#### Сигнатура + +- `enable(name: string | string[]): Promise` + +### `disable()` + +Отключает один или несколько включенных плагинов. + +#### Сигнатура + +- `disable(name: string | string[]): Promise` + +### `remove()` + +Удаляет один или несколько плагинов. + +#### Сигнатура + +- `remove(name: string | string[], options?: { removeDir?: boolean; force?: boolean })` + +#### Детали + +| Параметр | Тип | Описание | По умолчанию | +| ------------------- | ---------------------- | ------------------------------------------------------------------------------------------ | ------- | +| `name` | `string` \| `string[]` | Plugin name(s) | - | +| `options.removeDir` | `boolean` | Whether to remove the plugin directory | `false` | +| `options.force` | `boolean` | Whether to delete database records directly, skipping `beforeRemove` / `afterRemove` hooks | `false` | diff --git a/docs/ru-RU/api/server/plugin.md b/docs/ru-RU/api/server/plugin.md new file mode 100644 index 0000000000..9eb407b52c --- /dev/null +++ b/docs/ru-RU/api/server/plugin.md @@ -0,0 +1,150 @@ +# Плагин (Plugin) + +## Обзор + +`Plugin` - это класс плагинов для сервера NocoBase, предоставляющий свойства конфигурации и методы жизненного цикла для серверных плагинов. + +### Базовое использование + +```ts +import { Plugin } from '@nocobase/server'; + +export class PluginDemoServer extends Plugin {} + +export default PluginDemoServer; +``` + +## Свойства экземпляра + +### `options` + +Параметры конфигурации плагина. + +### `name` + +`string` - Название плагина. + +### `enabled` + +`boolean` - Включен ли плагин. + +### `installed` + +`boolean` - Установлен ли плагин. + +### `log` + +Экземпляр системного лога, где `module` по умолчанию устанавливается в имя плагина. См. [Logger](../logger.md). + +### `app` + +Экземпляр `Application` текущего приложения. См. [Application](./application.md). + +### `pm` + +Экземпляр `PluginManager` текущего приложения. См. [PluginManager](./plugin-manager.md). + +### `db` + +Экземпляр `DataBase` текущего приложения. См. [DataBase](../database/index.md). + +## Методы жизненного цикла + +### `afterAdd()` + +Выполняется после добавления плагина (после [`pm.add()`](./plugin-manager.md#add)). + +### `beforeLoad()` + +Выполняется во время [`pm.load()`](./plugin-manager.md#load). Используется для регистрации событий, инициализации классов или другой предварительной обработки перед загрузкой плагина. На этом этапе доступны только основные API, но не API других плагинов. + +### `load()` + +Загружает плагин и связанные с ним конфигурации. Выполняется во время [`pm.load()`](./plugin-manager.md#load), после завершения всех методов [`beforeLoad()`](#beforeload) плагинов. На этом этапе доступны API других плагинов. + +### `install()` + +Логика установки плагина, выполняется при установке приложения, обновлении или первом включении плагина. Обычно используется для вставки предустановленных данных в таблицы. + +### `beforeEnable()` + +Выполняется перед включением плагина. + +### `afterEnable()` + +Выполняется после включения плагина. + +### `beforeDisable()` + +Выполняется перед отключением плагина. + +### `afterDisable()` + +Выполняется после отключения плагина. + +### `beforeRemove()` + +Выполняется перед удалением плагина. + +### `afterRemove()` + +Выполняется после удаления плагина. + +## Другие методы + +### `t()` + +Метод интернационализации. + +### `createLogger()` + +Создает логгер. См. [Logger](../logger.md). + +### `toJSON()` + +Внутренний метод. Выводит информацию о конфигурации плагина. + +### `sendSyncMessage()` + +Отправляет синхронизационные сообщения. Сообщения будут получены только этим же плагином на других узлах, без влияния на другие плагины. + +#### Сигнатура + +```ts +sendSyncMessage(message: any): void | Promise +``` + +#### Аргументы + +- `message`: Данные синхронизации. + +#### Пример + +```ts +this.sendSyncMessage({ + key: 'value' +}); +``` + +### `handleSyncMessage()` + +В распределенной среде обрабатывает синхронизационные события от других узлов. При использовании плагином состояния в памяти необходимо переопределить логику обработки событий для синхронизации состояния между узлами. + +#### Сигнатура + +``` +handleSyncMessage(message: any): void | Promise +``` + +#### Аргументы + +- `message`: Данные синхронизации от других узлов. + +#### Пример + +```ts +handleSyncMessage(message: SyncMessage) { + console.log('handleSyncMessage', message); + // this.reloadData(); +} +``` diff --git a/docs/ru-RU/api/server/sync-message-manager.md b/docs/ru-RU/api/server/sync-message-manager.md new file mode 100644 index 0000000000..ee23722c55 --- /dev/null +++ b/docs/ru-RU/api/server/sync-message-manager.md @@ -0,0 +1,37 @@ +# SyncMessageManager + +Используется для управления сигналами синхронизации между несколькими узлами приложения. В распределённом развертывании, когда изменяется состояние в памяти, необходимо уведомить другие узлы для синхронизации. `SyncMessageManager` предоставляет общий интерфейс для вызова, позволяя использовать его единообразно в различных модулях. + +Сам `SyncMessageManager` не реализует конкретную функциональность синхронизации, а лишь предоставляет унифицированный интерфейс, и использует нижележащий `pubSubManager` для отправки и получения сообщений. + +## `SyncMessageManager` + +### Методы и свойства + +#### `constructor()` + +Конструктор, создаёт экземпляр `SyncMessageManager`. Экземпляр автоматически создаётся при инициализации приложения и доступен глобально в рамках приложения (`app.syncMessageManager`), поэтому вызывать его вручную не требуется. + +#### `subscribe(channel: string, callback: SyncEventCallback)` + +Подписывается на события синхронизации. + +- `channel`: имя канала, используется для разделения различных событий синхронизации. +- `callback`: функция-обработчик события, которая будет вызвана при наступлении события синхронизации. + +#### `unsubscribe(channel: string, callback: SyncEventCallback)` + +Отписывается от событий синхронизации. + +#### `publish(channel: string, message: any)` + +Публикует сообщение синхронизации. + +- `channel`: имя канала, используется для разделения различных событий синхронизации. +- `message`: данные сообщения синхронизации. + +### Связанные типы + +```ts +export type PubSubCallback = (message: any) => Promise; +``` diff --git a/docs/ru-RU/api/telemetry/metric.md b/docs/ru-RU/api/telemetry/metric.md new file mode 100644 index 0000000000..d3a52391a0 --- /dev/null +++ b/docs/ru-RU/api/telemetry/metric.md @@ -0,0 +1,106 @@ +# Метрики (Metric) + +## Методы класса + +### `constructor()` + +Конструктор для создания экземпляра `Metric`. + +#### Сигнатура + +- `constructor(options?: MetricOptions)` + +#### Типы + +```ts +export type MetricOptions = { + meterName?: string; + version?: string; + readerName?: string | string[]; +}; +``` + +#### Детали + +| Свойство | Тип | Описание | Значение по умолчанию | +| ------------ | ---------------------- | --------------------------------------------- | --------------------------- | +| `meterName` | `string` | Идентификатор метра | `nocobase-meter` | +| `version` | `string` | Версия | Текущая версия NocoBase | +| `readerName` | `string` \| `string[]` | Идентификатор(ы) зарегистрированного `MetricReader` | - | + +### `init()` + +Инициализирует `MetricProvider`. + +#### Сигнатура + +- `init(): void` + +### `registerReader()` + +Регистрирует `MetricReader`. + +#### Сигнатура + +- `registerReader(name: string, reader: GetMetricReader)` + +#### Типы + +```ts +import { MetricReader } from '@opentelemetry/sdk-metrics'; + +type GetMetricReader = () => MetricReader; +``` + +#### Детали + +| Параметр | Тип | Описание | +| -------- | ------------------- | --------------------------------- | +| `name` | `string` | Уникальный идентификатор для `MetricReader` | +| `reader` | `() => MetricReader` | Функция получения `MetricReader` | + +### `addView()` + +Добавляет `View`. См. [Configure Metric Views](https://opentelemetry.io/docs/instrumentation/js/manual/#configure-metric-views). + +#### Сигнатура + +- `addView(...view: View[])` + +#### Типы + +```ts +import { View } from '@opentelemetry/sdk-metrics'; +``` + +### `getMeter()` + +Получает `Meter`. + +#### Сигнатура + +- `getMeter(name?: string, version?: string)` + +#### Детали + +| Параметр | Тип | Описание | Значение по умолчанию | +| -------- | ------- | ----------------- | --------------------------- | +| `name` | `string`| Идентификатор метра | `nocobase-meter` | +| `version`| `string`| Версия | Текущая версия NocoBase | + +### `start()` + +Запускает `MetricReader`. + +#### Сигнатура + +- `start(): void` + +### `shutdown()` + +Останавливает `MetricReader`. + +#### Сигнатура + +- `shutdown(): Promise` + diff --git a/docs/ru-RU/api/telemetry/telemetry.md b/docs/ru-RU/api/telemetry/telemetry.md new file mode 100644 index 0000000000..6719f0c317 --- /dev/null +++ b/docs/ru-RU/api/telemetry/telemetry.md @@ -0,0 +1,67 @@ +# Телеметрия (Telemetry) + +## Обзор + +`Telemetry` — это модуль телеметрии NocoBase, который инкапсулирует поддержку OpenTelemetry и обеспечивает регистрацию метрик и трейсов в экосистеме OpenTelemetry. + +## Методы класса + +### `constructor()` + +Конструктор для создания экземпляра `Telemetry`. + +#### Сигнатура + +- `constructor(options?: TelemetryOptions)` + +#### Тип + +```ts +export interface TelemetryOptions { + serviceName?: string; + version?: string; + trace?: TraceOptions; + metric?: MetricOptions; +} +``` + +#### Параметры + +| Свойство | Тип | Описание | Значение по умолчанию | +| ------------- | --------------- | ----------------------------------------------------------------------------------------------------- | ----------------------------------- | +| `serviceName` | `string` | Необязательно. См. [Семантические соглашения](https://opentelemetry.io/docs/specs/semconv/resource/#service) | `nocobase` | +| `version` | `string` | Необязательно. См. [Семантические соглашения](https://opentelemetry.io/docs/specs/semconv/resource/#service) | Текущая версия NocoBase (опционально) | +| `trace` | `TraceOptions` | Необязательно. См. [Trace](./trace.md) | — | +| `metric` | `MetricOptions` | Необязательно. См. [Metric](./metric.md) | — | + +### `init()` + +Регистрирует инструментарий (instrumentation) и инициализирует `Trace` и `Metric`. + +#### Сигнатура + +- `init(): void` + +### `start()` + +Запускает обработку данных, связанных с `Trace` и `Metric`, например, экспортирует их в Prometheus. + +#### Сигнатура + +- `start(): void` + +### `shutdown()` + +Останавливает обработку данных, связанных с `Trace` и `Metric`. + +#### Сигнатура + +- `shutdown(): Promise` + +### `addInstrumentation()` + +Добавляет библиотеки инструментария (instrumentation). + +#### Сигнатура + +- `addInstrumentation(...instrumentation: InstrumentationOption[])` diff --git a/docs/ru-RU/api/telemetry/trace.md b/docs/ru-RU/api/telemetry/trace.md new file mode 100644 index 0000000000..8b81d6b15a --- /dev/null +++ b/docs/ru-RU/api/telemetry/trace.md @@ -0,0 +1,83 @@ +# Трассировка (Trace) + +## Методы класса + +### `constructor()` + +Конструктор для создания экземпляра `Trace`. + +#### Сигнатура +- `constructor(options?: TraceOptions)` + +#### Типы +```ts +export type TraceOptions = { + tracerName?: string; + version?: string; + processorName?: string | string[]; +}; +``` + +#### Детали + +| Свойство | Тип | Описание | Значение по умолчанию | +|-----------------|-----------------------|------------------------------------------------|----------------------------| +| `tracerName` | `string` | Идентификатор трассировки | `nocobase-trace` | +| `version` | `string` | Версия системы | Текущая версия NocoBase | +| `processorName` | `string` \| `string[]`| Идентификатор(ы) зарегистрированного процессора | - | + +### `init()` + +Инициализирует `NodeTracerProvider`. + +#### Сигнатура +- `init(): void` + +### `registerProcessor()` + +Регистрирует процессор спанов (`SpanProcessor`). + +#### Сигнатура +- `registerProcessor(name: string, processor: GetSpanProcessor)` + +#### Типы +```ts +import { SpanProcessor } from '@opentelemetry/sdk-trace-base'; + +type GetSpanProcessor = () => SpanProcessor; +``` + +#### Детали + +| Параметр | Тип | Описание | +|-------------|-----------------------|------------------------------------| +| `name` | `string` | Уникальный идентификатор процессора | +| `processor` | `() => SpanProcessor` | Функция получения процессора | + +### `getTracer()` + +Получает экземпляр трассировщика (`Tracer`). + +#### Сигнатура +- `getTracer(name?: string, version?: string)` + +#### Детали + +| Параметр | Тип | Описание | Значение по умолчанию | +|----------|----------|------------------------|----------------------------| +| `name` | `string` | Идентификатор трассировки | `nocobase-trace` | +| `version`| `string` | Версия системы | Текущая версия NocoBase | + +### `start()` + +Запускает процессор спанов. + +#### Сигнатура +- `start(): void` + +### `shutdown()` + +Останавливает процессор спанов. + +#### Сигнатура +- `shutdown(): Promise` diff --git a/docs/ru-RU/api/test/client.md b/docs/ru-RU/api/test/client.md new file mode 100644 index 0000000000..6c6822ddc0 --- /dev/null +++ b/docs/ru-RU/api/test/client.md @@ -0,0 +1,49 @@ +# Клиент (Client) + +## Обзор + +NocoBase использует [Vitest](https://vitest.dev/) для тестирования на стороне клиента. Пакет `@nocobase/test/client` предоставляет удобные методы для написания тестов на стороне клиента. + +## API + +### `defineConfig()` + +Получает конфигурацию Vitest. + +```ts +import { defineConfig } from '@nocobase/test/vitest.mjs'; + +const config = defineConfig(); +``` + +### `sleep()` + +Приостанавливает выполнение на указанное время. + +```ts +sleep(5000); +``` + +#### Сигнатура + +- `sleep: (timeout?: number) => Promise` + +#### Параметры + +| Параметр | Тип | Описание | +|-----------|----------|------------------------| +| `timeout` | `number` | Время задержки в миллисекундах | + +### @testing-library/react + +Используется для тестирования React-компонентов. См. [React Testing Library](https://testing-library.com/docs/react-testing-library/intro). + +### @testing-library/user-event + +Используется для имитации действий пользователя. См. [User Interactions](https://testing-library.com/docs/user-event/intro/). + +```ts +import { userEvent } from '@nocobase/test/client'; + +await userEvent.click(); +``` diff --git a/docs/ru-RU/api/test/e2e.md b/docs/ru-RU/api/test/e2e.md new file mode 100644 index 0000000000..9910ef15f0 --- /dev/null +++ b/docs/ru-RU/api/test/e2e.md @@ -0,0 +1,158 @@ +# End-to-End тестирование + +## Обзор + +NocoBase использует [Playwright](https://playwright.dev/) для сквозного (E2E) тестирования предоставляет набор методов для упрощения написания тестов. + +### mockPage + +Создает страницу NocoBase на основе конфигурации. + +**Сигнатура** + +- `mockPage(pageConfig?: PageConfig): NocoPage` + +**Параметры** + +| Параметр | Тип | По умолчанию | Описание | +|-------------------------|------------------------------|--------------|---------------------------------------| +| `pageConfig.type` | `'group' \| 'page' \| 'link'` | 'page' | Тип страницы | +| `pageConfig.name` | `string` | - | Название страницы для пользователей | +| `pageConfig.url` | `string` | - | URL для навигации при `type='link'` | +| `pageConfig.basePath` | `string` | '/admin/' | Базовый путь страницы | +| `pageConfig.collections`| `CollectionSetting[]` | - | Настройки коллекций на странице | +| `pageConfig.pageSchema` | - | - | Схема всей страницы | + +**Пример** + +Создание пустой страницы, которая автоматически удалится после завершения теста: + +```ts +import { test } from '@nocobase/test/e2e'; + +test('пример использования mockPage', async ({ mockPage }) => { + const nocoPage = await mockPage(); + await nocoPage.goto(); +}); +``` + +### mockManualDestroyPage + +Создает страницу, требующую ручного удаления. + +**Сигнатура** + +- `mockManualDestroyPage(pageConfig?: PageConfig): NocoPage` + +**Параметры** +Аналогичны `mockPage`. + +**Пример** +Создание страницы для нескольких тестов: + +```ts +import { test } from '@nocobase/test/e2e'; + +let nocoPage; + +test.beforeAll(async ({ mockManualDestroyPage }) => { + nocoPage = await mockManualDestroyPage(); +}); + +test.afterAll(async () => { + await nocoPage.destroy(); +}); + +test('пример использования mockManualDestroyPage', async ({ page }) => { + await page.goto(nocoPage.getUrl()); +}); +``` + +### mockCollections + +Создает несколько коллекций по конфигурации. + +**Сигнатура** + +- `mockCollections(collectionSettings: CollectionSetting[]): Promise` + +**Параметры** +См. определение типа [CollectionSetting](https://github.com/nocobase/nocobase/blob/323b527aeb46aee2bc23387fddc54f39a9504739/packages/core/test/src/e2e/e2eUtils.ts#L11-L90). + +**Пример** +Создание коллекции `posts`: + +```ts +import { test } from '@nocobase/test/e2e'; + +test('пример использования mockCollections', async ({ mockCollections }) => { + await mockCollections([{ + name: 'posts', + }]); +}); +``` + +### mockCollection + +Создает одну коллекцию по конфигурации. + +**Сигнатура** + +- `mockCollection(collectionSetting: CollectionSetting): Promise` + +**Пример** +Создание коллекции `posts`: + +```ts +import { test } from '@nocobase/test/e2e'; + +test('пример использования mockCollection', async ({ mockCollection }) => { + await mockCollection({ + name: 'posts', + }); +}); +``` + +### mockRecords + +Генерирует тестовые данные для коллекций. + +**Сигнатура** + +- `mockRecords(collectionName: string, count?: number): Promise` +- `mockRecords(collectionName: string, records?: T[]): Promise` + +**Примеры** +Создание 10 записей: + +```ts +await mockRecords('posts', 10); +``` + +Кастомная запись: + +```ts +await mockRecords('posts', [{ + title: 'Привет мир', +}]); +``` + +### mockRecord + +Создает одну запись в коллекции. + +**Сигнатура** + +- `mockRecord(collectionName: string, data?: T): Promise` + +**Пример** +Создание записи: + +```ts +import { test } from '@nocobase/test/e2e'; + +test('пример использования mockRecord', async ({ mockRecord }) => { + await mockRecord('posts'); +}); +``` + diff --git a/docs/ru-RU/api/test/server.md b/docs/ru-RU/api/test/server.md new file mode 100644 index 0000000000..e504906ad4 --- /dev/null +++ b/docs/ru-RU/api/test/server.md @@ -0,0 +1,157 @@ +# Сервер + +## Обзор + +NocoBase выполняет серверное тестирование на основе [Vitest](https://vitest.dev/). Модуль `@nocobase/test` предоставляет удобные методы для тестирования серверной части, включая моки сервисов и баз данных. + +### Базовое использование + +```ts +describe('actions', () => { + let app: MockServer; + let db: Database; + let agent: any; + + beforeAll(async () => { + app = await createMockServer({ + plugins: ['acl', 'users', 'data-source-manager'], + }); + db = app.db; + agent = app.agent(); + }); + + afterAll(async () => { + await app.destroy(); + }); +}); +``` + +## API + +### `defineConfig()` + +Получает конфигурацию Vitest. + +```ts +import { defineConfig } from '@nocobase/test/vitest.mjs'; + +const config = defineConfig(); +``` + +### `mockDatabase()` + +Создает экземпляр `MockDataBase` для тестирования. + +#### Сигнатура + +- `mockDatabase(options: IDatabaseOptions = {}): MockDatabase` + +#### Детали + +| Параметр | Тип | Описание | +|----------|-------------------|----------------------------------------| +| `options`| `IDatabaseOptions`| См. [DataBase](../database/index.md) | + +### `mockServer()` + +Создает экземпляр `MockServer`. + +#### Сигнатура + +- `mockServer(options?: ApplicationOptions): MockServer` + +#### Детали + +| Параметр | Тип | Описание | +|----------|---------------------|-----------------------------------------------| +| `options`| `ApplicationOptions`| См. [Application](../server/application.md) | + +### `createMockServer()` + +Создает экземпляр `MockServer`, выполняет принудительную установку и запускает его. + +#### Сигнатура + +```ts +createMockServer(options?: ApplicationOptions & { + version?: string; + beforeInstall?: BeforeInstallFn; + skipInstall?: boolean; + skipStart?: boolean; +}): Promise +``` + +#### Детали + +| Параметр | Тип | Описание | +|------------------------|---------------------|-----------------------------------------------| +| `options` | `ApplicationOptions`| См. [Application](../server/application.md) | +| `options.version` | `string` | Версия приложения | +| `options.beforeInstall`| `BeforeInstallFn` | Функция для выполнения перед установкой | +| `options.skipInstall` | `boolean` | Пропускать ли принудительную установку | +| `options.skipStart` | `boolean` | Пропускать ли запуск приложения | + +### `MockServer` + +`MockServer` наследуется от `Application` и представляет класс для тестирования серверных приложений. + +#### Методы класса + +##### `loadAndInstall()` + +Загружает и устанавливает приложение. + +##### `cleanDb()` + +Очищает базу данных. + +##### `quickstart()` + +Выполняет `nocobase start --quickstart`. + +##### `destroy()` + +Уничтожает приложение. + +##### `agent()` + +Инициирует API-запросы в тестовых сценариях. + +**Сигнатура** + +- `agent(): ExtendedAgent` + +**Тип** + +```ts +interface ExtendedAgent extends SuperAgentTest { + login: (user: any) => ExtendedAgent; + loginUsingId: (userId: number) => ExtendedAgent; + resource: (name: string, resourceOf?: any) => Resource; +} +``` + +**Детали** + +- `SuperAgentTest` + +См. [superagent](https://github.com/ladjs/superagent). + +- `login()` + +Аутентификация с моделью пользователя. + +- `loginUsingId()` + +Аутентификация по ID пользователя. + +- `resource()` + +Получает ресурс. + +| Параметр | Тип | Описание | +|-------------|---------|-------------------------------------------------------------------------------------------------------------------------| +| `name` | `string`| 1. Имя ресурса, например `a`
    2. Имя ассоциированного объекта ресурса, например `a.b` | +| `resourceOf`| `any` | Первичный ключ ресурса, когда `resource` является именем ассоциированного объекта. Например, для `a.b` - ключ ресурса `a`. | + +### sleep diff --git a/docs/ru-RU/components.md b/docs/ru-RU/components.md new file mode 100644 index 0000000000..78642ce07f --- /dev/null +++ b/docs/ru-RU/components.md @@ -0,0 +1 @@ +# Компоненты diff --git a/docs/ru-RU/development/app-ds.md b/docs/ru-RU/development/app-ds.md new file mode 100644 index 0000000000..e1a2c39a05 --- /dev/null +++ b/docs/ru-RU/development/app-ds.md @@ -0,0 +1,76 @@ +# Структура директорий + +Независимо от того, создано ли приложение NocoBase через [исходный код Git](/welcome/getting-started/installation/git-clone) или [create-nocobase-app](/welcome/getting-started/installation/create-nocobase-app), структура директорий будет одинаковой: + +```bash +├── my-nocobase-app + ├── packages # Разрабатываемые пакеты + ├── plugins # Разрабатываемые плагины + ├── storage # Хранилище для файлов БД, вложений, кэша и т.д. + ├── backups # Директория для резервных копий + ├── plugins # Готовые к использованию плагины (уже скомпилированные) + ├── tar # Место хранения результатов сборки yarn build --tar + ├── uploads # Локальное хранилище файлов + ├── .env # Переменные окружения + ├── .env.e2e # Переменные для e2e-тестов yarn e2e test + ├── .env.test # Переменные для unit-тестов yarn test + ├── lerna.json + ├── package.json + ├── playwright.config.ts + ├── tsconfig.json + ├── tsconfig.server.json + ├── vitest.config.mts +``` + +## Директория плагинов + +Разрабатываемые плагины хранятся в директории `packages/plugins` и организованы как npm-пакеты: + +```bash +|- /packages/ + |- /plugins/ + |- /@nocobase/ + |- /plugin-hello1/ + |- /plugin-hello2/ + |- /my-nocobase-plugin-hello1/ + |- /my-nocobase-plugin-hello2/ +``` + +Плагины, добавленные через интерфейс, хранятся в `storage/plugins`: + +```bash +|- /storage/ + |- /plugins/ + |- /@nocobase/ + |- /plugin-hello1/ + |- /plugin-hello2/ + |- /my-nocobase-plugin-hello1/ + |- /my-nocobase-plugin-hello2/ +``` + +Встроенные плагины или плагины, объявленные в `dependencies` файла `package.json`, находятся в `node_modules`: + +```bash +|- /node_modules/ + |- /@nocobase/ + |- /plugin-acl/ + |- /plugin-auth/ +``` + +## Структура директории плагина + +Пустой плагин можно создать командой `yarn pm create @my-project/plugin-hello`. Структура директории: + +```bash +|- /packages/plugins/@my-project/plugin-hello + |- /dist # Результаты сборки + |- /src + |- /client # Клиентский код плагина + |- /server # Серверный код плагина + |- .npmignore # Файлы/директории, игнорируемые при публикации пакета + |- client.d.ts + |- client.js + |- package.json # Информация о пакете плагина + |- server.d.ts + |- server.js +``` diff --git a/docs/ru-RU/development/client/api-client.md b/docs/ru-RU/development/client/api-client.md new file mode 100644 index 0000000000..7daf9a72c2 --- /dev/null +++ b/docs/ru-RU/development/client/api-client.md @@ -0,0 +1,121 @@ +# HTTP-запросы + +NocoBase предоставляет `APIClient` для выполнения HTTP-запросов. В рамках [жизненного цикла плагина](/development/client#жизненный-цикл-плагина) клиентского приложения можно использовать `app.apiClient` для клиентских запросов. Внутри компонентов можно использовать `useAPIClient()` и `useRequest()`. + +## app.apiClient + +```ts +class PluginSampleAPIClient extends Plugin { + async load() { + const { data } = await this.app.apiClient.request({ url: 'test' }); + } +} +``` + +--- + +### apiClient.request() + +Для стандартных запросов обратитесь к [конфигурации запросов axios](https://axios-http.com/docs/req_config) для получения подробной информации об использовании. + +```ts +class APIClient { + // Клиентские запросы, поддерживающие AxiosRequestConfig и ResourceActionOptions + request, D = any>( + config: AxiosRequestConfig | ResourceActionOptions, + ): Promise; +} +``` + +Пример: + +```ts +const response = await apiClient.request({ url }); +``` + +### apiClient.axios + +Экземпляр `AxiosInstance` + +Может использоваться для изменения [стандартной конфигурации axios](https://axios-http.com/docs/config_defaults). + +```ts +axios.defaults.headers.common['Authorization'] = AUTH_TOKEN; +axios.defaults.headers.post['Content-Type'] = + 'application/x-www-form-urlencoded'; +``` + +Также можно использовать для [перехвата запросов или ответов](https://axios-http.com/docs/interceptors). + +```ts +// Добавление перехватчика запросов: использование qs для преобразования параметров +axios.interceptors.request.use((config) => { + config.paramsSerializer = (params) => { + return qs.stringify(params, { + strictNullHandling: true, + arrayFormat: 'brackets', + }); + }; + return config; +}); + +// Добавление перехватчика запросов: настройка заголовков запроса +axios.interceptors.request.use((config) => { + config.headers['Authorization'] = `Bearer token123`; + config.headers['X-Hostname'] = `localhost`; + config.headers['X-Timezone'] = `+08:00`; + config.headers['X-Locale'] = 'zh-CN'; + config.headers['X-Role'] = 'admin'; + config.headers['X-Authenticator'] = 'basic'; + config.headers['X-App'] = 'sub1'; + return config; +}); + +// Добавление перехватчика ответов +axios.interceptors.response.use( + (response) => response, + (error) => { + // Уведомление пользователя об ошибке + notification.error({ + message: 'Ошибка ответа на запрос', + }); + }, +); +``` + +### Пользовательские заголовки запросов в NocoBase Server + +- `X-App`: Указывает текущее приложение при использовании нескольких приложений. +- `X-Locale`: Текущий язык. +- `X-Hostname`: Хост клиента. +- `X-Timezone`: Часовой пояс клиента. +- `X-Role`: Текущая роль. +- `X-Authenticator`: Метод аутентификации текущего пользователя. + +## useAPIClient() + +Внутри компонента можно использовать `useAPIClient()` для получения экземпляра APIClient текущего приложения, что эквивалентно `app.apiClient`. + +## useRequest() + +Асинхронное управление данными, которые могут быть получены из клиентских запросов или пользовательской асинхронной функции. Для подробного использования обратитесь к [useRequest() в ahooks](https://ahooks.js.org/hooks/use-request/index). + +```ts +function useRequest

    ( + service: AxiosRequestConfig

    | ResourceActionOptions

    | FunctionService, + options?: Options, +); +``` + +Пример: + +```ts +const { data, loading, refresh, run, params } = useRequest({ url: '/users' }); + +// Поскольку useRequest принимает AxiosRequestConfig, функция run также принимает AxiosRequestConfig. +run({ + params: { + pageSize: 20, + }, +}); +``` diff --git a/docs/ru-RU/development/client/demos/demo1.tsx b/docs/ru-RU/development/client/demos/demo1.tsx new file mode 100644 index 0000000000..887d5fb964 --- /dev/null +++ b/docs/ru-RU/development/client/demos/demo1.tsx @@ -0,0 +1,20 @@ +import { Application, Plugin } from '@nocobase/client'; +import React from 'react'; + +class PluginHello extends Plugin { + async load() { + this.router.add('hello', { + path: '/', + Component: () =>

    Hello NocoBase
    , + }); + } +} + +const app = new Application({ + router: { + type: 'hash', + }, + plugins: [PluginHello], +}); + +export default app.getRootComponent(); diff --git a/docs/ru-RU/development/client/demos/demo2.tsx b/docs/ru-RU/development/client/demos/demo2.tsx new file mode 100644 index 0000000000..ecc31eb5a4 --- /dev/null +++ b/docs/ru-RU/development/client/demos/demo2.tsx @@ -0,0 +1,44 @@ +import { + Application, + Plugin, + SchemaComponent, + SchemaComponentProvider, +} from '@nocobase/client'; +import React from 'react'; + +const Hello = () =>

    Hello NocoBase

    ; + +const HelloPage = () => { + return ( + + ); +}; + +class PluginHello extends Plugin { + async load() { + this.app.addProvider(SchemaComponentProvider, { + components: this.app.components, + scopes: this.app.scopes, + }); + this.app.addComponents({ Hello }); + this.router.add('hello', { + path: '/', + Component: HelloPage, + }); + } +} + +const app = new Application({ + router: { + type: 'memory', + }, + plugins: [PluginHello], +}); + +export default app.getRootComponent(); diff --git a/docs/ru-RU/development/client/demos/demo3.tsx b/docs/ru-RU/development/client/demos/demo3.tsx new file mode 100644 index 0000000000..37b599d0cb --- /dev/null +++ b/docs/ru-RU/development/client/demos/demo3.tsx @@ -0,0 +1,113 @@ +import { useFieldSchema } from '@formily/react'; +import { + Application, + CardItem, + Grid, + Plugin, + SchemaComponent, + SchemaInitializer, + SchemaInitializerItem, + SchemaSettings, + useSchemaComponentContext, + useSchemaInitializer, + useSchemaInitializerItem, +} from '@nocobase/client'; +import { Button } from 'antd'; +import React from 'react'; + +const mySettings = new SchemaSettings({ + name: 'mySettings', + items: [ + { + name: 'remove', + type: 'remove', + componentProps: { + removeParentsIfNoChildren: true, + }, + }, + ], +}); + +const myInitializer = new SchemaInitializer({ + name: 'MyInitializer', + // 按钮标题标题 + title: 'Button Text', + wrap: Grid.wrap, + // 调用 initializer.render() 时会渲染 items 列表 + items: [ + { + name: 'demo1', + title: 'Demo1', + Component: () => { + const itemConfig = useSchemaInitializerItem(); + // 调用插入功能 + const { insert } = useSchemaInitializer(); + const handleClick = () => { + insert({ + type: 'void', + 'x-settings': 'mySettings', + 'x-decorator': 'CardItem', + 'x-component': 'Hello', + }); + }; + return ; + }, + }, + ], +}); + +const Hello = () => { + const schema = useFieldSchema(); + return

    Hello, world! {schema.name}

    +}; + +const Btn = () => { + const { designable, setDesignable } = useSchemaComponentContext(); + return ( + + ); +}; + +const HelloPage = () => { + return ( +
    + + +
    + ); +}; + +class PluginHello extends Plugin { + async load() { + this.app.addComponents({ Grid, CardItem, Hello }); + this.app.schemaSettingsManager.add(mySettings); + this.app.schemaInitializerManager.add(myInitializer); + this.router.add('hello', { + path: '/', + Component: HelloPage, + }); + } +} + +const app = new Application({ + router: { + type: 'memory', + }, + plugins: [PluginHello], +}); + +export default app.getRootComponent(); diff --git a/docs/ru-RU/development/client/i18n.md b/docs/ru-RU/development/client/i18n.md new file mode 100644 index 0000000000..b292942dc9 --- /dev/null +++ b/docs/ru-RU/development/client/i18n.md @@ -0,0 +1,113 @@ +# Интернационализация + +## Файлы интернационализации + +В плагине файлы многоязычной поддержки для фронтенда и бэкенда хранятся в папке `src/locale`. Вы можете просмотреть [все поддерживаемые языки](#) в NocoBase, перейдя по ссылке. + +```bash +|- /plugin-sample-i18n + |- /src + |- /locale # Файлы многоязычной поддержки + |- en_US.ts # Английский язык + |- zh_CN.ts # Китайский язык +``` + +Для добавления записей перевода обновите соответствующий многоязычный файл (`/src/locale/${lang}.ts`). При добавлении нового языкового файла впервые потребуется перезапустить приложение, чтобы изменения вступили в силу. Успешное добавление записей перевода можно проверить через интерфейс `app:getLang`. + +http://localhost:13000/api/app:getLang?locale=zh-CN + +## Как обеспечить поддержку интернационализации + +### Экземпляр app.i18n + +```ts +import { Plugin } from '@nocobase/client'; + +class PluginDemoClient extends Plugin { + async load() { + // Экземпляр i18n + this.app.i18n; + this.app.i18n.t('привет'); + await this.app.i18n.changeLanguage('zh-CN'); + } +} +``` + +Реализация i18n основана на i18next. Для более подробных инструкций обратитесь к [документации I18next API](https://www.i18next.com/overview/api). + +### Метод React Hook + +```ts +import { useApp } from '@nocobase/client'; +import { useTranslation } from 'react-i18next'; + +const { i18n } = useApp(); +const { t } = useTranslation('@nocobase/plugin-sample-i18n'); +t('привет'); +// Эквивалентно +i18n.t('привет', { ns: '@nocobase/plugin-sample-i18n' }); +``` + +Для подробного использования `useTranslation()` обратитесь к [документации react-i18next](https://react.i18next.com/). + +### Пространство имён + +Локализация каждого плагина различается по пространству имён (ns), которое соответствует имени плагина, например: + +```ts +app.i18n.t('Привет', { ns: '@nocobase/plugin-sample-i18n' }); +``` + +### Метод tval + +При использовании в схеме: + +```ts +const schema = { + type: 'string', + title: '{{t("Я в порядке", { ns: "@nocobase/plugin-sample-i18n" })}}', + 'x-component': 'FormItem', + 'x-component': 'Input', +}; +``` + +Написание `'{{t("Я в порядке", { ns: "@nocobase/plugin-sample-i18n" })}}'` напрямую может привести к ошибкам. Вместо этого можно использовать более удобную функцию tval: + +```ts +import { tval } from '@nocobase/client'; + +const schema = { + type: 'string', + title: tval("Я в порядке", { ns: '@nocobase/plugin-sample-i18n', ...others }), + 'x-component': 'FormItem', + 'x-component': 'Input', +}; +``` + +## Важные замечания + +Избегайте использования экземпляра `i18n`, экспортированного из `@nocobase/client`, так как он будет устаревшим в будущем. Вместо этого используйте `app.i18n`. + +```ts +// Неправильно +import { i18n } from '@nocobase/client'; + +i18n.t('привет'); + +// Правильно +import { Plugin } from '@nocobase/client'; + +class PluginDemoClient extends Plugin { + async load() { + this.app.i18n.t('привет'); + } +} +``` + +**Почему это устарело?** + +Каждый экземпляр приложения работает независимо, включая i18n. Глобальный экземпляр i18n может вызывать помехи между несколькими экземплярами приложений, что нарушает принципы проектирования и является нежелательной практикой. + +## Полный пример плагина + +- [@nocobase/plugin-sample-i18n](#) diff --git a/docs/ru-RU/development/client/image-1.png b/docs/ru-RU/development/client/image-1.png new file mode 100644 index 0000000000..cb6bcf3c52 Binary files /dev/null and b/docs/ru-RU/development/client/image-1.png differ diff --git a/docs/ru-RU/development/client/image.png b/docs/ru-RU/development/client/image.png new file mode 100644 index 0000000000..b850fddb58 Binary files /dev/null and b/docs/ru-RU/development/client/image.png differ diff --git a/docs/ru-RU/development/client/index.md b/docs/ru-RU/development/client/index.md new file mode 100644 index 0000000000..142a87de3a --- /dev/null +++ b/docs/ru-RU/development/client/index.md @@ -0,0 +1,64 @@ +# Обзор + +## Структура директорий + +Инициализированный пустой плагин имеет следующую структуру директорий на стороне клиента: + +```bash +|- /plugin-sample-hello + |- /src + |- /client + |- index.tsx + |- client.d.ts + |- client.js +``` + +## Класс плагина + +Класс плагина предоставляет различные методы для жизненного цикла плагина. + +```ts +import { Plugin } from '@nocobase/client'; + +export class PluginSampleHelloClient extends Plugin { + async afterAdd() {} + + async beforeLoad() {} + + async load() {} +} + +export default PluginSampleHelloClient; +``` + +## Жизненный цикл плагина + +Жизненный цикл плагина + +- После инициализации плагина вызывается `afterAdd`. Важно отметить, что добавление плагинов происходит в неопределённом порядке, поэтому не пытайтесь получить экземпляры других плагинов в `afterAdd`. Если нужно получить экземпляры других плагинов, это можно сделать в `beforeLoad` или `load`. +- В `beforeLoad` все активированные плагины уже созданы, и на этом этапе экземпляры можно получить через [app.pluginManager.get()](https://client.docs.nocobase.com/core/application/plugin-settings-manager). +- В `load` метод `beforeLoad` всех плагинов уже выполнен. + +## Общие свойства и методы класса плагина + +| API | Руководство | +| ---------------------------- | ------------------------------------------------------------------------ | +| app.i18n | [Интернационализация](/development/client/i18n) | +| app.apiClient | [API-клиент](/development/client/api-client) | +| app.pluginManager | [Менеджер плагинов](https://client.docs.nocobase.com/core/application/plugin-manager) | +| app.router | [Управление маршрутизацией](/development/client/router) | +| app.pluginSettingsManager | [Страница настроек плагина](/development/client/router#plugin-settings-page-extension) | +| app.schemaInitializerManager | [Конфигурация инициализатора схемы](/development/client/ui-schema/initializer) | +| app.schemaSettingsManager | [Конфигурация настроек схемы](/development/client/ui-schema/settings) | +| app.addProviders | [Компоненты Provider](/development/client/providers) | +| app.addComponents | [Рендеринг схемы](/development/client/ui-schema/rendering) | +| app.addScopes | [Рендеринг схемы](/development/client/ui-schema/rendering) | + +## Часто используемые React **хуки** в компонентах + +| API | Руководство | +| -------------- | ------------------------------------------------------------------------------------------------ | +| useApp() | [API useApp()](https://client.docs.nocobase.com/core/application/application#useapp) | +| usePlugin() | [API usePlugin()](https://client.docs.nocobase.com/core/application/plugin-manager#useplugin) | +| useAPIClient() | [API-клиент](/development/client/api-client) | +| useRequest() | [API-клиент](/development/client/api-client) | diff --git a/docs/ru-RU/development/client/life-cycle.md b/docs/ru-RU/development/client/life-cycle.md new file mode 100644 index 0000000000..2f4d98e6b8 --- /dev/null +++ b/docs/ru-RU/development/client/life-cycle.md @@ -0,0 +1,129 @@ + +# Жизненный цикл плагина + +## Жизненный цикл + +Ниже приведено определение класса `Plugin`, который предоставляет три метода жизненного цикла: `afterAdd`, `beforeLoad`, `load`. + +```typescript +export class Pluginany> { + constructor( + protected options: T, + protected app: Application, + ) {} + + async afterAdd() {} + + async beforeLoad() {} + + async load() {} +} +``` + +### `afterAdd` + +- **Когда вызывается**: Сразу после добавления и инстанцирования плагина. +- **Назначение**: Используется для загрузки других плагинов. + +```typescript +class Demo1Plugin extends Plugin {} +class Demo2Plugin extends Plugin {} + +class MyPlugin extends Plugin { + async afterrAdd() { + // Загрузка других плагинов + this.app.pluginManager.add(Demo1Plugin); + this.app.pluginManager.add(Demo2Plugin); + } +} + +export default MyPlugin; +``` + +### `beforeLoad` + +- **Когда вызывается**: После добавления всех плагинов, но перед выполнением `load`. +- **Назначение**: Для обработки специальной логики перед `load`. + +### `load` + +- **Когда вызывается**: После выполнения `beforeLoad` для всех плагинов. +- **Назначение**: Большинство операций с экземпляром `app` и вызовов методов должны выполняться в этом цикле. + +```typescript +class MyPlugin extends Plugin { + async load() { + // Добавление маршрута + this.app.router.add(); + + // Добавление глобального компонента + this.app.addComponents({}); + + // Добавление страницы настроек плагина + this.app.pluginSettingsManager({}); + + // ... + } +} + +export default MyPlugin; +``` + +Общий порядок выполнения: + +`app.mount()/app.getRootComponent()` -> `pluginList.forEach(plugin.afterAdd)`-> `pluginList.forEach(plugin.beforeLoad)`-> `pluginList.forEach(plugin.load)` + +Порядок выполнения плагинов в одном типе жизненного цикла не гарантируется. + +## Менеджер плагинов + +- **Назначение**: Управление плагинами (добавление, удаление, изменение, поиск). +- **Сценарии**: Когда требуется разделение или объединение плагинов. +- **Экземпляр**: `app.pluginManager`. +- **Документация API**: [Управление плагинами](https://www.baidu.com). + +### Получение плагина + +Можно получить экземпляр плагина с помощью `app.pluginManager.get` и изменить его свойства или вызвать методы. + +```typescript +import { DemoPlugin } from 'my-demo-plugin'; + +class MyPlugin extends Plugin { + async load() { + // Получение экземпляра по классу + const demoPluginInstance = this.pm.get(DemoPlugin); + + // Если при добавлении было указано имя, можно получить по строке + const demoPluginInstance = this.pm.get('DemoPlugin'); + + // Обработка экземпляра ... + } +} +``` + +Для получения плагина внутри компонента можно использовать `usePlugin()`. + +```typescript +import { usePlugin } from '@nocobase/client'; +const Demo = () => { + const myPlugin = usePlugin(MyPlugin); // Получение экземпляра по классу + + const myPlugin = usePlugin('MyPlugin'); // Получение экземпляра по имени +}; +``` + +### Добавление плагина + +Плагины можно добавлять напрямую или с указанием имени для удобства получения. + +```typescript +class MyPlugin extends Plugin { + // Важно: вызывать в afterrAdd + async afterrAdd() { + this.app.pluginManager.add(DemoPlugin); + this.app.pluginManager.add(DemoPlugin, { name: 'DemoPlugin' }); + } +} +``` +``` diff --git a/docs/ru-RU/development/client/providers.md b/docs/ru-RU/development/client/providers.md new file mode 100644 index 0000000000..672ba4f064 --- /dev/null +++ b/docs/ru-RU/development/client/providers.md @@ -0,0 +1,148 @@ + +# **Компонент Provider** + +В клиентском приложении NocoBase компонент `Provider` определён на внешнем уровне, с следующей основной структурой: + +```tsx | pure + + {' '} + {/* Провайдер контекста для маршрутов */} + + + {/* Пользовательские компоненты Provider - Открывающий тег */} + + {/* Пользовательские компоненты Provider - Закрывающий тег */} + + + +``` + +Поскольку он определён на внешнем уровне, компонент `Provider` выполняет следующие функции: + +- Предоставляет глобально разделяемый контекст, отображая `props.children` при необходимости. +- Отображает глобальное содержимое, рендеря `props.children`. +- Выполняет роль перехватчика, условно отображая `props.children`. + +## Предоставление глобально разделяемого контекста + +Используйте `createContext` для создания контекста и `useContext` для получения определённого контекста: + +```tsx +import { Plugin, Application } from '@nocobase/client'; +import { createContext, useContext } from 'react'; + +const MyContext = createContext({ color: null }); + +const HomePage = () => { + // Получение значения контекста + const { color } = useContext(MyContext); + return
    Цвет: {color}
    ; +}; + +class PluginSampleProvider extends Plugin { + async load() { + this.app.addProvider(MyContext.Provider, { value: { color: 'blue' } }); + this.app.router.add('home', { + path: '/', + Component: HomePage, + }); + } +} + +const app = new Application({ + router: { + type: 'memory', + initialEntries: ['/'], + }, + plugins: [PluginSampleProvider], +}); + +export default app.getRootComponent(); +``` + +## Предоставление отображения глобального содержимого + +```tsx +import { Plugin, Application } from '@nocobase/client'; + +// Создание компонента и обеспечение рендеринга дочерних элементов +const MyProvider = (props) => { + const { children, name } = props; + return ( +
    +
    Отображение глобального содержимого - {name}
    + {children} +
    + ); +}; + +class PluginSampleProvider extends Plugin { + async load() { + this.app.addProvider(MyProvider, { name: 'NocoBase' }); + + this.app.router.add('home', { + path: '/', + Component: () =>
    Домашняя страница
    , + }); + } +} + +const app = new Application({ + router: { + type: 'memory', + initialEntries: ['/'], + }, + plugins: [PluginSampleProvider], +}); + +export default app.getRootComponent(); +``` + +## Функция перехвата + +```tsx +import { Plugin, Application } from '@nocobase/client'; +import { useLocation } from 'react-router'; +import { Link } from 'react-router-dom'; + +// Создание компонента и обеспечение рендеринга дочерних элементов +const MyProvider = (props) => { + const { children, name } = props; + const location = useLocation(); + if (location.pathname === '/about') { + return ( +
    + Содержимое перехвачено. Вернуться на Домашнюю страницу +
    + ); + } + return ( +
    +
    Привет, {name}
    + Домашняя, О нас + {children} +
    + ); +}; + +class PluginSampleProvider extends Plugin { + async load() { + this.app.addProvider(MyProvider); + this.app.router.add('home', { + path: '/', + Component: () =>
    Домашняя страница
    , + }); + } +} + +const app = new Application({ + router: { + type: 'memory', + initialEntries: ['/'], + }, + plugins: [PluginSampleProvider], +}); + +export default app.getRootComponent(); +``` + diff --git a/docs/ru-RU/development/client/router.md b/docs/ru-RU/development/client/router.md new file mode 100644 index 0000000000..46aa667ec6 --- /dev/null +++ b/docs/ru-RU/development/client/router.md @@ -0,0 +1,197 @@ +# Маршрутизация страниц и расширения + +## Введение + +Клиент NocoBase расширяет страницы через [app.router.add()](https://client.docs.nocobase.com/core/application/router-manager) и [app.pluginSettingsManager.add()](https://client.docs.nocobase.com/core/application/plugin-settings-manager), например: + +```tsx | pure +import { Application, Plugin } from '@nocobase/client'; +import React from 'react'; + +class PluginHello extends Plugin { + async load() { + this.router.add('hello', { + path: '/', + Component: () =>
    Привет, NocoBase
    , + }); + + this.app.pluginSettingsManager.add('hello', { + title: 'Привет', + icon: 'ApiOutlined', + Component: () =>
    Страница настроек Привет
    , + }); + } +} +``` + +Вы можете использовать метод `app.router.getRoutes()` для просмотра всех зарегистрированных страниц. + +```tsx | pure +import { Application, Plugin } from '@nocobase/client'; +import React from 'react'; + +class PluginHello extends Plugin { + async load() { + console.log(this.app.router.getRoutes()); + } +} +``` + +## Существующие маршруты страниц + +Изначально установленный NocoBase имеет следующие зарегистрированные маршруты страниц: + +| Имя | Путь | Компонент | Описание | +| -------------- | ------------------ | ------------------- |---------| +| admin | /admin/* | AdminLayout | Админ-страница | +| admin.page | /admin/:name | AdminDynamicPage | Динамическая страница | +| admin.settings | /admin/settings/* | AdminSettingsLayout | Страница настроек плагина | +| admin.pm.list | /admin/pm/list/* | PluginManager | Страница управления плагинами | + +### AdminLayout + +```ts +router.add('admin', { + path: '/admin/*', + Component: AdminLayout, +}); +``` + +### AdminDynamicPage + +```ts +router.add('admin.page', { + path: '/admin/:name', + Component: AdminDynamicPage, +}); +``` + +Динамические страницы управляются через управление меню, добавлением пунктов меню -> добавление страницы. + +![](https://static-docs.nocobase.com/9204957c39f644cfbf23eef3cbdc7eca.png) + +### AdminSettingsLayout + +```typescript +router.add('admin.settings', { + path: '/admin/settings/*', + Component: AdminSettingsLayout, +}); +``` + +Страницы настроек плагинов. + +![](https://static-docs.nocobase.com/ea22826eba4fd38d68a5a52fd68e7719.png) + +Меню и вкладки для страниц настроек плагинов регистрируются через `app.pluginSettingsManager`. + +## Расширения страниц + +- Динамические страницы схемы добавляются через `Добавить пункт меню` -> `Страница`. +- Обычные страницы добавляются через [app.router.add()](https://client.docs.nocobase.com/core/application/router-manager). +- Страницы настроек плагинов добавляются через [app.pluginSettingsManager.add()](https://client.docs.nocobase.com/core/application/plugin-settings-manager). + +### Динамические страницы схемы + +Добавляются через `Добавить пункт меню` -> `Страница`. + +### Расширения обычных страниц + +Страницы расширяются через [app.router.add()](https://client.docs.nocobase.com/core/application/router-manager). + +```typescript +import React from 'react'; +import { Link, Outlet } from 'react-router-dom'; +import { Application, Plugin } from '@nocobase/client'; + +const Home = () =>

    Главная

    ; +const About = () =>

    О нас

    ; + +const Layout = () => { + return ( +
    +
    + Главная, О нас +
    + +
    + ); +}; + +class MyPlugin extends Plugin { + async load() { + this.app.router.add('root', { + element: , + }); + + this.app.router.add('root.home', { + path: '/', + element: , + }); + + this.app.router.add('root.about', { + path: '/about', + element: , + }); + } +} + +const app = new Application({ + router: { + type: 'memory', + initialEntries: ['/'], + }, + plugins: [MyPlugin] +}); + +export default app.getRootComponent(); +``` + +### Расширения страниц настроек плагинов + +Страницы настроек плагинов добавляются через [app.pluginSettingsManager.add()](https://client.docs.nocobase.com/core/application/plugin-settings-manager). + +```tsx | pure +import { Plugin } from '@nocobase/client'; +import React from 'react'; + +const HelloSettingPage = () =>
    Страница настроек Привет
    ; + +export class HelloPlugin extends Plugin { + async load() { + this.app.pluginSettingsManager.add('hello', { + title: 'Привет', // Заголовок и название меню страницы настроек + icon: 'ApiOutlined', // Иконка меню для страницы настроек + Component: HelloSettingPage, + }); + } +} +``` + +Использование многоуровневой маршрутизации + +```tsx | pure +import { Outlet } from 'react-router-dom'; + +const pluginName = 'hello'; + +class HelloPlugin extends Plugin { + async load() { + this.app.pluginSettingsManager.add(pluginName, { + title: 'HelloWorld', + icon: '', + Component: Outlet, // Не обязательно указывать, по умолчанию компонент `Outlet` + }); + + this.app.pluginSettingsManager.add(`${pluginName}.demo1`, { + title: 'Страница Demo1', + Component: () =>
    Содержимое страницы Demo1
    , + }); + + this.app.pluginSettingsManager.add(`${pluginName}.demo2`, { + title: 'Страница Demo2', + Component: () =>
    Содержимое страницы Demo2
    , + }); + } +} +``` diff --git a/docs/ru-RU/development/client/static/D30xbFKV9oHJvXxN6HGcaBZlnph.png b/docs/ru-RU/development/client/static/D30xbFKV9oHJvXxN6HGcaBZlnph.png new file mode 100644 index 0000000000..a9f59f9f68 Binary files /dev/null and b/docs/ru-RU/development/client/static/D30xbFKV9oHJvXxN6HGcaBZlnph.png differ diff --git a/docs/ru-RU/development/client/static/DifFbVdZkoLGS2xDx0ucPISnnag.png b/docs/ru-RU/development/client/static/DifFbVdZkoLGS2xDx0ucPISnnag.png new file mode 100644 index 0000000000..81f85af0d1 Binary files /dev/null and b/docs/ru-RU/development/client/static/DifFbVdZkoLGS2xDx0ucPISnnag.png differ diff --git a/docs/ru-RU/development/client/static/DoNDbXU2XoEGkjx8u0YcqoU8nId.png b/docs/ru-RU/development/client/static/DoNDbXU2XoEGkjx8u0YcqoU8nId.png new file mode 100644 index 0000000000..2fe5e2836e Binary files /dev/null and b/docs/ru-RU/development/client/static/DoNDbXU2XoEGkjx8u0YcqoU8nId.png differ diff --git a/docs/ru-RU/development/client/static/KItpbzcUQo9A2yx2i1tcOmlLnjI.png b/docs/ru-RU/development/client/static/KItpbzcUQo9A2yx2i1tcOmlLnjI.png new file mode 100644 index 0000000000..319c371c76 Binary files /dev/null and b/docs/ru-RU/development/client/static/KItpbzcUQo9A2yx2i1tcOmlLnjI.png differ diff --git a/docs/ru-RU/development/client/static/KLf2bSErAocXnhxnOiycyd0jnUe.png b/docs/ru-RU/development/client/static/KLf2bSErAocXnhxnOiycyd0jnUe.png new file mode 100644 index 0000000000..d151ba31ae Binary files /dev/null and b/docs/ru-RU/development/client/static/KLf2bSErAocXnhxnOiycyd0jnUe.png differ diff --git a/docs/ru-RU/development/client/static/LOsWbeuJgocLsmxM1YZcGHGGn6f.png b/docs/ru-RU/development/client/static/LOsWbeuJgocLsmxM1YZcGHGGn6f.png new file mode 100644 index 0000000000..b4a9a3702a Binary files /dev/null and b/docs/ru-RU/development/client/static/LOsWbeuJgocLsmxM1YZcGHGGn6f.png differ diff --git a/docs/ru-RU/development/client/static/LtfabsBExoQHtSxmkLwcgE6andf.png b/docs/ru-RU/development/client/static/LtfabsBExoQHtSxmkLwcgE6andf.png new file mode 100644 index 0000000000..1f4ed5d851 Binary files /dev/null and b/docs/ru-RU/development/client/static/LtfabsBExoQHtSxmkLwcgE6andf.png differ diff --git a/docs/ru-RU/development/client/static/QFUPbE99LobwzCx5x8YcW1Txn7e.png b/docs/ru-RU/development/client/static/QFUPbE99LobwzCx5x8YcW1Txn7e.png new file mode 100644 index 0000000000..1f64353a59 Binary files /dev/null and b/docs/ru-RU/development/client/static/QFUPbE99LobwzCx5x8YcW1Txn7e.png differ diff --git a/docs/ru-RU/development/client/static/ShlTbs6Rbo0RylxzTaPcmcjUnqg.png b/docs/ru-RU/development/client/static/ShlTbs6Rbo0RylxzTaPcmcjUnqg.png new file mode 100644 index 0000000000..3c923380a8 Binary files /dev/null and b/docs/ru-RU/development/client/static/ShlTbs6Rbo0RylxzTaPcmcjUnqg.png differ diff --git a/docs/ru-RU/development/client/static/TcQ0b9vAAoX3gKx5uPYchs4tnEb.png b/docs/ru-RU/development/client/static/TcQ0b9vAAoX3gKx5uPYchs4tnEb.png new file mode 100644 index 0000000000..5d778c46c3 Binary files /dev/null and b/docs/ru-RU/development/client/static/TcQ0b9vAAoX3gKx5uPYchs4tnEb.png differ diff --git a/docs/ru-RU/development/client/static/W1xyb05JAoC0i5xVlDNc4xUrn3e.gif b/docs/ru-RU/development/client/static/W1xyb05JAoC0i5xVlDNc4xUrn3e.gif new file mode 100644 index 0000000000..918837d0e6 Binary files /dev/null and b/docs/ru-RU/development/client/static/W1xyb05JAoC0i5xVlDNc4xUrn3e.gif differ diff --git a/docs/ru-RU/development/client/static/WCBPbKackoxlV3xs2zxcXymTnQf.png b/docs/ru-RU/development/client/static/WCBPbKackoxlV3xs2zxcXymTnQf.png new file mode 100644 index 0000000000..3aa7e5291a Binary files /dev/null and b/docs/ru-RU/development/client/static/WCBPbKackoxlV3xs2zxcXymTnQf.png differ diff --git a/docs/ru-RU/development/client/static/XIXObandIozuMyxpG4Vc3Mz7nDb.jpg b/docs/ru-RU/development/client/static/XIXObandIozuMyxpG4Vc3Mz7nDb.jpg new file mode 100644 index 0000000000..a7769b0b5e Binary files /dev/null and b/docs/ru-RU/development/client/static/XIXObandIozuMyxpG4Vc3Mz7nDb.jpg differ diff --git a/docs/ru-RU/development/client/static/ZyL3b28aioYlhixPrjGcu0OjnZd.png b/docs/ru-RU/development/client/static/ZyL3b28aioYlhixPrjGcu0OjnZd.png new file mode 100644 index 0000000000..e084b87bf9 Binary files /dev/null and b/docs/ru-RU/development/client/static/ZyL3b28aioYlhixPrjGcu0OjnZd.png differ diff --git a/docs/ru-RU/development/client/styles-and-themes.md b/docs/ru-RU/development/client/styles-and-themes.md new file mode 100644 index 0000000000..eaffd1c664 --- /dev/null +++ b/docs/ru-RU/development/client/styles-and-themes.md @@ -0,0 +1,276 @@ +### **Стили и темы** + +Чтобы лучше использовать возможности динамических тем NocoBase, при написании стилей в плагинах рекомендуется использовать [antd-style](https://ant-design.github.io/antd-style/zh-CN/guide). В сочетании с существующими [токенами тем](https://ant.design/docs/react/customize-theme-cn#seedtoken) это позволяет эффективно управлять динамическими аспектами тем. Кроме того, NocoBase предоставляет [плагин редактора тем](#), который позволяет легко настраивать стили. + +#### **Написание стилей** + +##### **Написание стилей с помощью `createStyles` (рекомендуется)** + +```tsx +import { createStyles } from 'antd-style'; + +const useStyles = createStyles(({ token, css }) => ({ + // Поддержка синтаксиса CSS-объектов + container: { + backgroundColor: token.colorBgLayout, + borderRadius: token.borderRadiusLG, + maxWidth: 400, + width: '100%', + height: 180, + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + flexDirection: 'column', + marginLeft: 'auto', + marginRight: 'auto', + }, + // Также поддерживает шаблоны строк CSS для привычного опыта написания стилей + card: css` + color: ${token.colorTextTertiary}; + box-shadow: ${token.boxShadow}; + &:hover { + color: ${token.colorTextSecondary}; + box-shadow: ${token.boxShadowSecondary}; + } + + padding: ${token.padding}px; + border-radius: ${token.borderRadius}px; + background: ${token.colorBgContainer}; + transition: all 100ms ${token.motionEaseInBack}; + + margin-bottom: 8px; + cursor: pointer; + `, +})); + +export default () => { + // Объект styles по умолчанию кэшируется в методе useStyles, поэтому повторная отрисовка не вызывает проблем + const { styles, cx, theme } = useStyles(); + + return ( + // Используйте cx для объединения className +
    +
    createStyles Demo
    + {/* Объект theme содержит все токены и информацию, связанную с темой */} +
    Текущий режим темы: {theme.appearance}
    +
    + ); +}; +``` + +Подробное использование см. в [API createStyles](https://ant-design.github.io/antd-style/zh-CN/api/create-styles). + +##### **Создание повторно используемых стилей с помощью `createStylish`** + +```tsx +import { createStyles, createStylish, css } from 'antd-style'; + +const useStylish = createStylish(({ token, css }) => { + const containerBgHover = css` + cursor: pointer; + transition: 150ms background-color ease-in-out; + &:hover { + background: ${token.colorFillQuaternary}; + } + `; + + const defaultButtonBase = css` + color: ${token.colorTextSecondary}; + background: ${token.colorFillQuaternary}; + border-color: transparent; + `; + + return { + defaultButton: css` + ${defaultButtonBase}; + + &:hover { + color: ${token.colorText}; + background: ${token.colorFillSecondary}; + border-color: transparent; + } + &:focus { + ${defaultButtonBase}; + border-color: ${token.colorPrimary}; + } + `, + + containerBgHover: css` + cursor: pointer; + transition: 150ms background-color ease-in-out; + + &:hover { + background: ${token.colorFillQuaternary}; + } + `, + + containerBgL2: css` + ${containerBgHover}; + border-radius: 4px; + background: ${token.colorFillQuaternary}; + + &:hover { + background: ${token.colorFillTertiary}; + } + `, + }; +}); + +const useStyles = createStyles({ + // Поддержка синтаксиса CSS-объектов + container: { + backgroundColor: '#f5f5f5', + maxWidth: 400, + width: '100%', + height: 180, + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + }, + // Также поддерживает шаблоны строк CSS для привычного опыта написания стилей + btn: css` + padding: 24px; + `, +}); + +export default () => { + const { styles, cx } = useStyles(); + const stylish = useStylish(); + + return ( +
    +
    + Stylish Button +
    +
    + ); +}; +``` + +Подробное использование см. в [API createStylish](https://ant-design.github.io/antd-style/zh-CN/api/create-stylish). + +### **Глобальные стили с помощью `createGlobalStyle`** + +```tsx +import { createGlobalStyle } from 'antd-style'; + +const Global = createGlobalStyle` + .some-class { + color: hotpink; + } +`; + +export default () => { + return ( +
    + +
    Любимый цвет брутальных мужчин
    +
    + ); +}; +``` + +Подробное использование см. в [API createGlobalStyle](https://ant-design.github.io/antd-style/zh-CN/api/global-styles). + +## **Настройка тем** + +### **Использование токенов темы `antd`** + +#### **Пример с `createStyles`** + +```tsx +import { SmileOutlined } from '@ant-design/icons'; +import { Button, Space } from 'antd'; +import { createStyles } from 'antd-style'; + +const useStyles = createStyles(({ token, css }) => { + const commonCard = css` + border-radius: ${token.borderRadiusLG}px; + padding: ${token.paddingLG}px; + `; + + return { + container: css` + background-color: ${token.colorBgLayout}; + padding: 24px; + `, + + primaryCard: css` + ${commonCard}; + background: ${token.colorPrimary}; + color: ${token.colorTextLightSolid}; + `, + + defaultCard: css` + ${commonCard}; + background: ${token.colorBgContainer}; + color: ${token.colorText}; + `, + }; +}); + +const App = () => { + const { styles } = useStyles(); + + return ( +
    + + +
    + ); +}; + +export default App; +``` + +#### **Пример с `createGlobalStyle`** + +```tsx +import { createGlobalStyle, ThemeProvider } from 'antd-style'; + +const Global = createGlobalStyle` + .ant-custom-button { + color: ${(p) => p.theme.colorPrimary}; + background: ${(p) => p.theme.colorPrimaryBg}; + height: ${(p) => p.theme.controlHeight}px; + border-radius: ${(p) => p.theme.borderRadius}px; + padding: 0 ${(p) => p.theme.paddingContentHorizontal}px; + + :hover { + background: ${(p) => p.theme.colorPrimaryBgHover}; + color: ${(p) => p.theme.colorPrimaryTextActive}; + } + + :active { + background: ${(p) => p.theme.colorPrimaryBorder}; + color: ${(p) => p.theme.colorPrimaryText}; + } + + border: none; + cursor: pointer; + } +`; + +export default () => { + return ( + + + + + ); +}; +``` + +## **Отладка тем** + +### **Использование плагина редактора тем** + +![Редактор тем](https://static-docs.nocobase.com/440f844d056a485f9f0dc64a8ca1b4f4.png) diff --git a/docs/ru-RU/development/client/test.md b/docs/ru-RU/development/client/test.md new file mode 100644 index 0000000000..27223b340b --- /dev/null +++ b/docs/ru-RU/development/client/test.md @@ -0,0 +1 @@ +# Тестирование diff --git a/docs/ru-RU/development/client/ui-schema/SchemaInitializes.png b/docs/ru-RU/development/client/ui-schema/SchemaInitializes.png new file mode 100644 index 0000000000..70291780a5 Binary files /dev/null and b/docs/ru-RU/development/client/ui-schema/SchemaInitializes.png differ diff --git a/docs/ru-RU/development/client/ui-schema/SchemaSettings.png b/docs/ru-RU/development/client/ui-schema/SchemaSettings.png new file mode 100644 index 0000000000..52c1e1742f Binary files /dev/null and b/docs/ru-RU/development/client/ui-schema/SchemaSettings.png differ diff --git a/docs/ru-RU/development/client/ui-schema/components.md b/docs/ru-RU/development/client/ui-schema/components.md new file mode 100644 index 0000000000..4356895403 --- /dev/null +++ b/docs/ru-RU/development/client/ui-schema/components.md @@ -0,0 +1,82 @@ +# **Компоненты схемы (Schema components)** + +# **Обёрточные компоненты** + +- BlockItem +- FormItem +- CardItem + +## **Макет (Layout)** + +- Page +- Grid +- Tabs +- Space + +## **Компоненты полей** + +Компоненты полей, как правило, не используются отдельно, а применяются внутри компонентов отображения данных. + +- CollectionField: универсальный компонент +- Cascader +- Checkbox +- ColorSelect +- DatePicker +- Filter +- Formula +- IconPicker +- Input +- InputNumber +- Markdown +- Password +- Percent +- Radio +- RecordPicker +- RichText +- Select +- TimePicker +- TreeSelect +- Upload + +## **Компоненты отображения данных** + +Используются совместно с компонентами полей. + +- Calendar +- Form +- Kanban +- Table +- TableV2 + +## **Действия (компоненты с событием onClick)** + +- Action +- Action.Drawer +- Action.Modal +- ActionBar: используется для компоновки действий +- Menu + +## **Прочие** + +- G2plot +- Markdown.Void + +## **Сценарии использования `x-designer` и `x-initializer`** + +`x-designer` действует, когда `x-decorator` или `x-component` является одним из следующих компонентов: + +- BlockItem +- CardItem +- FormItem +- Table.Column +- Tabs.TabPane + +`x-initializer` действует, когда `x-decorator` или `x-component` является одним из следующих компонентов: + +- ActionBar +- BlockItem +- CardItem +- FormItem +- Grid +- Table +- Tabs diff --git a/docs/ru-RU/development/client/ui-schema/demos/demo1.tsx b/docs/ru-RU/development/client/ui-schema/demos/demo1.tsx new file mode 100644 index 0000000000..d4b765fb0e --- /dev/null +++ b/docs/ru-RU/development/client/ui-schema/demos/demo1.tsx @@ -0,0 +1,35 @@ +import { Application, Plugin, SchemaComponent } from '@nocobase/client'; +import React from 'react'; + +const Hello = () =>

    Hello NocoBase

    ; + +const HelloPage = () => { + return ( + + ); +}; + +class PluginHello extends Plugin { + async load() { + this.app.addComponents({ Hello }); + this.router.add('hello', { + path: '/', + Component: HelloPage, + }); + } +} + +const app = new Application({ + router: { + type: 'memory', + }, + plugins: [PluginHello], +}); + +export default app.getRootComponent(); diff --git a/docs/ru-RU/development/client/ui-schema/demos/demo2.tsx b/docs/ru-RU/development/client/ui-schema/demos/demo2.tsx new file mode 100644 index 0000000000..636529c909 --- /dev/null +++ b/docs/ru-RU/development/client/ui-schema/demos/demo2.tsx @@ -0,0 +1,76 @@ +import { + Application, + CardItem, + Grid, + Plugin, + SchemaComponent, + SchemaInitializer, + SchemaInitializerItem, + useSchemaInitializer, + useSchemaInitializerItem, +} from '@nocobase/client'; +import React from 'react'; + +const Hello = () =>

    Hello NocoBase

    ; + +const myInitializer = new SchemaInitializer({ + name: 'myInitializer', + // 按钮标题标题 + title: 'Add block', + wrap: Grid.wrap, + items: [ + { + name: 'demo1', + title: 'Hello block', + Component: () => { + const itemConfig = useSchemaInitializerItem(); + // 调用插入功能 + const { insert } = useSchemaInitializer(); + const handleClick = () => { + insert({ + type: 'void', + 'x-component': 'Hello', + }); + }; + return ; + }, + }, + ], +}); + +const HelloPage = () => { + return ( +
    + +
    + ); +}; + +class PluginHello extends Plugin { + async load() { + this.app.addComponents({ Grid, CardItem, Hello }); + this.router.add('hello', { + path: '/', + Component: HelloPage, + }); + this.app.schemaInitializerManager.add(myInitializer); + } +} + +const app = new Application({ + router: { + type: 'memory', + }, + // 为了更好的展示 demo,直接将 designable 设置为 true + designable: true, + plugins: [PluginHello], +}); + +export default app.getRootComponent(); diff --git a/docs/ru-RU/development/client/ui-schema/demos/demo3.tsx b/docs/ru-RU/development/client/ui-schema/demos/demo3.tsx new file mode 100644 index 0000000000..a2d8f86647 --- /dev/null +++ b/docs/ru-RU/development/client/ui-schema/demos/demo3.tsx @@ -0,0 +1,107 @@ +import { useFieldSchema } from '@formily/react'; +import { + Application, + CardItem, + Grid, + Plugin, + SchemaComponent, + SchemaInitializer, + SchemaInitializerItem, + SchemaSettings, + useSchemaInitializer, + useSchemaInitializerItem, +} from '@nocobase/client'; +import React from 'react'; + +const mySettings = new SchemaSettings({ + name: 'mySettings', + items: [ + { + name: 'remove', + type: 'remove', + componentProps: { + removeParentsIfNoChildren: true, + }, + }, + ], +}); + +const myInitializer = new SchemaInitializer({ + name: 'MyInitializer', + // 按钮标题标题 + title: 'Button Text', + wrap: Grid.wrap, + // 调用 initializer.render() 时会渲染 items 列表 + items: [ + { + name: 'demo1', + title: 'Demo1', + Component: () => { + const itemConfig = useSchemaInitializerItem(); + // 调用插入功能 + const { insert } = useSchemaInitializer(); + const handleClick = () => { + insert({ + type: 'void', + 'x-settings': 'mySettings', + 'x-decorator': 'CardItem', + 'x-component': 'Hello', + }); + }; + return ; + }, + }, + ], +}); + +const Hello = () => { + const schema = useFieldSchema(); + return

    Hello, world! {schema.name}

    ; +}; + +const hello1 = Grid.wrap({ + type: 'void', + 'x-settings': 'mySettings', + 'x-decorator': 'CardItem', + 'x-component': 'Hello', +}); + +const HelloPage = () => { + return ( +
    + +
    + ); +}; + +class PluginHello extends Plugin { + async load() { + this.app.addComponents({ Grid, CardItem, Hello }); + this.app.schemaSettingsManager.add(mySettings); + this.app.schemaInitializerManager.add(myInitializer); + this.router.add('hello', { + path: '/', + Component: HelloPage, + }); + } +} + +const app = new Application({ + router: { + type: 'memory', + }, + designable: true, + plugins: [PluginHello], +}); + +export default app.getRootComponent(); diff --git a/docs/ru-RU/development/client/ui-schema/demos/schema-initializer-manager-add-item/app.tsx b/docs/ru-RU/development/client/ui-schema/demos/schema-initializer-manager-add-item/app.tsx new file mode 100644 index 0000000000..f1296db2e1 --- /dev/null +++ b/docs/ru-RU/development/client/ui-schema/demos/schema-initializer-manager-add-item/app.tsx @@ -0,0 +1,80 @@ +import { + Application, + CardItem, + Grid, + Plugin, + SchemaComponent, + SchemaInitializer, + useSchemaInitializer, +} from '@nocobase/client'; +import React from 'react'; + +const HelloPage = () => { + return ( +
    + +
    + ); +}; + +class PluginHello extends Plugin { + async load() { + const myInitializer = new SchemaInitializer({ + name: 'myInitializer', + title: 'Add block', + wrap: Grid.wrap, + items: [ + { + name: 'otherBlocks', + title: 'Other blocks', + type: 'itemGroup', + children: [ + { + name: 'helloBlock', + type: 'item', + useComponentProps() { + const { insert } = useSchemaInitializer(); + return { + title: 'Hello', + onClick: () => { + insert({ + type: 'void', + 'x-decorator': 'CardItem', + 'x-component': 'h1', + 'x-content': 'Hello, world!', + }); + }, + }; + }, + }, + ], + }, + ], + }); + this.schemaInitializerManager.add(myInitializer); + this.app.addComponents({ Grid, CardItem }); + this.router.add('hello', { + path: '/', + Component: HelloPage, + }); + } +} + +export function createApp(options: any = {}) { + const { plugins = [] } = options; + return new Application({ + router: { + type: 'memory', + initialEntries: ['/'], + }, + designable: true, + plugins: [PluginHello, ...plugins], + }); +} diff --git a/docs/ru-RU/development/client/ui-schema/demos/schema-initializer-manager-add-item/index.tsx b/docs/ru-RU/development/client/ui-schema/demos/schema-initializer-manager-add-item/index.tsx new file mode 100644 index 0000000000..3d10f56a46 --- /dev/null +++ b/docs/ru-RU/development/client/ui-schema/demos/schema-initializer-manager-add-item/index.tsx @@ -0,0 +1,36 @@ +import { Plugin, useSchemaInitializer } from '@nocobase/client'; +import { createApp } from './app'; + +class PluginDemoAddSchemaInitializerItem extends Plugin { + async load() { + const customItem = { + name: 'custom', + type: 'item', + useComponentProps() { + const { insert } = useSchemaInitializer(); + return { + title: 'Custom', + onClick: () => { + insert({ + type: 'void', + 'x-decorator': 'CardItem', + 'x-component': 'h1', + 'x-content': 'Custom block', + }); + }, + }; + }, + }; + + this.schemaInitializerManager.addItem( + 'myInitializer', // 示例,已存在的 schema initializer + 'otherBlocks.custom', // 向 otherBlocks 分组内添加 custom + customItem, + ); + } +} + +// 快捷模拟一个 App +const app = createApp({ plugins: [PluginDemoAddSchemaInitializerItem] }); + +export default app.getRootComponent(); diff --git a/docs/ru-RU/development/client/ui-schema/demos/schema-initializer-manager-add/app.tsx b/docs/ru-RU/development/client/ui-schema/demos/schema-initializer-manager-add/app.tsx new file mode 100644 index 0000000000..5f1ae25fc2 --- /dev/null +++ b/docs/ru-RU/development/client/ui-schema/demos/schema-initializer-manager-add/app.tsx @@ -0,0 +1,22 @@ +import { Application, Plugin } from '@nocobase/client'; + +class PluginHome extends Plugin { + async load() { + this.router.add('home', { + path: '/', + Component: 'HomePage', + }); + } +} + +export function createApp(options: any = {}) { + const { plugins = [] } = options; + return new Application({ + router: { + type: 'memory', + initialEntries: ['/'], + }, + designable: true, + plugins: [PluginHome, ...plugins], + }); +} diff --git a/docs/ru-RU/development/client/ui-schema/demos/schema-initializer-manager-add/index.tsx b/docs/ru-RU/development/client/ui-schema/demos/schema-initializer-manager-add/index.tsx new file mode 100644 index 0000000000..c5a2bcfeaa --- /dev/null +++ b/docs/ru-RU/development/client/ui-schema/demos/schema-initializer-manager-add/index.tsx @@ -0,0 +1,60 @@ +import { + Grid, + Plugin, + SchemaComponent, + SchemaInitializer, + useSchemaInitializer, +} from '@nocobase/client'; +import React from 'react'; +import { createApp } from './app'; + +const HomePage = () => { + return ( + + ); +}; + +class PluginDemoAddSchemaInitializer extends Plugin { + async load() { + // 注册全局组件 + this.app.addComponents({ Grid, HomePage }); + const myInitializer = new SchemaInitializer({ + name: 'myInitializer', + title: 'Add block', + wrap: Grid.wrap, + items: [ + { + name: 'helloBlock', + type: 'item', + useComponentProps() { + const { insert } = useSchemaInitializer(); + return { + title: 'Hello', + onClick: () => { + insert({ + type: 'void', + 'x-decorator': 'CardItem', + 'x-component': 'h1', + 'x-content': 'Hello, world!', + }); + }, + }; + }, + }, + ], + }); + this.schemaInitializerManager.add(myInitializer); + } +} + +// 快捷模拟一个 App +const app = createApp({ plugins: [PluginDemoAddSchemaInitializer] }); + +export default app.getRootComponent(); diff --git a/docs/ru-RU/development/client/ui-schema/demos/schema-settings-basic/app.tsx b/docs/ru-RU/development/client/ui-schema/demos/schema-settings-basic/app.tsx new file mode 100644 index 0000000000..b92bd0f528 --- /dev/null +++ b/docs/ru-RU/development/client/ui-schema/demos/schema-settings-basic/app.tsx @@ -0,0 +1,58 @@ +import { + Application, + CardItem, + FormItem, + Input, + Plugin, + SchemaComponent, + SchemaSettings, +} from '@nocobase/client'; +import React from 'react'; + +const HelloPage = () => { + return ( +
    + +
    + ); +}; + +class PluginHello extends Plugin { + async load() { + const mySettings = new SchemaSettings({ + name: 'mySettings', + items: [], + }); + this.schemaSettingsManager.add(mySettings); + this.app.addComponents({ CardItem, Input, FormItem }); + this.router.add('hello', { + path: '/', + Component: HelloPage, + }); + } +} + +export function createApp(options: any = {}) { + const { plugins = [] } = options; + return new Application({ + router: { + type: 'memory', + initialEntries: ['/'], + }, + designable: true, + plugins: [PluginHello, ...plugins], + }); +} diff --git a/docs/ru-RU/development/client/ui-schema/demos/schema-settings-basic/index.tsx b/docs/ru-RU/development/client/ui-schema/demos/schema-settings-basic/index.tsx new file mode 100644 index 0000000000..bf75ceedc9 --- /dev/null +++ b/docs/ru-RU/development/client/ui-schema/demos/schema-settings-basic/index.tsx @@ -0,0 +1,56 @@ +/** + * defaultShowCode: true + */ +import { ISchema } from '@formily/react'; +import { Plugin, SchemaSettingsModalItem, useSchemaSettings } from '@nocobase/client'; +import React from 'react'; +import { createApp } from './app'; + +export const SchemaSettingsBlockTitleItem: any = () => { + // 设计器的 Designable 实例 + const { dn } = useSchemaSettings(); + + return ( + { + // 参数覆盖 + dn.deepMerge({ + 'x-decorator-props': { + title, + }, + }); + }} + /> + ); +}; + +class PluginDemoAddSchemaInitializerItem extends Plugin { + async load() { + this.schemaSettingsManager.addItem('mySettings', 'blockTitle', { + Component: SchemaSettingsBlockTitleItem, + }); + } +} + +// 快捷模拟一个 App +const app = createApp({ plugins: [PluginDemoAddSchemaInitializerItem] }); + +export default app.getRootComponent(); diff --git a/docs/ru-RU/development/client/ui-schema/demos/schema-settings-manager-add-item/app.tsx b/docs/ru-RU/development/client/ui-schema/demos/schema-settings-manager-add-item/app.tsx new file mode 100644 index 0000000000..0f1a2a041f --- /dev/null +++ b/docs/ru-RU/development/client/ui-schema/demos/schema-settings-manager-add-item/app.tsx @@ -0,0 +1,70 @@ +import { + Application, + CardItem, + Plugin, + SchemaComponent, + SchemaSettings +} from '@nocobase/client'; +import React from 'react'; + +const HelloPage = () => { + return ( +
    + +
    + ); +}; + +class PluginHello extends Plugin { + async load() { + const mySettings = new SchemaSettings({ + name: 'mySettings', + items: [ + { + type: 'item', + name: 'edit', + useComponentProps() { + // TODO: 补充相关设置逻辑 + return { + title: 'Edit', + onClick() { + // todo + }, + }; + }, + }, + ], + }); + this.schemaSettingsManager.add(mySettings); + this.app.addComponents({ CardItem }); + this.router.add('hello', { + path: '/', + Component: HelloPage, + }); + } +} + +export function createApp(options: any = {}) { + const { plugins = [] } = options; + return new Application({ + router: { + type: 'memory', + initialEntries: ['/'], + }, + designable: true, + plugins: [PluginHello, ...plugins], + }); +} diff --git a/docs/ru-RU/development/client/ui-schema/demos/schema-settings-manager-add-item/index.tsx b/docs/ru-RU/development/client/ui-schema/demos/schema-settings-manager-add-item/index.tsx new file mode 100644 index 0000000000..f23f301532 --- /dev/null +++ b/docs/ru-RU/development/client/ui-schema/demos/schema-settings-manager-add-item/index.tsx @@ -0,0 +1,30 @@ +import { Plugin } from '@nocobase/client'; +import { createApp } from './app'; + +class PluginDemoAddSchemaSettingsItem extends Plugin { + async load() { + const customItem = { + name: 'custom', + type: 'item', + useComponentProps() { + return { + title: 'Custom', + onClick: () => {}, + }; + }, + }; + + this.schemaSettingsManager.addItem( + 'mySettings', // 示例,已存在的 schema settings name + 'customItem', // 新增的 item name + customItem, + ); + } +} + +// 快捷模拟一个 App +const app = createApp({ + plugins: [PluginDemoAddSchemaSettingsItem], +}); + +export default app.getRootComponent(); diff --git a/docs/ru-RU/development/client/ui-schema/demos/schema-settings-manager-add/app.tsx b/docs/ru-RU/development/client/ui-schema/demos/schema-settings-manager-add/app.tsx new file mode 100644 index 0000000000..5f1ae25fc2 --- /dev/null +++ b/docs/ru-RU/development/client/ui-schema/demos/schema-settings-manager-add/app.tsx @@ -0,0 +1,22 @@ +import { Application, Plugin } from '@nocobase/client'; + +class PluginHome extends Plugin { + async load() { + this.router.add('home', { + path: '/', + Component: 'HomePage', + }); + } +} + +export function createApp(options: any = {}) { + const { plugins = [] } = options; + return new Application({ + router: { + type: 'memory', + initialEntries: ['/'], + }, + designable: true, + plugins: [PluginHome, ...plugins], + }); +} diff --git a/docs/ru-RU/development/client/ui-schema/demos/schema-settings-manager-add/index.tsx b/docs/ru-RU/development/client/ui-schema/demos/schema-settings-manager-add/index.tsx new file mode 100644 index 0000000000..3e1429901c --- /dev/null +++ b/docs/ru-RU/development/client/ui-schema/demos/schema-settings-manager-add/index.tsx @@ -0,0 +1,58 @@ +import { + CardItem, + Plugin, + SchemaComponent, + SchemaSettings, +} from '@nocobase/client'; +import React from 'react'; +import { createApp } from './app'; + +const HomePage = () => { + return ( + + ); +}; + +class PluginDemoAddSchemaSettings extends Plugin { + async load() { + // 注册全局组件 + this.app.addComponents({ CardItem, HomePage }); + const mySettings = new SchemaSettings({ + name: 'mySettings', + items: [ + { + type: 'item', + name: 'edit', + useComponentProps() { + // TODO: 补充相关设置逻辑 + return { + title: 'Edit', + onClick() { + // todo + }, + }; + }, + }, + ], + }); + this.schemaSettingsManager.add(mySettings); + } +} + +// 快捷模拟一个 App +const app = createApp({ plugins: [PluginDemoAddSchemaSettings] }); + +export default app.getRootComponent(); diff --git a/docs/ru-RU/development/client/ui-schema/demos/schema-toolbar-basic/app.tsx b/docs/ru-RU/development/client/ui-schema/demos/schema-toolbar-basic/app.tsx new file mode 100644 index 0000000000..26623fb550 --- /dev/null +++ b/docs/ru-RU/development/client/ui-schema/demos/schema-toolbar-basic/app.tsx @@ -0,0 +1,23 @@ +import { Application, ApplicationOptions, Plugin } from '@nocobase/client'; + +class PluginHome extends Plugin { + async load() { + this.router.add('home', { + path: '/', + Component: 'HomePage', + }); + } +} + +export function createApp(options: ApplicationOptions = {}) { + const { plugins = [], ...others } = options; + return new Application({ + router: { + type: 'memory', + initialEntries: ['/'], + }, + designable: true, + ...others, + plugins: [PluginHome, ...plugins], + }); +} diff --git a/docs/ru-RU/development/client/ui-schema/demos/schema-toolbar-basic/button.tsx b/docs/ru-RU/development/client/ui-schema/demos/schema-toolbar-basic/button.tsx new file mode 100644 index 0000000000..b9d14841e4 --- /dev/null +++ b/docs/ru-RU/development/client/ui-schema/demos/schema-toolbar-basic/button.tsx @@ -0,0 +1,76 @@ +import { useFieldSchema } from '@formily/react'; +import { + Plugin, + SchemaComponent, + SchemaSettings, + SchemaToolbar, + Space, + useSchemaToolbarRender, +} from '@nocobase/client'; +import { Space as AntdSpace, Button } from 'antd'; +import React from 'react'; +import { createApp } from './app'; + +const MyToolbar = (props) => { + return ; +}; + +const SchemaToolbarRenderer = (props) => { + const fieldSchema = useFieldSchema(); + const { render } = useSchemaToolbarRender(fieldSchema); + return render({ draggable: false }); +}; + +const CustomButton = (props) => { + return ( + + ); +}; + +const HomePage = () => { + return ( + + ); +}; + +class PluginDemoToolbar extends Plugin { + async load() { + this.app.addComponents({ HomePage, CustomButton, MyToolbar, Space }); + const mySettings = new SchemaSettings({ + name: 'mySettings', + items: [], + }); + this.schemaSettingsManager.add(mySettings); + } +} + +const app = createApp({ plugins: [PluginDemoToolbar] }); + +export default app.getRootComponent(); diff --git a/docs/ru-RU/development/client/ui-schema/demos/schema-toolbar-basic/custom.tsx b/docs/ru-RU/development/client/ui-schema/demos/schema-toolbar-basic/custom.tsx new file mode 100644 index 0000000000..66f12dabb2 --- /dev/null +++ b/docs/ru-RU/development/client/ui-schema/demos/schema-toolbar-basic/custom.tsx @@ -0,0 +1,48 @@ +import { useFieldSchema } from '@formily/react'; +import { + CardItem, + Plugin, + SchemaComponent, + SchemaSettings, + SchemaToolbar +} from '@nocobase/client'; +import React from 'react'; +import { createApp } from './app'; + +const MyToolbar = (props) => { + const fieldSchema = useFieldSchema(); + return ( + + ); +}; + +const HomePage = () => { + return ( + + ); +}; + +class PluginDemoToolbar extends Plugin { + async load() { + this.app.addComponents({ HomePage, CardItem, MyToolbar }); + const mySettings = new SchemaSettings({ + name: 'mySettings', + items: [], + }); + this.schemaSettingsManager.add(mySettings); + } +} + +const app = createApp({ plugins: [PluginDemoToolbar] }); + +export default app.getRootComponent(); diff --git a/docs/ru-RU/development/client/ui-schema/demos/schema-toolbar-basic/grid.tsx b/docs/ru-RU/development/client/ui-schema/demos/schema-toolbar-basic/grid.tsx new file mode 100644 index 0000000000..d03b4e78a2 --- /dev/null +++ b/docs/ru-RU/development/client/ui-schema/demos/schema-toolbar-basic/grid.tsx @@ -0,0 +1,98 @@ +import { useFieldSchema } from '@formily/react'; +import { + CardItem, + Grid, + Plugin, + SchemaComponent, + SchemaInitializer, + SchemaSettings, + SchemaToolbar, + useSchemaInitializer +} from '@nocobase/client'; +import React from 'react'; +import { createApp } from './app'; + +const MyToolbar = (props) => { + const fieldSchema = useFieldSchema(); + return ( + + ); +}; + +const HomePage = () => { + return ( + + ); +}; + +class PluginDemoToolbar extends Plugin { + async load() { + this.app.addComponents({ HomePage, CardItem, MyToolbar, Grid }); + const myInitializer = new SchemaInitializer({ + name: 'myInitializer', + title: 'AddBlock', + wrap: Grid.wrap, + items: [ + { + name: 'helloBlock', + type: 'item', + useComponentProps() { + const { insert } = useSchemaInitializer(); + return { + title: 'Hello', + onClick: () => { + insert({ + type: 'void', + 'x-decorator': 'CardItem', + 'x-settings': 'mySettings', + 'x-component': 'h1', + 'x-content': 'Hello, world!', + }); + }, + }; + }, + }, + ], + }); + const mySettings = new SchemaSettings({ + name: 'mySettings', + items: [], + }); + this.schemaInitializerManager.add(myInitializer); + this.schemaSettingsManager.add(mySettings); + } +} + +const app = createApp({ plugins: [PluginDemoToolbar] }); + +export default app.getRootComponent(); diff --git a/docs/ru-RU/development/client/ui-schema/demos/schema-toolbar-basic/index.tsx b/docs/ru-RU/development/client/ui-schema/demos/schema-toolbar-basic/index.tsx new file mode 100644 index 0000000000..5ad0f72933 --- /dev/null +++ b/docs/ru-RU/development/client/ui-schema/demos/schema-toolbar-basic/index.tsx @@ -0,0 +1,80 @@ +import { + Action, + BlockItem, + CardItem, + FormItem, + Input, + Plugin, + SchemaComponent, + SchemaSettings, +} from '@nocobase/client'; +import React from 'react'; +import { createApp } from './app'; + +const HomePage = () => { + return ( + + ); +}; + +class PluginDemoToolbar extends Plugin { + async load() { + this.app.addComponents({ + HomePage, + Action, + CardItem, + FormItem, + BlockItem, + Input, + }); + const mySettings = new SchemaSettings({ + name: 'mySettings', + items: [], + }); + this.schemaSettingsManager.add(mySettings); + } +} + +const app = createApp({ plugins: [PluginDemoToolbar] }); + +export default app.getRootComponent(); diff --git a/docs/ru-RU/development/client/ui-schema/demos/use-schema-initializer-render/app.tsx b/docs/ru-RU/development/client/ui-schema/demos/use-schema-initializer-render/app.tsx new file mode 100644 index 0000000000..78aa4e3635 --- /dev/null +++ b/docs/ru-RU/development/client/ui-schema/demos/use-schema-initializer-render/app.tsx @@ -0,0 +1,47 @@ +import { Application, Plugin, SchemaInitializer, useSchemaInitializer } from '@nocobase/client'; + +class PluginHome extends Plugin { + async load() { + this.router.add('home', { + path: '/', + Component: 'HomePage', + }); + const myInitializer = new SchemaInitializer({ + name: 'myInitializer', + title: 'Add block', + items: [ + { + name: 'helloBlock', + type: 'item', + useComponentProps() { + const { insert } = useSchemaInitializer(); + return { + title: 'Hello', + onClick: () => { + insert({ + type: 'void', + 'x-decorator': 'CardItem', + 'x-component': 'h1', + 'x-content': 'Hello, world!', + }); + }, + }; + }, + }, + ], + }); + this.schemaInitializerManager.add(myInitializer); + } +} + +export function createApp(options: any = {}) { + const { plugins = [] } = options; + return new Application({ + router: { + type: 'memory', + initialEntries: ['/'], + }, + designable: true, + plugins: [PluginHome, ...plugins], + }); +} diff --git a/docs/ru-RU/development/client/ui-schema/demos/use-schema-initializer-render/index.tsx b/docs/ru-RU/development/client/ui-schema/demos/use-schema-initializer-render/index.tsx new file mode 100644 index 0000000000..6c57328f2f --- /dev/null +++ b/docs/ru-RU/development/client/ui-schema/demos/use-schema-initializer-render/index.tsx @@ -0,0 +1,50 @@ +import { useFieldSchema } from '@formily/react'; +import { + Plugin, + SchemaComponent, + useSchemaInitializerRender +} from '@nocobase/client'; +import React from 'react'; +import { createApp } from './app'; + +// 自定义 Hello 组件 +const Hello = (props) => { + return ( +
    + {props.children} + +
    + ) +} + +// 通过 useSchemaInitializerRender 来支持 x-initializer 的渲染 +const HelloInitializer = () => { + const fieldSchema = useFieldSchema(); + const { render } = useSchemaInitializerRender(fieldSchema['x-initializer']); + return render(); +} + +const HomePage = () => { + return ( + + ); +}; + +class PluginDemoUseSchemaInitializerRender extends Plugin { + async load() { + // 注册全局组件 + this.app.addComponents({ Hello, HomePage }); + } +} + +// 快捷模拟一个 App +const app = createApp({ plugins: [PluginDemoUseSchemaInitializerRender] }); + +export default app.getRootComponent(); diff --git a/docs/ru-RU/development/client/ui-schema/demos/use-schema-settings-render/app.tsx b/docs/ru-RU/development/client/ui-schema/demos/use-schema-settings-render/app.tsx new file mode 100644 index 0000000000..bc1b4d3953 --- /dev/null +++ b/docs/ru-RU/development/client/ui-schema/demos/use-schema-settings-render/app.tsx @@ -0,0 +1,41 @@ +import { Application, Plugin, SchemaSettings } from '@nocobase/client'; + +class PluginHome extends Plugin { + async load() { + this.router.add('home', { + path: '/', + Component: 'HomePage', + }); + const mySettings = new SchemaSettings({ + name: 'mySettings', + items: [ + { + type: 'item', + name: 'edit', + useComponentProps() { + // TODO: 补充相关设置逻辑 + return { + title: 'Edit', + onClick() { + // todo + }, + }; + }, + }, + ], + }); + this.schemaSettingsManager.add(mySettings); + } +} + +export function createApp(options: any = {}) { + const { plugins = [] } = options; + return new Application({ + router: { + type: 'memory', + initialEntries: ['/'], + }, + designable: true, + plugins: [PluginHome, ...plugins], + }); +} diff --git a/docs/ru-RU/development/client/ui-schema/demos/use-schema-settings-render/index.tsx b/docs/ru-RU/development/client/ui-schema/demos/use-schema-settings-render/index.tsx new file mode 100644 index 0000000000..ec45e64219 --- /dev/null +++ b/docs/ru-RU/development/client/ui-schema/demos/use-schema-settings-render/index.tsx @@ -0,0 +1,57 @@ +import { useFieldSchema } from '@formily/react'; +import { + Plugin, + SchemaComponent, + useSchemaSettingsRender +} from '@nocobase/client'; +import { Space } from 'antd'; +import React from 'react'; +import { createApp } from './app'; + +// 自定义 Hello 组件 +const Hello = (props) => { + return ( + + {props.children} + + + ); +}; + +// 通过 useSchemaSettingsRender 来支持 x-settings 的渲染 +const HelloSettings = () => { + const fieldSchema = useFieldSchema(); + const { render } = useSchemaSettingsRender(fieldSchema['x-settings']); + return render(); +}; + +const HomePage = () => { + return ( + + ); +}; + +class PluginDemoUseSchemaInitializerRender extends Plugin { + async load() { + // 注册全局组件 + this.app.addComponents({ Hello, HomePage }); + } +} + +// 快捷模拟一个 App +const app = createApp({ plugins: [PluginDemoUseSchemaInitializerRender] }); + +export default app.getRootComponent(); diff --git a/docs/ru-RU/development/client/ui-schema/designable.md b/docs/ru-RU/development/client/ui-schema/designable.md new file mode 100644 index 0000000000..57a72b419b --- /dev/null +++ b/docs/ru-RU/development/client/ui-schema/designable.md @@ -0,0 +1,603 @@ +# Проектирование + +NocoBase предоставляет возможности проектирования для schema через метод `createDesignable()`. + +```ts +import React from 'react'; +import { Schema } from '@formily/json-schema'; +import { createDesignable } from '@nocobase/client'; + +// Создание примера schema +const current = new Schema({ + name: 'root', + type: 'void', + 'x-component': 'Page', +}); + +// Создание designable для текущей schema +const dn = createDesignable({ + current, +}); + +// Добавление узла hello внутри узла schema +dn.insertAfterBegin({ + name: 'hello', + type: 'void', + 'x-component': 'Hello', +}); + +console.log(current.toJSON()); +{ + "name": "root", + "type": "void", + "x-component": "Page", + "properties": { + "hello": { + "type": "void", + "name": "hello", + "x-component": "Hello", + "x-index": 0 + } + } +} +``` + +В компоненте schema можно напрямую использовать `useDesignable()` для работы с текущим узлом schema. + +```javascript +import React from 'react'; +import { Button } from 'antd'; +import { + SchemaComponent, + SchemaComponentProvider, + useDesignable, +} from '@nocobase.client'; + +const Hello = () =>

    Привет, мир!

    ; + +const Page = (props) => { + const dn = useDesignable(); + return ( +
    + + {props.children} +
    + ); +}; + +const schema = { + type: 'void', + name: 'page', + 'x-component': 'Page', +}; + +export default () => { + return ( + + + + ); +}; +``` + +## createDesignable vs useDesignable + +- `createDesignable` требует параметр `current`, тогда как `useDesignable` используется напрямую на текущем узле без необходимости указания `current`. +- `createDesignable` можно использовать в событиях, тогда как `useDesignable` — это метод React-хук, который должен быть выполнен первым. +- `current` в `createDesignable` может быть любой schema, тогда как `useDesignable` работает только с текущей schema. + +Случаи использования: + +- Если очевидно, что операция выполняется на текущем узле, удобнее использовать `useDesignable`. +- Если операция выполняется не на текущем узле, более подходящим будет `createDesignable`. +- Если операция вызывается событием, например, перетаскиванием, более подходящим является `createDesignable`. + +## Возможности проектирования designable + +Возможности проектирования, предоставляемые designable для schema, заключаются в: + +- Добавление: Вставка в соседнюю позицию текущего узла. +- Поиск: Поиск дочерних узлов. +- Изменение: Изменение параметров schema через патч. +- Удаление: Удаление текущего узла или определённого дочернего узла. +- Перемещение: Перемещение между узлами. + +### Добавление: Вставка в соседнюю позицию текущего узла + +Аналогично концепции [insert adjacent](https://dom.spec.whatwg.org/#insert-adjacent) в DOM, schema также предоставляет метод `insertAdjacent()` для решения задач вставки в соседние позиции. + +Четыре соседние позиции: + +```html + +
    + +

    + + ... + +

    + +
    +``` + +Schema записывается следующим образом: + +```ts +{ + type: 'void', + 'x-component': 'div', + properties: { + // beforeBegin Вставка перед текущим узлом + node1: { + type: 'void', + 'x-component': 'p', + properties: { + // afterBegin Вставка перед первым дочерним узлом текущего узла + // ... + // beforeEnd Вставка после последнего дочернего узла текущего узла + }, + }, + // afterEnd Вставка после текущего узла + }, +} +``` + +Использование `useDesignable()` для вставки в соседнюю позицию текущей schema. + +```tsx +import React from 'react'; +import { + SchemaComponentProvider, + SchemaComponent, + useDesignable, +} from '@nocobase/client'; +import { observer, Schema, useFieldSchema } from '@formily/react'; +import { Button, Space } from 'antd'; +import { uid } from '@formily/shared'; + +const Hello = (props) => { + const { insertAdjacent } = useDesignable(); + const fieldSchema = useFieldSchema(); + return ( +
    +

    + {fieldSchema.title} - {fieldSchema.name} +

    + + + + + + +
    {props.children}
    +
    + ); +}; + +const Page = (props) => { + return
    {props.children}
    ; +}; + +export default () => { + return ( + + + + ); +}; +``` + +Использование `createDesignable()` для вставки в соседнюю позицию указанной schema .. + +```tsx +import React from 'react'; +import { + SchemaComponentProvider, + SchemaComponent, + createDesignable, + useSchemaComponentContext, +} from '@nocobase/client'; +import { observer, Schema, useFieldSchema } from '@formily/react'; +import { Button } from 'antd'; +import { uid } from '@formily/shared'; + +const Hello = (props) => { + const fieldSchema = useFieldSchema(); + return ( +

    + {fieldSchema.title} - {fieldSchema.name} +

    + ); +}; + +const Page = (props) => { + const fieldSchema = useFieldSchema(); + const { refresh } = useSchemaComponentContext(); + + return ( +
    + + {props.children} +
    + ); +}; + +export default () => { + return ( + + + + ); +}; +``` + +### Поиск: Поиск дочерних узлов + +JSON-schema от Formily предоставляет `reduceProperties` для обхода и поиска узлов, но его использование слишком громоздкое. Поэтому Designable предоставляет более удобные методы `findProperties` и `findProperty` для поиска дочерних узлов. + +#### `findProperties` + +Поиск всех дочерних узлов, соответствующих условиям, и возвращение массива. + +```ts +interface FindOptions { + // Условия фильтрации + filter: any; + // Элементы, которые нужно пропустить при поиске + skipOn?: (s: Schema) => boolean; + // Прекращение поиска при нахождении определённого элемента + breakOn?: (s: Schema) => boolean; + // Рекурсивный поиск + recursive?: boolean; +} + +class Designable { + findProperties(options: FindOptions): Schema[]; +} +``` + +Пример поиска всех узлов, соответствующих условиям: + +```ts +const items = dn.findProperties({ + filter: { + 'x-component': 'Hello', + }, +}); +// [current.properties.hello1, current.properties.hello2] +console.log(items.map((s) => schema.toJSON())); +[ + { + name: 'hello1', + type: 'void', + 'x-component': 'Hello', + }, + { + name: 'hello2', + type: 'void', + 'x-component': 'Hello', + }, +]; +``` + +#### `findProperty` + +Поиск первого дочернего узла, соответствующего условиям. + +```ts +interface FindOptions { + // Условия фильтрации + filter: any; + // Элементы, которые нужно пропустить при поиске + skipOn?: (s: Schema) => boolean; + // Прекращение поиска при нахождении определённого элемента + breakOn?: (s: Schema) => boolean; + // Рекурсивный поиск + recursive?: boolean; +} + +class Designable { + findProperty(options: FindOptions): Schema | null; +} +``` + +Пример: + +```ts +const current = new Schema({ + name: 'root', + type: 'void', + 'x-component': 'Page', + properties: { + hello1: { + type: 'void', + 'x-component': 'Hello', + }, + hello2: { + type: 'void', + 'x-component': 'Hello', + } + } +}); + +const dn = createDesignable({ current }); + +const schema = dn.findProperty({ + filter: { + 'x-component': 'Hello', + }, +}); +// current.properties.hello1 +console.log(schema.toJSON()); +{ + name: 'hello1', + type: 'void', + 'x-component': 'Hello', +} +``` + +### Изменение: Изменение параметров schema + +```ts +const current = new Schema({ + name: 'root', + type: 'void', + 'x-component': 'Page', +}); + +const dn = createDesignable({ + current, +}); + +dn.deepMerge({ + 'x-component-props': {}, +}); + +dn.shallowMerge({ + 'x-component-props': {}, +}); +``` + +### Удаление: Удаление текущего узла или определённого дочернего узла + +```ts +const current = new Schema({ + name: 'root', + type: 'void', + 'x-component': 'Page', +}); + +const dn = createDesignable({ + current, +}); + +dn.remove(); + +dn.remove({ + filter: (s) => boolean, + skipOn: (s) => boolean, + breakOn: (s) => boolean, + recursive: true, + removeParentsIfNoChildren: true, +}); +``` + +### Перемещение: Перемещение между узлами + +`insertAdjacent` и другие методы также могут использоваться для перемещения узлов с помощью перетаскивания. + +```javascript +import React from 'react'; +import { uid } from '@formily/shared'; +import { observer, useField, useFieldSchema } from '@formily/react'; +import { + DndContext, + DragEndEvent, + useDraggable, + useDroppable, +} from '@dnd-kit/core'; +import { + SchemaComponent, + SchemaComponentProvider, + createDesignable, + useSchemaComponentContext, +} from '@nocobase/client'; + +const useDragEnd = () => { + const { refresh } = useSchemaComponentContext(); + + return ({ active, over }: DragEndEvent) => { + const activeSchema = active?.data?.current?.schema; + const overSchema = over?.data?.current?.schema; + + if (!activeSchema || !overSchema) { + return; + } + + if (activeSchema === overSchema) { + return; + } + + const dn = createDesignable({ + current: overSchema, + }); + + dn.on('insertAdjacent', refresh); + dn.insertBeforeBeginOrAfterEnd(activeSchema); + }; +}; + +const Page = observer((props) => { + return {props.children}; +}); + +function Draggable(props) { + const { attributes, listeners, setNodeRef, transform } = useDraggable({ + id: props.id, + data: props.data, + }); + const style = transform + ? { + transform: `translate3d(${transform.x}px, ${transform.y}px, 0)`, + } + : undefined; + + return ( + + ); +} + +function Droppable(props) { + const { isOver, setNodeRef } = useDroppable({ + id: props.id, + data: props.data, + }); + const style = { + color: isOver ? 'green' : undefined, + }; + + return ( +
    + {props.children} +
    + ); +} + +const Block = observer((props) => { + const field = useField(); + const fieldSchema = useFieldSchema(); + return ( + +
    + Блок {fieldSchema.name}{' '} + + Перетащить + +
    +
    + ); +}); + +export default function App() { + return ( + + + + ); +} +``` diff --git a/docs/ru-RU/development/client/ui-schema/extending.md b/docs/ru-RU/development/client/ui-schema/extending.md new file mode 100644 index 0000000000..8fc2502c37 --- /dev/null +++ b/docs/ru-RU/development/client/ui-schema/extending.md @@ -0,0 +1,557 @@ +# Расширение компонентов Schema + +Помимо нативных HTML-тегов, разработчики могут адаптировать дополнительные пользовательские компоненты для обогащения библиотеки компонентов schema. + +Общие методы расширения компонентов включают: + +- [connect](https://react.formilyjs.org/api/shared/connect): Неинтрузивная интеграция с компонентами сторонних разработчиков, обычно используется для адаптации компонентов полей, часто применяется вместе с [mapProps](https://react.formilyjs.org/api/shared/map-props) и [mapReadPretty](https://react.formilyjs.org/api/shared/map-read-pretty). +- [observer](https://react.formilyjs.org/api/shared/observer): Используется, когда компонент внутренне использует наблюдаемые объекты, и вы хотите, чтобы компонент реагировал на изменения этих объектов. + +## Простое расширение + +Прямое регистрирование существующего React-компонента. + +```tsx +/** + * defaultShowCode: true + */ +import React from 'react'; +import { SchemaComponent, SchemaComponentProvider } from '@nocobase/client'; + +const Hello = () =>

    Привет, мир!

    ; + +const schema = { + type: 'void', + name: 'hello', + 'x-component': 'Hello', +}; + +export default () => { + return ( + + + + ); +}; +``` + +## Интеграция сторонних компонентов с Connect + +```tsx +/** + * defaultShowCode: true + */ +import React from 'react'; +import { Input } from 'antd'; +import { connect, mapProps, mapReadPretty } from '@formily/react'; +import { SchemaComponent, SchemaComponentProvider } from '@nocobase/client'; + +const ReadPretty = (props) => { + return
    {props.value}
    ; +}; + +const SingleText = connect( + Input, + mapProps((props, field) => { + return { + ...props, + suffix: 'Суффикс', + }; + }), + mapReadPretty(ReadPretty), +); + +const schema = { + type: 'object', + properties: { + t1: { + type: 'string', + default: 'привет t1', + 'x-component': 'SingleText', + }, + t2: { + type: 'string', + default: 'привет t2', + 'x-component': 'SingleText', + 'x-pattern': 'readPretty', + }, + }, +}; + +export default () => { + return ( + + + + ); +}; +``` + +## Использование Observer для реакции на изменения данных + +```tsx +/** + * defaultShowCode: true + */ +import React from 'react'; +import { Input } from 'antd'; +import { connect, observer, useForm } from '@formily/react'; +import { SchemaComponent, SchemaComponentProvider } from '@nocobase/client'; + +const SingleText = connect(Input); + +const UsedObserver = observer( + (props) => { + const form = useForm(); + return
    UsedObserver: {form.values.t1}
    ; + }, + { displayName: 'UsedObserver' }, +); + +const NotUsedObserver = (props) => { + const form = useForm(); + return
    NotUsedObserver: {form.values.t1}
    ; +}; + +const schema = { + type: 'object', + properties: { + t1: { + type: 'string', + 'x-component': 'SingleText', + }, + t2: { + type: 'string', + 'x-component': 'UsedObserver', + }, + t3: { + type: 'string', + 'x-component': 'NotUsedObserver', + }, + }, +}; + +const components = { + SingleText, + UsedObserver, + NotUsedObserver, +}; + +export default () => { + return ( + + + + ); +}; +``` + +## Вложенные Schema + +- Вложение через `props.children` подходит для свойств типа `void` и `object`. Примеры см. в [Вложение schema типа void и object](#nesting-void-and-object-type-schema). +- `` для пользовательского вложения, подходит для всех типов. Примеры см. в [Вложение schema типа array](#nesting-array-type-schema). + +Примечание: + +- Свойства, кроме типов `void` и `object`, нельзя напрямую рендерить через `props.children`, но можно использовать `` для решения проблемы вложения. +- Только schema типов `void` и `object` могут использоваться с `onlyRenderProperties`. + +```tsx | pure + +``` + +### Вложение schema типа void и object + +Узлы properties можно адаптировать напрямую через `props.children`. + +```tsx +/** + * defaultShowCode: true + */ +import React from 'react'; +import { SchemaComponent, SchemaComponentProvider } from '@nocobase/client'; + +// Компонент Hello адаптирует children, позволяя вложение properties. +const Hello = (props) =>

    Привет, {props.children}!

    ; +const World = () => мир; + +const schema = { + type: 'object', + name: 'hello', + 'x-component': 'Hello', + properties: { + world: { + type: 'string', + 'x-component': 'World', + }, + }, +}; + +export default () => { + return ( + + + + ); +}; +``` + +Сравнение результатов рендеринга для различных типов свойств: + +```tsx +import React from 'react'; +import { SchemaComponent, SchemaComponentProvider } from '@nocobase/client'; + +const Hello = (props) =>

    Привет, {props.children}!

    ; +const World = () => мир; + +const schema = { + type: 'object', + properties: { + title1: { + type: 'void', + 'x-content': 'Schema типа void, рендеринг properties', + }, + void: { + type: 'void', + name: 'hello', + 'x-component': 'Hello', + properties: { + world: { + type: 'void', + 'x-component': 'World', + }, + }, + }, + title2: { + type: 'void', + 'x-content': 'Schema типа object, рендеринг properties', + }, + object: { + type: 'object', + name: 'hello', + 'x-component': 'Hello', + properties: { + world: { + type: 'string', + 'x-component': 'World', + }, + }, + }, + title3: { + type: 'void', + 'x-content': 'Schema типа array, не рендерит properties', + }, + array: { + type: 'array', + name: 'hello', + 'x-component': 'Hello', + properties: { + world: { + type: 'string', + 'x-component': 'World', + }, + }, + }, + title4: { + type: 'void', + 'x-content': 'Schema типа string, не рендерит properties', + }, + string: { + type: 'string', + name: 'hello', + 'x-component': 'Hello', + properties: { + world: { + type: 'string', + 'x-component': 'World', + }, + }, + }, + }, +}; + +export default () => { + return ( + + + + ); +}; +``` + +### Вложение schema типа array + +Можно использовать `` для решения проблем с пользовательским вложением. + +#### Когда элементы массива — string или number + +```tsx +import React from 'react'; +import { + useFieldSchema, + Schema, + RecursionField, + useField, + observer, + connect, +} from '@formily/react'; +import { SchemaComponent, SchemaComponentProvider } from '@nocobase/client'; + +const useValueSchema = () => { + const schema = useFieldSchema(); + return schema.reduceProperties((buf, s) => { + if (s['x-component'] === 'Value') { + return s; + } + return buf; + }); +}; + +const ArrayList = observer( + (props) => { + const field = useField(); + const schema = useValueSchema(); + return ( + <> + Массив строк +
      + {field.value?.map((item, index) => { + // Только один элемент + return ; + })} +
    + + ); + }, + { displayName: 'ArrayList' }, +); + +const Value = connect((props) => { + return
  • значение: {props.value}
  • ; +}); + +const schema = { + type: 'object', + properties: { + strArr: { + type: 'array', + default: [1, 2, 3], + 'x-component': 'ArrayList', + properties: { + value: { + type: 'number', + 'x-component': 'Value', + }, + }, + }, + }, +}; + +export default () => { + return ( + + + + ); +}; +``` + +#### Когда элементы массива — объекты + +```tsx +import React from 'react'; +import { + useFieldSchema, + Schema, + RecursionField, + useField, + observer, + connect, +} from '@formily/react'; +import { SchemaComponent, SchemaComponentProvider } from '@nocobase/client'; + +const ArrayList = observer( + (props) => { + const field = useField(); + const schema = useFieldSchema(); + // Преобразование schema массива в schema объекта, так как schema типа array не может использовать onlyRenderProperties + const objSchema = new Schema({ + type: 'object', + properties: schema.properties, + }); + return ( +
      + {field.value?.map((item, index) => { + // Элемент массива — объект + return ( + + ); + })} +
    + ); + }, + { displayName: 'ArrayList' }, +); + +const Value = connect((props) => { + return
  • значение: {props.value}
  • ; +}); + +const schema = { + type: 'object', + properties: { + objArr: { + type: 'array', + default: [{ value: 't1' }, { value: 't2' }, { value: 't3' }], + 'x-component': 'ArrayList', + properties: { + value: { + type: 'number', + 'x-component': 'Value', + }, + }, + }, + }, +}; + +export default () => { + return ( + + + + ); +}; +``` + +#### Данные древовидной структуры + +```tsx +import { ArrayField } from '@formily/core'; +import { + connect, + ISchema, + observer, + RecursionField, + useField, + useFieldSchema, +} from '@formily/react'; +import { SchemaComponent, SchemaComponentProvider } from '@nocobase/client'; +import { Table, TableColumnType } from 'antd'; +import React from 'react'; + +const ArrayTable = observer( + (props: any) => { + const { rowKey } = props; + const field = useField(); + const schema = useFieldSchema(); + const columnSchemas = schema.reduceProperties((buf, s) => { + if (s['x-component'] === 'ArrayTable.Column') { + buf.push(s); + } + return buf; + }, []); + + const columns = columnSchemas.map((s) => { + return { + render: (value, record) => { + return ( + + ); + }, + } as TableColumnType; + }); + + return ; + }, + { displayName: 'ArrayTable' }, +); + +const Value = connect((props) => { + return
  • значение: {props.value}
  • ; +}); + +const schema: ISchema = { + type: 'object', + properties: { + objArr: { + type: 'array', + default: [ + { __path: '0', id: 1, value: 't1' }, + { + __path: '1', + id: 2, + value: 't2', + children: [ + { + __path: '1.children.0', + id: 5, + value: 't5', + parentId: 2, + }, + ], + }, + { + __path: '2', + id: 3, + value: 't3', + children: [ + { + __path: '2.children.0', + id: 4, + value: 't4', + parentId: 3, + children: [ + { + __path: '2.children.0.children.0', + id: 6, + value: 't6', + parentId: 4, + }, + { + __path: '2.children.0.children.1', + id: 7, + value: 't7', + parentId: 4, + }, + ], + }, + ], + }, + ], + 'x-component': 'ArrayTable', + 'x-component-props': { + rowKey: 'id', + }, + properties: { + c1: { + type: 'void', + 'x-component': 'ArrayTable.Column', + properties: { + value: { + type: 'string', + 'x-component': 'Value', + }, + }, + }, + }, + }, + }, +}; + +export default () => { + return ( + + + + ); +}; +``` diff --git a/docs/ru-RU/development/client/ui-schema/image-1.png b/docs/ru-RU/development/client/ui-schema/image-1.png new file mode 100644 index 0000000000..aa9ed4093b Binary files /dev/null and b/docs/ru-RU/development/client/ui-schema/image-1.png differ diff --git a/docs/ru-RU/development/client/ui-schema/image-2.png b/docs/ru-RU/development/client/ui-schema/image-2.png new file mode 100644 index 0000000000..9ebd5b3055 Binary files /dev/null and b/docs/ru-RU/development/client/ui-schema/image-2.png differ diff --git a/docs/ru-RU/development/client/ui-schema/image-3.png b/docs/ru-RU/development/client/ui-schema/image-3.png new file mode 100644 index 0000000000..0101b5e482 Binary files /dev/null and b/docs/ru-RU/development/client/ui-schema/image-3.png differ diff --git a/docs/ru-RU/development/client/ui-schema/image-4.png b/docs/ru-RU/development/client/ui-schema/image-4.png new file mode 100644 index 0000000000..40df1c17cc Binary files /dev/null and b/docs/ru-RU/development/client/ui-schema/image-4.png differ diff --git a/docs/ru-RU/development/client/ui-schema/image-5.png b/docs/ru-RU/development/client/ui-schema/image-5.png new file mode 100644 index 0000000000..3e6003a3ff Binary files /dev/null and b/docs/ru-RU/development/client/ui-schema/image-5.png differ diff --git a/docs/ru-RU/development/client/ui-schema/image.png b/docs/ru-RU/development/client/ui-schema/image.png new file mode 100644 index 0000000000..0ff383b8a8 Binary files /dev/null and b/docs/ru-RU/development/client/ui-schema/image.png differ diff --git a/docs/ru-RU/development/client/ui-schema/initializer.md b/docs/ru-RU/development/client/ui-schema/initializer.md new file mode 100644 index 0000000000..fc2c589df9 --- /dev/null +++ b/docs/ru-RU/development/client/ui-schema/initializer.md @@ -0,0 +1,120 @@ +# Schema Initializer + +После активации конфигурации пользовательского интерфейса различные видимые оранжевые кнопки на интерфейсе представляют собой schema initializers, используемые для добавления различных блоков, полей, действий и т.д. в интерфейс. + + + +## Встроенные initializers + + + +## Добавление элементов в существующие initializers + +Рекомендуется использовать метод [`schemaInitializerManager.addItem()`](#) для добавления элементов. Для подробной конфигурации элементов обратитесь к [SchemaInitializer Item API](#). + +```ts +class PluginDemoAddSchemaInitializerItem extends Plugin { + async load() { + this.schemaInitializerManager.addItem( + 'myInitializer', // Пример существующего schema initializer + 'otherBlocks.custom', // Добавление custom в группу otherBlocks + { + type: 'item', + useComponentProps() {}, + }, + ); + } +} +``` + + + +## Добавление новых initializers + +Для подробных параметров SchemaInitializer обратитесь к [SchemaInitializerOptions API](https://client.docs-cn.nocobase.com/core/ui-schema/schema-initializer#new-schemainitializeroptions). + +```ts +const myInitializer = new SchemaInitializer({ + // Уникальный идентификатор для initializer + name: 'myInitializer', + title: 'Добавить блок', + // Обёртка, например, вставка в Grid требует использования Grid.wrap (добавляет теги строки и столбца) + wrap: Grid.wrap, + // Позиция вставки, по умолчанию beforeEnd, поддерживает 'beforeBegin' | 'afterBegin' | 'beforeEnd' | 'afterEnd' + insertPosition: 'beforeEnd', + // Элементы выпадающего меню + items: [ + { + name: 'a', + type: 'item', + useComponentProps() {}, + }, + ], +}); +``` + +### Регистрация в методе load плагина + +Рекомендуется использовать `schemaInitializerManager.add()` для добавления нового initializer в приложение. + +```ts +class PluginDemoAddSchemaInitializer extends Plugin { + async load() { + const myInitializer = new SchemaInitializer({ + name: 'myInitializer', + title: 'Добавить блок', + wrap: Grid.wrap, + items: [ + { + name: 'helloBlock', + type: 'item', + useComponentProps() { + const { insert } = useSchemaInitializer(); + return { + title: 'Привет', + onClick: () => { + insert({ + type: 'void', + 'x-decorator': 'CardItem', + 'x-component': 'h1', + 'x-content': 'Привет, мир!', + }); + }, + }; + }, + }, + ], + }); + this.schemaInitializerManager.add(myInitializer); + } +} +``` + +### Как использовать добавленный initializer + +SchemaInitializer используется в параметре `x-initializer` schema. + +#### Компоненты schema, поддерживающие `x-initializer` + +Общие компоненты schema, поддерживающие `x-initializer`, включают Grid, ActionBar, Tabs. Например: + +```ts +{ + type: 'void', + 'x-component': 'Grid', + 'x-initializer': 'myInitializer', +} +``` + + + +#### Как поддерживать `x-initializer` в пользовательских компонентах + +Если Grid, ActionBar, Tabs и подобные компоненты не удовлетворяют вашим потребностям, вы можете использовать [useSchemaInitializerRender()](https://client.docs-cn.nocobase.com/core/ui-schema/schema-initializer#useschemainitializerrender) для обработки рендеринга `x-initializer` в пользовательских компонентах. + + + +## Справочник API + +- [SchemaInitializerManager](https://client.docs-cn.nocobase.com/core/ui-schema/schema-initializer-manager) +- [SchemaInitializer](https://client.docs-cn.nocobase.com/core/ui-schema/schema-initializer) diff --git a/docs/ru-RU/development/client/ui-schema/quick-start.md b/docs/ru-RU/development/client/ui-schema/quick-start.md new file mode 100644 index 0000000000..64f5560e56 --- /dev/null +++ b/docs/ru-RU/development/client/ui-schema/quick-start.md @@ -0,0 +1,37 @@ +### **Быстрый старт** + +#### **1. Создание компонента схемы (Schema Component)** + +Отображение зарегистрированных компонентов путём настройки параметра `x-component`. + +Основные понятия: + +- [Протокол UI Schema](/development/client/ui-schema/what-is-ui-schema) +- [Отрисовка схемы](/development/client/ui-schema/rendering) +- [Расширение компонентов схемы](/development/client/ui-schema/extending) + + + +#### **2. Добавление компонента Schema на страницу** + +Вставка новых компонентов рядом с существующими Schema путём настройки параметра `x-initializer`. + +Основные понятия: + +- [Конструктор Designable](/development/client/ui-schema/designable) +- [Протокол UI Schema — параметр x-initializer](/development/client/ui-schema/what-is-ui-schema#x-initializer) +- [SchemaInitializer](/development/client/ui-schema/initializer) + + + +#### **3. Добавление панели настройки ** + +Предоставление конфигуратора параметров для компонентов Schema путём настройки параметра `x-settings`. Панель конструктора по умолчанию поддерживает перетаскивание. + +Основные понятия: + +- [Протокол UI Schema — параметр x-settings](/development/client/ui-schema/what-is-ui-schema#x-settings) +- [SchemaSettings](/development/client/ui-schema/settings) +- [Перемещение существующих узлов схемы](/development/client/ui-schema/designable#move-between-nodes) + + diff --git a/docs/ru-RU/development/client/ui-schema/rendering.md b/docs/ru-RU/development/client/ui-schema/rendering.md new file mode 100644 index 0000000000..079ee62d29 --- /dev/null +++ b/docs/ru-RU/development/client/ui-schema/rendering.md @@ -0,0 +1,166 @@ +# Schema Визуализация + +## Основные компоненты + +Рендеринг schema включает несколько основных компонентов: + +- `` предоставляет контекст, необходимый для рендеринга schema. +- `` расширяет компоненты и области видимости, необязательный. +- `` выполняет рендеринг schema, должен использоваться внутри ``. + +Базовое использование выглядит следующим образом: + +```tsx +import React from 'react'; +import { SchemaComponent, SchemaComponentProvider } from '@nocobase/client'; + +const Hello = () =>

    Привет, мир!

    ; + +const schema = { + type: 'void', + name: 'hello', + 'x-component': 'Hello', +}; + +export default () => { + return ( + + + + ); +}; +``` + +Для подробной информации об API обратитесь к [SchemaComponent](https://client.docs.nocobase.com/core/ui-schema/schema-component). + +## Что такое Scope? + +Scope относится к переменным или функциям, доступным в schema. Например, функция `t()` в следующем примере должна быть зарегистрирована в scope для корректного рендеринга заголовка. + +```tsx | pure + +``` + +## Регистрация компонентов и Scopes + +Компоненты и scopes можно зарегистрировать с помощью SchemaComponentProvider, SchemaComponentOptions и SchemaComponent. Различия заключаются в следующем: + +- SchemaComponentProvider предоставляет контекст верхнего уровня. +- SchemaComponentOptions используется для замены и расширения локального контекста. +- SchemaComponent предоставляет контекст текущей schema. + +Например: + +```tsx | pure + + + + + + + + +``` + +- schema1 может использовать ComponentA и ComponentB +- schema2 может использовать ComponentA и ComponentC +- schema3 может использовать ComponentA, ComponentD и ComponentE +- schema4 может использовать ComponentA, ComponentD и ComponentF + +## Использование в приложении + +Приложение в клиенте NocoBase имеет встроенные компоненты SchemaComponentProvider в своих провайдерах. + +```ts +class Application { + // Провайдеры по умолчанию + addDefaultProviders() { + this.addProvider(SchemaComponentProvider, { + scopes: this.scopes, + components: this.components, + }); + } +} +``` + +Итоговая структура компонента рендеринга выглядит следующим образом: + +```tsx | pure + + {/* Провайдер контекста для маршрутизации */} + + {/* Пользовательские компоненты Provider - начальный тег */} + + {/* Пользовательские компоненты Provider - конечный тег */} + + +``` + +При использовании в приложении нет необходимости оборачивать в SchemaComponentProvider; можно напрямую использовать SchemaComponent. + +```tsx +import { + Application, + Plugin, + SchemaComponent, + SchemaComponentProvider, +} from '@nocobase/client'; +import React from 'react'; + +const Hello = () =>

    Привет, мир!

    ; + +const HelloPage = () => { + return ( + + ); +}; + +class PluginHello extends Plugin { + async load() { + this.app.addProvider(SchemaComponentProvider, { + components: this.app.components, + scopes: this.app.scopes, + }); + this.app.addComponents({ Hello }); + this.router.add('hello', { + path: '/', + Component: HelloPage, + }); + } +} + +const app = new Application({ + router: { + type: 'memory', + }, + plugins: [PluginHello], +}); + +export default app.getRootComponent(); +``` + +В методах жизненного цикла приложения можно использовать `app.addComponents()` и `app.addScopes()` для расширения глобальных компонентов и scopes. + +```ts +class PluginHello extends Plugin { + async load() { + this.app.addComponents({ + // Расширенные компоненты + }); + this.app.addScopes({ + // Расширенный scope + }); + } +} +``` diff --git a/docs/ru-RU/development/client/ui-schema/settings.md b/docs/ru-RU/development/client/ui-schema/settings.md new file mode 100644 index 0000000000..4141d73193 --- /dev/null +++ b/docs/ru-RU/development/client/ui-schema/settings.md @@ -0,0 +1,136 @@ +# Настройки Schema + +После активации конфигурации пользовательского интерфейса при наведении мыши на определённый блок, поле или действие отображается соответствующая панель инструментов Schema. Кнопка настроек на панели инструментов является компонентом настроек для текущей Schema. + +![Alt text](https://static-docs.nocobase.com/3f37519ddd9ba1a99f1fdbfe32b4a454.png) + +## Встроенные настройки + + + +## Добавление элементов настроек к существующим настройкам + +Рекомендуется использовать метод `schemaSettingsManager.addItem()` для добавления элементов настроек. Для подробной конфигурации элементов обратитесь к [API элементов SchemaSettings](#). + +```ts +class PluginDemoAddSchemaSettingsItem extends Plugin { + async load() { + this.schemaSettingsManager.addItem( + 'mySettings', // Пример существующих настроек Schema + 'customItem', + { + type: 'item', + useComponentProps() {}, + }, + ); + } +} +``` + + + +## Добавление новых настроек + +Для подробных параметров SchemaSettings обратитесь к [API SchemaSettingsOptions](https://client.docs-cn.nocobase.com/core/ui-schema/schema-settings#new-schemasettingsoptions). + +```ts +const mySettings = new SchemaSettings({ + // Должен быть уникальным идентификатором + name: 'mySettings', + // Элементы выпадающего меню + items: [ + { + name: 'edit', + type: 'item', + useComponentProps() {}, + }, + ], +}); +``` + +### Добавление в методе load плагина + +Рекомендуется использовать `schemaSettingsManager.add()` для добавления новых настроек в приложение. + +```ts +class PluginDemoAddSchemaSettings extends Plugin { + async load() { + // Регистрация глобальных компонентов + this.app.addComponents({ CardItem, HomePage }); + const mySettings = new SchemaSettings({ + name: 'mySettings', + items: [ + { + type: 'item', + name: 'edit', + useComponentProps() { + // TODO: Добавить логику настроек + return { + title: 'Редактировать', + onClick() { + // todo + }, + }; + }, + }, + ], + }); + this.schemaSettingsManager.add(mySettings); + } +} +``` + +### Как использовать добавленные настройки + +Добавленные SchemaSettings можно использовать в параметре `x-settings` Schema. Не все компоненты поддерживают `x-settings`; обычно он используется в сочетании с обёрточными компонентами, такими как BlockItem, FormItem, CardItem. В пользовательских компонентах также можно использовать `useSchemaSettingsRender()` для независимой обработки рендеринга `x-settings`. + +#### Компоненты Schema, поддерживающие `x-settings` + +В большинстве случаев `x-settings` необходимо использовать в сочетании с обёрточными компонентами, такими как BlockItem, FormItem, CardItem. Например: + +```ts +{ + type: 'void', + 'x-settings': 'mySettings', + 'x-decorator': 'CardItem', + 'x-component': 'Hello', +} +``` + + + +#### Как поддерживать `x-settings` в пользовательских компонентах + +Если обёрточные компоненты, такие как BlockItem, FormItem, CardItem, не удовлетворяют вашим потребностям, вы можете использовать `useSchemaSettingsRender()` для обработки рендеринга `x-settings`. + + + +В большинстве случаев настройки размещаются на SchemaToolbar, поэтому поддержка `x-toolbar` для пользовательских компонентов также может косвенно поддерживать `x-settings`. Для получения дополнительных сведений об использовании обратитесь к [Панель инструментов Schema](/development/client/ui-schema/toolbar). + + + +## Как реализовать настройки Schema? + +Используйте `useSchemaSettings()` для получения `Designable` текущей Schema и управляйте ей через `Designable`. Общие API включают: + +- `dn.insertAdjacent()` +- `dn.getSchemaAttribute()` +- `dn.shallowMerge()` +- `dn.deepMerge()` +- `dn.findOne()` +- `dn.find()` +- `dn.remove()` +- `dn.remove()` + +Для получения дополнительных сведений обратитесь к: + +- [Дизайнер Designable](/development/client/ui-schema/designable) +- [API Designable](https://client.docs-cn.nocobase.com/core/ui-schema/designable) + + + +## Справочник API + +- [SchemaSettingsManager](https://client.docs-cn.nocobase.com/core/ui-schema/schema-settings-manager) +- [SchemaSettings](https://client.docs-cn.nocobase.com/core/ui-schema/schema-settings) +- [Designable](https://client.docs-cn.nocobase.com/core/ui-schema/designable) diff --git a/docs/ru-RU/development/client/ui-schema/static/DFYhbY9Tpo5hX6x4Y3EckLV7nqc.png b/docs/ru-RU/development/client/ui-schema/static/DFYhbY9Tpo5hX6x4Y3EckLV7nqc.png new file mode 100644 index 0000000000..d497c1cd14 Binary files /dev/null and b/docs/ru-RU/development/client/ui-schema/static/DFYhbY9Tpo5hX6x4Y3EckLV7nqc.png differ diff --git a/docs/ru-RU/development/client/ui-schema/static/LUChb8kzqoh3zsxVC4FcEP3Snqd.png b/docs/ru-RU/development/client/ui-schema/static/LUChb8kzqoh3zsxVC4FcEP3Snqd.png new file mode 100644 index 0000000000..4117520fdf Binary files /dev/null and b/docs/ru-RU/development/client/ui-schema/static/LUChb8kzqoh3zsxVC4FcEP3Snqd.png differ diff --git a/docs/ru-RU/development/client/ui-schema/static/MLUnbpVfFotjr1x0ZMacUzG4nlb.png b/docs/ru-RU/development/client/ui-schema/static/MLUnbpVfFotjr1x0ZMacUzG4nlb.png new file mode 100644 index 0000000000..a2fd3b4404 Binary files /dev/null and b/docs/ru-RU/development/client/ui-schema/static/MLUnbpVfFotjr1x0ZMacUzG4nlb.png differ diff --git a/docs/ru-RU/development/client/ui-schema/static/RruTbxqYuoThnAxXUkZc6Uz9n8f.png b/docs/ru-RU/development/client/ui-schema/static/RruTbxqYuoThnAxXUkZc6Uz9n8f.png new file mode 100644 index 0000000000..a2b9796d2f Binary files /dev/null and b/docs/ru-RU/development/client/ui-schema/static/RruTbxqYuoThnAxXUkZc6Uz9n8f.png differ diff --git a/docs/ru-RU/development/client/ui-schema/static/VclIboKU9oukbpx3mpucfY9unQJ.png b/docs/ru-RU/development/client/ui-schema/static/VclIboKU9oukbpx3mpucfY9unQJ.png new file mode 100644 index 0000000000..2ecb12d7bd Binary files /dev/null and b/docs/ru-RU/development/client/ui-schema/static/VclIboKU9oukbpx3mpucfY9unQJ.png differ diff --git a/docs/ru-RU/development/client/ui-schema/static/WKbEbtLkYoDKU8xBlDBcxgMSnyf.png b/docs/ru-RU/development/client/ui-schema/static/WKbEbtLkYoDKU8xBlDBcxgMSnyf.png new file mode 100644 index 0000000000..d483c02ebf Binary files /dev/null and b/docs/ru-RU/development/client/ui-schema/static/WKbEbtLkYoDKU8xBlDBcxgMSnyf.png differ diff --git a/docs/ru-RU/development/client/ui-schema/static/WYuQbeZVioqB84xumakctLMGnkg.png b/docs/ru-RU/development/client/ui-schema/static/WYuQbeZVioqB84xumakctLMGnkg.png new file mode 100644 index 0000000000..fcca6f4178 Binary files /dev/null and b/docs/ru-RU/development/client/ui-schema/static/WYuQbeZVioqB84xumakctLMGnkg.png differ diff --git a/docs/ru-RU/development/client/ui-schema/static/Zqm5bBLh9o2M5BxDrWtcowE1nzb.png b/docs/ru-RU/development/client/ui-schema/static/Zqm5bBLh9o2M5BxDrWtcowE1nzb.png new file mode 100644 index 0000000000..88082d2a9e Binary files /dev/null and b/docs/ru-RU/development/client/ui-schema/static/Zqm5bBLh9o2M5BxDrWtcowE1nzb.png differ diff --git a/docs/ru-RU/development/client/ui-schema/toolbar.md b/docs/ru-RU/development/client/ui-schema/toolbar.md new file mode 100644 index 0000000000..e68ff34368 --- /dev/null +++ b/docs/ru-RU/development/client/ui-schema/toolbar.md @@ -0,0 +1,61 @@ +# Панель инструментов Schema + +После активации конфигурации пользовательского интерфейса при наведении мыши на указанный блок, поле или действие появляется панель инструментов, соответствующая Schema. + +![Alt text](https://static-docs.nocobase.com/e6d327da8e85d6548529e1051d06c31a.png) + +Панель инструментов состоит из: + +- Заголовок, по умолчанию пустой +- Элемент управления перетаскиванием, обеспечивает возможность перетаскивания, по умолчанию включено +- Инициализатор, по умолчанию пустой +- Настройки, по умолчанию пустые + +```tsx | pure + +``` + +## Использование + +Компонент SchemaToolbar используется в `x-toolbar`, например: + +```ts +// Использование встроенного SchemaToolbar +{ + 'x-toolbar': 'SchemaToolbar', + 'x-toolbar-props': {}, +} +// Пользовательский SchemaToolbar +{ + 'x-toolbar': 'MySchemaToolbar', + 'x-toolbar-props': {}, +} +``` + +## Компоненты Schema, поддерживающие `x-toolbar` + +- `BlockItem` (обёрточный компонент, обычно используется в `x-decorator`) +- `CardItem` (обёрточный компонент, обычно используется в `x-decorator`) +- `FormItem` (обёрточный компонент, обычно используется в `x-decorator`) +- `Action` (компонент кнопки действия, используется в `x-component`) + +Если `x-component` или `x-decorator` Schema используют вышеуказанные компоненты и настроен `x-settings`, то `x-toolbar` можно опустить, и по умолчанию будет использоваться встроенный `SchemaToolbar`. + + + +Также можно настроить пользовательский компонент панели инструментов. + + + +При использовании в макете Grid Schema внутри строк и столбцов наследуют `x-initializer` от Grid. + + + +## Поддержка `x-toolbar` для пользовательских компонентов + + diff --git a/docs/ru-RU/development/client/ui-schema/what-is-ui-schema.md b/docs/ru-RU/development/client/ui-schema/what-is-ui-schema.md new file mode 100644 index 0000000000..e89189e3d3 --- /dev/null +++ b/docs/ru-RU/development/client/ui-schema/what-is-ui-schema.md @@ -0,0 +1,573 @@ +# UI Schema + +Протокол для описания компонентов фронтенда, основанный на Formily Schema 2.0, в стиле JSON Schema. + +```ts +interface ISchema { + type: 'void' | 'string' | 'number' | 'object' | 'array'; + name?: string; + title?: any; + // Компонент-обёртка + ['x-decorator']?: string; + // Свойства компонента-обёртки + ['x-decorator-props']?: any; + // Динамические свойства компонента-обёртки + ['x-use-decorator-props']?: any; + // Компонент + ['x-component']?: string; + // Свойства компонента + ['x-component-props']?: any; + // Динамические свойства компонента + ['x-use-component-props']?: any; + // Состояние отображения, по умолчанию 'visible' + ['x-display']?: 'none' | 'hidden' | 'visible'; + // Дочерние узлы компонента, простое использование + ['x-content']?: any; + // Schema дочерних узлов + properties?: Record; + + // Ниже используются только для компонентов полей + + // Реакции поля + ['x-reactions']?: SchemaReactions; + // Режим взаимодействия UI поля, по умолчанию 'editable' + ['x-pattern']?: 'editable' | 'disabled' | 'readPretty'; + // Валидация поля + ['x-validator']?: Validator; + // Данные по умолчанию + default?: any; + + // Для дизайнера + + // Инициализатор, определяет, что можно вставить рядом с текущей schema + ['x-initializer']?: string; + ['x-initializer-props']?: any; + + // Настройки блока, определяют, какие параметры можно настроить для текущей schema + ['x-settings']?: string; + ['x-settings-props']?: any; + + // Компонент панели инструментов + ['x-toolbar']?: string; + ['x-toolbar-props']?: any; +} +``` + +## Примеры + +### Простейший компонент + +Все нативные HTML-теги можно записать в виде schema. Например: + +```ts +{ + type: 'void', + 'x-component': 'h1', + 'x-content': 'Привет, мир!', +} +``` + +Пример JSX + +```tsx | pure +

    Привет, мир!

    +``` + +### Дочерние компоненты + +Дочерние компоненты записываются в properties + +```tsx | pure +{ + type: 'void', + 'x-component': 'div', + 'x-component-props': { className: 'form-item' }, + properties: { + title: { + type: 'string', + 'x-component': 'input', + }, + }, +} +``` + +Эквивалентный JSX + +```tsx | pure +
    + +
    +``` + +## Описание параметров + +### `type` + +Тип узла + +```ts +type SchemaTypes = + | 'string' + | 'object' + | 'array' + | 'number' + | 'boolean' + | 'void'; +interface ISchema { + type?: SchemaTypes; +} +``` + +### `name` + +Имя schema + +```ts +type SchemaName = string; +interface ISchema { + name?: SchemaName; // Корневой узел + properties?: { + [name: SchemaName]?: ISchema; // Дочерний узел + } +}; +``` + +Все schema имеют имя, а имена дочерних узлов также являются ключами properties + +```ts +{ + + +System: name: 'root', + properties: { + child1: { + // Здесь не нужно указывать имя + }, + }, +} +``` + +### `title` + +Заголовок узла + +```ts +type SchemaTitle = string; +interface ISchema { + title?: SchemaTitle; +} +``` + +### `properties` + +Дочерние компоненты можно записать в properties + +```ts +{ + type: 'void', + 'x-component': 'div', + 'x-component-props': { className: 'form-item' }, + properties: { + title: { + type: 'string', + 'x-component': 'input', + }, + }, +} +``` + +Эквивалентный JSX + +```tsx | pure +
    + +
    +``` + +### `x-component` + +Компонент + +```ts +type Component = any; +interface ISchema { + ['x-component']?: Component; +} +``` + +Все нативные HTML-теги можно записать в виде schema. Например: + +```ts +{ + type: 'void', + 'x-component': 'h1', + 'x-content': 'Привет, мир!', +} +``` + +Пример JSX + +```tsx | pure +

    Привет, мир!

    +``` + +### `x-component-props` и `x-use-component-props` + +`x-component-props` — это свойства компонента. + +```ts +{ + type: 'void', + 'x-component': 'Table', + 'x-component-props': { + loading: true, + }, +} +``` + +В некоторых случаях свойства компонента динамические, поэтому можно использовать `x-use-component-props`. + +```ts +{ + type: 'void', + 'x-component': 'MyTable', + 'x-use-component-props': 'useTableProps', +} +``` + +Компонент `MyTable` должен быть обёрнут функцией высшего порядка `withDynamicSchemaProps`. Например: + +```ts +const MyTable = withDynamicSchemaProps(Table, { displayName: 'MyTable' }); +``` + +`useTableProps` — это пользовательский хук для динамической генерации свойств компонента. + +```ts +const useTableProps = () => { + const service = useRequest({xx}); + return { + loading: service.loading, + }; +}; +``` + +Также необходимо зарегистрировать его в scope, см. документацию [Рендеринг schema](/development/client/ui-schema/rendering). + +```tsx | pure + +``` + +### `x-decorator` + +Компонент-обёртка + +```ts +type Decorator = any; +interface ISchema { + ['x-decorator']?: Decorator; +} +``` + +Комбинация `x-decorator` и `x-component` позволяет размещать два компонента в одном узле schema, уменьшая сложность структуры schema и повышая повторное использование компонентов. + +Например, в сценарии формы можно комбинировать компонент FormItem с любым компонентом поля, где FormItem выступает как Decorator. + +```ts +{ + type: 'void', + ['x-component']: 'div', + properties: { + title: { + type: 'string', + 'x-decorator': 'FormItem', + 'x-component': 'Input', + }, + content: { + type: 'string', + 'x-decorator': 'FormItem', + 'x-component': 'Input.TextArea', + }, + }, +} +``` + +Эквивалентный JSX + +```tsx | pure +
    + + + + + + +
    +``` + +Также можно использовать компонент CardItem для обёртывания всех блоков, чтобы все блоки были обёрнуты в Card. + +```ts +{ + type: 'void', + ['x-component']: 'div', + properties: { + table: { + type: 'array', + 'x-decorator': 'CardItem', + 'x-component': 'Table', + }, + kanban: { + type: 'array', + 'x-decorator': 'CardItem', + 'x-component': 'Kanban', + }, + }, +} +``` + +Эквивалентный JSX + +```tsx | pure +
    + +
    + + + + + +``` + +### `x-decorator-props` и `x-use-decorator-props` + +Используются аналогично `x-component-props` и `x-use-component-props`. Для компонентов-обёрток необходимо использовать функцию высшего порядка `withDynamicSchemaProps()`. + +### `x-display` + +Состояние отображения компонента + +- `'x-display': 'visible'`: Показать компонент +- `'x-display': 'hidden'`: Скрыть компонент, данные не скрыты +- `'x-display': 'none'`: Скрыть компонент, данные также скрыты + +#### `'x-display': 'visible'` + +```ts +{ + type: 'void', + 'x-component': 'div', + 'x-component-props': { className: 'form-item' }, + properties: { + title: { + type: 'string', + 'x-component': 'input', + 'x-display': 'visible' + }, + }, +} +``` + +Эквивалентный JSX + +```tsx | pure +
    + +
    +``` + +#### `'x-display': 'hidden'` + +```ts +{ + type: 'void', + 'x-component': 'div', + 'x-component-props': { className: 'form-item' }, + properties: { + title: { + type: 'string', + 'x-component': 'input', + 'x-display': 'hidden' + }, + }, +} +``` + +Эквивалентный JSX + +```tsx | pure +
    + {/* Здесь не выводится компонент input, но модель поля с name=title всё ещё существует */} +
    +``` + +#### `'x-display': 'none'` + +```ts +{ + type: 'void', + 'x-component': 'div', + 'x-component-props': { className: 'form-item' }, + properties: { + title: { + type: 'string', + 'x-component': 'input', + 'x-display': 'none' + }, + }, +} +``` + +Эквивалентный JSX + +```tsx | pure +
    + {/* Здесь не выводится компонент input, и модель поля с name=title не существует */} +
    +``` + +### `x-pattern` + +Режим отображения компонента + +Используется для компонентов полей, существует три режима отображения: + +- `'x-pattern': 'editable'`: Редактируемый +- `'x-pattern': 'disabled'`: Нередактируемый +- `'x-pattern': 'readPretty'`: Только для чтения + +Например, для компонента однострочного текста `` редактируемый и нередактируемый режимы — это ``, а режим только для чтения — `
    `. + +#### `'x-pattern': 'editable'` + +```ts +const schema = { + name: 'test', + type: 'void', + 'x-component': 'div', + 'x-component-props': { className: 'form-item' }, + properties: { + title: { + type: 'string', + default: 'Привет', + 'x-component': 'SingleText', + 'x-pattern': 'editable', + }, + }, +}; +``` + +Эквивалентный JSX + +```tsx | pure +
    + +
    +``` + +#### `'x-pattern': 'disabled'` + +```ts +const schema = { + name: 'test', + type: 'void', + 'x-component': 'div', + 'x-component-props': { className: 'form-item' }, + properties: { + title: { + type: 'string', + default: 'Привет', + 'x-component': 'SingleText', + 'x-pattern': 'disabled', + }, + }, +}; +``` + +Эквивалентный JSX + +```tsx | pure +
    + +
    +``` + +#### `'x-pattern': 'readPretty'` + +```ts +const schema = { + name: 'test', + type: 'void', + 'x-component': 'div', + 'x-component-props': { className: 'form-item' }, + properties: { + title: { + type: 'string', + default: 'Привет', + 'x-component': 'SingleText', + 'x-pattern': 'readPretty', + }, + }, +}; +``` + +Эквивалентный JSX + +```tsx | pure +
    +
    Привет
    +
    +``` + +### `x-initializer` + +Не все компоненты поддерживают `x-initializer`. Среди существующих общих компонентов schema только Grid, ActionBar и Tabs поддерживают параметр `x-initializer`. + +```ts +{ + type: 'void', + 'x-component': 'Grid', + 'x-initializer': 'myInitializer', +} +``` + +Пользовательские компоненты также могут использовать `useSchemaInitializerRender()` для обработки рендеринга `x-initializer`. Подробности использования см. в разделе [SchemaInitializer Initializer](/development/client/ui-schema/initializer). + +### `x-settings` + +Не все компоненты поддерживают `x-settings`. Обычно требуется комбинация с обёрточными компонентами, такими как BlockItem, FormItem, CardItem. + +```ts +{ + type: 'void', + 'x-settings': 'mySettings', + 'x-decorator': 'CardItem', + 'x-component': 'Hello', +} +``` + +Пользовательские компоненты также могут использовать `useSchemaSettingsRender()` для обработки рендеринга `x-settings`. Подробности использования см. в разделе [SchemaSettings Configurator](/development/client/ui-schema/settings). + +### `x-toolbar` + +Не все компоненты поддерживают `x-toolbar`. Обычно требуется комбинация с обёрточными компонентами, такими как BlockItem, FormItem, CardItem. + +```ts +{ + type: 'void', + 'x-toolbar': 'HelloToolbar', + 'x-decorator': 'CardItem', + 'x-component': 'Hello', +} +``` + +Пользовательские компоненты также могут использовать `useToolbarRender()` для обработки рендеринга `x-toolbar`. Подробности использования см. в разделе [SchemaToolbar Toolbar](/development/client/ui-schema/toolbar). + diff --git a/docs/ru-RU/development/http-api/action-api.md b/docs/ru-RU/development/http-api/action-api.md new file mode 100644 index 0000000000..f48f471fcd --- /dev/null +++ b/docs/ru-RU/development/http-api/action-api.md @@ -0,0 +1,70 @@ +### **API действий** + +#### **Collection** + +**`create`** + +```bash +POST /api/posts:create +``` + +Тело запроса +```json +{ + "title": "My first post", + "user": 1 +} +``` + +Ответ 200 (application/json) +```json +{ + "data": { + "id": 1, + "title": "My first post", + "userId": 1 + } +} +``` + +**`update`** + +```bash +POST /api/posts:update/1 +``` + +Тело запроса +```json +{ + "title": "My first post 2", + "user": 2 +} +``` + +Ответ 200 (application/json) +```json +{ + "data": [ + { + "id": 1, + "title": "My first post 2", + "userId": 2, + "user": { + "id": 2 + } + } + ] +} +``` + +**`list`** +**`get`** +**`destroy`** +**`move`** + +#### **Association** + +**`add`** +**`set`** +**`remove`** +**`toggle`** diff --git a/docs/ru-RU/development/http-api/filter-operators.md b/docs/ru-RU/development/http-api/filter-operators.md new file mode 100644 index 0000000000..5d63e901c5 --- /dev/null +++ b/docs/ru-RU/development/http-api/filter-operators.md @@ -0,0 +1,59 @@ +### **Операторы фильтрации** + +#### **Общие** + +- $eq +- $ne +- $gte +- $gt +- $lte +- $lt +- $not +- $is +- $in +- $notIn +- $like +- $notLike +- $iLike +- $notILike +- $and +- $or +- $empty +- $notEmpty + +#### **array** + +- $match +- $notMatch +- $anyOf +- $noneOf +- $arrayEmpty +- $arrayNotEmpty + +#### **association** + +- $exists +- $notExists + +#### **boolean** + +- $isTruly +- $isFalsy + +#### **date** + +- $dateOn +- $dateNotOn +- $dateBefore +- $dateNotBefore +- $dateAfter +- $dateNotAfter + +#### **string** + +- $includes +- $notIncludes +- $startsWith +- $notStartsWith +- $endWith +- $notEndWith diff --git a/docs/ru-RU/development/http-api/index.md b/docs/ru-RU/development/http-api/index.md new file mode 100644 index 0000000000..2706169ab6 --- /dev/null +++ b/docs/ru-RU/development/http-api/index.md @@ -0,0 +1,301 @@ +### **Обзор** + +HTTP API NocoBase основан на концепции «Ресурс и действие» (Resource & Action), является надмножеством REST API и не ограничивается стандартными операциями CRUD. В NocoBase действия ресурсов (Resource Action) могут расширяться произвольным образом. + +#### **Ресурс (Resource)** + +В NocoBase ресурс (resource) может быть представлен двумя способами: + +- `` +- `.` + + + +- collection — это набор всех абстрактных данных +- association — связанные данные collection +- resource включает в себя два типа: collection и collection.association + + + +##### **Примеры** + +- `posts` — статьи +- `posts.user` — пользователь статьи +- `posts.tags` — теги статьи + +#### **Действие (Action)** + +Действия ресурса обозначаются как `:`: + +- `:` +- `.:` + +Встроенные глобальные действия, доступные для collection и association: + +- `create` +- `get` +- `list` +- `update` +- `destroy` +- `move` + +Встроенные действия для связей, доступные только для association: + +- `set` +- `add` +- `remove` +- `toggle` + +##### **Примеры** + +- `posts:create` — создать статью +- `posts.user:get` — просмотреть пользователя статьи +- `posts.tags:add` — добавить тег к статье (связать существующий тег со статьёй) + +#### **URL запроса** + +```bash + /api/: + /api/:/ + /api///: + /api///:/ +``` + +##### **Примеры** + +Ресурс `posts`: + +```bash +POST /api/posts:create +GET /api/posts:list +GET /api/posts:get/1 +POST /api/posts:update/1 +POST /api/posts:destroy/1 +``` + +Ресурс `posts.comments`: + +```bash +POST /api/posts/1/comments:create +GET /api/posts/1/comments:list +GET /api/posts/1/comments:get/1 +POST /api/posts/1/comments:update/1 +POST /api/posts/1/comments:destroy/1 +``` + +Ресурс `posts.tags`: + +```bash +POST /api/posts/1/tags:create +GET /api/posts/1/tags:get +GET /api/posts/1/tags:list +POST /api/posts/1/tags:update +POST /api/posts/1/tags:destroy +POST /api/posts/1/tags:add +GET /api/posts/1/tags:remove +``` + +#### **Определение ресурса** + +- Ресурс collection определяется по `collectionIndex`, который должен быть уникальным. +- Ресурс association определяется по комбинации `collectionIndex` и `associationIndex`. При этом `associationIndex` может быть неуникальным, но совместный индекс `collectionIndex` и `associationIndex` должен быть уникальным. + +При запросе деталей ресурса association в URL необходимо указывать и ``, и ``. Параметр `` не является избыточным, так как `` может быть неуникальным. + +Например, `tables.fields` означает поля таблицы данных: + +```bash +GET /api/tables/table1/fields/title +GET /api/tables/table2/fields/title +``` + +Таблицы `table1` и `table2` обе содержат поле `title`. Значение `title` уникально в пределах `table1`, но другие таблицы также могут содержать поле `title`. + +#### **Параметры запроса** + +Параметры запроса могут передаваться в заголовках (headers), параметрах (query string) или теле запроса (body, для GET-запросов тело отсутствует). + +Несколько специальных параметров: + +- `filter` — фильтрация данных, используется в операциях запроса; +- `filterByTk` — фильтрация по полю `tk`, используется для указания конкретной записи в операциях детализации; +- `sort` — сортировка, используется в операциях запроса; +- `fields` — какие поля выводить, используется в операциях запроса; +- `appends` — дополнительные связанные поля, используется в операциях запроса; +- `except` — исключить поля (не выводить), используется в операциях запроса; +- `whitelist` — белый список полей, используется при создании и обновлении данных; +- `blacklist` — чёрный список полей, используется при создании и обновлении данных. + +##### **filter** + +Фильтрация данных: + +```bash +# простой вариант +GET /api/posts?filter[status]=publish +# рекомендуется использовать формат json string, требует кодирования через encodeURIComponent +GET /api/posts?filter={"status":"published"} + +# операторы фильтрации +GET /api/posts?filter[status.$eq]=publish +GET /api/posts?filter={"status.$eq":"published"} + +# $and +GET /api/posts?filter={"$and": [{"status.$eq":"published"}, {"title.$includes":"a"}]} +# $or +GET /api/posts?filter={"$or": [{"status.$eq":"pending"}, {"status.$eq":"draft"}]} + +# поле связи +GET /api/posts?filter[user.email.$includes]=gmail +GET /api/posts?filter={"user.email.$includes":"gmail"} +``` + +[Дополнительная информация об операторах фильтрации](http-api/filter-operators) + +### filterByTk + +Фильтрация по полю `tk`. По умолчанию: + +- для ресурса collection — `tk` является первичным ключом таблицы данных; +- для ресурса association — `tk` соответствует полю `targetKey` связи. + +```bash +GET /api/posts:get?filterByTk=1&fields=name,title&appends=tags +``` + +### sort + +Сортировка. Для сортировки по убыванию перед полем ставится знак минус `-`. + +```bash +# по возрастанию по полю createdAt +GET /api/posts:get?sort=createdAt +# по убыванию по полю createdAt +GET /api/posts:get?sort=-createdAt +# сортировка по нескольким полям: по убыванию по createdAt, по возрастанию по title (A–Z) +GET /api/posts:get?sort=-createdAt,title +``` + +### fields + +Указание, какие поля включать в ответ. + +```bash +GET /api/posts:list?fields=name,title + +Ответ 200 (application/json) +{ + "data": [ + { + "name": "", + "title": "" + } + ], + "meta": {} +} +``` + +### appends + +Добавление связанных полей. + +### except + +Исключение полей (не выводить), используется в операциях запроса. + +### whitelist + +Белый список + +```bash +POST /api/posts:create?whitelist=title + +{ + "title": "My first post", + "date": "2022-05-19" # поле date будет отфильтровано и не попадёт в базу данных +} +``` + +### blacklist + +Чёрный список + +```bash +POST /api/posts:create?blacklist=date + +{ + "title": "My first post", + "date": "2022-05-19" # поле date будет отфильтровано и не попадёт в базу данных +} +``` + +## Ответ на запрос + +Формат ответа + +```ts +type ResponseResult = { + data?: any; // основные данные + meta?: any; // дополнительные данные + errors?: ResponseError[]; // ошибки +}; + +type ResponseError = { + code?: string; + message: string; +}; +``` + +### Примеры + +Просмотр списка + +```bash +GET /api/posts:list + +Ответ 200 (application/json) + +{ + data: [ + { + id: 1 + } + ], + meta: { + count: 1 + page: 1, + pageSize: 1, + totalPage: 1 + }, +} +``` + +Просмотр деталей + +```bash +GET /api/posts:get/1 + +Ответ 200 (application/json) + +{ + data: { + id: 1 + }, +} +``` + +Ошибка + +```bash +POST /api/posts:create + +Ответ 400 (application/json) + +{ + errors: [ + { + message: 'name must be required', + }, + ], +} +``` diff --git a/docs/ru-RU/development/http-api/rest-api.md b/docs/ru-RU/development/http-api/rest-api.md new file mode 100644 index 0000000000..6ab4b9a593 --- /dev/null +++ b/docs/ru-RU/development/http-api/rest-api.md @@ -0,0 +1,184 @@ +# REST API + +HTTP API NocoBase является надмножеством REST API, стандартные CRUD API также поддерживают RESTful-стиль. + +## Ресурсы Collection + +--- + +### Создание collection + +HTTP API + +```bash +POST /api/:create + +{} # JSON body +``` + +REST API + +```bash +POST /api/ + +{} # JSON body +``` + +### Просмотр списка collections + +HTTP API + +```bash +GET /api/:list +``` + +REST API + +```bash +GET /api/ +``` + +### Просмотр деталей collection + +HTTP API + +```bash +GET /api/:get?filterByTk= +GET /api/:get/ +``` + +REST API + +```bash +GET /api// +``` + +### Обновление collection + +HTTP API + +```bash +POST /api/:update?filterByTk= + +{} # JSON body + +# или +POST /api/:update/ + +{} # JSON body +``` + +REST API + +```bash +PUT /api// + +{} # JSON body +``` + +### Удаление collection + +HTTP API + +```bash +POST /api/:destroy?filterByTk= +# или +POST /api/:destroy/ +``` + +REST API + +```bash +DELETE /api// +``` + +## Ресурсы Association + +--- + +### Создание Association + +HTTP API + +```bash +POST /api///:create + +{} # JSON body +``` + +REST API + +```bash +POST /api/// + +{} # JSON body +``` + +### Просмотр списка Associations + +HTTP API + +```bash +GET /api///:list +``` + +REST API + +```bash +GET /api/// +``` + +### Просмотр деталей Association + +HTTP API + +```bash +GET /api///:get?filterByTk= +# или +GET /api///:get/ +``` + +REST API + +```bash +GET /api///:get/ +``` + +### Обновление Association + +HTTP API + +```bash +POST /api///:update?filterByTk= + +{} # JSON body + +# или +POST /api///:update/ + +{} # JSON body +``` + +REST API + +```bash +PUT /api///:update/ + +{} # JSON данные +``` + +### Удаление Association + +HTTP API + +```bash +POST /api///:destroy?filterByTk= +# или +POST /api///:destroy/ +``` + +REST API + +```bash +DELETE /api//// +``` diff --git a/docs/ru-RU/development/image-1.png b/docs/ru-RU/development/image-1.png new file mode 100644 index 0000000000..97e973eedd Binary files /dev/null and b/docs/ru-RU/development/image-1.png differ diff --git a/docs/ru-RU/development/index.md b/docs/ru-RU/development/index.md new file mode 100644 index 0000000000..04f61060b8 --- /dev/null +++ b/docs/ru-RU/development/index.md @@ -0,0 +1,37 @@ +# Введение + +NocoBase использует микрокерновую архитектуру, где различные функциональности расширяются в виде плагинов. Плагинный подход уменьшает связность между модулями, повышая переиспользуемость. По мере расширения библиотеки плагинов, типовые сценарии можно легко реализовывать их комбинацией. No-code платформа NocoBase состоит из различных плагинов. + +## Менеджер плагинов + +NocoBase предоставляет мощный менеджер плагинов для управления ими. No-code пользователи могут через интерфейс управлять добавлением, активацией, деактивацией и удалением плагинов. + +![Менеджер плагинов](https://static-docs.nocobase.com/f914d978dbfd8c45a650bd88ef867832.png) + +Разработчики также могут управлять плагинами через CLI. + +Больше примеров плагинов можно найти в [packages/samples](https://github.com/nocobase/nocobase/tree/main/packages/plugins/%40nocobase). + +## Расширяемость + +Будь то типовые функциональности или персонализированные доработки - все может быть реализовано в виде плагинов. Расширяемость NocoBase проявляется в различных аспектах: + +- Это могут быть видимые пользователю интерфейсные модули страниц, типы блоков, операций, полей и т.д. +- Это могут быть доработки или ограничения HTTP API - фильтры, валидаторы, ограничения доступа и т.п. +- Это могут быть и более фундаментальные улучшения возможностей вроде таблиц данных, миграций, событий, командной строки и т.д. + +Модули распределены следующим образом: + +- Серверная часть: + - Таблицы и поля данных + - Ресурсы и операции + - Промежуточное ПО (middleware) + - События + - Пользовательские команды CLI + - Интернационализация +- Клиентская часть: + - Управление маршрутами и страницы конфигурации плагинов + - Стили и темы + - Провайдеры и контексты + - UI Schema + - Интернационализация diff --git a/docs/ru-RU/development/index/app-flow.svg b/docs/ru-RU/development/index/app-flow.svg new file mode 100644 index 0000000000..f1bf7e1029 --- /dev/null +++ b/docs/ru-RU/development/index/app-flow.svg @@ -0,0 +1 @@ +
    beforeLoad
    loop: plugin.beforeLoad()
    load/reload
    loop: plugin.load()
    afterLoad
    Reinstall?
    beforeInstall
    install
    afterInstall
    beforeUpgrade
    upgrade
    afterUpgrade
    Restart?
    beforeStart
    start
    afterStart
    beforeStop
    stop
    afterStop
    beforeDestroy
    destroy
    afterDestroy
    diff --git a/docs/ru-RU/development/index/pm-built-in.jpg b/docs/ru-RU/development/index/pm-built-in.jpg new file mode 100644 index 0000000000..2fe60fdac6 Binary files /dev/null and b/docs/ru-RU/development/index/pm-built-in.jpg differ diff --git a/docs/ru-RU/development/index/pm-flow.svg b/docs/ru-RU/development/index/pm-flow.svg new file mode 100644 index 0000000000..078274a143 --- /dev/null +++ b/docs/ru-RU/development/index/pm-flow.svg @@ -0,0 +1 @@ +
    Local
    pm.create
    Marketplace
    pm.publish
    NPM registry
    Extracting client files
    pm.add
    plugin.afterAdd()
    app/client plugins
    pm.enable
    plugin.install()
    plugin.afterEnable()
    pm.disable
    plugin.afterDisable()
    pm.remove
    plugin.remove()
    pm.upgrade
    diff --git a/docs/ru-RU/development/index/pm-ui.jpg b/docs/ru-RU/development/index/pm-ui.jpg new file mode 100644 index 0000000000..4c8fdd3c1a Binary files /dev/null and b/docs/ru-RU/development/index/pm-ui.jpg differ diff --git a/docs/ru-RU/development/learning-guide.md b/docs/ru-RU/development/learning-guide.md new file mode 100644 index 0000000000..6f45ab8270 --- /dev/null +++ b/docs/ru-RU/development/learning-guide.md @@ -0,0 +1,148 @@ +### **Руководство по изучению** + +#### **1. Начало работы: установка и запуск NocoBase** + +Соответствующая документация: [Быстрый старт](/welcome/getting-started/installation) + +Основные команды: + +**Скачивание:** +```bash +yarn create / git clone +yarn install +``` + +**Установка:** +```bash +yarn nocobase install +``` + +**Запуск:** +```bash +# для разработки +yarn dev + +# для продакшена +yarn build +yarn start +``` + +--- + +#### **2. Изучение основных возможностей платформы NocoBase** + +Соответствующая документация: [Руководство пользователя](/manual) + +Основные компоненты: + +- **Конструктор интерфейса (UI Designer):** включает блоки, поля и действия. +- **Менеджер плагинов:** расширение функциональности. +- **Центр настроек:** конфигурационные возможности активированных плагинов. + +--- + +#### **3. Более глубокое изучение использования менеджера плагинов** + +Соответствующая документация: [Разработка плагинов](/development) + +NocoBase предоставляет простой интерфейс менеджера плагинов, но через интерфейс можно только включать, отключать и удалять локальные плагины. Полный контроль осуществляется через CLI: + +```bash +# Создать плагин +yarn pm create hello + +# Зарегистрировать плагин +yarn pm add hello + +# Активировать плагин +yarn pm enable hello + +# Отключить плагин +yarn pm disable hello + +# Удалить плагин +yarn pm remove hello +``` + +Больше примеров плагинов можно найти в `packages/samples`. Изучив примеры, вы сможете понять базовое использование плагинов и приступить к их разработке. + +--- + +#### **4. Разработка нового плагина: знакомство со структурой модулей** + +Соответствующая документация: [Руководство по расширению](/development/guide) + +Раздел [Написание первого плагина](/development/your-fisrt-plugin) кратко описывает основной процесс разработки, но для более глубокого понимания деталей рекомендуется изучить структуру модулей фреймворка NocoBase. + +**Серверная часть (Server):** +- **Collections & Fields:** используется для настройки системных таблиц; бизнес-таблицы рекомендуется создавать через «Центр настроек — Настройка таблиц данных». +- **Resources & Actions:** расширение API действий. +- **Middleware:** промежуточное ПО. +- **Events:** события. +- **I18n:** интернационализация на сервере. + +**Клиентская часть (Client):** +- **UI Schema Designer:** конструктор интерфейсов. +- **UI Router:** при необходимости создания пользовательских страниц. +- **Plugin Settings Manager:** предоставление страниц настроек для плагинов. +- **I18n:** интернационализация на клиенте. + +**Инструменты разработки (Devtools):** +- **Commands:** пользовательские команды CLI. +- **Migrations:** скрипты миграций. + +--- + +#### **5. Изучение основных API модулей** + +Соответствующая документация: [Справочник API](/api) + +Ознакомьтесь с примерами в `packages/samples`, чтобы лучше понять использование основных API модулей. + +**Серверная часть (Server):** + +- **Collections & Fields:** + - `db.collection` + - `db.import` + +- **Resources & Actions:** + - `app.resourcer.define` + - `app.resourcer.registerActions` + +- **Middleware:** + - `app.use` + - `app.acl.use` + - `app.resourcer.use` + +- **Events:** + - `app.on` + - `app.db.on` + +- **I18n:** + - `app.i18n` + - `ctx.i18n` + +**Клиентская часть (Client):** + +- **UI Schema Designer:** + - `SchemaComponent` + - `SchemaInitializer` + - `SchemaSettings` + +- **UI Router:** + - `RouteSwitchProvider` + - `RouteSwitch` + +- **I18n:** + - `app.i18n` + - `useTranslation` + +**Инструменты разработки (Devtools):** + +- **Commands:** + - `app.command` + - `app.findCommand` + +- **Migrations:** + - `app.db.addMigration` + - `app.db.addMigrations` diff --git a/docs/ru-RU/development/life-cycle.md b/docs/ru-RU/development/life-cycle.md new file mode 100644 index 0000000000..8646725d2e --- /dev/null +++ b/docs/ru-RU/development/life-cycle.md @@ -0,0 +1,35 @@ +# Жизненный цикл + +## Жизненный цикл серверного приложения + +Жизненный цикл серверного приложения + +Активируется через `app.on()`, подробности см. в разделе [Сервер - События](/development/server/events). + +```ts +class PluginSampleHelloServer extends Plugin { + async beforeLoad() { + this.app.on('beforeInstall', async () => { + // код... + }); + } +} +``` + +## Жизненный цикл серверного плагина + +Жизненный цикл серверного плагина + +Реализуется в классе плагина, подробности использования см. в разделе [Сервер - Обзор](/development/server). + +```ts +class PluginSampleHelloServer extends Plugin { + async beforeLoad() {} +} +``` + +## Жизненный цикл клиентского плагина + +Жизненный цикл клиентского плагина + +Реализуется в классе плагина, подробности использования см. в разделе [Клиент - Обзор](/development/client). diff --git a/docs/ru-RU/development/others/build.md b/docs/ru-RU/development/others/build.md new file mode 100644 index 0000000000..e20b805ce0 --- /dev/null +++ b/docs/ru-RU/development/others/build.md @@ -0,0 +1,34 @@ +# Сборка + +## Пользовательская конфигурация сборки + +Для кастомизации конфигурации сборки создайте файл `build.config.ts` в корневой директории плагина со следующим содержимым: + +```js +import { defineConfig } from '@nocobase/build'; + +export default defineConfig({ + modifyViteConfig: (config) => { + // Vite используется для сборки клиентского кода из `src/client` + + // Модифицируйте конфигурацию Vite. Подробности: https://vitejs.dev/guide/ + return config; + }, + modifyTsupConfig: (config) => { + // Tsup используется для сборки серверного кода из `src/server` + + // Модифицируйте конфигурацию Tsup. Подробности: https://tsup.egoist.dev/#using-custom-configuration + return config; + }, + beforeBuild: (log) => { + // Функция обратного вызова перед началом сборки + }, + afterBuild: (log: PkgLog) => { + // Функция обратного вызова после завершения сборки + } +}); +``` + +## Пример плагина + +- [@nocobase/plugin-sample-custom-build](#) diff --git a/docs/ru-RU/development/others/deps.md b/docs/ru-RU/development/others/deps.md new file mode 100644 index 0000000000..d660d87149 --- /dev/null +++ b/docs/ru-RU/development/others/deps.md @@ -0,0 +1,94 @@ +# Зависимости + +Зависимости плагина делятся на локальные и глобальные. Глобальные зависимости предоставляются `@nocobase/server` и `@nocobase/client` и не включаются в итоговый бандл плагина. Однако локальные зависимости будут собраны вместе с плагином. + +Поскольку локальные зависимости включаются в бандл (включая npm-пакеты, требуемые сервером, которые также попадут в `dist/node_modules`), при разработке плагина все зависимости должны добавляться в `devDependencies`. + + +При установке следующих зависимостей для плагина убедитесь, что их **версии** соответствуют версиям в `@nocobase/server` и `@nocobase/client`. + + +## Глобальные зависимости + +```js +// nocobase +'@nocobase/acl', + '@nocobase/actions', + '@nocobase/auth', + '@nocobase/cache', + '@nocobase/client', + '@nocobase/database', + '@nocobase/evaluators', + '@nocobase/logger', + '@nocobase/resourcer', + '@nocobase/sdk', + '@nocobase/server', + '@nocobase/test', + '@nocobase/utils', + // @nocobase/auth + 'jsonwebtoken', + // @nocobase/cache + 'cache-manager', + 'cache-manager-fs-hash', + // @nocobase/database + 'sequelize', + 'umzug', + 'async-mutex', + // @nocobase/evaluators + '@formulajs/formulajs', + 'mathjs', + // @nocobase/logger + 'winston', + 'winston-daily-rotate-file', + // koa + 'koa', + '@koa/cors', + '@koa/router', + 'multer', + '@koa/multer', + 'koa-bodyparser', + 'koa-static', + 'koa-send', + // react + 'react', + 'react-dom', + 'react/jsx-runtime', + // react-router + 'react-router', + 'react-router-dom', + // antd + 'antd', + 'antd-style', + '@ant-design/icons', + '@ant-design/cssinjs', + // i18next + 'i18next', + 'react-i18next', + // dnd-kit + '@dnd-kit/accessibility', + '@dnd-kit/core', + '@dnd-kit/modifiers', + '@dnd-kit/sortable', + '@dnd-kit/utilities', + // formily + '@formily/antd-v5', + '@formily/core', + '@formily/react', + '@formily/json-schema', + '@formily/path', + '@formily/validator', + '@formily/shared', + '@formily/reactive', + '@formily/reactive-react', + // utils + 'dayjs', + 'mysql2', + 'pg', + 'pg-hstore', + 'sqlite3', + 'supertest', + 'axios', + '@emotion/css', + 'ahooks', + 'lodash'; +``` diff --git a/docs/ru-RU/development/others/languages.md b/docs/ru-RU/development/others/languages.md new file mode 100644 index 0000000000..4d104ff5e6 --- /dev/null +++ b/docs/ru-RU/development/others/languages.md @@ -0,0 +1,73 @@ +# Languages + +```ts +{ + 'ar-EG': { label: 'العربية' }, + 'az-AZ': { label: 'Azərbaycan dili' }, + 'bg-BG': { label: 'Български' }, + 'bn-BD': { label: 'Bengali' }, + 'by-BY': { label: 'Беларускі' }, + 'ca-ES': { label: 'Сatalà/Espanya' }, + 'cs-CZ': { label: 'Česky' }, + 'da-DK': { label: 'Dansk' }, + 'de-DE': { label: 'Deutsch' }, + 'el-GR': { label: 'Ελληνικά' }, + 'en-GB': { label: 'English(GB)' }, + 'en-US': { label: 'English' }, + 'es-ES': { label: 'Español' }, + 'et-EE': { label: 'Estonian (Eesti)' }, + 'fa-IR': { label: 'فارسی' }, + 'fi-FI': { label: 'Suomi' }, + 'fr-BE': { label: 'Français(BE)' }, + 'fr-CA': { label: 'Français(CA)' }, + 'fr-FR': { label: 'Français' }, + 'ga-IE': { label: 'Gaeilge' }, + 'gl-ES': { label: 'Galego' }, + 'he-IL': { label: 'עברית' }, + 'hi-IN': { label: 'हिन्दी' }, + 'hr-HR': { label: 'Hrvatski jezik' }, + 'hu-HU': { label: 'Magyar' }, + 'hy-AM': { label: 'Հայերեն' }, + 'id-ID': { label: 'Bahasa Indonesia' }, + 'is-IS': { label: 'Íslenska' }, + 'it-IT': { label: 'Italiano' }, + 'ja-JP': { label: '日本語' }, + 'ka-GE': { label: 'ქართული' }, + 'kk-KZ': { label: 'Қазақ тілі' }, + 'km-KH': { label: 'ភាសាខ្មែរ' }, + // 'kmr-IQ': { label: 'kmr_IQ' }, + 'kn-IN': { label: 'ಕನ್ನಡ' }, + 'ko-KR': { label: '한국어' }, + 'ku-IQ': { label: 'کوردی' }, + 'lt-LT': { label: 'lietuvių' }, + 'lv-LV': { label: 'Latviešu valoda' }, + 'mk-MK': { label: 'македонски јазик' }, + 'ml-IN': { label: 'മലയാളം' }, + 'mn-MN': { label: 'Монгол хэл' }, + 'ms-MY': { label: 'بهاس ملايو' }, + 'nb-NO': { label: 'Norsk bokmål' }, + 'ne-NP': { label: 'नेपाली' }, + 'nl-BE': { label: 'Vlaams' }, + 'nl-NL': { label: 'Nederlands' }, + 'pl-PL': { label: 'Polski' }, + 'pt-BR': { label: 'Português brasileiro' }, + 'pt-PT': { label: 'Português' }, + 'ro-RO': { label: 'România' }, + 'ru-RU': { label: 'Русский' }, + 'si-LK': { label: 'සිංහල' }, + 'sk-SK': { label: 'Slovenčina' }, + 'sl-SI': { label: 'Slovenščina' }, + 'sr-RS': { label: 'српски језик' }, + 'sv-SE': { label: 'Svenska' }, + 'ta-IN': { label: 'Tamil' }, + 'th-TH': { label: 'ภาษาไทย' }, + 'tk-TK': { label: 'Turkmen' }, + 'tr-TR': { label: 'Türkçe' }, + 'uk-UA': { label: 'Українська' }, + 'ur-PK': { label: 'Oʻzbekcha' }, + 'vi-VN': { label: 'Tiếng Việt' }, + 'zh-CN': { label: '简体中文' }, + 'zh-HK': { label: '繁體中文(香港)' }, + 'zh-TW': { label: '繁體中文(台湾)' }, +} +``` diff --git a/docs/ru-RU/development/others/tech-stack.md b/docs/ru-RU/development/others/tech-stack.md new file mode 100644 index 0000000000..bdd538322b --- /dev/null +++ b/docs/ru-RU/development/others/tech-stack.md @@ -0,0 +1,18 @@ +# Технологический стек + +| NPM пакеты и версии | Назначение | +| -------------------------------------- | ------------ | +| react, react-dom (18.x) | Фреймворк | +| react-router (6.x) | Маршрутизация| +| i18next (22.x), react-i18next (11.x) | Интернационализация | +| ant-design (5.x) | UI библиотека компонентов | +| antd-style (3.x) | Динамические темы | +| axios (0.26.x), useRequest (3.x) | API запросы | +| Formily (2.x) | UI Schema | +| dayjs (1.11.x) | Форматирование дат | +| dnd-kit (5.x) | Drag-and-drop| +| umi (4.x) | Фреймворк разработки приложений | +| dumi (2.x) | Инструмент документации | +| vite (4.x), tsup (7.x) | Инструменты сборки | +| vitest (0.34.x) | Инструмент модульного тестирования | +| playwright (1.x) | Инструмент E2E тестирования | diff --git a/docs/ru-RU/development/others/testing.md b/docs/ru-RU/development/others/testing.md new file mode 100644 index 0000000000..4cd7763700 --- /dev/null +++ b/docs/ru-RU/development/others/testing.md @@ -0,0 +1,70 @@ +### **Тестирование** + +#### **Введение** + +При разработке плагинов важно проводить тестирование, чтобы гарантировать стабильность и надёжность кода. NocoBase предоставляет мощные инструменты для тестирования, включая мокинг сервера и агента для симуляции HTTP-запросов. + +#### **Настройка тестов** + +Для начала необходимо импортировать необходимые модули и инициализировать приложение: + +```ts +import { mockServer } from '@nocobase/test'; + +describe('my suite', () => { + let app; + let agent; + let db; + + beforeEach(async () => { + app = mockServer(); + agent = app.agent(); + db = app.db; + + db.collection({ + name: 'posts', + fields: [ + { + type: 'string', + name: 'title', + }, + ], + }); + + await db.sync(); + await app.load(); + }); +}); +``` + +#### **Написание тестов** + +После настройки окружения можно писать тесты. Пример теста для создания записи: + +```ts +test('my case', async () => { + const { body } = await agent.resource('posts').create({ + values: { + title: 'hello', + }, + }); + + expect(body.data.title).toEqual('hello'); +}); +``` + +#### **Запуск тестов** + +Тесты можно запустить с помощью команды: + +```bash +yarn test +``` + +#### **Дополнительные возможности** + +- Поддержка мокинга базы данных +- Симуляция различных сценариев запросов +- Интеграция с Jest и другими тестовыми фреймворками + +Более подробную информацию см. в официальной документации NocoBase. diff --git a/docs/ru-RU/development/plugin-ds.md b/docs/ru-RU/development/plugin-ds.md new file mode 100644 index 0000000000..f3cb3159f0 --- /dev/null +++ b/docs/ru-RU/development/plugin-ds.md @@ -0,0 +1,45 @@ +### **Структура каталога плагина** + +Создать пустой плагин можно с помощью команды `yarn pm create my-plugin`. Структура каталога будет следующей: + +```bash +|- /my-plugin + |- /src + |- /client # Клиентская часть плагина + |- /server # Серверная часть плагина + |- client.d.ts + |- client.js + |- package.json # Информация о пакете плагина + |- server.d.ts + |- server.js + |- build.config.ts # Или `build.config.js` — используется для изменения конфигурации сборки и реализации пользовательской логики +``` + +Руководство по `/src/server` см. в разделе [Серверная часть](./server), по `/src/client` — в разделе [Клиентская часть](./client). + +Если вы хотите настроить конфигурацию сборки, создайте в корневом каталоге файл `build.config.ts` (или `build.config.js`) со следующим содержимым: + +```js +import { defineConfig } from '@nocobase/build'; + +export default defineConfig({ + modifyViteConfig: (config) => { + // Vite используется для сборки кода из `src/client` + + // Изменение конфигурации Vite, подробнее: https://vitejs.dev/guide/ + return config + }, + modifyTsupConfig: (config) => { + // Tsup используется для сборки кода из `src/server` + + // Изменение конфигурации Tsup, подробнее: https://tsup.egoist.dev/#using-custom-configuration + return config + }, + beforeBuild: (log) => { + // Функция обратного вызова перед началом сборки — можно выполнить операции до начала сборки + }, + afterBuild: (log: PkgLog) => { + // Функция обратного вызова после завершения сборки — можно выполнить операции после завершения сборки + } +}); +``` diff --git a/docs/ru-RU/development/plugin.md b/docs/ru-RU/development/plugin.md new file mode 100644 index 0000000000..d55c49aaac --- /dev/null +++ b/docs/ru-RU/development/plugin.md @@ -0,0 +1,107 @@ +### **Способы организации плагинов** + +NocoBase предлагает три различных метода организации плагинов, при этом все пакеты плагинов в конечном итоге объединяются в каталоге `node_modules` в корне проекта: + +![Схема](https://static-docs.nocobase.com/20240428091419.png) + +#### **storage/plugins** + +Этот каталог предназначен для хранения предварительно собранных плагинов, которым не требуются дополнительные зависимости. Эти плагины готовы к немедленному использованию — просто подключай и используй. Плагины, добавленные через интерфейс, помещаются в этот каталог. Также вы можете добавить плагин с помощью команды `pm add`. + +Пример команды: +```bash +tar -xvzf /downloads/plugin-data-source-external-mysql-0.21.0-alpha.10.tgz -C /my-nocobase-app/storage/plugins/@nocobase/plugin-data-source-external-mysql --strip-components=1 +``` + +Структура каталога: +``` +|- /storage/ + |- /plugins/ + |- /@nocobase/ + |- /plugin-data-source-external-mysql/ +``` + +#### **packages/plugins** + +Для плагинов, находящихся в стадии разработки, управление осуществляется через Yarn workspaces. При выполнении команды `yarn install` все зависимости для этих плагинов будут загружены. Исходный код доступен, однако перед использованием в рабочей среде плагины необходимо собрать. Структура таких пакетов плагинов аналогична структуре пакетов npm: + +``` +|- /packages/ + |- /plugins/ + |- /@nocobase/ + |- /plugin-hello1/ + |- /plugin-hello2/ + |- /my-nocobase-plugin-hello1/ + |- /my-nocobase-plugin-hello2/ +``` + +#### **package.json + зависимости** + +Примером этого метода является предустановленный пакет плагинов NocoBase, в котором плагины перечислены в разделе `dependencies` файла `package.json`. При выполнении команды `yarn install` все указанные плагины автоматически загружаются и готовы к использованию. + +Пример: +```json +{ + "name": "@nocobase/preset-nocobase", + "version": "0.21.0-alpha.15", + "license": "AGPL-3.0", + "main": "./lib/server/index.js", + "dependencies": { + "@nocobase/plugin-acl": "0.21.0-alpha.15", + "@nocobase/plugin-action-bulk-edit": "0.21.0-alpha.15", + "@nocobase/plugin-action-bulk-update": "0.21.0-alpha.15", + "@nocobase/plugin-action-duplicate": "0.21.0-alpha.15", + "@nocobase/plugin-action-print": "0.21.0-alpha.15", + "@nocobase/plugin-api-doc": "0.21.0-alpha.15", + "@nocobase/plugin-api-keys": "0.21.0-alpha.15", + "@nocobase/plugin-audit-logs": "0.21.0-alpha.15", + "@nocobase/plugin-auth": "0.21.0-alpha.15", + "@nocobase/plugin-backup-restore": "0.21.0-alpha.15", + "@nocobase/plugin-calendar": "0.21.0-alpha.15", + "@nocobase/plugin-cas": "0.21.0-alpha.15", + "@nocobase/plugin-charts": "0.21.0-alpha.15", + "@nocobase/plugin-china-region": "0.21.0-alpha.15", + "@nocobase/plugin-client": "0.21.0-alpha.15", + "@nocobase/plugin-collection-manager": "0.21.0-alpha.15", + "@nocobase/plugin-custom-request": "0.21.0-alpha.15", + "@nocobase/plugin-data-source-manager": "0.21.0-alpha.15", + "@nocobase/plugin-data-visualization": "0.21.0-alpha.15", + "@nocobase/plugin-error-handler": "0.21.0-alpha.15", + "@nocobase/plugin-export": "0.21.0-alpha.15", + "@nocobase/plugin-file-manager": "0.21.0-alpha.15", + "@nocobase/plugin-formula-field": "0.21.0-alpha.15", + "@nocobase/plugin-gantt": "0.21.0-alpha.15", + "@nocobase/plugin-graph-collection-manager": "0.21.0-alpha.15", + "@nocobase/plugin-iframe-block": "0.21.0-alpha.15", + "@nocobase/plugin-import": "0.21.0-alpha.15", + "@nocobase/plugin-kanban": "0.21.0-alpha.15", + "@nocobase/plugin-localization-management": "0.21.0-alpha.15", + "@nocobase/plugin-logger": "0.21.0-alpha.15", + "@nocobase/plugin-map": "0.21.0-alpha.15", + "@nocobase/plugin-mobile-client": "0.21.0-alpha.15", + "@nocobase/plugin-mock-collections": "0.21.0-alpha.15", + "@nocobase/plugin-multi-app-manager": "0.21.0-alpha.15", + "@nocobase/plugin-multi-app-share-collection": "0.21.0-alpha.15", + "@nocobase/plugin-oidc": "0.21.0-alpha.15", + "@nocobase/plugin-saml": "0.21.0-alpha.15", + "@nocobase/plugin-sequence-field": "0.21.0-alpha.15", + "@nocobase/plugin-sms-auth": "0.21.0-alpha.15", + "@nocobase/plugin-snapshot-field": "0.21.0-alpha.15", + "@nocobase/plugin-system-settings": "0.21.0-alpha.15", + "@nocobase/plugin-theme-editor": "0.21.0-alpha.15", + "@nocobase/plugin-ui-schema-storage": "0.21.0-alpha.15", + "@nocobase/plugin-users": "0.21.0-alpha.15", + "@nocobase/plugin-verification": "0.21.0-alpha.15", + "@nocobase/plugin-workflow": "0.21.0-alpha.15", + "@nocobase/plugin-workflow-action-trigger": "0.21.0-alpha.15", + "@nocobase/plugin-workflow-aggregate": "0.21.0-alpha.15", + "@nocobase/plugin-workflow-delay": "0.21.0-alpha.15", + "@nocobase/plugin-workflow-dynamic-calculation": "0.21.0-alpha.15", + "@nocobase/plugin-workflow-loop": "0.21.0-alpha.15", + "@nocobase/plugin-workflow-manual": "0.21.0-alpha.15", + "@nocobase/plugin-workflow-parallel": "0.21.0-alpha.15", + "@nocobase/plugin-workflow-request": "0.21.0-alpha.15", + "@nocobase/plugin-workflow-sql": "0.21.0-alpha.15" + } +} +``` diff --git a/docs/ru-RU/development/server/collections-fields.md b/docs/ru-RU/development/server/collections-fields.md new file mode 100644 index 0000000000..444d2da712 --- /dev/null +++ b/docs/ru-RU/development/server/collections-fields.md @@ -0,0 +1,289 @@ +# Коллекции и поля + +## Основные понятия + +Моделирование данных - это фундаментальный уровень приложения. В NocoBase мы моделируем данные через таблицы (Collection) и поля (Field), которые сохраняются в базе данных. + +### Коллекция (Collection) + +Коллекция - это набор однотипных данных, соответствующий понятию таблицы в базе данных. Например: заказы, товары, пользователи, комментарии могут быть определены как коллекции. Разные коллекции различаются по имени и содержат поля: + +```ts +db.collection({ + name: 'posts', + fields: [ + { name: 'title', type: 'string' } + { name: 'content', type: 'text' }, + // ... + ] +}); +``` + +После определения коллекция существует только в памяти, для синхронизации с БД нужно вызвать метод [`db.sync()`](/api/database#sync). + +### Поле (Field) + +Соответствует понятию "столбец" в таблице БД. Каждая коллекция может содержать несколько полей: + +```ts +db.collection({ + name: 'users', + fields: [ + { type: 'string', name: 'name' } + { type: 'integer', name: 'age' } + // Другие поля + ], +}); +``` + +Обязательные параметры поля - имя (`name`) и тип (`type`). Все типы полей описаны в разделе [Список встроенных типов полей](/api/database/field#Список-встроенных-типов-полей). + +## Пример + +Рассмотрим пример плагина интернет-магазина для демонстрации моделирования данных. + +### Определение коллекций в плагине + +Создадим коллекцию товаров `products` в файле `collections/products.ts`: + +```ts +export default { + name: 'products', + fields: [ + { + type: 'string', + name: 'title', + }, + { + type: 'integer', + name: 'price', + }, + { + type: 'boolean', + name: 'enabled', + }, + { + type: 'integer', + name: 'inventory', + }, + ], +}; +``` + +Загружаем коллекцию в основном классе плагина: + +```ts +import path from 'path'; +import { Plugin } from '@nocobase/server'; + +export default class ShopPlugin extends Plugin { + async load() { + await this.db.import({ + directory: path.resolve(__dirname, 'collections'), + }); + + this.app.acl.allow('products', '*'); + this.app.acl.allow('categories', '*'); + this.app.acl.allow('orders', '*'); + } +} +``` + +Для тестирования временно разрешаем полный доступ к данным. Автоматически генерируются CRUD API: + +- `GET /api/products:list` - список товаров +- `GET /api/products:get?filterByTk=` - товар по ID +- `POST /api/products` - создать товар +- `PUT /api/products:update?filterByTk=` - обновить товар +- `DELETE /api/products:destroy?filterByTk=` - удалить товар + +### Связи между коллекциями + +Добавим коллекцию категорий `collections/categories.ts`: + +```ts +export default { + name: 'categories', + fields: [ + { + type: 'string', + name: 'title', + }, + { + type: 'hasMany', + name: 'products', + }, + ], +}; +``` + +Добавим связь в коллекции товаров: + +```ts +{ + name: 'products', + fields: [ + // ... + { + type: 'belongsTo', + name: 'category', + target: 'categories', + } + ] +} +``` + +Это определяет отношение "многие-к-одному" между товарами и категориями. Доступные API: + +- `GET /api/products:list?appends=category` - товары с категориями +- `GET /api/categories//products:list` - товары категории + +NocoBase поддерживает 4 типа связей: +- [`belongsTo`](/api/database/field#belongsto) +- [`belongsToMany`](/api/database/field#belongstomany) +- [`hasMany`](/api/database/field#hasmany) +- [`hasOne`](/api/database/field#hasone) + +# Расширение существующих коллекций + +В дополнение к коллекциям товаров и категорий, нам нужна коллекция заказов. Создадим файл `collections/orders.ts`: + +```ts +export default { + name: 'orders', + fields: [ + { + type: 'uuid', + name: 'id', + primaryKey: true, + }, + { + type: 'belongsTo', + name: 'product', + }, + { + type: 'integer', + name: 'quantity', + }, + { + type: 'integer', + name: 'totalPrice', + }, + { + type: 'integer', + name: 'status', + }, + { + type: 'string', + name: 'address', + }, + { + type: 'belongsTo', + name: 'user', + }, + ], +}; +``` + +Для простоты связь между заказами и товарами определена как "многие-к-одному". Также добавлена связь с пользователями (встроенная коллекция NocoBase). + +Чтобы расширить коллекцию пользователей, создадим `collections/users.ts`: + +```ts +import { extend } from '@nocobase/database'; + +export extend({ + name: 'users', + fields: [ + { + type: 'hasMany', + name: 'orders' + } + ] +}); +``` + +Теперь можно получать заказы пользователя через `GET /api/users//orders:list`. + +## Расширение типов полей + +Для поля `id` в заказах используем тип `uuid`. Чтобы создать собственный тип (например, Snowflake ID), создадим файл `fields/snowflake.ts`: + +```ts +import { Snowflake } from 'nodejs-snowflake'; +import { DataTypes, Field, BaseColumnFieldOptions } from '@nocobase/database'; + +export interface SnowflakeFieldOptions extends BaseColumnFieldOptions { + type: 'snowflake'; + epoch: number; + instanceId: number; +} + +export class SnowflakeField extends Field { + get dataType() { + return DataTypes.BIGINT; + } + + constructor(options: SnowflakeFieldOptions, context) { + super(options, context); + const { epoch, instanceId } = options; + this.generator = new Snowflake({ epoch, instanceId }); + } + + setValue = (instance) => { + const { name } = this.options; + instance.set(name, this.generator.getUniqueID()); + }; + + bind() { + super.bind(); + this.on('beforeCreate', this.setValue); + } + + unbind() { + super.unbind(); + this.off('beforeCreate', this.setValue); + } +} + +export default SnowflakeField; +``` + +Регистрируем тип в основном файле плагина: + +```ts +import SnowflakeField from './fields/snowflake'; + +export default class ShopPlugin extends Plugin { + initialize() { + this.db.registerFieldTypes({ + snowflake: SnowflakeField, + }); + } +} +``` + +Теперь можно использовать тип `snowflake`: + +```ts +{ + name: 'orders', + fields: [ + { + type: 'snowflake', + name: 'id', + primaryKey: true + } + ] +} +``` + +## Итог + +Мы рассмотрели: +1. Создание коллекций и полей +2. Определение связей между коллекциями +3. Расширение существующих коллекций +4. Создание новых типов полей + +Пример кода доступен в [packages/samples/shop-modeling](https://github.com/nocobase/nocobase/tree/main/packages/samples/shop-modeling). diff --git a/docs/ru-RU/development/server/collections/association-fields.md b/docs/ru-RU/development/server/collections/association-fields.md new file mode 100755 index 0000000000..c178a522ea --- /dev/null +++ b/docs/ru-RU/development/server/collections/association-fields.md @@ -0,0 +1,165 @@ +### **Поля связей** + +В реляционной базе данных стандартный способ создания связи между таблицами — добавление поля внешнего ключа и ограничения внешнего ключа. Например, Knex создаёт таблицу по следующему образцу: + +```js +knex.schema.table('posts', function (table) { + table.integer('userId').unsigned(); + table.foreign('userId').references('users.id'); +}); +``` + +Этот код создаёт поле `userId` в таблице `posts` и устанавливает ограничение внешнего ключа `posts.userId`, ссылающееся на `users.id`. В NocoBase такая связь создаётся путём настройки поля связи, например: + +```js +{ + name: 'posts', + fields: [ + { + type: 'belongsTo', + name: 'user', + target: 'users', + foreignKey: 'userId', + }, + ], +} +``` + +#### **Параметры связей** + +##### **BelongsTo** + +```ts +interface BelongsTo { + type: 'belongsTo'; + name: string; + // по умолчанию — множественное число от name + target?: string; + // по умолчанию — первичный ключ целевой модели, обычно 'id' + targetKey?: any; + // по умолчанию — target + 'Id' + foreignKey?: any; +} +``` + +// Первичный ключ `id` таблицы `authors` связан с внешним ключом `authorId` таблицы `books` + +```js +{ + name: 'books', + fields: [ + { + type: 'belongsTo', + name: 'author', + target: 'authors', + targetKey: 'id', // первичный ключ таблицы authors + foreignKey: 'authorId', // внешний ключ в таблице books + } + ], +} +``` + +##### **HasOne** + +```ts +interface HasOne { + type: 'hasOne'; + name: string; + // по умолчанию — множественное число от name + target?: string; + // по умолчанию — первичный ключ исходной модели, обычно 'id' + sourceKey?: string; + // по умолчанию — имя исходной коллекции в единственном числе + 'Id' + foreignKey?: string; +} +``` + +// Первичный ключ `id` таблицы `users` связан с внешним ключом `userId` таблицы `profiles` + +```js +{ + name: 'users', + fields: [ + { + type: 'hasOne', + name: 'profile', + target: 'profiles', + sourceKey: 'id', // первичный ключ таблицы users + foreignKey: 'userId', // внешний ключ в таблице profiles + } + ], +} +``` + +##### **HasMany** + +```ts +interface HasMany { + type: 'hasMany'; + name: string; + // по умолчанию — name + target?: string; + // по умолчанию — первичный ключ исходной модели, обычно 'id' + sourceKey?: string; + // по умолчанию — имя исходной коллекции в единственном числе + 'Id' + foreignKey?: string; +} +``` + +// Первичный ключ `id` таблицы `posts` связан с внешним ключом `postId` таблицы `comments` + +```js +{ + name: 'posts', + fields: [ + { + type: 'hasMany', + name: 'comments', + target: 'comments', + sourceKey: 'id', // первичный ключ таблицы posts + foreignKey: 'postId', // внешний ключ в таблице comments + } + ], +} +``` + +##### **BelongsToMany** + +```ts +interface BelongsToMany { + type: 'belongsToMany'; + name: string; + // по умолчанию — name + target?: string; + // по умолчанию — имя исходной коллекции и целевой, в алфавитном порядке + through?: string; + // по умолчанию — имя исходной коллекции в единственном числе + 'Id' + foreignKey?: string; + // по умолчанию — первичный ключ исходной модели, обычно 'id' + sourceKey?: string; + // по умолчанию — имя целевой таблицы в единственном числе + 'Id' + otherKey?: string; + // по умолчанию — первичный ключ целевой модели, обычно 'id' + targetKey?: string; +} +``` + +// Первичные ключи таблиц `tags` и `posts`, а также два внешних ключа таблицы `posts_tags` связаны между собой + +```js +{ + name: 'posts', + fields: [ + { + type: 'belongsToMany', + name: 'tags', + target: 'tags', + through: 'posts_tags', // промежуточная таблица + foreignKey: 'tagId', // внешний ключ 1, в таблице posts_tags + otherKey: 'postId', // внешний ключ 2, в таблице posts_tags + targetKey: 'id', // первичный ключ таблицы tags + sourceKey: 'id', // первичный ключ таблицы posts + } + ], +} +``` diff --git a/docs/ru-RU/development/server/collections/cm.svg b/docs/ru-RU/development/server/collections/cm.svg new file mode 100755 index 0000000000..3f1c22d7c7 --- /dev/null +++ b/docs/ru-RU/development/server/collections/cm.svg @@ -0,0 +1 @@ +
    Collection Manager Plugin

    Provide rest api to manage collections
    REST API
    Plugin A
    db.collection()
    Collections
    UI: Collections & Fields
    UI: Graphical interface
    Plugin B
    db.collection()
    Third party
    diff --git a/docs/ru-RU/development/server/collections/collection-field.svg b/docs/ru-RU/development/server/collections/collection-field.svg new file mode 100755 index 0000000000..dcaf68ad07 --- /dev/null +++ b/docs/ru-RU/development/server/collections/collection-field.svg @@ -0,0 +1 @@ +
    Field Type
    Field Component
    Field Interface
    Collection Field
    diff --git a/docs/ru-RU/development/server/collections/collection-template.md b/docs/ru-RU/development/server/collections/collection-template.md new file mode 100755 index 0000000000..13c0789320 --- /dev/null +++ b/docs/ru-RU/development/server/collections/collection-template.md @@ -0,0 +1,74 @@ +# Шаблоны коллекций + +В реальных бизнес-сценариях разные коллекции могут иметь свои правила инициализации и бизнес-логику. NocoBase решает такие проблемы с помощью шаблонов коллекций. + +## Обычные коллекции + +```ts +db.collection({ + name: 'posts', + fields: [ + { + type: 'string', + name: 'title', + }, + ], +}); +``` + +## Древовидные коллекции + +```ts +db.collection({ + name: 'categories', + tree: 'adjacency-list', + fields: [ + { + type: 'string', + name: 'name', + }, + { + type: 'string', + name: 'description', + }, + { + type: 'belongsTo', + name: 'parent', + target: 'categories', + foreignKey: 'parentId', + }, + { + type: 'hasMany', + name: 'children', + target: 'categories', + foreignKey: 'parentId', + }, + ], +}); +``` + +## Наследуемые коллекции + +```ts +db.collection({ + name: 'a', + fields: [], +}); + +db.collection({ + name: 'b', + inherits: 'a', + fields: [], +}); +``` + +## Другие шаблоны + +Например, для календарных коллекций при инициализации требуются специальные поля cron и exclude, которые определяются шаблоном: + +```ts +db.collection({ + name: 'events', + template: 'calendar', +}); +``` diff --git a/docs/ru-RU/development/server/collections/configure.md b/docs/ru-RU/development/server/collections/configure.md new file mode 100755 index 0000000000..6431f34e5b --- /dev/null +++ b/docs/ru-RU/development/server/collections/configure.md @@ -0,0 +1,71 @@ +# Настройка коллекций + +В NocoBase существует три способа настройки коллекций. + + + +## Настройка через интерфейс + +Для бизнес-данных рекомендуется использовать интерфейс. Платформа NocoBase предоставляет два варианта: + +### Обычный табличный интерфейс + + + +### Графический интерфейс + + + +## Определение в коде плагина + +В плагинах пользовательские коллекции должны располагаться в директории `src/server/collections/*.ts`: + +```ts +import { defineCollection } from '@nocobase/database'; + +export default defineCollection({ + name: 'examples', +}); +``` + +Для расширения существующей коллекции используйте `extendCollection()`: + +```ts +import { extendCollection } from '@nocobase/database'; + +export default extendCollection({ + name: 'examples', +}); +``` + +Ссылки на API: +- [defineCollection()](/api/database#definecollection) +- [extendCollection()](/api/database#extendcollection) + +:::info{title="ИНФОРМАЦИЯ"} +Коллекции в плагинах автоматически синхронизируются с БД при активации плагина. Если плагин уже активен, используйте команду `yarn nocobase upgrade` для синхронизации. +::: + +## Управление через REST API + +Третьи стороны могут управлять таблицами через HTTP-интерфейс (требуются права): + +### Коллекции + +```bash +GET /api/collections +POST /api/collections +GET /api/collections/ +PUT /api/collections/ +DELETE /api/collections/ +``` + +### Поля коллекций + +```bash +GET /api/collections//fields +POST /api/collections//fields +GET /api/collections//fields/ +PUT /api/collections//fields/ +DELETE /api/collections//fields/ +``` diff --git a/docs/ru-RU/development/server/collections/field-extension.md b/docs/ru-RU/development/server/collections/field-extension.md new file mode 100755 index 0000000000..f049db8636 --- /dev/null +++ b/docs/ru-RU/development/server/collections/field-extension.md @@ -0,0 +1,39 @@ +# Как расширить поля + +Состав поля коллекции в NocoBase состоит из + + + +## Расширить тип поля + +Например, чтобы расширить поле ввода пароля введите: 'password'` + +```ts +export class MyPlugin extends Plugin { + beforeLoad() { + this.db.registerFieldTypes({ + password: PasswordField, + }); + } +} + +export class PasswordField extends Field { + get dataType() { + return DataTypes.STRING; + } +} +``` + +- [С другими реализациями встроенных типов полей можно ознакомиться здесь](https://github.com/nocobase/nocobase/tree/main/packages/core/database/src/fields) +- Также смотрите полные образцы плагина [пакеты/образцы/магазин-моделирование](https://github.com/nocobase/nocobase/tree/main/packages/samples/shop-modeling) + +## Расширить полевой компонент + +Соответствующую документацию по расширению можно найти здесь + +- [Расширение компонентов схемы](/development/client/ui-schema-designer/extending-schema-components) +- [[Библиотека компонентов Schema](/development/client/ui-schema-designer/component-library) + +## Расширить полевой интерфейс + +- [Встроенные полевые интерфейсы можно посмотреть здесь](https://github.com/nocobase/nocobase/tree/main/packages/core/client/src/collection-manager/interfaces) diff --git a/docs/ru-RU/development/server/collections/graph.jpg b/docs/ru-RU/development/server/collections/graph.jpg new file mode 100755 index 0000000000..16c2f95d12 Binary files /dev/null and b/docs/ru-RU/development/server/collections/graph.jpg differ diff --git a/docs/ru-RU/development/server/collections/index.md b/docs/ru-RU/development/server/collections/index.md new file mode 100755 index 0000000000..a46ffde7f7 --- /dev/null +++ b/docs/ru-RU/development/server/collections/index.md @@ -0,0 +1,198 @@ +### **Основные понятия** + +#### **Коллекция** + +Коллекция — это набор данных различных типов, например, заказы, товары, пользователи, комментарии и т.д. Разные коллекции различаются по имени, например: + +```js +// Заказы +{ + name: 'orders', +} +// Товары +{ + name: 'products', +} +// Пользователи +{ + name: 'users', +} +// Комментарии +{ + name: 'comments', +} +``` + +#### **Поле коллекции** + +Каждая коллекция содержит несколько полей. + +```js +// Конфигурация коллекции +{ + name: 'users', + fields: [ + { type: 'string', name: 'name' }, + { type: 'integer', name: 'age' }, + // Другие поля + ], +} +// Пример данных +[ + { + name: 'Jason', + age: 20, + }, + { + name: 'Li Si', + age: 18, + } +]; +``` + +Состав поля коллекции в NocoBase: + +``` +./collection-field.svg +``` + +#### **Тип поля** + +Разные поля различаются по имени, а тип указывает на тип данных поля. Типы делятся на **атрибутные** и **связанные**: + +**Атрибут — Атрибутный тип** +``` +string +text +date +boolean +time +float +json +location +password +virtual +... +``` + +**Связь — Тип связи** +``` +hasOne +hasMany +belongsTo +belongsToMany +... +``` + +#### **Компонент поля** + +Поле имеет тип данных, и ввод-вывод значения поля работает корректно, но этого недостаточно. Чтобы отобразить поле на интерфейсе, требуется дополнительная настройка — `uiSchema`, например: + +```js +// Поле email, отображается с помощью компонента Input, с правилом валидации email +{ + type: 'string', + name: 'email', + uiSchema: { + 'x-component': 'Input', + 'x-component-props': { size: 'large' }, + 'x-validator': 'email', + 'x-pattern': 'editable', // режим редактирования, только для чтения, читаемый формат + }, +} + +// Пример данных +{ + email: 'admin@nocobase.com', +} + +// Пример компонента + +``` + +`uiSchema` используется для настройки компонентов поля, отображаемых на интерфейсе. Каждый компонент поля соответствует значению и включает несколько настроек: +- Компонент поля +- Параметры компонента +- Правила валидации поля +- Режим поля (редактируемый, только для чтения, читаемый формат) +- Значение по умолчанию поля +- Другое + +[Подробнее в главе «UI Schema»](/development/client/ui-schema-designer/what-is-ui-schema). + +Встроенные компоненты полей NocoBase: +``` +Input +InputNumber +Select +Radio +Checkbox +... +``` + +#### **Интерфейс поля** + +Используя тип поля и компонент поля, можно свободно комбинировать несколько полей. Такой шаблон называется **интерфейс поля**, например: + +```js +// Поле email: string + Input, с правилом валидации email +{ + type: 'string', + name: 'email', + uiSchema: { + 'x-component': 'Input', + 'x-component-props': {}, + 'x-validator': 'email', + }, +} + +// Поле телефона: string + Input, с правилом валидации телефона +{ + type: 'string', + name: 'phone', + uiSchema: { + 'x-component': 'Input', + 'x-component-props': {}, + 'x-validator': 'phone', + }, +} +``` + +Для каждого из полей выше требуется полная настройка `uiSchema`, что неудобно. Чтобы упростить конфигурацию, вводится понятие **интерфейс поля**, которое позволяет шаблонизировать параметры, например: + +```ts +// Шаблон для поля email +interface email { + type: 'string'; + uiSchema: { + 'x-component': 'Input', + 'x-component-props': {}, + 'x-validator': 'email', + }; +} + +// Шаблон для поля телефона +interface phone { + type: 'string'; + uiSchema: { + 'x-component': 'Input', + 'x-component-props': {}, + 'x-validator': 'phone', + }; +} + +// Упрощённая конфигурация поля +// email +{ + interface: 'email', + name: 'email', +} + +// phone +{ + interface: 'phone', + name: 'phone', +} +``` + +[Другие интерфейсы полей здесь](https://github.com/nocobase/nocobase/tree/main/packages/core/client/src/collection-manager/interfaces) diff --git a/docs/ru-RU/development/server/collections/options.md b/docs/ru-RU/development/server/collections/options.md new file mode 100755 index 0000000000..c143b48ea0 --- /dev/null +++ b/docs/ru-RU/development/server/collections/options.md @@ -0,0 +1,143 @@ +# Протокол коллекций + +Коллекция - это основа NocoBase, протокол для описания структур данных (коллекций и полей), близкий к концепции реляционных баз данных, но не ограниченный ими. Может также использоваться для NoSQL баз данных, HTTP API и других источников данных. + + + +На текущем этапе протокол Collection основан на интерфейсе реляционных БД (db.collections), поддержка NoSQL и HTTP API будет добавлена позже. + +Протокол Collection состоит из двух частей: CollectionOptions и FieldOptions. Поскольку Field расширяем, параметры FieldOptions очень гибкие. + +## CollectionOptions + +```ts +interface CollectionOptions { + name: string; // Название коллекции + title?: string; // Отображаемое имя + // Древовидная структура: + tree?: 'adjacency-list' | 'closure-table' | 'materialized-path' | 'nested-set'; + // Наследование: + inherits?: string | string[]; + // Поля коллекции: + fields?: FieldOptions[]; + // Автоматические временные метки: + timestamps?: boolean; + // Мягкое удаление: + paranoid?: boolean; + // Сортировка: + sortable?: CollectionSortable; + // Модель: + model?: string; + // Репозиторий: + repository?: string; + [key: string]: any; +} + +type CollectionSortable = string | boolean | { name?: string; scopeKey?: string }; +``` + +## FieldOptions + +Базовые параметры поля: + +```ts +interface FieldOptions { + name: string; // Имя поля + type: string; // Тип поля + hidden?: boolean; // Скрытое поле + index?: boolean; // Индексируемое поле + interface?: string; // Интерфейс поля + uiSchema?: ISchema; // Схема UI +``` + +[Подробнее о UI Schema](/development/client/ui-schema-designer/what-is-ui-schema) + +### Типы полей + +Типы полей включают атрибутивные и ассоциативные. + +**Атрибутивные типы** + +- 'boolean' - Логический +- 'integer' - Целое число +- 'bigInt' - Большое целое +- 'double' - Двойная точность +- 'real' - Вещественное +- 'decimal' - Десятичное +- 'string' - Строка +- 'text' - Текст +- 'password' - Пароль +- 'date' - Дата +- 'time' - Время +- 'array' - Массив +- 'json' - JSON +- 'jsonb' - JSON бинарный +- 'uuid' - UUID +- 'uid' - UID +- 'formula' - Формула +- 'radio' - Радио +- 'sort' - Сортировка +- 'virtual' - Виртуальное + +**Ассоциативные типы** + +- 'belongsTo' - Принадлежит к +- 'hasOne' - Имеет один +- 'hasMany' - Имеет много +- 'belongsToMany' - Принадлежит ко многим + +### Интерфейсы полей + +**Базовые** + +- input - Поле ввода +- textarea - Текстовая область +- phone - Телефон +- email - Email +- integer - Целое число +- number - Число +- percent - Процент +- password - Пароль +- icon - Иконка + +**Выбор** + +- checkbox - Чекбокс +- select - Выпадающий список +- multipleSelect - Множественный выбор +- radioGroup - Группа радио-кнопок +- checkboxGroup - Группа чекбоксов +- chinaRegion - Китайские регионы + +**Медиа** + +- attachment - Вложение +- markdown - Markdown +- richText - Текстовый редактор + +**Дата и время** + +- datetime - Дата и время +- time - Время + +**Связи** + +- linkTo - `type: 'believesToMany'` +- oho - `type: 'hasOne'` +- obo - `type: 'believesTo'` +- o2m - `type: 'hasMany'` +- m2o - `type: 'believesTo'` +- m2m - `type: 'believesToMany'` + +**Продвинутые** + +- formula - Формула +- sequence - Последовательность + +**Системная информация** + +- id - ID +- createdAt - Дата создания +- createdBy - Создано +- updatedAt - Дата обновления +- updatedBy - Обновлено diff --git a/docs/ru-RU/development/server/collections/schema.svg b/docs/ru-RU/development/server/collections/schema.svg new file mode 100755 index 0000000000..038728b5b2 --- /dev/null +++ b/docs/ru-RU/development/server/collections/schema.svg @@ -0,0 +1 @@ +
    Collection
    Field Type
    Field Component
    UI Schema
    Field Interface
    Collection Field
    Relational Database
    PostgreSQL
    NoSQL
    API
    SQLite
    MySQL
    Others
    Resource
    Client
    diff --git a/docs/ru-RU/development/server/collections/table.jpg b/docs/ru-RU/development/server/collections/table.jpg new file mode 100755 index 0000000000..55fe4c183d Binary files /dev/null and b/docs/ru-RU/development/server/collections/table.jpg differ diff --git a/docs/ru-RU/development/server/commands.md b/docs/ru-RU/development/server/commands.md new file mode 100644 index 0000000000..ddf3228986 --- /dev/null +++ b/docs/ru-RU/development/server/commands.md @@ -0,0 +1,37 @@ +# Команды + +В плагине пользовательские команды должны быть расположены в каталоге `src/server/commands/*.ts` плагина. Содержимое должно выглядеть следующим образом: + +```ts +import { Application } from '@nocobase/server'; + +export default function(app: Application) { + app + .command('echo') + .option('-v, --version') + .action(async ([options]) => { + console.log('Hello World!'); + if (options.version) { + console.log('Current version:', await app.version.get()); + } + }); +} +``` + +:::предупреждение +Пользовательские команды в плагине вступают в силу только после установки и активации плагина. +::: + +Специальные настройки для команд: + +- `ipc()` Когда приложение запущено, командная строка отправляет инструкции через ipc для работы с запущенным экземпляром приложения. Без настройки "ipc()" для выполнения команды будет создан новый экземпляр приложения (это не повлияет на работу запущенного экземпляра приложения). +- `auth()` Выполняет проверку базы данных. Если конфигурация базы данных неверна, команда выполнена не будет. +- `preload()` Определяет, следует ли предварительно загружать конфигурацию приложения, т.е. выполнять `app.load()`. + +Эти конфигурации могут быть скорректированы в соответствии с фактическим использованием команды, как показано в примерах ниже: + +```ts +app.command('a').ipc().action() +app.command('a').auth().action() +app.command('a').preload().action() +``` diff --git a/docs/ru-RU/development/server/events.md b/docs/ru-RU/development/server/events.md new file mode 100644 index 0000000000..293dd6096e --- /dev/null +++ b/docs/ru-RU/development/server/events.md @@ -0,0 +1,171 @@ +### **События** + +NocoBase предоставляет большое количество слушателей событий в жизненном цикле приложения, плагинов и базы данных. Эти методы выполняются только при возникновении соответствующего события. + +#### **Как добавить слушатели событий?** + +Регистрация событий обычно размещается в `afterAdd` или `beforeLoad`: + +```ts +export class MyPlugin extends Plugin { + // afterAdd() выполняется после добавления плагина, активирован он или нет + afterAdd() { + this.app.on(); + this.db.on(); + } + + // beforeLoad() выполняется только после активации плагина + beforeLoad() { + this.app.on(); + this.db.on(); + } +} +``` + +#### **`db.on`** + +События, связанные с базой данных, относятся к настройке коллекций, операциям CRUD репозитория и включают: + +- `'beforeSync' / 'afterSync'` +- `'beforeValidate' / 'afterValidate'` +- `'beforeCreate' / 'afterCreate'` +- `'beforeUpdate' / 'afterUpdate'` +- `'beforeSave' / 'afterSave'` +- `'beforeDestroy' / 'afterDestroy'` +- `'afterCreateWithAssociations'` +- `'afterUpdateWithAssociations'` +- `'afterSaveWithAssociations'` +- `'beforeDefineCollection'` +- `'afterDefineCollection'` +- `'beforeRemoveCollection' / 'afterRemoveCollection'` + +Более подробно см. в разделе [API базы данных](/api/database). + +#### **`app.on()`** + +События приложения связаны с его жизненным циклом и включают: + +- `'beforeLoad' / 'afterLoad'` +- `'beforeInstall' / 'afterInstall'` +- `'beforeUpgrade' / 'afterUpgrade'` +- `'beforeStart' / 'afterStart'` +- `'beforeStop' / 'afterStop'` +- `'beforeDestroy' / 'afterDestroy'` + +Подробнее см. в разделе [API приложения](/api/server/application#Events). + +#### **Примеры** + +Рассмотрим простой интернет-магазин. Моделирование связанных коллекций можно посмотреть в разделе [Коллекции и поля](/development/). + +##### **Списание товара из остатков после создания заказа** + +Обычно у нас есть отдельные коллекции для товаров и заказов. Проблему перепродажи можно решить, вычитая количество товара из остатков после оформления заказа. В этом случае можно определить соответствующее событие для действия «Создание заказа»: + +```ts +class ShopPlugin extends Plugin { + beforeLoad() { + this.db.on('orders.afterCreate', async (order, options) => { + const product = await order.getProduct({ + transaction: options.transaction, + }); + + await product.update( + { + inventory: product.inventory - order.quantity, + }, + { + transaction: options.transaction, + }, + ); + }); + } +} +``` + +Так как события Sequelize по умолчанию содержат информацию о транзакции, мы можем использовать её напрямую, чтобы гарантировать выполнение обоих действий в одной транзакции. + +Аналогично можно изменить статус заказа на «Отправлен» после создания записи доставки: + +```ts +class ShopPlugin extends Plugin { + load() { + this.db.on('deliveries.afterCreate', async (delivery, options) => { + const orderRepo = this.db.getRepository('orders'); + await orderRepo.update({ + filterByTk: delivery.orderId, + value: { + status: 2 + }, + transaction: options.transaction + }); + }); + } +} +``` + +##### **Планировщик задач, работающий параллельно с приложением** + +Не рассматривая сложные случаи, такие как использование плагина рабочих процессов, можно реализовать простой механизм задач по расписанию через события уровня приложения. Задача будет привязана к процессу приложения и остановится при его завершении. Например, можно регулярно проверять все заказы и автоматически помечать их как полученные по истечении срока. + +```ts +class ShopPlugin extends Plugin { + timer = null; + orderReceiveExpires = 86400 * 7; + + checkOrder = async () => { + const expiredDate = new Date(Date.now() - this.orderReceiveExpires); + const deliveryRepo = this.db.getRepository('deliveries'); + const expiredDeliveries = await deliveryRepo.find({ + fields: ['id', 'orderId'], + filter: { + status: 0, + createdAt: { + $lt: expiredDate, + }, + }, + }); + await deliveryRepo.update({ + filter: { + id: expiredDeliveries.map((item) => item.get('id')), + }, + values: { + status: 1, + }, + }); + const orderRepo = this.db.getRepository('orders'); + const [updated] = await orderRepo.update({ + filter: { + status: 2, + id: expiredDeliveries.map((item) => item.get('orderId')), + }, + values: { + status: 3, + }, + }); + + console.log('%d заказов просрочено', updated); + }; + + load() { + this.app.on('beforeStart', () => { + // выполнять каждую минуту + this.timer = setInterval(this.checkOrder, 1000 * 60); + }); + + this.app.on('beforeStop', () => { + clearInterval(this.timer); + this.timer = null; + }); + } +} +``` + +#### **Заключение** + +Приведённые примеры дают базовое понимание того, как работают события и как их можно использовать для расширения функциональности. + +- События, связанные с базой данных +- События, связанные с приложением + +Примеры кода из этой главы интегрированы в пакет [packages/samples/shop-events](https://github.com/nocobase/nocobase/tree/main/packages/samples/shop-events) и могут быть запущены локально для проверки результата. diff --git a/docs/ru-RU/development/server/i18n.md b/docs/ru-RU/development/server/i18n.md new file mode 100644 index 0000000000..6465da8606 --- /dev/null +++ b/docs/ru-RU/development/server/i18n.md @@ -0,0 +1,115 @@ +# Интернационализация (i18n) + +## Файлы локализации + +В плагине файлы интернационализации для фронтенда и бэкенда хранятся в папке `src/locale`. Нажмите здесь, чтобы увидеть [все поддерживаемые языки](/development/others/languages) в NocoBase. + +```bash +|- /plugin-sample-i18n + |- /src + |- /locale # Папка с файлами локализации + |- en_US.ts # Файл английского языка + |- zh_CN.ts # Файл китайского языка +``` + +Просто добавьте записи переводов в соответствующие файлы локализации (`/src/locale/${lang}.ts`). Если вы добавляете файл локализации впервые, приложение необходимо перезапустить для применения изменений. Вы можете проверить API `app:getLang`, чтобы убедиться, что записи переводов были успешно добавлены. + +http://localhost:13000/api/app:getLang?locale=ru-RU + +## Как реализовать поддержку интернационализации + +На сервере есть два экземпляра i18n: app.i18n и ctx.i18n. + +### app.i18n + +app.i18n - это глобальный экземпляр i18n, обычно используемый в CLI. Например, его можно комбинировать с inquirer для реализации интерактивных командных строк. + +```ts +import { select } from '@inquirer/select'; +import { input } from '@inquirer/input'; + +export class PluginSampleI18nServer extends Plugin { + load() { + this.app.command('test-i18n').action(async () => { + const answer1 = await select({ + message: 'Выберите язык', + choices: [ + { + name: 'Русский', + value: 'ru-RU', + }, + { + name: 'English', + value: 'en-US', + }, + ], + }); + await this.app.changeLanguage(answer1); + const answer2 = await input({ + message: this.app.i18n.t('Введите ваше имя'), + }); + console.log(this.app.i18n.t(`Ваше имя: {{name}}`, { name: answer2 })); + }); + } +} +``` + +### ctx.i18n + +Это клонированный экземпляр глобального app.i18n. Каждый запрос ctx полностью независим и отвечает на информацию о языке в соответствии с языком клиента. + +Параметры клиентского запроса могут быть указаны в query string: + +```bash +GET /?locale=ru-RU HTTP/1.1 +Host: localhost:13000 +``` + +Или в заголовках запроса (рекомендуется): + +```bash +GET / HTTP/1.1 +Host: localhost:13000 +X-Locale: ru-RU +``` + +Пример: + +```ts +export class PluginSampleI18nServer extends Plugin { + load() { + this.app.use(async (ctx, next) => { + if (ctx.path === '/api/test-i18n') { + ctx.body = `${ctx.i18n.t('Привет')} ${ctx.i18n.t('Мир')}`; + } + await next(); + }); + } +} +``` + +Посетите http://localhost:13000/api/test-i18n?locale=ru-RU + +## API + +Интернационализация в NocoBase реализована на основе i18next. Подробные инструкции по использованию см. в [документации API I18next](https://www.i18next.com/overview/api). Ниже приведены некоторые важные примеры. + +### i18n.t() + +Локализация каждого плагина различается по пространству имен (ns), которое соответствует имени плагина, например: + +```ts +t('Привет', { ns: '@nocobase/plugin-sample-i18n' }); +``` + +### i18n.changeLanguage() + +Для изменения текущего языка: + +```ts +await i18n.changeLanguage('ru-RU'); +``` + +## Полный пример плагина + +- [@nocobase/plugin-sample-i18n](#) diff --git a/docs/ru-RU/development/server/image-1.png b/docs/ru-RU/development/server/image-1.png new file mode 100644 index 0000000000..4adc3127c5 Binary files /dev/null and b/docs/ru-RU/development/server/image-1.png differ diff --git a/docs/ru-RU/development/server/image-2.png b/docs/ru-RU/development/server/image-2.png new file mode 100644 index 0000000000..e279fb28f2 Binary files /dev/null and b/docs/ru-RU/development/server/image-2.png differ diff --git a/docs/ru-RU/development/server/image.png b/docs/ru-RU/development/server/image.png new file mode 100644 index 0000000000..473358cb1d Binary files /dev/null and b/docs/ru-RU/development/server/image.png differ diff --git a/docs/ru-RU/development/server/index.md b/docs/ru-RU/development/server/index.md new file mode 100644 index 0000000000..403f2008ba --- /dev/null +++ b/docs/ru-RU/development/server/index.md @@ -0,0 +1,117 @@ +### **Структура серверной части плагина** + +Структура каталога, связанного с серверной частью инициализированного пустого плагина, выглядит следующим образом: + +``` +|- /plugin-sample-hello + |- /src + |- /server # Серверный код плагина + |- plugin.ts # Класс плагина + |- index.ts # Точка входа серверной части + |- server.d.ts + |- server.js +``` + +#### **Плагин** + +Файл `plugin.ts` позволяет вызывать различные методы на разных этапах жизненного цикла плагина. + +```ts +import { InstallOptions, Plugin } from '@nocobase/server'; + +export class PluginSampleHelloServer extends Plugin { + afterAdd() { + // Вызывается после регистрации плагина через pm.add. + // В основном используется для установки слушателей события app.beforeLoad + this.app.on('beforeLoad'); + } + + beforeLoad() { + // Настройка классов или методов + this.db.registerFieldTypes(); + this.db.registerModels(); + this.db.registerRepositories(); + this.db.registerOperators(); + // Слушатели событий + this.app.on(); + this.db.on(); + } + + async load() { + // Определение коллекции + this.db.collection(); + // Импорт конфигураций коллекций + this.db.import(); + this.db.addMigrations(); + + // Определение ресурса + this.resourcer.define(); + // Регистрация действий ресурса + this.resourcer.registerActions(); + + // Регистрация промежуточного ПО (middleware) + this.resourcer.use(); + this.acl.use(); + this.app.use(); + + this.app.i18n; + // Пользовательские команды + this.app.command(); + } + + async install(options?: InstallOptions) { + // Логика установки + } + + async afterEnable() { + // После активации + } + + async afterDisable() { + // После деактивации + } + + async remove() { + // Логика удаления + } +} + +export default PluginSampleHelloServer; +``` + +#### **Жизненный цикл плагина** + +![Жизненный цикл](./image.png) + +- После инициализации плагина вызывается `afterAdd`. На этом этапе не все остальные плагины могут быть ещё созданы. +- В `beforeLoad` все активированные плагины уже инстанцированы, и их экземпляры можно получить через `app.pluginManager.get()`. +- В `load` метод `beforeLoad` всех плагинов уже выполнен. + +#### **Основные свойства и методы класса плагина** + +| API | Описание | +| --- | --- | +| `this.name` | Название плагина | +| `this.enabled` | Активирован ли плагин | +| `this.installed` | Установлен ли плагин | +| `this.app` | Экземпляр приложения | +| `this.pm` | Экземпляр менеджера плагинов | +| `this.db` | Экземпляр базы данных | +| `this.resourcer` | Менеджер ресурсов | +| `this.acl` | Система контроля доступа | +| `this.log` | Логирование | +| `this.app.i18n` | Интернационализация | +| `this.db.registerFieldTypes()` | Регистрация типов полей | +| `this.db.registerModels()` | Регистрация моделей | +| `this.db.registerRepositories()` | Регистрация репозиториев | +| `this.db.registerOperators()` | Регистрация пользовательских операторов | +| `this.app.on()` | События приложения | +| `this.db.on()` | События базы данных | +| `this.db.collection()` | Настройка таблиц данных | +| `this.db.import()` | Импорт конфигураций таблиц данных | +| `this.db.addMigrations()` | Миграции | +| `this.resourcer.registerActions()` | Регистрация действий ресурса | +| `this.resourcer.use()` | Промежуточное ПО (middleware) | +| `this.acl.use()` | Промежуточное ПО (middleware) | +| `this.app.use()` | Промежуточное ПО (middleware) | +| `this.app.command()` | Командная строка | diff --git a/docs/ru-RU/development/server/logger.md b/docs/ru-RU/development/server/logger.md new file mode 100644 index 0000000000..5337a7891a --- /dev/null +++ b/docs/ru-RU/development/server/logger.md @@ -0,0 +1,104 @@ +# Логирование + +NocoBase использует систему логирования на основе Winston. По умолчанию логи разделяются на: + +1. Логи API-запросов +2. Логи системных операций +3. Логи выполнения SQL + +Логи API и SQL генерируются внутренними механизмами приложения, а разработчикам плагинов обычно требуется только логирование операций, связанных с их плагинами. + +## Стандартный метод логирования + +NocoBase предоставляет метод для логирования системных операций с выводом в указанный файл: + +```ts +// Базовый метод +app.log.info("сообщение"); + +// В middleware +async function (ctx, next) { + ctx.log.info("сообщение"); +} + +// В плагине +class CustomPlugin extends Plugin { + async load() { + this.log.info("сообщение"); + } +} +``` + +Формат записи: +- Первый параметр - сообщение +- Второй параметр (опционально) - метаданные в формате ключ-значение + +```ts +app.log.info('сообщение', { + module: 'модуль', + submodule: 'подмодуль', + method: 'метод', + key1: 'значение1', + key2: 'значение2' +}); +// => level=info timestamp=2023-12-27 10:30:23 message=сообщение module=модуль submodule=подмодуль method=метод meta={"key1": "значение1", "key2": "значение2"} + +app.log.debug(); +app.log.warn(); +app.log.error(); +``` + +## Вывод в другие файлы + +Для вывода в нестандартный файл: + +```ts +import { createSystemLogger } from '@nocobase/logger'; + +const logger = createSystemLogger({ + dirname: '/путь/', + filename: 'файл', + separateError: true // Отдельный файл для ошибок +}); +``` + +## Кастомные логи + +### `createLogger` + +```ts +import { createLogger } from '@nocobase/logger'; + +const logger = createLogger({ + transports: ['console', 'file', 'dailyRotateFile'], + format: 'logfmt' | 'json' | 'delimiter' +}); +``` + +### `app.createLogger` + +```ts +app.createLogger({ + dirname: '', + filename: 'custom' // /storage/logs/main/custom.log +}); +``` + +### `plugin.createLogger` + +```ts +class CustomPlugin extends Plugin { + async load() { + const logger = this.createLogger({ + dirname: 'custom-plugin', // /storage/logs/main/custom-plugin/YYYY-MM-DD.log + filename: '%DATE%.log', + transports: ['dailyRotateFile'] + }); + } +} +``` + +## Ссылки + +- [Плагин логирования](../../handbook/logger/index.md) +- [API Reference](../../api/logger.md) diff --git a/docs/ru-RU/development/server/middleware.md b/docs/ru-RU/development/server/middleware.md new file mode 100644 index 0000000000..2c20f150df --- /dev/null +++ b/docs/ru-RU/development/server/middleware.md @@ -0,0 +1,166 @@ +### **Промежуточное ПО (Middleware)** + +#### **Как зарегистрировать промежуточное ПО?** + +Метод регистрации промежуточного ПО обычно записывается в методе `load`: + +```ts +export class MyPlugin extends Plugin { + load() { + this.app.acl.use(); + this.app.resourcer.use(); + this.app.use(); + } +} +``` + +#### **Примечания** + +- `app.acl.use()` — добавляет промежуточное ПО на уровне ресурса и разрешений, которое выполняется до проверки прав доступа. +- `app.resourcer.use()` — добавляет промежуточное ПО на уровне ресурса, которое выполняется только при запросе определённого ресурса. +- `app.use()` — добавляет промежуточное ПО на уровне приложения, которое выполняется при каждом запросе. + +#### **Модель «луковицы» (Onion Circle Model)** + +```ts +app.use(async (ctx, next) => { + ctx.body = ctx.body || []; + ctx.body.push(1); + await next(); + ctx.body.push(2); +}); + +app.use(async (ctx, next) => { + ctx.body = ctx.body || []; + ctx.body.push(3); + await next(); + ctx.body.push(4); +}); +``` + +При переходе по адресу `http://localhost:13000/api/hello` браузер вернёт следующие данные: + +```json +{"data": [1,3,4,2]} +``` + +#### **Встроенное промежуточное ПО и порядок выполнения** + +1. `cors` +2. `bodyParser` +3. `i18n` +4. `dataWrapping` +5. `db2resource` +6. `restApi` +7. `parseToken` +8. `checkRole` +9. `acl` +10. `acl.use()` — дополнительное промежуточное ПО +11. `resourcer.use()` — дополнительное промежуточное ПО +12. `action handler` +13. `app.use()` — дополнительное промежуточное ПО + +Вы можете также использовать `before` или `after`, чтобы вставить промежуточное ПО в определённое место по тегу: + +```ts +app.use(m1, { tag: 'restApi' }); +app.resourcer.use(m2, { tag: 'parseToken' }); +app.resourcer.use(m3, { tag: 'checkRole' }); + +// m4 будет выполнено до m1 +app.use(m4, { before: 'restApi' }); + +// m5 будет вставлено между m2 и m3 +app.resourcer.use(m5, { after: 'parseToken', before: 'checkRole' }); +``` + +Если местоположение не указано, порядок выполнения добавленного промежуточного ПО следующий: + +1. Промежуточное ПО, добавленное через `acl.use`, выполняется первым. +2. Затем — через `resourcer.use`, включая обработчик middleware и action handler. +3. И, наконец, промежуточное ПО, добавленное через `app.use`. + +**Пример:** + +```ts +app.use(async (ctx, next) => { + ctx.body = ctx.body || []; + ctx.body.push(1); + await next(); + ctx.body.push(2); +}); + +app.resourcer.use(async (ctx, next) => { + ctx.body = ctx.body || []; + ctx.body.push(3); + await next(); + ctx.body.push(4); +}); + +app.acl.use(async (ctx, next) => { + ctx.body = ctx.body || []; + ctx.body.push(5); + await next(); + ctx.body.push(6); +}); + +app.resourcer.define({ + name: 'test', + actions: { + async list(ctx, next) { + ctx.body = ctx.body || []; + ctx.body.push(7); + await next(); + ctx.body.push(8); + }, + }, +}); +``` + +- При переходе по `http://localhost:13000/api/hello` браузер вернёт: + ```json + {"data": [1,2]} + ``` + +- При переходе по `http://localhost:13000/api/test:list` браузер вернёт: + ```json + {"data": [5,3,7,1,2,8,4,6]} + ``` + +#### **Ресурс не определён** + +Промежуточное ПО, добавленное через `resourcer.use()`, не будет выполнено, если ресурс не определён. + +**Пример:** + +```ts +app.use(async (ctx, next) => { + ctx.body = ctx.body || []; + ctx.body.push(1); + await next(); + ctx.body.push(2); +}); + +app.resourcer.use(async (ctx, next) => { + ctx.body = ctx.body || []; + ctx.body.push(3); + await next(); + ctx.body.push(4); +}); +``` + +При переходе по `http://localhost:13000/api/hello` браузер вернёт: + +```json +{"data": [1,2]} +``` + +В этом примере ресурс `hello` не определён, поэтому выполнение не попадает в `resourcer`, и промежуточное ПО внутри него не выполняется. + +#### **Использование промежуточного ПО** + +TODO + +#### **Пример** + +[samples/ratelimit](https://github.com/nocobase/nocobase/blob/main/packages/samples/ratelimit/) — ограничение частоты запросов по IP-адресу diff --git a/docs/ru-RU/development/server/migration.md b/docs/ru-RU/development/server/migration.md new file mode 100644 index 0000000000..cdc301ffad --- /dev/null +++ b/docs/ru-RU/development/server/migration.md @@ -0,0 +1,91 @@ +# Миграции + +В процессе обновления и итерации плагинов могут возникать несовместимые изменения. Эти критические изменения можно обработать путем написания файлов миграций, которые запускаются командой `nocobase upgrade`. Соответствующий процесс выглядит следующим образом: + + + +Миграции для обновлений разделяются на beforeLoad, afterSync и afterLoad: + +- beforeLoad: Выполняется перед загрузкой каждого модуля, разделен на три этапа: + - Перед загрузкой основного модуля + - Перед загрузкой preset-плагинов + - Перед загрузкой других плагинов +- afterSync: После синхронизации конфигураций таблиц с базой данных, разделен на три этапа: + - После синхронизации основных таблиц с БД + - После синхронизации таблиц preset-плагинов с БД + - После синхронизации таблиц других плагинов с БД +- afterLoad: Выполняется после полной загрузки всех приложений + +## Создание файлов миграций + +Создание файлов миграций через команду create-migration + +```bash +yarn nocobase create-migration -h + +Usage: nocobase create-migration [options] + +Options: + --pkg имя пакета + --on [on] Варианты: beforeLoad, afterSync и afterLoad + -h, --help показать справку +``` + +Пример + +```bash +$ yarn nocobase create-migration update-ui --pkg=@nocobase/plugin-client + +2024-01-07 17:33:13 [info ] add app main into supervisor +2024-01-07 17:33:13 [info ] файл миграции создан в /nocobase/packages/plugins/@nocobase/plugin-client/src/server/migrations/20240107173313-update-ui.ts +✨ Готово за 5.02s. +``` + +Будет создан файл миграции с именем 20240107173313-update-ui.ts в директории src/server/migrations плагина @nocobase/plugin-client, с начальным содержимым: + +```ts +import { Migration } from '@nocobase/server'; + +export default class extends Migration { + on = 'afterLoad'; // 'beforeLoad' | 'afterSync' | 'afterLoad' + appVersion = '<0.19.0-alpha.3'; + + async up() { + // код миграции + } +} +``` + +## Запуск миграций + +Запускается командой `nocobase upgrade` + +```bash +$ yarn nocobase upgrade +``` + +## Тестирование миграций + +```ts +import { createMockServer, MockServer } from '@nocobase/test'; + +describe('тестовый пример', () => { + let app: MockServer; + + beforeEach(async () => { + app = await createMockServer({ + plugins: ['my-plugin'], // Плагины + version: '0.18.0-alpha.5', // Версия перед обновлением + }); + }); + + afterEach(async () => { + await app.destroy(); + }); + + test('case1', async () => { + await app.runCommand('upgrade'); + // тестовый код... + }); +}); +``` diff --git a/docs/ru-RU/development/server/resources-actions-v2/configuration.md b/docs/ru-RU/development/server/resources-actions-v2/configuration.md new file mode 100644 index 0000000000..fbbbffdb76 --- /dev/null +++ b/docs/ru-RU/development/server/resources-actions-v2/configuration.md @@ -0,0 +1,125 @@ +### **Конфигурация ресурсов и действий** + +#### **Самые простые действия (Actions) ресурса** + +#### **Действие с параметрами по умолчанию** + +#### **Использование глобальных действий** + +#### **Объединение параметров действия из нескольких источников** + +#### **Использование встроенных действий** + +В NocoBase ресурсы предназначены для работы с коллекциями. Настроенные коллекции (включая связи) автоматически преобразуются в соответствующие ресурсы. + +#### **Автоматическое преобразование** + +```ts +export class PluginSampleToResourcesServer extends Plugin { + async load() { + this.db.collection({ + name: 'posts', + fields: [ + { + type: 'hasMany', + name: 'comments', + target: 'comments', + }, + ], + }); + this.db.collection({ + name: 'comments', + }); + } +} +``` + +Интерфейсы для `posts` и `posts.comments` в приведённом выше примере будут следующими: + +**Ресурс posts** + +``` +POST /api/posts:create +GET /api/posts:list +GET /api/posts:get/1 +POST /api/posts:update/1 +POST /api/posts:destroy/1 +``` + +**Ресурс posts.comments** + +``` +POST /api/posts/1/comments:create +GET /api/posts/1/comments:list +GET /api/posts/1/comments:get/1 +POST /api/posts/1/comments:update/1 +POST /api/posts/1/comments:destroy/1 +``` + +HTTP API в NocoBase является надмножеством REST API, стандартные CRUD-операции поддерживают RESTful-стиль. + +#### **Встроенные действия** + +После преобразования коллекции в ресурс становится возможным выполнение CRUD-операций, поскольку уже определены некоторые стандартные действия. + +**Встроенные глобальные действия, доступные для коллекций и связей:** + +- `create` +- `get` +- `list` +- `update` +- `destroy` +- `move` + +**Встроенные действия для связей (только для связей):** + +- `set` +- `add` +- `remove` +- `toggle` + +Справочник по использованию встроенных действий доступен в документации API. + +#### **Пользовательские действия** + +**Глобальные действия** + +```ts +export class PluginSampleResourcerServer extends Plugin { + async load() { + this.resourcer.registerActions({ + import: async (ctx, next) => {}, + export: async (ctx, next) => {}, + }); + } +} +``` + +**Действия для конкретного ресурса** + +```ts +export class PluginSampleResourcerServer extends Plugin { + async load() { + this.resourcer.registerActions({ + 'posts:listPublished': async (ctx, next) => {}, + }); + } +} +``` + +#### **Пользовательские ресурсы** + +При наличии специфических требований можно явно определить ресурс и соответствующие действия: + +```ts +app.resourcer.define({ + name: 'posts', + actions: { + create: {}, + get: {}, + list: {}, + update: {}, + destroy: {}, + }, +}); +``` diff --git a/docs/ru-RU/development/server/resources-actions-v2/index.md b/docs/ru-RU/development/server/resources-actions-v2/index.md new file mode 100644 index 0000000000..42a7ce06d2 --- /dev/null +++ b/docs/ru-RU/development/server/resources-actions-v2/index.md @@ -0,0 +1,141 @@ +# Основные концепции + +## Ресурсы (Resource) + +В NocoBase ресурсы могут быть представлены двумя способами: + +- `<коллекция>` +- `<коллекция>.<ассоциация>` + + + +- Коллекция - это набор абстрактных данных +- Ассоциация - связанные данные коллекции + + + +Примеры: + +- `posts` - статьи +- `posts.user` - пользователи статей +- `posts.tags` - теги статей + +Конфигурация: + +```js +// Статьи +{ + name: 'posts', +} +// Пользователи статей +{ + name: 'posts.user', +} +// Теги статей +{ + name: 'posts.tags', +} +``` + +## Действия (Action) + +Действия над ресурсами обозначаются через `:<действие>`: + +- `<коллекция>:<действие>` +- `<коллекция>.<ассоциация>:<действие>` + +**Примеры:** + +- `posts:create` - создать статью +- `posts.user:get` - получить пользователя статьи +- `posts.tags:add` - добавить тег к статье + +Конфигурация: + +```js +// CRUD для статей +{ + name: 'posts', + actions: { + create: async (ctx, next) => {}, + get: async (ctx, next) => {}, + list: async (ctx, next) => {}, + update: async (ctx, next) => {}, + destroy: async (ctx, next) => {}, + }, +} + +// Теги статей +{ + name: 'posts.tags', + actions: { + create: async (ctx, next) => {}, + get: async (ctx, next) => {}, + list: async (ctx, next) => {}, + update: async (ctx, next) => {}, + destroy: async (ctx, next) => {}, + add: async (ctx, next) => {}, + remove: async (ctx, next) => {}, + }, +} +``` + +## Запросы к ресурсам + +```bash + /api/<коллекция>:<действие> + /api/<коллекция>:<действие>/ + /api/<коллекция>//<ассоциация>:<действие> + /api/<коллекция>//<ассоциация>:<действие>/ +``` + +**Примеры:** + +Ресурс posts: + +```bash +POST /api/posts:create +GET /api/posts:list +GET /api/posts:get/1 +POST /api/posts:update/1 +POST /api/posts:destroy/1 +``` + +Ресурс posts.comments: + +```bash +POST /api/posts/1/comments:create +GET /api/posts/1/comments:list +GET /api/posts/1/comments:get/1 +POST /api/posts/1/comments:update/1 +POST /api/posts/1/comments:destroy/1 +``` + +Ресурс posts.tags: + +```bash +POST /api/posts/1/tags:create +GET /api/posts/1/tags:get +GET /api/posts/1/tags:list +POST /api/posts/1/tags:update +POST /api/posts/1/tags:destroy +POST /api/posts/1/tags:add +GET /api/posts/1/tags:remove +``` + +## Идентификация ресурсов + +Ресурсы идентифицируются через `filterByTk`: + +- Для коллекций `filterByTk` должен быть уникальным +-Для ресурсов ассоциации `filterByTk` может быть не единственным, и `sourceid` должен быть указан одновременно, чтобы найти его. + +Например, `tables.fields` представляют собой поля таблицы данных + +```bash +GET /api/tables/table1/fields/title +GET /api/tables/table2/fields/title +``` + +Как в таблице 1, так и в таблице 2 есть поля заголовка. Заголовок уникален для таблицы 1, но в других таблицах также могут быть поля заголовка. + diff --git a/docs/ru-RU/development/server/resources-actions-v2/rest-api.md b/docs/ru-RU/development/server/resources-actions-v2/rest-api.md new file mode 100644 index 0000000000..907755e8bd --- /dev/null +++ b/docs/ru-RU/development/server/resources-actions-v2/rest-api.md @@ -0,0 +1,140 @@ +### **REST API** + +HTTP API в NocoBase является надмножеством REST API, стандартные CRUD-операции поддерживают RESTful-стиль. + +#### **Ресурс Collection (Коллекция)** + +**Создание коллекции** + +HTTP API +`POST /api/:create` + +```json +{} # JSON тело +``` + +REST API +`POST /api/` + +```json +{} # JSON тело +``` + +**Просмотр списка коллекции** + +HTTP API +`GET /api/:list` + +REST API +`GET /api/` + +**Просмотр деталей коллекции** + +HTTP API +`GET /api/:get?filterByTk=` +`GET /api/:get/` + +REST API +`GET /api//` + +**Обновление коллекции** + +HTTP API +`POST /api/:update?filterByTk=` + +```json +{} # JSON тело +``` + +Или +`POST /api/:update/` + +```json +{} # JSON тело +``` + +REST API +`PUT /api//` + +```json +{} # JSON тело +``` + +**Удаление коллекции** + +HTTP API +`POST /api/:destroy?filterByTk=` +Или +`POST /api/:destroy/` + +REST API +`DELETE /api//` + +#### **Ресурс Association (Связь)** + +**Создание связи** + +HTTP API +`POST /api///:create` + +```json +{} # JSON тело +``` + +REST API +`POST /api///` + +```json +{} # JSON тело +``` + +**Просмотр списка связей** + +HTTP API +`GET /api///:list` + +REST API +`GET /api///` + +**Просмотр деталей связи** + +HTTP API +`GET /api///:get?filterByTk=` +Или +`GET /api///:get/` + +REST API +`GET /api////` + +**Обновление связи** + +HTTP API +`POST /api///:update?filterByTk=` + +```json +{} # JSON тело +``` + +Или +`POST /api///:update/` + +```json +{} # JSON тело +``` + +REST API +`PUT /api////` + +```json +{} # JSON тело +``` + +**Удаление связи** + +HTTP API +`POST /api///:destroy?filterByTk=` +Или +`POST /api///:destroy/` + +REST API +`DELETE /api////` diff --git a/docs/ru-RU/development/server/resources-actions-v2/to-resource.md b/docs/ru-RU/development/server/resources-actions-v2/to-resource.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/ru-RU/development/server/resources-actions-v2/vs-router.md b/docs/ru-RU/development/server/resources-actions-v2/vs-router.md new file mode 100644 index 0000000000..ed8f9e92d4 --- /dev/null +++ b/docs/ru-RU/development/server/resources-actions-v2/vs-router.md @@ -0,0 +1 @@ +# Отличие от маршрутизатора diff --git a/docs/ru-RU/development/server/resources-actions.md b/docs/ru-RU/development/server/resources-actions.md new file mode 100644 index 0000000000..6425e70e26 --- /dev/null +++ b/docs/ru-RU/development/server/resources-actions.md @@ -0,0 +1,333 @@ +# Ресурсы и действия + +В мире веб-разработки вы могли слышать о концепции RESTful. NocoBase заимствует эту концепцию ресурсов для отображения различных сущностей в системе, таких как данные в базе, файлы в файловой системе или сервисы. Однако NocoBase не полностью следует RESTful-конвенциям, а расширяет спецификации из [Google Cloud API Design Guide](https://cloud.google.com/apis/design) для большего охвата сценариев. + +## Основные понятия + +Ресурсы - это объекты системы, доступные для манипуляций извне, такие как таблицы данных, файлы и другие пользовательские объекты. + +Действия - операции чтения/записи над ресурсами, обычно для доступа к данным, их создания, обновления, удаления и т.д. В NocoBase доступ к ресурсам реализован через определение действий, ядром которых является совместимая с Koa middleware-функция для обработки запросов. + +### Автоматическое отображение коллекций на ресурсы + +NocoBase автоматически отображает коллекции на ресурсы и предоставляет серверный интерфейс для работы с данными. По умолчанию, при определении коллекции через `db.collection()`, становятся доступны HTTP API для работы с её данными. Имя ресурса совпадает с именем коллекции. + +Для простых ресурсов доступны стандартные CRUD-действия: +- [`list`](/api/actions#list): Получить список данных +- [`get`](/api/actions#get): Получить одну запись +- [`create`](/api/actions#create): Создать запись +- [`update`](/api/actions#update): Обновить запись +- [`destroy`](/api/actions#destroy): Удалить запись + +Для реляционных ресурсов также доступны действия для работы со связями: +- [`add`](/api/actions#add): Добавить связь +- [`remove`](/api/actions#remove): Удалить связь +- [`set`](/api/actions#set): Установить связь +- [`toggle`](/api/actions#toggle): Переключить связь + +Пример определения коллекции статей: +```ts +app.db.collection({ + name: 'posts', + fields: [{ type: 'string', name: 'title' }], +}); +await app.db.sync(); +``` + +Работа через HTTP API: +```bash +# Создание +curl -X POST -H "Content-Type: application/json" -d '{"title": "first"}' http://localhost:13000/api/posts:create +# Получение списка +curl http://localhost:13000/api/posts:list +# Обновление +curl -X PUT -H "Content-Type: application/json" -d '{"title": "second"}' http://localhost:13000/api/posts:update +# Удаление +curl -X DELETE http://localhost:13000/api/posts:destroy?filterByTk=1 +``` + +### Пользовательские действия + +Когда стандартных CRUD-действий недостаточно, можно расширить ресурсы дополнительными действиями. Например, переопределить действие создания для коллекции статей: + +```ts +app.actions({ + async ['posts:create'](ctx, next) { + const postRepo = ctx.db.getRepository('posts'); + await postRepo.create({ + values: { + ...ctx.action.params.values, + // Ограничение: текущий пользователь - автор статьи + userId: ctx.state.currentUserId + } + }); + await next(); + } +}); +``` + +Или добавить глобальное действие экспорта для всех коллекций: + +```ts +app.actions({ + async export(ctx, next) { + const repo = ctx.db.getRepository(ctx.action.resource); + const results = await repo.find({ + filter: ctx.action.params.filter + }); + ctx.type = 'text/csv'; + ctx.body = results.map(...).join('\n'); + next(); + } +}); +``` + +### Параметры действий + +Параметры действий формируются из трёх источников: +1. Параметры по умолчанию при определении действия +2. Параметры из клиентского запроса +3. Препроцессинг других middleware + +Пример ограничения параметров: +```ts +app.resource({ + name: 'posts', + actions: { + create: { + whitelist: ['title', 'content'], // Разрешённые поля + blacklist: ['createdAt', 'createdById'], // Запрещённые поля + }, + }, +}); +``` + +# Пользовательские ресурсы + +Ресурсы данных делятся на: +- Основные ресурсы: `<коллекция>` +- Ресурсы связей: `<коллекция>.<связь>` + +```ts +// Определение ресурса статей +app.resource({ + name: 'posts' +}); + +// Ресурс автора статьи +app.resource({ + name: 'posts.user' +}); + +// Ресурс комментариев статьи +app.resource({ + name: 'posts.comments' +}); +``` + +Кастомизация нужна для: +1. Ресурсов, не связанных с БД (например, данные в памяти) +2. Прокси-интерфейсов других сервисов +3. Специфичных действий для существующих ресурсов + +Пример ресурса для отправки уведомлений: +```ts +app.resource({ + name: 'notifications', + actions: { + async send(ctx) { + await someProvider.send(ctx.request.body); + } + } +}); +``` + +Вызов через API: +```bash +POST /api/notifications:send {title:"Hello", to:"hello@nocobase.com"} +``` + +## Пример магазина + +Продолжая пример магазина из [раздела про коллекции](/development/server/collections-fields#Пример), рассмотрим кастомизацию действий. + +### Переопределение стандартных действий + +При создании заказа автоматически указываем текущего пользователя как владельца: + +```ts +app.resource({ + name: 'orders', + actions: { + async create(ctx) { + ctx.action.mergeParams({ + values: { + userId: ctx.state.user.id // Автоматическое назначение владельца + } + }); + return actions.create(ctx); // Вызов стандартной логики + } + } +}); +``` + +### Пользовательские действия + +Для сложных операций (например, изменение статуса заказа) создаем отдельные действия. + +1. Добавляем коллекцию для данных доставки (`collections/deliveries.ts`): + +```ts +export default { + name: 'deliveries', + fields: [ + { type: 'belongsTo', name: 'order' }, + { type: 'string', name: 'provider' }, // Поставщик + { type: 'string', name: 'trackingNumber' }, // Трек-номер + { type: 'integer', name: 'status' } + ] +}; +``` + +2. Расширяем коллекцию заказов связью с доставкой (`collections/orders.ts`): + +```ts +export default { + name: 'orders', + fields: [ + // ... другие поля + { type: 'hasOne', name: 'delivery' } + ] +}; +``` + +3. Создаем действие "доставка" в основном классе плагина: + +```ts +app.resource({ + name: 'orders', + actions: { + async deliver(ctx) { + const { filterByTk } = ctx.action.params; + const orderRepo = ctx.db.getRepository('orders'); + + const [order] = await orderRepo.update({ + filterByTk, + values: { + status: 2, // Статус "Отправлен" + delivery: { + ...ctx.action.params.values, + status: 0 // Статус доставки + } + } + }); + + ctx.body = order; + } + } +}); +``` + +Вызов действия: +```bash +POST /api/orders:deliver/ { + "provider": "Почта России", + "trackingNumber": "RU123456789" +} +``` + +Аналогично можно создать действия для оплаты, подписания и других операций с заказом. + +### Слияние параметров + +Для ограничения доступа пользователей только к своим заказам и исключения отменённых заказов, можно задать параметры по умолчанию: + +```ts +app.resource({ + name: 'orders', + actions: { + list: { + filter: { + $isCurrentUser: true, // Только текущий пользователь + status: { $ne: -1 } // Исключить отменённые + }, + fields: ['id', 'status', 'createdAt'] // Поля по умолчанию + } + } +}); +``` + +При запросе клиента параметры объединяются: +```bash +GET /api/orders:list?productId=1&fields=id,quantity&appends=product +``` + +Итоговые параметры запроса: +```json +{ + "filter": { + "$and": [ + {"$isCurrentUser": true}, + {"status": {"$ne": -1}}, + {"productId": 1} + ] + }, + "fields": ["id", "status", "quantity", "createdAt"], + "appends": ["product"] +} +``` + +### Ограничение создания заказов + +Запретим клиенту передавать служебные поля: + +```ts +app.resource({ + name: 'orders', + actions: { + create: { + blacklist: ['id', 'totalPrice', 'status'], // Запрещённые поля + values: { + status: 0 // Статус по умолчанию + } + } + } +}); +``` + +### Сложные проверки через middleware + +Проверка наличия товара перед заказом: + +```ts +app.resource({ + name: 'orders', + actions: { + create: { + middlewares: [ + async (ctx, next) => { + const product = await ctx.db.getRepository('products').findOne({ + filterByTk: ctx.action.params.values.productId, + filter: { + enabled: true, // Товар доступен + inventory: { $gt: 0 } // Есть в наличии + } + }); + if (!product) ctx.throw(404); + await next(); + } + ] + } + } +}); +``` + +## Итог + +Ключевые моменты: +- Автоматическое создание ресурсов из коллекций +- Стандартные CRUD-действия +- Возможность кастомизации действий +- Стратегии слияния параметров запросов + +Код, описанный в этой главе, включен в полный пакет примеров [packages/samples/shop-actions](https://github.com/nocobase/nocobase/tree/main/packages/samples/shop-actions), который можно запустить непосредственно локально, чтобы увидеть результаты. diff --git a/docs/ru-RU/development/server/routing.md b/docs/ru-RU/development/server/routing.md new file mode 100644 index 0000000000..0ac3d9da62 --- /dev/null +++ b/docs/ru-RU/development/server/routing.md @@ -0,0 +1 @@ +# Маршрутизация diff --git a/docs/ru-RU/development/server/telemetry.md b/docs/ru-RU/development/server/telemetry.md new file mode 100644 index 0000000000..096627fea0 --- /dev/null +++ b/docs/ru-RU/development/server/telemetry.md @@ -0,0 +1,107 @@ +### **Телеметрия** + +:::warning{title=Экспериментальная функция} +::: + +Модуль телеметрии в NocoBase построен на основе [OpenTelemetry](https://opentelemetry.io/). В данной статье описывается, как использовать модуль телеметрии для сбора данных трассировки (Trace) и метрик (Metric), чтобы повысить наблюдаемость системы NocoBase. + +:::info{title=Подсказка} +Перед запуском NocoBase необходимо установить переменную окружения `TELEMETRY_ENABLED=true`, чтобы включить сбор телеметрических данных. Другие настройки см. в разделе: [Переменные окружения — Телеметрия](../../welcome/getting-started/env.md#telemetry_enabled). +::: + +#### **Инструментирование** + +##### **Метрики** + +```js +const meter = app.telemetry.metric.getMeter(); +const counter = meter.createCounter('event_counter', {}); +counter.add(1); +``` + +**Ссылки:** +[https://opentelemetry.io/docs/instrumentation/js/manual/#acquiring-a-meter](https://opentelemetry.io/docs/instrumentation/js/manual/#acquiring-a-meter) + +##### **Трассировка (Traces)** + +```js +const tracer = app.telemetry.trace.getTracer(); +tracer.startActiveSpan(); +tracer.startSpan(); +``` + +**Ссылки:** +[https://opentelemetry.io/docs/instrumentation/js/manual/#acquiring-a-tracer](https://opentelemetry.io/docs/instrumentation/js/manual/#acquiring-a-tracer) + +##### **Библиотеки** + +```js +import { Plugin } from '@nocobase/server'; +import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node'; + +class InstrumentationPlugin extends Plugin { + afterAdd() { + this.app.on('beforeLoad', (app) => { + app.telemetry.addInstrumentation(getNodeAutoInstrumentations()); + }); + } +} +``` + +:::warning +В NocoBase модуль телеметрии инициализируется на этапе `app.beforeLoad`. Подробнее см.: [Жизненный цикл](../life-cycle.md). Поэтому не все библиотеки инструментирования подходят для использования в NocoBase. +Например, [instrumentation-koa](https://www.npmjs.com/package/@opentelemetry/instrumentation-koa) должна подключаться до создания экземпляра `Koa`, однако, хотя `Application` в NocoBase и основан на `Koa`, модуль телеметрии инициализируется уже после создания экземпляра `Application`, поэтому его использование невозможно. +::: + +**Ссылки:** +[https://opentelemetry.io/docs/instrumentation/js/libraries/](https://opentelemetry.io/docs/instrumentation/js/libraries/) + +#### **Сбор данных** + +##### **Метрики** + +```js +import { Plugin } from '@nocobase/server'; +import { + PeriodicExportingMetricReader, + ConsoleMetricExporter, +} from '@opentelemetry/sdk-metrics'; + +class MetricReaderPlugin extends Plugin { + afterAdd() { + this.app.on('beforeLoad', (app) => { + app.telemetry.metric.registerReader( + 'console', + () => + new PeriodicExportingMetricReader({ + exporter: new ConsoleMetricExporter(), + }), + ); + }); + } +} +``` + +##### **Трассировка** + +```js +import { Plugin } from '@nocobase/server'; +import { + BatchSpanProcessor, + ConsoleSpanExporter, +} from '@opentelemetry/sdk-trace-base'; + +class TraceSpanProcessorPlugin extends Plugin { + afterAdd() { + this.app.on('beforeLoad', (app) => { + app.telemetry.trace.registerProcessor( + 'console', + () => new BatchSpanProcessor(new ConsoleSpanExporter()), + ); + }); + } +} +``` + +**Ссылки:** +[https://opentelemetry.io/docs/instrumentation/js/exporters](https://opentelemetry.io/docs/instrumentation/js/exporters) diff --git a/docs/ru-RU/development/server/test.md b/docs/ru-RU/development/server/test.md new file mode 100644 index 0000000000..10dfe6e248 --- /dev/null +++ b/docs/ru-RU/development/server/test.md @@ -0,0 +1,224 @@ +# Тестирование + +Тестирование основано на фреймворке [Jest](https://jestjs.io/). Для удобства написания тестов предоставляются `mockDatabase()` и `mockServer()` для тестирования базы данных и серверной части приложений. + +:::warning +Переменные тестового окружения настраиваются в файле `.env.test`. Рекомендуется использовать отдельную тестовую базу данных. +::: + +## `mockDatabase()` + +По умолчанию предоставляет полностью изолированное тестовое окружение для БД. + +```ts +import { mockDatabase } from '@nocobase/test'; + +describe('my db suite', () => { + let db; + + beforeEach(async () => { + db = mockDatabase(); + db.collection({ + name: 'posts', + fields: [ + { + type: 'string', + name: 'title', + }, + ], + }); + await db.sync(); + }); + + afterEach(async () => { + await db.close(); + }); + + test('my case', async () => { + const repository = db.getRepository('posts'); + const post = await repository.create({ + values: { + title: 'hello', + }, + }); + + expect(post.get('title')).toEqual('hello'); + }); +}); +``` + +## `mockServer()` + +Предоставляет mock-экземпляр серверного приложения, где app.db является экземпляром `mockDatabase()`. Также доступен удобный `app.agent()` для тестирования HTTP API. Для Resource Action, специфичных для NocoBase, предусмотрен `app.agent().resource()` для тестирования действий ресурсов. + +```ts +import { MockServer, mockServer } from '@nocobase/test'; + +// Минимальная конфигурация приложения для каждого плагина разная, +// необходимо добавлять требуемые плагины в зависимости от условий +async function createApp(options: any = {}) { + const app = mockServer({ + ...options, + plugins: [ + 'acl', + 'users', + 'collection-manager', + 'error-handler', + ...options.plugins, + ], + // Могут присутствовать другие параметры конфигурации + }); + // Здесь можно добавить логику, требующую специальной обработки, + // например, импорт тестовых данных + return app; +} + +// Большинству тестов требуется запуск приложения, +// поэтому можно предоставить общий метод запуска +async function startApp() { + const app = createApp(); + await app.quickstart({ + // Очистка БД перед запуском тестов + clean: true, + }); + return app; +} + +describe('test example', () => { + let app: MockServer; + + beforeEach(async () => { + app = await startApp(); + }); + + afterEach(async () => { + // Очистка БД после тестов + await app.destroy(); + // Остановка без очистки БД + await app.stop(); + }); + + test('case1', async () => { + // код теста... + }); +}); +``` +### Запуск с последующей установкой + +Команда в терминале: + +```bash +yarn start # Остается в памяти +# Выполнить в другом терминале +yarn nocobase install +``` + +Тестовый процесс: + +```ts +const app = mockServer(); +await app.runCommand('start'); +await app.runCommand('install'); +``` + +### Быстрый старт (автоматическая установка или обновление) + +Команда в терминале: + +```bash +yarn start --quickstart +``` + +Тестовый процесс: + +```ts +const app = mockServer(); +await app.runCommand('start', '--quickstart'); +``` + +### Переустановка уже установленного и запущенного приложения + +Команда в терминале: + +```bash +yarn start --quickstart +# Выполнить в другом терминале +yarn nocobase install -f +``` + +Тестовый процесс: + +```ts +const app = mockServer(); +await app.runCommand('start', '--quickstart'); +await app.runCommand('install', '-f'); +``` + +### Обновление приложения (перед запуском) + +Команда в терминале: + +```bash +yarn nocobase upgrade +yarn start +``` + +Тестовый процесс: + +```ts +const app = mockServer(); +await app.runCommand('upgrade', '-f'); +await app.runCommand('start', '--quickstart'); +``` + +### Обновление приложения (после запуска) + +Команда в терминале: + +```bash +yarn start # Остается в памяти +# Выполнить в другом терминале +yarn nocobase upgrade +``` + +Тестовый процесс: + +```ts +const app = mockServer(); +await app.runCommand('start', '--quickstart'); +await app.runCommand('upgrade', '-f'); +``` + +### Активация плагина + +Команда в терминале: + +```bash +yarn start --quickstart +yarn pm enable @my-project/plugin-hello +``` + +Тестовый процесс: + +```ts +const app = mockServer(); +await app.runCommand('start', '--quickstart'); +await app.runCommand('pm', 'enable', '@my-project/plugin-hello'); +``` + +### Деактивация плагина + +Команда в терминале: + +```bash +yarn start --quickstart +yarn pm disable @my-project/plugin-hello +``` + +Тестовый процесс: + +```ts +const app = mockServer(); +await app.runCommand('start', '--quickstart'); +await app.runCommand('pm', 'disable', '@my-project/plugin-hello'); +``` diff --git a/docs/ru-RU/development/your-fisrt-plugin.md b/docs/ru-RU/development/your-fisrt-plugin.md new file mode 100644 index 0000000000..d104fa2ca5 --- /dev/null +++ b/docs/ru-RU/development/your-fisrt-plugin.md @@ -0,0 +1,147 @@ +# Создание первого плагина + +Перед началом необходимо установить NocoBase: + +- [Установка через create-nocobase-app](/welcome/getting-started/installation/create-nocobase-app) +- [Установка из исходного кода Git](/welcome/getting-started/installation/git-clone) + +После установки NocoBase можно приступать к разработке плагина. + +## Создание плагина + +Сначала создайте пустой плагин с помощью CLI-команды: + +```bash +yarn pm create @my-project/plugin-hello +``` + +Плагин будет создан в директории `packages/plugins/@my-project/plugin-hello` со следующей структурой: + +```bash +|- /packages/plugins/@my-project/plugin-hello + |- /src + |- /client # клиентский код плагина + |- /server # серверный код плагина + |- client.d.ts + |- client.js + |- package.json # информация о пакете плагина + |- server.d.ts + |- server.js +``` + +Проверить добавленный плагин можно в Менеджере плагинов по адресу: http://localhost:13000/admin/pm/list/local/ + + + +Если плагин не отображается, добавьте его вручную: + +```bash +yarn pm add @my-project/plugin-hello +``` + +## Написание кода плагина + +Создайте файл коллекции в плагине, например `. /src/server/collections/hello.ts`: + +```ts +import { defineCollection } from '@nocobase/database'; + +export default defineCollection({ + name: 'hello', + fields: [{ type: 'string', name: 'name' }], +}); +``` + +Измените файл `. /src/server/plugin.ts`: + +```ts +import { Plugin } from '@nocobase/server'; + +export class PluginHelloServer extends Plugin { + async afterAdd() {} + + async beforeLoad() {} + + async load() { + // Пример: открыть все действия коллекции hello для публичного доступа + this.app.acl.allow('hello', '*', 'public'); + } + + async install() {} + + async afterEnable() {} + + async afterDisable() {} + + async remove() {} +} + +export default PluginHelloServer; +``` + +## Активация плагина + +**Через командную строку:** + +```bash +yarn pm enable @my-project/plugin-hello +``` + +**Через интерфейс:** + +Откройте Менеджер плагинов по адресу http://localhost:13000/admin/pm/list/local/ и нажмите "Активировать". + + + +:::info{title="ИНФОРМАЦИЯ"} +При активации плагина коллекции автоматически синхронизируются с базой данных. Если плагин уже активирован, используйте команду `yarn nocobase upgrade` для синхронизации. +::: + +## Отладка плагина + +Если приложение не запущено, выполните: + +```bash +# для разработки +yarn dev + +# для production +yarn build +yarn start +``` + +Добавьте данные в коллекцию hello: + +```bash +curl --location --request POST 'http://localhost:13000/api/hello:create' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "name": "Hello world" +}' +``` + +Просмотр данных: + +```bash +curl --location --request GET 'http://localhost:13000/api/hello:list' +``` + +## Сборка плагина + +Для полной сборки выполните: + +```bash +yarn build @my-project/plugin-hello --tar + +# или пошагово +yarn build @my-project/plugin-hello +yarn nocobase tar @my-project/plugin-hello +``` + +Собранный плагин сохраняется в `storage/tar/@my-project/plugin-hello.tar.gz` + +## Загрузка в другие приложения NocoBase + +Поддерживается в версии 0.14 и выше + + diff --git a/docs/ru-RU/handbook/acl/index.md b/docs/ru-RU/handbook/acl/index.md new file mode 100644 index 0000000000..0bf69f14a4 --- /dev/null +++ b/docs/ru-RU/handbook/acl/index.md @@ -0,0 +1,84 @@ +# Контроль доступа + +## Введение + +Модуль ACL (Access Control List) в NocoBase состоит из двух основных частей: + +- `@nocobase/acl` — модуль в ядре, предоставляющий базовые функции управления доступом +- `@nocobase/plugin-acl` — плагин, реализующий возможности динамической настройки + +## Установка + +Плагин встроен в систему — отдельная установка не требуется. + +## Руководство по разработке + +### Расширение вкладок конфигурации прав доступа + +Ниже приведён пример расширения интерфейса конфигурации прав — добавление новой вкладки **«Мобильное меню»**. Результат показан на изображении: + +![20240903210248](https://static-docs.nocobase.com/20240903210248.png) + +Пример кода: + +```typescript +import { Plugin } from '@nocobase/client'; +import PluginACLClient from '@nocobase/plugin-acl/client'; + +class PluginMobileClient extends Plugin { + async load() { + const aclInstance = this.app.pm.get(PluginACLClient); + + aclInstance?.settingsUI.addPermissionsTab(({ t, TabLayout, activeKey }) => ({ + key: 'mobile-menu', + label: t('Mobile menu', { + ns: 'plugin-mobile', + }), + children: ( + + + + ), + })); + } +} +``` + +Сначала необходимо получить экземпляр плагина `PluginACLClient` +([другие способы получения экземпляров плагинов](https://docs.nocobase.com/development/client/life-cycle#%E8%8E%B7%E5%8F%96%E6%8F%92%E4%BB%B6)), +а затем добавить новую вкладку конфигурации прав доступа с помощью метода `settingsUI.addPermissionsTab`. +В приведённом примере добавляется вкладка с названием **«Mobile Menu»**. + +Свойство `settingsUI` является экземпляром класса `ACLSettingsUI`, тип которого выглядит следующим образом: + +```typescript +import { TabsProps } from 'antd/es/tabs/index'; + +interface ACLSettingsUI { + addPermissionsTab(tab: Tab | TabCallback): void; + getPermissionsTabs(props: PermissionsTabsProps): Tab[]; +} + +type Tab = TabsProps['items'][0]; + +type TabCallback = (props: PermissionsTabsProps) => Tab; + +interface PermissionsTabsProps { + /** + * the key of the currently active tab panel + */ + activeKey: string; + /** + * the currently selected role + */ + role: Role; + /** + * translation function + */ + t: TFunction; + /** + * used to constrain the size of the container in the Tab + */ + TabLayout: React.FC; +} +``` diff --git a/docs/ru-RU/handbook/acl/manual.md b/docs/ru-RU/handbook/acl/manual.md new file mode 100644 index 0000000000..5e3c95f655 --- /dev/null +++ b/docs/ru-RU/handbook/acl/manual.md @@ -0,0 +1,124 @@ +# Руководство пользователя + +## Объединение ролей (Role Union) + +**Объединение ролей** — это режим управления правами доступа. В зависимости от настроек системы, разработчики могут выбрать один из вариантов: `Независимые роли`, `Разрешить объединение ролей` или `Только объединение ролей`, чтобы соответствовать различным требованиям безопасности. + +![20250312184651](https://static-docs.nocobase.com/20250312184651.png) + +### Независимые роли + +По умолчанию система использует **независимые роли**. Пользователи вручную переключаются между ролями, которые им назначены. + +![20250312184729](https://static-docs.nocobase.com/20250312184729.png) +![20250312184826](https://static-docs.nocobase.com/20250312184826.png) + +### Разрешить объединение ролей + +Разработчики могут включить параметр **Разрешить объединение ролей**, который позволяет пользователю одновременно иметь права всех назначенных ролей, при этом всё ещё можно вручную переключать роли. + +![20250312185006](https://static-docs.nocobase.com/20250312185006.png) + +### Только объединение ролей + +Пользователи всегда работают с объединёнными правами и **не могут переключаться между ролями вручную**. + +![20250312185105](https://static-docs.nocobase.com/20250312185105.png) + +### Правила объединения ролей + +Объединение ролей предоставляет **максимальные права** из всех назначенных ролей. Ниже описано, как разрешаются конфликты при разных настройках на одни и те же разрешения. + +#### Объединение операций + +Пример: +Роль 1: `Можно настраивать интерфейс` +Роль 2: `Можно устанавливать, активировать и отключать плагины` + +![20250312190133](https://static-docs.nocobase.com/20250312190133.png) +![20250312190352](https://static-docs.nocobase.com/20250312190352.png) + +При входе с ролью **Полные права** пользователь получает **обе группы прав**. + +![20250312190621](https://static-docs.nocobase.com/20250312190621.png) + +#### Объединение области данных (Data Scope) + +##### Строки данных + +**Сценарий 1:** несколько ролей фильтруют по одному полю + +Роль A: `Возраст < 30` + +| ID | Имя | Возраст | +|----|------|---------| +| 1 | Jack | 23 | +| 2 | Lily | 29 | + +Роль B: `Возраст > 25` + +| ID | Имя | Возраст | +|----|------|---------| +| 2 | Lily | 29 | +| 3 | Sam | 32 | + +**После объединения:** + +| ID | Имя | Возраст | +|----|------|---------| +| 1 | Jack | 23 | +| 2 | Lily | 29 | +| 3 | Sam | 32 | + +**Сценарий 2:** разные поля в условиях фильтра + +Роль A: `Возраст < 30` +Роль B: `Имя содержит "Ja"` + +| ID | Имя | Возраст | +|----|--------|---------| +| 1 | Jack | 23 | +| 2 | Lily | 29 | +| 3 | Jasmin | 27 | + +**После объединения:** + +| ID | Имя | Возраст | +|----|--------|---------| +| 1 | Jack | 23 | +| 2 | Lily | 29 | +| 3 | Jasmin | 27 | + +##### Столбцы данных + +Роль A: `Имя`, `Возраст` +Роль B: `Имя`, `Пол` + +**После объединения:** + +| ID | Имя | Возраст | Пол | +|----|------|---------|--------| +| 1 | Jack | 23 | Man | +| 2 | Lily | 29 | Woman | + +##### Смешанное объединение строк и столбцов + +Роль A: `Возраст < 30`, колонки: `Имя`, `Возраст` +Роль B: `Имя содержит "Ja"`, колонки: `Имя`, `Пол` + +**После объединения:** + +| ID | Имя | Возраст | Пол | +|----|--------|------------------------------------------|-------------------------------------------| +| 1 | Jack | 23 | Man | +| 2 | Lily | 29 | Woman | +| 3 | Jade | 27 | Woman | +| 4 | James | 31 | Man | + +**Примечание:** Ячейки с красным фоном — это данные, которые **не были видимы в отдельных ролях**, но стали доступны при объединении. + +##### Итоги объединения области данных: + +1. **Строки**: если условие выполнено хотя бы в одной роли — строка доступна +2. **Столбцы**: объединяются все доступные поля +3. При конфигурации строк и столбцов одновременно — объединение происходит **отдельно по строкам и по столбцам**, а не по их пересечению diff --git a/docs/ru-RU/handbook/acl/user/index.md b/docs/ru-RU/handbook/acl/user/index.md new file mode 100755 index 0000000000..84bc393fb7 --- /dev/null +++ b/docs/ru-RU/handbook/acl/user/index.md @@ -0,0 +1,226 @@ +# Руководство + +## **Центр управления** + +##### **Управление ролями** + +Приложение поставляется с двумя предустановленными ролями: **"Admin"** и **"Member"**, каждая из которых имеет уникальные настройки прав, соответствующие их функциям. + +![](https://static-docs.nocobase.com/da7083c67d794e23dc6eb0f85b1de86c.png) + +##### **Добавление, удаление и изменение ролей** + +Каждая роль имеет уникальный системный идентификатор, который позволяет изменять предустановленные роли, однако сами предустановленные роли удалить нельзя. + +![](https://static-docs.nocobase.com/35f323b346db4f9f12f9bee4dea63302.png) + +##### **Назначение роли по умолчанию** + +Роль по умолчанию — это роль, которая автоматически присваивается новым пользователям, если при их создании не указана конкретная роль. + +![](https://static-docs.nocobase.com/f41bba7ff55ca28715c486dc45bc1708.png) + +##### **Настройка прав** + +###### **Общие настройки прав** + +![](https://static-docs.nocobase.com/119a9650259f9be71210121d0d3a435d.png) + +1. **Можно настраивать интерфейс**: Определяет, может ли пользователь настраивать интерфейс. При активации появляется кнопка конфигурации UI. По умолчанию включено для роли "admin". +2. **Можно устанавливать, активировать и отключать плагины**: Определяет, может ли пользователь включать или отключать плагины. При активации пользователь получает доступ к интерфейсу управления плагинами. По умолчанию включено для роли "admin". +3. **Можно настраивать плагины**: Разрешает настройку параметров плагинов или управление их внутренними данными. По умолчанию включено для роли "admin". +4. **Можно очищать кэш и перезапускать приложение**: Связано с задачами технического обслуживания, такими как очистка кэша и перезапуск приложения. После активации соответствующие кнопки отображаются в личном кабинете. По умолчанию отключено. +5. **Доступ к новым пунктам меню по умолчанию**: Новые элементы меню доступны по умолчанию. Эта настройка включена по умолчанию. + +###### **Права на действия** + +Права на действия применяются ко всем таблицам данных и разделяются по типам операций. Их можно настроить с учётом области данных: для всех данных или только для собственных. Первый вариант разрешает работу с любыми записями, второй — только с записями, связанными с пользователем. + +##### **Права на операции с таблицами данных** + +![](https://static-docs.nocobase.com/6a6e0281391cecdea5b5218e6173c5d7.png) + +![](https://static-docs.nocobase.com/9814140434ff9e1bf028a6c282a5a165.png) + +Права на действия с коллекциями позволяют точно настроить доступ к операциям, определяя доступ к данным в каждой таблице. Эти права включают: + +1. **Права на действия**: Включают операции добавления, просмотра, редактирования, удаления, экспорта и импорта. Права настраиваются по области данных: +- **Все записи**: Пользователь может выполнять действия со всеми записями таблицы. +- **Собственные записи**: Пользователь может выполнять действия только со своими записями. + +2. **Права на поля**: Позволяют настроить доступ к каждому полю для различных операций. Например, некоторые поля можно сделать доступными только для просмотра без возможности редактирования. + +##### **Права на пункты меню** + +Права на пункты меню определяют доступ на основе конкретных элементов интерфейса меню. + +![](https://static-docs.nocobase.com/28eddfc843d27641162d9129e3b6e33f.png) + +##### **Права на конфигурацию плагинов** + +Права на конфигурацию плагинов определяют возможность настраивать параметры конкретных плагинов. При включении этих прав в центре управления появляется соответствующий интерфейс управления плагином. + +![](https://static-docs.nocobase.com/5a742ae20a9de93dc2722468b9fd7475.png) + +#### **Личный кабинет** + +##### **Переключение ролей** + +Пользователю может быть назначено несколько ролей, между которыми он может переключаться в личном кабинете. При входе по умолчанию используется последняя выбранная роль (это значение обновляется при каждом переключении), либо, если она не задана, первая в списке (роль по умолчанию системы). + +![](https://static-docs.nocobase.com/e331d11ec1ca3b8b7e0472105b167819.png) + +#### **Применение в интерфейсе** + +##### **Права на блоки данных** + +Видимость блоков данных в таблице управляется правами на просмотр. Индивидуальные настройки имеют приоритет над глобальными. + +Например, в глобальных правах роли "admin" разрешён полный доступ, но в таблице заказов могут быть заданы индивидуальные права, из-за чего блок становится невидимым. + +![](https://static-docs.nocobase.com/3d026311739c7cf5fdcd03f710d09bc4.png) + +![](https://static-docs.nocobase.com/a88caba1cad47001c1610bf402a4a2c1.png) + +###### **Права на поля** + +- **Просмотр (View)**: Определяет, какие поля видимы на уровне поля, позволяя задавать, какие именно поля будут отображаться для определённых ролей в таблице заказов. + +![](https://static-docs.nocobase.com/30dea84d984d95039e6f7b180955a6cf.png) + +В интерфейсе только поля с явно заданными правами будут отображаться в блоке таблицы заказов. Системные поля (Id, CreatedAt, LastUpdatedAt) всегда отображаются, даже если для них не задана конфигурация. + +![](https://static-docs.nocobase.com/40cc49b517efe701147fd2e799e79dcc.png) + +- **Редактирование (Edit)**: Управляет тем, можно ли редактировать и сохранять (обновлять) поля. + + В интерфейсе в форме редактирования отображаются только поля, для которых разрешено редактирование. + +![](https://static-docs.nocobase.com/6531ca4122f0887547b5719e2146ba93.png) + +Аналогично, в форме добавления отображаются только поля с правами на добавление. + +![](https://static-docs.nocobase.com/12982450c311ec1bf87eb9dc5fb04650.png) + +![](https://static-docs.nocobase.com/1dbe559a9579c2e052e194e50edc74a7.gif) + +- **Добавление (Add)**: Определяет, можно ли создавать (добавлять) поля. + +![](https://static-docs.nocobase.com/3ab1bbe41e61915e920fd257f2e0da7e.png) + +В интерфейсе в форме добавления отображаются только поля с правами на добавление. + +![](https://static-docs.nocobase.com/8d0c07893b63771c428974f9e126bf35.png) + +- **Экспорт (Export)**: Управляет возможностью экспорта полей. +- **Импорт (Import)**: Управляет возможностью импорта полей. + +##### **Права на действия** + +Индивидуальные настройки имеют наивысший приоритет. Если заданы конкретные права, они переопределяют глобальные. В противном случае применяются глобальные настройки. + +- **Добавить (Add new)**: Управляет отображением кнопки добавления в блоке. + +![](https://static-docs.nocobase.com/2e3123b5dbc72ae78942481360626629.png) + +Если операция добавления разрешена, в блоке таблицы заказов появляется кнопка "Добавить". + +![](https://static-docs.nocobase.com/f0458980d450544d94c73160d75ba96c.png) + +- **Просмотр (View)**: Определяет, будет ли блок данных отображаться. + +![](https://static-docs.nocobase.com/6e4a1e6ea92f50bf84959dedbf1d5683.png) + +В интерфейсе блоки других таблиц остаются скрытыми, но блок таблицы заказов отображается, если заданы индивидуальные права. + +![](https://static-docs.nocobase.com/f2dd142a40fe19fb657071fd901b2291.png) + +![](https://static-docs.nocobase.com/b92f0edc51a27b52e85cdeb76271b936.gif) + +- **Редактирование (Edit)**: Управляет отображением кнопки редактирования в блоке. + +![](https://static-docs.nocobase.com/fb1c0290e2a833f1c2b415c761e54c45.gif) + +Права на действия могут быть детализированы через настройку области данных (data scope). + +![](https://static-docs.nocobase.com/b082308f62a3a9084cab78a370c14a9f.gif) + +- **Удаление (Delete)**: Управляет отображением кнопки удаления в блоке. + +![](https://static-docs.nocobase.com/021c9e79bcc1ad221b606a9555ff5644.gif) + +- **Экспорт (Export)**: Управляет отображением кнопки экспорта в блоке. +- **Импорт (Import)**: Управляет отображением кнопки импорта в блоке. + +#### Права на связи + +##### Используется как поле + +- Видимость поля-связи определяется правами, заданными для полей исходной таблицы. Эти права управляют отображением всего компонента поля связи в интерфейсе. + +Например, в таблице "Заказы" поле связи "Клиент" ограничено правами только на просмотр и экспорт/импорт, как показано ниже: + +![Пример прав на поле связи](https://static-docs.nocobase.com/d0dc797aae73feeabc436af285dd4f59.png) + +В интерфейсе такое ограничение означает, что поле "Клиент" не будет отображаться в формах добавления и редактирования таблицы "Заказы". + +Полный процесс настройки показан ниже: + +![Example Configuration Process](https://static-docs.nocobase.com/372f8a4f414feea097c23b2ba326c0ef.gif) + +- Права на поля внутри компонента связи (например, в подтаблицах или подформах) определяются правами целевой таблицы. + +Если компонент связи реализован как подформа: + +В этом случае, как показано, поле связи "Клиент" в таблице "Заказы" имеет полный доступ, а сама таблица "Клиенты" настроена только для чтения. + +Права таблицы "Заказы" настроены следующим образом, предоставляя полю связи "Клиент" полный доступ: + +![Права таблицы Заказы](https://static-docs.nocobase.com/3a3ab9722f14a7b3a35361219d67fa40.png) + +Права таблицы "Клиенты" настроены на доступ только для просмотра: + +![Права таблицы Клиенты](https://static-docs.nocobase.com/46704d179b931006a9a22852e6c5089e.png) + +В пользовательском интерфейсе это приводит к тому, что поле связи "Клиент" отображается в разделе таблицы "Заказы". Однако при переключении интерфейса в режим подформы (где поля подформы отображаются в деталях, но скрыты при создании или редактировании), поведение изменяется соответствующим образом. + +Полный процесс настройки показан ниже: + +![Пример настройки](https://static-docs.nocobase.com/932dbf6ac46e36ee357ff3e8b9ea1423.gif) + +Дополнительная настройка прав полей в подформе позволяет контролировать отдельные поля: + +Например, как показано ниже, в таблице "Клиенты" можно настроить, чтобы поле "Имя клиента" было недоступным для просмотра и редактирования: + +![Права на поле Клиенты](https://static-docs.nocobase.com/e7b875521cbc4e28640f027f36d0413c.png) + +Процесс настройки отображён здесь: + +![Процесс настройки](https://static-docs.nocobase.com/7a07e68c2fe2a13f0c2cef19be489264.gif) + +Если используется подтаблица вместо подформы, принципы настройки остаются теми же: + +Как показано, поле связи "Отгрузка" в таблице "Заказы" имеет полный доступ, в то время как сама коллекция отгрузок (shipment) доступна только для просмотра. + +В интерфейсе это позволяет отобразить поле связи. Однако при переключении интерфейса в режим подтаблицы (где поля отображаются только при просмотре, но скрыты при создании и редактировании), поведение изменяется: + +![Права поля Отгрузка](https://static-docs.nocobase.com/fd4b7d81cdd765db789d9c85cf9dc324.gif) + +Точная настройка полей подколлекции также позволяет отдельно управлять отображением каждого поля: + +![Права полей подтаблицы](https://static-docs.nocobase.com/51d70a624cb2b0366e421bcdc8abb7fd.gif) + +##### Когда используется как блок + +- Видимость блока связи управляется правами, установленными для целевой таблицы, связанной с полем связи, независимо от самих прав на поле связи. + +Например, видимость блока связи "Клиент" определяется настройками прав таблицы "Клиенты": + +![Видимость блока связи](https://static-docs.nocobase.com/633ebb301767430b740ecfce11df47b3.gif) + +- Права на поля внутри блока связи управляются правами, установленными на поля целевой таблицы. + +Как показано ниже, таблицу "Клиенты" можно настроить так, чтобы были доступны только определённые поля: + +![Права на просмотр полей таблицы Клиенты](https://static-docs.nocobase.com/35af9426c20911323b17f67f81bac8fc.gif) + diff --git a/docs/ru-RU/handbook/acl/user/static/ApOObW9lGoRGE0xcFcscpDZ5nid.png b/docs/ru-RU/handbook/acl/user/static/ApOObW9lGoRGE0xcFcscpDZ5nid.png new file mode 100755 index 0000000000..db526bc482 Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/ApOObW9lGoRGE0xcFcscpDZ5nid.png differ diff --git a/docs/ru-RU/handbook/acl/user/static/AtS4bAdLCojw2Ex4FvjcEn1tngx.gif b/docs/ru-RU/handbook/acl/user/static/AtS4bAdLCojw2Ex4FvjcEn1tngx.gif new file mode 100755 index 0000000000..7fee988d67 Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/AtS4bAdLCojw2Ex4FvjcEn1tngx.gif differ diff --git a/docs/ru-RU/handbook/acl/user/static/CIZCbruUtoFZe1xIHUWcS2HwnEh.png b/docs/ru-RU/handbook/acl/user/static/CIZCbruUtoFZe1xIHUWcS2HwnEh.png new file mode 100755 index 0000000000..dab9413b26 Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/CIZCbruUtoFZe1xIHUWcS2HwnEh.png differ diff --git a/docs/ru-RU/handbook/acl/user/static/DAICbLqwLo6nLzx9LcpcRFj5nAf.png b/docs/ru-RU/handbook/acl/user/static/DAICbLqwLo6nLzx9LcpcRFj5nAf.png new file mode 100755 index 0000000000..afa7b374f9 Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/DAICbLqwLo6nLzx9LcpcRFj5nAf.png differ diff --git a/docs/ru-RU/handbook/acl/user/static/DYmDbQ2AGoZzCGxgQrcccDgNnVg.gif b/docs/ru-RU/handbook/acl/user/static/DYmDbQ2AGoZzCGxgQrcccDgNnVg.gif new file mode 100755 index 0000000000..8dac8e6605 Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/DYmDbQ2AGoZzCGxgQrcccDgNnVg.gif differ diff --git a/docs/ru-RU/handbook/acl/user/static/E5P7bepyPobSYhxIFH3c1T1onRg.png b/docs/ru-RU/handbook/acl/user/static/E5P7bepyPobSYhxIFH3c1T1onRg.png new file mode 100755 index 0000000000..f06b7366db Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/E5P7bepyPobSYhxIFH3c1T1onRg.png differ diff --git a/docs/ru-RU/handbook/acl/user/static/EB0gbEm3bo7zXfxzcxocAh1snth.gif b/docs/ru-RU/handbook/acl/user/static/EB0gbEm3bo7zXfxzcxocAh1snth.gif new file mode 100755 index 0000000000..b07b608674 Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/EB0gbEm3bo7zXfxzcxocAh1snth.gif differ diff --git a/docs/ru-RU/handbook/acl/user/static/EIvgbZPupooY9IxeH5Gc0Vxan0g.png b/docs/ru-RU/handbook/acl/user/static/EIvgbZPupooY9IxeH5Gc0Vxan0g.png new file mode 100755 index 0000000000..145e066032 Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/EIvgbZPupooY9IxeH5Gc0Vxan0g.png differ diff --git a/docs/ru-RU/handbook/acl/user/static/EiCSbyvcToilFqxngPlcabEnnog.gif b/docs/ru-RU/handbook/acl/user/static/EiCSbyvcToilFqxngPlcabEnnog.gif new file mode 100755 index 0000000000..b396b58eb9 Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/EiCSbyvcToilFqxngPlcabEnnog.gif differ diff --git a/docs/ru-RU/handbook/acl/user/static/FoykbYbvNorP1axz1DKcdQ66nrh.png b/docs/ru-RU/handbook/acl/user/static/FoykbYbvNorP1axz1DKcdQ66nrh.png new file mode 100755 index 0000000000..ace81a4ade Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/FoykbYbvNorP1axz1DKcdQ66nrh.png differ diff --git a/docs/ru-RU/handbook/acl/user/static/FpqdbZ04noXYClxvvPBcYsPFnNf.png b/docs/ru-RU/handbook/acl/user/static/FpqdbZ04noXYClxvvPBcYsPFnNf.png new file mode 100755 index 0000000000..16bfebd242 Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/FpqdbZ04noXYClxvvPBcYsPFnNf.png differ diff --git a/docs/ru-RU/handbook/acl/user/static/FshmbDt5connlpxtExrc73orn1b.png b/docs/ru-RU/handbook/acl/user/static/FshmbDt5connlpxtExrc73orn1b.png new file mode 100755 index 0000000000..1d2f3dafbc Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/FshmbDt5connlpxtExrc73orn1b.png differ diff --git a/docs/ru-RU/handbook/acl/user/static/GR9jb8gPso3LRjxFIb9cndOBnub.gif b/docs/ru-RU/handbook/acl/user/static/GR9jb8gPso3LRjxFIb9cndOBnub.gif new file mode 100755 index 0000000000..92d4a71db8 Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/GR9jb8gPso3LRjxFIb9cndOBnub.gif differ diff --git a/docs/ru-RU/handbook/acl/user/static/GYWIbViYxo2peYxT0xMcyZO2n5c.png b/docs/ru-RU/handbook/acl/user/static/GYWIbViYxo2peYxT0xMcyZO2n5c.png new file mode 100755 index 0000000000..89d8a8a82d Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/GYWIbViYxo2peYxT0xMcyZO2n5c.png differ diff --git a/docs/ru-RU/handbook/acl/user/static/I5uKbd4NXoUBL0x3jpIc6UXrnCb.png b/docs/ru-RU/handbook/acl/user/static/I5uKbd4NXoUBL0x3jpIc6UXrnCb.png new file mode 100755 index 0000000000..7205e40ced Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/I5uKbd4NXoUBL0x3jpIc6UXrnCb.png differ diff --git a/docs/ru-RU/handbook/acl/user/static/IHmhbshM8oDxxJx3VYyc6A7rn1c.png b/docs/ru-RU/handbook/acl/user/static/IHmhbshM8oDxxJx3VYyc6A7rn1c.png new file mode 100755 index 0000000000..67163711d9 Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/IHmhbshM8oDxxJx3VYyc6A7rn1c.png differ diff --git a/docs/ru-RU/handbook/acl/user/static/JVxSbTW1soiPz3xDqiPcTR4Znbe.png b/docs/ru-RU/handbook/acl/user/static/JVxSbTW1soiPz3xDqiPcTR4Znbe.png new file mode 100755 index 0000000000..c45934d82b Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/JVxSbTW1soiPz3xDqiPcTR4Znbe.png differ diff --git a/docs/ru-RU/handbook/acl/user/static/KHgXbk4oRo7qWQxlP2pc5Otnnsd.gif b/docs/ru-RU/handbook/acl/user/static/KHgXbk4oRo7qWQxlP2pc5Otnnsd.gif new file mode 100755 index 0000000000..39af67150d Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/KHgXbk4oRo7qWQxlP2pc5Otnnsd.gif differ diff --git a/docs/ru-RU/handbook/acl/user/static/KNeebcJghocQbVxLltycetuMnTb.gif b/docs/ru-RU/handbook/acl/user/static/KNeebcJghocQbVxLltycetuMnTb.gif new file mode 100755 index 0000000000..9dc5738d96 Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/KNeebcJghocQbVxLltycetuMnTb.gif differ diff --git a/docs/ru-RU/handbook/acl/user/static/MolVbOe3GozpHYx3efAcg5ZLnzg.png b/docs/ru-RU/handbook/acl/user/static/MolVbOe3GozpHYx3efAcg5ZLnzg.png new file mode 100755 index 0000000000..c92bf6db6a Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/MolVbOe3GozpHYx3efAcg5ZLnzg.png differ diff --git a/docs/ru-RU/handbook/acl/user/static/OtZab2PZEomdf5xvZIhcosLAnGc.gif b/docs/ru-RU/handbook/acl/user/static/OtZab2PZEomdf5xvZIhcosLAnGc.gif new file mode 100755 index 0000000000..e52399755d Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/OtZab2PZEomdf5xvZIhcosLAnGc.gif differ diff --git a/docs/ru-RU/handbook/acl/user/static/PFYqbxqCvoAxVUx29UYctS8KnRf.png b/docs/ru-RU/handbook/acl/user/static/PFYqbxqCvoAxVUx29UYctS8KnRf.png new file mode 100755 index 0000000000..dbf809de49 Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/PFYqbxqCvoAxVUx29UYctS8KnRf.png differ diff --git a/docs/ru-RU/handbook/acl/user/static/ROF6b4SkboxFezxftsjczo9GnOb.png b/docs/ru-RU/handbook/acl/user/static/ROF6b4SkboxFezxftsjczo9GnOb.png new file mode 100755 index 0000000000..6493eec908 Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/ROF6b4SkboxFezxftsjczo9GnOb.png differ diff --git a/docs/ru-RU/handbook/acl/user/static/RXwSbzriCorfatxFtbXceEYynrL.png b/docs/ru-RU/handbook/acl/user/static/RXwSbzriCorfatxFtbXceEYynrL.png new file mode 100755 index 0000000000..c7ee54d5fe Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/RXwSbzriCorfatxFtbXceEYynrL.png differ diff --git a/docs/ru-RU/handbook/acl/user/static/RgAIbdr1QofBorxbiYjcG7lun3e.gif b/docs/ru-RU/handbook/acl/user/static/RgAIbdr1QofBorxbiYjcG7lun3e.gif new file mode 100755 index 0000000000..35ef5e0348 Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/RgAIbdr1QofBorxbiYjcG7lun3e.gif differ diff --git a/docs/ru-RU/handbook/acl/user/static/S5lbbuqAwovP2BxIMOjcy1wLnwb.gif b/docs/ru-RU/handbook/acl/user/static/S5lbbuqAwovP2BxIMOjcy1wLnwb.gif new file mode 100755 index 0000000000..6906199be5 Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/S5lbbuqAwovP2BxIMOjcy1wLnwb.gif differ diff --git a/docs/ru-RU/handbook/acl/user/static/SNB8bN20JoxqFwx3BoXc5O9nnod.png b/docs/ru-RU/handbook/acl/user/static/SNB8bN20JoxqFwx3BoXc5O9nnod.png new file mode 100755 index 0000000000..d48cfe9e74 Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/SNB8bN20JoxqFwx3BoXc5O9nnod.png differ diff --git a/docs/ru-RU/handbook/acl/user/static/SyiPbKA9WoJs5FxkZChcrXusnTf.png b/docs/ru-RU/handbook/acl/user/static/SyiPbKA9WoJs5FxkZChcrXusnTf.png new file mode 100755 index 0000000000..3e44c7f6bf Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/SyiPbKA9WoJs5FxkZChcrXusnTf.png differ diff --git a/docs/ru-RU/handbook/acl/user/static/UY2Db5jEyotKkMxS8qoc7C2Nnnv.png b/docs/ru-RU/handbook/acl/user/static/UY2Db5jEyotKkMxS8qoc7C2Nnnv.png new file mode 100755 index 0000000000..856e4c87a9 Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/UY2Db5jEyotKkMxS8qoc7C2Nnnv.png differ diff --git a/docs/ru-RU/handbook/acl/user/static/Vpo9bBdw9oavWoxp2m4cBeDEnod.png b/docs/ru-RU/handbook/acl/user/static/Vpo9bBdw9oavWoxp2m4cBeDEnod.png new file mode 100755 index 0000000000..001171bbaa Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/Vpo9bBdw9oavWoxp2m4cBeDEnod.png differ diff --git a/docs/ru-RU/handbook/acl/user/static/WDiCbdoluonCzDxjHUtc3yKPnmb.png b/docs/ru-RU/handbook/acl/user/static/WDiCbdoluonCzDxjHUtc3yKPnmb.png new file mode 100755 index 0000000000..1ae2173123 Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/WDiCbdoluonCzDxjHUtc3yKPnmb.png differ diff --git a/docs/ru-RU/handbook/acl/user/static/WI0ab4oznobXB8xpL7Jc2PXgnhe.gif b/docs/ru-RU/handbook/acl/user/static/WI0ab4oznobXB8xpL7Jc2PXgnhe.gif new file mode 100755 index 0000000000..93205b40d9 Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/WI0ab4oznobXB8xpL7Jc2PXgnhe.gif differ diff --git a/docs/ru-RU/handbook/acl/user/static/XEU3byFr6osZ5WxgCdCcOKjHnMf.gif b/docs/ru-RU/handbook/acl/user/static/XEU3byFr6osZ5WxgCdCcOKjHnMf.gif new file mode 100755 index 0000000000..da214bb558 Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/XEU3byFr6osZ5WxgCdCcOKjHnMf.gif differ diff --git a/docs/ru-RU/handbook/acl/user/static/XJytbsa8xopRSXxliqRc3YZUnTb.png b/docs/ru-RU/handbook/acl/user/static/XJytbsa8xopRSXxliqRc3YZUnTb.png new file mode 100755 index 0000000000..565c94bfde Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/XJytbsa8xopRSXxliqRc3YZUnTb.png differ diff --git a/docs/ru-RU/handbook/acl/user/static/Y3Yrb3bNGoHJLExWJsGc0I9Jn8d.png b/docs/ru-RU/handbook/acl/user/static/Y3Yrb3bNGoHJLExWJsGc0I9Jn8d.png new file mode 100755 index 0000000000..9c57c69e79 Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/Y3Yrb3bNGoHJLExWJsGc0I9Jn8d.png differ diff --git a/docs/ru-RU/handbook/acl/user/static/Yi7pbJn5votBFXxi5bOcUWuRned.png b/docs/ru-RU/handbook/acl/user/static/Yi7pbJn5votBFXxi5bOcUWuRned.png new file mode 100755 index 0000000000..81fee11192 Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/Yi7pbJn5votBFXxi5bOcUWuRned.png differ diff --git a/docs/ru-RU/handbook/acl/user/static/Yot3bmSRSohJUDxbt4ccjc7Enbb.gif b/docs/ru-RU/handbook/acl/user/static/Yot3bmSRSohJUDxbt4ccjc7Enbb.gif new file mode 100755 index 0000000000..b381813115 Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/Yot3bmSRSohJUDxbt4ccjc7Enbb.gif differ diff --git a/docs/ru-RU/handbook/acl/user/static/ZtAbbjIk3oJzg8xH9fccXrFenmf.png b/docs/ru-RU/handbook/acl/user/static/ZtAbbjIk3oJzg8xH9fccXrFenmf.png new file mode 100755 index 0000000000..dd90c2d850 Binary files /dev/null and b/docs/ru-RU/handbook/acl/user/static/ZtAbbjIk3oJzg8xH9fccXrFenmf.png differ diff --git a/docs/ru-RU/handbook/action-bulk-edit/index.md b/docs/ru-RU/handbook/action-bulk-edit/index.md new file mode 100644 index 0000000000..18256c8ff7 --- /dev/null +++ b/docs/ru-RU/handbook/action-bulk-edit/index.md @@ -0,0 +1,25 @@ +# **Массовое редактирование** + +## Введение + +Функция массового редактирования предназначена для ситуаций, когда необходимо применить разную логику обновления к различным группам записей. Это обеспечивает высокую гибкость при обработке данных. При нажатии пользователем кнопки массового редактирования появляется интерфейс настройки, позволяющий задать индивидуальную логику назначения значений для каждого поля. Это даёт возможность точно управлять обновлением записей в соответствии с конкретными потребностями. + +![Интерфейс массового редактирования](https://static-docs.nocobase.com/70e1fb4122f56fc340405b16d229bd60.png) + +## Установка + +## Руководство пользователя + +1. Выберите данные для массового редактирования: "Выбранные" или "Все". По умолчанию используется вариант "Выбранные". + +![Выбор данных для редактирования](https://static-docs.nocobase.com/c158538d86397bd48fdaed606b647166.png) + +2. Задайте логику обновления для каждого поля. Доступные опции: + +- Не изменять +- Изменить на заданное значение +- Очистить поле + +В приведённом примере операция массового редактирования выполняется в блоке таблицы "Отгрузки". У выбранных записей способ транспортировки обновляется на "авиа", а подтверждение доставки и фактическое время прибытия — очищаются. + +![Настройка массового редактирования](https://static-docs.nocobase.com/65db9e898d11b01441b7830895f4dd76.gif) diff --git a/docs/ru-RU/handbook/action-bulk-edit/static/ADLkbw3g0o4dgBxncrGcqxsAnpf.png b/docs/ru-RU/handbook/action-bulk-edit/static/ADLkbw3g0o4dgBxncrGcqxsAnpf.png new file mode 100644 index 0000000000..7d6e2fb1cc Binary files /dev/null and b/docs/ru-RU/handbook/action-bulk-edit/static/ADLkbw3g0o4dgBxncrGcqxsAnpf.png differ diff --git a/docs/ru-RU/handbook/action-bulk-edit/static/H6CCbiXCJossUKxi15ucGt8mnyh.png b/docs/ru-RU/handbook/action-bulk-edit/static/H6CCbiXCJossUKxi15ucGt8mnyh.png new file mode 100644 index 0000000000..950d527cbe Binary files /dev/null and b/docs/ru-RU/handbook/action-bulk-edit/static/H6CCbiXCJossUKxi15ucGt8mnyh.png differ diff --git a/docs/ru-RU/handbook/action-bulk-edit/static/NTMAbTY1wowNOGx0iSacsd8anLh.gif b/docs/ru-RU/handbook/action-bulk-edit/static/NTMAbTY1wowNOGx0iSacsd8anLh.gif new file mode 100644 index 0000000000..a9cd61e370 Binary files /dev/null and b/docs/ru-RU/handbook/action-bulk-edit/static/NTMAbTY1wowNOGx0iSacsd8anLh.gif differ diff --git a/docs/ru-RU/handbook/action-bulk-update/index.md b/docs/ru-RU/handbook/action-bulk-update/index.md new file mode 100644 index 0000000000..7eedb537a0 --- /dev/null +++ b/docs/ru-RU/handbook/action-bulk-update/index.md @@ -0,0 +1,16 @@ +# Массовое обновление + +## Введение + +Функция массового обновления предназначена для случаев, когда необходимо внести однотипные изменения в несколько записей. Перед выполнением обновления пользователю необходимо задать логику присвоения значений для обновляемых полей. Эта логика будет применена ко всем выбранным записям после нажатия кнопки обновления. + +![](https://static-docs.nocobase.com/d9e6804f7cdbecd43ce4695bb83561cd.png) + +## Руководство пользователя + +1. Установите диапазон данных для обновления: выберите между «Выбранные» или «Все» (по умолчанию — «Выбранные»). +2. Присвоение полей: укажите, какие поля будут включены в массовое обновление — изменения затронут только указанные поля. + +В приведённом примере массовое обновление настроено для таблицы накладных (waybill) с целью отметить выбранные записи как «Доставка подтверждена». + +![](https://static-docs.nocobase.com/41eb7980cd31ebfb013c05c1bbb747a5.gif) diff --git a/docs/ru-RU/handbook/action-bulk-update/static/CWWrbfcHho0vphxAHu1cQdDTnIf.gif b/docs/ru-RU/handbook/action-bulk-update/static/CWWrbfcHho0vphxAHu1cQdDTnIf.gif new file mode 100644 index 0000000000..bb8289eee8 Binary files /dev/null and b/docs/ru-RU/handbook/action-bulk-update/static/CWWrbfcHho0vphxAHu1cQdDTnIf.gif differ diff --git a/docs/ru-RU/handbook/action-bulk-update/static/Tb0ZbOmd1oqw9TxWVamcOEhrntd.png b/docs/ru-RU/handbook/action-bulk-update/static/Tb0ZbOmd1oqw9TxWVamcOEhrntd.png new file mode 100644 index 0000000000..33fc353d8e Binary files /dev/null and b/docs/ru-RU/handbook/action-bulk-update/static/Tb0ZbOmd1oqw9TxWVamcOEhrntd.png differ diff --git a/docs/ru-RU/handbook/action-custom-request/index.md b/docs/ru-RU/handbook/action-custom-request/index.md new file mode 100644 index 0000000000..7c672244b2 --- /dev/null +++ b/docs/ru-RU/handbook/action-custom-request/index.md @@ -0,0 +1,52 @@ +# Пользовательский запрос + + +## Обзор + +## Установка + +Плагин встроен в систему, установка не требуется. + +## Инструкция по использованию + +![20240426120014](https://static-docs.nocobase.com/20240426120014.png) + +### Настройка прав + +При включении опции **«Можно настраивать интерфейс»** становится доступна настройка пользовательских запросов. + +![20240426114957](https://static-docs.nocobase.com/20240426114957.png) + +Таблица `customRequests` является системной, а доступ к ней управляется через метод `acl.registerSnippet`. + +```typescript +this.app.acl.registerSnippet({ + name: 'ui.customRequests', // Право на конфигурацию интерфейса, связанного с ui.* + actions: ['customRequests:*'], +}); +``` + +### Переменные + +Можно задавать переменные как в URL, так и в теле запроса: + +- Текущая запись +- Текущий пользователь +- Текущее время +- API токен (поддерживается с версии v1.3.22-beta и выше) + +![20240426120953](https://static-docs.nocobase.com/20240426120953.png) + +![20240426121051](https://static-docs.nocobase.com/20240426121051.png) + +## Конфигурация операций + +### Настройки запроса + +![20240426120131](https://static-docs.nocobase.com/20240426120131.png) + +### Контроль доступа + +Каждому пользовательскому запросу можно задать права доступа по ролям. По умолчанию доступ открыт для всех пользователей. + +![20240426120451](https://static-docs.nocobase.com/20240426120451.png) diff --git a/docs/ru-RU/handbook/action-duplicate/index.md b/docs/ru-RU/handbook/action-duplicate/index.md new file mode 100644 index 0000000000..da5b20c1d4 --- /dev/null +++ b/docs/ru-RU/handbook/action-duplicate/index.md @@ -0,0 +1,99 @@ +# Копирование + + + +## Обзор + +Функция копирования позволяет создавать новые записи на основе существующих. Поддерживаются два режима: прямое копирование и копирование в форму с возможностью редактирования. + +## Установка + +Плагин встроенный, установка не требуется. + +## Режимы копирования + +### Прямое копирование + +![](https://static-docs.nocobase.com/2c0ac5d1a539de4b72b49b7d966d8c09.png) + +- По умолчанию используется режим прямого копирования; +- Целевая коллекция: указывается, куда будет сохраняться копируемая запись (в случае унаследованных таблиц можно копировать в подтаблицу. Прямое копирование работает только в пределах текущей таблицы); +- Поля данных: указываются поля, которые необходимо скопировать. Обязательны для выбора. + +После настройки достаточно нажать кнопку, чтобы выполнить копирование. + +### Копирование в форму с возможностью редактирования + +Выбранные поля из шаблона будут автоматически подставлены в форму как значения по умолчанию, которые можно изменить перед сохранением. + +Можно копировать данные как в текущую таблицу, так и в подтаблицу (в случае наследования). + +![](https://static-docs.nocobase.com/a072aa572fd0a0fe643eadf95471da2a.png) + +Настройка полей шаблона: только выбранные поля будут отображаться в форме с предзаполненными значениями. + +![](https://static-docs.nocobase.com/8032fa2025180ade275da55b97774b4d.png) + +Поле связи "Накладная" (отношение o2m) скопировано, и его компонент отображается как подформа. Поля внутри подформы также настраиваются. + +![](https://static-docs.nocobase.com/b13c9287bae8601646727a2e78b81be7.png) + +#### Синхронизация с полями формы + +- Система автоматически распознаёт поля, уже настроенные в текущем блоке формы, как поля шаблона; +- После изменения полей в блоке формы (например, компонентов связи), можно снова открыть настройки шаблона и нажать **"Синхронизировать с формой"** для актуализации. + +![](https://static-docs.nocobase.com/156b6d8d741521e63d12e49092414d58.png) + +Шаблонные данные автоматически подставляются в форму, где их можно отредактировать перед сохранением. + +![](https://static-docs.nocobase.com/1c0a0ae0c59971f48b2282a68831d44b.png) + +Ниже пример настройки копирования для списка заказов: + +![](https://static-docs.nocobase.com/fa8a89abf0ba136df04b6d0d838eae4e.gif) + +### Дополнительная информация + +#### Копирование, ссылки и предзагрузка + +Разные типы полей (с разными типами связей) требуют разной логики обработки: копирование, ссылка или предзагрузка. Также важны используемые компоненты поля связи: Select и Record picker используют ссылки, Sub-form и Sub-table — копирование. + +- **Копирование**: + - Обычные поля копируются; + - Для `hasOne` и `hasMany` — только копирование (эти типы связей не могут использовать Select/Record picker, только Sub-form/Sub-table); + - Изменение компонентов этих полей не влияет на тип копирования; + - Все вложенные поля доступны для выбора. + +- **Ссылки**: + + - `belongsTo` и `belongsToMany` обрабатываются как ссылки; + - **Ссылки можно превратить в копию**, например, если компонент поля изменится с Select на подформу — связь станет копией, и все вложенные поля станут доступными для выбора. + +- **Предзагрузка**: + + - Поля внутри ссылочных связей могут быть предзагружены; + - Изменения предзагружаемых полей могут изменить логику на копирование или ссылку. + +#### Выбрать всё + +- По умолчанию выбраны все доступные поля для копирования и ссылок. + +#### Исключения при использовании шаблонов данных + +Из копируемых полей исключаются: +- Первичные ключи связей (но не ссылок и предзагрузок) +- Внешние ключи +- Уникальные поля +- Поля сортировки +- Автоматически генерируемые поля +- Пароли +- Автор записи +- Дата создания +- Кто обновил +- Дата обновления + +#### Синхронизация с формой + +- Все поля, добавленные в блок формы, автоматически определяются как поля шаблона; +- После изменения структуры формы, снова откройте настройки шаблона и нажмите **"Синхронизировать с формой"**. diff --git a/docs/ru-RU/handbook/action-duplicate/static/KR15bOuXoo0u5QxZXmjcNbUJnoe.png b/docs/ru-RU/handbook/action-duplicate/static/KR15bOuXoo0u5QxZXmjcNbUJnoe.png new file mode 100644 index 0000000000..e8f44ef8a0 Binary files /dev/null and b/docs/ru-RU/handbook/action-duplicate/static/KR15bOuXoo0u5QxZXmjcNbUJnoe.png differ diff --git a/docs/ru-RU/handbook/action-duplicate/static/Ox76b54eho4fTUxdk67cjcjenCc.png b/docs/ru-RU/handbook/action-duplicate/static/Ox76b54eho4fTUxdk67cjcjenCc.png new file mode 100644 index 0000000000..f8b3c89509 Binary files /dev/null and b/docs/ru-RU/handbook/action-duplicate/static/Ox76b54eho4fTUxdk67cjcjenCc.png differ diff --git a/docs/ru-RU/handbook/action-duplicate/static/Pkf4bvn30oWEIjxrFmPc3d0lnPd.png b/docs/ru-RU/handbook/action-duplicate/static/Pkf4bvn30oWEIjxrFmPc3d0lnPd.png new file mode 100644 index 0000000000..c237b712b2 Binary files /dev/null and b/docs/ru-RU/handbook/action-duplicate/static/Pkf4bvn30oWEIjxrFmPc3d0lnPd.png differ diff --git a/docs/ru-RU/handbook/action-duplicate/static/QqICbfLMMozpgBxYBpMcKuOKnmg.png b/docs/ru-RU/handbook/action-duplicate/static/QqICbfLMMozpgBxYBpMcKuOKnmg.png new file mode 100644 index 0000000000..8038a1a90e Binary files /dev/null and b/docs/ru-RU/handbook/action-duplicate/static/QqICbfLMMozpgBxYBpMcKuOKnmg.png differ diff --git a/docs/ru-RU/handbook/action-duplicate/static/R3f2biRIdoEm7DxUO6Ec1abXnKc.gif b/docs/ru-RU/handbook/action-duplicate/static/R3f2biRIdoEm7DxUO6Ec1abXnKc.gif new file mode 100644 index 0000000000..c31a4b0508 Binary files /dev/null and b/docs/ru-RU/handbook/action-duplicate/static/R3f2biRIdoEm7DxUO6Ec1abXnKc.gif differ diff --git a/docs/ru-RU/handbook/action-duplicate/static/RZhIbo49lo2vV5xV5hZc0jkfn1d.png b/docs/ru-RU/handbook/action-duplicate/static/RZhIbo49lo2vV5xV5hZc0jkfn1d.png new file mode 100644 index 0000000000..aef3d62f68 Binary files /dev/null and b/docs/ru-RU/handbook/action-duplicate/static/RZhIbo49lo2vV5xV5hZc0jkfn1d.png differ diff --git a/docs/ru-RU/handbook/action-duplicate/static/U9VCbG9I6ohTzQxzvPIc6oR3nid.png b/docs/ru-RU/handbook/action-duplicate/static/U9VCbG9I6ohTzQxzvPIc6oR3nid.png new file mode 100644 index 0000000000..889475c16a Binary files /dev/null and b/docs/ru-RU/handbook/action-duplicate/static/U9VCbG9I6ohTzQxzvPIc6oR3nid.png differ diff --git a/docs/ru-RU/handbook/action-export-pro/index.md b/docs/ru-RU/handbook/action-export-pro/index.md new file mode 100644 index 0000000000..28e835c825 --- /dev/null +++ b/docs/ru-RU/handbook/action-export-pro/index.md @@ -0,0 +1,56 @@ +# Экспорт записей Pro + + + +## Введение + +Плагин **Экспорт записей Pro** расширяет возможности стандартного экспорта данных. + +## Установка + +Для работы плагина требуется активированный плагин управления асинхронными задачами. Пожалуйста, включите его перед использованием. + +## Расширенные возможности + +- Поддержка асинхронного экспорта — выполнение в отдельном потоке, подходит для больших объёмов данных. +- Поддержка экспорта вложений. + +## Руководство пользователя + +### Настройка режима экспорта + +![index-2025-01-13-20-58-39](https://static-docs.nocobase.com/index-2025-01-13-20-58-39.png) + +Вы можете настроить режим экспорта на кнопке экспорта. Доступны три варианта: + +- **Auto**: Определяет режим автоматически. При количестве записей < 1000 (или < 100 для вложений) используется синхронный режим; при превышении — асинхронный. +- **Sync**: Синхронный экспорт — выполняется в основном потоке. Подходит для небольших объёмов. При больших данных может вызывать подвисание системы. +- **Async**: Асинхронный экспорт — выполняется в фоновом потоке, не блокируя интерфейс и систему. + +### Асинхронный экспорт + +После запуска экспорта процесс выполняется в фоне без участия пользователя. В интерфейсе задание появляется в правом верхнем углу, отображая статус выполнения. + +![index-2024-12-30-09-21-05](https://static-docs.nocobase.com/index-2024-12-30-09-21-05.png) + +После завершения можно скачать готовый файл из задачи экспорта. + +### Экспорт вложений + +Поддерживается экспорт полей-вложений в виде zip-архива. + +#### Настройка экспорта вложений + +![index-2024-12-30-09-16-55](https://static-docs.nocobase.com/index-2024-12-30-09-16-55.png) + +- Выберите поля вложений для экспорта (допускается множественный выбор). +- Можно настроить создание отдельной папки для каждой записи. + +**Правила именования файлов:** + +- Если включено создание папки: + `{значение заголовочного поля записи}/{название поля вложения}[-{номер файла}].{расширение}` +- Без папок: + `{значение заголовочного поля записи}-{название поля вложения}[-{номер файла}].{расширение}` + +Номер файла автоматически добавляется, если в одном поле несколько вложений. diff --git a/docs/ru-RU/handbook/action-export/index.md b/docs/ru-RU/handbook/action-export/index.md new file mode 100644 index 0000000000..1c3eb56e2d --- /dev/null +++ b/docs/ru-RU/handbook/action-export/index.md @@ -0,0 +1,23 @@ +# Экспорт + + + +## Введение + +![](https://static-docs.nocobase.com/20240426162728.png) + +## Установка + +Плагин предустановлен и не требует дополнительной установки. + +## Настройки операций + +![](https://static-docs.nocobase.com/20240426163008.png) + +### Доступные для экспорта поля + +- **Первый уровень**: Отображаются все поля текущей коллекции. +- **Второй уровень**: Если поле является связью, нужно выбрать поля из связанной таблицы. +- **Третий уровень**: Поддерживается только до трёх уровней вложенных связей. Поля на последнем уровне связей отображаться не будут. + +![](https://static-docs.nocobase.com/20240426163433.png) diff --git a/docs/ru-RU/handbook/action-import-pro/index.md b/docs/ru-RU/handbook/action-import-pro/index.md new file mode 100644 index 0000000000..8f1254de69 --- /dev/null +++ b/docs/ru-RU/handbook/action-import-pro/index.md @@ -0,0 +1,64 @@ +# Импорт Pro + + + +## Введение + +Плагин Импорт Pro предоставляет расширенные возможности на основе обычного импорта. + +## Установка + +Этот плагин зависит от плагина управления асинхронными задачами. Пожалуйста, включите плагин async task management перед использованием. + +## Расширенные возможности + +- Поддержка асинхронного импорта, выполняемого в отдельных потоках — подходит для загрузки больших объёмов данных. +- Поддержка расширенных параметров импорта. + +## Руководство пользователя + +### Асинхронный импорт + +После запуска импорта процесс будет выполнен в отдельном фоновом потоке без необходимости ручной настройки пользователем. В пользовательском интерфейсе, после выполнения операции импорта, задача будет отображаться в правом верхнем углу, с отображением прогресса. + +![index-2024-12-30-09-21-05](https://static-docs.nocobase.com/index-2024-12-30-09-21-05.png) + +После завершения импорта вы можете просмотреть результаты задачи импорта. + +### Настройки импорта + +#### Опции импорта — Запуск workflow + +![20250306231010](https://static-docs.nocobase.com/20250306231010.png) + +При импорте можно указать, запускать ли workflow. Если опция включена и таблица привязана к workflow (через события таблицы), то он будет запускаться для каждой строки данных. + +#### Опции импорта — Обнаружение дубликатов + +![20250306231054](https://static-docs.nocobase.com/20250306231054.png) + +При выборе этой опции вы можете указать режим обработки дубликатов, и система будет автоматически определять и обрабатывать такие записи при импорте. + +Выбранные настройки будут использоваться по умолчанию. Администратор может задать возможность или запрет на изменение этих настроек загрузчиком (кроме опции запуска workflow). + +#### Права загрузчика + +![20250306232121](https://static-docs.nocobase.com/20250306232121.png) + +- Разрешить загрузчику изменять параметры импорта + +![20250306230531](https://static-docs.nocobase.com/20250306230531.png) + +- Запретить загрузчику изменять параметры импорта + +![20250306230650](https://static-docs.nocobase.com/20250306230650.png) + +#### Описание режимов + +- **Пропустить дубликаты**: проверка по полю идентификации. Если запись уже существует — пропускается; если нет — импортируется как новая. +- **Обновить дубликаты**: если запись найдена — обновляется; если нет — импортируется как новая. +- **Обновить только дубликаты**: если запись найдена — обновляется; если нет — пропускается. + +#### Поля идентификации + +Система определяет наличие дубликата на основе значений, указанных в этом поле. diff --git a/docs/ru-RU/handbook/action-import/index.md b/docs/ru-RU/handbook/action-import/index.md new file mode 100644 index 0000000000..bb1c3fd0e0 --- /dev/null +++ b/docs/ru-RU/handbook/action-import/index.md @@ -0,0 +1,215 @@ +# Импорт данных + +## Обзор + +## Установка + +## Рекомендации по импорту + +### Числовые поля + +Поддерживаются числовые и процентные значения. Значения вроде `N/A` или `-` будут исключены. + +| Число 1 | Процент | Число 2 | Число 3 | +|---------|---------|---------|---------| +| 123 | 25% | N/A | - | + +После преобразования в JSON: + +```ts +{ + "Number 1": 123, + "Percentage": 0.25, + "Number 2": null, + "Number 3": null, +} +``` + +### Булевы поля + +Распознаются следующие значения (регистр в английском не учитывается): + +- `Yes`, `Y`, `True`, `1`, `是` +- `No`, `N`, `False`, `0`, `否` + +| Field 1 | Field 2 | Field 3 | Field 4 | Field 5 | +| ------- | ------- | ------- | ------- | ------- | +| No | Yes | Y | true | 0 | + +После преобразования в JSON: + +```ts +{ + "Field 1": false, + "Field 2": true, + "Field 3": true, + "Field 4": true, + "Field 5": false, +} +``` + +### Поля даты + +| DateOnly | Local (+08:00) | GMT | +| ------------------- | ------------------- | ------------------- | +| 2023-01-18 22:22:22 | 2023-01-18 22:22:22 | 2023-01-18 22:22:22 | + +После преобразования в JSON: + +```ts +{ + "DateOnly": "2023-01-18T00:00:00.000Z", + "Local (+08:00)": "2023-01-18T14:22:22.000Z", + "GMT": "2023-01-18T22:22:22.000Z", +} +``` + +### Поля выбора (Select Fields) + +Значения и метки опций можно использовать взаимозаменяемо. Несколько опций можно разделять запятыми (`\,`, `,`) или полноширинными запятыми (`、`). + +Например, если поле `Priority` имеет следующие опции: + +| Option Value | Option Label | +| ------------ | ------------ | +| low | Low | +| medium | Medium | +| high | High | + +Оба варианта — и значение, и метка — могут использоваться в качестве входных данных. + +| Priority | +| -------- | +| High | +| low | + +После преобразования в JSON: + +```ts +[{ Priority: 'high' }, { Priority: 'low' }]; +``` + +### Поля китайских административных регионов + +| Region 1 | Region 2 | +| -------------- | -------------- | +| Beijing/City | Tianjin/City | + +После преобразования в JSON: + +```ts +{ + "Region 1": ["11", "1101"], + "Region 2": ["12", "1201"] +} +``` + +### Поля вложений (Attachment Fields) + +| Attachment | +| ----------------------------------------- | +| https://www.nocobase.com/images/logo.png | + +После преобразования в JSON: + +```ts +{ + "Attachment": [ + { + "filename": "logo.png", + "title": "logo.png", + "extname": ".png", + "url": "https://www.nocobase.com/images/logo.png" + } + ] +} +``` + +### Поля связей (Relationship Fields) + +Несколько значений могут быть разделены запятой (`,` `,`) или полной запятой (`、`). + +| Department/Name | Category/Title | +| --------------- | ---------------- | +| Development | Category 1, Category 2 | + +После преобразования в JSON: + +```ts +{ + "Department": [1], // 1 is the record ID for the department named "Development" + "Category": [1, 2], // 1 and 2 are the record IDs for categories titled "Category 1" and "Category 2" +} +``` + +### Поля JSON (JSON Fields) + +| JSON1 | +| ------------------ | +| {"key":"value"} | + +После преобразования в JSON: + +```ts +{ + "JSON": {"key":"value"} +} +``` + +### Поля геометрии карты (Map Geometry Fields) + +| Point | Line | Polygon | Circle | +| ------ | ------------ | ----------------- | ------ | +| 1,2 | (1,2),(3,4) | (1,2),(3,4),(1,2) | 1,2,3 | + +После преобразования в JSON: + +```ts +{ + "Point": [1,2], + "Line": [[1,2], [3,4]], + "Polygon": [[1,2], [3,4], [1,2]], + "Circle": [1,2,3] +} +``` + +## Пользовательский формат импорта + +Вы можете зарегистрировать пользовательские методы `ValueParser` с помощью метода `db.registerFieldValueParsers()`. Например: + +```ts +import { BaseValueParser } from '@nocobase/database'; + +class PointValueParser extends BaseValueParser { + async setValue(value) { + if (Array isArray(value)) { + this.value = value; + } else if (typeof value was string) { + this.value = value.split(','); + } else { + this.errors.push('Value invalid'); + } + } +} + +const db = new Database(); + +// For fields of type=point, the data will be parsed using PointValueParser during import +db.registerFieldValueParsers({ + point: PointValueParser, +}); +``` + +### Пример импорта + +| Point | +| ----- | +| 1,2 | + +После преобразования в JSON: + +```ts +{ + "Point": [1,2] +} +``` diff --git a/docs/ru-RU/handbook/action-print/index.md b/docs/ru-RU/handbook/action-print/index.md new file mode 100644 index 0000000000..d46d72aff1 --- /dev/null +++ b/docs/ru-RU/handbook/action-print/index.md @@ -0,0 +1,13 @@ +# Печать + + + +## Введение + +Кнопка печати — это функциональная кнопка в разделе деталей. При нажатии она запускает функцию печати браузера, позволяя пользователям легко распечатать содержимое на бумаге или сохранить в PDF/другие устройства печати. + +## Установка + +Плагин встроен в систему и не требует отдельной установки. + +![20240426105637](https://static-docs.nocobase.com/20240426105637.png) diff --git a/docs/ru-RU/handbook/action-qr-scan/index.md b/docs/ru-RU/handbook/action-qr-scan/index.md new file mode 100644 index 0000000000..11584f80d5 --- /dev/null +++ b/docs/ru-RU/handbook/action-qr-scan/index.md @@ -0,0 +1,32 @@ +# Сканирование QR-кода + +## Введение + +Действие сканирования QR-кода можно добавить в блок панели действий для упрощения навигации внутри системы. + +## Пример + + + +## Руководство пользователя + +### Генерация QR-кода + +1. Предположим, что ссылка на страницу для перехода: `https://localhost:13000/m/page/vyoiwa25jig`. +2. Извлеките относительную часть ссылки, начиная с `/page/`, и используйте её для генерации QR-кода. +3. Создайте новый Markdown-блок и используйте следующий код: + +```markdown + +``` + +4. Добавьте действие "Сканировать QR-код", чтобы выполнить сканирование и перейти на соответствующую страницу. + +**Примечание**: +- Действие сканирования QR-кода поддерживает только относительные ссылки внутри системы и должно начинаться с `/page/`. +- Внешние ссылки на страницы в настоящее время не поддерживаются. + +Для получения дополнительной информации см. документацию по [Блоку панели действий](/handbook/block-action-panel). + diff --git a/docs/ru-RU/handbook/action-template-print/index.md b/docs/ru-RU/handbook/action-template-print/index.md new file mode 100644 index 0000000000..7175533610 --- /dev/null +++ b/docs/ru-RU/handbook/action-template-print/index.md @@ -0,0 +1,2577 @@ +# Печать по шаблону + + + + +## Введение + +Плагин **Печать по шаблону** — мощный инструмент, который позволяет редактировать шаблоны в форматах Word, Excel и PowerPoint +(поддержка `.docx`, `.xlsx`, `.pptx`), настраивать плейсхолдеры и логические конструкции, а +затем динамически генерировать предформатированные файлы (включая PDF). +Плагин широко используется для создания коммерческих документов: коммерческих предложений, +счетов, договоров и пр., существенно повышая скорость и точность подготовки документов. + +### Основные возможности + +- **Многоформатность**: Поддержка шаблонов Word, Excel и PowerPoint. +- **Динамическое заполнение данных**: Автоматическая генерация документа по плейсхолдерам и логике шаблона. +- **Гибкое управление шаблонами**: Возможность добавления, редактирования, удаления и категоризации шаблонов. +- **Богатый синтаксис шаблонов**: Поддержка подстановок, циклов, условий и других конструкций. +- **Поддержка форматирования**: Условия, форматирование дат и чисел для повышения читабельности и точности. +- **Удобный вывод**: Поддержка экспорта в PDF для печати и отправки. + +## Установка + + + +## Инструкция по настройке + +### Активация шаблонной печати + +1. **Откройте блок с деталями**: + - Перейдите в блок, где будет использоваться функция печати по шаблону. + +2. **Откройте меню "Операции конфигурации"**: + - В верхней части интерфейса нажмите на "Операции конфигурации". + +3. **Выберите пункт "Печать по шаблону"**: + - В выпадающем списке выберите "Печать по шаблону" для активации плагина. + +![Активация шаблона](https://static-docs.nocobase.com/20241212150539-2024-12-12-15-05-43.png) + +### Настройка шаблонов + +1. **Откройте страницу конфигурации шаблона**: + - В меню настройки кнопки "Печать по шаблону" выберите "Конфигурация шаблона". + +![Пункт Конфигурации](https://static-docs.nocobase.com/20241212151858-2024-12-12-15-19-01.png) + +2. **Добавьте новый шаблон**: + - Нажмите "Добавить шаблон", чтобы открыть форму создания. + +![Кнопка добавления шаблона](https://static-docs.nocobase.com/20241212151243-2024-12-12-15-12-46.png) + +3. **Заполните информацию о шаблоне**: + - Укажите название и тип (Word, Excel, PowerPoint). + - Загрузите файл шаблона (`.docx`, `.xlsx`, `.pptx`). + +![Настройка шаблона](https://static-docs.nocobase.com/20241212151518-2024-12-12-15-15-21.png) + +4. **Отредактируйте и сохраните шаблон**: + - Перейдите на вкладку "Список полей", скопируйте нужные и вставьте в шаблон. + ![Список полей](https://static-docs.nocobase.com/20250107141010.png) + ![Поле конфигурации](https://static-docs.nocobase.com/20241212152743-2024-12-12-15-27-45.png) + - Нажмите "Сохранить", чтобы завершить добавление. + +5. **Управление шаблонами**: + - Нажмите "Использовать", чтобы активировать шаблон. + - "Редактировать" — изменить название или заменить файл. + - "Скачать" — загрузить шаблон. + - "Удалить" — удалить шаблон (будет запрошено подтверждение). + +![Управление шаблонами](https://static-docs.nocobase.com/20250107140436.png) + +## Основной синтаксис + +Плагин поддерживает разнообразный синтаксис для динамической генерации документов. + +### Простая подстановка + +Плейсхолдер `{d.xxx}` используется для подстановки значения из данных. Примеры: + +- `{d.title}` — поле `title`. +- `{d.date}` — поле `date`. + +**Пример**: + +Шаблон: +``` +Уважаемый клиент, + +Спасибо что приобрели наш продукт: {d.productName}. +Номер заказа: {d.orderId} +Дата заказа: {d.orderDate} + +Спасибо что остаетесь с нами! +``` + +Набор данных: +```json +{ + "productName": "Умные часы", + "orderId": "A123456789", + "orderDate": "2025-01-01" +} +``` + +Результат: +``` +Уважаемый клиент, + +Спасибо что приобрели наш продукт: Умные часы. +Номер заказа: A123456789 +Дата заказа: 2025-01-01 + +Спасибо что остаетесь с нами! +``` + +### Доступ к вложенным объектам + +Если в наборе данных содержатся вложенные объекты, вы можете получить доступ к их свойствам, +используя точечную нотацию. + +**Синтаксис**: `{d.parent.child}` + +**Пример**: + +Набор данных: +```json +{ + "customer": { + "name": "Иван Петров", + "contact": { + "email": "ivan_petrov@nocobase.ru", + "phone": "79019020000" + } + } +} +``` + +Шаблон: +``` +Клиент: {d.customer.name} +Email: {d.customer.contact.email} +Телеофн: {d.customer.contact.phone} +``` + +Результат: +``` +Клиент: Иван Петров +Email: ivan_petrov@nocobase.ru +Телеофн: 79019020000 +``` + +### Доступ к массивам + +Если в наборе данных содержатся массивы, вы можете использовать зарезервированное слово `i` +для доступа к элементам массива. + +**Синтаксис**: `{d.arrayName[i].field}` + +**Пример**: + +Набор данных: +```json +{ + "staffs": [ + { "firstname": "Андрей", "lastname": "Сембаев" }, + { "firstname": "Петр", "lastname": "Иванов" }, + { "firstname": "Нина", "lastname": "Добрых" } + ] +} +``` + +Шаблон: +``` +Первый сотрудник: фамилия — {d.staffs[i=0].lastname}, имя — {d.staffs[i=0].firstname} +``` + +Результат: +``` +Первый сотрудник: фамилия — Сембаев, имя — Андрей +``` + +Below is the English translation with second-level and third-level headings: + +## Обработка циклов + +Обработка циклов используется для многократного отображения данных из массивов или объектов путём задания начальной и конечной метки для цикла. Ниже приведены несколько распространённых сценариев. + +--- + +### Перебор массивов + +#### 1. Описание синтаксиса + +- Используйте тег `{d.array[i].property}` для обозначения текущего элемента в цикле, и `{d.array[i+1].property}` — для следующего элемента, чтобы определить границы области цикла. +- Во время выполнения цикла первая строка (`[i]` часть) автоматически используется как шаблон для повторения; вам нужно указать пример строки только один раз в шаблоне. + +Пример синтаксиса: + +``` +{d.arrayName[i].property} +{d.arrayName[i+1].property} +``` + +#### 2. Пример: простой цикл по массиву + +##### Данные + +```json +{ + "cars": [ + { "brand": "Toyota", "id": 1 }, + { "brand": "Hyundai", "id": 2 }, + { "brand": "BMW", "id": 3 }, + { "brand": "Peugeot","id": 4 } + ] +} +``` + +##### Шаблон +``` +МашиныID +{d.cars[i].brand}{d.cars[i].id} +{d.cars[i+1].brand} +``` + +##### Результат +``` +МашиныID +Toyota1 +Hyundai2 +BMW3 +Peugeot4 +``` + +--- + +#### 3. Пример: Вложенный цикл по массиву + +Подходит для случаев, когда массив содержит вложенные массивы; уровень вложенности может быть любым. + +##### Данные + +```json +[ + { + "brand": "Toyota", + "models": [ + { "size": "Prius 4", "power": 125 }, + { "size": "Prius 5", "power": 139 } + ] + }, + { + "brand": "Kia", + "models": [ + { "size": "EV4", "power": 450 }, + { "size": "EV6", "power": 500 } + ] + } +] +``` + +##### Шаблон +``` +{d[i].brand} + +Модель +{d[i].models[i].size} - {d[i].models[i].power} +{d[i].models[i+1].size} + +{d[i+1].brand} +``` + +##### Результат +``` +Toyota + +Модель +Prius 4 - 125 +Prius 5 - 139 + +Kia +``` + +--- + +#### 4. Пример: Двунаправленный цикл (расширенная функция, v4.8.0+) + +Двунаправленные циклы позволяют выполнять итерацию одновременно по строкам и столбцам, +что подходит для генерации таблиц сравнения и других сложных макетов +(примечание: в настоящее время некоторые форматы официально поддерживаются только в шаблонах DOCX, HTML и MD). + +##### Данные + +```json +{ + "titles": [ + { "name": "Kia" }, + { "name": "Toyota" }, + { "name": "Hopium" } + ], + "cars": [ + { "models": [ "EV3", "Prius 1", "Prototype" ] }, + { "models": [ "EV4", "Prius 2", "" ] }, + { "models": [ "EV6", "Prius 3", "" ] } + ] +} +``` + +##### Шаблон +``` +{d.titles[i].name}{d.titles[i+1].name} +{d.cars[i].models[i]}{d.cars[i].models[i+1]} +{d.cars[i+1].models[i]} +``` + +##### Результат +``` +KiaToyotaHopium +EV3Prius 1Prototype +EV4Prius 2 +EV6Prius 3 +``` + +--- + +#### 5. Пример: Доступ к значениям итератора в цикле (v4.0.0+) + +Внутри цикла вы можете напрямую получить доступ к индексу текущей итерации, что помогает удовлетворить особые требования к форматированию. + +##### Пример шаблона + +``` +{d[i].cars[i].other.wheels[i].tire.subObject:add(.i):add(..i):add(...i)} +``` + +> Примечание: Количество точек указывает уровень индекса (например, `.i` — текущий уровень, `..i` — предыдущий уровень). В настоящее время существует проблема с обратной сортировкой; пожалуйста, смотрите официальную документацию для получения подробностей. + +--- + +### Перебор объектов + +#### 1. Описание синтаксиса + +- Для свойств в объекте используйте `.att`, чтобы получить имя свойства, и `.val`, чтобы получить значение свойства. +- Во время перебора каждый элемент свойства обрабатывается поочерёдно. + +Пример синтаксиса: + +``` +{d.objectName[i].att} // Имя +{d.objectName[i].val} // Значение +``` + +#### 2. Пример: Перебор свойств объекта + +##### Данные + +```json +{ + "myObject": { + "paul": "10", + "jack": "20", + "bob": "30" + } +} +``` + +##### Шаблон +``` +Люди namePeople Возраст +{d.myObject[i].att}{d.myObject[i].val} +{d.myObject[i+1].att}{d.myObject[i+1].val} +``` + +##### Результат +``` +Люди namePeople Возраст +paul10 +jack20 +bob30 +``` + +--- + +### Сортировка + +С помощью функции сортировки можно напрямую отсортировать данные массива в шаблоне. + +#### 1. Описание синтаксиса: Сортировка по возрастанию + +- Используйте атрибут в качестве критерия сортировки в теге цикла. Формат синтаксиса: + + ``` + {d.array[sortingAttribute, i].property} + {d.array[sortingAttribute+1, i+1].property} + ``` +- Для нескольких критериев сортировки перечислите атрибуты через запятую в скобках. + +#### 2. Пример: Сортировка по числовому атрибуту + +##### Данные + +```json +{ + "cars": [ + { "brand": "Ferrari", "power": 3 }, + { "brand": "Peugeot", "power": 1 }, + { "brand": "BMW", "power": 2 }, + { "brand": "Lexus", "power": 1 } + ] +} +``` + +##### Шаблон +``` +Машина +{d.cars[power, i].brand} +{d.cars[power+1, i+1].brand} +``` + +##### Результат +``` +Cars +Peugeot +Lexus +BMW +Ferrari +``` + +#### 3. Пример: Сортировка по нескольким атрибутам + +##### Данные + +```json +{ + "cars": [ + { "brand": "Ferrari", "power": 3, "sub": { "size": 1 } }, + { "brand": "Aptera", "power": 1, "sub": { "size": 20 } }, + { "brand": "Peugeot", "power": 1, "sub": { "size": 20 } }, + { "brand": "BMW", "power": 2, "sub": { "size": 1 } }, + { "brand": "Kia", "power": 1, "sub": { "size": 10 } } + ] +} +``` + +##### Шаблон +``` +Машины +{d.cars[power, sub.size, i].brand} +{d.cars[power+1, sub.size+1, i+1].brand} +``` + +##### Результат +``` +Cars +Kia +Aptera +Peugeot +BMW +Ferrari +``` + +--- + +### Фильтрация + +Фильтрация используется для исключения строк в цикле на основе заданных условий. + +#### 1. Описание синтаксиса: Фильтрация по числовым значениям + +- Добавьте условия в тег цикла (например, `age > 19`). Формат синтаксиса: + + ``` + {d.array[i, condition].property} + ``` + +#### 2. Пример: Фильтрация по числовому значению + +##### Данные + +```json +[ + { "name": "John", "age": 20 }, + { "name": "Eva", "age": 18 }, + { "name": "Bob", "age": 25 }, + { "name": "Charly", "age": 30 } +] +``` + +##### Шаблон +``` +Люди +{d[i, age > 19, age < 30].name} +{d[i+1, age > 19, age < 30].name} +``` + +##### Результат +``` +People +John +Bob +``` + +--- + +#### 3. Описание синтаксиса: Фильтрация строк + +- Укажите условия строк, используя одинарные кавычки. Например: + ``` + {d.array[i, type='rocket'].name} + ``` + +#### 4. Пример: Фильтрация строк + +##### Данные +```json +[ + { "name": "Falcon 9", "type": "rocket" }, + { "name": "Model S", "type": "car" }, + { "name": "Model 3", "type": "car" }, + { "name": "Falcon Heavy","type": "rocket" } +] +``` + +##### Шаблон +``` +Люди +{d[i, type='rocket'].name} +{d[i+1, type='rocket'].name} +``` + +##### Результат +``` +Люди +Falcon 9 +Falcon Heavy +``` + +--- + +#### 5. Описание синтаксиса: Фильтрация первых N элементов + +- Вы можете использовать индекс цикла `i` для фильтрации первых N элементов. Например: + ``` + {d.array[i, i < N].property} + ``` + +#### 6. Пример: Фильтрация первых двух элементов + +##### Данные +```json +[ + { "name": "Falcon 9" }, + { "name": "Model S" }, + { "name": "Model 3" }, + { "name": "Falcon Heavy" } +] +``` + +##### Шаблон +``` +Люди +{d[i, i < 2].name} +{d[i+1, i < 2].name} +``` + +##### Результат +``` +Люди +Falcon 9 +Model S +``` + +--- + +#### 7. Описание синтаксиса: Исключить последние N элементов + +- Используйте отрицательную индексацию `i` для представления элементов с конца. Например: + - `{d.array[i=-1].property}` retrieves the last item. + - `{d.array[i, i!=-1].property}` excludes the last item. + +#### 8. Пример: Исключение последнего и последних двух элементов + +##### Данные +```json +[ + { "name": "Falcon 9" }, + { "name": "Model S" }, + { "name": "Model 3" }, + { "name": "Falcon Heavy" } +] +``` + +##### Шаблон +``` +Последний элемент: {d[i=-1].name} + +Исключая последний элемент: +{d[i, i!=-1].name} +{d[i+1, i!=-1].name} + +Исключая последние два элемента: +{d[i, i<-2].name} +{d[i+1, i<-2].name} +``` + +##### Результат +``` +Последний элемент: Falcon Heavy + +Исключая последний элемент: +Falcon 9 +Model S +Model 3 + +Исключая последние два элемента: +Falcon 9 +Model S +``` + +--- + +#### 9. Описание синтаксиса: интеллектуальная фильтрация + +- Используя интеллектуальные блоки условий, вы можете скрыть целую строку на основе сложных условий. +Например: + ``` + {d.array[i].property:ifIN('keyword'):drop(row)} + ``` + +#### 10. Пример: интеллектуальная фильтрация + +##### Данные +```json +[ + { "name": "Falcon 9" }, + { "name": "Model S" }, + { "name": "Model 3" }, + { "name": "Falcon Heavy" } +] +``` + +##### Шаблон +``` +Люди +{d[i].name} +{d[i].name:ifIN('Falcon'):drop(row)} +{d[i+1].name} +``` + +##### Результат +``` +Люди +Model S +Model 3 +``` + +*(Примечание: строки, содержащие «Falcon» в шаблоне, удаляются условием интеллектуальной фильтрации.)* + +--- + +### Группировка + +#### 1. Описание синтаксиса + +- Используйте пользовательский итератор для группировки данных по указанному атрибуту и ​​применяйте агрегатный форматер (например, `aggSum`) для суммирования сгруппированных данных. +- Пример формата синтаксиса: + ``` + {d.array[groupingAttribute].property}{d.array[groupingAttribute].quantity:aggSum(.groupingAttribute)} + {d.array[groupingAttribute+1].property} + ``` + +#### 2. Пример: Группировка по бренду и суммирование + +##### Данные +```json +[ + { "brand": "Lucid", "qty": 1 }, + { "brand": "Faraday", "qty": 4 }, + { "brand": "Venturi", "qty": 3 }, + { "brand": "Faraday", "qty": 2 }, + { "brand": "Aptera", "qty": 1 }, + { "brand": "Lucid", "qty": 10 } +] +``` + +##### Шаблон +``` +VehiclesQuantity +{d[brand].brand}{d[brand].qty:aggSum(.brand)} +{d[brand+1].brand} +``` + +##### Результат +``` +VehiclesQuantity +Aptera1 +Faraday6 +Lucid11 +Venturi3 +``` + +--- + +### Дедупликация + +#### 1. Описание синтаксиса + +- Используя пользовательский итератор, вы можете получить уникальные (не дублирующиеся) элементы на основе значения свойства. Синтаксис похож на обычный цикл, но автоматически игнорирует дублирующиеся элементы. + +Пример формата: +``` +{d.array[property].property} +{d.array[property+1].property} +``` + +#### 2. Пример: Выбор уникальных данных + +##### Данные +```json +[ + { "type": "car", "brand": "Hyundai" }, + { "type": "plane", "brand": "Airbus" }, + { "type": "plane", "brand": "Boeing" }, + { "type": "car", "brand": "Toyota" } +] +``` + +##### Шаблон +``` +Vehicles +{d[type].brand} +{d[type+1].brand} +``` + +##### Результат +``` +Vehicles +Hyundai +Airbus +``` +--- + + +Below is the English translation of the documentation, with headings and subheadings preserved: + +--- + +## Форматирование + +Форматирование используют для преобразования необработанных данных в текст, который легко читать. Они применяются к данным с помощью двоеточия (`:`) и могут быть объединены в цепочку, так что вывод каждого форматирования становится вводом для следующего. Некоторые форматирование поддерживают постоянные параметры или динамические параметры. +--- + +### Обзор + +#### 1. Объяснение синтаксиса +Базовый вызов форматера выглядит следующим образом: +``` +{d.property:formatter1:formatter2(...)} +``` +Например, в случае преобразования строки `"JOHN"` в `"John"` сначала используется форматер `lowerCase` для преобразования всех букв в нижний регистр, а затем `ucFirst` используется для преобразования первой буквы в заглавную. +#### 2. Пример + +Данные: +```json +{ + "name": "JOHN", + "birthday": "2000-01-31" +} +``` + +Шаблон: +``` +Меня зовут {d.name:lowerCase:ucFirst}. Я родился {d.birthday:formatD(LL)}. +``` + +#### 3. Результат + +После рендеринга вывод будет таким: +``` +Меня зовут Джон. Я родился 31 января 2000 года. +``` + +--- + +### Постоянные параметры + +#### 1. Описание синтаксиса +Многие форматирования поддерживают один или несколько постоянных параметров, которые указываются в скобках и разделяются запятыми для изменения вывода. Например, `:prepend(myPrefix)` добавит «myPrefix» перед текстом. +**Примечание:** Если параметр содержит запятые или пробелы, его необходимо заключать в одинарные кавычки, например: `prepend('my prefix')`. + +#### 2. Пример + +Пример шаблона (см. конкретное использование форматирования для деталей). + +#### 3. Результат + +Вывод будет содержать заданный префикс перед текстом. + +--- + +### Динамические параметры + +#### 1. Описание синтаксиса +Форматирование также поддерживают динамические параметры. Такие параметры начинаются с точки (`.`) и не заключаются в кавычки. +Существует два способа указания динамических параметров: +- **Абсолютный путь JSON:** начинается с `d.` или `c.` (ссылается на корневые или дополнительные данные). +- **Относительный путь JSON:** начинается с одной точки (`.`), указывая на поиск свойства в текущем родительском объекте. + +Например: + +``` +{d.subObject.qtyB:add(d.subObject.qtyC)} +``` +Это также можно записать как относительный путь: +``` +{d.subObject.qtyB:add(.qtyC)} +``` +Если необходимо получить доступ к данным более высокого уровня (родительского и выше), можно использовать несколько точек: +``` +{d.subObject.qtyB:add(..qtyA):add(.qtyC)} +``` + +#### 2. Пример + +Данные: + +```json +{ + "id": 10, + "qtyA": 20, + "subObject": { + "qtyB": 5, + "qtyC": 3 + }, + "subArray": [{ + "id": 1000, + "qtyE": 3 + }] +} +``` + +Использование в шаблоне: +``` +{d.subObject.qtyB:add(d.subObject.qtyC)} // Результат: 8 (5 + 3) +{d.subObject.qtyB:add(.qtyC)} // Результат: 8 +{d.subObject.qtyB:add(..qtyA):add(.qtyC)} // Результат: 28 (5 + 20 + 3) +{d.subArray[0].qtyE:add(..subObject.qtyC)} // Результат: 6 (3 + 3) +``` + +#### 3. Результат + +Примеры дают 8, 8, 28 и 6 соответственно. + +> **Примечание:** Использование пользовательских итераторов или фильтров массивов в качестве динамических параметров не допускается, например: +> ``` +> {d.subObject.qtyB:add(..subArray[i].qtyE)} +> {d.subObject.qtyB:add(d.subArray[i].qtyE)} +> ``` + +--- + +### Форматирование текста + +В этом разделе представлены различные методы форматирования текстовых данных. В следующих подразделах представлен синтаксис каждого форматировщика, примеры и результаты. + +#### 1. :(Нижний регистр)lowerCase + +##### Объяснение синтаксиса +Преобразует все буквы в нижний регистр. + +##### Пример +``` +'My Car':lowerCase() // Вывод "my car" +'my car':lowerCase() // Вывод "my car" +null:lowerCase() // Вывод null +1203:lowerCase() // Вывод 1203 +``` + +##### Результат +Каждый пример выводит данные, указанные в комментариях. + +--- + +#### 2. :Верхний регистр(upperCase) + +##### Объяснение синтаксиса +Преобразует все буквы в верхний регистр. + +##### Пример +``` +'My Car':upperCase() // Вывод "MY CAR" +'my car':upperCase() // Вывод "MY CAR" +null:upperCase() // Вывод null +1203:upperCase() // Вывод 1203 +``` + +##### Результат +Каждый пример выводит данные, указанные в комментариях. + +--- + +#### 3. :Заглавная первая буква(ucFirst) + +##### Объяснение синтаксиса +Делает заглавной только первую букву строки, оставляя остальные неизменными. + +##### Пример +``` +'My Car':ucFirst() // Вывод "My Car" +'my car':ucFirst() // Вывод "My car" +null:ucFirst() // Вывод null +undefined:ucFirst() // Вывод undefined +1203:ucFirst() // Вывод 1203 +``` + +##### Результат +Выход такой, как описано в комментариях. + +--- + +#### 4. :Заглавная первая буква слова (ucWords) + +##### Объяснение синтаксиса +Делает заглавной первую букву каждого слова в строке. + +##### Пример +``` +'my car':ucWords() // Вывод "My Car" +'My cAR':ucWords() // Вывод "My CAR" +null:ucWords() // Вывод null +undefined:ucWords() // Вывод undefined +1203:ucWords() // Вывод 1203 +``` + +##### Результат +Вывод такой же, как показано в примерах. + +--- + +#### 5. :print(message) + +##### Объяснение синтаксиса +Всегда возвращает указанное сообщение независимо от исходных данных, что делает его полезным в качестве резервного форматировщика. +Параметр: +- **message:** Текст для печати. + +##### Пример +``` +'My Car':print('hello!') // Вывод "hello!" +'my car':print('hello!') // Вывод "hello!" +null:print('hello!') // Вывод "hello!" +1203:print('hello!') // Вывод "hello!" +``` + +##### Результат +Возвращает указанную строку "hello!" во всех случаях. + +--- + +#### 6. :printJSON + +##### Объяснение синтаксиса +Преобразует объект или массив в строку в формате JSON. + +##### Пример +``` +[{'id':2,'name':'homer'},{'id':3,'name':'bart'}]:printJSON() +// Outputs "[ + {"id": 2, "name": "homer"}, + {"id": 3, "name": "bart"} +]" +'my car':printJSON() // Outputs ""my car"" +``` + +##### Результат +Выходные данные — строка в формате JSON с заданными данными. + +--- + +#### 7. :unaccent + +##### Объяснение синтаксиса +Удаляет диакритические знаки из текста, преобразуя его в формат без ударений. + +##### Пример +``` +'crème brulée':unaccent() // Outputs "creme brulee" +'CRÈME BRULÉE':unaccent() // Outputs "CREME BRULEE" +'être':unaccent() // Outputs "etre" +'éùïêèà':unaccent() // Outputs "euieea" +``` + +##### Результат +Все примеры выводят текст с удаленными акцентами. + +--- + +#### 8. :convCRLF + +##### Объяснение синтаксиса +Преобразует символы возврата каретки и новой строки (` +` или ` +`) в теги переноса строки, специфичные для документа. Это полезно для таких форматов, как DOCX, PPTX, ODT, ODP и ODS. +**Примечание:** При использовании `:html` перед `:convCRLF`, ` +` будет преобразован в тег `
    `. + +##### Пример +``` +// For ODT format: +'my blue + car':convCRLF() // Outputs "my blue car" +'my blue + car':convCRLF() // Outputs "my blue car" + +// For DOCX format: +'my blue + car':convCRLF() // Outputs "my blue car" +'my blue + car':convCRLF() // Outputs "my blue car" +``` + +##### Результат +Вывод показывает маркеры переноса строки, соответствующие формату целевого документа. + +--- + +#### 9. :substr(begin, end, wordMode) + +##### Объяснение синтаксиса +Выполняет операции над подстроками в строке, начиная с индекса `begin` (начиная с 0) и заканчивая непосредственно перед индексом `end`. +Необязательный параметр `wordMode` (логический или `last`) управляет тем, следует ли избегать разрыва слова в середине. + +##### Пример +``` +'foobar':substr(0, 3) // Outputs "foo" +'foobar':substr(1) // Outputs "oobar" +'foobar':substr(-2) // Outputs "ar" +'foobar':substr(2, -1) // Outputs "oba" +'abcd efg hijklm':substr(0, 11, true) // Outputs "abcd efg " +'abcd efg hijklm':substr(1, 11, true) // Outputs "abcd efg " +``` + +##### Результат +Выходные данные — это подстрока, извлеченная в соответствии с параметрами. + +--- + +#### 10. :split(delimiter) + +##### Объяснение синтаксиса +Разбивает строку на массив, используя указанный разделитель. +Параметр: +- **delimiter:** Строка разделителя. + +##### Пример +``` +'abcdefc12':split('c') // Outputs ["ab", "def", "12"] +1222.1:split('.') // Outputs ["1222", "1"] +'ab/cd/ef':split('/') // Outputs ["ab", "cd", "ef"] +``` + +##### Результат +Пример приводит к массиву, разделенному указанным разделителем. + +--- + +#### 11. :padl(targetLength, padString) + +##### Объяснение синтаксиса +Дополняет левую часть строки указанным символом, пока конечная строка не достигнет `targetLength`. +Если целевая длина меньше исходной длины строки, возвращается исходная строка. +Параметры: +- **targetLength:** Требуемая общая длина. +- **padString:** Строка, используемая для заполнения (по умолчанию — пробел). + +##### Пример +``` +'abc':padl(10) // Outputs " abc" +'abc':padl(10, 'foo') // Outputs "foofoofabc" +'abc':padl(6, '123465') // Outputs "123abc" +'abc':padl(8, '0') // Outputs "00000abc" +'abc':padl(1) // Outputs "abc" +``` + +##### Результат +Каждый пример выводит строку, дополненную слева соответствующим образом. + +--- + +#### 12. :padr(targetLength, padString) + +##### Объяснение синтаксиса +Дополняет правую часть строки указанным символом, пока конечная строка не достигнет `targetLength`. +Параметры такие же, как для `:padl`. + +##### Пример +``` +'abc':padr(10) // Outputs "abc " +'abc':padr(10, 'foo') // Outputs "abcfoofoof" +'abc':padr(6, '123465') // Outputs "abc123" +'abc':padr(8, '0') // Outputs "abc00000" +'abc':padr(1) // Outputs "abc" +``` + +##### Результат +Вывод показывает строку, дополненную справа. + +--- + +#### 13. :ellipsis(maximum) + +##### Объяснение синтаксиса +Если текст превышает указанное количество символов, добавляет многоточие ("...") в конце. +Параметр: +- **maximum:** Максимально допустимое количество символов. + +##### Пример +``` +'abcdef':ellipsis(3) // Outputs "abc..." +'abcdef':ellipsis(6) // Outputs "abcdef" +'abcdef':ellipsis(10) // Outputs "abcdef" +``` + +##### Результат +В примерах показан текст, обрезанный и дополненный многоточием, если необходимо. + +--- + +#### 14. :prepend(textToPrepend) + +##### Объяснение синтаксиса +Добавляет указанный текст в начало строки. +Параметр: +- **textToPrepend:** Текст префикса. + +##### Пример +``` +'abcdef':prepend('123') // Outputs "123abcdef" +``` + +##### Результат +Вывод показывает текст с указанным добавленным префиксом. + +--- + +#### 15. :append(textToAppend) + +##### Объяснение синтаксиса +Добавляет указанный текст в конец строки. +Параметр: +- **textToAppend:** Текст суффикса. + +##### Пример +``` +'abcdef':append('123') // Outputs "abcdef123" +``` + +##### Результат +Вывод показывает текст с добавленным указанным суффиксом. + +--- + +#### 16. :replace(oldText, newText) + +##### Объяснение синтаксиса +Заменяет все вхождения `oldText` в тексте на `newText`. +Параметры: +- **oldText:** Текст для замены. +- **newText:** Новый текст для замены. + **Примечание:** Если `newText` равен null, это означает, что соответствующий текст следует удалить. + +##### Пример +``` +'abcdef abcde':replace('cd', 'OK') // Outputs "abOKef abOKe" +'abcdef abcde':replace('cd') // Outputs "abef abe" +'abcdef abcde':replace('cd', null) // Outputs "abef abe" +'abcdef abcde':replace('cd', 1000) // Outputs "ab1000ef ab1000e" +``` + +##### Результат +Выход — текст после замены указанных сегментов. + +--- + +#### 17. :len + +##### Объяснение синтаксиса +Возвращает длину строки или массива. + +##### Пример +``` +'Hello World':len() // Outputs 11 +'':len() // Outputs 0 +[1,2,3,4,5]:len() // Outputs 5 +[1,'Hello']:len() // Outputs 2 +``` + +##### Результат +Выводит соответствующую длину в виде числа. + +--- + +#### 18. :t + +##### Объяснение синтаксиса +Переводит текст с использованием словаря перевода. +Примеры и результаты зависят от фактической конфигурации словаря перевода. + +--- + +#### 19. :preserveCharRef + +##### Объяснение синтаксиса +По умолчанию Template удаляет некоторые недопустимые символы из XML (такие как `&`, `>`, `<` и т. д.). Этот форматировщик сохраняет ссылки на символы (например, `§` остается неизменным) и подходит для определенных сценариев генерации XML. +Примеры и результаты зависят от конкретного варианта использования. + +--- + +### Форматирование чисел + +#### 1. :formatN(precision) + +##### Объяснение синтаксиса +Форматирует число в соответствии с настройками локализации. +Параметр: +- **precision:** Количество десятичных знаков. + Для форматов ODS/XLSX количество отображаемых десятичных знаков определяется текстовым редактором; для других форматов используется этот параметр. + +##### Пример +``` +// Example environment: API options { "lang": "en-us" } +'10':formatN() // Outputs "10.000" +'1000.456':formatN() // Outputs "1,000.456" +``` + +##### Результат +Число выводится в соответствии с указанной точностью и форматом локализации. + +--- + +#### 2. :round(precision) + +##### Объяснение синтаксиса +Округляет число до указанного количества десятичных знаков. + +##### Пример +``` +10.05123:round(2) // Outputs 10.05 +1.05:round(1) // Outputs 1.1 +``` + +##### Результат +Выход — число, округленное до заданной точности. + +--- + +#### 3. :add(value) + +##### Объяснение синтаксиса +Добавляет указанное значение к текущему числу. +Параметр: +- **value:** Число для добавления. + +##### Пример +``` +1000.4:add(2) // Outputs 1002.4 +'1000.4':add('2') // Outputs 1002.4 +``` + +##### Результат +Выходные данные представляют собой сумму текущего числа и указанного значения. + +--- + +#### 4. :sub(value) + +##### Объяснение синтаксиса +Вычитает указанное значение из текущего числа. +Параметр: +- **value:** Число для вычитания. + +##### Пример +``` +1000.4:sub(2) // Outputs 998.4 +'1000.4':sub('2') // Outputs 998.4 +``` + +##### Результат +Выход — текущее число минус указанное значение. + +--- + +#### 5. :mul(value) + +##### Объяснение синтаксиса +Умножает текущее число на указанное значение. +Параметр: +- **value:** Множитель. + +##### Пример +``` +1000.4:mul(2) // Outputs 2000.8 +'1000.4':mul('2') // Outputs 2000.8 +``` + +##### Результат +Выход — это произведение текущего числа и указанного значения. + +--- + +#### 6. :div(value) + +##### Объяснение синтаксиса +Делит текущее число на указанное значение. +Параметр: +- **value:** Делитель. + +##### Пример +``` +1000.4:div(2) // Outputs 500.2 +'1000.4':div('2') // Outputs 500.2 +``` + +##### Результат +Выход — результат деления. + +--- + +#### 7. :mod(value) + +##### Объяснение синтаксиса +Вычисляет модуль (остаток) текущего числа, деленного на указанное значение. +Параметр: +- **value:** Делитель модуля. + +##### Пример +``` +4:mod(2) // Outputs 0 +3:mod(2) // Outputs 1 +``` + +##### Результат +Выход — остаток от операции модуля. + +--- + +#### 8. :abs + +##### Объяснение синтаксиса +Возвращает абсолютное значение числа. + +##### Пример +``` +-10:abs() // Outputs 10 +-10.54:abs() // Outputs 10.54 +10.54:abs() // Outputs 10.54 +'-200':abs() // Outputs 200 +``` + +##### Результат +Выходное значение — абсолютное значение входного числа. + +--- + +#### 9. :ceil + +##### Объяснение синтаксиса +Округляет число вверх до наименьшего целого числа, которое больше или равно текущему числу. + +##### Пример +``` +10.05123:ceil() // Outputs 11 +1.05:ceil() // Outputs 2 +-1.05:ceil() // Outputs -1 +``` + +##### Результат +Выходные данные — число, округленное в большую сторону до ближайшего целого числа. + +--- + +#### 10. :floor + +##### Объяснение синтаксиса +Округляет число в меньшую сторону до наибольшего целого числа, которое меньше или равно текущему числу. + +##### Пример +``` +10.05123:floor() // Outputs 10 +1.05:floor() // Outputs 1 +-1.05:floor() // Outputs -2 +``` + +##### Результат +Результат — число, округлённое меньшую сторону до ближайшего целого. + +--- + +#### 11. :int + +##### Описание синтаксиса +Преобразует число в целое (не рекомендуется к использованию). + +##### Пример и результат +Зависит от конкретного случая преобразования. + +--- + +#### 12. :toEN + +##### Описание синтаксиса +Преобразует число в английский формат (использует `.` как разделитель дробной части). Не рекомендуется к использованию. + +##### Пример и результат +Зависит от конкретного случая преобразования. + +--- + +#### 13. :toFixed + +##### Описание синтаксиса +Преобразует число в строку с сохранением указанного количества знаков после запятой. Не рекомендуется к использованию. + +##### Пример и результат +Зависит от конкретного случая преобразования. + +--- + +#### 14. :toFR + +##### Описание синтаксиса +Преобразует число во французский формат (использует `,` как разделитель дробной части). Не рекомендуется к использованию. + +##### Пример и результат +Зависит от конкретного случая преобразования. + +--- + +### Форматирование валют + +#### 1. :formatC(precisionOrFormat, targetCurrency) + +##### Описание синтаксиса +Форматирует числовое значение как валюту и позволяет указать количество знаков после запятой или конкретный формат вывода. +Параметры: +- **precisionOrFormat** — необязательный параметр: число (точность) или строка формата: + - Целое число: задаёт количество знаков после запятой. + - `'M'`: выводит только наименование валюты. + - `'L'`: выводит число с символом валюты (по умолчанию). + - `'LL'`: выводит число с полным названием валюты. +- **targetCurrency** — необязательный параметр: код целевой валюты в верхнем регистре (например, USD, EUR), который переопределяет глобальные настройки. + +##### Пример +``` +// Example environment: API options { "lang": "en-us", "currency": { "source": "EUR", "target": "USD", "rates": { "EUR": 1, "USD": 2 } } } +'1000.456':formatC() // Outputs "$2,000.91" +'1000.456':formatC('M') // Outputs "dollars" +'1':formatC('M') // Outputs "dollar" +'1000':formatC('L') // Outputs "$2,000.00" +'1000':formatC('LL') // Outputs "2,000.00 dollars" + +// French example (when environment settings differ): +'1000.456':formatC() // Outputs "2 000,91 ..." +'1000.456':formatC() // When the source and target currencies are the same, outputs "1 000,46 €" +``` + +##### Результат +Выходные данные зависят от параметров API и настроек обменного курса. + +--- + +#### 2. :convCurr(target, source) + +##### Объяснение синтаксиса +Преобразует число из одной валюты в другую. Обменный курс можно передать через параметры API или задать глобально. +Если параметры не указаны, преобразование выполняется автоматически из `options.currencySource` в `options.currencyTarget`. +Параметры: +- **target:** Необязательно; код целевой валюты (по умолчанию `options.currencyTarget`). +- **source:** Необязательно; код исходной валюты (по умолчанию `options.currencySource`). + +##### Пример +``` +// Example environment: API options { "currency": { "source": "EUR", "target": "USD", "rates": { "EUR": 1, "USD": 2 } } } +10:convCurr() // Outputs 20 +1000:convCurr() // Outputs 2000 +1000:convCurr('EUR') // Outputs 1000 +1000:convCurr('USD') // Outputs 2000 +1000:convCurr('USD', 'USD') // Outputs 1000 +``` + +##### Результат +Выходные данные — это преобразованное значение валюты. + +--- + +### Форматирование даты + +#### 1. :formatD(patternOut, patternIn) + +##### Объяснение синтаксиса +Форматирует дату, принимая выходной формат `patternOut` и необязательный входной формат `patternIn` (по умолчанию ISO 8601). +Настройки часового пояса и языка можно выполнить с помощью `options.timezone` и `options.lang`. + +##### Пример +``` +// Example environment: API options { "lang": "en-us", "timezone": "Europe/Paris" } +'20160131':formatD('L') // Outputs "01/31/2016" +'20160131':formatD('LL') // Outputs "January 31, 2016" +'20160131':formatD('LLLL') // Outputs "Sunday, January 31, 2016 12:00 AM" +'20160131':formatD('dddd') // Outputs "Sunday" + +// French example: +'2017-05-10T15:57:23.769561+03:00':formatD('LLLL') // Outputs "mercredi 10 mai 2017 14:57" +'20160131':formatD('LLLL') // Outputs "dimanche 31 janvier 2016 00:00" +1410715640:formatD('LLLL', 'X') // Outputs "dimanche 14 septembre 2014 19:27" +``` + +##### Результат +Вывод — дата, отформатированная указанным образом. + +--- + +#### 2. :addD(amount, unit, patternIn) + +##### Объяснение синтаксиса +Добавляет указанное количество времени к дате. Поддерживаемые единицы: день, неделя, месяц, квартал, год, час, минута, секунда, миллисекунда. +Параметры: +- **amount:** Количество для добавления. +- **unit:** Единица времени (без учета регистра). +- **patternIn:** Необязательно, формат ввода (по умолчанию ISO8601). + +##### Пример +``` +// Example environment: API options { "lang": "fr", "timezone": "Europe/Paris" } +'2017-05-10T15:57:23.769561+03:00':addD('3', 'day') // Outputs "2017-05-13T12:57:23.769Z" +'2017-05-10 15:57:23.769561+03:00':addD('3', 'month') // Outputs "2017-08-10T12:57:23.769Z" +'20160131':addD('3', 'day') // Outputs "2016-02-03T00:00:00.000Z" +'20160131':addD('3', 'month') // Outputs "2016-04-30T00:00:00.000Z" +'31-2016-01':addD('3', 'month', 'DD-YYYY-MM') // Outputs "2016-04-30T00:00:00.000Z" +``` + +##### Результат +Выходные данные — новая дата после добавления указанного времени. + +--- + +#### 3. :subD(amount, unit, patternIn) + +##### Объяснение синтаксиса +Вычитает указанное количество времени из даты. Параметры такие же, как в `addD`. + +##### Пример +``` +// Example environment: API options { "lang": "fr", "timezone": "Europe/Paris" } +'2017-05-10T15:57:23.769561+03:00':subD('3', 'day') // Outputs "2017-05-07T12:57:23.769Z" +'2017-05-10 15:57:23.769561+03:00':subD('3', 'month') // Outputs "2017-02-10T12:57:23.769Z" +'20160131':subD('3', 'day') // Outputs "2016-01-28T00:00:00.000Z" +'20160131':subD('3', 'month') // Outputs "2015-10-31T00:00:00.000Z" +'31-2016-01':subD('3', 'month', 'DD-YYYY-MM') // Outputs "2015-10-31T00:00:00.000Z" +``` + +##### Результат +Выходные данные — это новая дата после вычитания указанного времени. + +--- + +#### 4. :startOfD(unit, patternIn) + +##### Объяснение синтаксиса +Устанавливает дату на начало указанной единицы времени. +Параметры: +- **unit:** Единица времени. +- **patternIn:** Необязательно, формат ввода. + +##### Пример +``` +// Example environment: API options { "lang": "fr", "timezone": "Europe/Paris" } +'2017-05-10T15:57:23.769561+03:00':startOfD('day') // Outputs "2017-05-10T00:00:00.000Z" +'2017-05-10 15:57:23.769561+03:00':startOfD('month') // Outputs "2017-05-01T00:00:00.000Z" +'20160131':startOfD('day') // Outputs "2016-01-31T00:00:00.000Z" +'20160131':startOfD('month') // Outputs "2016-01-01T00:00:00.000Z" +'31-2016-01':startOfD('month', 'DD-YYYY-MM') // Outputs "2016-01-01T00:00:00.000Z" +``` + +##### Результат +Выходные данные — это дата, установленная на начало указанной единицы. + +--- + +#### 5. :endOfD(unit, patternIn) + +##### Объяснение синтаксиса +Устанавливает дату на конец указанной единицы времени. +Параметры такие же, как для `startOfD`. + +##### Пример +``` +// Example environment: API options { "lang": "fr", "timezone": "Europe/Paris" } +'2017-05-10T15:57:23.769561+03:00':endOfD('day') // Outputs "2017-05-10T23:59:59.999Z" +'2017-05-10 15:57:23.769561+03:00':endOfD('month') // Outputs "2017-05-31T23:59:59.999Z" +'20160131':endOfD('day') // Outputs "2016-01-31T23:59:59.999Z" +'20160131':endOfD('month') // Outputs "2016-01-31T23:59:59.999Z" +'31-2016-01':endOfD('month', 'DD-YYYY-MM') // Outputs "2016-01-31T23:59:59.999Z" +``` + +##### Результат +Выходные данные — дата, установленная на конец указанного блока. + +--- + +#### 6. :diffD(toDate, unit, patternFromDate, patternToDate) + +##### Объяснение синтаксиса +Вычисляет разницу между двумя датами и выводит ее в указанном блоке. Поддерживаемые блоки включают: +- `day(s)` or `d` +- `week(s)` or `w` +- `quarter(s)` or `Q` +- `month(s)` or `M` +- `year(s)` or `y` +- `hour(s)` or `h` +- `minute(s)` or `m` +- `second(s)` or `s` +- `millisecond(s)` or `ms` (default unit) + +Параметры: +- **toDate:** Целевая дата. +- **unit:** Единица для вывода. +- **patternFromDate:** Необязательно, формат начальной даты. +- **patternToDate:** Необязательно, формат целевой даты. + +##### Пример +``` +'20101001':diffD('20101201') // Outputs 5270400000 +'20101001':diffD('20101201', 'second') // Outputs 5270400 +'20101001':diffD('20101201', 's') // Outputs 5270400 +'20101001':diffD('20101201', 'm') // Outputs 87840 +'20101001':diffD('20101201', 'h') // Outputs 1464 +'20101001':diffD('20101201', 'weeks') // Outputs 8 +'20101001':diffD('20101201', 'days') // Outputs 61 +'2010+10+01':diffD('2010=12=01', 'ms', 'YYYY+MM+DD', 'YYYY=MM=DD') // Outputs 5270400000 +``` + +##### Результат +Выходные данные — это разница во времени между двумя датами, преобразованная в указанную единицу. + +--- + +#### 7. :convDate(patternIn, patternOut) + +##### Объяснение синтаксиса +Преобразует дату из одного формата в другой (не рекомендуется для использования). +Параметры: +- **patternIn:** Формат входной даты. +- **patternOut:** Формат выходной даты. + +##### Пример +``` +// Example environment: API options { "lang": "en", "timezone": "Europe/Paris" } +'20160131':convDate('YYYYMMDD', 'L') // Outputs "01/31/2016" +'20160131':convDate('YYYYMMDD', 'LL') // Outputs "January 31, 2016" +'20160131':convDate('YYYYMMDD', 'LLLL') // Outputs "Sunday, January 31, 2016 12:00 AM" +'20160131':convDate('YYYYMMDD', 'dddd') // Outputs "Sunday" +1410715640:convDate('X', 'LLLL') // Outputs "Sunday, September 14, 2014 7:27 PM" +// French example: +'20160131':convDate('YYYYMMDD', 'LLLL') // Outputs "dimanche 31 janvier 2016 00:00" +'20160131':convDate('YYYYMMDD', 'dddd') // Outputs "dimanche" +``` + +##### Результат +Выходные данные — дата, преобразованная в указанный формат. + +--- + +#### 8. Шаблоны формата даты + +Распространенные символы формата даты (см. документацию DayJS): +- `X`: Unix timestamp (in seconds), e.g., 1360013296 +- `x`: Unix timestamp in milliseconds, e.g., 1360013296123 +- `YY`: Two-digit year, e.g., 18 +- `YYYY`: Four-digit year, e.g., 2018 +- `M`, `MM`, `MMM`, `MMMM`: Month (number, two-digit, abbreviated, full name) +- `D`, `DD`: Day (number, two-digit) +- `d`, `dd`, `ddd`, `dddd`: Day of the week (number, minimal, abbreviated, full name) +- `H`, `HH`, `h`, `hh`: Hour (24-hour or 12-hour clock) +- `m`, `mm`: Minute +- `s`, `ss`: Second +- `SSS`: Millisecond (3 digits) +- `Z`, `ZZ`: UTC offset, e.g., +05:00 or +0500 +- `A`, `a`: AM/PM +- `Q`: Quarter (1-4) +- `Do`: Day of month with ordinal, e.g., 1st, 2nd, … +- For other formats, refer to the full documentation. + Additionally, there are localized formats based on language such as `LT`, `LTS`, `L`, `LL`, `LLL`, `LLLL`, etc. + +--- + +### Форматирование интервала + +#### 1. :formatI(patternOut, patternIn) + +##### Объяснение синтаксиса +Форматирует длительность или интервал. Поддерживаемые форматы вывода включают: +- `human+` или `human` (подходит для удобного отображения человеком) +- Единицы, такие как `миллисекунды`, `секунды`, `минуты`, `часы`, `годы`, `месяцы`, `недели`, `дни` (или их сокращения). + +Параметры: +- **patternOut:** Формат вывода (например, `'секунда'` или `'human+'`). +- **patternIn:** Необязательно, единица ввода (например, `'миллисекунды'` или `'с'`). + +##### Пример +``` +// Example environment: API options { "lang": "en", "timezone": "Europe/Paris" } +2000:formatI('second') // Outputs 2 +2000:formatI('seconds') // Outputs 2 +2000:formatI('s') // Outputs 2 +3600000:formatI('minute') // Outputs 60 +3600000:formatI('hour') // Outputs 1 +2419200000:formatI('days') // Outputs 28 + +// French example: +2000:formatI('human') // Outputs "quelques secondes" +2000:formatI('human+') // Outputs "dans quelques secondes" +-2000:formatI('human+') // Outputs "il y a quelques secondes" + +// English example: +2000:formatI('human') // Outputs "a few seconds" +2000:formatI('human+') // Outputs "in a few seconds" +-2000:formatI('human+') // Outputs "a few seconds ago" + +// Unit conversion example: +60:formatI('ms', 'minute') // Outputs 3600000 +4:formatI('ms', 'weeks') // Outputs 2419200000 +'P1M':formatI('ms') // Outputs 2628000000 +'P1Y2M3DT4H5M6S':formatI('hour') // Outputs 10296.085 +``` + +##### Result +The output is the duration or interval displayed in the specified unit or format. + +--- + +### Форматирование массива + +#### 1. :arrayJoin(separator, index, count) + +##### Объяснение синтаксиса +Объединяет массив строк или чисел в одну строку. +Параметры: +- **separator:** Разделитель (по умолчанию запятая `,`). +- **index:** Необязательно; начальный индекс, с которого нужно объединить. +- **count:** Необязательно; количество элементов для объединения, начиная с `index` (может быть отрицательным для подсчета с конца). + +##### Пример +``` +['homer','bart','lisa']:arrayJoin() // Outputs "homer, bart, lisa" +['homer','bart','lisa']:arrayJoin(' | ') // Outputs "homer | bart | lisa" +['homer','bart','lisa']:arrayJoin('') // Outputs "homerbartlisa" +[10,50]:arrayJoin() // Outputs "10, 50" +[]:arrayJoin() // Outputs "" +null:arrayJoin() // Outputs null +{}:arrayJoin() // Outputs {} +20:arrayJoin() // Outputs 20 +undefined:arrayJoin() // Outputs undefined +['homer','bart','lisa']:arrayJoin('', 1) // Outputs "bartlisa" +['homer','bart','lisa']:arrayJoin('', 1, 1) // Outputs "bart" +['homer','bart','lisa']:arrayJoin('', 1, 2) // Outputs "bartlisa" +['homer','bart','lisa']:arrayJoin('', 0, -1) // Outputs "homerbart" +``` + +##### Результат +Выходные данные — строка, созданная путем объединения элементов массива в соответствии с указанными параметрами. + +--- + +#### 2. :arrayMap(objSeparator, attSeparator, attributes) + +##### Объяснение синтаксиса +Преобразует массив объектов в строку. Он не обрабатывает вложенные объекты или массивы. +Параметры: +- **objSeparator:** Разделитель между объектами (по умолчанию `, `). +- **attSeparator:** Разделитель между атрибутами объекта (по умолчанию `:`). +- **attributes:** Необязательно; список атрибутов объекта для вывода. + +##### Пример +``` +[{'id':2,'name':'homer'},{'id':3,'name':'bart'}]:arrayMap() +// Outputs "2:homer, 3:bart" + +[{'id':2,'name':'homer'},{'id':3,'name':'bart'}]:arrayMap(' - ') +// Outputs "2:homer - 3:homer" + +[{'id':2,'name':'homer'},{'id':3,'name':'bart'}]:arrayMap(' ; ', '|') +// Outputs "2|homer ; 3|bart" + +[{'id':2,'name':'homer'},{'id':3,'name':'bart'}]:arrayMap(' ; ', '|', 'id') +// Outputs "2 ; 3" + +[{'id':2,'name':'homer','obj':{'id':20},'arr':[12,23]}]:arrayMap() +// Outputs "2:homer" + +['homer','bart','lisa']:arrayMap() // Outputs "homer, bart, lisa" +[10,50]:arrayMap() // Outputs "10, 50" +[]:arrayMap() // Outputs "" +null:arrayMap() // Outputs null +{}:arrayMap() // Outputs {} +20:arrayMap() // Outputs 20 +undefined:arrayMap() // Outputs undefined +``` + +##### Результат +Выходные данные представляют собой строку, сгенерированную путем сопоставления и объединения элементов массива, игнорируя содержимое вложенных объектов. + +--- + +#### 3. :count(start) + +##### Объяснение синтаксиса +Подсчитывает номер строки в массиве и выводит текущий номер строки. +Например: +``` +{d[i].id:count()} +``` +Независимо от значения `id`, выводится текущий номер строки. +Начиная с версии v4.0.0, это форматирование было заменено на `:cumCount`. + +Параметр: +- **start** — необязательный параметр, задаёт начальное значение счётчика. + +##### Пример и результат +В выводе будет отображаться номер строки в соответствии с порядком элементов массива. + +--- + +## Условные конструкции + +Условные конструкции позволяют динамически управлять отображением или скрытием содержимого документа на основе значений данных. Шаблон поддерживает три основных способа записи условий: + +- **Встроенные условия**: Прямой вывод текста (или его замена другим). +- **Блоки условий**: Отображение или скрытие целых разделов документа, включая несколько тегов шаблона, абзацы, таблицы и т. д. + +Все условия начинаются с логического форматтера (например, ifEQ, ifGT и др.), за которым следуют действия (например, show, elseShow, drop, keep и др.). + +--- + +### Обзор + +Поддерживаемые логические операторы и действия в условиях: + +- **Логические операторы** + - **ifEQ(value)**: Проверяет, равно ли значение указанному. + - **ifNE(value)**: Проверяет, не равно ли значение указанному. + - **ifGT(value)**: Проверяет, больше ли значение указанного. + - **ifGTE(value)**: Проверяет, больше или равно указанному. + - **ifLT(value)**: Проверяет, меньше ли значение указанного. + - **ifLTE(value)**: Проверяет, меньше или равно указанному. + - **ifIN(value)**: Проверяет, содержится ли значение в массиве или строке. + - **ifNIN(value)**: Проверяет, не содержится ли значение в массиве или строке. + - **ifEM()**: Проверяет, является ли значение пустым (например, null, undefined, пустая строка, массив или объект). + - **ifNEM()**: Проверяет, не является ли значение пустым. + - **ifTE(type)**: Проверяет, совпадает ли тип значения с указанным (например, "string", "number", "boolean" и т. д.). + - **and(value)**: Логическое «и», используется для объединения нескольких условий. + - **or(value)**: Логическое «или», используется для объединения нескольких условий. + +- **Форматтеры действий** + - **:show(text) / :elseShow(text)**: Используются во встроенных условиях для вывода указанного текста. + - **:hideBegin / :hideEnd** и **:showBegin / :showEnd**: Используются в блоках условий для скрытия или отображения разделов документа. + +Ниже представлены синтаксис, примеры и результаты для каждого типа использования. + +--- + +### Встроенные условия + +#### 1. :show(text) / :elseShow(text) + +##### Синтаксис + +``` +{data:condition:show(text)} +{data:condition:show(text):elseShow(alternative text)} +``` + +##### Пример +Предположим, что данные: +```json +{ + "val2": 2, + "val5": 5 +} +``` +Шаблон выглядит следующим образом: +``` +val2 = {d.val2:ifGT(3):show('high')} +val2 = {d.val2:ifGT(3):show('high'):elseShow('low')} +val5 = {d.val5:ifGT(3):show('high')} +``` + +##### Результат +``` +val2 = 2 +val2 = low +val5 = high +``` + +--- + +#### 2. Switch Case (множественные условные операторы) + +##### Синтаксис +Используйте последовательные форматировщики условий для создания структуры, похожей на switch-case: +``` +{data:ifEQ(value1):show(result1):ifEQ(value2):show(result2):elseShow(default result)} +``` +Или добиться того же самого с помощью оператора or: +``` +{data:ifEQ(value1):show(result1):or(data):ifEQ(value2):show(result2):elseShow(default result)} +``` + +##### Пример +Данные: +```json +{ + "val1": 1, + "val2": 2, + "val3": 3 +} +``` +Шаблон: +``` +val1 = {d.val1:ifEQ(1):show(A):ifEQ(2):show(B):elseShow(C)} +val2 = {d.val2:ifEQ(1):show(A):ifEQ(2):show(B):elseShow(C)} +val3 = {d.val3:ifEQ(1):show(A):ifEQ(2):show(B):elseShow(C)} +``` + +##### Результат +``` +val1 = A +val2 = B +val3 = C +``` + +--- + +#### 3. Многопеременные условные операторы + +##### Синтаксис +Используйте логические операторы и/или для проверки нескольких переменных: +``` +{data1:ifEQ(condition1):and(.data2):ifEQ(condition2):show(result):elseShow(alternative result)} +{data1:ifEQ(condition1):or(.data2):ifEQ(condition2):show(result):elseShow(alternative result)} +``` + +##### Пример +Данные: +```json +{ + "val2": 2, + "val5": 5 +} +``` +Шаблон: +``` +and = {d.val2:ifEQ(1):and(.val5):ifEQ(5):show(OK):elseShow(KO)} +or = {d.val2:ifEQ(1):or(.val5):ifEQ(5):show(OK):elseShow(KO)} +``` + +##### Результат +``` +and = KO +or = OK +``` + +--- + +### Логические операторы и форматирования + +В следующих разделах описанные форматирования используют синтаксис встроенного условия со следующим форматом: +``` +{data:formatter(parameter):show(text):elseShow(alternative text)} +``` + +#### 1. :and(значение) + +##### Синтаксис +``` +{data:ifEQ(value):and(new data or condition):ifGT(another value):show(text):elseShow(alternative text)} +``` + +##### Пример +``` +{d.car:ifEQ('delorean'):and(.speed):ifGT(80):show('TravelInTime'):elseShow('StayHere')} +``` + +##### Результат +If `d.car` equals `'delorean'` and `d.speed` is greater than 80, the output is `TravelInTime`; otherwise, the output is `StayHere`. + +--- + +#### 2. :or(значение) + +##### Синтаксис +``` +{data:ifEQ(value):or(new data or condition):ifGT(another value):show(text):elseShow(alternative text)} +``` + +##### Пример +``` +{d.car:ifEQ('delorean'):or(.speed):ifGT(80):show('TravelInTime'):elseShow('StayHere')} +``` + +##### Результат +If `d.car` equals `'delorean'` or `d.speed` is greater than 80, the output is `TravelInTime`; otherwise, the output is `StayHere`. + +--- + +#### 3. :ifEM() + +##### Синтаксис +``` +{data:ifEM():show(text):elseShow(alternative text)} +``` + +##### Пример +``` +null:ifEM():show('Result true'):elseShow('Result false') +[]:ifEM():show('Result true'):elseShow('Result false') +``` + +##### Результат +Для `null` или пустого массива выводом будет `Result true`; в противном случае — `Result false`. + +--- + +#### 4. :ifNEM() + +##### Синтаксис +``` +{data:ifNEM():show(text):elseShow(alternative text)} +``` + +##### Пример +``` +0:ifNEM():show('Result true'):elseShow('Result false') +'homer':ifNEM():show('Result true'):elseShow('Result false') +``` + +##### Результат +Для непустых данных (например, числа 0 или строки «homer») выводится `Result true`; для пустых данных выводится `Result false`. +--- + +#### 5. :ifEQ(value) + +##### Синтаксис +``` +{data:ifEQ(value):show(text):elseShow(alternative text)} +``` + +##### Пример +``` +100:ifEQ(100):show('Result true'):elseShow('Result false') +'homer':ifEQ('homer'):show('Result true'):elseShow('Result false') +``` + +##### Результат +Если данные равны указанному значению, то выводится «Результат true»; в противном случае — «Результат false». + +--- + +#### 6. :ifNE(value) + +##### Синтаксис +``` +{data:ifNE(value):show(text):elseShow(alternative text)} +``` + +##### Пример +``` +100:ifNE(100):show('Result true'):elseShow('Result false') +100:ifNE(101):show('Result true'):elseShow('Result false') +``` + +##### Результат +Первый пример выводит `Result false`, а второй пример выводит `Result true`. + +--- + +#### 7. :ifGT(value) + +##### Синтаксис +``` +{data:ifGT(value):show(text):elseShow(alternative text)} +``` + +##### Пример +``` +1234:ifGT(1):show('Result true'):elseShow('Result false') +-23:ifGT(19):show('Result true'):elseShow('Result false') +``` + +##### Результат +Первый пример выводит `Result true`, а второй выводит `Result false`. + +--- + +#### 8. :ifGTE(value) + +##### Синтаксис +``` +{data:ifGTE(value):show(text):elseShow(alternative text)} +``` + +##### Пример +``` +50:ifGTE(-29):show('Result true'):elseShow('Result false') +1:ifGTE(768):show('Result true'):elseShow('Result false') +``` + +##### Результат +Первый пример выводит `Result true`, а второй выводит `Result false`. + +--- + +#### 9. :ifLT(value) + +##### Синтаксис +``` +{data:ifLT(value):show(text):elseShow(alternative text)} +``` + +##### Пример +``` +-23:ifLT(19):show('Result true'):elseShow('Result false') +1290:ifLT(768):show('Result true'):elseShow('Result false') +``` + +##### Результат +Первый пример выводит `Result true`, а второй выводит `Result false`. + +--- + +#### 10. :ifLTE(value) + +##### Синтаксис +``` +{data:ifLTE(value):show(text):elseShow(alternative text)} +``` + +##### Пример +``` +5:ifLTE(5):show('Result true'):elseShow('Result false') +1290:ifLTE(768):show('Result true'):elseShow('Result false') +``` + +##### Результат +Первый пример выводит `Result true`, а второй выводит `Result false`. + +--- + +#### 11. :ifIN(value) + +##### Синтаксис +``` +{data:ifIN(value):show(text):elseShow(alternative text)} +``` + +##### Пример +``` +'car is broken':ifIN('is'):show('Result true'):elseShow('Result false') +[1,2,'toto']:ifIN(2):show('Result true'):elseShow('Result false') +``` + +##### Результат +Оба примера выводят `Result true` (потому что строка содержит `is', а массив содержит 2). + +--- + +#### 12. :ifNIN(value) + +##### Синтаксис +``` +{data:ifNIN(value):show(text):elseShow(alternative text)} +``` + +##### Пример +``` +'car is broken':ifNIN('is'):show('Result true'):elseShow('Result false') +[1,2,'toto']:ifNIN(2):show('Result true'):elseShow('Result false') +``` + +##### Результат +Первый пример выводит `Result false` (потому что строка содержит 'is'), а второй пример выводит `Result false` (потому что массив содержит 2). + +--- + +#### 13. :ifTE(type) + +##### Синтаксис +``` +{data:ifTE('type'):show(text):elseShow(alternative text)} +``` + +##### Пример +``` +'homer':ifTE('string'):show('Result true'):elseShow('Result false') +10.5:ifTE('number'):show('Result true'):elseShow('Result false') +``` + +##### Результат +Первый пример выводит `Result true` (поскольку 'homer' — это строка), а второй выводит `Result true` (поскольку 10.5 — это число). +--- + +### Условные блоки + +Условные блоки используются для отображения или скрытия раздела документа, как правило, для заключения нескольких тегов или целого блока текста. + +#### 1. :showBegin / :showEnd + +##### Синтаксис +``` +{data:ifEQ(condition):showBegin} +Document block content +{data:showEnd} +``` + +##### Пример +Данные: +```json +{ + "toBuy": true +} +``` +Шаблон: +``` +Banana{d.toBuy:ifEQ(true):showBegin} +Apple +Pineapple +{d.toBuy:showEnd}Grapes +``` + +##### Результат +При выполнении условия отображается содержимое между ними: +``` +Banana +Apple +Pineapple +Grapes +``` + +--- + +#### 2. :hideBegin / :hideEnd + +##### Синтаксис +``` +{data:ifEQ(condition):hideBegin} +Document block content +{data:hideEnd} +``` + +##### Пример +Данные: +```json +{ + "toBuy": true +} +``` +Шаблон: +``` +Banana{d.toBuy:ifEQ(true):hideBegin} +Apple +Pineapple +{d.toBuy:hideEnd}Grapes +``` + +##### Результат +При выполнении условия содержимое между ними скрывается, что приводит к следующему: +``` +Banana +Grapes +``` + +## Вычисление + +### Простые математические операции + +#### 1. :add(value) +##### Синтаксис +``` +{data: add(value)} +``` +##### Пример +Предположим, что данные: +```json +{ + "num": 10 +} +``` +Шаблон: +``` +{d.num:add(5)} +``` +##### Результат +Выводит 15, что является результатом 10 + 5. + +--- + +#### 2. :mul(значение) +##### Синтаксис +``` +{data: mul(value)} +``` +##### Пример +Данные: +```json +{ + "num": 10 +} +``` +Шаблон: +``` +{d.num:mul(3)} +``` +##### Результат +Выводит 30, что является результатом 10 × 3. + +--- + +#### 3. :sub(значение) +##### Синтаксис +``` +{data: sub(value)} +``` +##### Пример +Данные: +```json +{ + "num": 10 +} +``` +Шаблон: +``` +{d.num:sub(4)} +``` +##### Результат +Выходы 6, что является результатом 10 - 4. + +--- + +#### 4. :div(значение) +##### Синтаксис +``` +{data: div(value)} +``` +##### Пример +Данные: +```json +{ + "num": 10 +} +``` +Шаблон: +``` +{d.num:div(2)} +``` +##### Результат +Выход 5, что является результатом 10 / 2. + +--- + +#### 5. :mod(значение) +##### Синтаксис +``` +{data: mod(value)} +``` +##### Пример +Данные: +```json +{ + "num": 10 +} +``` +Шаблон: +``` +{d.num:mod(3)} +``` +##### Результат +На выходе получается 1, что является остатком от деления 10 на 3. + +--- + +#### 6. :abs() +##### Синтаксис +``` +{data: abs()} +``` +##### Пример +Данные: +```json +{ + "value": -23 +} +``` +Шаблон: +``` +{d.value:abs} +``` +##### Результат +Выводит 23, что является абсолютным значением -23. + +--- + +#### 7. Расчет математических выражений +Поддерживает написание простых математических выражений внутри скобок (разрешены только операторы +, -, *, /, а вложенные скобки не допускаются). +Порядок операций следует за умножением и делением перед сложением и вычитанием. + +##### Синтаксис +``` +{data: add(.other + .vat * d.sub.price - 10 / 2)} +``` +##### Пример +Данные: +```json +{ + "val": 1, + "other": 2, + "vat": 0.5, + "sub": { + "price": 100 + } +} +``` +Шаблон: +``` +{d.val:add(.other + .vat * d.sub.price - 10 / 2)} +``` +##### Результат +Вывод 48. + +--- + +## Расширенные возможности + +### Нумерация страниц + +#### 1. Обновление номера страницы + +##### Синтаксис +Просто вставьте соответствующее поле в вашем офисном редакторе. + +##### Пример +В Microsoft Word: +- Используйте меню «Вставка → Номер страницы» + +В LibreOffice: +- Используйте меню «Вставка → Поле → Номер страницы» + +##### Результат +В сгенерированном отчёте номера страниц будут обновляться автоматически. + +--- + +#### 2. Генерация оглавления + +##### Синтаксис +Просто вставьте оглавление в вашем офисном редакторе. + +##### Пример +В Microsoft Word: +- Используйте меню «Вставка → Указатели и таблицы → Оглавление» + +В LibreOffice: +- Используйте меню «Вставка → Оглавление и указатель → Оглавление, указатель или библиография» + +##### Результат +Оглавление в отчёте будет автоматически обновляться на основе содержания документа. + +--- + +#### 3. Повтор заголовков таблицы + +##### Синтаксис +Просто настройте повтор заголовка в вашем офисном редакторе. + +##### Пример +В Microsoft Word: +- Щёлкните правой кнопкой мыши по заголовку таблицы → Свойства таблицы → Установите флажок «Повторять как строку заголовка в начале каждой страницы» + +В LibreOffice: +- Щёлкните правой кнопкой мыши по заголовку таблицы → Свойства таблицы → Вкладка «Размещение текста» → Установите флажок «Повторить заголовок» + +##### Результат +Если таблица переходит на следующую страницу, заголовок будет автоматически повторяться на каждой странице. + +--- + +### Интернационализация (i18n) + +#### 1. Перевод статического текста + +##### Синтаксис +Используйте тег `{t(text)}` для интернационализации статического текста: + +``` +{t(meeting)} +``` + +##### Пример +В шаблоне: +``` +{t(meeting)} {t(apples)} +``` +Данные JSON или внешний словарь локализации (например, для «fr-fr») предоставляют соответствующие переводы (например, «meeting» → «rendez-vous» и «apples» → «Pommes»). + +##### Результат +При формировании отчета текст будет заменен соответствующим переводом на основе целевого языка. + +--- + +#### 2. Динамический перевод текста + +##### Синтаксис +Для содержимого данных используйте форматер `:t`, например: +``` +{d.id:ifEQ(2):show({t(monday)}):elseShow({t(tuesday)})} +``` + +##### Пример +В шаблоне: +``` +{d.id:ifEQ(2):show({t(monday)}):elseShow({t(tuesday)})} +``` +Данные JSON и словарь локализации предоставляют соответствующие переводы. + +##### Результат +В зависимости от условия вывод будет либо «lundi», либо «mardi» (используя целевой язык в качестве примера). + +--- + +### Сопоставление ключ-значение + +#### 1. Преобразование перечисления (:convEnum) + +##### Синтаксис +``` +{data:convEnum(enumName)} +``` +Для примера: +``` +0:convEnum('ORDER_STATUS') +``` + +##### Пример +В примере параметров API указано следующее: +```json +{ + "enum": { + "ORDER_STATUS": ["pending", "sent", "delivered"] + } +} +``` +В шаблоне: +``` +0:convEnum('ORDER_STATUS') +``` + +##### Результат +Выводит «ожидание»; если индекс превышает диапазон перечисления, выводится исходное значение. + +--- diff --git a/docs/ru-RU/handbook/action-template-print/install.md b/docs/ru-RU/handbook/action-template-print/install.md new file mode 100644 index 0000000000..a1ec8a362c --- /dev/null +++ b/docs/ru-RU/handbook/action-template-print/install.md @@ -0,0 +1,98 @@ +### Установка плагинов + +См. раздел [Установка и обновление коммерческих плагинов](/welcome/getting-started/plugin) + +### Установка LibreOffice (опционально) + +Для генерации PDF необходимо установить LibreOffice. [Скачайте его с официального сайта](https://www.libreoffice.org/download/download-libreoffice). +Если вы используете версию в Docker, вы можете создать скрипт напрямую в каталоге `./storage/scripts`. + +```bash +mkdir ./storage/scripts +cd ./storage/scripts +vim install-libreoffice.sh +``` + +Содержимое `install-libreoffice.sh` следующее: + +```sh +#!/bin/bash + +# Определить переменные +INSTALL_DIR="/opt/libreoffice24.8" +DOWNLOAD_URL="https://download.documentfoundation.org/libreoffice/stable/24.8.5/deb/x86_64/LibreOffice_24.8.5_Linux_x86-64_deb.tar.gz" + +# Проверьте, установлен ли уже LibreOffice +if [ -d "$INSTALL_DIR" ]; then + echo "LibreOffice is already installed, skipping installation." + exit 0 +fi + +# Обновите APT и установите зависимости +apt-get update + +apt-get install -y \ + libfreetype6 \ + fontconfig \ + libgssapi-krb5-2 \ + libxml2 \ + libnss3 \ + libdbus-1-3 \ + libcairo2 \ + libxslt1.1 \ + libglib2.0-0 \ + libcups2 \ + libx11-xcb1 \ + fonts-liberation \ + fonts-noto-cjk \ + wget + +rm -rf /var/lib/apt/lists/* + +cd /app/nocobase/storage/scripts + +# Загрузите и установите LibreOffice, если он еще не установлен +if [ ! -d "./libreoffice" ]; then + rm -rf libreoffice.tar.gz + wget --no-check-certificate -O libreoffice.tar.gz $DOWNLOAD_URL + if [ $? -ne 0 ]; then + echo "Failed to download LibreOffice." + exit 1 + fi + rm -rf libreoffice && mkdir libreoffice + tar -zxvf libreoffice.tar.gz -C ./libreoffice --strip-components=1 + if [ $? -ne 0 ]; then + echo "Failed to extract LibreOffice." + exit 1 + fi +fi + +# Установить LibreOffice +dpkg -i libreoffice/DEBS/*.deb + +ln -s /opt/libreoffice24.8/program/soffice.bin /usr/bin/libreoffice +libreoffice --version + +if [ $? -ne 0 ]; then + echo "Failed to install LibreOffice." + exit 1 +fi + +echo "LibreOffice installation completed successfully." +``` + +Перезапустите контейнер `app`: + +```bash +docker compose restart app +# View logs +docker compose logs app +``` + +Убедитесь, что установка прошла успешно: + +```bash +$ docker compose exec app bash -c "libreoffice --version" + +LibreOffice 24.8.4.2 bb3cfa12c7b1bf994ecc5649a80400d06cd71002 +``` diff --git a/docs/ru-RU/handbook/ai-ee/index.md b/docs/ru-RU/handbook/ai-ee/index.md new file mode 100644 index 0000000000..7e3ac2b652 --- /dev/null +++ b/docs/ru-RU/handbook/ai-ee/index.md @@ -0,0 +1 @@ + diff --git a/docs/ru-RU/handbook/ai-ee/workflow/nodes/llm/multimodal-chat.md b/docs/ru-RU/handbook/ai-ee/workflow/nodes/llm/multimodal-chat.md new file mode 100644 index 0000000000..963d57e436 --- /dev/null +++ b/docs/ru-RU/handbook/ai-ee/workflow/nodes/llm/multimodal-chat.md @@ -0,0 +1,16 @@ +# Мультимодальный чат + + + +## Изображения + +Если модель это поддерживает, узел языковой модели (LLM) может отправлять изображения в модель. При использовании необходимо выбрать поле вложения через переменную или связать запись из таблицы файлов. При выборе записи таблицы файлов можно указать только объект верхнего уровня или выбрать конкретное поле с URL. + +![](https://static-docs.nocobase.com/202503041034858.png) + +Формат отправки изображений имеет два варианта: + +- Отправка по URL — все изображения будут отправлены в формате URL, за исключением локально сохранённых изображений, которые будут преобразованы в формат base64. +- Отправка в формате base64 — независимо от того, хранится ли изображение локально или в облаке, оно будет отправлено в формате base64. Этот вариант подходит для случаев, когда онлайн-сервис языковой модели не может напрямую получить доступ к URL изображения. + +![](https://static-docs.nocobase.com/202503041200638.png) diff --git a/docs/ru-RU/handbook/ai-ee/workflow/nodes/llm/structured-output.md b/docs/ru-RU/handbook/ai-ee/workflow/nodes/llm/structured-output.md new file mode 100644 index 0000000000..e24be9b322 --- /dev/null +++ b/docs/ru-RU/handbook/ai-ee/workflow/nodes/llm/structured-output.md @@ -0,0 +1,51 @@ +# Структурированный вывод + + + +## Введение + +В некоторых сценариях использования пользователи могут хотеть, чтобы модель языкового ИИ (LLM) возвращала структурированный контент в формате JSON. Этого можно добиться с помощью настройки «Структурированный вывод». + +![](https://static-docs.nocobase.com/202503041306405.png) + +## Инструкции по настройке + +- **JSON Schema (Схема JSON)** — пользователи могут настроить [JSON Schema](https://json-schema.org/), чтобы указать ожидаемую структуру ответа модели. +- **Имя** — *необязательно*, помогает модели лучше понять объект, представленный схемой JSON. +- **Описание** — *необязательно*, помогает модели лучше понять назначение схемы JSON. +- **Strict (Строгий режим)** — требует, чтобы модель строго соблюдала структуру, определённую в JSON Schema. В настоящее время этот параметр поддерживают только некоторые новые модели от OpenAI. Перед использованием убедитесь в совместимости с выбранной моделью. + +## Методы генерации структурированного контента + +Метод генерации структурированного контента зависит от **модели** и её настройки **формата ответа (Response format)**: + +1. **Модели, поддерживающие только `text` в формате ответа** + + - При вызове узел привязывает инструмент (Tool), который на основе JSON Schema генерирует JSON-контент. Это направляет модель на формирование структурированного ответа через вызов этого инструмента. + +2. **Модели, поддерживающие режим JSON (`json_object`) в формате ответа** + + - При вызове выбирается режим JSON. Пользователь должен явно указать в запросе (Prompt), что модель должна вернуть ответ в формате JSON, и описать поля ответа. + - В этом режиме JSON Schema используется только для преобразования строки JSON, возвращённой моделью, в целевой JSON-объект. + +3. **Модели, поддерживающие JSON Schema (`json_schema`) в формате ответа** + + - Схема JSON напрямую используется для определения требуемой структуры ответа модели. + - Дополнительно доступен параметр **Strict**, требующий строгого соответствия ответа схеме JSON. + +4. **Локальные модели Ollama** + + - Если настроена JSON Schema, при вызове она передаётся модели в качестве параметра `format`. + +## Использование результатов структурированного вывода + +Структурированный контент ответа модели сохраняется в поле «Структурированный контент» узла и может использоваться последующими узлами. + +![](https://static-docs.nocobase.com/202503041330291.png) + +![](https://static-docs.nocobase.com/202503041331279.png) + +Если требуется использовать значения полей из JSON-объекта, вы можете обратиться к следующим материалам: + +- [Сопоставление JSON-переменных](../../../../../handbook/workflow-json-variable-mapping) +- [Запросы к JSON](../../../../../handbook/workflow-json-query) diff --git a/docs/ru-RU/handbook/ai/index.md b/docs/ru-RU/handbook/ai/index.md new file mode 100644 index 0000000000..52553545f0 --- /dev/null +++ b/docs/ru-RU/handbook/ai/index.md @@ -0,0 +1 @@ +# Интеграция искусственного интеллекта diff --git a/docs/ru-RU/handbook/ai/service.md b/docs/ru-RU/handbook/ai/service.md new file mode 100644 index 0000000000..3cd550ad83 --- /dev/null +++ b/docs/ru-RU/handbook/ai/service.md @@ -0,0 +1,19 @@ +# Управление сервисом языковой модели (LLM) + + + +## Введение + +Прежде чем использовать функции искусственного интеллекта, необходимо интегрировать онлайн-сервис языковой модели (LLM). NocoBase поддерживает интеграцию с онлайн-сервисами LLM по различным API-протоколам. + +В настоящее время в открытой версии поддерживаются основные протоколы LLM, такие как OpenAI и DeepSeek, а также любые другие сервисы LLM с аналогичным форматом вызова, которые можно интегрировать через API-интерфейсы, предоставляемые поставщиками сервисов. + +Версия для предприятий дополнительно поддерживает локальные модели Ollama. Пользователи корпоративной версии могут также обратиться к нам для расширения поддержки других API-протоколов по мере необходимости. + +![](https://static-docs.nocobase.com/202503021832046.png) + +## Настройка + +Заполните данные онлайн-сервиса в соответствии с выбранным API-протоколом. Обычно требуется указать API-ключ и базовый URL-адрес. + +![](https://static-docs.nocobase.com/202503032320237.png) diff --git a/docs/ru-RU/handbook/ai/workflow/nodes/llm/chat.md b/docs/ru-RU/handbook/ai/workflow/nodes/llm/chat.md new file mode 100644 index 0000000000..457c220db3 --- /dev/null +++ b/docs/ru-RU/handbook/ai/workflow/nodes/llm/chat.md @@ -0,0 +1,61 @@ +# Чат с ИИ + + + +## Введение + +Узел LLM в workflow позволяет взаимодействовать с онлайн-сервисами языковых моделей, используя их возможности для автоматизации бизнес-процессов. + +![](https://static-docs.nocobase.com/202503041012091.png) + +## Создание узла LLM + +Поскольку взаимодействие с LLM-сервисами обычно требует времени, узел LLM можно использовать только в асинхронных workflow. + +![](https://static-docs.nocobase.com/202503041013363.png) + +## Выбор модели + +1. Сначала выберите интегрированный LLM-сервис. Если сервис ещё не подключён, необходимо сначала добавить его конфигурацию (см. [Управление LLM-сервисами](./../../../service.md)) + +2. После выбора сервиса система попытается получить список доступных моделей. Для некоторых сервисов может потребоваться ввести ID модели вручную. + +![](https://static-docs.nocobase.com/202503041013084.png) + +## Настройка параметров вызова + +Вы можете настроить параметры вызова модели под свои задачи. + +![](https://static-docs.nocobase.com/202503041014778.png) + +### Формат ответа + +Особое внимание уделите настройке **Формата ответа** (текст или JSON). При выборе JSON: + +- Модель должна поддерживать JSON-режим +- В запросе нужно явно указать требование отвечать в JSON-формате +- Ответ будет в виде JSON-строки, требующей дополнительного парсинга +- Можно использовать функцию [Структурированный вывод](../../../../../handbook/ai-ee/workflow/nodes/llm/structured-output) + +## Сообщения + +Массив сообщений для LLM может включать историю диалога. Поддерживаются 3 типа сообщений: + +1. **Системные** - определяют роль и поведение модели +2. **Пользовательские** - ввод пользователя +3. **Ассистента** - ответы модели + +Для пользовательских сообщений можно комбинировать несколько элементов контента в одном запросе (если модель поддерживает). В противном случае - разделяйте на отдельные сообщения. + +![](https://static-docs.nocobase.com/202503041016140.png) + +В содержимом сообщений можно использовать переменные из контекста workflow. + +![](https://static-docs.nocobase.com/202503041017879.png) + +## Использование ответа LLM + +Ответ узла LLM можно использовать как переменную в других узлах workflow. + +![](https://static-docs.nocobase.com/202503041018508.png) + diff --git a/docs/ru-RU/handbook/api-doc/index.md b/docs/ru-RU/handbook/api-doc/index.md new file mode 100644 index 0000000000..ab961c3f63 --- /dev/null +++ b/docs/ru-RU/handbook/api-doc/index.md @@ -0,0 +1,51 @@ +# Документация API + + + +## Введение + +Плагин генерирует документацию NocoBase HTTP API на основе Swagger. + +## Установка + +Это встроенный плагин, установка не требуется. Активируйте для использования. + +## Инструкции по использованию + +### Доступ к странице документации API + +http://localhost:13000/admin/settings/api-doc/documentation + +![](https://static-docs.nocobase.com/8db51cf50e3c666aba5a850a0fb664a0.png) + +### Обзор документации + +![](https://static-docs.nocobase.com/5bb4d3e5bba6c6fdfcd830592e72385b.png) + +- Общая документация API: `/api/swagger:get` +- Основная документация API: `/api/swagger:get?ns=core` +- Вся документация API плагинов: `/api/swagger:get?ns=plugins` +- Документация каждого плагина: `/api/swagger:get?ns=plugins/{name}` +- Документация API пользовательских коллекций: `/api/swagger:get?ns=collections` +- Указанные ресурсы `${collection}` и связанные ресурсы `${collection}.${association}`: `/api/swagger:get?ns=collections/{name}` + +## Руководство разработчика + +### Как написать документацию Swagger для плагинов + +Добавьте файл `swagger/index.ts` в папку `src` плагина со следующим содержимым: + +```typescript +export default { + info: { + title: 'NocoBase API - Auth plugin', + }, + tags: [], + paths: {}, + components: { + schemas: {}, + }, +}; +``` + +Подробные примеры и рекомендации написания можно найти в [Официальной документации Swagger](https://swagger.io/docs/specification/about/). diff --git a/docs/ru-RU/handbook/api-doc/static/HYjubXpVOokLitxuC90cxSzHnJb.png b/docs/ru-RU/handbook/api-doc/static/HYjubXpVOokLitxuC90cxSzHnJb.png new file mode 100644 index 0000000000..eddccb3350 Binary files /dev/null and b/docs/ru-RU/handbook/api-doc/static/HYjubXpVOokLitxuC90cxSzHnJb.png differ diff --git a/docs/ru-RU/handbook/api-doc/static/NFhXbRvfgoP08QxpAwdclb17nfc.png b/docs/ru-RU/handbook/api-doc/static/NFhXbRvfgoP08QxpAwdclb17nfc.png new file mode 100644 index 0000000000..869b047c95 Binary files /dev/null and b/docs/ru-RU/handbook/api-doc/static/NFhXbRvfgoP08QxpAwdclb17nfc.png differ diff --git a/docs/ru-RU/handbook/api-keys/image-1.png b/docs/ru-RU/handbook/api-keys/image-1.png new file mode 100644 index 0000000000..d76a358b81 Binary files /dev/null and b/docs/ru-RU/handbook/api-keys/image-1.png differ diff --git a/docs/ru-RU/handbook/api-keys/image.png b/docs/ru-RU/handbook/api-keys/image.png new file mode 100644 index 0000000000..d90cf25e49 Binary files /dev/null and b/docs/ru-RU/handbook/api-keys/image.png differ diff --git a/docs/ru-RU/handbook/api-keys/index.md b/docs/ru-RU/handbook/api-keys/index.md new file mode 100644 index 0000000000..a4f8a67b82 --- /dev/null +++ b/docs/ru-RU/handbook/api-keys/index.md @@ -0,0 +1,38 @@ +# API Key + +## Введение + +## Установка + +## Инструкции по использованию + +http://localhost:13000/admin/settings/api-keys/configuration + +![](https://static-docs.nocobase.com/d64ccbdc8a512a0224e9f81dfe14a0a8.png) + +### Добавить API Key + +![](https://static-docs.nocobase.com/46141872fc0ad9a96fa5b14e97fcba12.png) + +**Примечания** + +- Добавленный API-ключ предназначен для текущего пользователя, а роль — это роль, к которой принадлежит текущий пользователь +- Убедитесь, что переменная среды `APP_KEY` настроена и остается конфиденциальной. Если APP_KEY изменится, все добавленные API-ключи станут недействительными. + +### Как настроить APP_KEY + +Для версии docker измените файл docker-compose.yml + +```diff +services: +app: +image: nocobase/nocobase:main +environment: ++ - APP_KEY=4jAokvLKTJgM0v_JseUkJ +``` + +Для исходного кода или установки create-nocobase-app вы можете напрямую изменить APP_KEY в файле .env + +```bash +APP_KEY=4jAokvLKTJgM0v_JseUkJ +``` diff --git a/docs/ru-RU/handbook/app-switching/index.md b/docs/ru-RU/handbook/app-switching/index.md new file mode 100644 index 0000000000..73d03fe10f --- /dev/null +++ b/docs/ru-RU/handbook/app-switching/index.md @@ -0,0 +1,9 @@ +# Переключение приложений + + + +## Введение + +:::warning +Плагин "Переключение приложений" находится в разработке и пока не выпущен. +::: diff --git a/docs/ru-RU/handbook/audit-logger/index.md b/docs/ru-RU/handbook/audit-logger/index.md new file mode 100644 index 0000000000..9a3481997f --- /dev/null +++ b/docs/ru-RU/handbook/audit-logger/index.md @@ -0,0 +1,96 @@ +# Журнал аудита + + + +## Введение + +Журнал аудита используется для записи и отслеживания действий пользователя и истории работы ресурсов в системе. + +![](https://static-docs.nocobase.com/202501031627719.png) + +![](https://static-docs.nocobase.com/202501031627922.png) + +## Описание параметра + +| Parameter | Description | +| ----------------------- | ------------------------------------------------------------------------ | +| **Resource** | The target resource type of the operation | +| **Action** | The type of operation performed | +| **User** | The user performing the operation | +| **Role** | The role of the user during the operation | +| **Data source** | The data source | +| **Target collection** | The target collection | +| **Target record UK** | The unique identifier of the target collection | +| **Source collection** | The source collection of the relation field | +| **Source record UK** | The unique identifier of the source collection | +| **Status** | The HTTP status code of the operation request response | +| **Created at** | The time of the operation | +| **UUID** | The unique identifier of the operation, consistent with the Request ID of the operation request, can be used to retrieve application logs | +| **IP** | The IP address of the user | +| **UA** | The UA information of the user | +| **Metadata** | Metadata such as parameters, request body, and response content of the operation request | + +## Описание ресурса аудита + +В настоящее время в журнале аудита будут регистрироваться следующие операции с ресурсами: + +### Основное приложение + +| Operation | Description | +| --------------------- | ------------------- | +| `app:resart` | Application restart | +| `app:clearCache` | Clear application cache | + +### Менеджер плагинов + +| Operation | Description | +| --------------------- | ------------------- | +| `pm:add` | Add plugin | +| `pm:update` | Update plugin | +| `pm:enable` | Enable plugin | +| `pm:disable` | Disable plugin | +| `pm:remove` | Remove plugin | + +### Аутентификация пользователя + +| Operation | Description | +| -------------------------- | ------------------- | +| `auth:signIn` | Sign in | +| `auth:signUp` | Sign up | +| `auth:signOut` | Sign out | +| `auth:changePassword` | Change password | + +### Пользователь + +| Operation | Description | +| -------------------------- | ------------------- | +| `users:updateProfile` | Update profile | + +### Конфигурация UI + +| Operation | Description | +| ------------------------------ | --------------------- | +| `uiSchemas:insertAdjacent` | Insert UI Schema | +| `uiSchemas:patch` | Modify UI Schema | +| `uiSchemas:remove` | Remove UI Schema | + +### Операции по взысканию + +| Operation | Description | +| --------------------- | ----------------------- | +| `create` | Create record | +| `update` | Update record | +| `destroy` | Delete record | +| `updateOrCreate` | Update or create record | +| `firstOrCreate` | Query or create record | +| `move` | Move record | +| `set` | Set relation field record | +| `add` | Add relation field record | +| `remove` | Remove relation field record | +| `export` | Export record | +| `import` | Import record | + +## Добавление других ресурсов аудита + +Если вы расширили другие операции с ресурсами с помощью плагинов и хотите +записать поведение этих операций с ресурсами в журнал аудита, обратитесь к [API](../../api/server/audit-manager.md). diff --git a/docs/ru-RU/handbook/audit-logs/index.md b/docs/ru-RU/handbook/audit-logs/index.md new file mode 100644 index 0000000000..8eb092bd1e --- /dev/null +++ b/docs/ru-RU/handbook/audit-logs/index.md @@ -0,0 +1,54 @@ +# Audit Log + + + +## Введение + +Плагин **Audit Log** предназначен для отслеживания и фиксации всех изменений данных, происходящих в системе. Это позволяет администраторам и разработчикам отслеживать, кто, когда и какие действия выполнял с данными, обеспечивая прозрачность и повышая уровень безопасности. + +## Установка + +Плагин встроенный, установка не требуется. Достаточно активировать его в интерфейсе управления плагинами. + +## Возможности + +- Отслеживание операций `создание`, `обновление`, `удаление` для всех коллекций. +- Фиксация информации о пользователе, инициировавшем действие. +- Сохранение старых и новых значений полей. +- Поддержка фильтрации и поиска по дате, пользователю, типу действия и коллекции. +- Возможность восстановления изменений вручную на основе сохранённых данных. + +## Где найти + +После активации плагина, в разделе **Администрирование** появится пункт **Журнал аудита**, где отображаются все зафиксированные действия. + +## Поля журнала + +| Поле | Описание | +|----------------|----------| +| Collection | Название коллекции, где произошло изменение | +| Action | Тип действия: `create`, `update`, `destroy` | +| Record ID | ID записи, к которой относится действие | +| Changes | Список изменённых полей и их старых/новых значений | +| User | Пользователь, инициировавший действие | +| IP Address | IP-адрес источника запроса | +| Timestamp | Время выполнения действия | + +## Пример использования + +- Определить, кто и когда удалил определённую запись. +- Проанализировать все изменения, связанные с конкретным пользователем. +- Провести аудит действий в рамках конкретной коллекции за определённый период. + +## Замечания + +- Плагин не фиксирует действия, выполненные напрямую через базу данных без использования API или интерфейса NocoBase. +- Для повышения производительности рекомендуется ограничивать количество отображаемых записей и использовать фильтры. + +## Советы по безопасности + +- Ограничьте доступ к журналу аудита только администраторам. +- Настройте резервное копирование журнала аудита вместе с основными данными. + + + diff --git a/docs/ru-RU/handbook/auth-cas/index.md b/docs/ru-RU/handbook/auth-cas/index.md new file mode 100644 index 0000000000..8e807edf3f --- /dev/null +++ b/docs/ru-RU/handbook/auth-cas/index.md @@ -0,0 +1,41 @@ +# Аутентификация: CAS + + + +## Введение + +Плагин Auth: CAS реализует стандарт протокола CAS (Central Authentication Service), позволяя пользователям входить в NocoBase с использованием учетных записей сторонних провайдеров аутентификации (IdP). + +## Установка + +## Руководство пользователя + +### Активация плагина + +![](https://static-docs.nocobase.com/469c48d9f2e8d41a088092c34ddb41f5.png) + +### Добавление CAS-аутентификации + +1. Перейдите на страницу управления аутентификацией: + http://localhost:13000/admin/settings/auth/authenticators + +2. Добавьте метод аутентификации CAS: + +![](https://static-docs.nocobase.com/a268500c5008d3b90e57ff1e2ea41aca.png) + +3. Настройте параметры CAS и активируйте метод: + +![](https://static-docs.nocobase.com/2518b3fcc80d8a41391f3b629a510a02.png) + +### Страница входа + +Для входа через CAS перейдите по адресу: +http://localhost:13000/signin + +![](https://static-docs.nocobase.com/49116aafbb2ed7218306f929ac8af967.png) + +Основные особенности: +- Поддержка стандартного протокола CAS +- Интеграция с внешними провайдерами идентификации +- Простая настройка через административный интерфейс +- Единая точка входа для пользователей diff --git a/docs/ru-RU/handbook/auth-cas/static/AGr7blmfHoef1kxKpDVc7JTnnlf.png b/docs/ru-RU/handbook/auth-cas/static/AGr7blmfHoef1kxKpDVc7JTnnlf.png new file mode 100644 index 0000000000..74766a4356 Binary files /dev/null and b/docs/ru-RU/handbook/auth-cas/static/AGr7blmfHoef1kxKpDVc7JTnnlf.png differ diff --git a/docs/ru-RU/handbook/auth-cas/static/OAYab64AWoL3jkxeLUDc3YBfnFs.png b/docs/ru-RU/handbook/auth-cas/static/OAYab64AWoL3jkxeLUDc3YBfnFs.png new file mode 100644 index 0000000000..09ba5d7b27 Binary files /dev/null and b/docs/ru-RU/handbook/auth-cas/static/OAYab64AWoL3jkxeLUDc3YBfnFs.png differ diff --git a/docs/ru-RU/handbook/auth-cas/static/P3eDbyNhioPiJIxEIzWcfyTfnRe.png b/docs/ru-RU/handbook/auth-cas/static/P3eDbyNhioPiJIxEIzWcfyTfnRe.png new file mode 100644 index 0000000000..36f5b556ea Binary files /dev/null and b/docs/ru-RU/handbook/auth-cas/static/P3eDbyNhioPiJIxEIzWcfyTfnRe.png differ diff --git a/docs/ru-RU/handbook/auth-cas/static/XnzpbO09Vo5ha6xJfsTcifEunkh.png b/docs/ru-RU/handbook/auth-cas/static/XnzpbO09Vo5ha6xJfsTcifEunkh.png new file mode 100644 index 0000000000..6753758069 Binary files /dev/null and b/docs/ru-RU/handbook/auth-cas/static/XnzpbO09Vo5ha6xJfsTcifEunkh.png differ diff --git a/docs/ru-RU/handbook/auth-dingtalk/index.md b/docs/ru-RU/handbook/auth-dingtalk/index.md new file mode 100644 index 0000000000..bcbb494da9 --- /dev/null +++ b/docs/ru-RU/handbook/auth-dingtalk/index.md @@ -0,0 +1,58 @@ +# Аутентификация через DingTalk + + + +## Введение + +Плагин **Auth: DingTalk** позволяет пользователям входить в NocoBase с помощью учетных записей DingTalk, упрощая процесс авторизации. + +## Активация плагина + +![](https://static-docs.nocobase.com/202406120929356.png) + +## Получение API-доступов в консоли разработчика DingTalk + +1. Следуйте инструкциям из руководства DingTalk Open Platform - Реализация входа для сторонних сайтов для создания приложения. + +2. В консоли управления приложением активируйте разрешения: + - "Информация о личном мобильном номере" + - "Чтение персональной информации из адресной книги" + +![](https://static-docs.nocobase.com/202406120006620.png) + +## Получение учетных данных + +Скопируйте **Client ID** и **Client Secret** из консоли разработчика: + +![](https://static-docs.nocobase.com/202406120000595.png) + +## Настройка аутентификации в NocoBase + +1. Перейдите в раздел управления плагином аутентификации: + +![](https://static-docs.nocobase.com/202406112348051.png) + +2. Выберите **Добавить новый - DingTalk**: + +![](https://static-docs.nocobase.com/202406112349664.png) + +### Конфигурация + +![](https://static-docs.nocobase.com/202406120016896.png) + +- **Автоматическая регистрация новых пользователей** - Создает учетную запись при первом входе +- **Client ID и Client Secret** - Введите скопированные ранее данные +- **URL перенаправления** - Скопируйте этот адрес для следующего шага + +## Настройка callback-URL в DingTalk + +Вставьте скопированный **URL перенаправления** в соответствующее поле консоли разработчика: + +![](https://static-docs.nocobase.com/202406120012221.png) + +## Процесс входа + +На странице входа нажмите кнопку под формой для авторизации через DingTalk: + +![](https://static-docs.nocobase.com/202406120014539.png) + diff --git a/docs/ru-RU/handbook/auth-ldap/index.md b/docs/ru-RU/handbook/auth-ldap/index.md new file mode 100644 index 0000000000..5375017a81 --- /dev/null +++ b/docs/ru-RU/handbook/auth-ldap/index.md @@ -0,0 +1,55 @@ +# Аутентификация: LDAP + + + +## Введение + +Плагин «Аутентификация: LDAP» соответствует стандарту протокола LDAP (Lightweight Directory Access Protocol) и позволяет пользователям входить в систему NocoBase, используя свои учетные данные с сервера LDAP. + +## Активация плагина + + + +## Добавление аутентификации по LDAP + +Перейдите на страницу настроек плагина аутентификации. + + + +Нажмите «Добавить — LDAP». + + + +## Настройка + +### Основная настройка + + + +- **Автоматическая регистрация, если пользователь не существует** — создавать ли автоматически нового пользователя, если не найден соответствующий существующий. +- **LDAP URL** — адрес сервера LDAP. +- **Bind DN** — DN (отличительное имя), используемое для проверки подключения к серверу и поиска пользователей. +- **Пароль Bind DN** — пароль для указанного Bind DN. +- **Проверить подключение** — нажмите кнопку, чтобы проверить подключение к серверу и аутентификацию по Bind DN. + +### Настройка поиска + + + +- **Search DN** — DN, в котором будет выполняться поиск пользователей. +- **Фильтр поиска** — условие фильтрации при поиске пользователей. Используйте `{{account}}` как переменную для логина пользователя. +- **Область поиска (Scope)** — `Base` (только корень), `One level` (один уровень), `Subtree` (вся ветвь). По умолчанию — `Subtree`. +- **Лимит размера (Size limit)** — количество записей на одной странице поиска. + +### Сопоставление атрибутов + + + +- **Использовать это поле для привязки пользователя** — поле, по которому будет производиться сопоставление с существующим пользователем. Если при входе используется имя пользователя — выберите «username»; если электронная почта — выберите «email». По умолчанию — «username». +- **Сопоставление атрибутов (Attribute map)** — сопоставление атрибутов пользователя из LDAP с полями в таблице пользователей NocoBase. + +## Вход в систему + +Перейдите на страницу входа и введите имя пользователя и пароль от LDAP в форму авторизации. + + diff --git a/docs/ru-RU/handbook/auth-oidc/example/google.md b/docs/ru-RU/handbook/auth-oidc/example/google.md new file mode 100644 index 0000000000..bffa196348 --- /dev/null +++ b/docs/ru-RU/handbook/auth-oidc/example/google.md @@ -0,0 +1,23 @@ +# Вход через Google + +> Официальная документация: https://developers.google.com/identity/openid-connect/openid-connect + +## Получение учетных данных OAuth 2.0 Google + +1. Перейдите в [Google Cloud Console](https://console.cloud.google.com/apis/credentials) +2. Создайте учетные данные - ID клиента OAuth + +![](https://static-docs.nocobase.com/0f2946c8643565ecc4ac13249882638c.png) + +3. В интерфейсе конфигурации укажите URL перенаправления. Этот URL можно получить при добавлении аутентификатора в NocoBase (обычно имеет вид `http(s)://host:port/api/oidc:redirect`). Подробнее см. раздел [Руководство пользователя - Настройка](../index.md#configuration). + +![](https://static-docs.nocobase.com/24078bf52ec966a16334894cb3d9d126.png) + +## Добавление аутентификатора в NocoBase + +1. Перейдите: Настройки плагинов → Аутентификация пользователей → Добавить → OIDC + +![](https://static-docs.nocobase.com/0e4b1acdef6335aaee2139ae6629977b.png) + +2. Заполните параметры аутентификатора в соответствии с инструкциями в разделе [Руководство пользователя - Настройка](../index.md#configuration). + diff --git a/docs/ru-RU/handbook/auth-oidc/example/microsoft.md b/docs/ru-RU/handbook/auth-oidc/example/microsoft.md new file mode 100644 index 0000000000..2b346340ee --- /dev/null +++ b/docs/ru-RU/handbook/auth-oidc/example/microsoft.md @@ -0,0 +1,40 @@ +# Microsoft Entra ID + +> https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app +> https://learn.microsoft.com/en-us/entra/identity-platform/v2-protocols-oidc + +## Добавление аутентификатора в NocoBase + +Сначала добавьте новый аутентификатор в NocoBase: Настройки плагинов — Аутентификация пользователей — Добавить — OIDC. + +Скопируйте URL обратного вызова (callback URL). + +![](https://static-docs.nocobase.com/202412021504114.png) + +## Регистрация приложения + +Откройте центр администрирования Microsoft Entra и зарегистрируйте новое приложение. + +![](https://static-docs.nocobase.com/202412021506837.png) + +Укажите здесь скопированный ранее URL обратного вызова. + +![](https://static-docs.nocobase.com/202412021520696.png) + +## Получение и заполнение необходимой информации + +Щёлкните по только что зарегистрированному приложению и скопируйте **идентификатор приложения (клиентский ID)** и **идентификатор каталога (ID клиента)** на главной странице. + +![](https://static-docs.nocobase.com/202412021522063.png) + +Перейдите в раздел «Сертификаты и секреты» (Certificates & secrets), создайте новый секрет клиента (Client secret) и скопируйте его **значение (Value)**. + +![](https://static-docs.nocobase.com/202412021522846.png) + +Соответствие между полученными данными и полями настройки аутентификатора в NocoBase приведено в таблице ниже: + +| Данные Microsoft Entra | Поле в аутентификаторе NocoBase | +|-------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------| +| Идентификатор приложения (клиентский ID) | **Client ID** (Идентификатор клиента) | +| Секрет клиента — Значение (Value) | **Client Secret** (Секрет клиента) | +| Идентификатор каталога (ID клиента) | **Issuer** (Издатель):
    https://login.microsoftonline.com/{tenant}/v2.0/.well-known/openid-configuration, где `{tenant}` нужно заменить на идентификатор каталога (ID клиента) | diff --git a/docs/ru-RU/handbook/auth-oidc/example/static/2023-12-03-17-20-14.png b/docs/ru-RU/handbook/auth-oidc/example/static/2023-12-03-17-20-14.png new file mode 100644 index 0000000000..062e008940 Binary files /dev/null and b/docs/ru-RU/handbook/auth-oidc/example/static/2023-12-03-17-20-14.png differ diff --git a/docs/ru-RU/handbook/auth-oidc/example/static/2023-12-03-17-23-18.png b/docs/ru-RU/handbook/auth-oidc/example/static/2023-12-03-17-23-18.png new file mode 100644 index 0000000000..3718932098 Binary files /dev/null and b/docs/ru-RU/handbook/auth-oidc/example/static/2023-12-03-17-23-18.png differ diff --git a/docs/ru-RU/handbook/auth-oidc/example/static/2023-12-03-18-28-33.png b/docs/ru-RU/handbook/auth-oidc/example/static/2023-12-03-18-28-33.png new file mode 100644 index 0000000000..a817b893a5 Binary files /dev/null and b/docs/ru-RU/handbook/auth-oidc/example/static/2023-12-03-18-28-33.png differ diff --git a/docs/ru-RU/handbook/auth-oidc/index.md b/docs/ru-RU/handbook/auth-oidc/index.md new file mode 100644 index 0000000000..d92237001a --- /dev/null +++ b/docs/ru-RU/handbook/auth-oidc/index.md @@ -0,0 +1,75 @@ +# Аутентификация: OIDC + + + +## Введение + +Плагин Auth: OIDC реализует стандарт протокола OpenID Connect (OIDC) с использованием Authorization Code Flow, позволяя пользователям входить в NocoBase через сторонние провайдеры аутентификации (IdP). + +## Активация плагина + +![](https://static-docs.nocobase.com/202411122358790.png) + +## Добавление OIDC-аутентификации + +1. Перейдите в раздел управления аутентификацией: + +![](https://static-docs.nocobase.com/202411130004459.png) + +2. Выберите "Добавить - OIDC": + +![](https://static-docs.nocobase.com/1efbde1c0e2f4967efc1c4336be45ca2.png) + +## Настройка + +### Основные параметры + +![](https://static-docs.nocobase.com/202411130006341.png) + +| Параметр | Описание | Версия | +|----------------------------------------|----------------------------------------------------------------------------------------------|-----------------| +| Авторегистрация новых пользователей | Создавать нового пользователя при отсутствии совпадений | - | +| Issuer (Эмитент) | URL провайдера (обычно заканчивается на `/.well-known/openid-configuration`) | - | +| Client ID | Идентификатор клиента | - | +| Client Secret | Секретный ключ клиента | - | +| scope | Области доступа (по умолчанию `openid email profile`) | - | +| Алгоритм подписи id_token | Алгоритм подписи токена (по умолчанию RS256) | - | +| Выход по инициативе RP | Выход из сессии IdP при выходе из NocoBase | `v1.3.44-beta` | + +### Сопоставление полей + +| Параметр | Описание | +|----------------------------------|----------------------------------------------------------------------------------------------| +| Сопоставление полей | Маппинг полей (никнейм, email, телефон) | +| Поле для привязки пользователя | Поле для сопоставления с существующими пользователями (email или username) | + +### Дополнительные настройки + +![](https://static-docs.nocobase.com/202411130013306.png) + +| Параметр | Описание | Версия | +|--------------------------------------------------------|----------------------------------------------------------------------------------------------|-----------------| +| HTTP-протокол | Использовать HTTP для callback-URL (по умолчанию HTTPS) | - | +| Порт | Порт для callback-URL | - | +| State-токен | Защита от CSRF-атак (рекомендуется оставить пустым) | - | +| Передача параметров при обмене кода на токен | Для некоторых IdP требуется передача Client ID/Secret | - | +| Метод запроса user info | HTTP-метод для получения информации о пользователе | - | +| Способ передачи access token | В заголовке, теле запроса или параметрах URL | - | +| Отключение проверки SSL | **Не рекомендуется для production-среды** | `v1.3.40-beta` | + +## Использование + +| Параметр | Описание | +|------------------------------|----------------------------------------------------------------------------------------------| +| Redirect URL | URL для callback в настройках IdP | +| Post logout redirect URL | URL для перенаправления после выхода | + +:::info +При локальном тестировании используйте `127.0.0.1` вместо `localhost`. Проблемы с state-параметром в cookies могут вызывать ошибки аутентификации. +::: + +## Процесс входа + +На странице входа нажмите кнопку для авторизации через OIDC-провайдера: + +![](https://static-docs.nocobase.com/e493d156254c2ac0b6f6e1002e6a2e6b.png) diff --git a/docs/ru-RU/handbook/auth-oidc/static/2023-12-03-18-18-22.png b/docs/ru-RU/handbook/auth-oidc/static/2023-12-03-18-18-22.png new file mode 100644 index 0000000000..00c7af9901 Binary files /dev/null and b/docs/ru-RU/handbook/auth-oidc/static/2023-12-03-18-18-22.png differ diff --git a/docs/ru-RU/handbook/auth-oidc/static/2023-12-03-18-19-33.png b/docs/ru-RU/handbook/auth-oidc/static/2023-12-03-18-19-33.png new file mode 100644 index 0000000000..b18c082b4f Binary files /dev/null and b/docs/ru-RU/handbook/auth-oidc/static/2023-12-03-18-19-33.png differ diff --git a/docs/ru-RU/handbook/auth-oidc/static/2023-12-03-18-19-48.png b/docs/ru-RU/handbook/auth-oidc/static/2023-12-03-18-19-48.png new file mode 100644 index 0000000000..51493ba4da Binary files /dev/null and b/docs/ru-RU/handbook/auth-oidc/static/2023-12-03-18-19-48.png differ diff --git a/docs/ru-RU/handbook/auth-oidc/static/2023-12-03-18-20-35.png b/docs/ru-RU/handbook/auth-oidc/static/2023-12-03-18-20-35.png new file mode 100644 index 0000000000..5ff8d62ea8 Binary files /dev/null and b/docs/ru-RU/handbook/auth-oidc/static/2023-12-03-18-20-35.png differ diff --git a/docs/ru-RU/handbook/auth-oidc/static/2024-01-11-10-40-02.png b/docs/ru-RU/handbook/auth-oidc/static/2024-01-11-10-40-02.png new file mode 100644 index 0000000000..1ad1a9fb1f Binary files /dev/null and b/docs/ru-RU/handbook/auth-oidc/static/2024-01-11-10-40-02.png differ diff --git a/docs/ru-RU/handbook/auth-oidc/static/2024-01-11-10-41-56.png b/docs/ru-RU/handbook/auth-oidc/static/2024-01-11-10-41-56.png new file mode 100644 index 0000000000..6867e85679 Binary files /dev/null and b/docs/ru-RU/handbook/auth-oidc/static/2024-01-11-10-41-56.png differ diff --git a/docs/ru-RU/handbook/auth-oidc/static/2024-01-11-10-42-44.png b/docs/ru-RU/handbook/auth-oidc/static/2024-01-11-10-42-44.png new file mode 100644 index 0000000000..18a403ea21 Binary files /dev/null and b/docs/ru-RU/handbook/auth-oidc/static/2024-01-11-10-42-44.png differ diff --git a/docs/ru-RU/handbook/auth-oidc/static/2024-01-11-10-43-39.png b/docs/ru-RU/handbook/auth-oidc/static/2024-01-11-10-43-39.png new file mode 100644 index 0000000000..7d41418b09 Binary files /dev/null and b/docs/ru-RU/handbook/auth-oidc/static/2024-01-11-10-43-39.png differ diff --git a/docs/ru-RU/handbook/auth-saml/example/google.md b/docs/ru-RU/handbook/auth-saml/example/google.md new file mode 100644 index 0000000000..705e5cc2e3 --- /dev/null +++ b/docs/ru-RU/handbook/auth-saml/example/google.md @@ -0,0 +1,44 @@ +# Интеграция с Google Workspace + +## Настройка Google в качестве IdP (провайдера идентификации) + +1. Перейдите в [Google Admin Console](https://admin.google.com/) +2. Откройте раздел: Приложения → Веб-приложения и мобильные приложения + +![](https://static-docs.nocobase.com/0812780b990a97a63c14ea8991959827.png) + +3. После настройки приложения скопируйте: + - **SSO URL** (URL единого входа) + - **Entity ID** (Идентификатор сущности) + - **Certificate** (Сертификат) + +![](https://static-docs.nocobase.com/aafd20a794730e85411c0c8f368637e0.png) + +## Добавление аутентификатора в NocoBase + +1. Перейдите: Настройки плагинов → Аутентификация пользователей → Добавить → SAML + +![](https://static-docs.nocobase.com/5bc18c7952b8f15828e26bb07251a335.png) + +2. Введите скопированные данные: + - SSO URL: URL единого входа + - Public Certificate: Сертификат + - idP Issuer: Entity ID + - http: Отметьте, если тестируете локально с http + +3. Скопируйте значения SP Issuer/EntityID и ACS URL из раздела "Использование" + +## Заполнение информации о SP (поставщике услуг) в Google + +1. Вернитесь в Google Console +2. На странице **Service Provider Details** введите: + - ACS URL (скопированный ранее) + - Entity ID (скопированный ранее) +3. Отметьте опцию **Signed Response** (Подписанный ответ) + +![](https://static-docs.nocobase.com/1536268bf8df4a5ebc72384317172191.png) +![](https://static-docs.nocobase.com/c7de1f8b84c1335de110e5a7c96255c4.png) + +4. В разделе **Attribute Mapping** (Сопоставление атрибутов) настройте соответствие атрибутов: + +![](https://static-docs.nocobase.com/27180f2f46480c3fee3016df86d6fdb8.png) diff --git a/docs/ru-RU/handbook/auth-saml/example/static/2023-12-03-17-43-40.png b/docs/ru-RU/handbook/auth-saml/example/static/2023-12-03-17-43-40.png new file mode 100644 index 0000000000..072477707e Binary files /dev/null and b/docs/ru-RU/handbook/auth-saml/example/static/2023-12-03-17-43-40.png differ diff --git a/docs/ru-RU/handbook/auth-saml/example/static/2023-12-03-17-53-20.png b/docs/ru-RU/handbook/auth-saml/example/static/2023-12-03-17-53-20.png new file mode 100644 index 0000000000..6ed94f8406 Binary files /dev/null and b/docs/ru-RU/handbook/auth-saml/example/static/2023-12-03-17-53-20.png differ diff --git a/docs/ru-RU/handbook/auth-saml/example/static/2023-12-03-17-57-33.png b/docs/ru-RU/handbook/auth-saml/example/static/2023-12-03-17-57-33.png new file mode 100644 index 0000000000..fb5d5fe6f7 Binary files /dev/null and b/docs/ru-RU/handbook/auth-saml/example/static/2023-12-03-17-57-33.png differ diff --git a/docs/ru-RU/handbook/auth-saml/example/static/2023-12-03-17-58-06.png b/docs/ru-RU/handbook/auth-saml/example/static/2023-12-03-17-58-06.png new file mode 100644 index 0000000000..c73041321c Binary files /dev/null and b/docs/ru-RU/handbook/auth-saml/example/static/2023-12-03-17-58-06.png differ diff --git a/docs/ru-RU/handbook/auth-saml/example/static/2023-12-03-17-59-27.png b/docs/ru-RU/handbook/auth-saml/example/static/2023-12-03-17-59-27.png new file mode 100644 index 0000000000..f7181e3380 Binary files /dev/null and b/docs/ru-RU/handbook/auth-saml/example/static/2023-12-03-17-59-27.png differ diff --git a/docs/ru-RU/handbook/auth-saml/example/static/2023-12-03-18-32-59.png b/docs/ru-RU/handbook/auth-saml/example/static/2023-12-03-18-32-59.png new file mode 100644 index 0000000000..122976753d Binary files /dev/null and b/docs/ru-RU/handbook/auth-saml/example/static/2023-12-03-18-32-59.png differ diff --git a/docs/ru-RU/handbook/auth-saml/index.md b/docs/ru-RU/handbook/auth-saml/index.md new file mode 100644 index 0000000000..c3ce9699db --- /dev/null +++ b/docs/ru-RU/handbook/auth-saml/index.md @@ -0,0 +1,59 @@ +# Аутентификация: SAML 2.0 + + + +## Введение + +Плагин «Аутентификация: SAML 2.0» соответствует стандарту протокола SAML 2.0 (Security Assertion Markup Language 2.0) и позволяет пользователям входить в систему NocoBase, используя учётные записи, предоставленные сторонними провайдерами удостоверяющих центров (IdP). + +## Активация плагина + +![](https://static-docs.nocobase.com/6a12f3d8073c47532a4f8aac900e4296.png) + +## Добавление аутентификации по SAML + +Перейдите на страницу управления плагином аутентификации пользователей. + +![](../auth-oidc/static/2023-12-03-18-19-33.png) + +Нажмите «Добавить — SAML». + +![](https://static-docs.nocobase.com/5076fe56086b7799be308bbaf7c4425d.png) + +## Настройка + +![](https://static-docs.nocobase.com/976b66e589973c322d81dcddd22c6146.png) + +- **SSO URL** — предоставляется IdP, используется для единого входа (Single Sign-On). +- **Публичный сертификат** — предоставляется IdP. +- **Entity ID (IdP Issuer)** — необязательно, предоставляется IdP. +- **HTTP** — установите флажок, если ваше приложение NocoBase использует протокол HTTP. +- **Использовать это поле для привязки пользователя** — поле, по которому будет выполняться сопоставление с существующими пользователями. Можно выбрать `email` или `username`, по умолчанию — `email`. Информация о пользователе, передаваемая IdP, должна содержать поле `email` или `username`. +- **Автоматическая регистрация, если пользователь не существует** — создавать ли автоматически нового пользователя, если не найден соответствующий существующий. +- **Использование** — значения `SP Issuer / EntityID` и `ACS URL` используются для копирования и заполнения соответствующих настроек на стороне IdP. + +## Сопоставление полей + +Сопоставление полей необходимо настроить на платформе конфигурации IdP. Вы можете ознакомиться с примером: [Google](../auth-saml/example/google.md). + +Поля, доступные для сопоставления в NocoBase: + +- email (обязательно) +- phone (работает только на платформах, поддерживающих `phone` в scope, например, Alibaba Cloud, Lark) +- nickname +- username +- firstName +- lastName + +Поле `nameID` передаётся протоколом SAML и не требует сопоставления — оно сохраняется как уникальный идентификатор пользователя. + +Приоритет при формировании псевдонима нового пользователя: +`nickname` > `firstName lastName` > `username` > `nameID` + +В настоящее время сопоставление организаций и ролей пользователя не поддерживается. + +## Вход в систему + +Перейдите на страницу входа и нажмите кнопку под формой входа, чтобы запустить процесс аутентификации через сторонний провайдер. + +![](https://static-docs.nocobase.com/74963865c9d36a294948e6adeb5b24bc.png) diff --git a/docs/ru-RU/handbook/auth-saml/static/2023-12-03-18-29-18.png b/docs/ru-RU/handbook/auth-saml/static/2023-12-03-18-29-18.png new file mode 100644 index 0000000000..8b57e2da0c Binary files /dev/null and b/docs/ru-RU/handbook/auth-saml/static/2023-12-03-18-29-18.png differ diff --git a/docs/ru-RU/handbook/auth-saml/static/2023-12-03-18-29-45.png b/docs/ru-RU/handbook/auth-saml/static/2023-12-03-18-29-45.png new file mode 100644 index 0000000000..f736ac2f8b Binary files /dev/null and b/docs/ru-RU/handbook/auth-saml/static/2023-12-03-18-29-45.png differ diff --git a/docs/ru-RU/handbook/auth-saml/static/2023-12-03-18-30-08.png b/docs/ru-RU/handbook/auth-saml/static/2023-12-03-18-30-08.png new file mode 100644 index 0000000000..12f903298f Binary files /dev/null and b/docs/ru-RU/handbook/auth-saml/static/2023-12-03-18-30-08.png differ diff --git a/docs/ru-RU/handbook/auth-saml/static/2023-12-03-18-30-33.png b/docs/ru-RU/handbook/auth-saml/static/2023-12-03-18-30-33.png new file mode 100644 index 0000000000..1460f97d9b Binary files /dev/null and b/docs/ru-RU/handbook/auth-saml/static/2023-12-03-18-30-33.png differ diff --git a/docs/ru-RU/handbook/auth-saml/static/2023-12-03-18-32-21.png b/docs/ru-RU/handbook/auth-saml/static/2023-12-03-18-32-21.png new file mode 100644 index 0000000000..122976753d Binary files /dev/null and b/docs/ru-RU/handbook/auth-saml/static/2023-12-03-18-32-21.png differ diff --git a/docs/ru-RU/handbook/auth-sms/index.md b/docs/ru-RU/handbook/auth-sms/index.md new file mode 100644 index 0000000000..09e27c4119 --- /dev/null +++ b/docs/ru-RU/handbook/auth-sms/index.md @@ -0,0 +1,32 @@ +# Аутентификация по SMS + +## Введение + +Плагин SMS-аутентификации позволяет пользователям регистрироваться и входить в NocoBase с помощью SMS. + +> Требуется интеграция с функцией SMS-верификации из плагина [`@nocobase/plugin-verification`](../verification/index.md) + +## Добавление SMS-аутентификации + +1. Перейдите в раздел управления плагинами аутентификации: + +![](../auth-oidc/static/2023-12-03-18-19-33.png) + +2. Выберите "Добавить - SMS": + +![](https://static-docs.nocobase.com/29c8916492fd5e1564a872b31ad3ac0d.png) + +## Настройка + +![](https://static-docs.nocobase.com/a4d35ec63ba22ae2ea9e3e8e1cbb783d.png) + +Для настройки SMS-верификации обратитесь к [документации плагина Verification](../verification/index.md). Для отправки SMS будет использоваться провайдер, заданный по умолчанию. + +**Автоматическая регистрация новых пользователей:** +При включении этой опции, если номер телефона не найден в системе, будет автоматически создан новый пользователь с номером телефона в качестве никнейма. + +## Процесс входа + +Доступно на странице входа в систему: + +![](https://static-docs.nocobase.com/8d630739201bc27d8b0de076ab4f75e2.png) diff --git a/docs/ru-RU/handbook/auth-sms/static/2023-12-03-19-02-33.png b/docs/ru-RU/handbook/auth-sms/static/2023-12-03-19-02-33.png new file mode 100644 index 0000000000..b5b41e7dc0 Binary files /dev/null and b/docs/ru-RU/handbook/auth-sms/static/2023-12-03-19-02-33.png differ diff --git a/docs/ru-RU/handbook/auth-sms/static/2023-12-03-19-04-34.png b/docs/ru-RU/handbook/auth-sms/static/2023-12-03-19-04-34.png new file mode 100644 index 0000000000..b45ff98ae5 Binary files /dev/null and b/docs/ru-RU/handbook/auth-sms/static/2023-12-03-19-04-34.png differ diff --git a/docs/ru-RU/handbook/auth-sms/static/2023-12-03-19-06-26.png b/docs/ru-RU/handbook/auth-sms/static/2023-12-03-19-06-26.png new file mode 100644 index 0000000000..cbe1b531ab Binary files /dev/null and b/docs/ru-RU/handbook/auth-sms/static/2023-12-03-19-06-26.png differ diff --git a/docs/ru-RU/handbook/auth/dev/api.md b/docs/ru-RU/handbook/auth/dev/api.md new file mode 100644 index 0000000000..bf87adce11 --- /dev/null +++ b/docs/ru-RU/handbook/auth/dev/api.md @@ -0,0 +1,114 @@ +# Ссылка на API + +## Серверная сторона + +### Auth + +API ядра, ссылка: [Auth](../../../api/auth/auth.md) + +### BaseAuth + +API ядра, ссылка: [BaseAuth](../../../api/auth/base-auth.md) + +### AuthModel + +#### Обзор + +`AuthModel` — это аутентификатор, используемый в приложениях NocoBase (`Authenticator`, ссылка: [AuthManager - setStorer](../../../api/auth/auth-manager.md#setstorer) и [Auth - constructor](../../../api/auth/auth.md#constructor)), предоставляющий некоторые методы для взаимодействия с пользовательской коллекцией данных. Кроме того, можно использовать методы, предоставляемые Sequelize Model. + +```ts +import { AuthModel } from '@nocobase/plugin-auth'; + +class CustomAuth extends BaseAuth { + async validate() { + // ... + const authenticator = this.authenticator as AuthModel; + this.authenticator.findUser(); + this.authenticator.newUser(); + this.authenticator.findOrCreateUser(); + // ... + } +} +``` + +#### Методы класса + +- `findUser(uuid: string): UserModel` - Запрос пользователя по `uuid`. + +- `uuid` - Уникальный идентификатор пользователя из текущего типа аутентификации + +- `newUser(uuid: string, userValues?: any): UserModel` - Создать нового пользователя, привязать пользователя к текущему аутентификатору через `uuid`. + +- `uuid` - Уникальный идентификатор пользователя из текущего типа аутентификации +- `userValues` - Необязательно. Другая информация о пользователе. Если не передано, `uuid` будет использоваться как псевдоним пользователя. + +- `findOrCreateUser(uuid: string, userValues?: any): UserModel` - Найти или создать нового пользователя, правило создания такое же, как указано выше. +- `uuid` - Уникальный идентификатор пользователя из текущего типа аутентификации +- `userValues` - Необязательно. Другая информация о пользователе. + +## Клиентская сторона + +### `plugin.registerType()` + +Регистрация клиента типа аутентификации. + +```ts +import AuthPlugin from '@nocobase/plugin-auth/client'; + +class CustomAuthPlugin extends Plugin { + async load() { + const auth = this.app.pm.get(AuthPlugin); + auth.registerType('custom-auth-type', { + components: { + SignInForm, + // SignInButton + SignUpForm, + AdminSettingsForm, + }, + }); + } +} +``` + +#### Подпись + +- `registerType(authType: string, options: AuthOptions)` + +#### Тип + +```ts +export type AuthOptions = { + components: Partial<{ + SignInForm: ComponentType<{ authenticator: AuthenticatorType }>; + SignInButton: ComponentType<{ authenticator: AuthenticatorType }>; + SignUpForm: ComponentType<{ authenticatorName: string }>; + AdminSettingsForm: ComponentType; + }>; +}; +``` + +#### Подробности + +- `SignInForm` - Форма входа +- `SignInButton` - Кнопка входа (стороннего разработчика), может использоваться как альтернатива форме входа +- `SignUpForm` - Форма регистрации +- `AdminSettingsForm` - Форма конфигурации администратора + +### Маршрут + +Фронтенд-маршруты для регистрации плагина аутентификации следующие: + +- Auth Layout + - name: `auth` + - path: `-` + - component: `AuthLayout` + +- SignIn Page + - name: `auth.signin` + - path: `/signin` + - component: `SignInPage` + +- SignUp Page + - name: `auth.signup` + - path: `/signup` + - component: `SignUpPage` diff --git a/docs/ru-RU/handbook/auth/dev/guide.md b/docs/ru-RU/handbook/auth/dev/guide.md new file mode 100644 index 0000000000..00cd791f39 --- /dev/null +++ b/docs/ru-RU/handbook/auth/dev/guide.md @@ -0,0 +1,177 @@ +# Расширение типа аутентификации + +## Обзор + +NocoBase поддерживает расширение типов аутентификации пользователя по мере необходимости. Аутентификация пользователя обычно делится на два типа: один заключается в определении личности пользователя в самом приложении NocoBase, например, вход по паролю, вход по SMS и т. д.; другой заключается в определении сторонними службами личности пользователя и уведомлении приложения NocoBase о результате с помощью обратных вызовов, таких как OIDC, SAML и другие методы аутентификации. Процесс аутентификации для этих двух различных типов методов аутентификации в NocoBase в основном выглядит следующим образом: + +### Сторонние обратные вызовы не требуются + +1. Клиент использует NocoBase SDK для вызова интерфейса входа `api.auth.signIn()`, запрашивая интерфейс входа `auth:signIn`, при этом передавая текущий идентификатор аутентификатора через заголовок запроса `X-Authenticator` в бэкэнд. +2. Интерфейс `auth:signIn` перенаправляет к соответствующему типу аутентификации на основе идентификатора аутентификатора в заголовке запроса, а метод `validate` в зарегистрированном классе аутентификации этого типа аутентификации выполняет соответствующую логическую обработку. +3. Клиент извлекает информацию о пользователе и токен аутентификации из ответа интерфейса `auth:signIn`, сохраняет токен в локальном хранилище и завершает вход. Этот шаг автоматически обрабатывается внутри SDK. +4. + + +### Dependent on Third-party Callbacks + +### Зависит от сторонних обратных вызовов + +1. Клиент получает сторонний URL-адрес входа через свой собственный зарегистрированный интерфейс (например, `auth:getAuthUrl`) и передает информацию, такую ​​как имя приложения и идентификатор аутентификатора, в соответствии с протоколом. +2. Перенаправляет на сторонний URL-адрес для завершения входа. Сторонняя служба вызывает интерфейс обратного вызова приложения NocoBase (который должен быть зарегистрирован самостоятельно, например `auth:redirect`), возвращает результат аутентификации и возвращает информацию, такую ​​как имя приложения и идентификатор аутентификатора. +3. В методе интерфейса обратного вызова проанализируйте параметры, чтобы получить идентификатор аутентификатора, получите соответствующий класс аутентификации через `AuthManager` и активно вызовите метод `auth.signIn()`. Метод `auth.signIn()` вызовет метод `validate()` для обработки логики аутентификации. +4. После того как метод обратного вызова получит токен аутентификации, он перенаправит обратно на страницу интерфейса с кодом состояния 302 и перенесет `token` и идентификатор аутентификатора в параметры URL, `?authenticator=xxx&token=yyy`. + + + +Далее мы обсудим, как регистрировать серверные интерфейсы и клиентские пользовательские интерфейсы. + +## Сервер + +### Интерфейс + +Ядро NocoBase обеспечивает регистрацию и управление для расширения типов аутентификации. Основная логическая обработка расширения плагина входа требует наследования абстрактного класса `Auth` ядра и реализации соответствующих стандартных интерфейсов. +Полный API см. в [Auth](../../../api/auth/auth.md). + + +```typescript +import { Auth } from '@nocobase/auth'; + +class CustomAuth extends Auth { + set user(user) {} + get user() {} + + async check() {} + async signIn() {} +} +``` + +В большинстве случаев расширенный тип аутентификации пользователя может также использовать существующую логику аутентификации JWT для генерации учетных данных для доступа пользователя к API. Класс `BaseAuth` в ядре выполнил базовую реализацию абстрактного класса `Auth`, см. [BaseAuth](../../../api/auth/base-auth.md). Плагины могут напрямую наследовать класс `BaseAuth` для повторного использования части логического кода и снижения затрат на разработку. + +```javascript +import { BaseAuth } from '@nocobase/auth'; + +class CustomAuth extends BaseAuth { + constructor(config: AuthConfig) { + // Set user data table + const userCollection = config.ctx.db.getCollection('users'); + super({ ...config, userCollection }); + } + + // Implement user login logic + async validate() {} +} +``` + +### Данные пользователя + +В приложении NocoBase связанные коллекции по умолчанию определяются следующим образом: + +| Collections | Description | Plugin | +| --------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | +| `users` | Store user information, such as email, nickname, and password | [User Plugin (`@nocobase/plugin-users`)](../../users/index.md) | +| `authenticators` | Store authenticator (authentication type entity) information, corresponding to authentication type and configuration | User Authentication Plugin (`@nocobase/plugin-auth`) | +| `usersAuthenticators` | Associates users and authenticators, saves user information under the corresponding authenticator | User Authentication Plugin (`@nocobase/plugin-auth`) | + +В общем, расширенные методы входа используют `users` и `usersAuthenticators` для хранения соответствующих пользовательских данных. Только в особых случаях вам нужно добавить новую коллекцию самостоятельно. + +Основные поля `usersAuthenticators`: + +| Field | Description | +| --------------- | ------------------------------------------------------------------------------------------- | +| `uuid` | Unique identifier for this type of authentication, such as phone number, WeChat openid, etc | +| `meta` | JSON field, other information to be saved | +| `userId` | User ID | +| `authenticator` | Authenticator name (unique identifier) | + +Для операций запроса и создания пользователя модель данных `authenticators` `AuthModel` также инкапсулирует несколько методов, которые могут использоваться в классе `CustomAuth` через `this.authenticator[methodName]`. Для полного API см. [AuthModel](../dev/api.md#authmodel). + +```ts +import { AuthModel } from '@nocobase/plugin-auth'; + +class CustomAuth extends BaseAuth { + async validate() { + // ... + const authenticator = this.authenticator as AuthModel; + this.authenticator.findUser(); // Query user + this.authenticator.newUser(); // Create new user + this.authenticator.findOrCreateUser(); // Query or create new user + // ... + } +} +``` + +### Регистрация типа аутентификации + +Расширенный метод аутентификации необходимо зарегистрировать в модуле управления аутентификацией. + +```javascript +class CustomAuthPlugin extends Plugin { + async load() { + this.app.authManager.registerTypes('custom-auth-type', { + auth: CustomAuth, + }); + } +} +``` + +## Клиент + +Пользовательский интерфейс клиента регистрируется через интерфейс `registerType`, предоставляемый клиентом плагина аутентификации пользователя: + +```ts +import AuthPlugin from '@nocobase/plugin-auth/client'; + +class CustomAuthPlugin extends Plugin { + async load() { + const auth = this.app.pm.get(AuthPlugin); + auth.registerType('custom-auth-type', { + components: { + SignInForm, // Sign in form + SignInButton, // Sign in (third party) button, can be either with the login form + SignUpForm, // Sign up form + AdminSettingsForm, // Backstage management form + }, + }); + } +} +``` + +### Форма входа + +![](https://static-docs.nocobase.com/33afe18f229c3db45c7a1921c2c050b7.png) + +Если несколько аутентификаторов, соответствующих типу аутентификации, имеют зарегистрированные формы входа, они будут отображаться в виде вкладок. Заголовок вкладки — это заголовок аутентификатора, настроенного в фоновом режиме. + +![](https://static-docs.nocobase.com/ada6d7add744be0c812359c23bf4c7fc.png) + +### Кнопка входа + +![](https://static-docs.nocobase.com/e706f7785782adc77b0f4ee4faadfab8.png) + +Обычно для сторонних кнопок входа, но на самом деле может быть любым компонентом. + +### Форма регистрации + +![](https://static-docs.nocobase.com/f95c53431bf21ec312fcfd51923f0b42.png) + +Если вам нужно перейти со страницы входа на страницу регистрации, вам нужно сделать это самостоятельно в компоненте входа. + +### Форма управления бэкэндом + +![](https://static-docs.nocobase.com/f4b544b5b0f5afee5621ad4abf66b24f.png) + +Вверху находится общая конфигурация аутентификатора, а внизу — часть формы пользовательской конфигурации, которую можно зарегистрировать. + +### API запросов + +Чтобы инициировать запросы на интерфейсы, связанные с аутентификацией пользователя, на стороне клиента, вы можете использовать SDK, предоставляемый NocoBase. + +```ts +import { useAPIClient } from '@nocobase/client'; + +// Use in component +const api = useAPIClient(); +api.auth.signIn(data, authenticator); +``` + +Подробные справочные материалы по API см. в [@nocobase/sdk - Auth](../../../api/sdk/auth.md). diff --git a/docs/ru-RU/handbook/auth/dev/static/2023-12-20-12-08-49.png b/docs/ru-RU/handbook/auth/dev/static/2023-12-20-12-08-49.png new file mode 100644 index 0000000000..5e9480e10b Binary files /dev/null and b/docs/ru-RU/handbook/auth/dev/static/2023-12-20-12-08-49.png differ diff --git a/docs/ru-RU/handbook/auth/dev/static/2023-12-20-12-12-45.png b/docs/ru-RU/handbook/auth/dev/static/2023-12-20-12-12-45.png new file mode 100644 index 0000000000..94cb28e2b0 Binary files /dev/null and b/docs/ru-RU/handbook/auth/dev/static/2023-12-20-12-12-45.png differ diff --git a/docs/ru-RU/handbook/auth/dev/static/2023-12-20-12-17-07.png b/docs/ru-RU/handbook/auth/dev/static/2023-12-20-12-17-07.png new file mode 100644 index 0000000000..33b86b9273 Binary files /dev/null and b/docs/ru-RU/handbook/auth/dev/static/2023-12-20-12-17-07.png differ diff --git a/docs/ru-RU/handbook/auth/dev/static/2023-12-20-12-19-51.png b/docs/ru-RU/handbook/auth/dev/static/2023-12-20-12-19-51.png new file mode 100644 index 0000000000..6db1aa6e77 Binary files /dev/null and b/docs/ru-RU/handbook/auth/dev/static/2023-12-20-12-19-51.png differ diff --git a/docs/ru-RU/handbook/auth/dev/static/2023-12-22-10-21-28.png b/docs/ru-RU/handbook/auth/dev/static/2023-12-22-10-21-28.png new file mode 100644 index 0000000000..4912adf43b Binary files /dev/null and b/docs/ru-RU/handbook/auth/dev/static/2023-12-22-10-21-28.png differ diff --git a/docs/ru-RU/handbook/auth/index.md b/docs/ru-RU/handbook/auth/index.md new file mode 100644 index 0000000000..3ffc317770 --- /dev/null +++ b/docs/ru-RU/handbook/auth/index.md @@ -0,0 +1,19 @@ +# Аутентификация пользователей + +## Введение + +Модуль аутентификации пользователей в NocoBase состоит из двух частей: + +- **`@nocobase/auth`** в ядре: определяет интерфейсы и middleware для входа в систему, регистрации, верификации и других процессов аутентификации, а также используется для регистрации и управления различными методами аутентификации. +- **`@nocobase/plugin-auth`** в плагинах: инициализирует модуль управления аутентификацией в ядре и предоставляет базовый метод аутентификации — по имени пользователя (или email) и паролю. + +> Для работы требуется также использование модуля управления пользователями, предоставляемого плагином [`@nocobase/plugin-users`](../users/index.md) + +Дополнительно, NocoBase предлагает и другие плагины для различных способов аутентификации: + +- [@nocobase/plugin-auth-sms](../auth-sms/index.md) — аутентификация с помощью SMS-кодов. +- [@nocobase/plugin-auth-saml](../auth-saml/index.md) — аутентификация через SAML SSO. +- [@nocobase/plugin-auth-oidc](../auth-oidc/index.md) — аутентификация через OIDC SSO. +- [@nocobase/plugin-auth-cas](../auth-cas/index.md) — аутентификация через CAS SSO. + +С помощью этих плагинов администратор может настроить аутентификацию пользователей, позволяя входить в систему с использованием учётных данных Google Workspace, Microsoft Azure и других платформ. Также можно подключить такие инструменты, как Auth0, Logto, Keycloak. Разработчики могут легко расширять список поддерживаемых методов аутентификации, используя предоставленные базовые интерфейсы. diff --git a/docs/ru-RU/handbook/auth/user/index.md b/docs/ru-RU/handbook/auth/user/index.md new file mode 100644 index 0000000000..8e0e14c15a --- /dev/null +++ b/docs/ru-RU/handbook/auth/user/index.md @@ -0,0 +1,124 @@ +# Руководство пользователя + +## Управление аутентификацией пользователей + +После установки плагина аутентификации пользователей автоматически инициализируется метод аутентификации по **паролю**, основанный на имени пользователя и адресе электронной почты. + +![](https://static-docs.nocobase.com/66eaa9d5421c9cb713b117366bd8a5d5.png) + +## Активация типа аутентификации + +![](https://static-docs.nocobase.com/7f1fb8f8ca5de67ffc68eff0a65848f5.png) + +Отображаются на странице входа только активированные типы аутентификации. + +![](https://static-docs.nocobase.com/8375a36ef98417af0f0977f1e07345dd.png) + +## Типы аутентификации пользователей + +![](https://static-docs.nocobase.com/da4250c0cea343ebe470cbf7be4b12e4.png) + +В настоящее время NocoBase поддерживает следующие типы аутентификации: + +- **Пароль (Password)** — встроенный плагин аутентификации +- **SMS (SMS)** — расширяется с помощью [плагина sms-auth](../../auth-sms/index.md) +- **CAS** — расширяется с помощью [плагина cas-auth](../../auth-cas/index.md) +- **SAML** — расширяется с помощью [плагина saml-auth](../../auth-saml/index.md) +- **OIDC** — расширяется с помощью [плагина oidc-auth](../../auth-oidc/index.md) + +Кроме того, вы можете самостоятельно расширить функционал аутентификации. Подробнее см. в [Руководстве для разработчиков](../dev/guide.md). + +## Аутентификация по паролю + +### Интерфейс настройки + +![](https://static-docs.nocobase.com/202411131505095.png) + +### Разрешить регистрацию + +Если регистрация разрешена, на странице входа будет отображаться ссылка «Создать аккаунт», и пользователь сможет перейти на страницу регистрации. + +![](https://static-docs.nocobase.com/78903930d4b47aaf75cf94c55dd3596e.png) + +Страница регистрации: + +![](https://static-docs.nocobase.com/ac3c3ab42df28cb7c6dc70b24e99e7f7.png) + +Если регистрация запрещена, ссылка «Создать аккаунт» на странице входа отображаться не будет. + +![](https://static-docs.nocobase.com/8d5e3b6df9991bfc1c2e095a93745121.png) + +Если регистрация запрещена, доступ к странице регистрации невозможен. + +![](https://static-docs.nocobase.com/09325c4b07e09f88f80a14dff8430556.png) + +### Настройка формы регистрации v1.4.0-beta.7+ + +Можно настроить, какие поля из коллекции пользователей должны отображаться в форме регистрации, а также указать, являются ли они обязательными. Хотя бы одно из полей — «username» или «email» — должно быть отображено и указано как обязательное. + +![](https://static-docs.nocobase.com/202411262133669.png) + +Страница регистрации: + +![](https://static-docs.nocobase.com/202411262135801.png) + +### Восстановление пароля v1.7.0+ + +Функция восстановления пароля позволяет пользователям сбросить пароль с помощью проверки по электронной почте, если они его забыли. + +#### Настройка администратором + +1. **Включить функцию восстановления пароля** + + Перейдите в «Настройки» → «Аутентификация» → вкладка «Восстановление пароля» и установите флажок «Включить функцию восстановления пароля». + + ![20250423071957_rec_](https://static-docs.nocobase.com/20250423071957_rec_.gif) + +2. **Настроить канал уведомлений** + + Выберите канал уведомлений по электронной почте (на данный момент поддерживается только email). Если канал отсутствует, сначала необходимо добавить его. + + ![20250423072225_rec_](https://static-docs.nocobase.com/20250423072225_rec_.gif) + +3. **Настроить письмо для сброса пароля** + + Настройте тему и содержание письма. Поддерживаются форматы HTML и обычный текст. Доступны следующие переменные: + - Текущий пользователь + - Настройки системы + - Ссылка для сброса пароля + - Время жизни ссылки (в минутах) + + ![20250427170047](https://static-docs.nocobase.com/20250427170047.png) + +4. **Установить срок действия ссылки для сброса** + + Укажите срок действия ссылки (в минутах). По умолчанию — 120 минут. + + ![20250423073557](https://static-docs.nocobase.com/20250423073557.png) + +#### Процесс для пользователя + +1. **Запрос на сброс пароля** + + Нажмите ссылку «Забыли пароль?» на странице входа (предварительно администратор должен включить эту функцию), чтобы перейти на страницу восстановления. + + ![20250421103458_rec_](https://static-docs.nocobase.com/20250421103458_rec_.gif) + + Введите зарегистрированный адрес электронной почты и нажмите «Отправить письмо для сброса». + + ![20250421113442_rec_](https://static-docs.nocobase.com/20250421113442_rec_.gif) + +2. **Сброс пароля** + + Пользователь получит письмо со ссылкой для сброса. После перехода по ссылке откроется страница, где можно установить новый пароль. + + ![20250421113748](https://static-docs.nocobase.com/20250421113748.png) + + После установки нового пароля пользователь сможет войти в систему. + +#### Примечания + +- Ссылка для сброса имеет ограниченный срок действия — по умолчанию 120 минут (настраивается администратором). +- Ссылка может быть использована только один раз и становится недействительной сразу после использования. +- Если пользователь не получил письмо, проверьте правильность адреса электронной почты и папку «Спам». +- Администратор должен убедиться, что настройки почтового сервера корректны, чтобы письмо для сброса могло быть отправлено успешно. diff --git a/docs/ru-RU/handbook/auth/user/static/EvrrbNVmUoJVczxJvkzclPKqn7e.png b/docs/ru-RU/handbook/auth/user/static/EvrrbNVmUoJVczxJvkzclPKqn7e.png new file mode 100644 index 0000000000..4bbbf33a59 Binary files /dev/null and b/docs/ru-RU/handbook/auth/user/static/EvrrbNVmUoJVczxJvkzclPKqn7e.png differ diff --git a/docs/ru-RU/handbook/auth/user/static/GOJ0bwOYVoNkBKxkpmGcEqyqnI2.png b/docs/ru-RU/handbook/auth/user/static/GOJ0bwOYVoNkBKxkpmGcEqyqnI2.png new file mode 100644 index 0000000000..17b7ca2a2a Binary files /dev/null and b/docs/ru-RU/handbook/auth/user/static/GOJ0bwOYVoNkBKxkpmGcEqyqnI2.png differ diff --git a/docs/ru-RU/handbook/auth/user/static/HYNZb9vvXo0GXuxpLCvcDTC5nfh.png b/docs/ru-RU/handbook/auth/user/static/HYNZb9vvXo0GXuxpLCvcDTC5nfh.png new file mode 100644 index 0000000000..ae8df4ac9d Binary files /dev/null and b/docs/ru-RU/handbook/auth/user/static/HYNZb9vvXo0GXuxpLCvcDTC5nfh.png differ diff --git a/docs/ru-RU/handbook/auth/user/static/Kc72bM430oWacrxbxvScS3S3nGc.png b/docs/ru-RU/handbook/auth/user/static/Kc72bM430oWacrxbxvScS3S3nGc.png new file mode 100644 index 0000000000..2f64684c09 Binary files /dev/null and b/docs/ru-RU/handbook/auth/user/static/Kc72bM430oWacrxbxvScS3S3nGc.png differ diff --git a/docs/ru-RU/handbook/auth/user/static/NsBebeTkAoDSnExFStmc84iondd.png b/docs/ru-RU/handbook/auth/user/static/NsBebeTkAoDSnExFStmc84iondd.png new file mode 100644 index 0000000000..d7b11e602f Binary files /dev/null and b/docs/ru-RU/handbook/auth/user/static/NsBebeTkAoDSnExFStmc84iondd.png differ diff --git a/docs/ru-RU/handbook/auth/user/static/OyOHbaKJyogTBXxhW5wcO3QEn0e.png b/docs/ru-RU/handbook/auth/user/static/OyOHbaKJyogTBXxhW5wcO3QEn0e.png new file mode 100644 index 0000000000..a33d56094c Binary files /dev/null and b/docs/ru-RU/handbook/auth/user/static/OyOHbaKJyogTBXxhW5wcO3QEn0e.png differ diff --git a/docs/ru-RU/handbook/auth/user/static/Rs2obD3ZRohmtjxlQxPcT123n7e.png b/docs/ru-RU/handbook/auth/user/static/Rs2obD3ZRohmtjxlQxPcT123n7e.png new file mode 100644 index 0000000000..ac96e10d42 Binary files /dev/null and b/docs/ru-RU/handbook/auth/user/static/Rs2obD3ZRohmtjxlQxPcT123n7e.png differ diff --git a/docs/ru-RU/handbook/auth/user/static/Ut6KbpRe0oI1NoxHkbZcXftkndc.png b/docs/ru-RU/handbook/auth/user/static/Ut6KbpRe0oI1NoxHkbZcXftkndc.png new file mode 100644 index 0000000000..04bc724eda Binary files /dev/null and b/docs/ru-RU/handbook/auth/user/static/Ut6KbpRe0oI1NoxHkbZcXftkndc.png differ diff --git a/docs/ru-RU/handbook/auth/user/static/UulRbfMpWogGHnxpk1Yc0asenFe.png b/docs/ru-RU/handbook/auth/user/static/UulRbfMpWogGHnxpk1Yc0asenFe.png new file mode 100644 index 0000000000..9738d3045b Binary files /dev/null and b/docs/ru-RU/handbook/auth/user/static/UulRbfMpWogGHnxpk1Yc0asenFe.png differ diff --git a/docs/ru-RU/handbook/backup-restore/image-1.png b/docs/ru-RU/handbook/backup-restore/image-1.png new file mode 100644 index 0000000000..942dc9a062 Binary files /dev/null and b/docs/ru-RU/handbook/backup-restore/image-1.png differ diff --git a/docs/ru-RU/handbook/backup-restore/image-2.png b/docs/ru-RU/handbook/backup-restore/image-2.png new file mode 100644 index 0000000000..bc809d2df7 Binary files /dev/null and b/docs/ru-RU/handbook/backup-restore/image-2.png differ diff --git a/docs/ru-RU/handbook/backup-restore/image-3.png b/docs/ru-RU/handbook/backup-restore/image-3.png new file mode 100644 index 0000000000..9494982c99 Binary files /dev/null and b/docs/ru-RU/handbook/backup-restore/image-3.png differ diff --git a/docs/ru-RU/handbook/backup-restore/image-4.png b/docs/ru-RU/handbook/backup-restore/image-4.png new file mode 100644 index 0000000000..1c1c14047e Binary files /dev/null and b/docs/ru-RU/handbook/backup-restore/image-4.png differ diff --git a/docs/ru-RU/handbook/backup-restore/image-5.png b/docs/ru-RU/handbook/backup-restore/image-5.png new file mode 100644 index 0000000000..ca9d37c3e3 Binary files /dev/null and b/docs/ru-RU/handbook/backup-restore/image-5.png differ diff --git a/docs/ru-RU/handbook/backup-restore/image-6.png b/docs/ru-RU/handbook/backup-restore/image-6.png new file mode 100644 index 0000000000..ecec16573f Binary files /dev/null and b/docs/ru-RU/handbook/backup-restore/image-6.png differ diff --git a/docs/ru-RU/handbook/backup-restore/image.png b/docs/ru-RU/handbook/backup-restore/image.png new file mode 100644 index 0000000000..e000b30278 Binary files /dev/null and b/docs/ru-RU/handbook/backup-restore/image.png differ diff --git a/docs/ru-RU/handbook/backup-restore/index.md b/docs/ru-RU/handbook/backup-restore/index.md new file mode 100644 index 0000000000..2aab5f1515 --- /dev/null +++ b/docs/ru-RU/handbook/backup-restore/index.md @@ -0,0 +1,51 @@ +# Резервное копирование и восстановление + + + +## Введение + +Плагин резервного копирования и восстановления можно использовать для таких сценариев, как репликация приложений, миграция и обновление. + +## Установка + +Этот плагин встроен и не требует ручной установки или активации. + +## Инструкции для пользователя + +![Страница списка резервного копирования и восстановления](https://static-docs.nocobase.com/071b969c4db9bdc6d2c359e1b6bef5da.png) + +### Создание резервной копии + +![Создание резервной копии](https://static-docs.nocobase.com/0e3d9410e6b1cfbda38044033f0b4053.png) + +### Восстановление резервной копии + +Вы можете загрузить резервную копию с локального устройства или нажать на файл резервной копии для восстановления. + +![Восстановить резервную копию](https://static-docs.nocobase.com/e4b95a4376260fd516de7828fd9f1056.png) + +Выберите данные, которые необходимо восстановить, выбранные данные полностью перезапишут соответствующую таблицу данных целевого приложения. + +![Восстановить резервную копию](https://static-docs.nocobase.com/9c7cb78b51c8f949e417b5a1e0180ae2.png) + +### Инструкции по резервному копированию + +Нажмите «Подробнее», чтобы просмотреть инструкции по резервному копированию. + +![Инструкции по резервному копированию и восстановлению](https://static-docs.nocobase.com/4f54eba0fde2d6481274665cb184a79e.png) + +Инструкции по резервному копированию + +![Инструкции по резервному копированию и восстановлению](https://static-docs.nocobase.com/bd5c68cf7e35d04e525f9b13e48e32d9.png) + +Группы резервного копирования + +- Требуемые данные: Важные данные для работы системы. +- Пропущенные данные: Данные, пропущенные и не резервные копии. +- Данные пользователя: Данные, связанные с пользователями. +- Данные журнала: Данные, используемые для записи журнала некоторых действий. +- Информация о сторонних службах: Общая информация о различных поставщиках услуг, таких как службы хранения файлов, картографические службы, информация о конфигурации поставщика услуг SMS и т. д. +- Данные пользовательских коллекций: Данные коллекций, добавленных через менеджер коллекций. +- Неизвестные данные: данные без настроенных правил резервного копирования. + +Примечание: вы можете выбрать данные, которые хотите создать резервную копию или восстановить по группе. Выбранные данные будут полностью перезаписаны при восстановлении. diff --git a/docs/ru-RU/handbook/backups/index.md b/docs/ru-RU/handbook/backups/index.md new file mode 100644 index 0000000000..6a7ea336d8 --- /dev/null +++ b/docs/ru-RU/handbook/backups/index.md @@ -0,0 +1,82 @@ +# Менеджер резервного копирования + + + +## Введение + +Плагин менеджера резервного копирования NocoBase предоставляет функции для полного резервного копирования базы данных NocoBase и загруженных пользователем файлов, включая планирование резервного копирования, загрузку, удаление и восстановление. + +:::warning +Плагин менеджера резервного копирования включен в редакции Professional и Enterprise. Для пользователей редакций Community и Standard вы можете напрямую создавать резервную копию базы данных; см. подробности на странице: [`Как сделать резервную копию и восстановить NocoBase`](https://www.nocobase.com/en/blog/nocobase-backup-restore) +::: + +## Установка + + + +## Инструкции по использованию + +![Главный интерфейс](./static/main-screen.png) + +### Создать новую резервную копию + +Нажмите кнопку «Новая резервная копия», чтобы создать новую резервную копию на основе конфигурации резервной копии и отобразить статус резервной копии в списке резервных копий. +![Создать новую резервную копию](./static/new-backup.png) + +### Восстановить резервную копию + +Поддерживает восстановление резервных копий из списка резервных копий или загрузку локальных файлов резервных копий для восстановления резервных копий. +Операции восстановления не допускаются в следующих сценариях: + +- Когда текущая версия NocoBase ниже версии NocoBase в файле резервной копии. +- Когда текущая база данных NocoBase не соответствует следующим конфигурациям в файле резервной копии: +- диалект +- подчеркивание +- префикс таблицы +- схема +- Когда «Толерантный режим» не включен, а версия базы данных при создании резервной копии выше текущей версии базы данных приложения. + +> **Восстановление — это полная операция базы данных. Рекомендуется создать резервную копию текущей базы данных перед восстановлением резервной копии.** + +#### Восстановление из списка резервных копий + +Нажмите кнопку «Восстановить» элемента резервной копии в списке резервных копий, введите пароль шифрования файла резервной копии во всплывающем окне и нажмите «Подтвердить», чтобы восстановить резервную копию. + +> Оставьте пароль пустым для незашифрованной резервной копии. + +> Если вам нужно восстановить резервную копию до более низкой версии базы данных, вам необходимо включить толерантный режим. + +![Восстановить резервную копию](./static/restore-backup.png) + +#### Восстановить из локального файла резервной копии + +Нажмите кнопку «Восстановить из локальной резервной копии», выберите локальный файл резервной копии во всплывающем окне, введите пароль шифрования файла резервной копии и нажмите «Подтвердить», чтобы восстановить резервную копию. + +> Оставьте пароль пустым для незашифрованной резервной копии. + +> Если вам нужно восстановить резервную копию до более низкой версии базы данных, вам нужно включить толерантный режим. + +![Восстановить из локальной резервной копии](./static/restore-from-local.png) + +#### Загрузить файл резервной копии + +Нажмите кнопку «Загрузить» элемента резервной копии в списке резервных копий, чтобы загрузить файл резервной копии. + +#### Удалить резервную копию + +Нажмите кнопку «Удалить» элемента резервной копии в списке резервных копий, чтобы удалить файл резервной копии. + +## Настройки резервного копирования + +Перейдите на вкладку «Настройки», измените настройки резервного копирования и нажмите «Сохранить», чтобы изменения вступили в силу. +![Настройки резервного копирования](./static/backup-settings.png) + +### Описание настроек резервного копирования + +- `Автоматическое резервное копирование`: если включен параметр `Запускать автоматическое резервное копирование по расписанию cron`, можно настроить автоматическое резервное копирование в указанное время. +- `Максимальное количество резервных копий`: установите максимальное количество локально сохраненных файлов резервных копий. После превышения этого количества самые ранние файлы резервных копий будут автоматически удалены. +- `Синхронизация резервного копирования с облачным хранилищем`: установите место хранения в облаке, куда автоматически загружаются файлы резервных копий после успешного резервного копирования, поддерживается только облачное хранилище. +- `Резервное копирование файлов локального хранилища`: следует ли включать в резервную копию файлы, загруженные пользователями в локальное хранилище сервера (хранение/загрузки). +- `Восстановление пароля`: если установлен пароль восстановления, его необходимо ввести при восстановлении резервной копии. + +> **Пожалуйста, сохраните пароль восстановления в надежном месте. Если вы забудете пароль, восстановление файла резервной копии станет невозможным.** diff --git a/docs/ru-RU/handbook/backups/install.md b/docs/ru-RU/handbook/backups/install.md new file mode 100644 index 0000000000..e0ba172496 --- /dev/null +++ b/docs/ru-RU/handbook/backups/install.md @@ -0,0 +1,102 @@ +### Установка клиента базы данных + +Посетите официальный сайт, чтобы загрузить клиент, соответствующий версии используемой вами базы данных: + +- MySQL: https://dev.mysql.com/downloads/ +- PostgreSQL: https://www.postgresql.org/download/ + +Для версий Docker вы можете напрямую добавить скрипт в каталог `./storage/scripts` + +```bash +mkdir ./storage/scripts +cd ./storage/scripts +vim install-database-client.sh +``` + +Содержимое `install-database-client.sh` выглядит следующим образом: + + + +
    + +```bash +#!/bin/bash + +# Check if pg_dump is installed +if [ ! -f /usr/bin/pg_dump ]; then + echo "pg_dump is not installed, starting PostgreSQL client installation..." + + # Install necessary tools and clean cache + apt-get update && apt-get install -y --no-install-recommends wget gnupg \ + && rm -rf /var/lib/apt/lists/* + + # Configure PostgreSQL source + echo "deb [signed-by=/usr/share/keyrings/pgdg.asc] https://apt.postgresql.org/pub/repos/apt bookworm-pgdg main" > /etc/apt/sources.list.d/pgdg.list + wget --quiet -O /usr/share/keyrings/pgdg.asc https://apt.postgresql.org/pub/repos/apt/ACCC4CF8.asc + + # Install PostgreSQL client + apt-get update && apt-get install -y --no-install-recommends postgresql-client-16 \ + && rm -rf /var/lib/apt/lists/* + + echo "PostgreSQL client installation completed." +else + echo "pg_dump is already installed, skipping PostgreSQL client installation." +fi +``` + +
    +
    + +```bash +#!/bin/bash + +if [ ! -f /usr/bin/mysql ]; then + echo "MySQL client is not installed, starting MySQL client installation..." + echo "Updating package list and installing necessary tools..." + apt-get update && apt-get install -y --no-install-recommends wget gnupg \ + && rm -rf /var/lib/apt/lists/* + + wget --no-check-certificate https://downloads.mysql.com/archives/get/p/23/file/mysql-community-client-core_8.0.39-1debian12_amd64.deb && \ + dpkg -x mysql-community-client-core_8.0.39-1debian12_amd64.deb /tmp/mysql-client && \ + cp /tmp/mysql-client/usr/bin/mysqldump /usr/bin/ && \ + cp /tmp/mysql-client/usr/bin/mysql /usr/bin/ + + echo "MySQL client installation completed." +else + echo "MySQL client is already installed, skipping installation." +fi +``` + +
    + +
    + +Затем перезапустите контейнер приложения. + +```bash +docker compose restart app +# View logs +docker compose logs app +``` + +Проверьте номер версии клиента базы данных, который должен совпадать с номером версии сервера базы данных. + + +
    + +```bash +docker compose exec app bash -c "pg_dump -V" +``` + +
    +
    + +```bash +docker compose exec app bash -c "mysql -V" +``` +
    +
    + +### Установка плагинов + +См. [Установка и обновление коммерческих плагинов](/welcome/getting-started/plugin) diff --git a/docs/ru-RU/handbook/backups/installation/mariadb.md b/docs/ru-RU/handbook/backups/installation/mariadb.md new file mode 100644 index 0000000000..63bda29811 --- /dev/null +++ b/docs/ru-RU/handbook/backups/installation/mariadb.md @@ -0,0 +1,109 @@ +# Установка клиента базы данных MariaDB + +## Установка Docker + +### Создайте Dockerfile в каталоге, содержащем NocoBase Dockerfile + +```Dockerfile +# Based on the "next" version +FROM nocobase/nocobase:latest + +# Update sources.list with the official Debian repositories +RUN tee /etc/apt/sources.list > /dev/null < /dev/null < /dev/null < + + + +### Сканирование QR-кода + + + +### Всплывающие окна + +Согласованы с настроенными блоками на странице + + + +### Пользовательские запросы + + diff --git a/docs/ru-RU/handbook/block-gantt/index.md b/docs/ru-RU/handbook/block-gantt/index.md new file mode 100644 index 0000000000..f57153077c --- /dev/null +++ b/docs/ru-RU/handbook/block-gantt/index.md @@ -0,0 +1,73 @@ +# Блок «Диаграмма Ганта» + + + +## Введение + +Блок диаграммы Ганта отображает данные в виде временной шкалы и идеально подходит для управления проектами, планирования событий, составления графиков инженерных работ и расписаний задач. + +## Установка + +Встроенный плагин — отдельная установка не требуется. + +## Добавление блока + +![](https://static-docs.nocobase.com/f064f8fadf52947c990f5dad97736f98.png) + +![](https://static-docs.nocobase.com/858112f44bc543973b6e5b03856a6360.png) + +- **Поле заголовка**: отображает информацию непосредственно на полосах диаграммы Ганта. +- **Масштаб времени**: устанавливает масштаб времени, по умолчанию — дни. +- **Поле даты начала**: определяет дату начала каждой задачи (обязательное поле). +- **Поле даты окончания**: определяет дату завершения каждой задачи (обязательное поле). +- **Поле прогресса**: отображает степень выполнения задачи (необязательное, процентное поле). + +## Инструкция по использованию + +![](https://static-docs.nocobase.com/fff6fe1e1fe0a88d20f80b3bb7233608.gif) + +- Наведите курсор на задачу, чтобы увидеть всплывающую карточку с информацией о продолжительности и прогрессе. +- Перетаскивайте задачу, чтобы изменить даты начала и окончания. +- Перетаскивайте полосу прогресса, чтобы изменить степень выполнения задачи. + +## Настройки блока + +![20240419211301](https://static-docs.nocobase.com/20240419211301.png) + +### Установка диапазона данных + +![20240419211033](https://static-docs.nocobase.com/20240419211033.png) + +Дополнительную информацию см. в разделе [Установка диапазона данных](/handbook/ui/blocks/block-settings/data-scope). + +- [Сохранить как шаблон блока](/handbook/block-template) +- [Настроить режим загрузки данных](/handbook/ui/blocks/block-settings/loading-mode) + +## Настройка действий + +### Глобальные действия + +![20240419213653](https://static-docs.nocobase.com/20240419213653.png) + +- [Фильтр](/handbook/ui/actions/types/filter) +- [Добавить новое](/handbook/ui/actions/types/add-new) +- [Удалить](/handbook/ui/actions/types/delete) +- [Обновить](/handbook/ui/actions/types/refresh) +- [Импорт](/handbook/action-import) +- [Экспорт](/handbook/action-export) +- [Добавить запись](/handbook/action-add-record) +- [Массовое обновление](/handbook/action-bulk-update) +- [Массовое редактирование](/handbook/action-bulk-edit) + +### Действия для строки + +![20240419213823](https://static-docs.nocobase.com/20240419213823.png) + +- [Просмотр](/handbook/ui/actions/types/view) +- [Редактирование](/handbook/ui/actions/types/edit) +- [Дублировать](/handbook/action-duplicate) +- [Удалить](/handbook/ui/actions/types/delete) +- [Всплывающее окно](/handbook/ui/actions/types/pop-up) +- [Обновить запись](/handbook/ui/actions/types/update-record) +- [Произвольный запрос](/handbook/action-custom-request) +- [Запустить рабочий процесс](/handbook/workflow/manual/triggers/custom-action) diff --git a/docs/ru-RU/handbook/block-gantt/static/BRIcbgJ8Do7SQ5xHshUcHVjdnMc.gif b/docs/ru-RU/handbook/block-gantt/static/BRIcbgJ8Do7SQ5xHshUcHVjdnMc.gif new file mode 100644 index 0000000000..6a089df1ce Binary files /dev/null and b/docs/ru-RU/handbook/block-gantt/static/BRIcbgJ8Do7SQ5xHshUcHVjdnMc.gif differ diff --git a/docs/ru-RU/handbook/block-gantt/static/LcyebGwVVoEBdvx4ZDicXOj1n8f.png b/docs/ru-RU/handbook/block-gantt/static/LcyebGwVVoEBdvx4ZDicXOj1n8f.png new file mode 100644 index 0000000000..68c6937ec2 Binary files /dev/null and b/docs/ru-RU/handbook/block-gantt/static/LcyebGwVVoEBdvx4ZDicXOj1n8f.png differ diff --git a/docs/ru-RU/handbook/block-gantt/static/MDvAbz30ooHoiQxkqRYcDGG1npb.gif b/docs/ru-RU/handbook/block-gantt/static/MDvAbz30ooHoiQxkqRYcDGG1npb.gif new file mode 100644 index 0000000000..fdb878a918 Binary files /dev/null and b/docs/ru-RU/handbook/block-gantt/static/MDvAbz30ooHoiQxkqRYcDGG1npb.gif differ diff --git a/docs/ru-RU/handbook/block-gantt/static/P3klb1WIOoL4msxQWiycleCgnPb.png b/docs/ru-RU/handbook/block-gantt/static/P3klb1WIOoL4msxQWiycleCgnPb.png new file mode 100644 index 0000000000..e16701f843 Binary files /dev/null and b/docs/ru-RU/handbook/block-gantt/static/P3klb1WIOoL4msxQWiycleCgnPb.png differ diff --git a/docs/ru-RU/handbook/block-gantt/static/PK01bb2aOo97nIxBzwgcCoXlnjb.png b/docs/ru-RU/handbook/block-gantt/static/PK01bb2aOo97nIxBzwgcCoXlnjb.png new file mode 100644 index 0000000000..3a3431307a Binary files /dev/null and b/docs/ru-RU/handbook/block-gantt/static/PK01bb2aOo97nIxBzwgcCoXlnjb.png differ diff --git a/docs/ru-RU/handbook/block-iframe/index.md b/docs/ru-RU/handbook/block-iframe/index.md new file mode 100644 index 0000000000..ec0b6727d1 --- /dev/null +++ b/docs/ru-RU/handbook/block-iframe/index.md @@ -0,0 +1,200 @@ +# Блок Iframe + + + +## Введение + +Блок IFrame позволяет встраивать внешние веб-страницы или контент в текущую страницу. Пользователи могут интегрировать внешние приложения, настраивая URL или напрямую вставляя HTML-код. С помощью HTML пользователи могут гибко настраивать контент для удовлетворения конкретных потребностей отображения, что делает этот блок идеальным для пользовательских сценариев. Такой подход позволяет загружать внешние ресурсы без перенаправления, улучшая пользовательский опыт и интерактивность страницы. + +## Установка + +Это встроенный плагин, установка не требуется. + +## Добавление блоков + +![20240408220259](https://static-docs.nocobase.com/20240408220259.png) + +Настройте URL или HTML для встраивания внешнего приложения. + +![20240408220322](https://static-docs.nocobase.com/20240408220322.png) + +## Шаблонизатор + +### Строковый шаблон + +Стандартный движок рендеринга поддерживает переменные. + +### Handlebars + +![20240811205239](https://static-docs.nocobase.com/20240811205239.png) + +Подробнее см. [Шаблоны Handlebars](/handbook/template-handlebars). + +## Передача переменных + +### Поддержка HTML для разбора переменных + +#### Поддержка выбора переменных из селектора переменных в текущем контексте блока + +![20240603120321](https://static-docs.nocobase.com/20240603120321.png) + +![20240603120629](https://static-docs.nocobase.com/20240603120629.gif) + +#### Поддержка внедрения переменных в приложение и их использование через код + +Вы также можете внедрять пользовательские переменные в приложение через код и использовать их в HTML. Например, создание динамического календаря с использованием Vue 3 и Element Plus: + +```html + + + + + + Пример Vue3 с CDN + + + + + + +
    + + + +
    +
    + {{ month }} + + Предыдущий месяц + Следующий месяц + +
    +
    +
    +
    +
    +
    + + + +``` + +![20250320163250](https://static-docs.nocobase.com/20250320163250.png) + +Пример: простой календарный компонент, созданный с использованием React и Ant Design (antd), с обработкой дат через dayjs: + +```html + + + + + + Пример React с CDN + + + + + + +
    + + + + +``` + +![20250320164537](https://static-docs.nocobase.com/20250320164537.png) + +### URL поддерживает переменные + +![20240603142219](https://static-docs.nocobase.com/20240603142219.png) + +Подробнее о переменных см. [Переменные](/handbook/ui/variables). diff --git a/docs/ru-RU/handbook/block-kanban/index.md b/docs/ru-RU/handbook/block-kanban/index.md new file mode 100644 index 0000000000..de51ef3c50 --- /dev/null +++ b/docs/ru-RU/handbook/block-kanban/index.md @@ -0,0 +1,78 @@ +# Блок «Канбан» + + + +## Введение + +Блок «Канбан» отображает данные в виде доски Канбан и поддерживает функцию перетаскивания элементов, позволяя обновлять статус записей с помощью drag-and-drop. + +## Установка + +Это встроенный плагин — отдельная установка не требуется. + +## Добавление блока + + + +![20240419214751](https://static-docs.nocobase.com/20240419214751.png) + +### Поле группировки + +Используется для разделения данных на отдельные группы. При создании или настройке блока Канбан необходимо выбрать поле с одиночным выбором (single-choice) в качестве поля группировки. + +### Поле сортировки + +Используется для упорядочивания данных внутри каждой группы. В качестве поля сортировки можно выбрать только те поля, которые связаны с полем группировки. Вы также можете быстро создать поле сортировки непосредственно при настройке блока Канбан. + +![20240426170628](https://static-docs.nocobase.com/20240426170628.png) + +## Управление данными Канбан + +### Нажатие на карточку + +Нажатие на карточку открывает всплывающее окно, в котором можно настроить блоки данных по необходимости, например, добавить форму редактирования для изменения записи текущей карточки. + +![20240419220115](https://static-docs.nocobase.com/20240419220115.png) + +Также можно настроить способ открытия всплывающего окна и его размер. + +![20240419220159](https://static-docs.nocobase.com/20240419220159.png) + +### Перетаскивание карточки + +Пример: изменение статуса товара путём перетаскивания карточки. После завершения перетаскивания данные сохраняются автоматически. + + + +## Настройки блока + +### Установка диапазона данных + +Пример: фильтрация по умолчанию для рекламных товаров. + +![20240422095659](https://static-docs.nocobase.com/20240422095659.png) + +Более подробную информацию см. в разделе [Установка диапазона данных](/handbook/ui/blocks/block-settings/data-scope). + +### Установка высоты блока + +Пример: изменение высоты блока Канбан для заказов, при этом полоса прокрутки отображается внутри колонок. + +![20240605220635](https://static-docs.nocobase.com/20240605220635.gif) + +Более подробную информацию см. в разделе [Высота блока](/handbook/ui/blocks/block-settings/block-height). + +## Настройка полей + +![20240419215909](https://static-docs.nocobase.com/20240419215909.png) + +## Настройка действий + +![20240419220903](https://static-docs.nocobase.com/20240419220903.png) + +- [Фильтр](/handbook/ui/actions/types/filter) +- [Добавить новое](/handbook/ui/actions/types/add-new) diff --git a/docs/ru-RU/handbook/block-kanban/static/ER09beUFAoC59JxXPprctLmbnwE.gif b/docs/ru-RU/handbook/block-kanban/static/ER09beUFAoC59JxXPprctLmbnwE.gif new file mode 100644 index 0000000000..fcb2e5f86f Binary files /dev/null and b/docs/ru-RU/handbook/block-kanban/static/ER09beUFAoC59JxXPprctLmbnwE.gif differ diff --git a/docs/ru-RU/handbook/block-kanban/static/GrhobxsDJoB72Bx0kCAcXPp8nwe.png b/docs/ru-RU/handbook/block-kanban/static/GrhobxsDJoB72Bx0kCAcXPp8nwe.png new file mode 100644 index 0000000000..ac0a03fde1 Binary files /dev/null and b/docs/ru-RU/handbook/block-kanban/static/GrhobxsDJoB72Bx0kCAcXPp8nwe.png differ diff --git a/docs/ru-RU/handbook/block-kanban/static/JupDbsBBSowHoqx5fIhcWVn5nTg.png b/docs/ru-RU/handbook/block-kanban/static/JupDbsBBSowHoqx5fIhcWVn5nTg.png new file mode 100644 index 0000000000..1b83edaa9e Binary files /dev/null and b/docs/ru-RU/handbook/block-kanban/static/JupDbsBBSowHoqx5fIhcWVn5nTg.png differ diff --git a/docs/ru-RU/handbook/block-map/index.md b/docs/ru-RU/handbook/block-map/index.md new file mode 100644 index 0000000000..b14f3501bf --- /dev/null +++ b/docs/ru-RU/handbook/block-map/index.md @@ -0,0 +1,108 @@ +# Блок Карта + + + +## Обзор + +Блок Карта — это важный инструмент для отображения и управления данными, связанными с картами. Он поддерживает четыре типа полей: точки, линии, окружности и полигоны. + +## Установка + +Этот плагин предустановлен, но перед использованием его необходимо активировать. + +![20240421120958](https://static-docs.nocobase.com/20240421120958.png) + +После активации необходимо настроить данные для аутентификации карт. + +![20240421121032](https://static-docs.nocobase.com/20240421121032.png) + +После настройки поля карты можно интегрировать в таблицы данных. + +![20240426171356](https://static-docs.nocobase.com/20240426171356.png) + +## Добавление блоков карты + +Блоки карты можно добавлять только в том случае, если связанная таблица данных содержит поля карты. + +![20240408194209](https://static-docs.nocobase.com/20240408194209.png) + +![20240408194420](https://static-docs.nocobase.com/20240408194420.png) + +1. **Поле карты:** Определяет тип элемента карты (точка, линия, полигон). +2. **Поле маркера:** Указывает маркеры карты (применяется только для типа "точка"). + +## Точки + +**Пример использования:** Идеально подходит для визуализации расположения розничных магазинов. + +![20240408195630](https://static-docs.nocobase.com/20240408195630.png) + +## Линии + +Линии строятся из последовательности точек на карте и часто используются для отображения маршрутов, например, путей доставки. + +![20240408201608](https://static-docs.nocobase.com/20240408201608.png) + +## Окружности + +![20240408201939](https://static-docs.nocobase.com/20240408201939.png) + +## Полигоны + +**Пример использования:** Отлично подходит для планирования территорий и зонирования. + +![Полигон](https://static-docs.nocobase.com/20240408200546.png) + +## Настройки блока + +![20240421121949](https://static-docs.nocobase.com/20240421121949.png) + +## Соединение полей по порядку + +Соединяет точки в соответствии с порядком, определённым последовательными полями. + +![20240408202645](https://static-docs.nocobase.com/20240408202645.png) + +![20240421121917](https://static-docs.nocobase.com/20240421121917.png) + +![20240422101027](https://static-docs.nocobase.com/20240422101027.png) + +## Уровень масштабирования карты по умолчанию + +Уровень масштабирования по умолчанию — 13, но его можно изменить при необходимости. + +![20240408202854](https://static-docs.nocobase.com/20240408202854.png) + +## Определение области данных + +**Пример:** Фильтрация накладных со статусом "отправлено" (с использованием реляционных полей). Будут отображены только накладные, попадающие в указанную область данных. + +![20240422101250](https://static-docs.nocobase.com/20240422101250.png) + +Подробнее см. [Настройка области данных](/handbook/ui/blocks/block-settings/data-scope). + +## Настройка высоты блока + +**Пример:** Изменение высоты блока карты для удобного размещения в макете. + +![20240605221111](https://static-docs.nocobase.com/20240605221111.gif) + +Подробнее см. [Высота блока](/handbook/ui/blocks/block-settings/block-height). + +- [Редактирование заголовка блока](/handbook/ui/blocks/block-settings/block-title) +- [Подключение блока данных](/handbook/ui/blocks/block-settings/connect-block) +- [Сохранение как шаблон блока](/handbook/block-template) + +## Операции конфигурации + +![20240421122020](https://static-docs.nocobase.com/20240421122020.png) + +## Массовый выбор точек + +![20240422102334](https://static-docs.nocobase.com/20240422102334.gif) + +- [Фильтр](/handbook/ui/actions/types/filter) +- [Добавить](/handbook/ui/actions/types/add-new) +- [Обновить](/handbook/ui/actions/types/refresh) +- [Массовое обновление](/handbook/action-bulk-update) +- [Массовое редактирование](/handbook/action-bulk-edit) diff --git a/docs/ru-RU/handbook/block-multi-step-from/index.md b/docs/ru-RU/handbook/block-multi-step-from/index.md new file mode 100644 index 0000000000..ea0eb446a4 --- /dev/null +++ b/docs/ru-RU/handbook/block-multi-step-from/index.md @@ -0,0 +1,66 @@ +# Многошаговая форма + + + +## Введение + +Многошаговая форма — это блок, предназначенный для создания интерфейса ввода и редактирования данных с поддержкой пошаговой настройки, расширяющий функциональность стандартного блока формы. + +## Добавление блоков + + + +## Настройки блока + +![](https://static-docs.nocobase.com/202410101717319.png) + +### Правила связывания + +Управляйте поведением полей формы с помощью правил связывания. + +![](https://static-docs.nocobase.com/202410101717884.png) + +Дополнительная информация — см. [Правила связывания](/handbook/ui/blocks/block-settings/field-linkage-rule) + +### Настройка высоты блока + +Пример: установка высоты блока в режим «Указать высоту». + + + +Подробнее см. в разделе [Высота блока](/handbook/ui/blocks/block-settings/block-height) + +## Настройка шагов + +### Добавление нового шага + +![](https://static-docs.nocobase.com/202410101718482.png) + +### Изменение заголовка шага + +![](https://static-docs.nocobase.com/202410101718755.png) + +![](https://static-docs.nocobase.com/202410101718413.png) + +### Изменение порядка шагов + + + +## Настройка полей + +См. разделы конфигурации полей: [Настройка полей формы](/handbook/ui/blocks/data-blocks/form#configure-fields) + +## Настройка действий + +![](https://static-docs.nocobase.com/202410101719893.png) + +- **Назад** — возврат к предыдущему шагу. +- **Далее** — переход к следующему шагу. +- [Отправить](/handbook/ui/actions/types/submit) +- [Произвольный запрос](/handbook/action-custom-request) diff --git a/docs/ru-RU/handbook/block-template/index.md b/docs/ru-RU/handbook/block-template/index.md new file mode 100644 index 0000000000..2e7eb68fb3 --- /dev/null +++ b/docs/ru-RU/handbook/block-template/index.md @@ -0,0 +1,165 @@ +# Шаблоны блоков + + + + +## Введение + +Шаблоны блоков предоставляют возможности для создания шаблонов блоков, позволяя централизованно управлять шаблонами и создавать блоки на их основе. + +## Установка + +Встроенный плагин, не требует установки. + +## Инструкция по использованию + +![Главный интерфейс](https://static-docs.nocobase.com/main-screen-block-templates.png) + +### Выбор типа шаблона + +NocoBase предлагает два типа шаблонов: Наследуемые шаблоны и Референсные шаблоны. Их различия и сценарии применения: + +- **Референсный шаблон**: Аналогичен фрагменту UI Schema. При использовании можно выбрать метод "Ссылка" или "Копирование". + - **Ссылка**: Блок полностью соответствует шаблону. Изменения в блоке синхронизируются с оригинальным шаблоном. Подходит для сценариев, требующих строгой согласованности содержимого/структуры в нескольких местах. + - **Копирование**: Полностью копирует текущую конфигурацию шаблона. После копирования связь с шаблоном теряется, обновления не синхронизируются. Подходит для быстрого создания блоков или начала работы с шаблонной основы для полностью независимых изменений. +- **Наследуемый шаблон**: Созданные блоки сохраняют отношение наследования с шаблоном. Блоки можно настраивать индивидуально на основе шаблона, при этом неизмененные части продолжают синхронизироваться с обновлениями шаблона. Подходит для сценариев, требующих единой базовой конфигурации, но допускающих локальные различия. + +### Референсный шаблон + +Референсный шаблон — это универсальный шаблон, аналогичный фрагменту UI Schema. Он позволяет сохранять блоки данных (включая блоки на страницах, в модальных окнах и совместимые сторонние блоки) как Референсные шаблоны, которые затем можно использовать в других местах через методы "Ссылка" или "Копирование". + +Существует два типа референсных шаблонов: +- Референсный шаблон: Сохраняет полную конфигурацию блока, включая поля и действия. Большинство блоков сохраняются как этот тип. +- Референсный шаблон (только поля): Сохраняет только конфигурацию полей блока, действия не сохраняются. При преобразовании формы или блока деталей одной записи в референсный шаблон он сохраняется как этот тип. + +#### Создание референсного шаблона + +Выберите блок данных, который хотите сохранить как Референсный шаблон, нажмите кнопку "Сохранить как референсный шаблон". + +![Сохранить как референсный шаблон](https://static-docs.nocobase.com/save-as-reference-block-template.png) + +#### Использование референсного шаблона + +Референсные шаблоны предлагают два способа использования: + +1. **Ссылка** + +При создании блока на странице выберите соответствующий референсный шаблон для создания блока с использованием ссылки на шаблон. + +![Создать блок](https://static-docs.nocobase.com/create-block-from-reference-template.png) + +2. **Копирование** + +При создании блока на странице выберите соответствующую опцию копирования шаблона. + +![Создать блок](https://static-docs.nocobase.com/create-block-from-copy-template.png) + +### Наследуемый шаблон + +Наследуемые шаблоны подходят для сценариев, когда требуется, чтобы блоки следовали базовым обновлениям шаблона, но также допускали некоторые специфические изменения. Блоки, созданные из Наследуемого шаблона, наследуют конфигурацию шаблона и позволяют расширять или переопределять её. Конфигурации, не переопределенные блоком, синхронизируются с обновлениями шаблона. + +#### Создание наследуемого шаблона + +Наследуемые шаблоны можно создать двумя способами: + +1. **Создание в интерфейсе управления шаблонами блоков** + +**Шаги:** +1. Перейдите в интерфейс управления шаблонами блоков +2. Нажмите кнопку "Добавить новый" +3. Введите основную информацию для наследуемого шаблона +4. Нажмите "Отправить" для завершения создания +5. Настройте содержимое наследуемого шаблона + +![Создать наследуемый шаблон](https://static-docs.nocobase.com/create-inherited-template.png) + +2. **Создание из существующего блока** + +**Шаги:** +1. Найдите блок данных на странице, который хотите сохранить как шаблон +2. Выберите опцию "Сохранить как наследуемый шаблон" +3. Введите имя шаблона и сохраните + +![Сохранить как наследуемый шаблон](https://static-docs.nocobase.com/save-as-inherited-template.png) + +:::info{title=Примечание} +- Только блоки данных на страницах можно сохранять как наследуемые шаблоны +- Блоки во всплывающих окнах нельзя сохранять как наследуемые шаблоны +- Блоки диаграмм пока не поддерживаются для наследуемых шаблонов +::: + +#### Настройка наследуемого шаблона + +Выберите наследуемый шаблон, нажмите кнопку "Настроить" для входа в интерфейс конфигурации. + +![Настроить шаблон](https://static-docs.nocobase.com/configure-template.png) + +:::info{title=Примечание} +- Наследуемый шаблон поддерживает только один блок данных +- Блоки диаграмм пока не поддерживаются +::: + +#### Редактирование наследуемого шаблона + +Выберите наследуемый шаблон и нажмите "Редактировать" для изменения заголовка и описания. + +![Редактировать наследуемый шаблон](https://static-docs.nocobase.com/edit-inherited-template.png) + +#### Копирование наследуемого шаблона + +Выберите шаблон, нажмите "Копировать", введите новое имя и подтвердите. + +![Копировать наследуемый шаблон](https://static-docs.nocobase.com/copy-inherited-template.png) + +#### Удаление наследуемого шаблона + +Выберите шаблон, нажмите "Удалить" и подтвердите. Можно выбрать сохранение созданных блоков. + +![Удалить наследуемый шаблон](https://static-docs.nocobase.com/delete-inherited-template.png) + +### Использование шаблонов + +#### Создание блока из наследуемого шаблона + +При создании блока выберите соответствующий наследуемый шаблон. + +![Создать блок](https://static-docs.nocobase.com/create-block-from-inherited-template.png) + +Особенности блоков из наследуемых шаблонов: +1. Наследование конфигурации с возможностью добавления своих настроек +2. Нельзя удалить унаследованные компоненты +![Нельзя удалить](https://static-docs.nocobase.com/disable-delete.png) +3. Дополнительные поля выделяются цветом +![Стиль блока](https://static-docs.nocobase.com/template-bg.png) +4. Есть функция "Вернуть к шаблону" +![Вернуть к шаблону](https://static-docs.nocobase.com/revert-to-template.gif) + +:::info{title=Примечание} +Позиционирование компонентов определяется макетом страницы и не синхронизируется автоматически с шаблоном. Для синхронизации используйте "Вернуть к шаблону". +::: + +## FAQ + +**В: Как создать шаблон формы редактирования?** + +О: Конфигурация аналогична форме добавления. Шаблон автоматически появится в опциях наследуемых шаблонов формы редактирования. + +**В: Почему позиции полей не синхронизируются?** + +О: Позиции определяются макетом страницы. Для синхронизации используйте "Вернуть к шаблону" (это удалит пользовательские настройки). + +**В: Как обрабатывать неиспользуемые шаблоны?** + +О: Рекомендуется удалять. При удалении можно сохранить созданные блоки как обычные. + +**В: Почему нет поддержки диаграмм?** + +О: Будет добавлено в будущих версиях. + +**В: Почему нельзя сохранить блок из всплывающего окна?** + +О: Шаблоны работают только с блоками на страницах, а не во всплывающих окнах. diff --git a/docs/ru-RU/handbook/block-tree/index.md b/docs/ru-RU/handbook/block-tree/index.md new file mode 100644 index 0000000000..44499cacf9 --- /dev/null +++ b/docs/ru-RU/handbook/block-tree/index.md @@ -0,0 +1,34 @@ +# Блок «Древовидный фильтр» + + + +## Введение + +Блок древовидного фильтра должен быть подключён к блоку данных для использования и предоставляет функции фильтрации для этого блока данных. + +## Добавление блока + + + +## Настройки блока + +![20240607144440](https://static-docs.nocobase.com/20240607144440.png) + +### Подключение к блоку данных + +Пример: блок фильтра формы подключается к блоку детализированных данных для обеспечения взаимосвязи. + + + +Дополнительную информацию см. в разделе [Подключение к блоку данных](/handbook/ui/blocks/block-settings/connect-block) + +- [Редактирование заголовка блока](/handbook/ui/blocks/block-settings/block-title) +- [Сохранить как шаблон блока](/handbook/block-template) + +## Настройка полей + +![20240607145820](https://static-docs.nocobase.com/20240607145820.png) diff --git a/docs/ru-RU/handbook/calculation-engines/formula/index.md b/docs/ru-RU/handbook/calculation-engines/formula/index.md new file mode 100644 index 0000000000..01615d889f --- /dev/null +++ b/docs/ru-RU/handbook/calculation-engines/formula/index.md @@ -0,0 +1,8 @@ +# Formula.js Функции + + + diff --git a/docs/ru-RU/handbook/calculation-engines/index.md b/docs/ru-RU/handbook/calculation-engines/index.md new file mode 100644 index 0000000000..6c21e8c86f --- /dev/null +++ b/docs/ru-RU/handbook/calculation-engines/index.md @@ -0,0 +1,30 @@ +# Обзор вычислительных движков + +В NocoBase вычислительные движки играют ключевую роль в полях формул, правилах связывания и рабочих процессах, предоставляя пользователям универсальные инструменты для вычислений. + +## Formula.js + +**Formula.js** — это лёгкая JavaScript-библиотека, воспроизводящая множество функций формул Microsoft Excel. Она позволяет пользователям легко выполнять сложные вычисления. Основные особенности: + +- **Обширная библиотека функций**: предоставляет широкий набор функций для различных математических операций, включая статистические и финансовые расчёты. +- **Удобный API**: разработан для простоты использования, что позволяет как разработчикам, так и обычным пользователям создавать формулы без глубоких знаний программирования. +- **Вычисления в реальном времени**: оптимизирован для обработки данных в режиме реального времени, что делает его подходящим для приложений, требующих немедленной реакции вычислений. + +## Math.js + +**Math.js** — это полнофункциональная математическая библиотека для JavaScript и Node.js. Она поддерживает широкий спектр математических операций — от базовой арифметики до продвинутой алгебры, статистики и линейной алгебры. Ключевые особенности: + +- **Комплексный функционал**: предоставляет большое количество функций для всех видов математических операций. +- **Гибкий парсинг выражений**: способна разбирать и вычислять математические выражения, заданные в виде строк. +- **Сложные вычисления**: поддерживает операции с матрицами, символьные вычисления, статистический анализ и другие продвинутые математические функции. +- **Расширяемость**: может быть дополнена пользовательскими функциями и константами для удовлетворения специфических потребностей. + +## Применение в NocoBase + +Интеграция Formula.js и Math.js позволяет пользователям NocoBase: + +- **Выполнять разнообразные вычисления**: от простых арифметических операций до сложных математических расчётов, расширяя вычислительные возможности их приложений. +- **Создавать надёжные и эффективные приложения**: разрабатывать приложения, требующие точных и мощных математических вычислений, обеспечивая высокую производительность и стабильность. +- **Повышать продуктивность**: использовать готовые функции, сокращая необходимость в написании сложного пользовательского кода, что ускоряет процесс разработки. + +Эти библиотеки играют важнейшую роль в платформе NocoBase, позволяя пользователям создавать гибкую и настраиваемую логику вычислений без необходимости писать сложный код. Такой подход упрощает разработку и одновременно расширяет функциональность и адаптивность приложений. diff --git a/docs/ru-RU/handbook/calculation-engines/mathjs/index.md b/docs/ru-RU/handbook/calculation-engines/mathjs/index.md new file mode 100644 index 0000000000..43c91b60e4 --- /dev/null +++ b/docs/ru-RU/handbook/calculation-engines/mathjs/index.md @@ -0,0 +1,8 @@ +# Математические функции + + + diff --git a/docs/ru-RU/handbook/calendar/calendar-collection.md b/docs/ru-RU/handbook/calendar/calendar-collection.md new file mode 100644 index 0000000000..9d610f5403 --- /dev/null +++ b/docs/ru-RU/handbook/calendar/calendar-collection.md @@ -0,0 +1,12 @@ +# Коллекция "Календарь" + + + +## Введение + +Коллекция "Календарь" — это специализированная таблица данных, предназначенная для хранения дат и связанной с ними информации. Она обычно используется для управления и отслеживания времени в приложениях или системах. Основная цель календарной таблицы — предоставить гибкий и эффективный доступ к информации о датах, позволяя быстро извлекать соответствующие данные по мере необходимости. + +## Руководство пользователя + +![20240512182454](https://static-docs.nocobase.com/20240512182454.png) + diff --git a/docs/ru-RU/handbook/calendar/index.md b/docs/ru-RU/handbook/calendar/index.md new file mode 100644 index 0000000000..520d59750a --- /dev/null +++ b/docs/ru-RU/handbook/calendar/index.md @@ -0,0 +1,80 @@ +# Блок «Календарь» + + + +## Введение + +Блок «Календарь» предоставляет удобный способ просмотра и управления событиями и данными, связанными с датами, в формате календаря. Он идеально подходит для планирования встреч, организации мероприятий и эффективного управления временем. + +## Установка + +Плагин встроен в систему — дополнительная установка не требуется. + +## Добавление блоков + + + +1. **Поле заголовка**: отображает ключевую информацию непосредственно на полосах календаря. +2. **Время начала**: указывает, когда начинается задача. +3. **Время окончания**: обозначает момент завершения задачи. + +Щелчок по полосе задачи выделяет её и открывает всплывающее окно с подробной информацией. + +![20240408171928](https://static-docs.nocobase.com/20240408171928.png) + +## Настройка полей + +![20240419203321](https://static-docs.nocobase.com/20240419203321.png) + +### Отображение лунного календаря + +![20240419203603](https://static-docs.nocobase.com/20240419203603.png) + +- [Редактирование заголовка блока](/handbook/ui/blocks/block-settings/block-title) +- [Сохранить как шаблон блока](/handbook/block-template) + +### Установка диапазона данных + +![20240419203751](https://static-docs.nocobase.com/20240419203751.png) + +Дополнительную информацию см. в разделе [Установка диапазона данных](/handbook/ui/blocks/block-settings/data-scope). + +### Установка высоты блока + +Пример: изменение высоты блока календаря заказов. Внутри блока календаря полоса прокрутки отсутствует. + +![20240605215742](https://static-docs.nocobase.com/20240605215742.gif) + +Более подробно см. в разделе [Высота блока](/handbook/ui/blocks/block-settings/block-height) + +### Поле цвета фона + +:::info{title=Подсказка} +Требуется версия NocoBase v1.4.0-beta или выше. +::: + +Эта опция позволяет настроить цвет фона событий в календаре. Инструкция по использованию: + +1. В таблице данных календаря должно быть поле типа **Одиночный выбор** или **Группа переключателей**, и для этого поля должны быть настроены цвета. +2. Вернитесь в интерфейс настройки блока календаря и выберите это поле в разделе **Поле цвета фона**. +3. Теперь вы можете попробовать выбрать цвет для события в календаре и нажать «Отправить». Вы увидите, что выбранный цвет отображается. + +![20240914192017_rec_](https://static-docs.nocobase.com/20240914192017_rec_.gif) + +## Настройка действий + +![20240419203424](https://static-docs.nocobase.com/20240419203424.png) + +### Сегодня + +Кнопка «Сегодня» в блоке календаря позволяет быстро перейти к текущей дате после просмотра других дат. + +![20240419203514](https://static-docs.nocobase.com/20240419203514.png) + +### Смена вида + +По умолчанию установлен вид «Месяц». + +![20240419203349](https://static-docs.nocobase.com/20240419203349.png) diff --git a/docs/ru-RU/handbook/client/index.md b/docs/ru-RU/handbook/client/index.md new file mode 100644 index 0000000000..e69b74e4bc --- /dev/null +++ b/docs/ru-RU/handbook/client/index.md @@ -0,0 +1,9 @@ +# WEB-клиент + +## Введение + +Предоставляет удобный пользовательский интерфейс для взаимодействия с сервером NocoBase. + +## Установка + +Является встроенным плагином, дополнительная установка не требуется. diff --git a/docs/ru-RU/handbook/client/user/index.md b/docs/ru-RU/handbook/client/user/index.md new file mode 100755 index 0000000000..26cc30bf4c --- /dev/null +++ b/docs/ru-RU/handbook/client/user/index.md @@ -0,0 +1,23 @@ +# Руководство пользователя + +Этот плагин является одним из основных встроенных компонентов NocoBase и предоставляет клиентский интерфейс. Интерфейс выполнен по принципу AdminLayout и включает следующие ключевые элементы: + +## Менеджер плагинов + +Управление плагинами: вы можете добавлять, активировать, отключать или удалять плагины. + +![](https://static-docs.nocobase.com/23ee6d074e2829617c4b766282c16627.png) + +## Центр управления плагинами + +Доступ к страницам настройки каждого плагина. + +![](https://static-docs.nocobase.com/f0236b3cf5b65c39fa723c66a182d214.png) + +## Центр управления профилем пользователя + +![](https://static-docs.nocobase.com/58ff74ebe37542180e7fd2629f940a79.png) + +## Редактор интерфейса (UI Editor) + +![](https://static-docs.nocobase.com/8dc5d2b1e4487622e40e8a6510e3e492.png) diff --git a/docs/ru-RU/handbook/client/user/plugin-manager/index.md b/docs/ru-RU/handbook/client/user/plugin-manager/index.md new file mode 100644 index 0000000000..598e714a29 --- /dev/null +++ b/docs/ru-RU/handbook/client/user/plugin-manager/index.md @@ -0,0 +1,48 @@ +# Менеджер плагинов + +Менеджер плагинов предоставляет простой и интуитивно понятный интерфейс для добавления плагинов, расширяя функциональность NocoBase с лёгким и удобным пользовательским опытом. Он позволяет бесшовно расширять и настраивать возможности приложения, включая установку, обновление и удаление плагинов. + +**Ключевые компоненты Менеджера плагинов:** + +1. **Локальные плагины/Маркетплейс плагинов**: Доступ к плагинам и управление ими (локальными или из маркетплейса) +2. **Классификация плагинов**: Организация плагинов по категориям: Встроенные, Включённые, Отключённые и Проблемные. Система поддерживает нечёткий поиск по названию плагина. +3. **Добавление нового плагина**: Простое расширение функциональности за счёт новых плагинов. +4. **Основная область конфигурации плагинов**: Централизованное управление настройками плагинов. + +![Интерфейс Менеджера плагинов](https://static-docs.nocobase.com/86fb70757a77ab3654f97faffc2dce78.png) + +## Просмотр документации плагина + +Один клик по любому плагину позволяет быстро просмотреть его документацию, включая инструкции по использованию, проверку совместимости зависимостей и журнал обновлений. + +![Просмотр документации плагина](https://static-docs.nocobase.com/a4015bea903d3c6874ca94e6c1085278.png) + +## Добавление плагина + +С удобством plug-and-play вы можете легко добавлять новые плагины через интерфейс. Система поддерживает: +- Загрузку из npm-репозитория (поддерживаются приватные репозитории) +- Локальную загрузку +- Загрузку по URL + +![Добавление плагина](https://static-docs.nocobase.com/103baa0ba0dd88e7481c0636147c7a7c.png) + +## Активация плагина + +![Активация плагина](https://static-docs.nocobase.com/c76b7228678c358ba6f8f68ef05d3cd5.gif) + +## Отключение плагина + +![Отключение плагина](https://static-docs.nocobase.com/86f526669dba0d4f3245d24d9e9d35a9.gif) + +## Удаление плагина + +![Удаление плагина](https://static-docs.nocobase.com/b32d6507aaee2b708290311cf1e7ebca.gif) + +## Обновление плагина + +В настоящее время обновление плагинов доступно только для тех, что расположены в storage/plugins, как показано ниже: + +![Обновление плагина](https://static-docs.nocobase.com/7bfaec2785dc6a2e864fee2337fc57ef.png) + +**Примечание:** +Все операции выполняются через интуитивный интерфейс без необходимости технических знаний. Менеджер плагинов значительно упрощает процесс расширения функциональности вашего приложения NocoBase. diff --git a/docs/ru-RU/handbook/client/user/plugin-manager/static/DtkpbfloNog6gtxM6RWcqDYwnph.png b/docs/ru-RU/handbook/client/user/plugin-manager/static/DtkpbfloNog6gtxM6RWcqDYwnph.png new file mode 100644 index 0000000000..cc02c0f8bb Binary files /dev/null and b/docs/ru-RU/handbook/client/user/plugin-manager/static/DtkpbfloNog6gtxM6RWcqDYwnph.png differ diff --git a/docs/ru-RU/handbook/client/user/plugin-manager/static/Ehu2boQ2xowSrnxpMS1ctIprnMd.png b/docs/ru-RU/handbook/client/user/plugin-manager/static/Ehu2boQ2xowSrnxpMS1ctIprnMd.png new file mode 100644 index 0000000000..ce13dfa7c0 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/plugin-manager/static/Ehu2boQ2xowSrnxpMS1ctIprnMd.png differ diff --git a/docs/ru-RU/handbook/client/user/plugin-manager/static/K8JDbo9JCo9iCExVEw4cKHfOnPg.png b/docs/ru-RU/handbook/client/user/plugin-manager/static/K8JDbo9JCo9iCExVEw4cKHfOnPg.png new file mode 100644 index 0000000000..43c3fe3595 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/plugin-manager/static/K8JDbo9JCo9iCExVEw4cKHfOnPg.png differ diff --git a/docs/ru-RU/handbook/client/user/plugin-manager/static/LcP9b9oVwoN5ZQx2CZScJ7TAn9c.gif b/docs/ru-RU/handbook/client/user/plugin-manager/static/LcP9b9oVwoN5ZQx2CZScJ7TAn9c.gif new file mode 100644 index 0000000000..5bafff0964 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/plugin-manager/static/LcP9b9oVwoN5ZQx2CZScJ7TAn9c.gif differ diff --git a/docs/ru-RU/handbook/client/user/plugin-manager/static/Mgo0bjYccoNjmNxNT8rcfF0tndd.png b/docs/ru-RU/handbook/client/user/plugin-manager/static/Mgo0bjYccoNjmNxNT8rcfF0tndd.png new file mode 100644 index 0000000000..c5c349d81e Binary files /dev/null and b/docs/ru-RU/handbook/client/user/plugin-manager/static/Mgo0bjYccoNjmNxNT8rcfF0tndd.png differ diff --git a/docs/ru-RU/handbook/client/user/plugin-manager/static/NOz2b4To1o1fMbxqnb8cfqacnfT.gif b/docs/ru-RU/handbook/client/user/plugin-manager/static/NOz2b4To1o1fMbxqnb8cfqacnfT.gif new file mode 100644 index 0000000000..71f3c87a5b Binary files /dev/null and b/docs/ru-RU/handbook/client/user/plugin-manager/static/NOz2b4To1o1fMbxqnb8cfqacnfT.gif differ diff --git a/docs/ru-RU/handbook/client/user/plugin-manager/static/VehkbE6RqogLlcxoRrVcEvpJn0e.gif b/docs/ru-RU/handbook/client/user/plugin-manager/static/VehkbE6RqogLlcxoRrVcEvpJn0e.gif new file mode 100644 index 0000000000..68ddab50c0 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/plugin-manager/static/VehkbE6RqogLlcxoRrVcEvpJn0e.gif differ diff --git a/docs/ru-RU/handbook/client/user/plugin-settings/index.md b/docs/ru-RU/handbook/client/user/plugin-settings/index.md new file mode 100644 index 0000000000..afe79fd0cd --- /dev/null +++ b/docs/ru-RU/handbook/client/user/plugin-settings/index.md @@ -0,0 +1,10 @@ +# Управление плагинами + +Центр управления предоставляет пользователям единую платформу для настройки и управления системной информацией и параметрами рабочих процессов. Он позволяет пользователям адаптировать систему, моделирование таблиц данных, настройку рабочих процессов и параметры плагинов в соответствии с их конкретными бизнес-задачами и личными предпочтениями. + +## Обзор Центра управления плагинами + +1. Быстрые настройки в верхней части +2. Список конфигураций всех активированных плагинов +3. Вкладки плагинов +4. Основная область содержимого diff --git a/docs/ru-RU/handbook/client/user/plugin-settings/static/N50VbOPHpoKvYVxacuUc1i6Cnrd.jpeg b/docs/ru-RU/handbook/client/user/plugin-settings/static/N50VbOPHpoKvYVxacuUc1i6Cnrd.jpeg new file mode 100644 index 0000000000..0285ff522e Binary files /dev/null and b/docs/ru-RU/handbook/client/user/plugin-settings/static/N50VbOPHpoKvYVxacuUc1i6Cnrd.jpeg differ diff --git a/docs/ru-RU/handbook/client/user/static/CbzRbkcI2onjbkxFOVccwafpnrh.png b/docs/ru-RU/handbook/client/user/static/CbzRbkcI2onjbkxFOVccwafpnrh.png new file mode 100755 index 0000000000..2bcb662762 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/static/CbzRbkcI2onjbkxFOVccwafpnrh.png differ diff --git a/docs/ru-RU/handbook/client/user/static/M6U6b8YAgovpFIxTzaccmcp5nme.png b/docs/ru-RU/handbook/client/user/static/M6U6b8YAgovpFIxTzaccmcp5nme.png new file mode 100755 index 0000000000..6d99e19ffc Binary files /dev/null and b/docs/ru-RU/handbook/client/user/static/M6U6b8YAgovpFIxTzaccmcp5nme.png differ diff --git a/docs/ru-RU/handbook/client/user/static/PqPnbVWuYo9GYgxCrxfcTK8rnof.png b/docs/ru-RU/handbook/client/user/static/PqPnbVWuYo9GYgxCrxfcTK8rnof.png new file mode 100755 index 0000000000..00b1be8fe2 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/static/PqPnbVWuYo9GYgxCrxfcTK8rnof.png differ diff --git a/docs/ru-RU/handbook/client/user/static/T3J0b4zZ2o8ZiUxBG7lcgNYIn2g.png b/docs/ru-RU/handbook/client/user/static/T3J0b4zZ2o8ZiUxBG7lcgNYIn2g.png new file mode 100755 index 0000000000..b1c4fb135a Binary files /dev/null and b/docs/ru-RU/handbook/client/user/static/T3J0b4zZ2o8ZiUxBG7lcgNYIn2g.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/add-new.md b/docs/ru-RU/handbook/client/user/ui-designer/actions/add-new.md new file mode 100644 index 0000000000..fc9cce8ac9 --- /dev/null +++ b/docs/ru-RU/handbook/client/user/ui-designer/actions/add-new.md @@ -0,0 +1 @@ +# Добавить новый diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/add-record.md b/docs/ru-RU/handbook/client/user/ui-designer/actions/add-record.md new file mode 100644 index 0000000000..816ceb8280 --- /dev/null +++ b/docs/ru-RU/handbook/client/user/ui-designer/actions/add-record.md @@ -0,0 +1,5 @@ +# **Добавить запись** + +Пользовательская операция добавления данных позволяет пользователям вставлять данные в любую таблицу в системе. + +![](https://static-docs.nocobase.com/70c3982c59d6c7b7f36e225f4c208d2f.png) diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/custom-request.md b/docs/ru-RU/handbook/client/user/ui-designer/actions/custom-request.md new file mode 100644 index 0000000000..380ba49bfc --- /dev/null +++ b/docs/ru-RU/handbook/client/user/ui-designer/actions/custom-request.md @@ -0,0 +1,5 @@ +# **Пользовательский запрос** + +Настройте URL-адрес для операций с пользовательскими запросами в соответствии с конкретными потребностями бизнеса. Для получения дополнительной информации обратитесь к документации плагина пользовательских запросов. + +![](https://static-docs.nocobase.com/69d610904dbec87ef719e5345915f5a2.png) diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/delete.md b/docs/ru-RU/handbook/client/user/ui-designer/actions/delete.md new file mode 100644 index 0000000000..59be0f8d6a --- /dev/null +++ b/docs/ru-RU/handbook/client/user/ui-designer/actions/delete.md @@ -0,0 +1,5 @@ +# **Удалить** + +Операция удаления позволяет удалять записи данных, будь то с помощью кнопок строк или кнопок пакетной обработки, и включает диалоговое окно подтверждения для подтверждения намерений. + +![](https://static-docs.nocobase.com/96272ba867a128004738fce9f5d6d63f.png) diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/duplicate.md b/docs/ru-RU/handbook/client/user/ui-designer/actions/duplicate.md new file mode 100644 index 0000000000..0c62e02de2 --- /dev/null +++ b/docs/ru-RU/handbook/client/user/ui-designer/actions/duplicate.md @@ -0,0 +1,65 @@ +# Операция "Дублирование" + +Операция "Дублирование" позволяет пользователям копировать строку данных для создания новых записей, предлагая два метода: **прямое дублирование** и **копирование в форму с последующим заполнением**. + +## Прямое дублирование + +![Прямое дублирование](https://static-docs.nocobase.com/2c0ac5d1a539de4b72b49b7d966d8c09.png) + +- По умолчанию данные копируются напрямую. +- Целевая таблица: Таблица, в которую будут добавлены скопированные данные. В случаях с наследованием можно копировать в дочернюю таблицу, но прямое дублирование добавляет данные только в текущую таблицу. +- Шаблонные поля: Определяют, какие поля будут скопированы (можно выбрать все). Эта настройка обязательна. + +После завершения конфигурации достаточно нажать кнопку для дублирования данных. + +## Копирование в форму с заполнением + +Настроенные шаблонные поля заполнят форму значениями по умолчанию, которые можно изменить перед отправкой. + +Можно выбрать либо текущую таблицу, либо дочернюю таблицу в качестве цели для добавления скопированных данных. + +![Копирование в форму](https://static-docs.nocobase.com/a072aa572fd0a0fe643eadf95471da2a.png) + +**Настройка шаблонных полей:** Значения выбранных полей будут использованы как значения по умолчанию в форме. + +![Настройка шаблонных полей](https://static-docs.nocobase.com/8032fa2025180ade275da55b97774b4d.png) + +**Пример:** Отношение "Накладная" (o2m) дублируется. Его полевой компонент можно изменить на подформу, где можно настроить поля подформы. + +![Отношение накладной](https://static-docs.nocobase.com/b13c9287bae8601646727a2e78b81be7.png) + +**Синхронизация полей формы:** После настройки формы нажмите кнопку синхронизации - это автоматически выберет все настроенные поля (примечание: после каждого изменения конфигурации полей синхронизацию нужно выполнять вручную). После синхронизации можно дополнительно настроить шаблонные поля. + +![Синхронизация полей формы](https://static-docs.nocobase.com/156b6d8d741521e63d12e49092414d58.png) + +При нажатии кнопки "Дублировать" откроется всплывающее окно с формой, заполненной значениями по умолчанию. Данные можно изменить перед отправкой для завершения копирования. + +![Пример операции дублирования](https://static-docs.nocobase.com/1c0a0ae0c59971f48b2282a68831d44b.png) + +Полный пример ниже демонстрирует настройку операции дублирования в списке заказов. + +![Пример дублирования списка заказов](https://static-docs.nocobase.com/fa8a89abf0ba136df04b6d0d838eae4e.gif) + +## Логика обработки для разных типов отношений + +Поля с разными типами отношений (копирование, ссылка, предзагрузка) обрабатываются по-разному. Выбор полевых компонентов также влияет на логику обработки. + +- **Копирование**: + - Стандартные поля дублируются + - Отношения hasOne/hasMany только копируются + - Все дочерние поля доступны для выбора + +- **Ссылка**: + - Отношения belongsTo/belongsToMany являются ссылочными + - Можно преобразовать в копирование (например, изменив компонент с select на sub-form) + +- **Предзагрузка**: + - Отношения внутри ссылочных полей + - Могут стать ссылками или копиями после изменения компонентов + +## Особенности + +- При копировании исключаются внешние ключи и первичные ключи скопированных отношений +- При ссылках и предзагрузке первичные ключи сохраняются +- Кнопка синхронизации автоматически анализирует конфигурацию формы и применяет соответствующую логику копирования +- После изменений в форме синхронизацию нужно выполнять вручную diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/edit.md b/docs/ru-RU/handbook/client/user/ui-designer/actions/edit.md new file mode 100644 index 0000000000..ffee9d01c5 --- /dev/null +++ b/docs/ru-RU/handbook/client/user/ui-designer/actions/edit.md @@ -0,0 +1,5 @@ +# **Редактировать** + +Операция редактирования позволяет изменять данные, что обычно достигается путем настройки соответствующего блока формы. + +![](https://static-docs.nocobase.com/9b412840521b7ae6d5c5f0372df2f349.png) diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/export.md b/docs/ru-RU/handbook/client/user/ui-designer/actions/export.md new file mode 100644 index 0000000000..778b087bc6 --- /dev/null +++ b/docs/ru-RU/handbook/client/user/ui-designer/actions/export.md @@ -0,0 +1,9 @@ +# Экспорт + +Операция экспорта упрощается с помощью подключаемых модулей, позволяющих пакетно экспортировать все данные из таблиц, связанных с блоком. Эта функция также поддерживает настройку заголовков экспортируемых полей. + +![Export Configuration](https://static-docs.nocobase.com/c074c4eb9d67a8408d98ff6299715157.png) + +- Настройка экспортируемых полей + +![Export Fields Configuration](https://static-docs.nocobase.com/903b4c12bcd1b8e59e133d2f9822eb56.png) diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/filter.md b/docs/ru-RU/handbook/client/user/ui-designer/actions/filter.md new file mode 100644 index 0000000000..20206afb9a --- /dev/null +++ b/docs/ru-RU/handbook/client/user/ui-designer/actions/filter.md @@ -0,0 +1,13 @@ +# Фильтрация + +Операция фильтрации обычно выполняется внутри блоков данных, позволяя настраивать различные условия для фильтрации данных. Важно отметить, что если для блока уже настроен диапазон данных, операция фильтрации объединяется с условиями диапазона данных для создания окончательных критериев фильтрации. + +![Filtering Operation](https://static-docs.nocobase.com/da548ad1c170bef3d2359ac82764b534.png) + +Поддерживает настройку того, какие поля могут быть отфильтрованы. + +![Filterable Fields Configuration](https://static-docs.nocobase.com/85815dc40157571ba072cc392fbe43d4.png) + +Как показано ниже, для списка накладных настроена операция фильтрации, при которой данные фильтруются путем изменения конфигурации условий. + +![Waybill Filtering](https://static-docs.nocobase.com/02cabf6201fdf4165747c9fcde687a5e.gif) diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/import.md b/docs/ru-RU/handbook/client/user/ui-designer/actions/import.md new file mode 100644 index 0000000000..d8bdee45e5 --- /dev/null +++ b/docs/ru-RU/handbook/client/user/ui-designer/actions/import.md @@ -0,0 +1,17 @@ +# **Импорт** + +Операция импорта упрощается с помощью расширений плагина, которые в настоящее время позволяют импортировать пакетные данные через файлы **.xlsx**. + +1. Настройте поля, доступные для импорта. + +![](https://static-docs.nocobase.com/967a130c06237e0724e5815fc3b16903.png) + +![](https://static-docs.nocobase.com/0046c530677bff984db4d560956da35a.png) + +2. Загрузите шаблон импорта, заполните его данными, а затем приступайте к импорту. + +![](https://static-docs.nocobase.com/1038ab1b1fcdc7ad6e5346cde27eed49.png) + +Для получения более подробной информации обратитесь к документации по импорту. + +[https://github.com/nocobase/nocobase/tree/main/packages/plugins/%40nocobase/plugin-import#%E5%AF%BC%E5%85%A5%E8%AF%B4%E6%98%8E](https://github.com/nocobase/nocobase/tree/main/packages/plugins/%40nocobase/plugin-import#%E5%AF%BC%E5%85%A5%E8%AF%B4%E6%98%8E) diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/index.md b/docs/ru-RU/handbook/client/user/ui-designer/actions/index.md new file mode 100644 index 0000000000..19bae7995f --- /dev/null +++ b/docs/ru-RU/handbook/client/user/ui-designer/actions/index.md @@ -0,0 +1,48 @@ +# Действия (Actions) + +В пользовательском интерфейсе действия представляют собой кнопки, предназначенные для выполнения конкретных команд. Эти кнопки могут размещаться: + +- Непосредственно на странице +- Внутри диалоговых окон или выдвижных панелей +- В комбинации с блоками (в настоящее время динамическая конфигурация действий в основном используется совместно с блоками) + +## Действия в блоках + +![Действия в блоках](https://static-docs.nocobase.com/3e69f1f2991842ecad640705bc9feda4.png) + +## Конструктор действий (Панель инструментов) + +В отличие от блоков и полей, конструктор действий имеет только две иконки: + +1. Перетаскивание +2. Настройка параметров + +![Конструктор действий](https://static-docs.nocobase.com/007422d42678c54f79668dfafe69b60e.png) + +## Сортировка действий перетаскиванием + +Удерживая иконку "Перетащить" в конструкторе кнопок, можно изменить их порядок. + +```bash +Отсутствует GIF-анимация +``` + +## Общая настройка параметров + +- Редактирование кнопки +- Режим открытия: Выдвижная панель, Диалоговое окно +- Размер всплывающего окна: Большой, Средний, Маленький +- Удаление + +![Общая настройка параметров](https://static-docs.nocobase.com/e99916932f6c4d58bcad4d892b5daf15.png) + +## Правила связей действий + +Для действий с контекстными данными можно настроить "Правила связей". + +![Правила связей действий](https://static-docs.nocobase.com/c431434a285278ea00bedf9e4dac4d45.png) + +### Настройка правил связей + +![Настройка правил связей](https://static-docs.nocobase.com/149c049bb0c0ce931c6c0333e12b0610.png) + diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/open-popup.md b/docs/ru-RU/handbook/client/user/ui-designer/actions/open-popup.md new file mode 100644 index 0000000000..09961ca61b --- /dev/null +++ b/docs/ru-RU/handbook/client/user/ui-designer/actions/open-popup.md @@ -0,0 +1,9 @@ +# Открыть всплывающее окно + +Операция "Открыть всплывающее окно" позволяет отображать данные во всплывающем окне, что позволяет настраивать блоки сведений или формы. Эта функция подходит для различных сценариев. Например, если таблица данных содержит много полей, эти поля можно разделить на различные операционные блоки, что позволит вам сосредоточиться на просмотре или изменении определенных полей. Вы можете создать несколько настраиваемых интерфейсов отображения или редактирования данных в зависимости от потребностей бизнеса. + +![Open popup](https://static-docs.nocobase.com/c859041afb43752431e78c6e81c44c43.png) + +Как показано на рисунке, таблица заказов настроена на три операции с открытым всплывающим окном: Просмотр основного заказа (Основная информация о заказе), просмотр продуктов (Информация о продукте, связанная с Заказом) и просмотр клиента (Информация о клиенте, связанная с Заказом). + +![Open popup Operations](https://static-docs.nocobase.com/110e2eed418c755ef40b7259e5816c73.png) diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/print.md b/docs/ru-RU/handbook/client/user/ui-designer/actions/print.md new file mode 100644 index 0000000000..e70de2ff0e --- /dev/null +++ b/docs/ru-RU/handbook/client/user/ui-designer/actions/print.md @@ -0,0 +1,3 @@ +# Печать + +![](https://static-docs.nocobase.com/ce71d14cb7889b1e2291fbdb104b00e5.png) diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/refresh.md b/docs/ru-RU/handbook/client/user/ui-designer/actions/refresh.md new file mode 100644 index 0000000000..e47413052b --- /dev/null +++ b/docs/ru-RU/handbook/client/user/ui-designer/actions/refresh.md @@ -0,0 +1,5 @@ +# **Обновить** + +Операция обновления предназначена для перезагрузки данных в блоке данных, обеспечивая поддержку обновления вручную. + +![](https://static-docs.nocobase.com/3488c8c8296e9048f815d89198a51c5a.png) diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/save-record.md b/docs/ru-RU/handbook/client/user/ui-designer/actions/save-record.md new file mode 100644 index 0000000000..f4612a7b35 --- /dev/null +++ b/docs/ru-RU/handbook/client/user/ui-designer/actions/save-record.md @@ -0,0 +1,14 @@ +# Сохранить запись + +Пользовательские операции сохранения записи уникальны для блоков форм и позволяют настраивать поведение операции: + +- Кнопка редактирования +- Назначение значений полей: При нажатии пользовательской кнопки сохраняются текущие назначения полей данных. +- Пропустить требуемую проверку +- После успешной отправки + +![Save Data Configuration](https://static-docs.nocobase.com/2d35b787114dede3a0f08d7431edb37a.png) + +- Привязать рабочий процесс + +![Bind Workflow](https://static-docs.nocobase.com/6d93cd53d45c8408ed78b0289f0f5dae.png) diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/ApcrbSF87oD3roxGW80cFkAxn2c.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/ApcrbSF87oD3roxGW80cFkAxn2c.png new file mode 100644 index 0000000000..291a8c545d Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/ApcrbSF87oD3roxGW80cFkAxn2c.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/BoEEbVUptoQCXOxvFJTc0p8Vnlb.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/BoEEbVUptoQCXOxvFJTc0p8Vnlb.png new file mode 100644 index 0000000000..dcad0c6206 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/BoEEbVUptoQCXOxvFJTc0p8Vnlb.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/C8RzbI7v5opcUNx7OWzcz1l6nxc.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/C8RzbI7v5opcUNx7OWzcz1l6nxc.png new file mode 100644 index 0000000000..bc2264211a Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/C8RzbI7v5opcUNx7OWzcz1l6nxc.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/CzfCbLjC3oPItSxoeGAcDh0Rnte.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/CzfCbLjC3oPItSxoeGAcDh0Rnte.png new file mode 100644 index 0000000000..b811482e46 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/CzfCbLjC3oPItSxoeGAcDh0Rnte.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/DKwnbW8MfohvHjxplG4cVkcnn8d.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/DKwnbW8MfohvHjxplG4cVkcnn8d.png new file mode 100644 index 0000000000..714ab3654c Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/DKwnbW8MfohvHjxplG4cVkcnn8d.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/DTzUb0LcPoimfBxvHoHcDD5znAf.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/DTzUb0LcPoimfBxvHoHcDD5znAf.png new file mode 100644 index 0000000000..d3520984c2 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/DTzUb0LcPoimfBxvHoHcDD5znAf.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/G1bpbybaVoAWKlx4mCmc6HvQn0b.gif b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/G1bpbybaVoAWKlx4mCmc6HvQn0b.gif new file mode 100644 index 0000000000..a304e56a17 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/G1bpbybaVoAWKlx4mCmc6HvQn0b.gif differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/H1hPbS7CWooWjpxAUfActBgbnsW.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/H1hPbS7CWooWjpxAUfActBgbnsW.png new file mode 100644 index 0000000000..8669eaf5a7 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/H1hPbS7CWooWjpxAUfActBgbnsW.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/J0udbzu0AoU7sVxJ9xtcvQdLnNc.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/J0udbzu0AoU7sVxJ9xtcvQdLnNc.png new file mode 100644 index 0000000000..86939b8ed2 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/J0udbzu0AoU7sVxJ9xtcvQdLnNc.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/JzDSbax1BoXxy2xrD6CcYuEKnRp.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/JzDSbax1BoXxy2xrD6CcYuEKnRp.png new file mode 100644 index 0000000000..d588f826ff Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/JzDSbax1BoXxy2xrD6CcYuEKnRp.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/KR15bOuXoo0u5QxZXmjcNbUJnoe.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/KR15bOuXoo0u5QxZXmjcNbUJnoe.png new file mode 100644 index 0000000000..e8f44ef8a0 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/KR15bOuXoo0u5QxZXmjcNbUJnoe.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/KsK1b5DOwoKI1qx4Qhscahrrneb.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/KsK1b5DOwoKI1qx4Qhscahrrneb.png new file mode 100644 index 0000000000..b7d94bc38a Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/KsK1b5DOwoKI1qx4Qhscahrrneb.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/MDtybwjRsoC8qfxrFAecdJpkngc.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/MDtybwjRsoC8qfxrFAecdJpkngc.png new file mode 100644 index 0000000000..50d884b2c6 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/MDtybwjRsoC8qfxrFAecdJpkngc.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/NRH9bnRw8ogxRkxZ7i3clbW1nRv.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/NRH9bnRw8ogxRkxZ7i3clbW1nRv.png new file mode 100644 index 0000000000..7c39abb132 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/NRH9bnRw8ogxRkxZ7i3clbW1nRv.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/Ox76b54eho4fTUxdk67cjcjenCc.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/Ox76b54eho4fTUxdk67cjcjenCc.png new file mode 100644 index 0000000000..f8b3c89509 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/Ox76b54eho4fTUxdk67cjcjenCc.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/PAgIbrq5xoMKKfxoG8mcOIOynpf.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/PAgIbrq5xoMKKfxoG8mcOIOynpf.png new file mode 100644 index 0000000000..e561088757 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/PAgIbrq5xoMKKfxoG8mcOIOynpf.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/Pkf4bvn30oWEIjxrFmPc3d0lnPd.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/Pkf4bvn30oWEIjxrFmPc3d0lnPd.png new file mode 100644 index 0000000000..c237b712b2 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/Pkf4bvn30oWEIjxrFmPc3d0lnPd.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/QBHTb3fVBot2lqxdGnhcf29tnrb.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/QBHTb3fVBot2lqxdGnhcf29tnrb.png new file mode 100644 index 0000000000..ab9a8a54ec Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/QBHTb3fVBot2lqxdGnhcf29tnrb.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/QPq9bd2xaoB6unxVvEPccbJsnRg.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/QPq9bd2xaoB6unxVvEPccbJsnRg.png new file mode 100644 index 0000000000..d8a0e40cf2 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/QPq9bd2xaoB6unxVvEPccbJsnRg.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/QqICbfLMMozpgBxYBpMcKuOKnmg.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/QqICbfLMMozpgBxYBpMcKuOKnmg.png new file mode 100644 index 0000000000..8038a1a90e Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/QqICbfLMMozpgBxYBpMcKuOKnmg.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/R3f2biRIdoEm7DxUO6Ec1abXnKc.gif b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/R3f2biRIdoEm7DxUO6Ec1abXnKc.gif new file mode 100644 index 0000000000..c31a4b0508 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/R3f2biRIdoEm7DxUO6Ec1abXnKc.gif differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/R5eGbDbcEoLPrexCEzAcgnWfnjT.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/R5eGbDbcEoLPrexCEzAcgnWfnjT.png new file mode 100644 index 0000000000..05ccd6fb29 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/R5eGbDbcEoLPrexCEzAcgnWfnjT.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/RDaibir7Jo6NHzx4IuGcYiKLnGb.gif b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/RDaibir7Jo6NHzx4IuGcYiKLnGb.gif new file mode 100644 index 0000000000..6fe21f650b Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/RDaibir7Jo6NHzx4IuGcYiKLnGb.gif differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/RUsJb4OBFow7zcxSgKocJN6Fnah.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/RUsJb4OBFow7zcxSgKocJN6Fnah.png new file mode 100644 index 0000000000..4dbda73930 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/RUsJb4OBFow7zcxSgKocJN6Fnah.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/RZhIbo49lo2vV5xV5hZc0jkfn1d.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/RZhIbo49lo2vV5xV5hZc0jkfn1d.png new file mode 100644 index 0000000000..aef3d62f68 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/RZhIbo49lo2vV5xV5hZc0jkfn1d.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/SGMubg0mCoVcbSxmOficmvisnHd.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/SGMubg0mCoVcbSxmOficmvisnHd.png new file mode 100644 index 0000000000..7bdf8111c5 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/SGMubg0mCoVcbSxmOficmvisnHd.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/SHP3b6s7YoabQ2xFO5pc8ZwDnNg.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/SHP3b6s7YoabQ2xFO5pc8ZwDnNg.png new file mode 100644 index 0000000000..7256e94fcb Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/SHP3b6s7YoabQ2xFO5pc8ZwDnNg.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/SU3PbOHyDoPT13xt4n2c785Engd.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/SU3PbOHyDoPT13xt4n2c785Engd.png new file mode 100644 index 0000000000..701372956a Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/SU3PbOHyDoPT13xt4n2c785Engd.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/U9AwbR4ehodjDyxFgdFcjZssn1e.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/U9AwbR4ehodjDyxFgdFcjZssn1e.png new file mode 100644 index 0000000000..0c3e802e20 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/U9AwbR4ehodjDyxFgdFcjZssn1e.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/U9VCbG9I6ohTzQxzvPIc6oR3nid.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/U9VCbG9I6ohTzQxzvPIc6oR3nid.png new file mode 100644 index 0000000000..889475c16a Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/U9VCbG9I6ohTzQxzvPIc6oR3nid.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/Vz3kbrsk4oikc0xdbt6czL0Tn4b.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/Vz3kbrsk4oikc0xdbt6czL0Tn4b.png new file mode 100644 index 0000000000..6d31a67d2d Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/Vz3kbrsk4oikc0xdbt6czL0Tn4b.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/W7uJbyoy3oyeM1xQKZrc0GxMnhd.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/W7uJbyoy3oyeM1xQKZrc0GxMnhd.png new file mode 100644 index 0000000000..c7922508b7 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/W7uJbyoy3oyeM1xQKZrc0GxMnhd.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/WQAObL0sUocLRIx1dydcmaOEnQf.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/WQAObL0sUocLRIx1dydcmaOEnQf.png new file mode 100644 index 0000000000..5fb62ae25d Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/WQAObL0sUocLRIx1dydcmaOEnQf.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/WnChbrBPNoBvbFxZcVVccn5wnlg.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/WnChbrBPNoBvbFxZcVVccn5wnlg.png new file mode 100644 index 0000000000..a8e7a0f730 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/WnChbrBPNoBvbFxZcVVccn5wnlg.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/WqjNbus2yozg3LxpRecccPA5nIb.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/WqjNbus2yozg3LxpRecccPA5nIb.png new file mode 100644 index 0000000000..db5b0718ad Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/WqjNbus2yozg3LxpRecccPA5nIb.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/static/XbxybS8u3od6TfxiQDYcTMq4n7g.png b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/XbxybS8u3od6TfxiQDYcTMq4n7g.png new file mode 100644 index 0000000000..a5de56bc5e Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/actions/static/XbxybS8u3od6TfxiQDYcTMq4n7g.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/submit-to-workflow.md b/docs/ru-RU/handbook/client/user/ui-designer/actions/submit-to-workflow.md new file mode 100644 index 0000000000..e52f869d7e --- /dev/null +++ b/docs/ru-RU/handbook/client/user/ui-designer/actions/submit-to-workflow.md @@ -0,0 +1,9 @@ +# Отправить в Workflow + +Операция отправки в Рабочем процессе реализована с помощью расширений плагина. + +1. Формы добавления и обновления поддерживают настройку и запуск отправки в workflow. +2. Одним нажатием кнопки можно запустить несколько рабочих процессов, каждый из которых выбирает свой рабочий процесс и контекст данных (данные не ограничены, и пользователи несут ответственность за обеспечение этого). +3. Триггеры кнопок форм поддерживают только новый тип рабочего процесса "Событие формы". + +Для получения более подробной информации обратитесь к документации по плагину. diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/submit.md b/docs/ru-RU/handbook/client/user/ui-designer/actions/submit.md new file mode 100644 index 0000000000..e7965dc968 --- /dev/null +++ b/docs/ru-RU/handbook/client/user/ui-designer/actions/submit.md @@ -0,0 +1,24 @@ +# Операция "Отправить" + +Операция "Отправить" используется для сохранения данных формы (специфична для блоков формы). + +![Операция Отправить](https://static-docs.nocobase.com/a8dd8cb5a0110c35a1197eb5800a099f.png) + +### Настройка параметров + +- **Метод сохранения**: Поддерживает настройку методов сохранения только для операций **создания** в блоках формы. + +![Настройка метода сохранения](https://static-docs.nocobase.com/25fc9b88760248e7015673b29b9487f4.png) + +- **Привязка workflow**: Позволяет связать с бизнес-процессами, автоматически запуская workflow после отправки. Через определение контекста данных можно реализовать сложные автоматизированные задачи, повышая эффективность обработки данных и контроль бизнес-процессов. + +![Привязка workflow](https://static-docs.nocobase.com/a77bdff33353fb155b0c919db76e0474.png) + +**Примечание:** +Для получения дополнительной информации обратитесь к документации по Workflow. + +**Ключевые особенности:** +1. Работает исключительно с блоками формы +2. Поддерживает различные методы сохранения данных +3. Интеграция с системами workflow для автоматизации процессов +4. Простое управление через интуитивный интерфейс diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/update-record.md b/docs/ru-RU/handbook/client/user/ui-designer/actions/update-record.md new file mode 100644 index 0000000000..e1dcac4ca6 --- /dev/null +++ b/docs/ru-RU/handbook/client/user/ui-designer/actions/update-record.md @@ -0,0 +1,9 @@ +# Обновить запись + +Пользовательские операции с строками обновляют запись, настраивая назначения полей для указания содержимого, которое необходимо изменить. + +![Update Data Operation](https://static-docs.nocobase.com/03af47524a4b41742cdeb298b02500eb.png) + +Как показано на рисунке, в блоке таблица накладных настроена операция обновления данных для подтверждения доставки. + +![Waybill Update Operation](https://static-docs.nocobase.com/3057b0c6cd176342a15a3892488019fa.gif) diff --git a/docs/ru-RU/handbook/client/user/ui-designer/actions/view.md b/docs/ru-RU/handbook/client/user/ui-designer/actions/view.md new file mode 100644 index 0000000000..ca46e0f123 --- /dev/null +++ b/docs/ru-RU/handbook/client/user/ui-designer/actions/view.md @@ -0,0 +1,5 @@ +# Просмотр + +Операции детализации используются для просмотра подробной информации о данных, обычно путем настройки блоков детализации. + +![View Operation](https://static-docs.nocobase.com/7252f4916033d26551d22ab3e6b95112.png) diff --git a/docs/ru-RU/handbook/client/user/ui-designer/blocks/index.md b/docs/ru-RU/handbook/client/user/ui-designer/blocks/index.md new file mode 100644 index 0000000000..b93adf6a08 --- /dev/null +++ b/docs/ru-RU/handbook/client/user/ui-designer/blocks/index.md @@ -0,0 +1,90 @@ +# Блок + +Блок служит контейнером для содержимого и предназначен для размещения на странице, в модальном окне или в боковой панели (drawer). Блоки можно легко переставлять с помощью перетаскивания, что позволяет гибко настраивать макет. + +## Добавление блоков + +Блоки можно интегрировать в страницу, модальное окно или боковую панель в зависимости от требуемого сценария использования. + +### Блоки на страницах + +На страницах доступны различные типы блоков: блоки данных, блоки фильтров и прочие блоки — каждый из которых выполняет определённую функцию. + +![](https://static-docs.nocobase.com/dad0a394d33dd26f31c3202a76bb0153.png) + +### Блоки в модальных окнах (диалогах или боковых панелях) + +Модальные окна, включающие диалоги и боковые панели, также поддерживают добавление блоков. Хотя они похожи на страницы, блоки в модальных окнах обычно используются для операций с одной записью — например, добавления, редактирования или просмотра данных. Доступные типы блоков: блоки текущих данных, блоки связанных данных и прочие блоки. + +#### Боковые панели (Drawers) + +![](https://static-docs.nocobase.com/e18726fb0b52ddab89b9b1a44788f361.png) + +#### Диалоги + +![](https://static-docs.nocobase.com/4763fc5fc008bdf3915f84a7e433c0f8.png) + +## Конструктор блоков + +Каждый блок имеет три иконки в правом верхнем углу, которые предоставляют быстрый доступ к основным инструментам: + +1. Перетаскивание для настройки макета +2. Быстрое добавление блока +3. Настройка параметров блока + +![](https://static-docs.nocobase.com/b488f3013532a246df59b89c0688a58f.png) + +Для простых блоков все параметры настройки сосредоточены в разделе «Настройка параметров блока», как, например, в блоке Markdown. + +![](https://static-docs.nocobase.com/f37e277863068b2661f66d4020af806a.png) + +Более сложные блоки, особенно связанные с данными, предлагают дополнительные встроенные опции, такие как «Настроить поля» и «Настроить действия», что обеспечивает большую гибкость. + +![](https://static-docs.nocobase.com/71b550da637d23145a5f62d48ee8521b.png) + +Кроме того, можно использовать расширенные возможности вложенности, как показано на примере блока диаграммы. + +![](https://static-docs.nocobase.com/07588190b3f41ae3060e71d8b76b4447.png) + +## Макет блоков + +Для настройки макета просто перетаскивайте блоки в нужное положение. + +![](https://static-docs.nocobase.com/f6692295ac0917f3babce9a60ce80879.gif) + +## Шаблоны блоков + +Любой блок с данными можно сохранить как шаблон, что позволяет быстро дублировать его или ссылаться на него в будущих проектах. Например, форму, используемую как для добавления, так и для редактирования данных, можно сохранить как шаблон, упростив тем самым рабочий процесс за счёт повторного использования в разных контекстах. + +### Как добавить и использовать шаблоны + +1. Сохраните блок с данными как шаблон блока (обратите внимание: только блоки с данными поддерживают эту функцию). + +![](https://static-docs.nocobase.com/b7718cea8784587d53524ade3c5b0a82.png) + +2. При добавлении блока выберите опцию «Дублировать» или «Ссылка» для шаблона. + +![](https://static-docs.nocobase.com/135df7344e0f3080199e4bb1071c2fa6.png) + +### Разница между дублированием и ссылкой + +**Дублирование** создаёт новый блок на основе шаблона, но не связывает его с оригиналом — любые изменения в новом блоке не повлияют на шаблон. **Ссылка** же напрямую связывает блок с шаблоном: любые изменения в блоке изменят сам шаблон, и все экземпляры, где используется эта ссылка, будут автоматически обновлены. + +## Типы блоков + +NocoBase разделяет блоки на четыре основные категории: + +- **Блоки данных**: используются для отображения данных из коллекции внутри блока. +- **Блоки фильтров**: добавляются на страницы и предназначены для фильтрации данных в блоках данных. +- **Блоки связей**: добавляются в модальные окна и используются для операций CRUD (создание, чтение, обновление, удаление) над данными, связанными с текущей записью. +- **Прочие блоки**: включают автономные блоки, такие как Markdown, блок журнала аудита, блок задач рабочего процесса и другие. + +### Блоки данных + +### Блоки фильтров + +### Блоки связей + +### Прочие блоки + +## Взаимодействие фильтров diff --git a/docs/ru-RU/handbook/client/user/ui-designer/blocks/static/BEmxbD2SgoUTDexnYjzcmh7Knhg.png b/docs/ru-RU/handbook/client/user/ui-designer/blocks/static/BEmxbD2SgoUTDexnYjzcmh7Knhg.png new file mode 100644 index 0000000000..a2479759d1 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/blocks/static/BEmxbD2SgoUTDexnYjzcmh7Knhg.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/blocks/static/EicAbMa7Jo2MD9x8FSfcpgTGnHc.png b/docs/ru-RU/handbook/client/user/ui-designer/blocks/static/EicAbMa7Jo2MD9x8FSfcpgTGnHc.png new file mode 100644 index 0000000000..45698aa228 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/blocks/static/EicAbMa7Jo2MD9x8FSfcpgTGnHc.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/blocks/static/ImutbF0YDoWldOxrPilcwQFHnSe.png b/docs/ru-RU/handbook/client/user/ui-designer/blocks/static/ImutbF0YDoWldOxrPilcwQFHnSe.png new file mode 100644 index 0000000000..32ab59bd33 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/blocks/static/ImutbF0YDoWldOxrPilcwQFHnSe.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/blocks/static/JNiLb7rksoY07ox092ycaarenGd.png b/docs/ru-RU/handbook/client/user/ui-designer/blocks/static/JNiLb7rksoY07ox092ycaarenGd.png new file mode 100644 index 0000000000..d5b5018b25 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/blocks/static/JNiLb7rksoY07ox092ycaarenGd.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/blocks/static/L0aJb1V9DoETnNxrr1gcz0g0nDb.png b/docs/ru-RU/handbook/client/user/ui-designer/blocks/static/L0aJb1V9DoETnNxrr1gcz0g0nDb.png new file mode 100644 index 0000000000..cc7603c71d Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/blocks/static/L0aJb1V9DoETnNxrr1gcz0g0nDb.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/blocks/static/OpBcbf9UlooZ5UxZDwwcHZi8nWf.png b/docs/ru-RU/handbook/client/user/ui-designer/blocks/static/OpBcbf9UlooZ5UxZDwwcHZi8nWf.png new file mode 100644 index 0000000000..717d3ea48e Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/blocks/static/OpBcbf9UlooZ5UxZDwwcHZi8nWf.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/blocks/static/PSD8bf1fzoZkIUxJW7lc4XuGnee.png b/docs/ru-RU/handbook/client/user/ui-designer/blocks/static/PSD8bf1fzoZkIUxJW7lc4XuGnee.png new file mode 100644 index 0000000000..b8aeaf4f3a Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/blocks/static/PSD8bf1fzoZkIUxJW7lc4XuGnee.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/blocks/static/Tvjfb4qr4osyzxxPKdRcfn1knsd.png b/docs/ru-RU/handbook/client/user/ui-designer/blocks/static/Tvjfb4qr4osyzxxPKdRcfn1knsd.png new file mode 100644 index 0000000000..77c986e9d2 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/blocks/static/Tvjfb4qr4osyzxxPKdRcfn1knsd.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/blocks/static/Uo6ubaMwFo5bi1xVMU5cshlTn1g.png b/docs/ru-RU/handbook/client/user/ui-designer/blocks/static/Uo6ubaMwFo5bi1xVMU5cshlTn1g.png new file mode 100644 index 0000000000..4abc2a9a88 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/blocks/static/Uo6ubaMwFo5bi1xVMU5cshlTn1g.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/blocks/static/XjdHbvC9ZotdQAx8GJoczwoancc.gif b/docs/ru-RU/handbook/client/user/ui-designer/blocks/static/XjdHbvC9ZotdQAx8GJoczwoancc.gif new file mode 100644 index 0000000000..a43b0c6712 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/blocks/static/XjdHbvC9ZotdQAx8GJoczwoancc.gif differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/fields/index.md b/docs/ru-RU/handbook/client/user/ui-designer/fields/index.md new file mode 100644 index 0000000000..9fb914b092 --- /dev/null +++ b/docs/ru-RU/handbook/client/user/ui-designer/fields/index.md @@ -0,0 +1,60 @@ +### Поля + +В пользовательском интерфейсе поля представляют собой компоненты, содержащие единицы данных, где разные типы данных отображаются разными полевыми компонентами. Поля могут быть прикреплены только к блокам и не могут использоваться самостоятельно. + +#### Поля в блоках + +Поля обычно не используются по отдельности, а существуют как подэлементы блоков типа данных. Блоки данных обычно имеют опцию "настроить поля", а список полей предоставляется текущей таблицей данных. + +![](https://static-docs.nocobase.com/c5ea18ad1847332fe78075413f23de46.png) + +#### Конструктор полей (Панель инструментов) + +Как и блоки, полевые компоненты также имеют три значка в правом верхнем углу: + +- Перетащить для компоновки +- Быстрое добавление поля +- Настройка параметров поля + +![](https://static-docs.nocobase.com/30cc5fcaeeb171862f79449a72a7fcf9.png) + +#### Компоновка полей + +Расположение полей внутри блока можно настроить, перетаскивая их. + +![](https://static-docs.nocobase.com/0825ea8c014c9073f505e74f707ded66.gif) + +#### Общая конфигурация параметров + +- Редактировать название поля +- Отображать заголовок +- Редактировать описание +- Обязательное поле +- Правила валидации +- Установить значение по умолчанию +- Шаблон + +![](https://static-docs.nocobase.com/cbb838c9e167f51636d6a0ad3b287b59.png) + +**Важные параметры конфигурации:** + +##### Правила валидации + +(будет добавлено) + +##### Значение по умолчанию + +(будет добавлено) + +##### Шаблон + +В отличие от блоков, полевые компоненты имеют три режима отображения: + +- Редактируемый +- Только для чтения (нередактируемый) +- Простое чтение (режим чтения) + +#### Типы полей + +Поля в блоке предоставляются таблицей данных. Для получения дополнительной информации о конфигурации типов полей обратитесь к [Типам полей таблицы данных](https://nocobase.feishu.cn/wiki/BJKYw1xpHiVxFHkmgT3cKrKznkd). + diff --git a/docs/ru-RU/handbook/client/user/ui-designer/fields/static/BpmibJbEgoijTgxHkqdcjodanVc.gif b/docs/ru-RU/handbook/client/user/ui-designer/fields/static/BpmibJbEgoijTgxHkqdcjodanVc.gif new file mode 100644 index 0000000000..3205df33b7 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/fields/static/BpmibJbEgoijTgxHkqdcjodanVc.gif differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/fields/static/MIcrb5RbUoGYoZxWazPcGMWInjc.png b/docs/ru-RU/handbook/client/user/ui-designer/fields/static/MIcrb5RbUoGYoZxWazPcGMWInjc.png new file mode 100644 index 0000000000..2706575780 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/fields/static/MIcrb5RbUoGYoZxWazPcGMWInjc.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/fields/static/P82Kbwh5moSEL5x5UeYcn6kIn3Y.png b/docs/ru-RU/handbook/client/user/ui-designer/fields/static/P82Kbwh5moSEL5x5UeYcn6kIn3Y.png new file mode 100644 index 0000000000..2f16eb6e62 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/fields/static/P82Kbwh5moSEL5x5UeYcn6kIn3Y.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/fields/static/WBkubBX4QoUQ3HxPUHPcht2VnnK.png b/docs/ru-RU/handbook/client/user/ui-designer/fields/static/WBkubBX4QoUQ3HxPUHPcht2VnnK.png new file mode 100644 index 0000000000..abb66a1a37 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/fields/static/WBkubBX4QoUQ3HxPUHPcht2VnnK.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/index.md b/docs/ru-RU/handbook/client/user/ui-designer/index.md new file mode 100644 index 0000000000..efd547c53e --- /dev/null +++ b/docs/ru-RU/handbook/client/user/ui-designer/index.md @@ -0,0 +1,15 @@ +# Конструктор интерфейса + +При нажатии на кнопку настройки интерфейса активируется режим конфигурирования пользовательского интерфейса. + +![](https://static-docs.nocobase.com/0619e0aa0b24b81b8c08d7c572d3e0ba.jpg) + +### Элементы конструктора интерфейса + +1. Меню +2. Страница +3. Блок + - Блоки без полей или операций + - Блоки с полями и операциями +4. Поля (привязываются к блокам) +5. Операции (привязываются к блокам) diff --git a/docs/ru-RU/handbook/client/user/ui-designer/menus/index.md b/docs/ru-RU/handbook/client/user/ui-designer/menus/index.md new file mode 100644 index 0000000000..e8c0f50232 --- /dev/null +++ b/docs/ru-RU/handbook/client/user/ui-designer/menus/index.md @@ -0,0 +1,49 @@ +### Меню + +#### Типы пунктов меню + +Существует три встроенных типа пунктов меню: + +- Группа +- Страница +- Ссылка + +![](https://static-docs.nocobase.com/ccf6f42d3cc2677d440f9e33b9488d1c.png) + +##### Группа + +При использовании группы слева появится подменю. + +![](https://static-docs.nocobase.com/e59b2088fd68666cd240a26566616a3e.png) + +##### Страница + +Страница может использоваться для добавления различных блоков. + +![](https://static-docs.nocobase.com/4cd259f6b79f6792df72ccc291da2af9.png) + +##### Ссылка + +Используется для перенаправления по URL. + +![](https://static-docs.nocobase.com/80a6e6a875c565425224d9325332a1ad.png) + +#### Конструктор пунктов меню + +В правом верхнем углу каждого пункта меню есть две иконки: + +- Перетащить для перемещения +- Настроить пункт меню + +![](https://static-docs.nocobase.com/963ba10e36d04fd258fea0e996231f68.png) + +##### Настройка пункта меню + +![](https://static-docs.nocobase.com/0a9a05bd88d8bad9d711102a730f351d.png) + +- **Редактировать:** Изменить название пункта меню, иконку и др. +- **Переместить в:** Помимо перетаскивания, можно использовать опцию "Переместить в" для быстрого изменения положения. +- **Вставить перед** +- **Вставить после** +- **Вставить внутрь** (только для типа "Группа") +- **Удалить** diff --git a/docs/ru-RU/handbook/client/user/ui-designer/menus/static/Jp3NbdeVBojspWxvcWhcuDTlnOe.png b/docs/ru-RU/handbook/client/user/ui-designer/menus/static/Jp3NbdeVBojspWxvcWhcuDTlnOe.png new file mode 100644 index 0000000000..a2751410cc Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/menus/static/Jp3NbdeVBojspWxvcWhcuDTlnOe.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/menus/static/LTdGbCxxHopt9ix1Nuncj73VnQb.png b/docs/ru-RU/handbook/client/user/ui-designer/menus/static/LTdGbCxxHopt9ix1Nuncj73VnQb.png new file mode 100644 index 0000000000..f686eb3de7 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/menus/static/LTdGbCxxHopt9ix1Nuncj73VnQb.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/menus/static/OpdHbIbJ8oZX75x777ycylHxn1Q.png b/docs/ru-RU/handbook/client/user/ui-designer/menus/static/OpdHbIbJ8oZX75x777ycylHxn1Q.png new file mode 100644 index 0000000000..4a609a506b Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/menus/static/OpdHbIbJ8oZX75x777ycylHxn1Q.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/menus/static/SYzbbocHfoNFtsxomWJcUno7nog.png b/docs/ru-RU/handbook/client/user/ui-designer/menus/static/SYzbbocHfoNFtsxomWJcUno7nog.png new file mode 100644 index 0000000000..dc01db58ab Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/menus/static/SYzbbocHfoNFtsxomWJcUno7nog.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/menus/static/T0LTbjTBEo24UaxU9Btc6xgbnMf.png b/docs/ru-RU/handbook/client/user/ui-designer/menus/static/T0LTbjTBEo24UaxU9Btc6xgbnMf.png new file mode 100644 index 0000000000..197266e57c Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/menus/static/T0LTbjTBEo24UaxU9Btc6xgbnMf.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/menus/static/ZLYibDXwToMdqRxMTy4cyTion1f.png b/docs/ru-RU/handbook/client/user/ui-designer/menus/static/ZLYibDXwToMdqRxMTy4cyTion1f.png new file mode 100644 index 0000000000..a89a582a69 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/menus/static/ZLYibDXwToMdqRxMTy4cyTion1f.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/pages/index.md b/docs/ru-RU/handbook/client/user/ui-designer/pages/index.md new file mode 100644 index 0000000000..760a9b36e6 --- /dev/null +++ b/docs/ru-RU/handbook/client/user/ui-designer/pages/index.md @@ -0,0 +1,31 @@ +### Страница + +#### Структура страницы + +1. Конструктор страницы +2. Заголовок страницы +3. Вкладки страницы (подстраницы) +4. Тело страницы (содержит блоки) + +![](https://static-docs.nocobase.com/0c84950f8d58246497da21fbdd2ffc6b.png) + +#### Конструктор страницы + +![](https://static-docs.nocobase.com/19ce82228c9fb0681dcd9a73798b49f9.png) + +- **Включить заголовок страницы:** определяет, будет ли отображаться заголовок. +- **Отображать заголовок страницы:** управляет отображением заголовка страницы в шапке. +- **Редактировать заголовок страницы:** по умолчанию заголовок страницы совпадает с названием пункта меню, но его можно настроить вручную. +- **Включить вкладки страницы:** вкладки представляют собой подстраницы данной страницы. + +#### Вкладки страницы + +После включения вкладок страницы можно добавлять подстраницы внутри текущей страницы. + +![](https://static-docs.nocobase.com/febacab3419e1a0ea98b178db63fa86d.png) + +#### Макет страницы + +Несколько блоков можно свободно размещать и перетаскивать для настройки макета страницы. + +![](https://static-docs.nocobase.com/f6692295ac0917f3babce9a60ce80879.gif) diff --git a/docs/ru-RU/handbook/client/user/ui-designer/pages/static/C3xvb09t4oGOlhxxI5jcy2B7ncc.png b/docs/ru-RU/handbook/client/user/ui-designer/pages/static/C3xvb09t4oGOlhxxI5jcy2B7ncc.png new file mode 100644 index 0000000000..ff6e6bf2cb Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/pages/static/C3xvb09t4oGOlhxxI5jcy2B7ncc.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/pages/static/U0kXblh2Yo5S5hx91c2cYggrnYf.gif b/docs/ru-RU/handbook/client/user/ui-designer/pages/static/U0kXblh2Yo5S5hx91c2cYggrnYf.gif new file mode 100644 index 0000000000..a43b0c6712 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/pages/static/U0kXblh2Yo5S5hx91c2cYggrnYf.gif differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/pages/static/VpP2bTwhooaxrqxy5gYc4KJFnUc.png b/docs/ru-RU/handbook/client/user/ui-designer/pages/static/VpP2bTwhooaxrqxy5gYc4KJFnUc.png new file mode 100644 index 0000000000..3a1725bca0 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/pages/static/VpP2bTwhooaxrqxy5gYc4KJFnUc.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/pages/static/YPqEb1UEMoNzszxAHeDcNrsjnie.png b/docs/ru-RU/handbook/client/user/ui-designer/pages/static/YPqEb1UEMoNzszxAHeDcNrsjnie.png new file mode 100644 index 0000000000..933e11052e Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/pages/static/YPqEb1UEMoNzszxAHeDcNrsjnie.png differ diff --git a/docs/ru-RU/handbook/client/user/ui-designer/static/X8u0b5QJFomar7xbFTKceqIPngb.jpg b/docs/ru-RU/handbook/client/user/ui-designer/static/X8u0b5QJFomar7xbFTKceqIPngb.jpg new file mode 100644 index 0000000000..23e19ebe17 Binary files /dev/null and b/docs/ru-RU/handbook/client/user/ui-designer/static/X8u0b5QJFomar7xbFTKceqIPngb.jpg differ diff --git a/docs/ru-RU/handbook/collection-expression/collection.md b/docs/ru-RU/handbook/collection-expression/collection.md new file mode 100644 index 0000000000..45e21262fa --- /dev/null +++ b/docs/ru-RU/handbook/collection-expression/collection.md @@ -0,0 +1,3 @@ +# Коллекция выражений + + diff --git a/docs/ru-RU/handbook/collection-fdw/enable-federated.md b/docs/ru-RU/handbook/collection-fdw/enable-federated.md new file mode 100644 index 0000000000..f18ff01918 --- /dev/null +++ b/docs/ru-RU/handbook/collection-fdw/enable-federated.md @@ -0,0 +1,39 @@ +# Как включить Federated Engine в MySQL + +Модуль Federated по умолчанию отключен в MySQL. Для его активации необходимо изменить конфигурацию my.cnf. Если вы используете Docker-версию, настройку можно выполнить через volumes: + +```yml +mysql: + image: mysql:8.1.0 + volumes: + - ./storage/mysql-conf:/etc/mysql/conf.d + environment: + MYSQL_DATABASE: nocobase + MYSQL_USER: nocobase + MYSQL_PASSWORD: nocobase + MYSQL_ROOT_PASSWORD: nocobase + restart: always + networks: + - nocobase +``` + +1. Создайте файл `./storage/mysql-conf/federated.cnf` со следующим содержимым: + +```conf +[mysqld] +federated +``` + +2. Перезапустите MySQL: + +```bash +docker compose up -d mysql +``` + +3. Проверьте активацию Federated Engine: + +```sql +show engines +``` + +![Проверка активации Federated](https://static-docs.nocobase.com/ac5d97cf902ad164e141633a41a23e46.png) diff --git a/docs/ru-RU/handbook/collection-fdw/image-1.png b/docs/ru-RU/handbook/collection-fdw/image-1.png new file mode 100644 index 0000000000..28ad3aa627 Binary files /dev/null and b/docs/ru-RU/handbook/collection-fdw/image-1.png differ diff --git a/docs/ru-RU/handbook/collection-fdw/image-10.png b/docs/ru-RU/handbook/collection-fdw/image-10.png new file mode 100644 index 0000000000..3fa17d784d Binary files /dev/null and b/docs/ru-RU/handbook/collection-fdw/image-10.png differ diff --git a/docs/ru-RU/handbook/collection-fdw/image-2.png b/docs/ru-RU/handbook/collection-fdw/image-2.png new file mode 100644 index 0000000000..032241693e Binary files /dev/null and b/docs/ru-RU/handbook/collection-fdw/image-2.png differ diff --git a/docs/ru-RU/handbook/collection-fdw/image-3.png b/docs/ru-RU/handbook/collection-fdw/image-3.png new file mode 100644 index 0000000000..93c3e0631a Binary files /dev/null and b/docs/ru-RU/handbook/collection-fdw/image-3.png differ diff --git a/docs/ru-RU/handbook/collection-fdw/image-4.png b/docs/ru-RU/handbook/collection-fdw/image-4.png new file mode 100644 index 0000000000..72f11fdc5b Binary files /dev/null and b/docs/ru-RU/handbook/collection-fdw/image-4.png differ diff --git a/docs/ru-RU/handbook/collection-fdw/image-5.png b/docs/ru-RU/handbook/collection-fdw/image-5.png new file mode 100644 index 0000000000..01b08cd71e Binary files /dev/null and b/docs/ru-RU/handbook/collection-fdw/image-5.png differ diff --git a/docs/ru-RU/handbook/collection-fdw/image-6.png b/docs/ru-RU/handbook/collection-fdw/image-6.png new file mode 100644 index 0000000000..092b33cb60 Binary files /dev/null and b/docs/ru-RU/handbook/collection-fdw/image-6.png differ diff --git a/docs/ru-RU/handbook/collection-fdw/image-7.png b/docs/ru-RU/handbook/collection-fdw/image-7.png new file mode 100644 index 0000000000..793c6aef76 Binary files /dev/null and b/docs/ru-RU/handbook/collection-fdw/image-7.png differ diff --git a/docs/ru-RU/handbook/collection-fdw/image-8.png b/docs/ru-RU/handbook/collection-fdw/image-8.png new file mode 100644 index 0000000000..50a754339d Binary files /dev/null and b/docs/ru-RU/handbook/collection-fdw/image-8.png differ diff --git a/docs/ru-RU/handbook/collection-fdw/image-9.png b/docs/ru-RU/handbook/collection-fdw/image-9.png new file mode 100644 index 0000000000..26e966f7a6 Binary files /dev/null and b/docs/ru-RU/handbook/collection-fdw/image-9.png differ diff --git a/docs/ru-RU/handbook/collection-fdw/image.png b/docs/ru-RU/handbook/collection-fdw/image.png new file mode 100644 index 0000000000..332858e2c3 Binary files /dev/null and b/docs/ru-RU/handbook/collection-fdw/image.png differ diff --git a/docs/ru-RU/handbook/collection-fdw/index.md b/docs/ru-RU/handbook/collection-fdw/index.md new file mode 100644 index 0000000000..33aba89556 --- /dev/null +++ b/docs/ru-RU/handbook/collection-fdw/index.md @@ -0,0 +1,70 @@ +# Подключение внешних таблиц данных (FDW) + + + +## Введение + +Этот плагин позволяет подключаться к удалённым таблицам данных с использованием технологии внешней обёртки данных (Foreign Data Wrapper, FDW) базы данных. В настоящее время поддерживаются базы данных MySQL и PostgreSQL. + +:::info{title="Подключение источников данных vs Подключение внешних таблиц данных"} +- **Подключение источников данных** означает установление соединения с конкретной базой данных или API-сервисом, что позволяет в полной мере использовать возможности базы данных или сервисов, предоставляемых API. +- **Подключение внешних таблиц данных** означает получение данных извне и их отображение для локального использования. В базах данных эта технология называется FDW (Foreign Data Wrapper). Она позволяет использовать удалённые таблицы как локальные, но подключение осуществляется по одной таблице за раз. Из-за удалённого доступа при использовании возникают различные ограничения и условия. +- +Оба подхода можно комбинировать. Первый используется для установления соединения с источником данных, второй — для доступа между разными источниками. Например, подключается источник данных PostgreSQL, а одна из таблиц в этом источнике — это внешняя таблица, созданная на основе FDW. +::: + +### MySQL + +В MySQL используется движок `federated`, который необходимо активировать. Он поддерживает подключение к удалённым базам данных MySQL и совместимым с ним по протоколу базам, таким как MariaDB. Подробнее см. документацию [Federated Storage Engine](https://dev.mysql.com/doc/refman/8.0/en/federated-storage-engine.html). + +### PostgreSQL + +В PostgreSQL для поддержки различных типов удалённых данных можно использовать различные расширения `fdw`. В настоящее время поддерживаются следующие расширения: + +- [postgres_fdw](https://www.postgresql.org/docs/current/postgres-fdw.html): подключение к удалённой базе данных PostgreSQL из PostgreSQL. +- [mysql_fdw (в разработке)](https://github.com/EnterpriseDB/mysql_fdw): подключение к удалённой базе данных MySQL из PostgreSQL. +- Другие типы расширений fdw можно найти в [PostgreSQL Foreign Data Wrappers](https://wiki.postgresql.org/wiki/Foreign_data_wrappers). Для их использования необходимо реализовать соответствующий интерфейс адаптации в коде. + +## Установка + +### Предварительные требования + +- Если основная база данных NocoBase — MySQL, необходимо активировать движок `federated`. Подробнее см. [Как включить движок federated в MySQL](./enable-federated.md). + +Затем установите и активируйте плагин через менеджер плагинов: + +![Установка и активация плагина](https://static-docs.nocobase.com/f84276c5712851fb3ff33af3f1ff0f59.png) + +## Руководство пользователя + +В разделе «Менеджер коллекций > Создать коллекцию» выберите «Подключиться к внешней таблице данных»: + +![Подключение внешних данных](https://static-docs.nocobase.com/029d946a6d067d1c35a39755219d623c.png) + +В выпадающем списке «Сервер базы данных» выберите существующий сервер базы данных или нажмите «Создать сервер базы данных»: + +![Сервер базы данных](https://static-docs.nocobase.com/766271708a911950a5599d60d6be4a4d.png) + +Создание сервера базы данных: + +![Создание сервера базы данных](https://static-docs.nocobase.com/1e357216e04cc4f200bd6212827281c8.png) + +После выбора сервера базы данных в списке «Удалённая таблица» выберите таблицу, к которой нужно подключиться: + +![Выбор таблицы для подключения](https://static-docs.nocobase.com/e91fd6152b52b4fc01b3808053cc8dc4.png) + +Настройка информации о полях: + +![Настройка информации о полях](https://static-docs.nocobase.com/e618fecc5fe327f6a495e61405e5f040.png) + +Если в удалённой таблице произошли структурные изменения, вы можете обновить схему с помощью функции «Синхронизировать из удалённой таблицы»: + +![Синхронизация из удалённой таблицы](https://static-docs.nocobase.com/3751a9a39f933889fb3fcc4d85a6f4ad.png) + +Синхронизация удалённой таблицы: + +![Синхронизация удалённой таблицы](https://static-docs.nocobase.com/13f18200e31ea223fdd8dadaff1e9d28.png) + +Наконец, отобразите таблицу на интерфейсе: + +![Отображение на интерфейсе](https://static-docs.nocobase.com/368fca27a99277d9360ca81350949357.png) diff --git a/docs/ru-RU/handbook/collection-sql/index.md b/docs/ru-RU/handbook/collection-sql/index.md new file mode 100644 index 0000000000..e55cfa9e61 --- /dev/null +++ b/docs/ru-RU/handbook/collection-sql/index.md @@ -0,0 +1,55 @@ +# SQL-коллекция + + + +## Введение + +SQL-коллекция предоставляет мощный метод извлечения данных с помощью SQL-запросов. Извлекая поля данных через SQL-запросы и настраивая связанные метаданные полей, пользователи могут работать с этими полями, как с обычной таблицей. Эта функция особенно полезна для сложных JOIN-запросов, статистического анализа и других сценариев. + +## Руководство пользователя + +### Создание новой SQL-коллекции + + + +1. Введите SQL-запрос в поле ввода и нажмите "Выполнить". Система проанализирует запрос, определит задействованные таблицы и поля, автоматически извлекая соответствующие метаданные полей из исходных таблиц. + + + +2. Если анализ системы некорректен, вы можете вручную выбрать нужные таблицы и поля. Сначала выберите исходную таблицу, затем соответствующие поля в разделе источника полей. + + + +3. Для полей без прямого источника система определит тип поля на основе типа данных. Если определение неверно, выберите правильный тип вручную. + + + +4. Настраивая каждое поле, вы можете видеть результат в области предпросмотра. + + + +5. Завершив настройку, нажмите "Подтвердить" для сохранения. + + + +### Редактирование + +1. Для изменения SQL-запроса нажмите "Редактировать" и измените запрос. +2. Для настройки метаданных полей используйте опцию "Настроить поля" (как для обычной таблицы). + +### Синхронизация + +Если структура таблиц в БД изменилась, синхронизируйте поля через "Настроить поля" → "Синхронизировать с БД". + + + +### Сравнение SQL-коллекций и представлений БД + +| Тип | Лучше подходит для | Метод реализации | Поддержка CRUD | +|-----------------------|-----------------------------------------------------------------------------------|--------------------|--------------------| +| SQL-коллекция | Простые модели, легковесные сценарии
    Минимальное взаимодействие с БД
    Предпочитаете UI-операции | SQL подзапрос | Не поддерживается | +| Представления БД | Сложные модели
    Требуется взаимодействие с БД
    Нужно изменять данные
    Требуется стабильная БД | Представление БД | Частично поддерживается | + +:::warning +При использовании SQL-коллекции выбирайте только таблицы, управляемые через NocoBase. Использование внешних таблиц может привести к некорректному анализу запросов. В таких случаях лучше создавать представления. +::: diff --git a/docs/ru-RU/handbook/collection-tree/index.md b/docs/ru-RU/handbook/collection-tree/index.md new file mode 100644 index 0000000000..f466a654c0 --- /dev/null +++ b/docs/ru-RU/handbook/collection-tree/index.md @@ -0,0 +1,13 @@ +# Древовидная коллекция + + + +## Введение + +Древовидная коллекция — это шаблон проектирования коллекции данных, используемый для организации иерархических данных. Эта структура коллекции напоминает дерево, в котором каждый элемент данных может иметь один или несколько дочерних элементов, а те, в свою очередь, могут иметь собственные вложенные элементы. + +## Руководство пользователя + +![20240324143228](https://static-docs.nocobase.com/20240324143228.png) + +![20240324143555](https://static-docs.nocobase.com/20240324143555.png) diff --git a/docs/ru-RU/handbook/collection-view/index.md b/docs/ru-RU/handbook/collection-view/index.md new file mode 100644 index 0000000000..2dd996147d --- /dev/null +++ b/docs/ru-RU/handbook/collection-view/index.md @@ -0,0 +1,9 @@ +# Просмотр базы данных + + + +## Введение + +## Мануал + +![20240324145718](https://static-docs.nocobase.com/20240324145718.png) diff --git a/docs/ru-RU/handbook/custom-brand/index.md b/docs/ru-RU/handbook/custom-brand/index.md new file mode 100644 index 0000000000..98758c09ff --- /dev/null +++ b/docs/ru-RU/handbook/custom-brand/index.md @@ -0,0 +1,35 @@ +# Custom Brand + + + +## Introduction + +The default brand name is "NocoBase", which is primarily displayed in the following three places as shown in the images: + +![20240409111100](https://static-docs.nocobase.com/20240409111100.png) + +On the bottom of the login page: + +![20240409111254](https://static-docs.nocobase.com/20240409111254.png) + +The logo at position number 1 can be configured via the system settings under the Logo option. Positions number 2 and 3 can be customized using this plugin. + +## User Guide + +After activating the plugin, you can access the configuration page by clicking on the 'Custom Brand' menu in the upper right corner of the page. + +![20240409113640](https://static-docs.nocobase.com/20240409113640.png) + +The `Brand` option is used to set the text at the bottom of the login page (position number 3), while the `About` option is used to configure the content of the menu in the upper right corner (as shown in the image below). + +![20240409113915](https://static-docs.nocobase.com/20240409113915.png) + +HTML is used for the configuration to allow users more flexibility in customizing their content. However, if you only need to make simple text changes, you can directly modify the existing content, as shown in the image below: + +![20240409114740](https://static-docs.nocobase.com/20240409114740.png) + +### Favicon(v1.2.23-alpha) + +In v1.2.23-alpha, we added the ability to set a favicon as shown below: + +![350438864-08053d02-5429-407f-a3f7-fed439993623](https://static-docs.nocobase.com/350438864-08053d02-5429-407f-a3f7-fed439993623.gif) diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/advanced/collection-select.md b/docs/ru-RU/handbook/data-modeling/collection-fields/advanced/collection-select.md new file mode 100644 index 0000000000..af50f56ef6 --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/advanced/collection-select.md @@ -0,0 +1,34 @@ +# Collection Select + +## Введение + +Поле **Collection Select** используется для создания связи между текущей коллекцией и другой коллекцией данных. +Оно позволяет выбрать одну или несколько записей из другой коллекции, обеспечивая тем самым реляционные связи между сущностями. + +## Настройка поля + +![20240512174047](https://static-docs.nocobase.com/20240512174047.png) + +## Инструкции + +### Основные особенности: + +- Позволяет выбирать значения из связанной коллекции; +- Поддерживает как одиночный, так и множественный выбор (в зависимости от конфигурации); +- Может отображаться в виде выпадающего списка, таблицы, карточек и других визуальных компонентов; +- Значения могут фильтроваться, сортироваться и отображаться с учётом условий и ролей. + +### Когда использовать: + +- Для установления связей между записями разных коллекций (например, Пользователь — Компания, Товар — Категория); +- При необходимости выбора значений из другого справочника или источника; +- Для построения иерархий и навигационных структур. + +### Рекомендации: + +- Убедитесь, что связанная коллекция содержит ключевые поля для идентификации (например, название или метку); +- При множественном выборе следите за производительностью при большом объёме данных; +- Можно использовать дополнительные фильтры и выражения для ограничения доступных значений по ролям или условиям. + + + diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/advanced/json.md b/docs/ru-RU/handbook/data-modeling/collection-fields/advanced/json.md new file mode 100644 index 0000000000..762e731a35 --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/advanced/json.md @@ -0,0 +1,33 @@ +# JSON + +## Введение + +Поле типа **JSON** предназначено для хранения структурированных данных в формате JSON. +Оно позволяет гибко сохранять вложенные объекты, массивы и произвольные структуры, +не ограничиваясь строго заданной схемой таблицы. + +## Настройка поля + +![20240512173905](https://static-docs.nocobase.com/20240512173905.png) + +## Инструкции + +### Основные особенности: + +- Поддерживает хранение произвольных JSON-объектов; +- Можно использовать для хранения метаданных, конфигураций и вложенных структур; +- Позволяет легко интегрироваться с внешними API, использующими JSON; +- Содержимое поля можно фильтровать и отображать через выражения и кастомные компоненты. + +### Когда использовать: + +- Когда структура данных может меняться динамически; +- Если необходимо сохранить набор параметров, зависящий от контекста; +- Для расширения функциональности без добавления новых колонок в коллекцию. + +### Рекомендации: + +- Убедитесь, что фронтенд-компоненты корректно обрабатывают вложенные данные; +- Используйте JSON-валидаторы и схемы (например, через workflow) для контроля целостности данных; +- Не используйте для хранения критичных ключей или уникальных идентификаторов, если они должны быть индексированы на уровне базы данных. + diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/advanced/nano-id.md b/docs/ru-RU/handbook/data-modeling/collection-fields/advanced/nano-id.md new file mode 100644 index 0000000000..54db3a5723 --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/advanced/nano-id.md @@ -0,0 +1,33 @@ +# Nano ID + +## Введение + +Nano ID — это компактный, криптографически безопасный уникальный идентификатор. +В отличие от UUID, он короче по длине, легко читается, но при этом остаётся надёжным и уникальным. +Подходит для генерации ID, которые будут использоваться во внешних интерфейсах или ссылках. + +## Настройка поля + +![20240512173225](https://static-docs.nocobase.com/20240512173225.png) + +## Инструкции + +### Основные особенности: + +- Генерируется автоматически при создании записи; +- Поддерживает настраиваемую длину идентификатора; +- Можно задать собственный алфавит, если требуется особый формат; +- Подходит для публичного использования в URL, токенах, пользовательских ID и т. д. + +### Преимущества по сравнению с UUID: + +- Короче и легче воспринимается человеком; +- Быстрее в генерации; +- Безопасен для использования в открытых системах (по умолчанию использует криптостойкий генератор случайных чисел). + +### Рекомендации: + +- Используйте Nano ID, если вам нужен короткий, но уникальный идентификатор; +- Избегайте повторной генерации поля вручную, чтобы не нарушить уникальность; +- Можно использовать как публичный ID, безопасный для отображения в ссылках и API. + diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/advanced/sort.md b/docs/ru-RU/handbook/data-modeling/collection-fields/advanced/sort.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/advanced/uuid.md b/docs/ru-RU/handbook/data-modeling/collection-fields/advanced/uuid.md new file mode 100644 index 0000000000..1c09324bf0 --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/advanced/uuid.md @@ -0,0 +1,34 @@ +# UUID + +## Введение + +## Настройка поля + +![20240512173354](https://static-docs.nocobase.com/20240512173354.png) + +## Инструкции + +Поле UUID (Universally Unique Identifier) используется для генерации уникального идентификатора, +который не зависит от конкретной базы данных и гарантирует уникальность на глобальном уровне. + +### Основные особенности: + +- UUID генерируется автоматически при создании записи; +- Поле доступно только для чтения (нельзя изменить вручную); +- Используется как уникальный ключ при интеграции с внешними системами или API; +- Поддерживается формат `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`. + +### Когда использовать: + +- При необходимости уникальных идентификаторов, независимых от автоинкрементных чисел; +- В распределённых системах, где важно избегать конфликтов ID; +- Для повышения безопасности, так как UUID сложнее угадать, чем обычный числовой ID. + +### Рекомендации: + +- Не используйте UUID как первичный ключ в высоконагруженных таблицах без предварительного тестирования производительности; +- Не изменяйте и не очищайте значение UUID вручную — это приведёт к потере связи с внешними интеграциями; +- Используйте UUID в качестве публичного идентификатора, который можно безопасно раскрывать в API и URL. + + + diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/associations/index.md b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/index.md new file mode 100644 index 0000000000..0df6df4462 --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/index.md @@ -0,0 +1,12 @@ +# Поля связей (Relationship Fields) + +В NocoBase поля связей не являются реальными полями в таблице базы данных — они используются для установления связей между коллекциями. +Эта концепция эквивалентна отношениям в реляционных базах данных. +В реляционных СУБД наиболее часто встречаются следующие типы связей: + +- [Один к одному (One-to-One)](./o2o/index.md): Каждой сущности из одной коллекции соответствует ровно одна сущность из другой коллекции. Такой тип связи используется, когда необходимо разделить разные аспекты одной сущности по разным коллекциям для уменьшения избыточности и повышения согласованности данных. +- [Один ко многим (One-to-Many)](./o2m/index.md): Каждая сущность из одной коллекции может быть связана с несколькими сущностями из другой коллекции. Это один из самых распространённых типов связей. Пример: один автор может написать несколько статей, но каждая статья имеет только одного автора. +- [Многие к одному (Many-to-One)](./m2o/index.md): Несколько сущностей из одной коллекции могут быть связаны с одной сущностью из другой коллекции. Этот тип связи также часто используется в моделировании данных. Пример: несколько студентов могут быть привязаны к одному классу. +- [Многие ко многим (Many-to-Many)](./m2m/index.md): Несколько сущностей из двух коллекций могут быть взаимосвязаны. Такой тип связи обычно реализуется через промежуточную коллекцию, в которой фиксируются связи между сущностями. Пример: студент может записаться на несколько курсов, и один курс может включать нескольких студентов. + +Эти типы связей играют ключевую роль в проектировании баз данных и моделировании данных, позволяя точно описывать сложные связи и структуры, встречающиеся в реальном мире. diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/associations/m2m/image-1.png b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/m2m/image-1.png new file mode 100644 index 0000000000..56fad31327 Binary files /dev/null and b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/m2m/image-1.png differ diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/associations/m2m/image-2.png b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/m2m/image-2.png new file mode 100644 index 0000000000..c221def543 Binary files /dev/null and b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/m2m/image-2.png differ diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/associations/m2m/image.png b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/m2m/image.png new file mode 100644 index 0000000000..f4796caaa3 Binary files /dev/null and b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/m2m/image.png differ diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/associations/m2m/index.md b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/m2m/index.md new file mode 100644 index 0000000000..513e3393d4 --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/m2m/index.md @@ -0,0 +1,61 @@ +# Многие ко многим (Many-to-Many) + +В системе записи на курсы есть две сущности: **студенты** и **курсы**. +Один студент может записаться на несколько курсов, и каждый курс может включать множество студентов, +что образует связь типа «многие ко многим». + +В реляционных базах данных для представления такой связи обычно используется промежуточная коллекция — +например, **коллекция записей на курсы** (enrollment). Эта коллекция фиксирует, +какие курсы выбрал каждый студент и какие студенты записались на каждый курс. +Такая структура эффективно реализует модель «многие ко многим» между студентами и курсами. + +**ER-диаграмма:** + +![alt text](https://static-docs.nocobase.com/0e9921228e1ee375dc639431bb89782c.png) + +**Настройка полей:** + +![alt text](https://static-docs.nocobase.com/8e2739ac5d44fb46f30e2da42ca87a82.png) + +## Описание параметров + +### Исходная коллекция (Source Collection) + +Коллекция, в которой находится текущее поле. + +### Целевая коллекция (Target Collection) + +Коллекция, с которой устанавливается связь. + +### Промежуточная коллекция (Through Collection) + +Коллекция, используемая для реализации связи «многие ко многим» между двумя сущностями. +Содержит два внешних ключа, каждый из которых ссылается на одну из сущностей. + +### Ключ исходной коллекции (Source Key) + +Поле в исходной коллекции, на которое ссылается внешний ключ. Должно быть уникальным. + +### Внешний ключ 1 (Foreign Key 1) + +Поле в промежуточной коллекции, устанавливающее связь с исходной коллекцией. + +### Внешний ключ 2 (Foreign Key 2) + +Поле в промежуточной коллекции, устанавливающее связь с целевой коллекцией. + +### Ключ целевой коллекции (Target Key) + +Поле в целевой коллекции, на которое ссылается внешний ключ. Должно быть уникальным. + +### ON DELETE + +Опция **ON DELETE** определяет поведение внешнего ключа при удалении записей в родительской +коллекции. Используется при задании ограничений целостности. + +Доступны следующие режимы: + +- **CASCADE**: При удалении записи в родительской коллекции все связанные записи в дочерней коллекции удаляются автоматически. +- **SET NULL**: При удалении родительской записи внешние ключи в дочерней коллекции устанавливаются в `NULL`. +- **RESTRICT**: По умолчанию. Не позволяет удалить запись в родительской коллекции, если есть связанные записи в дочерней. +- **NO ACTION**: Аналогично `RESTRICT`, запрещает удаление родительской записи при наличии связанных записей. diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/associations/m2o/image-1.png b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/m2o/image-1.png new file mode 100644 index 0000000000..4b5520d274 Binary files /dev/null and b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/m2o/image-1.png differ diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/associations/m2o/image-2.png b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/m2o/image-2.png new file mode 100644 index 0000000000..de2fbe022e Binary files /dev/null and b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/m2o/image-2.png differ diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/associations/m2o/image.png b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/m2o/image.png new file mode 100644 index 0000000000..5dc4e68074 Binary files /dev/null and b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/m2o/image.png differ diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/associations/m2o/index.md b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/m2o/index.md new file mode 100644 index 0000000000..96f3014b69 --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/m2o/index.md @@ -0,0 +1,44 @@ +# Отношение «Многие к одному» (Many-to-One) + +В базе данных библиотеки есть две сущности: **книги** и **авторы**. +Один автор может написать несколько книг, но каждая книга обычно принадлежит только одному автору. +В этом случае между авторами и книгами устанавливается связь типа «многие к одному». + +**ER-диаграмма:** + +![alt text](https://static-docs.nocobase.com/eaeeac974844db05c75cf0deeedf3652.png) + +**Настройка полей:** + +![alt text](https://static-docs.nocobase.com/3b4484ebb98d82f832f3dbf752bd84c9.png) + +## Описание параметров + +### Исходная коллекция (Source Collection) + +Коллекция, в которой находится текущее поле (в нашем примере — *книги*). + +### Целевая коллекция (Target Collection) + +Коллекция, с которой устанавливается связь (в нашем примере — *авторы*). + +### Внешний ключ (Foreign Key) + +Поле в исходной коллекции, которое используется для установления связи между двумя коллекциями. +Оно содержит значение, ссылающееся на запись в целевой коллекции. + +### Ключ целевой коллекции (Target Key) + +Поле в целевой коллекции, на которое ссылается внешний ключ. Это поле должно быть уникальным. + +### ON DELETE + +**ON DELETE** определяет поведение связей при удалении записи в целевой (родительской) коллекции. +Эта опция задаётся при создании внешнего ключа. + +Варианты поведения: + +- **CASCADE**: При удалении записи в целевой коллекции, все связанные записи в исходной коллекции удаляются автоматически. +- **SET NULL**: При удалении родительской записи значение внешнего ключа в связанных записях обнуляется (устанавливается в `NULL`). +- **RESTRICT**: (по умолчанию) — запрещает удаление записи в целевой коллекции, если к ней есть привязанные записи в исходной. +- **NO ACTION**: Поведение аналогично `RESTRICT` — удаление родительской записи блокируется, если есть связанные дочерние записи. diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/associations/o2m/image-1.png b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/o2m/image-1.png new file mode 100644 index 0000000000..b66a9543ee Binary files /dev/null and b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/o2m/image-1.png differ diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/associations/o2m/image.png b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/o2m/image.png new file mode 100644 index 0000000000..2e40cab899 Binary files /dev/null and b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/o2m/image.png differ diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/associations/o2m/index.md b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/o2m/index.md new file mode 100644 index 0000000000..d5c51dca06 --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/o2m/index.md @@ -0,0 +1,47 @@ +# Отношение «Один ко многим» (One-to-Many) + +Отношения между классом и его учениками — это пример связи типа «один ко многим»: +один класс может включать нескольких студентов, но каждый студент принадлежит только одному классу. + +**ER-диаграмма:** + +![alt text](https://static-docs.nocobase.com/9475f044d123d28ac8e56a077411f8dc.png) + +**Настройка полей:** + +![alt text](https://static-docs.nocobase.com/a608ce54821172dad7e8ab760107ff4e.png) + +## Описание параметров + +### Исходная коллекция (Source Collection) + +Коллекция, в которой находится текущее поле (в данном примере — *классы*). + +### Целевая коллекция (Target Collection) + +Коллекция, с которой устанавливается связь (в данном примере — *студенты*). + +### Ключ исходной коллекции (Source Key) + +Поле в исходной коллекции, на которое ссылается внешний ключ. Оно должно быть уникальным. + +### Внешний ключ (Foreign Key) + +Поле в целевой коллекции, которое используется для установления связи между двумя коллекциями. +Оно ссылается на `Source Key` в родительской коллекции. + +### Ключ целевой коллекции (Target Key) + +Поле в целевой коллекции, отображаемое для каждой строки в блоке связей. +Обычно это уникальное или человеко-читаемое поле (например, имя). + +### ON DELETE + +Опция **ON DELETE** определяет поведение при удалении записи в родительской коллекции (в нашем примере — *класс*), к которой привязаны записи в дочерней коллекции (*студенты*). + +Доступные варианты: + +- **CASCADE**: При удалении записи в родительской коллекции автоматически удаляются все связанные записи в дочерней коллекции. +- **SET NULL**: При удалении родительской записи внешний ключ в дочерней коллекции устанавливается в `NULL`. +- **RESTRICT**: (по умолчанию) — не позволяет удалить родительскую запись, если есть связанные дочерние записи. +- **NO ACTION**: Поведение аналогично `RESTRICT` — удаление блокируется при наличии связанных записей. diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/associations/o2o/image-1.png b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/o2o/image-1.png new file mode 100644 index 0000000000..16a4f85917 Binary files /dev/null and b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/o2o/image-1.png differ diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/associations/o2o/image-2.png b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/o2o/image-2.png new file mode 100644 index 0000000000..5cd4b98023 Binary files /dev/null and b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/o2o/image-2.png differ diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/associations/o2o/image-3.png b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/o2o/image-3.png new file mode 100644 index 0000000000..003b1ae97c Binary files /dev/null and b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/o2o/image-3.png differ diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/associations/o2o/image.png b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/o2o/image.png new file mode 100644 index 0000000000..72a5e325e1 Binary files /dev/null and b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/o2o/image.png differ diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/associations/o2o/index.md b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/o2o/index.md new file mode 100644 index 0000000000..bafe64ad04 --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/associations/o2o/index.md @@ -0,0 +1,70 @@ +# Отношение «Один к одному» (One-to-One) + +В отношениях между сотрудниками и личными профилями действует связь «один к одному»: +каждый сотрудник может иметь только один персональный профиль, и каждый профиль может +быть привязан только к одному сотруднику. + +В таких связях внешний ключ можно разместить как в исходной коллекции, так и в целевой. +Если связь описывает "имеет" (having one), внешний ключ уместнее размещать в целевой коллекции. +Если связь означает "принадлежит" (belonging to), внешний ключ лучше поместить в исходную коллекцию. + +Например, если сотрудник **имеет (having one)** персональный профиль, и этот профиль **принадлежит (belonging to)** сотруднику, +то логично поместить внешний ключ в коллекцию профилей. + +## Один к одному — «Имеет» (Having One) + +Означает, что сотрудник имеет одну запись профиля. + +**ER-диаграмма:** + +![alt text](https://static-docs.nocobase.com/4359e128936bbd7c9ff51bcff1d646dd.png) + +**Настройка поля:** + +![alt text](https://static-docs.nocobase.com/7665a87e094b4fb50c9426a108f87105.png) + +## Один к одному — «Принадлежит» (Belonging) + +Означает, что профиль принадлежит определённому сотруднику. + +**ER-диаграмма:** + +![alt text](https://static-docs.nocobase.com/31e7cc3e630220cf1e98753ca24ac72d.png) + +**Настройка поля:** + +![alt text](https://static-docs.nocobase.com/4f09eeb3c7717d61a349842da43c187c.png) + +## Описание параметров + +### Исходная коллекция (Source Collection) + +Коллекция, в которой находится текущее поле. + +### Целевая коллекция (Target Collection) + +Коллекция, с которой устанавливается связь. + +### Внешний ключ (Foreign Key) + +Поле, которое устанавливает связь между двумя коллекциями. В отношениях один к одному внешний ключ может находиться как в исходной, так и в целевой коллекции: +- Если выражает «имеет», внешний ключ размещают в **целевой** коллекции; +- Если выражает «принадлежит», внешний ключ размещают в **исходной** коллекции. + +### Ключ источника ← Внешний ключ (если ключ в целевой коллекции) + +Поле, на которое ссылается внешний ключ. Оно должно быть уникальным. Такой подход описывает связь типа «имеет». + +### Ключ цели ← Внешний ключ (если ключ в исходной коллекции) + +Поле, на которое ссылается внешний ключ. Оно должно быть уникальным. Такой подход описывает связь типа «принадлежит». + +### ON DELETE + +**ON DELETE** определяет поведение при удалении записи из родительской коллекции. +Эта опция задаётся при создании внешнего ключа и определяет, что произойдёт с дочерними записями: + +- **CASCADE**: При удалении родительской записи автоматически удаляются связанные дочерние записи. +- **SET NULL**: Внешний ключ в дочерней коллекции устанавливается в `NULL`. +- **RESTRICT**: (по умолчанию) — не позволяет удалить запись, если есть связанные данные. +- **NO ACTION**: Поведение иденти diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/basic/color.md b/docs/ru-RU/handbook/data-modeling/collection-fields/basic/color.md new file mode 100644 index 0000000000..916ca97204 --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/basic/color.md @@ -0,0 +1,31 @@ +# Цвет (Color) + +## Введение + +Поле **Color** используется для выбора и хранения значения цвета в HEX-формате (например, `#FF5733`). Оно удобно для визуального представления статусов, меток, категорий и других элементов интерфейса, где важна цветовая идентификация. + +## Настройка поля + +![20240512175956](https://static-docs.nocobase.com/20240512175956.png) + +## Инструкции + +### Основные особенности: + +- Поддерживает выбор цвета через визуальный color-picker; +- Значение сохраняется в формате HEX (`#RRGGBB`); +- Может отображаться как цветная метка в таблицах и карточках; +- Может быть связано с логикой отображения (например, статус = цвет). + +### Когда использовать: + +- Для цветовой маркировки записей (например, теги, статусы, категории); +- В интерфейсах, где визуальное различие имеет значение для пользователя; +- При необходимости быстрого визуального поиска по цветам. + +### Рекомендации: + +- Используйте понятные и отличимые цвета; +- Можно задать значения по умолчанию или ограничить палитру; +- Не полагайтесь только на цвет для передачи важной информации — дублируйте смысл текстом или иконками (в целях доступности). + diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/basic/email.md b/docs/ru-RU/handbook/data-modeling/collection-fields/basic/email.md new file mode 100644 index 0000000000..44923d0882 --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/basic/email.md @@ -0,0 +1,31 @@ +# Email + +## Введение + +Поле **Email** используется для хранения и валидации адресов электронной почты в формате `example@domain.com`. Оно обеспечивает базовую проверку корректности ввода и может применяться для уведомлений, авторизации и других функций, связанных с электронной почтой. + +## Настройка поля + +![20240512175609](https://static-docs.nocobase.com/20240512175609.png) + +## Инструкции + +### Основные особенности: + +- Поддерживает встроенную валидацию формата email; +- Хранит строку с email-адресом в стандарте RFC 5322; +- Может использоваться в форме входа, профилях пользователей, подписках и уведомлениях; +- Может быть уникальным — например, в коллекции пользователей. + +### Когда использовать: + +- Для хранения контактной информации пользователей; +- В системах с авторизацией по email; +- Для отправки уведомлений и писем через SMTP или внешние сервисы. + +### Рекомендации: + +- При необходимости — включайте проверку уникальности на уровне коллекции; +- Настраивайте маску отображения или ограничения (например, по домену); +- Валидация только формата не гарантирует, что адрес существует — используйте подтверждение по почте при критических действиях. + diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/basic/icon.md b/docs/ru-RU/handbook/data-modeling/collection-fields/basic/icon.md new file mode 100644 index 0000000000..5156d0b77d --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/basic/icon.md @@ -0,0 +1,31 @@ +# Иконка (Icon) + +## Введение + +Поле **Icon** позволяет выбрать и сохранить значение иконки из предварительно заданного набора. Оно используется для визуального представления объектов, категорий, статусов или действий в пользовательском интерфейсе. + +## Настройка поля + +![20240512180027](https://static-docs.nocobase.com/20240512180027.png) + +## Инструкции + +### Основные особенности: + +- Позволяет выбрать иконку из встроенной библиотеки (например, [Tabler Icons](https://tabler.io/icons) или аналогичной); +- Хранит значение иконки в виде строки (обычно это имя иконки); +- Может использоваться в качестве визуального дополнения в карточках, таблицах, кнопках и заголовках; +- Интерфейс выбора предоставляет предпросмотр всех доступных иконок. + +### Когда использовать: + +- Для визуального обозначения категорий, сущностей или действий; +- В навигационных элементах, меню, списках или статусных индикаторах; +- Для повышения читаемости и восприятия интерфейса. + +### Рекомендации: + +- Используйте иконки последовательно — один объект = одна иконка; +- Избегайте перегрузки интерфейса лишними иконками; +- При необходимости можно дополнительно визуализировать иконку вместе с цветом (в паре с полем Color). + diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/basic/input.md b/docs/ru-RU/handbook/data-modeling/collection-fields/basic/input.md new file mode 100644 index 0000000000..0a5ed5f8cb --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/basic/input.md @@ -0,0 +1,47 @@ +# Строка (VARCHAR) + +## Введение + +Поле **Строка (VARCHAR)** — это базовое текстовое поле для ввода данных. +Оно предназначено для ввода коротких строк текста до 255 символов, таких как названия, теги, логины, +комментарии и другие текстовые значения. Это одно из наиболее часто используемых полей в интерфейсе. + +## Настройка поля + +![20240512163555](https://static-docs.nocobase.com/20240512163555.png) + +## Конфигурация интерфейса UI + +### Режим редактирования + +Поле отображается в виде однострочного текстового поля, доступного для редактирования: + +![20240512164001](https://static-docs.nocobase.com/20240512164001.png) + +### Режим просмотра + +В режиме просмотра поле отображается в виде простого текста: + +![20240512164138](https://static-docs.nocobase.com/20240512164138.png) + +## Инструкции + +### Основные возможности: + +- Ввод и отображение строковых значений; +- Поддержка ограничений по длине, регулярных выражений, обязательности заполнения; +- Может быть использовано как поле поиска, фильтрации, меток и названий; +- Поддерживает плейсхолдеры, подсказки и форматирование отображения. + +### Когда использовать: + +- Для ввода короткого текста: имена, заголовки, единичные значения; +- В формах создания и редактирования записей; +- При необходимости гибкой валидации текстовых данных. + +### Рекомендации: + +- Настраивайте максимальная длинна 255 символов; +- При необходимости используйте регулярные выражения (`pattern`) для валидации формата; +- Указывайте placeholder и описание, чтобы повысить удобство использования для пользователей. + diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/basic/integer.md b/docs/ru-RU/handbook/data-modeling/collection-fields/basic/integer.md new file mode 100644 index 0000000000..a7780d520f --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/basic/integer.md @@ -0,0 +1,33 @@ +# Целое число (INTEGER) + +## Введение + +Поле **Целое число (INTEGER)** используется для хранения целочисленных значений. +Это может быть любое число без десятичной части — положительное, отрицательное или ноль. +Подходит для количества, порядковых номеров, баллов, рейтингов и других числовых данных. + +## Настройка поля + +![20240512175723](https://static-docs.nocobase.com/20240512175723.png) + +## Инструкции + +### Основные особенности: + +- Поддерживает только целые числа (без запятой/точки); +- Можно задать минимальное и максимальное допустимое значение; +- Поддерживает автоинкремент, уникальность, обязательность заполнения и другие ограничения; +- Может использоваться для вычислений, сортировки, фильтрации. + +### Когда использовать: + +- Для подсчёта количества: пользователей, товаров, очков и т. д.; +- Для хранения идентификаторов, номеров, индексов и порядковых значений; +- В интерфейсах, где требуется числовой ввод без дробной части. + +### Рекомендации: + +- Устанавливайте диапазон допустимых значений, если он известен; +- Используйте пользовательские сообщения об ошибках при валидации; +- Не путайте с полем **Number**, если требуется хранить дробные значения (например, `1.25`). + diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/basic/number.md b/docs/ru-RU/handbook/data-modeling/collection-fields/basic/number.md new file mode 100644 index 0000000000..0dada58a14 --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/basic/number.md @@ -0,0 +1,33 @@ +# Число c точкой (REAL) + +## Введение + +Поле **Число c точкой (REAL)** используется для хранения числовых значений с плавающей точкой. +Подходит для ввода и хранения как целых, так и дробных чисел (например: 12, 0.5, -3.1415). +Часто используется в расчётах, финансах, рейтингах, измерениях и других случаях, когда требуется точность. + +## Настройка поля + +![20240512175752](https://static-docs.nocobase.com/20240512175752.png) + +## Инструкции + +### Основные особенности: + +- Поддерживает дробные и целые значения; +- Можно задать минимальное и максимальное значение, а также количество знаков после запятой; +- Поддерживает валидацию, автоокругление и форматирование отображения; +- Может использоваться в вычислениях, графиках, аналитике. + +### Когда использовать: + +- Для хранения сумм, процентов, измерений, координат и других точных значений; +- При необходимости отображать числа с фиксированным количеством знаков после запятой; +- В бизнес-логике, где важна арифметическая точность. + +### Рекомендации: + +- Настраивайте количество знаков после запятой в зависимости от контекста использования; +- Указывайте плейсхолдеры и единицы измерения в описании поля; +- При необходимости комбинируйте с правилами округления и отображения чисел в пользовательском интерфейсе. + diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/basic/password.md b/docs/ru-RU/handbook/data-modeling/collection-fields/basic/password.md new file mode 100644 index 0000000000..74954bcabc --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/basic/password.md @@ -0,0 +1,33 @@ +# Пароль (Password) + +## Введение + +Поле **Password** используется для безопасного хранения паролей пользователей. При вводе данные скрываются и шифруются, чтобы обеспечить конфиденциальность и защиту от несанкционированного доступа. Это поле критично важно при реализации систем авторизации и регистрации. + +## Настройка поля + +![20240512175917](https://static-docs.nocobase.com/20240512175917.png) + +## Инструкции + +### Основные особенности: + +- Вводимые значения отображаются как точки (••••••); +- Пароль сохраняется в зашифрованном виде; +- Поддерживает проверку сложности (длина, символы, регулярные выражения и др.); +- Не отображается в режиме чтения (read-only); +- Может включать функцию подтверждения пароля (повторного ввода). + +### Когда использовать: + +- В коллекциях, связанных с пользователями и безопасностью (например, учетные записи, администраторы); +- Для реализации пользовательского входа или создания API-токенов, защищённых паролем; +- При необходимости защиты чувствительных действий или доступа. + +### Рекомендации: + +- Используйте параметры валидации сложности пароля (минимум 8 символов, строчные и заглавные буквы, цифры и спецсимволы); +- Обязательно используйте шифрование на уровне сервера (например, bcrypt); +- Не сохраняйте пароли в открытом виде и не отображайте их в интерфейсе; +- По возможности реализуйте двухфакторную аутентификацию (2FA) поверх базовой защиты. + diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/basic/percent.md b/docs/ru-RU/handbook/data-modeling/collection-fields/basic/percent.md new file mode 100644 index 0000000000..3efd51a1a1 --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/basic/percent.md @@ -0,0 +1,33 @@ +# Процент (Percent) + +## Введение + +Поле **Percent** предназначено для хранения и отображения процентных значений. +Это удобный формат для представления долей, скидок, выполнения задач, роста показателей и +других данных, выражаемых в процентах. + +## Настройка поля + +![20240512175847](https://static-docs.nocobase.com/20240512175847.png) + +## Инструкции + +### Основные особенности: + +- Хранит числовое значение и отображает его с символом `%`; +- Поддерживает дробные значения (например, `12.5%`); +- Можно задать минимальное и максимальное значение (обычно от `0` до `100`); +- Поддерживает валидацию, округление и настройку количества знаков после запятой. + +### Когда использовать: + +- Для отображения скидок, прогресса, успешности выполнения задач; +- При необходимости визуального сравнения долей и частей целого; +- В аналитических отчётах и пользовательских интерфейсах с акцентом на визуальные индикаторы. + +### Рекомендации: + +- Настраивайте точность отображения в зависимости от сценария (например, 1 или 2 знака после запятой); +- При вводе значений указывайте пользователю единицу измерения (в процентах); +- Учитывайте, что `100%` обычно означает завершённое действие, а `0%` — начало. + diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/basic/phone.md b/docs/ru-RU/handbook/data-modeling/collection-fields/basic/phone.md new file mode 100644 index 0000000000..34f330067f --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/basic/phone.md @@ -0,0 +1,31 @@ +# Телефон (Phone) + +## Введение + +Поле **Phone** используется для ввода и хранения телефонных номеров. Оно обеспечивает базовую валидацию формата номера и подходит для хранения контактной информации пользователей, клиентов, сотрудников и других сущностей. + +## Настройка поля + +![20240512175526](https://static-docs.nocobase.com/20240512175526.png) + +## Инструкции + +### Основные особенности: + +- Поддерживает ввод номера телефона в международном или локальном формате; +- Может включать автоматическую маску или шаблон (например, `+7 (___) ___-__-__`); +- Хранит значение как строку, чтобы сохранить форматирование; +- Может использоваться в сочетании с полем страны или кода региона. + +### Когда использовать: + +- Для хранения контактных данных пользователей, клиентов, подрядчиков; +- В формах регистрации, заказов, CRM-системах и справочниках; +- При необходимости дальнейшего использования номера для SMS-уведомлений или обратной связи. + +### Рекомендации: + +- Используйте маску ввода для унификации формата номеров; +- При необходимости добавьте отдельное поле для кода страны или используйте валидацию по шаблону; +- Храните номер в виде строки, чтобы избежать потери ведущих нулей или символов `+`. + diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/basic/textarea.md b/docs/ru-RU/handbook/data-modeling/collection-fields/basic/textarea.md new file mode 100644 index 0000000000..3f62a48467 --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/basic/textarea.md @@ -0,0 +1,45 @@ +# Многострочный текст (TextArea) + +## Введение + +Поле **TextArea** используется для ввода и хранения длинного текста, включающего несколько строк. Это идеальный выбор для описаний, комментариев, биографий, заметок и других расширенных текстовых данных. + +## Настройка поля + +![20240512165017](https://static-docs.nocobase.com/20240512165017.png) + +## Конфигурация интерфейса UI + +### Режим редактирования + +В режиме редактирования поле отображается в виде многострочного текстового поля: + +![20240512164001](https://static-docs.nocobase.com/20240512164001.png) + +### Режим просмотра + +В режиме просмотра отображается весь введённый текст в виде обычного абзаца: + +![20240512164138](https://static-docs.nocobase.com/20240512164138.png) + +## Инструкции + +### Основные особенности: + +- Поддерживает ввод текста на нескольких строках; +- Можно задать минимальную и максимальную длину текста; +- Поддерживает placeholder и описание поля; +- Можно использовать в сочетании с Markdown-рендерингом или форматированием (при необходимости). + +### Когда использовать: + +- Для описания сущностей, комментариев, пользовательских заметок, обратной связи и т.п.; +- В интерфейсах, где ожидается длинный ввод от пользователя; +- При необходимости гибкого текстового поля без строгих ограничений по содержанию. + +### Рекомендации: + +- Устанавливайте ограничения по длине текста, если это предусмотрено бизнес-логикой; +- Добавляйте пояснения или примеры ввода, чтобы помочь пользователю; +- Если необходимо форматирование — рассмотрите использование дополнительных редакторов или компонентов Markdown. + diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/basic/url.md b/docs/ru-RU/handbook/data-modeling/collection-fields/basic/url.md new file mode 100644 index 0000000000..4b3fc8b2d3 --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/basic/url.md @@ -0,0 +1,31 @@ +# URL + +## Введение + +Поле **URL** предназначено для хранения интернет-ссылок (Uniform Resource Locator). Оно автоматически проверяет корректность введённого значения и может использоваться для хранения ссылок на внешние сайты, изображения, документы, профили и другие онлайн-ресурсы. + +## Настройка поля + +![20240512175641](https://static-docs.nocobase.com/20240512175641.png) + +## Инструкции + +### Основные особенности: + +- Валидирует формат введённого URL (например, `https://example.com`); +- Может отображаться как активная гиперссылка в режиме просмотра; +- Поддерживает плейсхолдер, подсказки и ограничения по длине; +- Может быть использовано для генерации превью, открытия во внешней вкладке и др. + +### Когда использовать: + +- Для хранения ссылок на внешние ресурсы, изображения, сайты, соцсети; +- При необходимости интеграции с внешними сервисами или API; +- В интерфейсах, где пользователь вводит или редактирует адрес сайта. + +### Рекомендации: + +- Проверяйте, что URL начинается с `http://` или `https://`; +- Используйте ограничение длины, если требуется укоротить отображение; +- По желанию добавьте иконку или кнопку для перехода по ссылке напрямую из интерфейса. + diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/choices/checkbox-group.md b/docs/ru-RU/handbook/data-modeling/collection-fields/choices/checkbox-group.md new file mode 100644 index 0000000000..6b3590fc2a --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/choices/checkbox-group.md @@ -0,0 +1,9 @@ +# Группа флажков + +## Введение + +## Настройка полей + +## Инструкции + +to be added. diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/choices/checkbox.md b/docs/ru-RU/handbook/data-modeling/collection-fields/choices/checkbox.md new file mode 100644 index 0000000000..6f41661a1a --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/choices/checkbox.md @@ -0,0 +1,10 @@ +# Флажок + +## Введение + +## Настройка поля + +![20240512180122](https://static-docs.nocobase.com/20240512180122.png) + +## Инструкции +to be added. diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/choices/china-region.md b/docs/ru-RU/handbook/data-modeling/collection-fields/choices/china-region.md new file mode 100644 index 0000000000..bca481850f --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/choices/china-region.md @@ -0,0 +1,11 @@ +# Регион Китая + +## Введение + +## Конфигурация поля + +![20240512180305](https://static-docs.nocobase.com/20240512180305.png) + +## Instructions + +to be added. diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/choices/multiple-select.md b/docs/ru-RU/handbook/data-modeling/collection-fields/choices/multiple-select.md new file mode 100644 index 0000000000..635a874116 --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/choices/multiple-select.md @@ -0,0 +1,11 @@ +# Множественный выбор + +## Введение + +## Настройка поля + +![20240512180236](https://static-docs.nocobase.com/20240512180236.png) + +## Instructions + +to be added. diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/choices/radio-group.md b/docs/ru-RU/handbook/data-modeling/collection-fields/choices/radio-group.md new file mode 100644 index 0000000000..9a4b617951 --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/choices/radio-group.md @@ -0,0 +1,9 @@ +# Группа радиосвязи + +## Введение + +## Настройка поля + +## Инструкции + +to be added. diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/choices/select.md b/docs/ru-RU/handbook/data-modeling/collection-fields/choices/select.md new file mode 100644 index 0000000000..0392a02732 --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/choices/select.md @@ -0,0 +1,11 @@ +# Выбор (одиночный) + +## Введение + +## Настройка поля + +![20240512180203](https://static-docs.nocobase.com/20240512180203.png) + +## Instructions + +to be added. diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/datetime/date.md b/docs/ru-RU/handbook/data-modeling/collection-fields/datetime/date.md new file mode 100644 index 0000000000..959ee11ce3 --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/datetime/date.md @@ -0,0 +1,11 @@ +# Дата + +## Введение + +## Конфигурация поля + +![20240512181142](https://static-docs.nocobase.com/20240512181142.png) + +## Instructions + +to be added. diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/datetime/datetime-without-tz.md b/docs/ru-RU/handbook/data-modeling/collection-fields/datetime/datetime-without-tz.md new file mode 100644 index 0000000000..c2730ba81e --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/datetime/datetime-without-tz.md @@ -0,0 +1,11 @@ +# Дата и время (без указания часового пояса) + +## Введение + +## Настройка поля + +![20240512181142](https://static-docs.nocobase.com/20240512181142.png) + +## Instructions + +to be added. diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/datetime/datetime.md b/docs/ru-RU/handbook/data-modeling/collection-fields/datetime/datetime.md new file mode 100644 index 0000000000..14af7ceae9 --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/datetime/datetime.md @@ -0,0 +1,11 @@ +# Дата и время (с указанием часового пояса) + +## Введение + +## Настройка поля + +![20240512181142](https://static-docs.nocobase.com/20240512181142.png) + +## Instructions + +to be added. diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/datetime/index.md b/docs/ru-RU/handbook/data-modeling/collection-fields/datetime/index.md new file mode 100644 index 0000000000..993b2dfe54 --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/datetime/index.md @@ -0,0 +1,65 @@ +# Типы полей даты и времени + +## Классификация типов полей + +Типы полей даты и времени можно разделить на следующие категории: + +- **DateTime (с часовым поясом):** Значения стандартизированы в UTC (Всемирное координированное время) и могут корректироваться с учетом часовых поясов. +- **DateTime (без часового пояса):** Хранит дату и время без учета часового пояса. +- **Date (без времени):** Хранит только дату, без временной составляющей. +- **Time:** Хранит только время, без даты. +- **Unix Timestamp:** Количество секунд, прошедших с 1 января 1970 года. + +## Примеры значений + +| **Тип поля** | **Пример значения** | **Описание** | +|-------------------------------|---------------------------|--------------------------------------------------| +| DateTime (с часовым поясом) | 2024-08-24T07:30:00.000Z | Конвертируется в UTC с учетом часового пояса | +| DateTime (без часового пояса) | 2024-08-24 15:30:00 | Хранит дату и время без учета пояса | +| Date (без времени) | 2024-08-24 | Только дата | +| Time | 15:30:00 | Только время | +| Unix Timestamp | 1724437800 | Секунды с 1970-01-01 00:00:00 UTC | + +## Сравнение в разных СУБД + +| **Тип поля** | **NocoBase** | **MySQL** | **PostgreSQL** | +|-------------------------------|--------------------------|--------------------------|------------------------------------| +| DateTime (с поясом) | Datetime с timezone | TIMESTAMP/DATETIME | TIMESTAMP WITH TIME ZONE | +| DateTime (без пояса) | Datetime без timezone | DATETIME | TIMESTAMP WITHOUT TIME ZONE | +| Date (без времени) | Date | DATE | DATE | +| Time | Time | TIME | TIME WITHOUT TIME ZONE | +| Unix Timestamp | Unix timestamp | INTEGER/BIGINT | INTEGER/BIGINT | +| Time (с поясом) | - | - | TIME WITH TIME ZONE | + +**Примечание:** +- TIMESTAMP в MySQL поддерживает диапазон от `1970-01-01 00:00:01 UTC` до `2038-01-19 03:14:07 UTC`. Для значений вне этого диапазона рекомендуется использовать DATETIME или BIGINT. + +## Особенности хранения + +### С часовым поясом + +![Схема обработки](https://static-docs.nocobase.com/20240824191933.png) + +**Важно:** +- NocoBase использует тип DATETIME в MySQL для полей с часовым поясом +- Значения конвертируются на основе TZ-переменной сервера +- Прямое отображение UTC-значений может вызвать путаницу + +### Без часового пояса + +![Схема обработки](https://static-docs.nocobase.com/20240824185600.png) + +## UTC и локальное время + +UTC (Всемирное координированное время) - глобальный стандарт времени. Разница между UTC и локальным временем может вызывать путаницу: + +| **Часовой пояс** | **DateTime** | +|------------------|--------------------------| +| UTC | 2024-08-24T07:30:00.000Z | +| UTC+8 | 2024-08-24 15:30:00 | +| UTC+5 | 2024-08-24 12:30:00 | +| UTC-5 | 2024-08-24 02:30:00 | +| UTC+0 | 2024-08-24 07:30:00 | +| UTC-6 | 2024-08-23 01:30:00 | + +Все эти значения представляют один и тот же момент времени в разных часовых поясах. diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/datetime/time.md b/docs/ru-RU/handbook/data-modeling/collection-fields/datetime/time.md new file mode 100644 index 0000000000..8d94487ddc --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/datetime/time.md @@ -0,0 +1,11 @@ +# Время + +## Введение + +## Настройка поля + +![20240512181216](https://static-docs.nocobase.com/20240512181216.png) + +## Instructions + +to be added. diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/datetime/unix-timestamp.md b/docs/ru-RU/handbook/data-modeling/collection-fields/datetime/unix-timestamp.md new file mode 100644 index 0000000000..423b3e5542 --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/datetime/unix-timestamp.md @@ -0,0 +1,11 @@ +# Временная метка Unix + +## Введение + +## Конфигурация поля + +![20240512180432](https://static-docs.nocobase.com/20240512180432.png) + +## Instructions + +to be added. diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/geometric/circle.md b/docs/ru-RU/handbook/data-modeling/collection-fields/geometric/circle.md new file mode 100644 index 0000000000..58fcf5b1b0 --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/geometric/circle.md @@ -0,0 +1,11 @@ +# Круг + +## Введение + +## Конфигурация поля + +![20240512181522](https://static-docs.nocobase.com/20240512181522.png) + +## Instructions + +to be added. diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/geometric/line.md b/docs/ru-RU/handbook/data-modeling/collection-fields/geometric/line.md new file mode 100644 index 0000000000..2e624e4ae1 --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/geometric/line.md @@ -0,0 +1,11 @@ +# Строка + +## Введение + +## Конфигурация поля + +![20240512181454](https://static-docs.nocobase.com/20240512181454.png) + +## Instructions + +to be added. diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/geometric/point.md b/docs/ru-RU/handbook/data-modeling/collection-fields/geometric/point.md new file mode 100644 index 0000000000..53d9b8e19a --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/geometric/point.md @@ -0,0 +1,11 @@ +# Точка зрения + +## Введение + +## Конфигурация поля + +![20240512181420](https://static-docs.nocobase.com/20240512181420.png) + +## Instructions + +to be added. diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/geometric/polygon.md b/docs/ru-RU/handbook/data-modeling/collection-fields/geometric/polygon.md new file mode 100644 index 0000000000..3dc35a5c3a --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/geometric/polygon.md @@ -0,0 +1,11 @@ +# Полигон + +## Введение + +## Конфигурация поля + +![20240512181547](https://static-docs.nocobase.com/20240512181547.png) + +## Instructions + +to be added. diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/index.md b/docs/ru-RU/handbook/data-modeling/collection-fields/index.md new file mode 100644 index 0000000000..cec6861c45 --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/index.md @@ -0,0 +1,30 @@ +# Обзор + +## Типы интерфейсов полей +С точки зрения интерфейса, NocoBase классифицирует поля на следующие категории: + +![20240512110352](https://static-docs.nocobase.com/20240512110352.png) + +## Типы данных полей +Каждому интерфейсу поля соответствует тип данных по умолчанию. +Например, для интерфейсов с типом "Число" по умолчанию используется тип `double`, +но также доступны `float`, `decimal` и другие. +В настоящее время поддерживаются следующие типы данных: + +![20240512103733](https://static-docs.nocobase.com/20240512103733.png) + +## Сопоставление типов полей +Процесс добавления нового поля в основную базу данных включает следующие шаги: + +1. Выбор типа интерфейса; +2. Настройка (при необходимости) конкретного типа данных, соответствующего интерфейсу. + +![20240512172416](https://static-docs.nocobase.com/20240512172416.png) + +Процесс сопоставления полей из внешних источников данных следующий: + +1. Автоматическое определение соответствующего типа данных (Field type) и интерфейса (Field Interface) +на основе типа поля во внешней базе данных; +2. При необходимости — изменение на более подходящие типы данных и интерфейс. + +![20240512172759](https://static-docs.nocobase.com/20240512172759.png) diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/media/field-attachment.md b/docs/ru-RU/handbook/data-modeling/collection-fields/media/field-attachment.md new file mode 100644 index 0000000000..86fbf225c0 --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/media/field-attachment.md @@ -0,0 +1,3 @@ +# Поле для прикрепления + + diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/media/markdown.md b/docs/ru-RU/handbook/data-modeling/collection-fields/media/markdown.md new file mode 100644 index 0000000000..e7792c7b9a --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/media/markdown.md @@ -0,0 +1,11 @@ +# Уценка + +## Введение + +## Настройка полей + +![20240512181311](https://static-docs.nocobase.com/20240512181311.png) + +## Инструкции + +будут добавлены позднее. diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/media/rich-text.md b/docs/ru-RU/handbook/data-modeling/collection-fields/media/rich-text.md new file mode 100644 index 0000000000..0237f0bf02 --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/media/rich-text.md @@ -0,0 +1,11 @@ +# Форматированный текст + +## Введение + +## Настройка полей + +![20240512181002](https://static-docs.nocobase.com/20240512181002.png) + +## Инструкции + +будут добавлены позднее. diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/system-info/created-at.md b/docs/ru-RU/handbook/data-modeling/collection-fields/system-info/created-at.md new file mode 100644 index 0000000000..084540dd4d --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/system-info/created-at.md @@ -0,0 +1,11 @@ +# Создано по адресу + +## Введение + +## Настройка поля + +![20240512174347](https://static-docs.nocobase.com/20240512174347.png) + +## Инструкции + +будут добавлены позднее. diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/system-info/table-oid.md b/docs/ru-RU/handbook/data-modeling/collection-fields/system-info/table-oid.md new file mode 100644 index 0000000000..bcfa92c961 --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/system-info/table-oid.md @@ -0,0 +1,11 @@ +# Идентификатор таблицы + +## Введение + +## Конфигурация поля + +![20240512174746](https://static-docs.nocobase.com/20240512174746.png) + +## Инструкции + +будут добавлены позднее. diff --git a/docs/ru-RU/handbook/data-modeling/collection-fields/system-info/updated-at.md b/docs/ru-RU/handbook/data-modeling/collection-fields/system-info/updated-at.md new file mode 100644 index 0000000000..620ba389cb --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection-fields/system-info/updated-at.md @@ -0,0 +1,11 @@ +# Обновлено по адресу + +## Введение + +## Конфигурация поля + +![20240512174826](https://static-docs.nocobase.com/20240512174826.png) + +## Инструкции + +будут добавлены позднее. diff --git a/docs/ru-RU/handbook/data-modeling/collection.md b/docs/ru-RU/handbook/data-modeling/collection.md new file mode 100644 index 0000000000..7cd4c13a06 --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/collection.md @@ -0,0 +1,17 @@ +# Обзор + +NocoBase предоставляет уникальный DSL (доменно-ориентированный язык) для описания структуры данных — так называемую *Коллекцию (Collection)*. Этот подход позволяет унифицировать структуру данных из различных источников и обеспечивает надёжную основу для управления данными, их анализа и применения. + +![20240512161522](https://static-docs.nocobase.com/20240512161522.png) + +Для удобной работы с различными моделями данных поддерживаются следующие типы коллекций: + +- [Обычная коллекция](/handbook/data-source-main/general-collection): Содержит встроенные системные поля по умолчанию; +- [Коллекция-наследник](/handbook/data-source-main/inheritance-collection): Позволяет создать родительскую коллекцию и на её основе дочернюю, унаследовав структуру, но с возможностью добавления собственных столбцов; +- [Деревовидная коллекция](/handbook/collection-tree): Иерархическая структура данных (в текущей версии поддерживается только модель смежных списков); +- [Календарная коллекция](/handbook/calendar/calendar-collection): Используется для событий, связанных с календарём; +- [Коллекция файлов](/handbook/file-manager/file-collection): Применяется для хранения и управления файлами; +- [Коллекция выражений](/handbook/workflow-dynamic-calculation/expression): Используется в workflow-сценариях с динамическими вычислениями; +- [SQL-коллекция](/handbook/collection-sql): Не является реальной таблицей в базе данных, но позволяет структурированно представлять SQL-запросы; +- [Подключение к представлениям БД](/handbook/collection-view): Подключение к существующим представлениям в базе данных; +- [Подключение к внешним источникам данных](/handbook/collection-fdw): Позволяет напрямую обращаться к внешним источникам данных через FDW-технологию. diff --git a/docs/ru-RU/handbook/data-modeling/data-source.md b/docs/ru-RU/handbook/data-modeling/data-source.md new file mode 100644 index 0000000000..946ad0ae03 --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/data-source.md @@ -0,0 +1,2 @@ +# Обзор источников данных + diff --git a/docs/ru-RU/handbook/data-modeling/index.md b/docs/ru-RU/handbook/data-modeling/index.md new file mode 100644 index 0000000000..fbb764f66f --- /dev/null +++ b/docs/ru-RU/handbook/data-modeling/index.md @@ -0,0 +1,60 @@ +# Обзор + +Моделирование данных — это ключевой этап в проектировании баз данных. +Оно включает в себя глубокий анализ и абстрагирование различных данных и их взаимосвязей в реальном мире. +В ходе этого процесса мы стремимся выявить внутренние связи между данными и формализовать их в виде моделей данных, +создавая основу для структуры базы данных информационной системы. +NocoBase — это платформа, основанная на модели данных, обладающая следующими возможностями: + +## Поддержка различных источников данных + +Источник данных в NocoBase может быть представлен как обычными базами данных, +так и API (SDK) платформами или файлами. + +![20240512085558](https://static-docs.nocobase.com/20240512085558.png) + +NocoBase предоставляет [менеджер источников данных](/handbook/data-source-manager) для управления различными источниками данных и их таблицами. +Плагин менеджера источников данных предоставляет только интерфейс управления и не обладает возможностью подключения к самим источникам. +Для этого необходимо использовать соответствующие плагины источников данных. +В настоящее время поддерживаются следующие источники: + +- [Основная база данных](/handbook/data-source-main): Основная БД NocoBase с поддержкой реляционных СУБД (MySQL, PostgreSQL, SQLite и др.); +- [Внешний MySQL](/handbook/data-source-external-mysql): Использование внешней базы данных MySQL; +- [Внешний MariaDB](/handbook/data-source-external-mariadb): Использование внешней базы данных MariaDB; +- [Внешний PostgreSQL](/handbook/data-source-external-postgres): Использование внешней базы данных PostgreSQL. + +![20240512083651](https://static-docs.nocobase.com/20240512083651.png) + +## Широкие возможности моделирования данных + +**Простой интерфейс управления таблицами** — используется для создания новых моделей (таблиц данных) или подключения к существующим. + +![20240512090751](https://static-docs.nocobase.com/20240512090751.png) + +**Визуальный интерфейс в стиле ER-диаграмм** — позволяет извлекать сущности и их связи из пользовательских или бизнес-требований. +Это интуитивно понятный способ описания моделей данных. +С помощью ER-диаграмм вы можете наглядно видеть основные сущности системы и их взаимосвязи. + +![20240512091042](https://static-docs.nocobase.com/20240410075906.png) + +## Поддержка различных типов коллекций данных + +- [Обычная коллекция](/handbook/data-source-main/general-collection): Включает системные поля по умолчанию; +- [Коллекция-наследник](/handbook/data-source-main/inheritance-collection): Позволяет создать родительскую коллекцию и на её основе — дочернюю, наследующую структуру, но с возможностью добавления собственных столбцов; +- [Деревовидная коллекция](/handbook/collection-tree): Коллекция с древовидной структурой (поддерживается только смежная модель); +- [Календарная коллекция](/handbook/calendar/calendar-collection): Используется для событий, связанных с календарём; +- [Коллекция файлов](/handbook/file-manager/file-collection): Хранение и управление файлами; +- [Коллекция выражений](/handbook/workflow-dynamic-calculation/expression): Для сценариев с динамическими вычислениями в workflow; +- [SQL-коллекция](/handbook/collection-sql): Не является физической таблицей в БД, но позволяет отображать SQL-запросы в структурированном виде; +- [Подключение к представлениям БД](/handbook/collection-view): Подключение к существующим представлениям в базе данных; +- [Подключение к внешним данным](/handbook/collection-fdw): Доступ к внешним источникам данных с использованием технологии FDW. + +![20240512102212](https://static-docs.nocobase.com/20240512102212.png) + +Больше информации — в разделе [«Коллекции / Обзор»](/handbook/data-modeling/collection). + +## Богатый выбор типов полей + +![20240512110352](https://static-docs.nocobase.com/20240512110352.png) + +Больше информации — в разделе [«Поля коллекции / Обзор»](/handbook/data-modeling/collection-fields). diff --git a/docs/ru-RU/handbook/data-source-external-mariadb/index.md b/docs/ru-RU/handbook/data-source-external-mariadb/index.md new file mode 100644 index 0000000000..057e5a6d3d --- /dev/null +++ b/docs/ru-RU/handbook/data-source-external-mariadb/index.md @@ -0,0 +1,17 @@ +# Внешний источник данных - MariaDB + + + +## Введение + +Используйте внешнюю базу данных MariaDB в качестве источника данных. Текущие поддерживаемые версии: MariaDB >= 10.3 + +## Установка + +Этот плагин является коммерческим плагином, который необходимо загрузить и активировать через менеджер плагинов. + +![20240323162741](https://static-docs.nocobase.com/20240323162741.png) + +## Инструкции по использованию + +См. раздел [Источник данных / Внешняя база данных](/handbook/data-source-manager/external-database). diff --git a/docs/ru-RU/handbook/data-source-external-mssql/index.md b/docs/ru-RU/handbook/data-source-external-mssql/index.md new file mode 100644 index 0000000000..594761ea40 --- /dev/null +++ b/docs/ru-RU/handbook/data-source-external-mssql/index.md @@ -0,0 +1,17 @@ +# Внешний источник данных — MSSQL + + + +## Введение + +Используйте внешнюю базу данных MSSQL в качестве источника данных. В настоящее время поддерживаются версии: SQL Server 2014-2019 + +## Установка + +Этот плагин — коммерческий плагин, который необходимо загрузить и активировать через менеджер плагинов. + +![20240323162741](https://static-docs.nocobase.com/20240323162741.png) + +## Инструкции по использованию + +См. раздел [Источник данных / Внешняя база данных](/handbook/data-source-manager/external-database). diff --git a/docs/ru-RU/handbook/data-source-external-mysql/index.md b/docs/ru-RU/handbook/data-source-external-mysql/index.md new file mode 100644 index 0000000000..ca7b916b01 --- /dev/null +++ b/docs/ru-RU/handbook/data-source-external-mysql/index.md @@ -0,0 +1,17 @@ +# Внешний источник данных — MySQL + + + +## Введение + +Используйте внешнюю базу данных MySQL в качестве источника данных. В настоящее время поддерживаются версии: MySQL >= 5.7 + +## Установка + +Этот плагин — коммерческий плагин, который необходимо загрузить и активировать через менеджер плагинов. + +![20240323162741](https://static-docs.nocobase.com/20240323162741.png) + +## Инструкции по использованию + +См. раздел [Источник данных / Внешняя база данных](/handbook/data-source-manager/external-database). diff --git a/docs/ru-RU/handbook/data-source-external-oracle/index.md b/docs/ru-RU/handbook/data-source-external-oracle/index.md new file mode 100644 index 0000000000..788e4c3cac --- /dev/null +++ b/docs/ru-RU/handbook/data-source-external-oracle/index.md @@ -0,0 +1,38 @@ +# Внешний источник данных — Oracle + + + +## Введение + +Этот плагин позволяет использовать внешнюю базу данных Oracle в качестве источника данных. Он поддерживает версии Oracle >= 11g. + +## Установка + +### Установка клиента Oracle + +Для версий сервера Oracle ниже 12.1 необходимо установить клиент Oracle. + +![Установка клиента Oracle](https://static-docs.nocobase.com/20241204164359.png) + +Пример для Linux: + +```bash +apt-get update +apt-get install -y unzip wget libaio1 +wget https://download.oracle.com/otn_software/linux/instantclient/1925000/instantclient-basic-linux.x64-19.25.0.0.0dbru.zip +unzip instantclient-basic-linux.x64-19.25.0.0.0dbru.zip -d /opt/ +echo /opt/instantclient_19_25 > /etc/ld.so.conf.d/oracle-instantclient.conf +ldconfig +``` + +Если клиент не установлен, как описано выше, вам нужно будет указать путь к клиенту (для получения более подробной информации обратитесь к [документации node-oracledb](https://node-oracledb.readthedocs.io/en/latest/user_guide/initialization.html)). + +![Конфигурация пути клиента Oracle](https://static-docs.nocobase.com/20241204165940.png) + +### Установка плагина + +Следуйте инструкциям в [Установка и обновление коммерческих плагинов](/welcome/getting-started/plugin). + +## Примеры использования + +Для получения подробных инструкций обратитесь к разделу [Источник данных / Внешняя база данных](/handbook/data-source-manager/external-database). diff --git a/docs/ru-RU/handbook/data-source-external-postgres/index.md b/docs/ru-RU/handbook/data-source-external-postgres/index.md new file mode 100644 index 0000000000..ac61cb8500 --- /dev/null +++ b/docs/ru-RU/handbook/data-source-external-postgres/index.md @@ -0,0 +1,17 @@ +# Внешний источник данных — PostgreSQL + + + +## Введение + +Используйте внешнюю базу данных PostgreSQL в качестве источника данных. В настоящее время поддерживаются версии: PostgreSQL >= 9.5 + +## Установка + +Этот плагин — коммерческий плагин, который необходимо загрузить и активировать через менеджер плагинов. + +![20240323162741](https://static-docs.nocobase.com/20240323162741.png) + +## Инструкции по использованию + +См. раздел [Источник данных / Внешняя база данных](/handbook/data-source-manager/external-database). diff --git a/docs/ru-RU/handbook/data-source-kingbase/index.md b/docs/ru-RU/handbook/data-source-kingbase/index.md new file mode 100644 index 0000000000..db445aa8ed --- /dev/null +++ b/docs/ru-RU/handbook/data-source-kingbase/index.md @@ -0,0 +1,137 @@ +# Источник данных — База данных KingbaseES + + + +## Введение + +KingbaseES можно использовать как источник данных, как в качестве основной базы данных, так и в качестве внешней базы данных. + +:::warning +В настоящее время поддерживаются только базы данных KingbaseES, работающие в режиме pg. +::: + +## Установка + +### Использование в качестве основной базы данных + +Ознакомьтесь с [Обзором установки](/welcome/getting-started/installation) для получения информации о процедурах настройки, разница в основном связана с переменными среды. + +#### Переменные среды + +Отредактируйте файл .env, чтобы добавить или изменить следующие конфигурации переменных среды: + +```bash +# For accessing commercial plugins +NOCOBASE_PKG_URL=https://pkg.nocobase.com/ +NOCOBASE_PKG_USERNAME=your-username # Service platform username +NOCOBASE_PKG_PASSWORD=your-password # Service platform password + +# Adjust DB parameters as needed +DB_DIALECT=kingbase +DB_HOST=localhost +DB_PORT=54321 +DB_DATABASE=kingbase +DB_USER=nocobase +DB_PASSWORD=nocobase +``` + +#### Установка через Docker compose + +```yml +version: "3" + +networks: + nocobase: + driver: bridge + + app: + image: registry.cn-shanghai.aliyuncs.com/nocobase/nocobase:latest + restart: always + networks: + - nocobase + depends_on: + - postgres + environment: + # For accessing commercial plugins + - NOCOBASE_PKG_URL=https://pkg.nocobase.com/ + - NOCOBASE_PKG_USERNAME=your-username # Service platform username + - NOCOBASE_PKG_PASSWORD=your-password # Service platform password + # Application key for generating user tokens, etc. + # Changing APP_KEY invalidates old tokens + # Use a random string and keep it confidential + - APP_KEY=your-secret-key + # Database type + - DB_DIALECT=kingbase + # Database host, replace with existing database server IP if needed + - DB_HOST=kingbase + # Database name + - DB_DATABASE=kingbase + # Database user + - DB_USER=nocobase + # Database password + - DB_PASSWORD=nocobase + # Timezone + - TZ=UTC + volumes: + - ./storage:/app/nocobase/storage + ports: + - "13000:80" + + # Служба Kingbase только для целей тестирования + kingbase: + image: registry.cn-shanghai.aliyuncs.com/nocobase/kingbase:v009r001c001b0030_single_x86 + platform: linux/amd64 + restart: always + privileged: true + networks: + - nocobase + volumes: + - ./storage/db/kingbase:/home/kingbase/userdata + environment: + ENABLE_CI: no # Must be set to no + DB_USER: nocobase + DB_PASSWORD: nocobase + DB_MODE: pg # pg only + NEED_START: yes + command: ["/usr/sbin/init"] +``` + +#### Установка с помощью create-nocobase-app + +```bash +yarn create nocobase-app my-nocobase-app -d kingbase \ + -e DB_HOST=localhost \ + -e DB_PORT=54321 \ + -e DB_DATABASE=kingbase \ + -e DB_USER=nocobase \ + -e DB_PASSWORD=nocobase \ + -e TZ=UTC +``` + +### Использование в качестве внешней базы данных + +Отредактируйте файл .env, чтобы добавить переменные среды для доступа к коммерческим плагинам: + +```bash +# For accessing commercial plugins +NOCOBASE_PKG_URL=https://pkg.nocobase.com/ +NOCOBASE_PKG_USERNAME=your-username # Service platform username +NOCOBASE_PKG_PASSWORD=your-password # Service platform password +``` + +Выполните команду установки или обновления + +```bash +yarn nocobase install +# or +yarn nocobase upgrade +``` + +Активируйте плагин + +![20241024121815](https://static-docs.nocobase.com/20241024121815.png) + +## Руководство пользователя + +- Первичная база данных: см. [руководство](/handbook) +- Внешняя база данных: см. [Источник данных / Внешняя база данных](/handbook/data-source-manager/external-database) diff --git a/docs/ru-RU/handbook/data-source-main/general-collection.md b/docs/ru-RU/handbook/data-source-main/general-collection.md new file mode 100644 index 0000000000..dd5d253e5b --- /dev/null +++ b/docs/ru-RU/handbook/data-source-main/general-collection.md @@ -0,0 +1,10 @@ +# Общая коллекция + + + +## Введение +Используется в большинстве сценариев. Общую коллекцию можно использовать, если не требуется специальные коллекции. + +## Руководство пользователя + +![20240324085739](https://static-docs.nocobase.com/20240324085739.png) diff --git a/docs/ru-RU/handbook/data-source-main/index.md b/docs/ru-RU/handbook/data-source-main/index.md new file mode 100644 index 0000000000..3f802b76aa --- /dev/null +++ b/docs/ru-RU/handbook/data-source-main/index.md @@ -0,0 +1,39 @@ +# Основная база данных + + + +## Введение + +Основная база данных NocoBase может использоваться для хранения как бизнес-данных, так и метаданных приложения, включая данные системных таблиц и +данные пользовательских таблиц. +Основная база данных поддерживает реляционные базы данных, такие как MySQL, PostgreSQL и т. д. Во время установки приложения NocoBase основная база данных должна быть установлена одновременно и не может быть удалена. + +## Установка + +Это встроенный плагин, отдельная установка не требуется. + +## Руководство пользователя + +![20240322230134](https://static-docs.nocobase.com/20240322230134.png) + +### Поддержка создания различных таблиц данных + +- [Общая коллекция](/handbook/data-source-main/general-collection): встроенные часто используемые системные поля; +- [Коллекция наследования](/handbook/data-source-main/inheritance-collection): позволяет создать родительскую таблицу, из которой могут быть получены дочерние таблицы. Дочерние таблицы унаследуют структуру родительской таблицы, а также могут определять собственные столбцы. +- [Коллекция дерева](/handbook/collection-tree): древовидная таблица, в настоящее время поддерживает только дизайн смежных таблиц; +- [Коллекция календаря](/handbook/calendar/calendar-collection): для создания таблиц событий, связанных с календарем; +- [Коллекция файлов](/handbook/file-manager/file-collection): для управления хранилищем файлов; +- [Коллекция выражений](/handbook/workflow-dynamic-calculation/expression): для сценариев динамических выражений в рабочих процессах; +- [Коллекция SQL](/handbook/collection-sql): не является фактической таблицей базы данных, но быстро представляет SQL-запрос в структурированном виде; +- [Коллекция представлений базы данных](/handbook/collection-view): подключается к существующему представлению базы данных; +- [Коллекция FDW](/handbook/collection-fdw): позволяет системе базы данных напрямую получать доступ и запрашивать данные во внешних источниках данных на основе технологии FDW; + +### Поддержка управления классификацией коллекций + +![20240322231520](https://static-docs.nocobase.com/20240322231520.png) + +### Предложение широкого спектра типов полей + +![20240322230950](https://static-docs.nocobase.com/20240322230950.png) + +Подробнее см. в разделе [Поля таблиц данных / Обзор](/handbook/data-modeling/collection-fields). diff --git a/docs/ru-RU/handbook/data-source-main/inheritance-collection.md b/docs/ru-RU/handbook/data-source-main/inheritance-collection.md new file mode 100644 index 0000000000..07b9d7658d --- /dev/null +++ b/docs/ru-RU/handbook/data-source-main/inheritance-collection.md @@ -0,0 +1,20 @@ +# Коллекция наследования + + + +## Введение + +Вы можете создать родительскую коллекцию и вывести дочернюю коллекцию из этой родительской коллекции. Дочерняя коллекция унаследует структуру родительской коллекции, а также может определять свои собственные столбцы. Этот шаблон проектирования помогает организовывать и управлять данными с похожими структурами, но возможными различиями. + +Вот некоторые общие черты поддержки наследуемых коллекций: + +- Родительская коллекция: родительская коллекция содержит общие столбцы и данные, определяющие базовую структуру всей иерархии наследования. +- Дочерняя коллекция: дочерняя коллекция наследует структуру родительской коллекции, но также может определять свои собственные столбцы. Это позволяет каждой дочерней коллекции иметь общие свойства родительской коллекции, при этом содержа атрибуты, специфичные для подкласса. +- Запрос: при запросе вы можете выбрать запрос всей иерархии наследования, только родительской коллекции или определенной дочерней коллекции. Это позволяет извлекать и обрабатывать различные уровни данных по мере необходимости. +- Отношение наследования: устанавливается отношение наследования между родительской коллекцией и дочерней коллекцией, что означает, что структура родительской коллекции может использоваться для определения согласованных атрибутов, позволяя при этом дочерней коллекции расширять или переопределять эти атрибуты. + +Этот шаблон проектирования помогает уменьшить избыточность данных, упростить модель базы данных и сделать данные более удобными для обслуживания. Однако его следует использовать с осторожностью, поскольку наследуемые коллекции могут повысить сложность запросов, особенно при работе со всей иерархией наследования. Базы данных, которые поддерживают наследуемые коллекции, обычно предоставляют определенный синтаксис и инструменты для управления и запроса этих структур коллекций. + +## Руководство пользователя + +![20240324085907](https://static-docs.nocobase.com/20240324085907.png) diff --git a/docs/ru-RU/handbook/data-source-manager/external-database.md b/docs/ru-RU/handbook/data-source-manager/external-database.md new file mode 100644 index 0000000000..16d14b2eec --- /dev/null +++ b/docs/ru-RU/handbook/data-source-manager/external-database.md @@ -0,0 +1,88 @@ +# Обзор + +## Введение + +Используйте существующую внешнюю базу данных в качестве источника данных. В настоящее время поддерживаются внешние базы данных MySQL, MariaDB и PostgreSQL. + +## Инструкции по использованию + +### Добавление внешней базы данных + +После активации плагина вы можете выбрать и добавить его из раскрывающегося меню Добавить новый в управлении источником данных. + +![20240507204316](https://static-docs.nocobase.com/20240507204316.png) + +Заполните информацию о базе данных, к которой необходимо подключиться. + +![20240507204820](https://static-docs.nocobase.com/20240507204820.png) + +### Синхронизация таблиц данных + +После установления соединения с внешней базой данных все таблицы данных в источнике данных будут напрямую считываться. Внешняя база данных не поддерживает прямое добавление таблиц данных или изменение структур таблиц. Если необходимы изменения, их можно внести через клиент базы данных, а затем нажать кнопку «Обновить» в интерфейсе для синхронизации. + +![20240507204725](https://static-docs.nocobase.com/20240507204725.png) + +### Настройка полей + +Внешняя база данных автоматически считывает поля существующих таблиц данных и отображает их. Вы можете быстро просмотреть и настроить заголовок поля, тип данных (тип поля) и тип пользовательского интерфейса (интерфейс поля). Вы также можете нажать кнопку «Изменить», чтобы изменить больше конфигураций. + +![20240507210537](https://static-docs.nocobase.com/20240507210537.png) + +Поскольку внешняя база данных не поддерживает изменение структур таблиц, единственным типом, доступным при добавлении новых полей, является поле отношения. Поля отношения не являются настоящими полями, но используются для установления связей между таблицами. + +![20240507220140](https://static-docs.nocobase.com/20240507220140.png) + +Более подробную информацию см. в разделе [Поля коллекции/Обзор](/handbook/data-modeling/collection-fields). + +### Сопоставление типов полей + +NocoBase автоматически сопоставит соответствующий тип данных (тип поля) и тип пользовательского интерфейса (интерфейс поля) для типов полей внешней базы данных. + +- Тип данных (тип поля): используется для определения вида, формата и структуры данных, которые может хранить поле. +- Тип пользовательского интерфейса (интерфейс поля): относится к типу элемента управления, используемого для отображения и ввода значений полей в пользовательском интерфейсе. + +В таблице ниже показано сопоставление типов полей для PostgreSQL, MySQL/MariaDB с типом данных NocoBase и типом интерфейса NocoBase. + +| PostgreSQL | MySQL/MariaDB | NocoBase Data Type | NocoBase Interface Type | +| - | - | - | - | +| BOOLEAN | BOOLEAN
    TINYINT(1) | boolean | checkbox
    switch | +| SMALLINT
    INTEGER
    SERIAL
    SMALLSERIAL | TINYINT
    SMALLINT
    MEDIUMINT
    INTEGER | integer
    boolean
    sort | integer
    sort
    checkbox
    switch
    select
    radioGroup | +| BIGINT
    BIGSERIAL | BIGINT | bigInt
    sort | integer
    sort
    checkbox
    switch
    select
    radioGroup
    unixTimestamp
    createdAt
    updatedAt | +| REAL | FLOAT | float | number
    percent | +| DOUBLE PRECISION | DOUBLE PRECISION | double | number
    percent | +| DECIMAL
    NUMERIC | DECIMAL | decimal | number
    percent
    currency | +| VARCHAR
    CHAR | VARCHAR
    CHAR | string
    password
    uuid
    nanoid | input
    email
    phone
    password
    color
    icon
    select
    radioGroup
    uuid
    nanoid | +| TEXT | TEXT
    TINYTEXT
    MEDIUMTEXT
    LONGTEXT | text
    json | textarea
    markdown
    vditor
    richText
    url
    json | +| UUID | - | uuid | uuid | +| JSON
    JSONB | JSON | json | json | +| TIMESTAMP | DATETIME
    TIMESTAMP | date | date
    time
    createdAt
    updatedAt | +| DATE | DATE | dateOnly | datetime | +| TIME | TIME | time | time | +| - | YEAR | | datetime | +| CIRCEL | | circle | json
    circle | +| PATH
    GEOMETRY(LINESTRING) | LINESTRING | lineString | Json
    lineString | +| POINT
    GEOMETRY(POINT) | POINT | point | json
    point | +| POLYGON
    GEOMETRY(POLYGON) | POLYGON | polygon | json
    polygon | +| GEOMETRY | GEOMETRY | - | - | +| BLOB | BLOB | blob | - | +| ENUM | ENUM | enum | select
    radioGroup | +| ARRAY | - | array | multipleSelect
    checkboxGroup | +| BIT | BIT | - | - | +| SET | SET | set | multipleSelect
    checkboxGroup | +| RANGE | - | - | - | + +### Неподдерживаемые типы полей + +Неподдерживаемые типы полей будут отображаться отдельно. Эти поля необходимо разработать для адаптации, прежде чем их можно будет использовать. + +![20240507221854](https://static-docs.nocobase.com/20240507221854.png) + +### Ключ фильтра-цели + +Таблицы данных, отображаемые в виде блоков, должны иметь настроенный ключ фильтра-цели. Ключ фильтра-цели относится к фильтрации данных на основе определенного поля, а значение поля должно быть уникальным. Ключ фильтра-цели по умолчанию соответствует полю первичного ключа таблицы данных. Если это представление или таблица данных без первичного ключа или таблица данных с составным первичным ключом, вам необходимо настроить ключ фильтра-цели. + +![20240507210230](https://static-docs.nocobase.com/20240507210230.png) + +Только таблицы данных, которые установили целевой ключ фильтра, могут быть добавлены на страницу. + +![20240507222827](https://static-docs.nocobase.com/20240507222827.png) diff --git a/docs/ru-RU/handbook/data-source-manager/index.md b/docs/ru-RU/handbook/data-source-manager/index.md new file mode 100644 index 0000000000..a81dcf5229 --- /dev/null +++ b/docs/ru-RU/handbook/data-source-manager/index.md @@ -0,0 +1,30 @@ +# Менеджер источников данных + + + +## Введение + +NocoBase предоставляет плагин управления источниками данных для управления источниками данных и их таблицами данных. Плагин управления источниками данных предоставляет только интерфейс управления для всех источников данных и не предоставляет возможность доступа к источникам данных. Его необходимо использовать в сочетании с различными плагинами источников данных. В настоящее время поддерживаются следующие источники данных для доступа: + +- [Основная база данных](/handbook/data-source-main): Основная база данных NocoBase, поддерживающая реляционные базы данных, такие как MySQL, PostgreSQL, SQLite и т. д. +- [Внешняя MySQL](/handbook/data-source-external-mysql): Использование внешней базы данных MySQL в качестве источника данных. +- [Внешняя MariaDB](/handbook/data-source-external-mariadb): Использование внешней базы данных MariaDB в качестве источника данных. +- [Внешний PostgreSQL](/handbook/data-source-external-postgres): использование внешней базы данных PostgreSQL в качестве источника данных. + +Кроме того, можно расширить больше типов с помощью плагинов, которые могут быть обычными типами баз данных или платформ, предоставляющих API (SDK). + +## Установка + +Встроенный плагин, отдельная установка не требуется. + +## Инструкции по использованию + +Когда приложение инициализируется и устанавливается, по умолчанию будет предоставлен источник данных для хранения данных NocoBase, известный как основная база данных. Для получения дополнительной информации см. [Основная база данных](/handbook/data-source-main). + +![20240322220423](https://static-docs.nocobase.com/20240322220423.png) + +В то же время он также поддерживает внешние базы данных в качестве источников данных. Для получения дополнительной информации см. [Внешняя база данных / Введение](/handbook/data-source-manager/external-database). + +![20240507204316](https://static-docs.nocobase.com/20240507204316.png) + +Вы также можете получить доступ к данным из источников HTTP API. Для получения дополнительной информации см. [Источник данных HTTP API](/handbook/data-source-http-api). diff --git a/docs/ru-RU/handbook/data-source-rest-api/index.md b/docs/ru-RU/handbook/data-source-rest-api/index.md new file mode 100644 index 0000000000..88a8d0a3a6 --- /dev/null +++ b/docs/ru-RU/handbook/data-source-rest-api/index.md @@ -0,0 +1,227 @@ +# Источник данных REST API + + + +## Введение + +Этот плагин позволяет вам легко интегрировать данные из источников REST API. + +## Установка + +Как коммерческий плагин, он требует загрузки и активации через менеджер плагинов. + +![20240323162741](https://static-docs.nocobase.com/20240323162741.png) + +## Добавление источника REST API + +После активации плагина вы можете добавить источник REST API, выбрав его в раскрывающемся меню Добавить новый в разделе управления источником данных. + +![20240721171420](https://static-docs.nocobase.com/20240721171420.png) + +### Настройка источника REST API + +![20240721171507](https://static-docs.nocobase.com/20240721171507.png) + +## Добавление коллекции + +В NocoBase ресурс RESTful сопоставляется с коллекцией, например ресурсом Users. + +```bash +GET /users +POST /users +GET /users/1 +PUT /users/1 +DELETE /users/1 +``` + +Эти конечные точки API отображаются в NocoBase следующим образом: + +```bash +GET /users:list +POST /users:create +POST /users:get?filterByTk=1 +POST /users:update?filterByTk=1 +POST /users:destroy?filterByTk=1 +``` + +Полное руководство по спецификациям проектирования API NocoBase см. в документации API. + +![20240716213344](https://static-docs.nocobase.com/20240716213344.png) + +Подробную информацию см. в главе «NocoBase API - Core». + +![20240716213258](https://static-docs.nocobase.com/20240716213258.png) + +Конфигурация коллекции для источника данных REST API включает следующее: + +### Список + +Сопоставьте интерфейс для просмотра списка ресурсов. + +![20240716211351](https://static-docs.nocobase.com/20240716211351.png) + +### Получить + +Сопоставьте интерфейс для просмотра сведений о ресурсах. + +![20240716211532](https://static-docs.nocobase.com/20240716211532.png) + +### Создать + +Сопоставить интерфейс для создания ресурса. + +![20240716211634](https://static-docs.nocobase.com/20240716211634.png) + +### Обновить + +Сопоставить интерфейс для обновления ресурса. + +![20240716211733](https://static-docs.nocobase.com/20240716211733.png) + +### Уничтожить + +Сопоставить интерфейс для удаления ресурса. + +![20240716211808](https://static-docs.nocobase.com/20240716211808.png) + +Необходимо настроить интерфейсы List и Get. +## Отладка API + +### Интеграция параметров запроса + +Пример: настройка параметров пагинации для API List. + +Если сторонний API не поддерживает пагинацию изначально, реализация пагинации будет основана на извлеченных данных списка. + +![20241121205229](https://static-docs.nocobase.com/20241121205229.png) + +Примечание: будут работать только переменные, добавленные в API. + +| Third-party API params name | NocoBase params | +| --------------------------- | --------------------------- | +| page | {{request.params.page}} | +| limit | {{request.params.pageSize}} | + +Вы можете легко отладить API, нажав «Попробовать». + +![20241121210320](https://static-docs.nocobase.com/20241121210320.png) + + + +### Преобразование формата ответа + +Формат ответа стороннего API может не соответствовать стандарту NocoBase, и его необходимо преобразовать, прежде чем он сможет корректно отображаться на внешнем интерфейсе. + +![20241121214638](https://static-docs.nocobase.com/20241121214638.png) + +Настройте правила преобразования на основе формата ответа стороннего API, чтобы гарантировать соответствие вывода стандарту NocoBase. + +![20241121215100](https://static-docs.nocobase.com/20241121215100.png) + +### Обзор процесса отладки + +![20250418085020](https://static-docs.nocobase.com/20250418085020.png) + +## Переменные + +Источник данных API REST поддерживает три типа переменных для интеграции API: + +- Пользовательские переменные источника данных +- Переменные запроса NocoBase +- Сторонние переменные ответа + +### Пользовательский источник данных Переменные + +![20240716221937](https://static-docs.nocobase.com/20240716221937.png) + +![20240716221858](https://static-docs.nocobase.com/20240716221858.png) + +### Запрос NocoBase + +- Параметры: параметры запроса URL (параметры поиска), которые различаются в зависимости от интерфейса. +- Заголовки: пользовательские заголовки запроса, в первую очередь предоставляющие определенную информацию X-от NocoBase. +- Тело: тело запроса. +- Токен: токен API для текущего запроса NocoBase. + +![20240716222042](https://static-docs.nocobase.com/20240716222042.png) + +### Ответы третьих лиц + +В настоящее время доступно только тело ответа. + +![20240716222303](https://static-docs.nocobase.com/20240716222303.png) + +Ниже приведены переменные, доступные для каждого интерфейса: + +### List (Список) + +| Parameter | Description | +| ----------------------- | ---------------------------------------------------------- | +| request.params.page | Current page | +| request.params.pageSize | Number of items per page | +| request.params.filter | Filter criteria (must meet NocoBase Filter format) | +| request.params.sort | Sorting criteria (must meet NocoBase Sort format) | +| request.params.appends | Fields to load on demand, typically for association fields | +| request.params.fields | Fields to include (whitelist) | +| request.params.except | Fields to exclude (blacklist) | + +### Get (Получить) + +| Parameter | Description | +| ------------------------- | ---------------------------------------------------------- | +| request.params.filterByTk | Required, typically the current record ID | +| request.params.filter | Filter criteria (must meet NocoBase Filter format) | +| request.params.appends | Fields to load on demand, typically for association fields | +| request.params.fields | Fields to include (whitelist) | +| request.params.except | Fields to exclude (blacklist) | + +### Create (Создать) + +| Parameter | Description | +| ------------------------ | ------------------------- | +| request.params.whiteList | Whitelist | +| request.params.blacklist | Blacklist | +| request.body | Initial data for creation | + +### Update (Обновить) + +| Parameter | Description | +| ------------------------- | -------------------------------------------------- | +| request.params.filterByTk | Required, typically the current record ID | +| request.params.filter | Filter criteria (must meet NocoBase Filter format) | +| request.params.whiteList | Whitelist | +| request.params.blacklist | Blacklist | +| request.body | Data for update | + +### Destroy (Удалить) + +| Parameter | Description | +| ------------------------- | ----------------------------------------- | +| request.params.filterByTk | Required, typically the current record ID | +| request.params.filter | Filtering conditions | + +## Конфигурация поля + +Метаданные поля (Поля) извлекаются из данных интерфейса CRUD адаптированного ресурса для использования в качестве полей коллекции. + +![20250418085048](https://static-docs.nocobase.com/20250418085048.png) + +Извлечение метаданных поля. + +![20241121230436](https://static-docs.nocobase.com/20241121230436.png) + +Поле и предварительный просмотр. + +![20240716224403](https://static-docs.nocobase.com/20240716224403.png) + +Изменение полей (аналогично другим источникам данных). + +![20240716224704](https://static-docs.nocobase.com/20240716224704.png) + +## Добавление блоков источника данных REST API + +После настройки коллекции вы можете добавлять блоки в интерфейс. + +![20240716225120](https://static-docs.nocobase.com/20240716225120.png) diff --git a/docs/ru-RU/handbook/data-visualization-echarts/area.md b/docs/ru-RU/handbook/data-visualization-echarts/area.md new file mode 100644 index 0000000000..7b03de819a --- /dev/null +++ b/docs/ru-RU/handbook/data-visualization-echarts/area.md @@ -0,0 +1,83 @@ +# Диаграмма с областями + +## Настройка данных + +### 1 или более показателей, 1 измерение + +![1 или более показателей, 1 измерение](https://static-docs.nocobase.com/202410091149684.png) + +Конфигурация позволяет отображать один или несколько показателей (мер) по одному измерению. Это базовый вариант построения диаграммы, где по оси X откладываются значения измерения, а по оси Y - значения показателей. Каждый показатель будет представлен отдельной областью на графике. + +### 1 показатель, 1 измерение оси, 1 категориальное измерение + +![1 показатель, 1 измерение оси, 1 категориальное измерение](https://static-docs.nocobase.com/202410091153441.png) + +В этом варианте используется: +- 1 показатель (мера) для значений по оси Y +- 1 измерение для оси X +- 1 категориальное измерение для разделения данных на серии + +Каждая категория будет представлена отдельной областью с собственным цветом. Это позволяет сравнивать распределение одного показателя по разным категориям. + +## Параметры конфигурации + +### Основные настройки + +| Параметр | Описание | +| ------------------------------ | ------------------------------------------------------------------------ | +| Поле оси X | Определяет, какие данные будут отображаться по горизонтальной оси | +| Поле серий | Поле для группировки данных и создания отдельных областей | +| Размер диаграммы | Можно задать фиксированное соотношение сторон или конкретную высоту | + +### Внешний вид + +| Параметр | Описание | +| ------------------------------ | ------------------------------------------------------------------------ | +| Тема светлого режима | Предпросмотр как будет выглядеть диаграмма в светлой теме интерфейса | +| Тема темного режима | Предпросмотр отображения в темной теме | +| Показывать легенду | Включает/выключает отображение легенды с пояснением цветов | +| Ориентация легенды | Горизонтальное или вертикальное расположение легенды | +| Позиция легенды | Выбор из 4 вариантов: слева, справа, сверху или снизу от диаграммы | + +### Настройки осей и меток + +| Параметр | Описание | +| ------------------------------ | ------------------------------------------------------------------------ | +| Тип меток | Настройка формата и видимости подписей значений | +| Заголовок оси X | Управление отображением и позиционированием названия горизонтальной оси | +| Заголовок оси Y | Настройка заголовка вертикальной оси | +| Поворот меток оси X | Изменение угла наклона подписей для лучшей читаемости | + +### Стилизация графика + +| Параметр | Описание | +| ------------------------------ | ------------------------------------------------------------------------ | +| Сглаживание кривой | Включает плавные линии вместо угловатых | +| Накопление значений | Позволяет складывать значения разных серий | +| Внутренние отступы | Регулировка свободного пространства вокруг графика | +| Разделительные линии | Настройка сетки и вспомогательных линий | +| Маркерные линии | Добавление горизонтальных или вертикальных ориентиров | + +## Дополнительные возможности + +1. **Адаптивность**: Диаграмма автоматически подстраивается под размер контейнера +2. **Интерактивность**: При наведении показываются точные значения +3. **Экспорт**: Возможность сохранения изображения диаграммы +4. **Анимация**: Плавное появление и изменение данных +5. **Кастомизация цветов**: Индивидуальная палитра для каждой серии + +## Рекомендации по использованию + +1. Для сравнения нескольких показателей используйте первый тип конфигурации +2. Для анализа распределения одного показателя по категориям - второй тип +3. При большом количестве данных включайте сглаживание +4. Для наглядного отображения вкладов используйте накопление +5. При плотных подписях на оси X устанавливайте угол поворота 45° + +## Примеры использования + +1. Анализ продаж по месяцам (ось X - месяцы, серии - товарные категории) +2. Динамика показателей эффективности (несколько линий на одном графике) +3. Распределение затрат по статьям бюджета с накоплением +4. Сравнение метрик по разным филиалам компании +5. Визуализация временных рядов с маркерами ключевых значений diff --git a/docs/ru-RU/handbook/data-visualization-echarts/bar.md b/docs/ru-RU/handbook/data-visualization-echarts/bar.md new file mode 100644 index 0000000000..64b16d08f9 --- /dev/null +++ b/docs/ru-RU/handbook/data-visualization-echarts/bar.md @@ -0,0 +1,39 @@ +# Гистограмма (столбчатая диаграмма) + +## Настройка данных + +### 1 или более показателей, 1 измерение + +![1 или более показателей, 1 измерение](https://static-docs.nocobase.com/202410091114926.png) + +### 1 показатель, 1 измерение по оси, 1 категориальное измерение + +Настройте 1 показатель и 2 измерения. Одно измерение используется как поле по оси Y, другое — как поле для серии (категорий). + +![1 показатель, 1 измерение по оси, 1 категориальное измерение](https://static-docs.nocobase.com/202410091117000.png) + +## Параметры настройки + +| Параметр | Описание | +| ----------------------------- | ----------------------------------------------------------------------------------------------------------- | +| yField | Поле измерения для оси Y | +| seriesField | Поле измерения для категоризации | +| Размер | Установите размер диаграммы — с фиксированным соотношением сторон или фиксированной высотой | +| Тема в светлом режиме | Выберите этот режим для предварительного просмотра диаграммы при включённой светлой теме системы | +| Тема в тёмном режиме | Выберите этот режим для предварительного просмотра диаграммы при включённой тёмной теме системы | +| Отображать легенду | Управление отображением легенды | +| Ориентация легенды | Управление направлением легенды: горизонтальное или вертикальное | +| Положение легенды (слева, снизу, справа, сверху) | Управление относительным положением легенды | +| Тип меток | Управление отображением меток и их типом (например, значение, процент и т.д.) | +| Положение меток | Управление положением меток: сверху, внутри столбца, внутри и сверху и т.д. | +| Стек (Stack) | Управление группировкой столбцов: без группировки, по стеку или по стеку в процентах
    ![](https://static-docs.nocobase.com/202410091108049.png) | +| Ширина столбца (мин., макс.) | Управление шириной столбцов — может быть фиксированной, в процентах, включая отрицательные значения | +| Промежуток между столбцами | Расстояние между столбцами, выраженное в процентах от ширины столбца | +| Промежуток между категориями | Расстояние между разными категориями, выраженное в процентах от ширины столбца | +| Цвет по | Управление тем, различаются ли цвета столбцов по категориям или по данным | +| Цвета | Точный контроль цвета для каждой категории | +| Заголовок оси X | Управление положением заголовка оси X | +| Заголовок оси Y | Управление положением заголовка оси Y | +| Поворот меток оси Y | Управление углом поворота меток оси Y, полезно при ограниченном пространстве для отображения меток | +| Внутренние отступы (Padding) | Настройка внутренних отступов внутри диаграммы | +| Линии сетки (Split line) | Управление отображением линий сетки и их стилем | diff --git a/docs/ru-RU/handbook/data-visualization-echarts/column.md b/docs/ru-RU/handbook/data-visualization-echarts/column.md new file mode 100644 index 0000000000..5e2da63d7b --- /dev/null +++ b/docs/ru-RU/handbook/data-visualization-echarts/column.md @@ -0,0 +1,40 @@ +# Столбчатая диаграмма (по вертикали) + +## Настройка данных + +### 1 или более показателей, 1 измерение + +![1 или более показателей, 1 измерение](https://static-docs.nocobase.com/202410091058207.png) + +### 1 показатель, 1 измерение по оси, 1 категориальное измерение + +Настройте 1 показатель и 2 измерения. Одно измерение используется как поле по оси X, другое — как поле для серии (категорий). + +![1 показатель, 1 измерение по оси, 1 категориальное измерение](https://static-docs.nocobase.com/202410091105937.png) + +## Параметры настройки + +| Параметр | Описание | +| -------------------------- | ----------------------------------------------------------------------------------------------------- | +| xField | Поле измерения для оси X | +| seriesField | Поле измерения для категоризации | +| Размер | Установите размер диаграммы — с фиксированным соотношением сторон или фиксированной высотой | +| Тема в светлом режиме | Предварительный просмотр диаграммы при включённой светлой теме системы | +| Тема в тёмном режиме | Предварительный просмотр диаграммы при включённой тёмной теме системы | +| Отображать легенду | Включить или скрыть отображение легенды | +| Ориентация легенды | Установите ориентацию легенды: горизонтальная или вертикальная | +| Положение легенды (слева, снизу, справа, сверху) | Установите положение легенды относительно диаграммы | +| Тип меток | Управление отображением меток и их типом (например, значение, процент и т.д.) | +| Положение меток | Установите положение меток: сверху, внутри столбца, внутри и сверху и т.д. | +| Стек (Stack) | Управление группировкой столбцов: без группировки, по стеку или по стеку в процентах
    ![Варианты стека](https://static-docs.nocobase.com/202410091108049.png) | +| Ширина столбца (мин., макс.) | Управление шириной столбцов — может быть фиксированной, в процентах, включая отрицательные значения | +| Промежуток между столбцами | Установите расстояние между столбцами, выраженное в процентах от ширины столбца | +| Промежуток между категориями | Установите расстояние между разными категориями, выраженное в процентах от ширины столбца | +| Цвет по | Установите цвет столбцов по категориям или по данным | +| Цвета | Точный контроль цвета для каждой категории | +| Заголовок оси X | Управление положением заголовка оси X | +| Заголовок оси Y | Управление положением заголовка оси Y | +| Поворот меток оси X | Настройте угол поворота меток оси X, чтобы отображать больше меток при их плотном расположении | +| Внутренние отступы (Padding) | Настройте внутренние отступы диаграммы | +| Линии сетки (Split line) | Управление отображением линий сетки и их стилем | +| Маркерная линия (Mark line) | Добавьте линии-маркеры с пользовательскими заголовками, значениями и цветами | diff --git a/docs/ru-RU/handbook/data-visualization-echarts/diverging-bar.md b/docs/ru-RU/handbook/data-visualization-echarts/diverging-bar.md new file mode 100644 index 0000000000..1c13ef70a1 --- /dev/null +++ b/docs/ru-RU/handbook/data-visualization-echarts/diverging-bar.md @@ -0,0 +1,27 @@ +# Дивергентная столбчатая диаграмма (Diverging-bar Chart) + +## Конфигурация данных + +### 2 метрики, 1 измерение + +Настройте 2 метрики и 1 измерение. Одна метрика будет назначена в качестве поля для левой оси X, другая - для правой оси X. + +![2 метрики, 1 измерение](https://static-docs.nocobase.com/202410091121686.png) + +## Параметры конфигурации + +| Параметр | Описание | +|----------------------|--------------------------------------------------------------------------| +| Левое поле X | Метрика для левой оси X | +| Правое поле X | Метрика для правой оси X | +| Поле Y | Измерение (категория) | +| Размер | Установка размера диаграммы (фиксированное соотношение сторон или высота) | +| Тема светлого режима | Предпросмотр в светлой теме системы | +| Тема темного режима | Предпросмотр в темной теме системы | +| Показывать легенду | Управление отображением легенды | +| Тип меток | Управление отображением и типом подписей | +| Цвета | Точная настройка цвета для каждой категории | +| Поворот меток Y | Угол поворота подписей оси Y (полезно при плотном расположении) | +| Внутренние отступы | Настройка отступов внутри диаграммы | +| Разделительные линии | Управление отображением и стилем линий сетки | + diff --git a/docs/ru-RU/handbook/data-visualization-echarts/funnel.md b/docs/ru-RU/handbook/data-visualization-echarts/funnel.md new file mode 100644 index 0000000000..9afdb66fb7 --- /dev/null +++ b/docs/ru-RU/handbook/data-visualization-echarts/funnel.md @@ -0,0 +1,24 @@ +# Воронкообразная диаграмма (Funnel Chart) + +## Конфигурация данных + +### 1 метрика, 1 измерение + +![1 метрика, 1 измерение](https://static-docs.nocobase.com/202410091916090.png) + +## Параметры настройки + +| Параметр | Описание | +|------------------------------|--------------------------------------------------------------------------------------------------------------------------| +| Размер | Установка размера диаграммы - фиксированное соотношение сторон или конкретная высота | +| Тема светлого режима | Обязательна для предпросмотра в светлой теме интерфейса | +| Тема темного режима | Обязательна для предпросмотра в темной теме интерфейса | +| Показать легенду | Включает/отключает отображение легенды диаграммы | +| Ориентация легенды | Определяет расположение легенды - горизонтальное или вертикальное | +| Позиция легенды (слева, снизу, справа, сверху) | Настраивает положение легенды относительно диаграммы | +| Тип меток | Управляет отображением и форматом подписей | +| Показать линии меток | Определяет отображение линий меток (актуально только при внешнем расположении подписей) | +| Позиция меток | Устанавливает расположение подписей - внутри или снаружи воронки | +| Размер воронки (мин, макс) | Регулирует размер воронки. Изменение минимального значения определяет форму основания - заостренное или плоское.
    ![](https://static-docs.nocobase.com/202410091919565.png) | +| Внутренние отступы | Настраивает отступы внутри диаграммы | + diff --git a/docs/ru-RU/handbook/data-visualization-echarts/index.md b/docs/ru-RU/handbook/data-visualization-echarts/index.md new file mode 100644 index 0000000000..dd31463438 --- /dev/null +++ b/docs/ru-RU/handbook/data-visualization-echarts/index.md @@ -0,0 +1,5 @@ +# Обзор + +<Реклама PluginInfo="истинное" название="визуализация данных-электронные диаграммы"> + +Использование электронных диаграмм позволяет визуализировать данные, поддерживает большее количество типов диаграмм, таких как воронкообразные диаграммы, радарные диаграммы, и обеспечивает более удобную для пользователя конфигурацию визуализации. diff --git a/docs/ru-RU/handbook/data-visualization-echarts/line.md b/docs/ru-RU/handbook/data-visualization-echarts/line.md new file mode 100644 index 0000000000..a6939c90a2 --- /dev/null +++ b/docs/ru-RU/handbook/data-visualization-echarts/line.md @@ -0,0 +1,36 @@ +# Линейчатая диаграмма (график) + +## Настройка данных + +### 1 или более показателей, 1 измерение + +![1 или более показателей, 1 измерение](https://static-docs.nocobase.com/202410091022965.png) + +### 1 показатель, 1 измерение по оси, 1 категориальное измерение + +Настройте 1 показатель и 2 измерения. Одно измерение используется как поле по оси X, другое — как поле для серии (категорий). + +![1 показатель, 1 измерение по оси, 1 категориальное измерение](https://static-docs.nocobase.com/202410091029410.png) + +## Параметры настройки + +| Параметр | Описание | +| -------------------------- | --------------------------------------------------------------------------------------------- | +| xField | Поле измерения для оси X | +| seriesField | Поле измерения для классификации | +| Размер | Установите размер диаграммы — с фиксированным соотношением сторон или фиксированной высотой | +| Тема в светлом режиме | Выберите для предварительного просмотра в светлом режиме, если он включён в системе | +| Тема в тёмном режиме | Выберите для предварительного просмотра в тёмном режиме, если он включён в системе | +| Отображать легенду | Управление отображением легенды | +| Ориентация легенды | Управление направлением легенды: горизонтальное или вертикальное
    ![](https://static-docs.nocobase.com/202410091050074.png) | +| Положение легенды (слева, снизу, справа, сверху) | Управление положением легенды относительно диаграммы | +| Тип меток | Управление отображением и типом меток; отображаются только при включённых точках-маркерах | +| Плавная кривая | Включить или отключить плавные линии на графике | +| Группировка (Stack) | Включить или отключить отображение значений в виде стека (наложенных друг на друга) | +| Символ (маркеры) | Управление отображением точек-маркера и их стилями | +| Заголовок оси X | Управление положением заголовка оси X | +| Заголовок оси Y | Управление положением заголовка оси Y | +| Поворот меток оси X | Управление углом поворота меток оси X, полезно при плотном расположении меток | +| Внутренние отступы (Padding)| Настройка внутренних отступов диаграммы | +| Линии сетки (Split line) | Управление видимостью и стилем линий сетки | +| Маркерная линия (Mark line)| Добавьте линии-маркеры и настройте заголовок, значение и цвет
    ![](https://static-docs.nocobase.com/202410091051511.png) | diff --git a/docs/ru-RU/handbook/data-visualization-echarts/pie.md b/docs/ru-RU/handbook/data-visualization-echarts/pie.md new file mode 100644 index 0000000000..80c8cd7446 --- /dev/null +++ b/docs/ru-RU/handbook/data-visualization-echarts/pie.md @@ -0,0 +1,26 @@ +# Круговая диаграмма (Pie Chart) + +## Настройка данных + +### 1 метрика, 1 измерение + +![1 метрика, 1 измерение](https://static-docs.nocobase.com/202410091138527.png) + +## Параметры конфигурации + +| Параметр | Описание | +|------------------------------|--------------------------------------------------------------------------------------------------------| +| Размер | Задает размер диаграммы: фиксированное соотношение сторон или фиксированная высота | +| Тема светлого режима | Обязательна для предпросмотра в светлой теме интерфейса | +| Тема темного режима | Обязательна для предпросмотра в темной теме интерфейса | +| Показать легенду | Управляет отображением легенды | +| Ориентация легенды | Определяет ориентацию легенды: горизонтальная или вертикальная | +| Позиция легенды (слева, снизу, справа, сверху) | Управляет расположением легенды относительно диаграммы | +| Тип меток | Управляет отображением и типом подписей | +| Показать линии меток | Управляет отображением линий меток (работает только при внешнем расположении подписей) | +| Позиция меток | Определяет положение подписей: внутри, снаружи или по центру. В центре подписи появляются только при наведении на соответствующий сектор | +| Внешний радиус | Регулирует внешний радиус диаграммы | +| Внутренний радиус | Регулирует внутренний радиус. Позволяет создавать кольцевые диаграммы
    ![](https://static-docs.nocobase.com/202410091144473.png) | +| Координаты центра | Управляет положением диаграммы (можно задавать фиксированные значения или проценты) | +| Цвета | Точная настройка цвета для каждой категории | + diff --git a/docs/ru-RU/handbook/data-visualization-echarts/radar.md b/docs/ru-RU/handbook/data-visualization-echarts/radar.md new file mode 100644 index 0000000000..99fcbf5edf --- /dev/null +++ b/docs/ru-RU/handbook/data-visualization-echarts/radar.md @@ -0,0 +1,33 @@ +# Радарная диаграмма (Radar Chart) + +## Настройка данных + +### 1 или более метрик, 1 измерение + +#### Использование измерений в качестве переменных + +Каждое значение поля измерения выступает как переменная, а каждая метрика формирует одну область радара. + +![](https://static-docs.nocobase.com/202410091924155.png) + +#### Использование метрик в качестве переменных + +Каждая метрика выступает как переменная, а каждое значение поля измерения формирует одну область радара. + +![](https://static-docs.nocobase.com/202410091927959.png) + +## Параметры конфигурации + +| Параметр | Описание | +|------------------------------|--------------------------------------------------------------------------| +| Размер | Установка размера диаграммы - фиксированное соотношение сторон или высота | +| Тема светлого режима | Обязательна для предпросмотра в светлой теме интерфейса | +| Тема темного режима | Обязательна для предпросмотра в темной теме интерфейса | +| Показать легенду | Управляет отображением легенды | +| Ориентация легенды | Определяет направление легенды - горизонтальное или вертикальное | +| Позиция легенды (слева, снизу, справа, сверху) | Управляет расположением легенды относительно диаграммы | +| Форма | Многоугольник или круг
    ![](https://static-docs.nocobase.com/202410091929018.png) | +| Диапазон | Управляет минимальными и максимальными значениями переменных | +| Радиус | Регулирует радиус диаграммы | +| Координаты центра | Управляет положением диаграммы (фиксированные значения или проценты) | + diff --git a/docs/ru-RU/handbook/data-visualization-echarts/scatter.md b/docs/ru-RU/handbook/data-visualization-echarts/scatter.md new file mode 100644 index 0000000000..3575e2e793 --- /dev/null +++ b/docs/ru-RU/handbook/data-visualization-echarts/scatter.md @@ -0,0 +1,33 @@ +# Точечная диаграмма (диаграмма рассеяния) + +## Настройка данных + +### 1 или несколько показателей, 1 измерение + +![1 или несколько показателей, 1 измерение](https://static-docs.nocobase.com/202410091202766.png) + +### 1 показатель, 1 измерение по оси, 1 категориальное измерение + +Настройте один показатель и два измерения. Одно измерение будет использоваться как поле по оси X, другое — как поле для серии (категорий). + +![1 показатель, 1 измерение по оси, 1 категориальное измерение](https://static-docs.nocobase.com/202410091202268.png) + +## Параметры настройки + +| Параметр | Описание | +| -------------------------- | ----------------------------------------------------------- | +| xField | Поле измерения для оси X | +| seriesField | Поле измерения для категоризации | +| Размер | Установите размер диаграммы — с фиксированным соотношением сторон или фиксированной высотой | +| Тема в светлом режиме | Предварительный просмотр доступен, когда система находится в светлом режиме | +| Тема в тёмном режиме | Предварительный просмотр доступен, когда система находится в тёмном режиме | +| Отображать легенду | Включить или скрыть отображение легенды | +| Ориентация легенды | Управление ориентацией легенды: горизонтальная или вертикальная | +| Положение легенды (слева, снизу, справа, сверху) | Управление относительным положением легенды | +| Тип меток | Управление отображением меток и их типом | +| Заголовок оси X | Управление положением заголовка оси X | +| Заголовок оси Y | Управление положением заголовка оси Y | +| Поворот меток оси X | Настройка угла поворота меток оси X; полезно при плотном расположении меток для более эффективного отображения | +| Внутренние отступы (Padding) | Настройка внутренних отступов диаграммы | +| Линии сетки (Split line) | Управление отображением линий сетки и их стилем | +| Маркерная линия (Mark line) | Добавление опорных линий, настройка их заголовка, значения и цвета | diff --git a/docs/ru-RU/handbook/data-visualization-echarts/treemap.md b/docs/ru-RU/handbook/data-visualization-echarts/treemap.md new file mode 100644 index 0000000000..51f1cd5493 --- /dev/null +++ b/docs/ru-RU/handbook/data-visualization-echarts/treemap.md @@ -0,0 +1,17 @@ +# Древовидная карта (Treemap Chart) + +## Настройка данных + +### 1 метрика, 1 измерение + +![1 метрика, 1 измерение](https://static-docs.nocobase.com/202410091933526.png) + +## Параметры конфигурации + +| Параметр | Описание | +|-------------------|--------------------------------------------------------------------------| +| Размер | Установка размера диаграммы: фиксированное соотношение сторон или высота | +| Тема светлого режима | Обязательна для предпросмотра в светлой теме интерфейса | +| Тема темного режима | Обязательна для предпросмотра в темной теме интерфейса | +| Тип меток | Управляет отображением подписей и их форматом | + diff --git a/docs/ru-RU/handbook/data-visualization-echarts/wordcloud.md b/docs/ru-RU/handbook/data-visualization-echarts/wordcloud.md new file mode 100644 index 0000000000..4cffd35f6d --- /dev/null +++ b/docs/ru-RU/handbook/data-visualization-echarts/wordcloud.md @@ -0,0 +1,16 @@ +# Диаграмма облака слов + +## Настройка данных + +### 1 показатель, 1 измерение + +![1 показатель, 1 измерение](https://static-docs.nocobase.com/202410091936018.png) + +## Параметры настройки + +| Параметр | Описание | +| ------------------ | ------------------------------------------------ | +| Размер | Устанавливает размер диаграммы — с фиксированным соотношением сторон или фиксированной высотой | +| Тема в светлом режиме | Выберите этот параметр для предварительного просмотра в светлом режиме системы | +| Тема в тёмном режиме | Выберите этот параметр для предварительного просмотра в тёмном режиме системы | +| Форма | Управляет формой облака слов | diff --git a/docs/ru-RU/handbook/data-visualization/antd-charts/bar.md b/docs/ru-RU/handbook/data-visualization/antd-charts/bar.md new file mode 100644 index 0000000000..0ec4e8cf34 --- /dev/null +++ b/docs/ru-RU/handbook/data-visualization/antd-charts/bar.md @@ -0,0 +1,30 @@ +# Столбчатая диаграмма (Bar Chart) + +## Настройка данных + +### 1 метрика, 1 измерение + +![1 метрика, 1 измерение](https://static-docs.nocobase.com/202410101129463.png) + +### 1 метрика, 1 измерение оси, 1 категориальное измерение + +В этой конфигурации используется: +- 1 метрика для значений по оси Y +- 1 измерение для оси X (поле X) +- 1 категориальное измерение (поле серий) + +Поле оси X и категориальное поле могут совпадать. + +![1 метрика, 1 измерение оси, 1 категориальное измерение](https://static-docs.nocobase.com/202410101130607.png) + +#### Параметры настройки + +| Параметр | Описание | +|------------------|---------------------------------------------------------| +| Поле оси X | Поле, используемое для измерений по оси X | +| Категориальное поле | Поле для категоризации данных | +| Размер | Установка размера диаграммы (фикс. пропорции или высота)| +| Группировка | Отображение сгруппированных столбцов | +| Накопление | Накопление значений столбцов | +| Процентный вид | Отображение данных в процентном соотношении | + diff --git a/docs/ru-RU/handbook/data-visualization/antd-charts/column.md b/docs/ru-RU/handbook/data-visualization/antd-charts/column.md new file mode 100644 index 0000000000..922e1be22e --- /dev/null +++ b/docs/ru-RU/handbook/data-visualization/antd-charts/column.md @@ -0,0 +1,24 @@ +# Столбчатая диаграмма (по вертикали) + +## Настройка данных + +### 1 показатель, 1 измерение + +![Пример столбчатой диаграммы](https://static-docs.nocobase.com/202410101121827.png) + +### 1 показатель, 1 измерение по оси, 1 категориальное измерение + +Настройте 1 показатель и 2 измерения, где одно измерение используется как поле по оси X, а другое — как поле категории (поле серии). Поле по оси X и поле категории могут быть одинаковыми. + +![Столбчатая диаграмма с категориями](https://static-docs.nocobase.com/202410101122347.png) + +## Параметры настройки + +| Параметр | Описание | +| ---------------------- | ------------------------------------------------------------------------ | +| Поле по оси X | Поле измерения для оси X | +| Поле категории | Поле измерения для категоризации | +| Размер | Установите размер диаграммы — с фиксированным соотношением сторон или фиксированной высотой | +| Группированный вид | Включить или отключить группированный вид столбцов
    ![Группированный вид](https://static-docs.nocobase.com/202410101125056.png) | +| Стековый вид | Включить или отключить стековый (наложенный) вид столбцов
    ![Стековый вид](https://static-docs.nocobase.com/202410101125891.png) | +| Процентный вид | Включить или отключить отображение в процентах
    ![Процентный вид](https://static-docs.nocobase.com/202410101126148.png) | diff --git a/docs/ru-RU/handbook/data-visualization/antd-charts/dual-axes.md b/docs/ru-RU/handbook/data-visualization/antd-charts/dual-axes.md new file mode 100644 index 0000000000..111b5df151 --- /dev/null +++ b/docs/ru-RU/handbook/data-visualization/antd-charts/dual-axes.md @@ -0,0 +1,13 @@ +# Двухосевая диаграмма (Dual-Axis Chart) + +## Настройка данных + +### 2 метрики, 1 измерение + +![](https://static-docs.nocobase.com/202410101132724.png) + +#### Параметры конфигурации + +| Параметр | Описание | +|----------|---------------------------------------------------------| +| Размер | Установка размера диаграммы (фиксированные пропорции или высота) | diff --git a/docs/ru-RU/handbook/data-visualization/antd-charts/line.md b/docs/ru-RU/handbook/data-visualization/antd-charts/line.md new file mode 100644 index 0000000000..2a1da97fe3 --- /dev/null +++ b/docs/ru-RU/handbook/data-visualization/antd-charts/line.md @@ -0,0 +1,25 @@ +# Линейчатая диаграмма (график) + +## Настройка данных + +### 1 показатель, 1 измерение + +Линейчатую диаграмму можно настроить с одним показателем и одним измерением, как показано ниже: + +![1 показатель, 1 измерение](https://static-docs.nocobase.com/202410101109866.png) + +### 1 показатель, 1 измерение по оси, 1 категориальное измерение + +Настройте один показатель и два измерения. Одно измерение используется как поле по оси X, другое — как поле серии (категории). + +![1 показатель, 1 измерение по оси, 1 категориальное измерение](https://static-docs.nocobase.com/202410101113944.png) + +## Параметры настройки + +| Параметр | Описание | +| ---------------------- | ------------------------------------------------ | +| Поле по оси X | Поле измерения, определяющее ось X | +| Поле серии | Поле измерения, определяющее категории | +| Размер | Установите размер диаграммы — с фиксированным соотношением сторон или фиксированной высотой | +| Плавные кривые | Включить или отключить отображение линий в виде плавных кривых | +| Группировка данных | Включить или отключить отображение значений в виде наложенных друг на друга столбцов (стек) | diff --git a/docs/ru-RU/handbook/data-visualization/antd-charts/overview.md b/docs/ru-RU/handbook/data-visualization/antd-charts/overview.md new file mode 100644 index 0000000000..915a82389e --- /dev/null +++ b/docs/ru-RU/handbook/data-visualization/antd-charts/overview.md @@ -0,0 +1,3 @@ +# Обзор + +Используйте Диаграммы проектирования Ant 2.x для визуализации данных, поддерживая общие базовые типы диаграмм. diff --git a/docs/ru-RU/handbook/data-visualization/antd-charts/pie.md b/docs/ru-RU/handbook/data-visualization/antd-charts/pie.md new file mode 100644 index 0000000000..fb2482e432 --- /dev/null +++ b/docs/ru-RU/handbook/data-visualization/antd-charts/pie.md @@ -0,0 +1,14 @@ +# Круговая диаграмма (Pie Chart) + +## Настройка данных + +### 1 метрика, 1 измерение + +![1 метрика, 1 измерение](https://static-docs.nocobase.com/202410101131823.png) + +## Параметры конфигурации + +| Параметр | Описание | +|----------|--------------------------------------------------------------------------| +| Размер | Настройка размера диаграммы (фиксированное соотношение сторон или высота) | + diff --git a/docs/ru-RU/handbook/data-visualization/antd-charts/scatter.md b/docs/ru-RU/handbook/data-visualization/antd-charts/scatter.md new file mode 100644 index 0000000000..49bf61c9f9 --- /dev/null +++ b/docs/ru-RU/handbook/data-visualization/antd-charts/scatter.md @@ -0,0 +1,21 @@ +# Точечная диаграмма (диаграмма рассеяния) + +## Настройка данных + +### 1 показатель, 1 измерение + +![1 показатель, 1 измерение](https://static-docs.nocobase.com/202410101138172.png) + +### 1 показатель, 1 измерение по оси, 1 категориальное измерение + +Настройте один показатель и два измерения. Одно измерение используется как поле по оси X, другое — как поле серии (категории). + +![1 показатель, 1 измерение по оси, 1 категориальное измерение](https://static-docs.nocobase.com/202410101137837.png) + +## Параметры настройки + +| Параметр | Описание | +| -------------- | ------------------------------------------------------- | +| Поле по оси X | Измерение, определяющее ось X диаграммы. | +| Поле серии | Измерение, используемое для разделения точек данных на отдельные серии. | +| Размер | Установите размер диаграммы — с фиксированным соотношением сторон или фиксированной высотой. | diff --git a/docs/ru-RU/handbook/data-visualization/antd/overview.md b/docs/ru-RU/handbook/data-visualization/antd/overview.md new file mode 100644 index 0000000000..f19376e9b8 --- /dev/null +++ b/docs/ru-RU/handbook/data-visualization/antd/overview.md @@ -0,0 +1,4 @@ +# Обзор + +Provide tables and statistical presentations using Ant Design. + diff --git a/docs/ru-RU/handbook/data-visualization/antd/statistic.md b/docs/ru-RU/handbook/data-visualization/antd/statistic.md new file mode 100644 index 0000000000..c83ac52355 --- /dev/null +++ b/docs/ru-RU/handbook/data-visualization/antd/statistic.md @@ -0,0 +1,13 @@ +# Статистические значения + +## Конфигурация данных + +### 1 Показатель + +![1 Metric](https://static-docs.nocobase.com/202410101147166.png) + +## Параметры конфигурации + +| Элемент конфигурации | Описание | +| ------------------ | -------------------------------- | +| Ссылка | Фиксированная ссылка, по которой можно перейти для перенаправления | diff --git a/docs/ru-RU/handbook/data-visualization/antd/table.md b/docs/ru-RU/handbook/data-visualization/antd/table.md new file mode 100644 index 0000000000..5155faf551 --- /dev/null +++ b/docs/ru-RU/handbook/data-visualization/antd/table.md @@ -0,0 +1,22 @@ +# Таблица + +## Конфигурация данных + +### Несколько показателей, несколько измерений + +![Несколько показателей, несколько измерений](https://static-docs.nocobase.com/202410101142369.png) + +## Общая конфигурация JSON + +### Настройка порядка столбцов + +```json +{ + "columns": [ + { "key": "fieldName1", "dataIndex": "fieldName1", "title": "fieldTitle1" }, + { "key": "fieldName2", "dataIndex": "fieldName2", "title": "fieldTitle2" } + ] +} +``` + +![](https://static-docs.nocobase.com/202410101145770.png) diff --git a/docs/ru-RU/handbook/data-visualization/block-charts.md b/docs/ru-RU/handbook/data-visualization/block-charts.md new file mode 100644 index 0000000000..4e4c24ed4b --- /dev/null +++ b/docs/ru-RU/handbook/data-visualization/block-charts.md @@ -0,0 +1,4 @@ +# Блок-схемы + + + diff --git a/docs/ru-RU/handbook/data-visualization/dev/index.md b/docs/ru-RU/handbook/data-visualization/dev/index.md new file mode 100644 index 0000000000..f6f264eda1 --- /dev/null +++ b/docs/ru-RU/handbook/data-visualization/dev/index.md @@ -0,0 +1,599 @@ +# Расширение типов диаграмм + +## Обзор + +NocoBase использует [Ant Design Charts](https://g2plot.antv.antgroup.com/) в качестве стандартной библиотеки диаграмм, которая включает наиболее распространенные типы визуализаций. Помимо встроенных типов, система поддерживает интеграцию других библиотек, таких как ECharts. В этом разделе объясняется, как расширить функционал новыми типами диаграмм. + +## Определение диаграммы + +Каждый тип диаграммы определяется классом, реализующим интерфейс [ChartType](#charttype). Для упрощения разработки предоставляется базовый класс [Chart](#chart), который частично реализует этот интерфейс. + +```ts +class CustomChart extends Chart { + constructor({ name, title, Component, config }: ChartProps) { + // ... + } + + init( + fields: FieldOption[], + { + measures, + dimensions, + }: { measures: MeasureProps[]; dimensions: DimensionProps[] }, + ) { + // ... + } + + getProps({ data, general, advanced, fieldProps }: RenderProps) { + // ... + } + + getReference() { + // ... + } +} +``` + +### Информация о диаграмме + +Основные параметры: + +| Параметр | Описание | +|------------|-------------------------| +| `name` | Уникальный идентификатор | +| `title` | Отображаемое название | +| `Component`| Компонент для рендеринга | +| `config` | Базовая форма конфигурации | + + + +Пример: + +```ts +new CustomChart({ + name: 'custom', + title: 'Пользовательская диаграмма', + Component: CustomChart, + config: ['xField', 'yField', 'seriesField'], +}); +``` + +### Инициализация конфигурации + +При выборе диаграммы система автоматически инициализирует настройки на основе данных: + +```ts +init( + fields: FieldOption[], + { + measures, + dimensions, + }: { measures: MeasureProps[]; dimensions: DimensionProps[] }, +) { + const { xField, yField, seriesField } = this.infer(fields, { measures, dimensions }); + return { + general: { + xField: xField?.value, + yField: yField?.value, + seriesField: seriesField?.value, + }, + }; +} +``` + +### Получение свойств компонента + +Метод `getProps()` обрабатывает данные перед передачей в компонент: + +```ts +getProps({ data, fieldProps, general, advanced }: RenderProps) { + const record = data[0] || {}; + const field = general?.field; + const props = fieldProps[field]; + return { + value: record[field], + formatter: props?.transformer, + ...general, + ...advanced, + }; +} +``` + +### Справочная информация + +```ts +getReference() { + return { + title: this.title, + link: `https://ant.design/components/${this.name}`, + }; +} +``` + +## Добавление диаграммы + +После создания класса диаграммы его нужно зарегистрировать в плагине визуализации данных. Диаграммы группируются для удобства навигации. + +```typescript +import DataVisualization from '@nocobase/plugin-data-visualization' + +class CustomChartsPlugin extends Plugin { + async load() { + const plugin = this.app.pm.get(DataVisualization); + + // Добавление группы + plugin.charts.addGroup('custom', [...]); + + // Переопределение группы + plugin.charts.setGroup('custom', [...]); + + // Добавление в существующую группу + plugin.charts.add('Built-in', new CustomChart({ + // ... + })); + } +} +``` +## API + +### ChartGroup + +#### `addGroup()` + +Добавляет группу диаграмм. + +```typescript +import DataVisualization from '@nocobase/plugin-data-visualization' + +class CustomChartsPlugin extends Plugin { + async load() { + const plugin = this.app.pm.get(DataVisualization); + + // Добавить группу диаграмм + plugin.charts.addGroup('custom', { + title: 'Пользовательская', + charts: [...], + sort: 1 + }); + } +} +``` + +**Сигнатура** + +- `addGroup(name: string, charts: ChartType[])` + +**Типы** + +```ts +interface Group { + title: string; + charts: ChartType[]; + sort?: number; +} +``` + +**Описание параметров** + +| Параметр | Тип | Описание | +|-----------|---------------|------------------------------------------| +| `name` | `string` | Уникальное имя группы диаграмм | +| `charts` | `ChartType[]` | Массив диаграмм | +| `sort` | `number` | Необязательно. Порядок сортировки группы | + +#### `add()` + +Добавляет диаграмму в существующую группу. + +```typescript +import DataVisualization from '@nocobase/plugin-data-visualization'; + +class CustomChartsPlugin extends Plugin { + async load() { + const plugin = this.app.pm.get(DataVisualization); + + plugin.charts.add( + 'Встроенные', + new CustomChart({ + // ... + }), + ); + } +} +``` + +**Сигнатура** + +- `add(group: string, chart: ChartType)` + +**Описание параметров** + +| Параметр | Тип | Описание | +|-----------|---------------|------------------------------------------| +| `group` | `string` | Уникальный идентификатор группы диаграмм | +| `chart` | `ChartType` | Добавляемая диаграмма | + +### Диаграмма (Chart) + +#### `constructor()` + +Конструктор для создания нового экземпляра `Chart`. + +**Сигнатура** + +- `constructor({ name, title, Component, config }: ChartProps)` + +**Типы** + +```ts +export type ChartProps = { + name: string; + title: string; + Component: React.FC; + config?: Config[]; +}; + +export type FieldConfigProps = Partial<{ + name: string; + title: string; + required: boolean; + defaultValue: any; + description: string; + options: { label: string; value: any }[]; + componentProps: Record; +}>; +export type ConfigType = + | (FieldConfigProps & { configType?: string }) + | ((props?: FieldConfigProps) => AnySchemaProperties) + | AnySchemaProperties; +export type Config = string | ConfigType; +``` + +**Описание свойств** + +| Свойство | Тип | Описание | +|-------------|------------------------|----------------------------------------------------------| +| `name` | `string` | Уникальный идентификатор диаграммы | +| `title` | `string` | Отображаемое название диаграммы | +| `Component` | `React.FC` | Компонент, используемый для отображения диаграммы | +| `config` | [`Config[]`](#config) | Необязательно. Форма конфигурации визуализации | + +##### Config + +Поле `config` поддерживает несколько форматов, которые можно комбинировать: + +1. Конфигурация поля по UI Schema. Если вы хотите использовать поля, уже настроенные в разделе «Настройка данных», внутри UI Schema, используйте `'x-reactions': '{{ useChartFields }}'`. + +```ts +{ + xField: { + title: 'xField', + type: 'string', + 'x-decorator': 'FormItem', + 'x-component': 'Select', + 'x-reactions': '{{ useChartFields }}', + required, + } +} +``` + +2. Использование предопределённой конфигурации UI Schema. + +Например, `config: ['field']` соответствует: + +```typescript +{ + field: { + title: 'Поле', + type: 'string', + 'x-decorator': 'FormItem', + 'x-component': 'Select', + 'x-reactions': '{{ useChartFields }}', + required, + } +} +``` + +3. Использование предопределённой конфигурации UI Schema с заменой некоторых свойств, где `property` — это идентификатор предопределённой схемы. + +```typescript +config: [ + { + property: 'field', + name: 'angleField', + title: 'angleField', + defaultValue: 'default', + }, +]; +``` + +Это соответствует: + +```typescript +{ + angleField: { + title: 'angleField', + type: 'string', + 'x-decorator': 'FormItem', + 'x-component': 'Select', + 'x-reactions': '{{ useChartFields }}', + required, + defaultValue: 'default', + } +} +``` + +#### `addConfigTypes()` + +Добавляет предопределённые UI-схемы для формы визуальной настройки диаграммы. + +```ts +// Добавление +const boolean = ({ name, title, defaultValue = false }: FieldConfigProps) => { + return { + [name]: { + 'x-content': lang(title), + type: 'boolean', + 'x-decorator': 'FormItem', + 'x-component': 'Checkbox', + default: defaultValue, + }, + }; +}; +chart.addConfigTypes({ booleanField }); + +// Использование +new Chart({ + config: [ + 'boolean', + { + configType: 'boolean', + name: 'customBooleanField', + title: 'Пользовательское булево поле', + defaultValue: true, + }, + ], +}); +``` + +**Сигнатура** + +- `addConfigTypes(configs: { [key: string]: ConfigType })` + +**Типы** + +```ts +export type ConfigType = + | (FieldConfigProps & { configType?: string }) + | ((props?: FieldConfigProps) => AnySchemaProperties) + | AnySchemaProperties; +``` + +**Описание** + +Метод `addConfigTypes()` принимает объект, где `ключ` — это уникальный идентификатор конфигурации, а значение — функция, возвращающая предопределённую UI-схему. Эта функция принимает параметры (например, название, значение по умолчанию), которые можно переопределить, и возвращает соответствующую конфигурацию поля UI-схемы. + +--- + +#### `init()` + +Эта функция инициализирует конфигурацию диаграммы при её выборе. Она определяет начальные настройки свойств диаграммы. + +**Сигнатура** + +```ts +init?: ( + fields: FieldOption[], + query: { + measures?: MeasureProps[]; + dimensions?: DimensionProps[]; + }, +) => { + general?: any; + advanced?: any; +}; +``` + +**Типы** + +```ts +export type FieldOption = { + value: string; + label: string; + key: string; + alias?: string; + name?: string; + type?: string; + interface?: string; + uiSchema?: ISchema; + target?: string; + targetFields?: FieldOption[]; +}; + +export type MeasureProps = { + field: string | string[]; + aggregation?: string; + alias?: string; +}; + +export type DimensionProps = { + field: string | string[]; + alias?: string; + format?: string; +}; +``` + +**Описание параметров** + +| Параметр | Тип | Описание | +|----------------------|-------------------|-----------------------------------------------------------| +| `fields` | `FieldOption[]` | Содержит ключевые атрибуты полей текущей таблицы данных. | +| `query.measures` | `MeasureProps[]` | Конфигурация полей-показателей. | +| `query.dimensions` | `DimensionProps[]`| Конфигурация полей-измерений. | + +--- + +#### `infer()` + +Автоматическое определение начальной конфигурации диаграммы на основе доступных полей. + +```ts +// Пример для круговой диаграммы +init(fields, { measures, dimensions }) { + const { xField, yField } = this.infer(fields, { measures, dimensions }); + return { + general: { + colorField: xField?.value, + angleField: yField?.value, + }, + }; +}; +``` + +**Сигнатура** + +```ts +infer: (fields: FieldOption[], query: { + measures?: MeasureProps[]; + dimensions?: DimensionProps[]; +}) => { + xField: FieldOption; + yField: FieldOption; + seriesField: FieldOption; + colorField: FieldOption; + yFields: FieldOption[]; +} +``` + +**Описание свойств** + +| Свойство | Тип | Описание | +|-----------------|-------------------|------------------------------------------------------------| +| `xField` | `FieldOption` | Поле, используемое по оси X. | +| `yField` | `FieldOption` | Поле, используемое по оси Y. | +| `seriesField` | `FieldOption` | Поле, представляющее категории или серии данных. | +| `colorField` | `FieldOption` | Поле, определяющее цветовую гамму диаграммы. | +| `yFields` | `FieldOption[]` | Несколько полей по оси Y (используется в сложных диаграммах). | + +--- + +#### `getProps()` + +Эта функция обрабатывает исходные данные диаграммы и метаданные конфигурации и преобразует их в свойства, необходимые для компонента отрисовки. + +**Сигнатура** + +- `getProps({ data, general, advanced, fieldProps }: RenderProps)` + +**Типы** + +```ts +export type RenderProps = { + data: Record[]; + general: any; + advanced: any; + fieldProps: { + [field: string]: { + label: string; + transformer: Transformer; + interface: string; + }; + }; +}; +``` + +| Свойство | Тип | Описание | +|------------------|---------------------------------------|-----------------------------------------------------------| +| `data` | `Record[]` | Исходные данные, отображаемые на диаграмме. | +| `general` | `any` | Общие параметры конфигурации из формы визуализации. | +| `advanced` | `any` | Расширенная JSON-конфигурация диаграммы. | +| `fieldProps` | `{ [field: string]: FieldProps }` | Метаданные полей таблицы, используемые для отображения. | + +##### FieldProps + +| Свойство | Тип | Описание | +|------------------|-----------------|-----------------------------------------------------------| +| `label` | `string` | Отображаемое название поля. | +| `transformer` | `Transformer` | Функция преобразования значений поля. | +| `interface` | `string` | Тип интерфейса поля (например, текст, дата, число и т.д.). | +_____________________________________________________________________ + +#### `getReference()` + +Получает справочную документацию для компонента диаграммы, включая название и прямую ссылку на документацию. + +```ts +getReference() { + return { + title: this.title, + link: `https://ant.design/components/${this.name}`, + }; +} +``` + +**Сигнатура** + +```ts +getReference?: () => { + title: string; + link: string; +}; +``` + +### ChartType (Тип диаграммы) + +#### `name` + +- `string`. Уникальный идентификатор типа диаграммы. + +#### `title` + +- `string`. Отображаемое название диаграммы. + +#### `Component` + +- `React.FC`. React-компонент, используемый для отображения диаграммы. + +#### `schema` + +- `ISchema`. UI-схема для конфигурации визуализации диаграммы. + +#### `init()` + +Функция инициализации конфигурации диаграммы. + +**Сигнатура** + +```ts +init?: ( + fields: FieldOption[], + query: { + measures?: MeasureProps[]; + dimensions?: DimensionProps[]; + }, +) => { + general?: any; + advanced?: any; +}; +``` + +#### `getProps()` + +Обрабатывает и возвращает свойства для компонента диаграммы. + +**Сигнатура** + +- `getProps(props: RenderProps): any` + +#### `getReference()` + +Получает справочную документацию для компонента диаграммы. + +**Сигнатура** + +```ts +getReference?: () => { + title: string; + link: string; +}; +``` diff --git a/docs/ru-RU/handbook/data-visualization/dev/static/FHzPbretYo6KWexv9wccM91Hnff.png b/docs/ru-RU/handbook/data-visualization/dev/static/FHzPbretYo6KWexv9wccM91Hnff.png new file mode 100644 index 0000000000..836973ae8e Binary files /dev/null and b/docs/ru-RU/handbook/data-visualization/dev/static/FHzPbretYo6KWexv9wccM91Hnff.png differ diff --git a/docs/ru-RU/handbook/data-visualization/faq.md b/docs/ru-RU/handbook/data-visualization/faq.md new file mode 100644 index 0000000000..efa9985a7f --- /dev/null +++ b/docs/ru-RU/handbook/data-visualization/faq.md @@ -0,0 +1,49 @@ +# Часто задаваемые вопросы (FAQ) + +## Как использовать JSON-конфигурацию? + +Обратитесь к документации или используйте демо-примеры, чтобы понять свойства, поддерживаемые различными компонентами, через ссылки на документацию компонентов. Конфигурация выполняется с использованием пар ключ-значение в формате JSON. + +
    + + +### Пример: Изменение порядка столбцов таблицы + +Используемый табличный компонент - это таблица Ant Design. Откройте справочную ссылку Table. В разделе API перечислены все настраиваемые свойства, поддерживаемые компонентом. + + + +Для изменения порядка столбцов таблицы измените конфигурацию `columns`. Пример: + +```ts +{ + "columns": [ + { "key": "fieldName1", "dataIndex": "fieldName1", "title": "fieldTitle1" }, + { "key": "fieldName2", "dataIndex": "fieldName2", "title": "fieldTitle2" } + ] +} +``` + +## Поддерживает ли JSON-конфигурация использование функций? + +Выражения JavaScript можно обернуть в `{{}}`. Пример: + +```json +{ + "label": { + "type": "inner", + "content": "{{ ({ percent }) => `${(percent * 100).toFixed(0)}%` }}" + } +} +``` + +## Для чего используются пользовательские поля в блоках фильтров диаграмм? + +Когда в блоке диаграмм присутствуют диаграммы из разных таблиц данных и требуется один и тот же фильтр для этих диаграмм, можно использовать [пользовательские поля](./user/filter.md#custom-fields). Например, может потребоваться фильтрация данных за определенный период времени. + +**Дополнительные пояснения:** +1. JSON-конфигурация позволяет гибко настраивать компоненты +2. Ссылки на документацию компонентов содержат полный список доступных свойств +3. Поддержка JavaScript-выражений расширяет возможности кастомизации +4. Пользовательские поля полезны для создания универсальных фильтров +5. Все изменения применяются динамически без необходимости перезагрузки diff --git a/docs/ru-RU/handbook/data-visualization/index.md b/docs/ru-RU/handbook/data-visualization/index.md new file mode 100644 index 0000000000..2b3bb7ddcd --- /dev/null +++ b/docs/ru-RU/handbook/data-visualization/index.md @@ -0,0 +1,33 @@ +# Визуализация данных + + + +## Введение + +Плагин визуализации данных NocoBase предоставляет мощные функции извлечения данных и богатый набор компонентов диаграмм. На основе данных из коллекций системы пользователи могут быстро создавать наглядные дашборды, гибко организовывать диаграммы и проводить глубокий анализ бизнес-данных. + +![](https://static-docs.nocobase.com/51be43d5400d6294f6c20d11009f23c4.png) + +## Установка + +Это встроенный плагин — дополнительная установка не требуется. + +## Сопутствующая документация + +- Руководство пользователя + - [Блок диаграммы](./user/chart-block.md) + - [Настройка диаграмм](./user/configure.md) + - [Блок фильтра](./user/filter.md) +- Руководство для разработчиков + - [Справка по API](./dev/index.md) + - [Пошаговое руководство](./step-by-step/index.md) +- [Часто задаваемые вопросы (FAQ)](./faq.md) + +## План развития + +- Упрощённая обработка и преобразование данных +- Возможность добавления диаграмм в всплывающие окна +- Встраивание других блоков (например, Markdown) внутрь блоков диаграмм +- Сохранение настроек в виде шаблонов +- Реализация детализации данных (drill-down) +- Улучшенный контроль прав доступа diff --git a/docs/ru-RU/handbook/data-visualization/static/2023-11-28-14-06-23.png b/docs/ru-RU/handbook/data-visualization/static/2023-11-28-14-06-23.png new file mode 100644 index 0000000000..defc3e8a58 Binary files /dev/null and b/docs/ru-RU/handbook/data-visualization/static/2023-11-28-14-06-23.png differ diff --git a/docs/ru-RU/handbook/data-visualization/step-by-step/index.md b/docs/ru-RU/handbook/data-visualization/step-by-step/index.md new file mode 100644 index 0000000000..5c3069d608 --- /dev/null +++ b/docs/ru-RU/handbook/data-visualization/step-by-step/index.md @@ -0,0 +1,367 @@ +# Расширенное руководство + +> В качестве примера рассмотрим добавление диаграмм ECharts. Полный код доступен в плагине `@nocobase/plugin-sample-add-custom-charts`. + +## Создание нового плагина + +Следуйте инструкциям из [Руководства по разработке плагинов](https://docs.nocobase.com/development/your-first-plugin) для создания нового плагина. Убедитесь, что добавили зависимости `echarts`, `echarts-for-react` и `@nocobase/plugin-data-visualization` в раздел `devDependencies` файла `package.json`. + +```bash +yarn pm create @nocobase/plugin-sample-add-custom-charts +npx lerna add echarts --scope=@nocobase/plugin-sample-add-custom-charts --dev +npx lerna add echarts-for-react --scope=@nocobase/plugin-sample-add-custom-charts --dev +``` + +```typescript +// package.json + +{ + "name": "@nocobase/plugin-sample-add-custom-charts", + "version": "0.14.0-alpha.7", + "main": "dist/server/index.js", + "devDependencies": { + "echarts": "^5.4.3", + "echarts-for-react": "^3.0.2" + }, + "peerDependencies": { + "@nocobase/client": "0.x", + "@nocobase/server": "0.x", + "@nocobase/test": "0.x", + "@nocobase/plugin-data-visualization": "0.x" + } +} +``` + +## React-компонент ECharts + +В отличие от G2Plot, где каждый тип диаграммы - отдельный компонент, ECharts использует единый компонент, который может отображать различные диаграммы с разными параметрами. Поскольку компонент из `echarts-for-react` является `PureComponent`, нам нужно обернуть его в `FunctionComponent`. + +```typescript +// client/echarts/react-echarts.tsx + +import React, { useEffect } from 'react'; +import ReactEChartsComponent, { EChartsInstance, EChartsReactProps } from 'echarts-for-react'; + +export const ReactECharts = (props: EChartsReactProps['option']) => { + const echartRef = React.useRef(); + useEffect(() => { + echartRef.current?.resize(); + }); + return (echartRef.current = e)} />; +}; +``` + +Компонент `echarts-for-react` не выполняет операцию `resize` при первом рендере. Так как плагин визуализации NocoBase может определять необходимость отображения компонента на основе текущей конфигурации, это может привести к некорректному отображению. Поэтому мы вручную выполняем `resize` при каждом обновлении. + +## Расширение класса `Chart` + +> Перед продолжением ознакомьтесь с [Руководством разработчика](../dev/index.md) для изучения соответствующих API. + +### Шаг 1 + +Так как ECharts - это комплексная библиотека, нам может потребоваться добавить несколько типов диаграмм одновременно. Для этого мы расширяем базовый класс `Chart`, создавая класс `ECharts` с реализацией основных методов. + +```typescript +// client/echarts/echarts.ts + +import { Chart } from '@nocobase/plugin-data-visualization/client'; + +export class ECharts extends Chart { + constructor({ + name, + title, + series, + config, + }: { + name: string; + title: string; + series: any; + config?: ChartProps['config']; + }) { + super({ + name, + title, + component: ReactECharts, + config: ['xField', 'yField', 'seriesField', ...(config || [])], + }); + this.series = series; + } +} +``` + +ECharts настраивает различные типы диаграмм через параметр `series`. При создании базового класса мы добавляем этот параметр и передаем ранее определенный компонент `ReactECharts`. Параметр `config` предустановлен значениями по умолчанию для `xField`, `yField` и `seriesField`. + +### Шаг 2 + +Большинство распространенных типов диаграмм требуют конфигурации осей X, Y и полей классификации. Реализуем общий интерфейс `init` для инициализации конфигурации по умолчанию, используя метод `infer` из класса `Chart`. + +```typescript +init: ChartType['init'] = (fields, { measures, dimensions }) => { + const { xField, yField, seriesField } = this.infer(fields, { + measures, + dimensions, + }); + return { + general: { + xField: xField?.value, + yField: yField?.value, + seriesField: seriesField?.value, + }, + }; +}; +``` + +### Шаг 3 + +Реализуем метод `getProps` для преобразования конфигураций в свойства компонента ECharts. Этот метод также может устанавливать свойства по умолчанию. + +```typescript +getProps({ data, general, advanced, fieldProps }: RenderProps) { + const { xField, yField, seriesField } = general; + const xLabel = fieldProps[xField]?.label; + const yLabel = fieldProps[yField]?.label; + let seriesName = [yLabel]; + if (seriesField) { + seriesName = Array.from(new Set(data.map((row: any) => row[seriesField]))).map((value) => value || 'null'); + } + return deepmerge( + { + legend: { + data: seriesName, + }, + tooltip: { + data: seriesName, + }, + dataset: [ + { + dimensions: [xField, ...(seriesField ? seriesName : [yField])], + source: data, + }, + { + transform: [ + { + type: 'data-visualization:transform', + config: { fieldProps }, + }, + { + type: 'data-visualization:toSeries', + config: { xField, yField, seriesField }, + }, + ], + }, + ], + series: seriesName.map((name) => ({ + name, + datasetIndex: 1, + ...this.series, + })), + xAxis: { + name: xLabel, + type: 'category', + }, + yAxis: { + name: yLabel, + }, + animation: false, + }, + advanced, + ); + } +``` + +Эта логика обрабатывает сырые данные, конфигурации диаграмм и метаданные полей, преобразуя их в формат, необходимый для рендеринга компонента. В ECharts обработка данных может управляться через функции `transform`. + +### Шаг 4 + +Наконец, реализуем метод для получения справочной документации через `getReference`. ECharts объединяет все параметры диаграмм на одной странице, поэтому мы определим этот метод простым образом: + +```typescript +getReference() { + return { + title: 'ECharts', + link: 'https://echarts.apache.org/en/option.html', + }; + } +``` + +## Определение диаграмм + +После создания класса `ECharts` определение диаграмм становится простой задачей. Для большинства распространённых 2D-диаграмм общая логика уже инкапсулирована в классе `ECharts`, что исключает необходимость в дополнительных расширениях. + +```typescript +new ECharts({ + name: 'line', + title: 'Линейная диаграмма', + series: { type: 'line' }, +}); + +new ECharts({ + name: 'column', + title: 'Столбчатая диаграмма', + series: { type: 'bar' }, +}); + +new ECharts({ + name: 'area', + title: 'Диаграмма с областями', + series: { type: 'line', areaStyle: {} }, +}); +``` + +Вы также можете расширить некоторые параметры визуализации по необходимости. + +```typescript +new ECharts({ + name: 'line', + title: 'Линейная диаграмма', + series: { type: 'line' }, + config: [ + { + property: 'booleanField', + name: 'smooth', + title: 'Сглаживание', + }, + ], +}); +``` + +Для некоторых диаграмм общих методов может быть недостаточно, и потребуется дополнительная настройка. + +### Столбчатая диаграмма (Bar Chart): + +```typescript +export class Bar extends ECharts { + constructor() { + super({ + name: 'bar', + title: 'Гистограмма', + series: { type: 'bar' }, + }); + this.config = [ + { + property: 'yField', + title: 'xField', + }, + { + property: 'xField', + title: 'yField', + }, + 'seriesField', + ]; + } + + getProps({ data, general, advanced, fieldProps }: RenderProps) { + const props = super.getProps({ data, general, advanced, fieldProps }); + const xLabel = fieldProps[general.xField]?.label; + const yLabel = fieldProps[general.yField]?.label; + props.xAxis = { + ...props.xAxis, + type: 'value', + name: yLabel, + }; + props.yAxis = { + ...props.yAxis, + type: 'category', + name: xLabel, + }; + return props; + } +} + +new Bar(); +``` + +### Круговая диаграмма (Pie Chart): + +```typescript +export class Pie extends ECharts { + constructor() { + super({ + name: 'pie', + title: 'Круговая диаграмма', + series: { type: 'pie' }, + }); + this.config = [ + { + property: 'field', + name: 'angleField', + title: 'Поле значений', + required: true, + }, + { + property: 'field', + name: 'colorField', + title: 'Поле цвета', + required: true, + }, + ]; + } + + init: ChartType['init'] = (fields, { measures, dimensions }) => { + const { xField, yField } = this.infer(fields, { measures, dimensions }); + return { + general: { + colorField: xField?.value, + angleField: yField?.value, + }, + }; + }; + + getProps({ data, general, advanced, fieldProps }: RenderProps) { + return deepmerge( + { + legend: {}, + tooltip: {}, + dataset: [ + { + dimensions: [general.colorField, general.angleField], + source: data, + }, + { + transform: { + type: 'data-visualization:transform', + config: { fieldProps }, + }, + }, + ], + series: { + name: fieldProps[general.angleField]?.label, + datasetIndex: 1, + ...this.series, + }, + }, + advanced, + ); + } +} + +new Pie(); +``` + +## Добавление диаграмм + +```typescript +// client/index.ts +import DataVisualizationPlugin from '@nocobase/plugin-data-visualization/client'; + +export class PluginSampleAddCustomChartClient extends Plugin { + async afterAdd() { + // await this.app.pm.add() + } + + async beforeLoad() { + const plugin = this.app.pm.get(DataVisualizationPlugin); + plugin.charts.addGroup('echarts', { + title: 'ECharts', + charts: [ + new ECharts(), + // ... + // ... + ], + }); + } + + // Здесь можно получить и изменить экземпляр приложения + async load() {} +} +``` diff --git a/docs/ru-RU/handbook/data-visualization/step-by-step/static/IJiQbtTxwoLz8lxsgbwc77Ggntb.png b/docs/ru-RU/handbook/data-visualization/step-by-step/static/IJiQbtTxwoLz8lxsgbwc77Ggntb.png new file mode 100644 index 0000000000..82d6ea93f5 Binary files /dev/null and b/docs/ru-RU/handbook/data-visualization/step-by-step/static/IJiQbtTxwoLz8lxsgbwc77Ggntb.png differ diff --git a/docs/ru-RU/handbook/data-visualization/user/chart-block.md b/docs/ru-RU/handbook/data-visualization/user/chart-block.md new file mode 100644 index 0000000000..4a34a447e6 --- /dev/null +++ b/docs/ru-RU/handbook/data-visualization/user/chart-block.md @@ -0,0 +1,69 @@ +# Блок диаграмм + +Блок диаграмм представляет собой панель для организации нескольких диаграмм в едином пространстве. + +## Добавление блока + +1. Нажмите "Добавить блок" → "Диаграммы" для создания пустого блока диаграмм. + +![](https://static-docs.nocobase.com/790faf0a126e4ffcc3ff976818325cfd.png) + +2. Внутри блока нажмите "Добавить блок" → "Диаграмма" и выберите соответствующую коллекцию данных. Доступны только таблицы, которые пользователь имеет право просматривать. + +![](https://static-docs.nocobase.com/93ed2fada2478fba1b243d8705717a34.png) + +## Настройки блока + +![](https://static-docs.nocobase.com/202409022042315.png) + +Основные параметры: +- **Заголовок блока** - название для группы диаграмм +- **Фон** - отображение фонового цвета блока +- **Отступы** - настройка внутренних отступов блока + +Эти настройки особенно полезны для мобильных устройств или когда в блоке одна диаграмма. + + + +Функции управления диаграммами: +- ⚙️ **Настройка** - изменение параметров диаграммы +- ⎘ **Копирование** - дублирование текущей диаграммы +- 🗑️ **Удаление** - удаление диаграммы из блока + +## Настройка операций блока + +:::warning{title=Примечание} +Доступно в версиях `v1.4.0-alpha` и новее. +::: + +### Обновление данных + +Блок поддерживает: +- Кнопку ручного обновления всех диаграмм +- Настройку интервала автообновления (применяется ко всем диаграммам блока) + +![](https://static-docs.nocobase.com/202409022051107.png) +![](https://static-docs.nocobase.com/202409022054189.png) + +Пользователи могут временно изменять интервал автообновления (сбрасывается после перезагрузки страницы). + +![](https://static-docs.nocobase.com/202409022056097.png) + +## Настройка операций диаграмм + +:::info{title=Примечание} +Кнопки операций отображаются только при наведении на диаграмму. +::: + +### Обновление данных + +Отдельные диаграммы поддерживают: +- Кнопку ручного обновления +- Индивидуальные настройки автообновления + +![](https://static-docs.nocobase.com/202409022101033.png) + +:::info{title=Важно} +- Настройки автообновления диаграммы имеют приоритет над настройками блока +- Если для диаграммы автообновление отключено, применяются настройки блока +::: diff --git a/docs/ru-RU/handbook/data-visualization/user/configure.md b/docs/ru-RU/handbook/data-visualization/user/configure.md new file mode 100644 index 0000000000..62e7827ac5 --- /dev/null +++ b/docs/ru-RU/handbook/data-visualization/user/configure.md @@ -0,0 +1,123 @@ +# Панель настройки + +Панель настройки диаграммы разделена на три основные секции: **Настройка данных**, **Настройка диаграммы** и **Предварительный просмотр диаграммы**. + +https://static-docs.nocobase.com/202404192019222.png + +## Настройка данных + +https://static-docs.nocobase.com/202404192020544.png + +Выпадающий список в верхней части отображает текущую коллекцию, для которой выполняется настройка. Вы можете переключить её с помощью выпадающего меню. + +После завершения настройки нажатие кнопки **«Выполнить запрос»** приведёт к извлечению данных согласно заданным параметрам. Результат отобразится в панели **«Данные»**. + +### Показатели (Measures) + +https://static-docs.nocobase.com/202404192023854.png + +Поля-показатели содержат ключевые данные, которые будут отображаться на диаграмме. Эти поля могут быть агрегированы с помощью функций, таких как `Сумма`, `Количество`, `Среднее`, `Максимум` и `Минимум`. Вы можете добавить несколько полей-показателей и задать им псевдонимы по необходимости. + +### Измерения (Dimensions) + +https://static-docs.nocobase.com/202404192025717.png + +Поля-измерения определяют, как данные группируются на диаграмме. Для полей типа «дата» доступны различные варианты форматирования (см. изображение). Форматирование выполняется с помощью функций базы данных (например, `date_format` в MySQL). Для других типов данных см. раздел [Преобразование данных](#Преобразование-данных). + +:::info +**Форматирование измерений vs Преобразование данных** + +Форматирование измерений происходит до получения итоговых данных и группирует данные по отформатированным значениям измерений. Это особенно важно при фильтрации данных по временным периодам. + +Преобразование данных выполняется после получения данных и позволяет дополнительно обработать их для улучшения читаемости и внешнего вида. Такое преобразование применяется на стороне интерфейса. +::: + +### Фильтр + +https://static-docs.nocobase.com/202404192029597.png + +Фильтры применяются к данным до группировки. Вы можете использовать переменные для динамической фильтрации: + +- **Текущий пользователь**: информация о вошедшем в систему пользователе. +- **Переменные даты**: диапазоны дат, динамически рассчитываемые на основе текущей даты. +- **Текущий фильтр**: пользовательские поля фильтра, заданные в текущем блоке диаграммы. См. [Блок фильтра](./filter.md). + +### Сортировка и ограничение + +https://static-docs.nocobase.com/202404192034106.png + +По умолчанию набор данных ограничен максимум 2000 записями. + +### Кэширование + +https://static-docs.nocobase.com/202404192035918.png + +При включённом кэшировании диаграмма будет отображать данные из кэша. Вы можете настроить продолжительность хранения кэша по своему усмотрению. + +## Настройка диаграммы + +### Настройка контейнера + +В этом разделе можно настроить свойства контейнера, в котором отображается диаграмма. + +- **Заголовок диаграммы** +- **Показывать границу диаграммы** + +https://static-docs.nocobase.com/202404192037644.png + +Пример отображения заголовка диаграммы: + +https://static-docs.nocobase.com/202404192048473.png + +Пример отображения с границей диаграммы: + +https://static-docs.nocobase.com/202404192048223.png + +### Настройка диаграммы + +https://static-docs.nocobase.com/202404192050696.png + +- **Тип диаграммы**: здесь выбирается тип отображаемой диаграммы. В NocoBase по умолчанию используется библиотека диаграмм [Ant Design Charts](https://g2plot.antv.antgroup.com/) версии 2.x. Чтобы расширить функциональность и использовать другие библиотеки или компоненты, см. [Руководство для разработчиков](../dev/index.md). + +- **Базовая настройка**: после выбора типа диаграммы появляются основные параметры визуализации, такие как поля для осей X и Y, а также поля для категорий. Эти поля выбираются из выпадающего списка, где отображаются базовые поля и псевдонимы из коллекции. + +- **JSON-настройка**: если базовой настройки недостаточно, вы можете настроить дополнительные свойства компонента диаграммы с помощью JSON. Подробности см. в документации к компоненту диаграммы. Чтобы включить JavaScript-выражения в JSON-настройку, заключите их в `{{}}`. Например: + +```json +{ + "label": { + "type": "inner", + "content": "{{ ({ percent }) => `${(percent * 100).toFixed(0)}%` }}" + } +} +``` + +## Преобразование данных + +https://static-docs.nocobase.com/202404192109597.png + +Преобразование данных позволяет дополнительно обрабатывать полученные данные. Поддерживаемые типы данных для преобразования: `number`, `date`, `time` и `datetime`. Для полей других типов вы можете вручную назначить один из этих типов, чтобы применить соответствующие методы преобразования. + +К одному полю можно применить несколько методов преобразования. Они выполняются последовательно, и результат каждого шага передаётся на следующий. Вы можете изменить порядок шагов перетаскиванием. + +:::warning +Обратите внимание, что некоторые методы преобразования могут изменять исходный тип данных. При применении нескольких преобразований убедитесь, что выбираете правильный метод, исходя из типа данных после каждого шага. Например, при форматировании числа как валюты (с добавлением префикса и точности), сначала нужно настроить точность, а затем добавить префикс. Это связано с тем, что после добавления префикса число становится строкой, и дальнейшее изменение точности уже не применяется. +::: + +Поддерживаемые методы преобразования: + +| Тип | Метод | Описание | Результатирующий тип | +| --- | --- | --- | --- | +| **Число (number)** | Префикс | Добавляет текст в начало | строка | +| | Суффикс | Добавляет текст в конец | строка | +| | Точность | 1, 1.0, 1.00, 1.000 | число | +| | Разделитель | 100,000.00 (англ.), 100.000,00 (нем.) и т.д. | строка | +| | Проценты | Преобразует число в процент | строка | +| | Научная запись | Например: 1e+6 | число | +| | Сокращение | 1K, 1M, 1B и т.д. | строка | +| **Дата/время (datetime, date, time)** | Форматирование | Использует предустановленные или пользовательские форматы, например: YYYY-MM-DD. См. документацию [dayjs](https://day.js.org/) | строка | +| | Префикс | Добавляет текст в начало | строка | +| | Суффикс | Добавляет текст в конец | строка | +| **Строка (string)** | Преобразование типа | Преобразует строку в другой тип, например: дата/время или число | дата, число | +| | Префикс | Добавляет текст в начало | строка | +| | Суффикс | Добавляет текст в конец | строка | diff --git a/docs/ru-RU/handbook/data-visualization/user/filter.md b/docs/ru-RU/handbook/data-visualization/user/filter.md new file mode 100644 index 0000000000..08809297cc --- /dev/null +++ b/docs/ru-RU/handbook/data-visualization/user/filter.md @@ -0,0 +1,69 @@ +# Блоки фильтров + +Блок фильтров в составе блока диаграмм позволяет осуществлять динамическую фильтрацию данных для нескольких диаграмм внутри одного блока. + +## Включение/отключение + +Для активации или деактивации блока фильтров перейдите в блок диаграмм и выберите "Добавить блок" → "Фильтр". + +![](https://static-docs.nocobase.com/d0e6b116952fa6b719acb0f858b432c3.png) + +## Настройка полей + +### Поля коллекций + +Для диаграмм внутри текущего блока можно создать поле фильтрации, выбрав соответствующие поля непосредственно из связанной коллекции. + +![](https://static-docs.nocobase.com/e2ef150e9beb8c78004d9049a7536219.png) + +Поля формы можно настроить следующим образом: + +![](https://static-docs.nocobase.com/215f0b996e69bf2d5b99746e6d521c3d.png) + +- Редактирование названия поля +- Редактирование описания +- Определение оператора для применения фильтра + ![](https://static-docs.nocobase.com/d6a593a330d27da4ea78124dfdb8450d.png) + +- Установка значения по умолчанию с возможностью использования переменных (тип данных переменной должен соответствовать типу поля) + ![](https://static-docs.nocobase.com/37dee4008f3283db24d491fb8f0404fa.png) + + Примеры: + - Установка ID текущего пользователя для автоматической фильтрации данных + - Установка текущей даты для фильтрации данных по умолчанию + +### Пользовательские поля + +Когда требуется использовать одно поле фильтра для разных полей в различных таблицах (например, одно поле даты для фильтрации разных полей даты в разных таблицах), можно создать пользовательское поле. + +![](https://static-docs.nocobase.com/87544594246453d175ef265030c0801a.png) + +При добавлении пользовательского поля необходимо: +1. Указать название поля +2. Выбрать соответствующий компонент поля +3. При необходимости использовать конфигурацию метаданных из существующих полей + +![](https://static-docs.nocobase.com/ef09136d674d4b7356e819350bcac804.png) + +Для реализации: +1. Откройте конфигурацию нужной диаграммы +2. В настройках фильтрации добавьте условия, используя переменные из "Текущего фильтра" +3. Убедитесь в совпадении типов данных + +![](https://static-docs.nocobase.com/f9f2487c4da4b2024af1556743beab6c.png) + +Для пользовательских полей также доступны: +- Настройка заголовка +- Добавление описания +- Установка значений по умолчанию + +![](https://static-docs.nocobase.com/4a8feb12404f5cc5e74d589263307e5a.png) + +## Настройка действий блока + +- **Фильтр:** Применить условия фильтрации +- **Сброс:** Очистить форму фильтра +- **Свернуть/Развернуть:** Переключение между компактным и развернутым видом + +![](https://static-docs.nocobase.com/8619ac90fa045b3a9c6d6610f7be1a81.png) + diff --git a/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-15-16-21.png b/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-15-16-21.png new file mode 100644 index 0000000000..7127e73a70 Binary files /dev/null and b/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-15-16-21.png differ diff --git a/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-15-17-23.png b/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-15-17-23.png new file mode 100644 index 0000000000..8a23b77ba0 Binary files /dev/null and b/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-15-17-23.png differ diff --git a/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-15-19-16.png b/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-15-19-16.png new file mode 100644 index 0000000000..2228432a52 Binary files /dev/null and b/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-15-19-16.png differ diff --git a/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-17-48-11.png b/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-17-48-11.png new file mode 100644 index 0000000000..d127ba7a59 Binary files /dev/null and b/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-17-48-11.png differ diff --git a/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-18-03-03.png b/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-18-03-03.png new file mode 100644 index 0000000000..030514f64a Binary files /dev/null and b/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-18-03-03.png differ diff --git a/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-20-23-34.png b/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-20-23-34.png new file mode 100644 index 0000000000..ae3348255d Binary files /dev/null and b/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-20-23-34.png differ diff --git a/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-20-27-51.png b/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-20-27-51.png new file mode 100644 index 0000000000..24f15ca777 Binary files /dev/null and b/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-20-27-51.png differ diff --git a/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-20-29-44.png b/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-20-29-44.png new file mode 100644 index 0000000000..8e7f901758 Binary files /dev/null and b/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-20-29-44.png differ diff --git a/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-20-32-30.png b/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-20-32-30.png new file mode 100644 index 0000000000..e5f02f3dfb Binary files /dev/null and b/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-20-32-30.png differ diff --git a/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-20-38-59.png b/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-20-38-59.png new file mode 100644 index 0000000000..e9b974b83c Binary files /dev/null and b/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-20-38-59.png differ diff --git a/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-20-39-43.png b/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-20-39-43.png new file mode 100644 index 0000000000..4705a6ad23 Binary files /dev/null and b/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-20-39-43.png differ diff --git a/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-20-42-32.png b/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-20-42-32.png new file mode 100644 index 0000000000..075874c61b Binary files /dev/null and b/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-20-42-32.png differ diff --git a/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-20-45-41.png b/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-20-45-41.png new file mode 100644 index 0000000000..8979f6012a Binary files /dev/null and b/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-20-45-41.png differ diff --git a/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-20-49-18.png b/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-20-49-18.png new file mode 100644 index 0000000000..17485590d9 Binary files /dev/null and b/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-20-49-18.png differ diff --git a/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-20-50-20.png b/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-20-50-20.png new file mode 100644 index 0000000000..1318273d2e Binary files /dev/null and b/docs/ru-RU/handbook/data-visualization/user/static/2023-11-28-20-50-20.png differ diff --git a/docs/ru-RU/handbook/data-visualization/user/static/A680brszPoHrB7xFEWucIdjjnSg.png b/docs/ru-RU/handbook/data-visualization/user/static/A680brszPoHrB7xFEWucIdjjnSg.png new file mode 100644 index 0000000000..970e3462b1 Binary files /dev/null and b/docs/ru-RU/handbook/data-visualization/user/static/A680brszPoHrB7xFEWucIdjjnSg.png differ diff --git a/docs/ru-RU/handbook/data-visualization/user/static/BlkEby9Z7or3CWxvhTCcLXumnHf.png b/docs/ru-RU/handbook/data-visualization/user/static/BlkEby9Z7or3CWxvhTCcLXumnHf.png new file mode 100644 index 0000000000..dfef1a1017 Binary files /dev/null and b/docs/ru-RU/handbook/data-visualization/user/static/BlkEby9Z7or3CWxvhTCcLXumnHf.png differ diff --git a/docs/ru-RU/handbook/data-visualization/user/static/DEFSbBh6WoujLyxoktHcXEADnom.png b/docs/ru-RU/handbook/data-visualization/user/static/DEFSbBh6WoujLyxoktHcXEADnom.png new file mode 100644 index 0000000000..6ae09ac625 Binary files /dev/null and b/docs/ru-RU/handbook/data-visualization/user/static/DEFSbBh6WoujLyxoktHcXEADnom.png differ diff --git a/docs/ru-RU/handbook/data-visualization/user/static/E2pwbBm4BofyHzxut4jcjonJn0s.png b/docs/ru-RU/handbook/data-visualization/user/static/E2pwbBm4BofyHzxut4jcjonJn0s.png new file mode 100644 index 0000000000..ee654dd5bb Binary files /dev/null and b/docs/ru-RU/handbook/data-visualization/user/static/E2pwbBm4BofyHzxut4jcjonJn0s.png differ diff --git a/docs/ru-RU/handbook/data-visualization/user/static/K0trbvxhxoVayLx84sUcX5nLnUh.png b/docs/ru-RU/handbook/data-visualization/user/static/K0trbvxhxoVayLx84sUcX5nLnUh.png new file mode 100644 index 0000000000..42ec6e996b Binary files /dev/null and b/docs/ru-RU/handbook/data-visualization/user/static/K0trbvxhxoVayLx84sUcX5nLnUh.png differ diff --git a/docs/ru-RU/handbook/data-visualization/user/static/OjTRbDlhHo32npxFBsicKGJinXd.png b/docs/ru-RU/handbook/data-visualization/user/static/OjTRbDlhHo32npxFBsicKGJinXd.png new file mode 100644 index 0000000000..68d884f5cd Binary files /dev/null and b/docs/ru-RU/handbook/data-visualization/user/static/OjTRbDlhHo32npxFBsicKGJinXd.png differ diff --git a/docs/ru-RU/handbook/data-visualization/user/static/R0VlbVbkEoVcL1xA2xEcxHQLn1c.png b/docs/ru-RU/handbook/data-visualization/user/static/R0VlbVbkEoVcL1xA2xEcxHQLn1c.png new file mode 100644 index 0000000000..a07d41fb05 Binary files /dev/null and b/docs/ru-RU/handbook/data-visualization/user/static/R0VlbVbkEoVcL1xA2xEcxHQLn1c.png differ diff --git a/docs/ru-RU/handbook/data-visualization/user/static/SVYhbc1LNoFSvzxYoOAc78mvn3e.png b/docs/ru-RU/handbook/data-visualization/user/static/SVYhbc1LNoFSvzxYoOAc78mvn3e.png new file mode 100644 index 0000000000..53b307c6a4 Binary files /dev/null and b/docs/ru-RU/handbook/data-visualization/user/static/SVYhbc1LNoFSvzxYoOAc78mvn3e.png differ diff --git a/docs/ru-RU/handbook/data-visualization/user/static/SdgrbugCjopiffxOrLZcZKhxnEh.png b/docs/ru-RU/handbook/data-visualization/user/static/SdgrbugCjopiffxOrLZcZKhxnEh.png new file mode 100644 index 0000000000..7fea068317 Binary files /dev/null and b/docs/ru-RU/handbook/data-visualization/user/static/SdgrbugCjopiffxOrLZcZKhxnEh.png differ diff --git a/docs/ru-RU/handbook/data-visualization/user/static/TUZCbKXHOo6fN6xfxSWcjkhhngg.png b/docs/ru-RU/handbook/data-visualization/user/static/TUZCbKXHOo6fN6xfxSWcjkhhngg.png new file mode 100644 index 0000000000..05d7e9a83e Binary files /dev/null and b/docs/ru-RU/handbook/data-visualization/user/static/TUZCbKXHOo6fN6xfxSWcjkhhngg.png differ diff --git a/docs/ru-RU/handbook/data-visualization/user/static/TdsOb1FBfomRaxxSdrHciggGnub.png b/docs/ru-RU/handbook/data-visualization/user/static/TdsOb1FBfomRaxxSdrHciggGnub.png new file mode 100644 index 0000000000..5fed0a0726 Binary files /dev/null and b/docs/ru-RU/handbook/data-visualization/user/static/TdsOb1FBfomRaxxSdrHciggGnub.png differ diff --git a/docs/ru-RU/handbook/data-visualization/user/static/UrFGbUN1GonqkpxyaUUclAefns3.png b/docs/ru-RU/handbook/data-visualization/user/static/UrFGbUN1GonqkpxyaUUclAefns3.png new file mode 100644 index 0000000000..9ff3163b87 Binary files /dev/null and b/docs/ru-RU/handbook/data-visualization/user/static/UrFGbUN1GonqkpxyaUUclAefns3.png differ diff --git a/docs/ru-RU/handbook/departments/index.md b/docs/ru-RU/handbook/departments/index.md new file mode 100644 index 0000000000..8141363f0b --- /dev/null +++ b/docs/ru-RU/handbook/departments/index.md @@ -0,0 +1,17 @@ +# Отделы + + + +## Введение + +Плагин departments поддерживает организацию пользователей в виде отделов в NocoBase, устанавливая отношения начальник-подчиненный. Вы можете управлять правами доступа группы пользователей, привязывая роли к отделам. Он поддерживает использование информации об отделе в качестве переменных для рабочих процессов и выражений, а также в других местах, где поддерживается настройка переменных. + +![](https://static-docs.nocobase.com/a6eb94a5cc85a6c7b310f33173a5259d.png) + +## Установка + +Этот плагин является коммерческим, его необходимо загрузить и активировать через менеджер плагинов. + +![](https://static-docs.nocobase.com/907d85bc27f90eaa91b17d568f6dbbd7.png) + +![](https://static-docs.nocobase.com/c1e704259f7ae6ef4998a04a1d21e480.png) diff --git a/docs/ru-RU/handbook/departments/manual.md b/docs/ru-RU/handbook/departments/manual.md new file mode 100644 index 0000000000..7d6a6c87a4 --- /dev/null +++ b/docs/ru-RU/handbook/departments/manual.md @@ -0,0 +1,89 @@ +# Руководство пользователя + +## Управление отделом + +![](https://static-docs.nocobase.com/a6eb94a5cc85a6c7b310f33173a5259d.png) + +### Создать новый отдел + +![](https://static-docs.nocobase.com/4857910991ae374b63251cee99511e93.png) + +![](https://static-docs.nocobase.com/0cd13d99dcd21ced0bb1683557f0b76b.png) + +### Создать подотдел + +![](https://static-docs.nocobase.com/0be8c7db8d12c23f6fe137e7ce23688a.png) + +![](https://static-docs.nocobase.com/2db2fc2037ed383edd60117a46fc9dd0.png) + +### Отдел редактирования + +![](https://static-docs.nocobase.com/a147319577e5cc36b5862c1e511f6722.png) + +![](https://static-docs.nocobase.com/f206f866753cf30ac78aadf4f76bad32.png) + +### Изменить вышестоящий отдел + +Измените поле вышестоящий отдел в форме редактирования отдела. Текущий отдел и его подотделы невозможно выбрать. + +![](https://static-docs.nocobase.com/9d80ddf42f32c77186566ed8ada70128.png) + +## Управление сотрудниками отдела + +### Просмотр списка сотрудников отдела + +![](https://static-docs.nocobase.com/2aaf4d9bf55da105b5fca4e9f7e23ca7.png) + +### Добавить участников в отдел + +Пользователь может присоединиться к нескольким отделам одновременно. Первый отдел, к которому он присоединяется, является основным отделом по умолчанию. У пользователя есть только один основной отдел. + +![](https://static-docs.nocobase.com/60afd282f33b555e6fe0662b9da544cc.png) + +Пользователи, которые уже являются сотрудниками отдела, не будут отображаться в списке выбора пользователей. + +![](https://static-docs.nocobase.com/6bcd93173c169973f970de35d2657993.png) + +### Назначить руководителя отдела + +Нажмите на поле "Владельцы" в форме редактирования отдела, чтобы выбрать сотрудника отдела в качестве владельца. Поддерживается множественный выбор. Сотрудники, которые уже являются владельцами отдела, не будут отображаться в списке выбора участников. + +![](https://static-docs.nocobase.com/92970546cbd0aeb5a8b6a36da87583bd.png) + +### Настройте отделы для пользователей + +Помимо добавления участников в отдел, вы также можете настроить отделы для пользователей с точки зрения пользователя. + +![](https://static-docs.nocobase.com/ca82a802012572e225570e8be93a4094.png) + +Отделы, которые уже были объединены, невозможно выбрать. + +![](https://static-docs.nocobase.com/70e16d17ee9c4b5d43f8a5e1c633b177.png) + +### Сменить Главный отдел + +![](https://static-docs.nocobase.com/da92dd1e10268adcd35445e9f1dac771.png) + +## Управление ролями отдела + +Связав одну или несколько ролей с отделом, сотрудники текущего отдела могут получить эти роли. + +Существует два способа связать роли с отделом. + +Первый - выбрать роль в поле "Роль" формы редактирования отдела. + +![](https://static-docs.nocobase.com/70f77bb89aa1fb415c152a51a51cc23b.png) + +Второй способ заключается в добавлении отделов к соответствующей роли в управлении ролями. + +![](https://static-docs.nocobase.com/f2a7bec937cf2f179ce868a92b98416d.png) + +Отделы, у которых уже есть эта роль, не могут быть выбраны. + +![](https://static-docs.nocobase.com/be10299893581e1f97a4e01ddd5c7e59.png) + +## Поиск пользователей и отделов + +Поиск пользователей по нику, имени пользователя, телефону, электронной почте и поиск отделов по названию отдела. + +![](https://static-docs.nocobase.com/2d71346a5400205b22436b4db331a9b8.png) diff --git a/docs/ru-RU/handbook/departments/static/2024-03-03-17-53-47.png b/docs/ru-RU/handbook/departments/static/2024-03-03-17-53-47.png new file mode 100644 index 0000000000..281ee356ef Binary files /dev/null and b/docs/ru-RU/handbook/departments/static/2024-03-03-17-53-47.png differ diff --git a/docs/ru-RU/handbook/departments/static/2024-03-04-11-25-32.png b/docs/ru-RU/handbook/departments/static/2024-03-04-11-25-32.png new file mode 100644 index 0000000000..e47a2146a0 Binary files /dev/null and b/docs/ru-RU/handbook/departments/static/2024-03-04-11-25-32.png differ diff --git a/docs/ru-RU/handbook/departments/static/2024-03-04-11-27-44.png b/docs/ru-RU/handbook/departments/static/2024-03-04-11-27-44.png new file mode 100644 index 0000000000..9c77df12e3 Binary files /dev/null and b/docs/ru-RU/handbook/departments/static/2024-03-04-11-27-44.png differ diff --git a/docs/ru-RU/handbook/departments/static/2024-03-04-11-28-38.png b/docs/ru-RU/handbook/departments/static/2024-03-04-11-28-38.png new file mode 100644 index 0000000000..b65900d87c Binary files /dev/null and b/docs/ru-RU/handbook/departments/static/2024-03-04-11-28-38.png differ diff --git a/docs/ru-RU/handbook/departments/static/2024-03-04-11-51-21.png b/docs/ru-RU/handbook/departments/static/2024-03-04-11-51-21.png new file mode 100644 index 0000000000..8e50495a0d Binary files /dev/null and b/docs/ru-RU/handbook/departments/static/2024-03-04-11-51-21.png differ diff --git a/docs/ru-RU/handbook/departments/static/2024-03-04-11-52-50.png b/docs/ru-RU/handbook/departments/static/2024-03-04-11-52-50.png new file mode 100644 index 0000000000..62c4677abe Binary files /dev/null and b/docs/ru-RU/handbook/departments/static/2024-03-04-11-52-50.png differ diff --git a/docs/ru-RU/handbook/departments/static/2024-03-04-11-54-00.png b/docs/ru-RU/handbook/departments/static/2024-03-04-11-54-00.png new file mode 100644 index 0000000000..0282c05988 Binary files /dev/null and b/docs/ru-RU/handbook/departments/static/2024-03-04-11-54-00.png differ diff --git a/docs/ru-RU/handbook/departments/static/2024-03-04-11-56-10.png b/docs/ru-RU/handbook/departments/static/2024-03-04-11-56-10.png new file mode 100644 index 0000000000..2ad79f904e Binary files /dev/null and b/docs/ru-RU/handbook/departments/static/2024-03-04-11-56-10.png differ diff --git a/docs/ru-RU/handbook/departments/static/2024-03-04-11-56-23.png b/docs/ru-RU/handbook/departments/static/2024-03-04-11-56-23.png new file mode 100644 index 0000000000..d183db4d4a Binary files /dev/null and b/docs/ru-RU/handbook/departments/static/2024-03-04-11-56-23.png differ diff --git a/docs/ru-RU/handbook/departments/static/2024-03-04-11-57-41.png b/docs/ru-RU/handbook/departments/static/2024-03-04-11-57-41.png new file mode 100644 index 0000000000..2d0c1bbe21 Binary files /dev/null and b/docs/ru-RU/handbook/departments/static/2024-03-04-11-57-41.png differ diff --git a/docs/ru-RU/handbook/departments/static/2024-03-04-11-57-54.png b/docs/ru-RU/handbook/departments/static/2024-03-04-11-57-54.png new file mode 100644 index 0000000000..ba70313f0e Binary files /dev/null and b/docs/ru-RU/handbook/departments/static/2024-03-04-11-57-54.png differ diff --git a/docs/ru-RU/handbook/departments/static/2024-03-04-11-59-30.png b/docs/ru-RU/handbook/departments/static/2024-03-04-11-59-30.png new file mode 100644 index 0000000000..c000e2b7a6 Binary files /dev/null and b/docs/ru-RU/handbook/departments/static/2024-03-04-11-59-30.png differ diff --git a/docs/ru-RU/handbook/departments/static/2024-03-04-12-00-58.png b/docs/ru-RU/handbook/departments/static/2024-03-04-12-00-58.png new file mode 100644 index 0000000000..8a12e391e9 Binary files /dev/null and b/docs/ru-RU/handbook/departments/static/2024-03-04-12-00-58.png differ diff --git a/docs/ru-RU/handbook/departments/static/2024-03-04-12-04-03.png b/docs/ru-RU/handbook/departments/static/2024-03-04-12-04-03.png new file mode 100644 index 0000000000..72ad017e8a Binary files /dev/null and b/docs/ru-RU/handbook/departments/static/2024-03-04-12-04-03.png differ diff --git a/docs/ru-RU/handbook/departments/static/2024-03-04-12-04-46.png b/docs/ru-RU/handbook/departments/static/2024-03-04-12-04-46.png new file mode 100644 index 0000000000..c8be2f73c4 Binary files /dev/null and b/docs/ru-RU/handbook/departments/static/2024-03-04-12-04-46.png differ diff --git a/docs/ru-RU/handbook/departments/static/2024-03-04-12-05-59.png b/docs/ru-RU/handbook/departments/static/2024-03-04-12-05-59.png new file mode 100644 index 0000000000..eee712deb5 Binary files /dev/null and b/docs/ru-RU/handbook/departments/static/2024-03-04-12-05-59.png differ diff --git a/docs/ru-RU/handbook/departments/static/2024-03-04-20-24-34.png b/docs/ru-RU/handbook/departments/static/2024-03-04-20-24-34.png new file mode 100644 index 0000000000..72e3663b94 Binary files /dev/null and b/docs/ru-RU/handbook/departments/static/2024-03-04-20-24-34.png differ diff --git a/docs/ru-RU/handbook/departments/static/2024-03-04-20-25-31.png b/docs/ru-RU/handbook/departments/static/2024-03-04-20-25-31.png new file mode 100644 index 0000000000..96a4cf265d Binary files /dev/null and b/docs/ru-RU/handbook/departments/static/2024-03-04-20-25-31.png differ diff --git a/docs/ru-RU/handbook/departments/static/2024-03-04-20-26-42.png b/docs/ru-RU/handbook/departments/static/2024-03-04-20-26-42.png new file mode 100644 index 0000000000..41d44cc9ac Binary files /dev/null and b/docs/ru-RU/handbook/departments/static/2024-03-04-20-26-42.png differ diff --git a/docs/ru-RU/handbook/departments/static/2024-03-04-20-27-04.png b/docs/ru-RU/handbook/departments/static/2024-03-04-20-27-04.png new file mode 100644 index 0000000000..69f1c232a8 Binary files /dev/null and b/docs/ru-RU/handbook/departments/static/2024-03-04-20-27-04.png differ diff --git a/docs/ru-RU/handbook/departments/static/image.png b/docs/ru-RU/handbook/departments/static/image.png new file mode 100644 index 0000000000..1dcee93a9b Binary files /dev/null and b/docs/ru-RU/handbook/departments/static/image.png differ diff --git a/docs/ru-RU/handbook/email-manager/usage-admin.md b/docs/ru-RU/handbook/email-manager/usage-admin.md new file mode 100644 index 0000000000..9b02cb1f3f --- /dev/null +++ b/docs/ru-RU/handbook/email-manager/usage-admin.md @@ -0,0 +1,355 @@ +# Менеджер электронной почты: Настройка администратора + + + +## Введение +Плагин Менеджер электронной почты — это эффективный и удобный инструмент, поддерживающий авторизацию через Gmail и Outlook. Он интегрирует функции управления и отправки писем в различные блоки и страницы. Простая настройка авторизации позволяет пользователям осуществлять централизованное управление несколькими учётными записями и наслаждаться бесперебойным обменом электронными письмами. + +## Процесс настройки + +После активации плагина электронной почты администратор должен завершить настройку, прежде чем обычные пользователи смогут подключить свои учётные записи к NocoBase. В настоящее время поддерживаются только учётные записи Outlook и Gmail через авторизацию. Прямая интеграция с учётными записями Microsoft и Google недоступна. + +Основой настройки является конфигурация API-аутентификации с поставщиками почтовых услуг. Администратор должен выполнить следующие шаги для обеспечения правильной работы плагина: + +1. **Получение данных аутентификации от поставщиков** + - Войдите в консоль разработчика почтового сервиса (например, Google Cloud Console или Microsoft Azure Portal). + - Создайте новое приложение или проект, включив службы API Gmail или Outlook. + - Получите идентификатор клиента (Client ID) и секрет клиента (Client Secret). + - Настройте URI перенаправления, чтобы он соответствовал обратному адресу плагина в NocoBase. + +2. **Настройка поставщика услуг** + - Перейдите на страницу настройки плагина. + - Введите необходимые данные аутентификации API, включая идентификатор и секрет клиента, чтобы обеспечить правильную интеграцию с поставщиком почтовых услуг. + +3. **Авторизованный вход** + - Пользователи входят в свои учётные записи электронной почты через протокол OAuth. + - Плагин автоматически создаёт и сохраняет токены авторизации пользователя для последующих вызовов API и операций с электронной почтой. + +4. **Интеграция электронной почты** + - После успешной авторизации учётные записи электронной почты пользователей интегрируются в NocoBase. + - Плагин синхронизирует данные электронной почты и предоставляет функции управления и отправки. + +5. **Использование функций электронной почты** + - Пользователи могут просматривать, управлять и отправлять электронные письма непосредственно в платформе. + - Все операции выполняются через вызовы API к поставщику почтовых услуг, обеспечивая синхронизацию в реальном времени и эффективное общение. + +Следуя описанному процессу, плагин электронной почты NocoBase обеспечивает эффективное и безопасное управление электронной почтой. Если у вас возникнут проблемы во время настройки, обратитесь к соответствующей документации или свяжитесь со службой технической поддержки за помощью. + +## Настройка плагина + +### Включение плагина электронной почты + +1. Перейдите на страницу управления плагинами. +2. Найдите плагин «Менеджер электронной почты» и включите его. + +### Настройка поставщика электронной почты + +После включения плагина электронной почты приступите к настройке поставщика электронной почты. В настоящее время поддерживаются службы электронной почты Google и Microsoft. Нажмите «Настройки» → «Настройки электронной почты», чтобы перейти на страницу настройки. + +![](https://static-docs.nocobase.com/mail-1733818617187.png) + +![](https://static-docs.nocobase.com/mail-1733818617514.png) + +Для каждого поставщика требуется идентификатор и секрет клиента. В следующих разделах подробно описано, как получить эти параметры. + +## Настройка Google + +### Предварительные требования + +1. Чтобы пользователи могли подключить учётные записи Gmail к NocoBase, разверните NocoBase на сервере, который поддерживает доступ к сервисам Google, поскольку бэкенд будет вызывать API Google. + +### Регистрация учётной записи + +1. Откройте [Google Cloud Console](https://console.cloud.google.com/welcome). +2. Согласитесь с условиями при первом доступе. + +![](https://static-docs.nocobase.com/mail-1733818617807.png) + +### Создание приложения + +1. Нажмите «Выбрать проект» в верхней части + +![](https://static-docs.nocobase.com/mail-1733818618126.png) + +2. Нажмите «НОВЫЙ ПРОЕКТ» в модальном окне + +![](https://static-docs.nocobase.com/mail-1733818618329.png) + +3. Заполните сведения о проекте + +![](https://static-docs.nocobase.com/mail-1733818618510.png) + +4. Выберите созданный проект + +![](https://static-docs.nocobase.com/mail-1733818618828.png) + +![](https://static-docs.nocobase.com/mail-1733818619044.png) + +### Включение API Gmail + +1. Нажмите кнопку «API и службы» + +![](https://static-docs.nocobase.com/mail-1733818619230.png) + +2. Перейдите на панель «API и службы» + +![](https://static-docs.nocobase.com/mail-1733818619419.png) + +3. Найдите «mail» + +![](https://static-docs.nocobase.com/mail-1733818619810.png) + +![](https://static-docs.nocobase.com/mail-1733818620020.png) + +4. Нажмите «ВКЛЮЧИТЬ», чтобы активировать API Gmail + +![](https://static-docs.nocobase.com/mail-1733818620589.png) + +![](https://static-docs.nocobase.com/mail-1733818620885.png) + +### Настройка экрана согласия OAuth + +1. Нажмите «Экран согласия OAuth» слева + +![](https://static-docs.nocobase.com/mail-1733818621104.png) + +2. Выберите «Внешний» + +![](https://static-docs.nocobase.com/mail-1733818621322.png) + +3. Заполните сведения о проекте (отображаются на странице авторизации) и сохраните + +![](https://static-docs.nocobase.com/mail-1733818621538.png) + +4. Введите контактную информацию разработчика и нажмите «Продолжить» + +![](https://static-docs.nocobase.com/mail-1733818621749.png) + +5. Нажмите «Продолжить» + +![](https://static-docs.nocobase.com/mail-1733818622121.png) + +6. Добавьте тестовых пользователей для предварительного тестирования + +![](https://static-docs.nocobase.com/mail-1733818622332.png) + +![](https://static-docs.nocobase.com/mail-1733818622537.png) + +7. Нажмите «Продолжить» + +![](https://static-docs.nocobase.com/mail-1733818622753.png) + +8. Просмотрите сводную информацию и вернитесь на панель управления + +![](https://static-docs.nocobase.com/mail-1733818622984.png) + +### Создание учётных данных + +1. Нажмите «Учётные данные» слева + +![](https://static-docs.nocobase.com/mail-1733818623168.png) + +2. Нажмите «СОЗДАТЬ УЧЁТНЫЕ ДАННЫЕ» и выберите «Идентификатор клиента OAuth» + +![](https://static-docs.nocobase.com/mail-1733818623386.png) + +3. Выберите «Веб-приложение» + +![](https://static-docs.nocobase.com/mail-1733818623758.png) + +4. Введите сведения о приложении + +![](https://static-docs.nocobase.com/mail-1733818623992.png) + +5. Введите домен окончательного развертывания (например, тестовый адрес NocoBase) + +![](https://static-docs.nocobase.com/mail-1733818624188.png) + +6. Добавьте авторизованный URI обратного вызова: `домен + "/admin/settings/mail/oauth2"`. Пример: `https://pr-1-mail.test.nocobase.com/admin/settings/mail/oauth2` + +![](https://static-docs.nocobase.com/mail-1733818624449.png) + +7. Нажмите «Создать», чтобы просмотреть сведения OAuth + +![](https://static-docs.nocobase.com/mail-1733818624701.png) + +8. Скопируйте идентификатор и секрет клиента на страницу настройки электронной почты + +![](https://static-docs.nocobase.com/mail-1733818624923.png) + +9. Нажмите «Сохранить», чтобы завершить настройку + +### Публикация приложения + +После завершения настройки и тестирования перейдите к публикации приложения: проверьте права пользователя и отправьте приложение на проверку. + +1. Нажмите меню «Экран согласия OAuth» + +![](https://static-docs.nocobase.com/mail-1733818625124.png) + +2. Нажмите кнопку «ИЗМЕНИТЬ ПРИЛОЖЕНИЕ», затем — «СОХРАНИТЬ И ПРОДОЛЖИТЬ» внизу + +![](https://static-docs.nocobase.com/mail-1735633686380.png) + +![](https://static-docs.nocobase.com/mail-1735633686750.png) + +3. Нажмите кнопку «ДОБАВИТЬ ИЛИ УДАЛИТЬ ОБЛАСТИ ДОСТУПА (SCOPES)», чтобы выбрать права пользователя + +![](https://static-docs.nocobase.com/mail-1735633687054.png) + +4. Введите в поле поиска «Gmail API», затем выберите «Gmail API» (убедитесь, что значение области доступа — «https://mail.google.com/») + +![](https://static-docs.nocobase.com/mail-1735633687283.png) + +5. Нажмите кнопку «ОБНОВИТЬ» внизу, чтобы сохранить + +![](https://static-docs.nocobase.com/mail-1735633687536.png) + +6. Нажмите «СОХРАНИТЬ И ПРОДОЛЖИТЬ» внизу каждой страницы, затем — «ВЕРНУТЬСЯ НА ПАНЕЛЬ УПРАВЛЕНИЯ», чтобы вернуться на главную страницу консоли + +![](https://static-docs.nocobase.com/mail-1735633687744.png) + +![](https://static-docs.nocobase.com/mail-1735633687912.png) + +![](https://static-docs.nocobase.com/mail-1735633688075.png) + +7. После нажатия кнопки «ОПУБЛИКОВАТЬ ПРИЛОЖЕНИЕ» появится страница подтверждения с перечнем требований для публикации. Нажмите «ПОДТВЕРДИТЬ» + +![](https://static-docs.nocobase.com/mail-1735633688257.png) + +8. Вернувшись на страницу консоли, вы увидите, что статус публикации — «В рабочей среде» + +![](https://static-docs.nocobase.com/mail-1735633688425.png) + +9. Нажмите кнопку «ГОТОВИТЬСЯ К ПРОВЕРКЕ», заполните необходимую информацию и нажмите «СОХРАНИТЬ И ПРОДОЛЖИТЬ» (данные на изображении приведены для справки) + +![](https://static-docs.nocobase.com/mail-1735633688634.png) + +![](https://static-docs.nocobase.com/mail-1735633688827.png) + +10. Продолжайте заполнять обязательную информацию (данные на изображении приведены для справки) + +![](https://static-docs.nocobase.com/mail-1735633688993.png) + +11. Нажмите кнопку «СОХРАНИТЬ И ПРОДОЛЖИТЬ» + +![](https://static-docs.nocobase.com/mail-1735633689159.png) + +12. Нажмите кнопку «ОТПРАВИТЬ НА ПРОВЕРКУ», чтобы отправить на модерацию + +![](https://static-docs.nocobase.com/mail-1735633689318.png) + +13. Дождитесь результатов проверки + +![](https://static-docs.nocobase.com/mail-1735633689494.png) + +14. Если проверка не пройдена, пользователи могут нажать на небезопасную ссылку, чтобы авторизоваться + +![](https://static-docs.nocobase.com/mail-1735633689645.png) + +## Настройка Microsoft + +### Регистрация учётной записи + +1. Перейдите на https://azure.microsoft.com/en-us/pricing/purchase-options/azure-account + +2. Войдите в свою учётную запись Microsoft + +![](https://static-docs.nocobase.com/mail-1733818625779.png) + +### Создание клиента (Tenant) + +1. Перейдите на https://azure.microsoft.com/zh-cn/pricing/purchase-options/azure-account?icid=azurefreeaccount и войдите в свою учётную запись + +2. Заполните основную информацию и получите код подтверждения + +![](https://static-docs.nocobase.com/mail-1733818625984.png) + +3. Заполните дополнительную информацию и продолжите + +![](https://static-docs.nocobase.com/mail-1733818626352.png) + +4. Заполните данные кредитной карты (этот шаг можно пока пропустить) + +![](https://static-docs.nocobase.com/mail-1733818626622.png) + +### Получение идентификатора клиента (Client ID) + +1. Нажмите верхнее меню и выберите «Microsoft Entra ID» + +![](https://static-docs.nocobase.com/mail-1733818626871.png) + +2. В левой части выберите «Регистрация приложений» + +![](https://static-docs.nocobase.com/mail-1733818627097.png) + +3. Нажмите «Новая регистрация» вверху + +![](https://static-docs.nocobase.com/mail-1733818627309.png) + +4. Заполните информацию и отправьте + +Можно указать любое имя, выберите типы учётных записей, как показано на изображении, пока оставьте поле «URI перенаправления» пустым + +![](https://static-docs.nocobase.com/mail-1733818627555.png) + +5. Получите идентификатор клиента (Client ID) + +![](https://static-docs.nocobase.com/mail-1733818627797.png) + +### Авторизация API + +1. Откройте меню «Разрешения API» справа + +![](https://static-docs.nocobase.com/mail-1733818628178.png) + +2. Нажмите кнопку «Добавить разрешение» + +![](https://static-docs.nocobase.com/mail-1733818628448.png) + +3. Нажмите «Microsoft Graph» + +![](https://static-docs.nocobase.com/mail-1733818628725.png) + +![](https://static-docs.nocobase.com/mail-1733818628927.png) + +4. Найдите и добавьте следующие разрешения, итоговый результат должен выглядеть так: + + 1. `"email"` + 2. `"offline_access"` + 3. `"IMAP.AccessAsUser.All"` + 4. `"SMTP.Send"` + 5. `"offline_access"` + 6. `"User.Read"` (по умолчанию) + +![](https://static-docs.nocobase.com/mail-1733818629130.png) + +### Получение секрета (Secret) + +1. Нажмите «Сертификаты и секреты» слева + +![](https://static-docs.nocobase.com/mail-1733818629369.png) + +2. Нажмите кнопку «Новый секрет клиента» + +![](https://static-docs.nocobase.com/mail-1733818629554.png) + +3. Заполните описание и срок действия, затем нажмите «Добавить» + +![](https://static-docs.nocobase.com/mail-1733818630292.png) + +4. Скопируйте идентификатор секрета (Secret ID) + +![](https://static-docs.nocobase.com/mail-1733818630535.png) + +5. Скопируйте идентификатор и секрет клиента и введите их на странице настройки почты + +![](https://static-docs.nocobase.com/mail-1733818630710.png) + +## Часто задаваемые вопросы (FAQ) + +**Вопрос:** После входа с авторизацией через учётную запись Microsoft электронные письма не приходят. + +**Ответ:** В настоящее время для авторизованного входа поддерживаются только учётные записи Outlook и Gmail. Учётные записи Microsoft и Google не поддерживаются. Дополнительную информацию см. по ссылке: [answers.microsoft.com](https://answers.microsoft.com/zh-hans/outlook_com/forum/all/%E7%8E%B0%E6%9C%89%E5%BE%AE%E8%BD%AF%E8%B4%A6/dba12dda-a7c7-4346-8263-53f4a6d9dc68) + +**Совет:** Если вы не уверены, есть ли у вас «настоящая» учётная запись Outlook.com или Gmail, попробуйте войти через веб-интерфейс Outlook.com или Gmail.com и отправить письмо. Если войти не удаётся, возможно, у вас нет соответствующей почтовой службы, и вам нужно либо зарегистрироваться, либо использовать другую службу электронной почты. diff --git a/docs/ru-RU/handbook/email-manager/usage-user.md b/docs/ru-RU/handbook/email-manager/usage-user.md new file mode 100644 index 0000000000..b4e1d7e67c --- /dev/null +++ b/docs/ru-RU/handbook/email-manager/usage-user.md @@ -0,0 +1,188 @@ +# Менеджер электронной почты: Руководство пользователя + +## Введение + +Плагин менеджера электронной почты позволяет интегрировать учётные записи электронной почты Google и Microsoft в NocoBase для отправки, получения, просмотра и управления письмами. Письма также можно интегрировать на любую страницу или в любой блок. + +## Привязка учётных записей электронной почты + +### Привязка учётной записи + +После активации плагина электронной почты нажмите на значок электронной почты в правом верхнем углу, чтобы перейти на страницу управления почтой. + +https://static-docs.nocobase.com/mail-1733816161753.png + +Нажмите кнопку «Настройки учётной записи», откроется всплывающее окно, затем нажмите «Привязать учётную запись», чтобы выбрать тип почты, который вы хотите привязать. + +https://static-docs.nocobase.com/mail-1733816162279.png + +Браузер автоматически откроет соответствующую страницу входа в почту. Войдите в свою учётную запись и предоставьте необходимые разрешения. + +https://static-docs.nocobase.com/mail-1733816162534.png + +После завершения авторизации страница автоматически перенаправит вас обратно на сайт NocoBase для привязки учётной записи и синхронизации данных (первая синхронизация может занять некоторое время — пожалуйста, подождите). + +https://static-docs.nocobase.com/mail-1733816162794.png + +После завершения синхронизации данных текущая страница автоматически закроется, и вы вернётесь на исходную страницу электронной почты. Вы увидите, что учётная запись успешно привязана. + +https://static-docs.nocobase.com/mail-1733816163177.png + +Нажмите на область всплывающего окна, чтобы закрыть его, и вы увидите список писем. + +https://static-docs.nocobase.com/mail-1733816163503.png + +### Удаление учётной записи + +Нажмите «Удалить», чтобы удалить учётную запись и привязанную электронную почту. + +https://static-docs.nocobase.com/mail-1733816163758.png + +## Управление электронной почтой + +### Фильтрация писем + +На странице управления почтой слева находится панель фильтров, а справа — список писем. По умолчанию при входе отображается папка «Входящие». + +https://static-docs.nocobase.com/mail-1733816165536.png + +Письма с одинаковыми темами группируются, а количество связанных писем отображается после поля темы. Если некоторые письма с одинаковой темой соответствуют критериям фильтрации, отображается главное письмо темы, а тип этого письма отмечается рядом с темой. + +https://static-docs.nocobase.com/mail-1733816165797.png + +Заголовки непрочитанных писем отображаются жирным шрифтом, а количество непрочитанных писем отображается рядом с иконкой почты в верхней части. + +https://static-docs.nocobase.com/mail-1733816166067.png + +### Принудительная синхронизация писем + +Текущий интервал синхронизации писем составляет 5 минут. Чтобы выполнить синхронизацию вручную, нажмите кнопку «Обновить». + +https://static-docs.nocobase.com/mail-1733816166364.png + +### Изменение статуса прочтения + +Кнопки «Отметить как прочитанное» и «Отметить как непрочитанное» позволяют массово изменять статус прочтения писем. + +https://static-docs.nocobase.com/mail-1733816166621.png + +### Отправка письма + +Нажмите кнопку «Написать письмо» в верхней части, чтобы открыть панель составления письма. + +https://static-docs.nocobase.com/mail-1733816166970.png + +После заполнения необходимой информации вы можете отправить письмо. Поддерживаются вложения до 3 МБ. + +https://static-docs.nocobase.com/mail-1733816167214.png + +### Просмотр письма + +Нажмите кнопку «Просмотр» в строке, чтобы посмотреть подробности письма. Существует два формата отображения: + +1. Одиночное письмо — вы можете сразу увидеть подробную информацию. + +https://static-docs.nocobase.com/mail-1733816167456.png + +2. Несколько писем с одинаковой темой — по умолчанию отображаются в виде списка, который можно развернуть или свернуть. + +https://static-docs.nocobase.com/mail-1733816167750.png + +При просмотре письма его статус автоматически меняется на «прочитано». Чтобы вернуть статус «непрочитано», нажмите кнопку «…» справа и выберите «Отметить как непрочитанное». + +### Ответить на письмо + +После перехода к деталям письма нажмите кнопку «Ответить» внизу, чтобы ответить отправителю. Если у письма несколько получателей, вы можете нажать «Ответить всем», чтобы ответить всем участникам. + +https://static-docs.nocobase.com/mail-1733816167998.png + +### Переслать письмо + +Нажмите кнопку «Переслать» внизу, чтобы переслать письмо другим адресатам. + +https://static-docs.nocobase.com/mail-1733816168241.png + +## Блок сообщений электронной почты + +### Добавление блока + +На странице настройки нажмите кнопку «Добавить блок» и выберите блок «Сообщения электронной почты», чтобы добавить его. + +https://static-docs.nocobase.com/mail-1733816168487.png + +### Настройка полей + +Нажмите кнопку «Настроить столбцы» в блоке, чтобы выбрать, какие поля отображать. Подробные инструкции см. в разделе настройки полей таблицы. + +https://static-docs.nocobase.com/mail-1733816168737.png + +### Настройка действий в верхней части + +Нажмите кнопку «Настроить действия» в блоке, чтобы настроить кнопки в верхней части. Конечное действие будет соответствовать действиям управления почтой. + +https://static-docs.nocobase.com/mail-1733816168977.png + +Кнопку «Написать письмо» можно настроить с предустановленным содержанием. + +https://static-docs.nocobase.com/mail-1733816169243.png +https://static-docs.nocobase.com/mail-1733816169515.png + +### Настройка фильтра данных + +Нажмите настройку в правой части таблицы, выберите «Установить диапазон данных» и настройте фильтр данных писем. + +https://static-docs.nocobase.com/mail-1733816169764.png + +### Отправка письма + +#### Создание кнопки отправки письма + +Добавьте кнопку «Написать письмо» в панель действий таблицы. + +https://static-docs.nocobase.com/mail-1735634129950.png + +Перейдите в меню настройки кнопки, чтобы изменить её название. + +https://static-docs.nocobase.com/mail-1735634130387.png + +#### Настройка содержания по умолчанию + +Перейдите в меню настройки кнопки, затем выберите «Значения письма по умолчанию». + +https://static-docs.nocobase.com/mail-1735634130581.png + +Установите получателем по умолчанию адрес электронной почты из текущей строки данных. + +https://static-docs.nocobase.com/mail-1735634130773.png +https://static-docs.nocobase.com/mail-1735634130997.png + +Нажмите кнопку «Написать письмо» — вы увидите, что адрес получателя уже заполнен. + +https://static-docs.nocobase.com/mail-1735634131163.png + +## Отзыв авторизации + +Если ваша учётная запись электронной почты была авторизована, но вы хотите удалить или повторно авторизовать её, выполните следующие шаги: + +### Google-почта + +Откройте https://myaccount.google.com/u/0/connections и войдите в систему. + +https://static-docs.nocobase.com/mail-1735634131347.png + +Нажмите на соответствующее приложение, затем нажмите «Удалить». + +https://static-docs.nocobase.com/mail-1735634131518.png +https://static-docs.nocobase.com/mail-1735634131697.png + +### Почта Microsoft + +Откройте https://account.microsoft.com/ и войдите в систему. + +Нажмите кнопку «Приложения и службы, которые могут получать доступ к вашим данным». + +https://static-docs.nocobase.com/mail-1735634131870.png + +Нажмите «Изменить» и удалите приложение. + +https://static-docs.nocobase.com/mail-1735634132052.png diff --git a/docs/ru-RU/handbook/embed/index.md b/docs/ru-RU/handbook/embed/index.md new file mode 100644 index 0000000000..281cd50858 --- /dev/null +++ b/docs/ru-RU/handbook/embed/index.md @@ -0,0 +1,28 @@ +# Встраивание NocoBase + + + +## Введение + +Этот плагин позволяет встраивать страницы NocoBase на другие веб-сайты или в приложения. + +## Установка + +Плагин является коммерческим и требует загрузки через менеджер плагинов с последующей активацией. + +![20240323162741](https://static-docs.nocobase.com/20240323162741.png) + +## Руководство пользователя + +После активации плагина в интерфейсе конфигурации: +1. Нажмите "Копировать ссылку для встраивания" в меню настроек страницы (правый верхний угол) + +![](https://static-docs.nocobase.com/f11bd6d5e88d38731d7cd3cb149022c8.png) + +2. Вы получите уникальную ссылку вида: `https://xxx.com/embed/qs087rz4o2b` + +![](https://static-docs.nocobase.com/9d847805a00fd07372a474665ec0e968.png) + +Для встраивания в сторонние ресурсы с аутентификацией пользователей: +- Добавьте параметр `token` к ссылке: `https://xxx.com/embed/qs087rz4o2b?token=xxx` +- Подробнее об аутентификации: [Руководство по аутентификации](/handbook/auth) diff --git a/docs/ru-RU/handbook/embed/static/embed-1.png b/docs/ru-RU/handbook/embed/static/embed-1.png new file mode 100755 index 0000000000..bd3671d90f Binary files /dev/null and b/docs/ru-RU/handbook/embed/static/embed-1.png differ diff --git a/docs/ru-RU/handbook/embed/static/embed-2.png b/docs/ru-RU/handbook/embed/static/embed-2.png new file mode 100755 index 0000000000..ec1fd7822c Binary files /dev/null and b/docs/ru-RU/handbook/embed/static/embed-2.png differ diff --git a/docs/ru-RU/handbook/environment-variables/index.md b/docs/ru-RU/handbook/environment-variables/index.md new file mode 100644 index 0000000000..0a0c426aea --- /dev/null +++ b/docs/ru-RU/handbook/environment-variables/index.md @@ -0,0 +1,173 @@ +# Переменные и секреты + +## Введение + +Центральное управление и настройка переменных среды и секретов для безопасного хранения конфиденциальных данных, повторного использования конфигурационных данных и изоляции конфигураций сред. + +## Отличия от `.env` + +| Характеристика | Файл `.env` | Динамические переменные среды | +|-----------------------------|--------------------------------------------------|------------------------------------------------| +| Место хранения | Хранится в файле `.env` в корневой директории проекта | Хранится в таблице `environmentVariables` в базе данных | +| Метод загрузки | Загружается в `process.env` с помощью инструментов, таких как `dotenv`, при запуске приложения | Динамически считывается и загружается в `app.environment` при запуске приложения | +| Метод изменения | Требует прямого редактирования файла; приложение необходимо перезапустить, чтобы изменения вступили в силу | Поддерживает изменение во время выполнения; изменения вступают в силу немедленно после перезагрузки конфигурации приложения | +| Изоляция сред | Для каждой среды (разработка, тестирование, продакшн) требуется отдельное ведение файлов `.env` | Для каждой среды требуется отдельное ведение данных в таблице `environmentVariables` | +| Применимые сценарии | Подходит для фиксированных статических конфигураций, например, основной информации о базе данных приложения | Подходит для динамических конфигураций, требующих частой настройки или связанных с бизнес-логикой, например, внешние базы данных, информация о хранилище файлов и т.д. | + +## Установка + +Встроенный плагин — отдельная установка не требуется. + +## Использование + +### Повторное использование конфигурационных данных + +Например, если в нескольких местах рабочего процесса требуются узлы электронной почты и настройка SMTP, общую конфигурацию SMTP можно сохранить в переменных среды. + +https://static-docs.nocobase.com/20250102181045.png + +### Хранение конфиденциальных данных + +Хранение различных конфигурационных данных внешних баз данных, ключей облачного хранилища файлов и т.д. + +https://static-docs.nocobase.com/20250102103513.png + +### Изоляция конфигурации сред + +В различных средах, таких как разработка, тестирование и продакшн, используются независимые стратегии управления конфигурацией, чтобы гарантировать, что конфигурации и данные каждой среды не мешают друг другу. Каждая среда имеет свои собственные независимые настройки, переменные и ресурсы, что предотвращает конфликты между средами разработки, тестирования и продакшна и обеспечивает ожидаемую работу системы в каждой среде. + +Например, конфигурация служб хранения файлов может отличаться между средами разработки и продакшна, как показано ниже: + +**Среда разработки** +``` +FILE_STORAGE_OSS_BASE_URL=dev-storage.nocobase.com +FILE_STORAGE_OSS_BUCKET=dev-storage +``` + +**Продакшн-среда** +``` +FILE_STORAGE_OSS_BASE_URL=prod-storage.nocobase.com +FILE_STORAGE_OSS_BUCKET=prod-storage +``` + +## Управление переменными среды + +https://static-docs.nocobase.com/20250102155314.png + +### Добавление переменных среды + +Поддерживает добавление как по одной, так и пакетное. + +Поддерживает хранение в виде обычного текста и зашифрованного. + +https://static-docs.nocobase.com/20250102155509.png + +#### Добавление одной переменной + +https://static-docs.nocobase.com/20250102155731.png + +#### Пакетное добавление + +https://static-docs.nocobase.com/20250102155258.png + +## Примечания + +### Перезапуск приложения + +После изменения или удаления переменных среды в верхней части появится подсказка о необходимости перезапуска приложения. Изменения переменных среды вступят в силу только после перезапуска приложения. + +https://static-docs.nocobase.com/20250102155007.png + +### Зашифрованное хранение + +Для переменных среды с зашифрованными данными используется симметричное шифрование AES. Ключ шифрования и расшифровки (PRIVATE KEY) хранится в директории хранилища. Пожалуйста, храните его в безопасности; если он будет утерян или перезаписан, зашифрованные данные не смогут быть расшифрованы. + +``` +./storage/environment-variables/<имя_приложения>/aes_key.dat +``` + +## Поддерживаемые в настоящее время плагины для переменных среды + +- **Действие: Произвольный запрос** + https://static-docs.nocobase.com/20250102180751.png + +- **Аутентификация: CAS** + https://static-docs.nocobase.com/20250102160129.png + +- **Аутентификация: DingTalk** + https://static-docs.nocobase.com/20250102160205.png + +- **Аутентификация: LDAP** + https://static-docs.nocobase.com/20250102160312.png + +- **Аутентификация: OIDC** + https://static-docs.nocobase.com/20250102160426.png + +- **Аутентификация: SAML** + https://static-docs.nocobase.com/20250102160652.png + +- **Аутентификация: WeCom** + https://static-docs.nocobase.com/20250102160758.png + +- **Источник данных: Внешняя MariaDB** + https://static-docs.nocobase.com/20250102160935.png + +- **Источник данных: Внешняя MySQL** + https://static-docs.nocobase.com/20250102173602.png + +- **Источник данных: Внешняя Oracle** + https://static-docs.nocobase.com/20250102174153.png + +- **Источник данных: Внешняя PostgreSQL** + https://static-docs.nocobase.com/20250102175630.png + +- **Источник данных: Внешний SQL Server** + https://static-docs.nocobase.com/20250102175814.png + +- **Источник данных: KingbaseES** + https://static-docs.nocobase.com/20250102175951.png + +- **Источник данных: REST API** + https://static-docs.nocobase.com/20250102180109.png + +- **Хранилище файлов: Локальное** + https://static-docs.nocobase.com/20250102161114.png + +- **Хранилище файлов: Aliyun OSS** + https://static-docs.nocobase.com/20250102161404.png + +- **Хранилище файлов: Amazon S3** + https://static-docs.nocobase.com/20250102163730.png + +- **Хранилище файлов: Tencent COS** + https://static-docs.nocobase.com/20250102173109.png + +- **Хранилище файлов: S3 Pro** + Не адаптировано + +- **Карты: AMap** + https://static-docs.nocobase.com/20250102163803.png + +- **Карты: Google** + https://static-docs.nocobase.com/20250102171524.png + +- **Настройки электронной почты** + Не адаптировано + +- **Уведомления: Электронная почта** + https://static-docs.nocobase.com/20250102164059.png + +- **Публичные формы** + https://static-docs.nocobase.com/20250102163849.png + +- **Системные настройки** + https://static-docs.nocobase.com/20250102164139.png + +- **Проверка: SMS от Aliyun** + https://static-docs.nocobase.com/20250102164247.png + +- **Проверка: SMS от Tencent** + https://static-docs.nocobase.com/20250102165814.png + +- **Рабочий процесс** + https://static-docs.nocobase.com/20250102180537.png diff --git a/docs/ru-RU/handbook/field-attachment-url/index.md b/docs/ru-RU/handbook/field-attachment-url/index.md new file mode 100644 index 0000000000..9e3786a2a6 --- /dev/null +++ b/docs/ru-RU/handbook/field-attachment-url/index.md @@ -0,0 +1,25 @@ +# Поле данных: Вложение (URL) + + + +## Введение + +Поддерживает вложения в формате URL. + +## Установка + +Это коммерческий плагин. + +## Руководство пользователя + +### Конфигурация поля + +![20241017092323](https://static-docs.nocobase.com/20241017092323.png) + +### Внешний источник данных + +![20241017092456](https://static-docs.nocobase.com/20241017092456.png) + +### Интерфейс + +![20241017092759](https://static-docs.nocobase.com/20241017092759.png) diff --git a/docs/ru-RU/handbook/field-china-region/index.md b/docs/ru-RU/handbook/field-china-region/index.md new file mode 100644 index 0000000000..21b85b8873 --- /dev/null +++ b/docs/ru-RU/handbook/field-china-region/index.md @@ -0,0 +1,13 @@ +# China region + + + +## Introduction + +## Field configuration + +![20240512180305](https://static-docs.nocobase.com/20240512180305.png) + +## Examples + +To be added. diff --git a/docs/ru-RU/handbook/field-component-mask/index.md b/docs/ru-RU/handbook/field-component-mask/index.md new file mode 100644 index 0000000000..2ab56b6507 --- /dev/null +++ b/docs/ru-RU/handbook/field-component-mask/index.md @@ -0,0 +1,50 @@ +# Маскирование данных + + + +## Обзор + +Компонент "Маскирование полей" позволяет отображать значения полей в замаскированном формате, что особенно полезно для работы с конфиденциальной информацией, такой как пароли или номера кредитных карт. + +## Установка + +Это коммерческий плагин. + +## Настройки поля + +![Настройки поля](https://static-docs.nocobase.com/Solution/202410222334271729611267.png) + +- [Компонент поля](/handbook/ui/fields/field-settings/field-component): Переключение между стандартным компонентом и компонентом маскирования. +- Настройки маски: Конфигурация правил маскирования и установка прав доступа к полю. + +## Настройки маскирования + +![Настройки маскирования](https://static-docs.nocobase.com/Solution/202410222340521729611652.png) + +### Правила маскирования + +#### Стандартные правила + +- `******`: Полное маскирование данных шестью звездочками. +- `***abc`: Три звездочки и последние три символа исходных данных. +- `**ab**`: Две звездочки в начале и конце, с отображением двух средних символов. +- `abc***`: Первые три символа и три звездочки. + +#### Пользовательские правила + +При необходимости можно создать собственные правила маскирования: +- Символ `*` заменяет символы исходных данных звездочками +- Остальные символы отображаются как есть + +Примеры: +- `a*a*a*`: Данные `123456` → `1*3*5*` +- `a****a`: Данные `123456789` → `1****9` +- `ab***abc`: Данные `asdfghjkl` → `as***jkl` + +### Права доступа к исходным значениям + +Можно указать, какие роли пользователей могут видеть исходные значения. По умолчанию доступ есть только у root-пользователя. + +:::info{title="ВАЖНО"} +В режиме редактирования исходные значения всегда видны, независимо от настроек прав. +::: diff --git a/docs/ru-RU/handbook/field-encryption/index.md b/docs/ru-RU/handbook/field-encryption/index.md new file mode 100644 index 0000000000..70b43e061a --- /dev/null +++ b/docs/ru-RU/handbook/field-encryption/index.md @@ -0,0 +1,35 @@ +# Шифрование + + + +## Введение + +Чувствительные бизнес-данные, такие как номера телефонов клиентов, адреса электронной почты и номера карт, можно шифровать для обеспечения конфиденциальности. После шифрования эти данные безопасно хранятся в базе данных в виде шифротекста. + +![20240802175127](https://static-docs.nocobase.com/20240802175127.png) + +## Переменные окружения + +:::warning +Потеря значения `ENCRYPTION_FIELD_KEY` сделает невозможным расшифровку данных. +::: + +Для активации функции шифрования необходимо задать переменную окружения `ENCRYPTION_FIELD_KEY`, которая будет использоваться в качестве ключа шифрования. Длина ключа должна составлять ровно 32 символа. Например: + +```bash +ENCRYPTION_FIELD_KEY='2%&glK; + +## Введение + +## Настройка поля + +![20240512173541](https://static-docs.nocobase.com/20240512173541.png) + +## Instructions + +To be added. diff --git a/docs/ru-RU/handbook/field-m2m-array/index.md b/docs/ru-RU/handbook/field-m2m-array/index.md new file mode 100644 index 0000000000..25aa83a155 --- /dev/null +++ b/docs/ru-RU/handbook/field-m2m-array/index.md @@ -0,0 +1,42 @@ +# Связь "Многие-ко-многим" (Массив) + + + +## Введение + +Эта функция позволяет использовать поля-массивы в коллекции данных для хранения нескольких уникальных ключей из целевой таблицы, создавая связь "многие-ко-многим" между таблицами. Например, рассмотрим сущности "Статьи" и "Теги". Статья может быть связана с несколькими тегами, при этом таблица статей хранит ID соответствующих записей из таблицы тегов в поле-массиве. + +:::warning{title="Примечание"} + +- По возможности рекомендуется использовать промежуточную коллекцию для создания стандартной [связи многие-ко-многим](../data-modeling/collection-fields/associations/m2m/index.md) вместо данного метода. +- В настоящее время только PostgreSQL поддерживает фильтрацию данных исходной коллекции с использованием полей из целевой таблицы для связей многие-ко-многим, установленных через поля-массивы. Например, в описанном сценарии можно фильтровать статьи по другим полям таблицы тегов, таким как название. + +::: + +### Настройка поля + +![Настройка поля многие-ко-многим (массив)](https://static-docs.nocobase.com/202407051108180.png) + +## Описание параметров + +### Исходная коллекция + +Коллекция, в которой находится текущее поле. + +### Целевая коллекция + +Коллекция, с которой устанавливается связь. + +### Внешний ключ + +Поле-массив в исходной коллекции, которое хранит ключи из целевой таблицы. + +Соответствие типов полей-массивов в разных СУБД: + +| NocoBase | PostgreSQL | MySQL | SQLite | +| -------- | ---------- | ------ | ------ | +| `set` | `array` | `JSON` | `JSON` | + +### Целевой ключ + +Поле в целевой коллекции, соответствующее значениям, хранящимся в поле-массиве исходной таблицы. Это поле должно быть уникальным. diff --git a/docs/ru-RU/handbook/field-markdown-vditor/index.md b/docs/ru-RU/handbook/field-markdown-vditor/index.md new file mode 100644 index 0000000000..02cce2b36b --- /dev/null +++ b/docs/ru-RU/handbook/field-markdown-vditor/index.md @@ -0,0 +1,11 @@ +# Markdown (Vditor) + +## Введение + +## Настройка поля + +![20240512180647](https://static-docs.nocobase.com/20240512180647.png) + +## Example + +Coming soon. diff --git a/docs/ru-RU/handbook/field-sequence/index.md b/docs/ru-RU/handbook/field-sequence/index.md new file mode 100644 index 0000000000..87ddf55a61 --- /dev/null +++ b/docs/ru-RU/handbook/field-sequence/index.md @@ -0,0 +1,13 @@ +# Последовательность + +<Имя плагина="последовательность полей"> + +## Введение + +## Конфигурация поля + +![20240512173752](https://static-docs.nocobase.com/20240512173752.png) + +## Пример + +Который будет добавлен diff --git a/docs/ru-RU/handbook/field-snapshot/index.md b/docs/ru-RU/handbook/field-snapshot/index.md new file mode 100644 index 0000000000..3219353e26 --- /dev/null +++ b/docs/ru-RU/handbook/field-snapshot/index.md @@ -0,0 +1,3 @@ +# Поле моментального снимка + + diff --git a/docs/ru-RU/handbook/field-sort/index.md b/docs/ru-RU/handbook/field-sort/index.md new file mode 100644 index 0000000000..567cbc6799 --- /dev/null +++ b/docs/ru-RU/handbook/field-sort/index.md @@ -0,0 +1,113 @@ +# Поле сортировки + +## Введение + +Поля сортировки используются для упорядочивания записей в коллекции и поддерживают сортировку вида «сначала группировка, затем сортировка» (sort1). + +:::warning +Поскольку поле сортировки является полем текущей коллекции, при сортировке по группам одна и та же запись не может входить в несколько групп одновременно. +::: + +## Установка + +Встроенный плагин — отдельная установка не требуется. + +## Руководство пользователя + +### Создание поля сортировки + +https://static-docs.nocobase.com/20240409091123_rec_.gif + +При создании поля сортировки значения сортировки инициализируются следующим образом: +- Если группировка не выбрана, инициализация выполняется на основе первичного ключа и поля даты создания. +- Если выбрана группировка, сначала выполняется группировка данных, а затем инициализация на основе первичного ключа и поля даты создания. + +:::warning{title="Пояснение о согласованности транзакций"} +- При создании поля, если инициализация значений сортировки завершится с ошибкой, поле сортировки не будет создано. +- В определённом диапазоне, если запись перемещается из позиции A в позицию B, значения сортировки всех записей в интервале AB изменятся. Если одна из операций завершится неудачей, всё перемещение будет отменено, и значения сортировки затронутых записей останутся неизменными. +::: + +### Пример 1: Создание поля sort1 + +Поле sort1 не группируется. + +https://static-docs.nocobase.com/20240409091510.png + +Значения поля сортировки для каждой записи будут инициализированы на основе первичного ключа и даты создания. + +https://static-docs.nocobase.com/20240409092305.png + +### Пример 2: Создание поля sort2 с группировкой по ID класса + +https://static-docs.nocobase.com/20240409092620.png + +В этом случае все записи в коллекции сначала группируются (по ID класса), а затем инициализируется поле сортировки (sort2). Начальные значения каждой записи: + +https://static-docs.nocobase.com/20240409092847.png + +### Сортировка перетаскиванием + +Поля сортировки в основном используются для сортировки записей в различных блоках с помощью drag-and-drop. Блоки, поддерживающие сортировку перетаскиванием, включают таблицы и доски (board). + +:::warning +- При использовании одного и того же поля сортировки для сортировки перетаскиванием одновременное использование нескольких блоков может нарушить существующий порядок. +- В таблице для сортировки перетаскиванием нельзя выбирать поле сортировки, имеющее правило группировки. +- Исключение: в блоке таблицы с отношением «один ко многим» внешний ключ может использоваться как поле группировки. +- В настоящее время только блок доски поддерживает сортировку по группам с помощью перетаскивания. +::: + +### Сортировка строк таблицы перетаскиванием + +**Блок таблицы** + +https://static-docs.nocobase.com/20240409104621_rec_.gif + +**Блок связанной таблицы** + +:::warning +В блоке с отношением «один ко многим»: +- Если выбрано поле сортировки без группировки, в сортировке могут участвовать все записи. +- Если сначала выполняется группировка по внешнему ключу, а затем сортировка, правило сортировки будет применяться только к данным внутри текущей группы. + +Конечный эффект будет одинаковым, но количество записей, участвующих в сортировке, будет разным. Более подробное объяснение см. в разделе [Пояснение правил сортировки](#Пояснение-правил-сортировки). +::: + +### Сортировка карточек доски перетаскиванием + +https://static-docs.nocobase.com/20240409110423_rec_.gif + +## Пояснение правил сортировки + +### Перемещение между несгруппированными элементами (или в одной группе) + +Предположим, есть набор данных: +`[1, 2, 3, 4, 5, 6, 7, 8, 9]` + +Если элемент 5 перемещается вперёд на позицию 3, изменятся только порядковые номера 3, 4 и 5: 5 занимает позицию 3, а 3 и 4 сдвигаются назад. +Результат: `[1, 2, 5, 3, 4, 6, 7, 8, 9]` + +Теперь переместим 6 назад на позицию 8: 6 занимает позицию 8, 7 и 8 сдвигаются вперёд. +Результат: `[1, 2, 5, 3, 4, 7, 8, 6, 9]` + +### Перемещение между разными группами + +При сортировке по группам, если запись перемещается в другую группу, её принадлежность к группе также меняется. Например: + +Группа A: `[1, 2, 3, 4]` +Группа B: `[5, 6, 7, 8]` + +Если элемент 1 перемещается к 6 (по умолчанию — после него), его группа меняется с A на B: +Группа A: `[2, 3, 4]` +Группа B: `[5, 6, 1, 7, 8]` + +### Изменения сортировки не зависят от данных, отображаемых на экране + +Например, есть набор данных: +`[1, 2, 3, 4, 5, 6, 7, 8, 9]` + +На экране отображаются только: `[1, 5, 9]` + +Если 1 перемещается на позицию 9, позиции всех промежуточных элементов (2, 3, 4, 5, 6, 7, 8) изменятся: +Результат: `[2, 3, 4, 5, 6, 7, 8, 9, 1]` + +На экране отобразится: `[5, 9, 1]` diff --git a/docs/ru-RU/handbook/file-manager/development/index.md b/docs/ru-RU/handbook/file-manager/development/index.md new file mode 100644 index 0000000000..9e98de710f --- /dev/null +++ b/docs/ru-RU/handbook/file-manager/development/index.md @@ -0,0 +1,121 @@ +# Разработка + +## Расширение типов файлов клиента + +Для загруженных файлов клиентский интерфейс может отображать различные предварительные просмотры в зависимости от типов файлов. Поле вложения file-manager использует встроенную возможность предварительного просмотра файлов на основе браузера (iframe), поддерживая большинство типов файлов (таких как изображения, видео, аудио и PDF) для прямого просмотра в браузере. Когда тип файла не поддерживается для предварительного просмотра в браузере или требует специального взаимодействия, можно расширить дополнительные компоненты предварительного просмотра на основе типа файла. + +### Пример + +Например, если вы хотите расширить компонент карусели для файлов изображений, вы можете использовать следующий код: + +```ts +import match from 'mime-match'; +import { Plugin, attachmentFileTypes } from '@nocobase/client'; + +class MyPlugin extends Plugin { + load() { + attachmentFileTypes.add({ + match(file) { + return match(file.mimetype, 'image/*'); + }, + Previewer({ index, list, onSwitchIndex }) { + const onDownload = useCallback( + (e) => { + e.preventDefault(); + const file = list[index]; + saveAs(file.url, `${file.title}${file.extname}`); + }, + [index, list], + ); + return ( + onSwitchIndex(null)} + onMovePrevRequest={() => onSwitchIndex((index + list.length - 1) % list.length)} + onMoveNextRequest={() => onSwitchIndex((index + 1) % list.length)} + imageTitle={list[index]?.title} + toolbarButtons={[ + , + ]} + /> + ); + }, + }); + } +} +``` + +`attachmentFileTypes` — это объект входа, предоставляемый пакетом `@nocobase/client` для расширения типов файлов. Вы можете использовать его метод `add` для расширения дескриптора типа файла. + +Каждый тип файла должен реализовать метод `match()` для проверки соответствия типа файла требованиям. В примере используется пакет `mime-match` для проверки атрибута `mimetype` файла. Если он соответствует `image/*`, он считается типом файла, который требует обработки. Если он не соответствует, он вернется к встроенному типу. + +Свойство `Previewer` в дескрипторе типа — это компонент, используемый для предварительного просмотра. Когда тип файла соответствует, этот компонент будет отрендерен для предварительного просмотра. Обычно рекомендуется использовать модальный компонент (например, ``) в качестве базового контейнера и размещать содержимое предварительного просмотра и интерактивное содержимое в этом компоненте для реализации функциональности предварительного просмотра. + +### API + +```ts +export interface FileModel { + id: number; + filename: string; + path: string; + title: string; + url: string; + extname: string; + size: number; + mimetype: string; +} + +export interface PreviewerProps { + index: number; + list: FileModel[]; + onSwitchIndex(index): void; +} + +export interface AttachmentFileType { + match(file: any): boolean; + Previewer?: React.ComponentType; +} + +export class AttachmentFileTypes { + add(type: AttachmentFileType): void; +} +``` + +#### `attachmentFileTypes` + +`attachmentFileTypes` — это глобальный экземпляр, который можно импортировать из пакета `@nocobase/client`: + +```ts +import { attachmentFileTypes } from '@nocobase/client'; +``` + +#### `match(file)` + +Метод `match` принимает объект файла и возвращает `boolean`, указывающий, соответствует ли файл этому типу. + +#### `Previewer` + +Компонент `Previewer` получает следующие свойства: + +- `index: number` — индекс текущего файла в списке +- `list: FileModel[]` — массив всех файлов +- `onSwitchIndex(index: number | null)` — функция для переключения на другой файл или закрытия предварительного просмотра + +### Примечания + +- Компонент `Previewer` должен быть модальным или полноэкранным компонентом +- Рекомендуется использовать библиотеки типа `react-image-lightbox` или `react-image-gallery` для реализации предварительного просмотра изображений +- Для других типов файлов можно использовать соответствующие библиотеки (например, `react-pdf` для PDF файлов) diff --git a/docs/ru-RU/handbook/file-manager/field-attachment.md b/docs/ru-RU/handbook/file-manager/field-attachment.md new file mode 100644 index 0000000000..4a179b20be --- /dev/null +++ b/docs/ru-RU/handbook/file-manager/field-attachment.md @@ -0,0 +1,15 @@ +# Поле для вложений + + + +## Введение + +Поле для вложений - это специальное реляционное поле, которое напрямую связывается с коллекцией файлов. + +## Настройка поля + +![20240512180916](https://static-docs.nocobase.com/20240512180916.png) + +## Пример использования + +(Пример будет добавлен) diff --git a/docs/ru-RU/handbook/file-manager/file-collection.md b/docs/ru-RU/handbook/file-manager/file-collection.md new file mode 100644 index 0000000000..d0dd6a21b4 --- /dev/null +++ b/docs/ru-RU/handbook/file-manager/file-collection.md @@ -0,0 +1,30 @@ +# Коллекция файлов + + + +## Введение + +Файлы представляют собой записи коллекций со специальной структурой (коллекции файлов), которые хранят метаданные файлов и могут управляться через Файловый менеджер. + +## Руководство пользователя + +### Создание коллекции файлов + +![20240324090414](https://static-docs.nocobase.com/20240324090414.png) + +### Предустановленные поля в коллекции файлов + +![20240324090527](https://static-docs.nocobase.com/20240324090527.png) + +### Использование в блоках + +![20240324090848](https://static-docs.nocobase.com/20240324090848.png) + +### Ассоциативное поле + +![20240324091529](https://static-docs.nocobase.com/20240324091529.png) + +### Ассоциативные блоки + +![20240324091321](https://static-docs.nocobase.com/20240324091321.png) + diff --git a/docs/ru-RU/handbook/file-manager/http-api.md b/docs/ru-RU/handbook/file-manager/http-api.md new file mode 100644 index 0000000000..e4e9ac636f --- /dev/null +++ b/docs/ru-RU/handbook/file-manager/http-api.md @@ -0,0 +1,146 @@ +# HTTP API для управления файлами + +Файлы можно загружать и управлять ими с помощью HTTP API. Ниже приведены примеры использования. + +--- + +### Загрузка файла в хранилище по умолчанию + +Чтобы загрузить файл, выполните операцию `create` к ресурсу таблицы вложений (`attachments`) с помощью POST-запроса, передав бинарные данные файла через поле `file`. После выполнения запроса файл будет загружен в хранилище по умолчанию. + +```bash +curl -X POST \ + -H "Authorization: Bearer " \ + -F "file=@<путь/к/файлу>" \ + "http://localhost:3000/api/attachments:create" +``` + +--- + +### Загрузка файла в указанное хранилище + +Если необходимо загрузить файл в хранилище, отличное от хранилища по умолчанию, используйте параметр `attachmentField`, указав поле таблицы, для которого настроено нужное хранилище (если поле не настроено, файл загружается в хранилище по умолчанию). + +```bash +curl -X POST \ + -H "Authorization: Bearer " \ + -F "file=@<путь/к/файлу>" \ + "http://localhost:3000/api/attachments:create?attachmentField=<имя_таблицы>.<имя_поля>" +``` + +--- + +### Получение подписанного URL для загрузки (для S3 и совместимых хранилищ) + +Для хранилищ на основе S3 (например, Amazon S3, Aliyun OSS, Tencent COS и др.) можно использовать подпись URL для загрузки файла. Это позволяет клиенту загружать файл напрямую, минуя сервер NocoBase. + +**1. Создание подписанного URL** + +```bash +curl 'http://localhost:13000/api/fileStorageS3:createPresignedUrl' \ + -X POST \ + -H 'Accept: application/json, text/plain, */*' \ + -H 'Authorization: Bearer ' \ + -H 'Content-Type: application/json' \ + --data-raw '{ + "name": "<имя_файла>", + "size": <размер_в_байтах>, + "type": "", + "storageId": , + "storageType": "<тип_хранилища>" + }' +``` + +**Пояснение параметров:** +- `name`: имя файла +- `size`: размер файла в байтах +- `type`: MIME-тип файла. Список распространённых типов: [Common MIME types](https://developer.mozilla.org/ru/docs/Web/HTTP/MIME_types/Common_types) +- `storageId`: идентификатор хранилища (поле `id`, полученное при настройке хранилища) +- `storageType`: тип хранилища (например, `s3`, `oss`, `cos` и т.д.) + +**Пример ответа:** +```json +{ + "url": "https://your-bucket.s3.amazonaws.com/...", + "method": "PUT", + "headers": { + "Content-Type": "image/png" + }, + "fileInfo": { + "title": "ATT00001", + "key": "ATT00001-8nuuxkuz4jn.png", + "extname": ".png", + "size": 4405, + "mimetype": "image/png", + "meta": {} + } +} +``` + +--- + +### Загрузка файла с помощью подписанного URL + +После получения подписанного URL выполните PUT-запрос, передав файл напрямую в хранилище. + +```bash +curl -X 'PUT' \ + -T /Users/Downloads/a.png \ + -H 'Content-Type: image/png' \ + 'https://your-bucket.s3.amazonaws.com/...' +``` + +--- + +### Создание записи о файле + +После успешной загрузки файла создайте запись в таблице вложений (`attachments`), выполнив операцию `create`. + +```bash +curl 'http://localhost:13000/api/attachments:create?attachmentField=<имя_таблицы>.<имя_поля>' \ + -X POST \ + -H 'Accept: application/json, text/plain, */*' \ + -H 'Authorization: Bearer ' \ + -H 'Content-Type: application/json' \ + --data-raw '{ + "title": "", + "filename": "<filename>", + "extname": "<extname>", + "path": "", + "size": <size>, + "url": "", + "mimetype": "<mimetype>", + "meta": <meta>, + "storageId": <storageId> + }' +``` + +**Описание полей в `data-raw`:** +- `title`: значение поля `fileInfo.title` из ответа при создании подписанного URL +- `filename`: значение `fileInfo.key` +- `extname`: значение `fileInfo.extname` +- `path`: оставьте пустым +- `size`: значение `fileInfo.size` +- `url`: оставьте пустым (будет заполнено автоматически) +- `mimetype`: значение `fileInfo.mimetype` +- `meta`: значение `fileInfo.meta` +- `storageId`: идентификатор хранилища (поле `id` из настройки хранилища) + +**Пример тела запроса:** +```json +{ + "title": "ATT00001", + "filename": "ATT00001-8nuuxkuz4jn.png", + "extname": ".png", + "path": "", + "size": 4405, + "url": "", + "mimetype": "image/png", + "meta": {}, + "storageId": 2 +} +``` + +--- + +Этот процесс позволяет гибко управлять загрузкой файлов, включая прямую загрузку в облачные хранилища и создание соответствующих записей в базе данных NocoBase. diff --git a/docs/ru-RU/handbook/file-manager/index.md b/docs/ru-RU/handbook/file-manager/index.md new file mode 100644 index 0000000000..11ba9d585d --- /dev/null +++ b/docs/ru-RU/handbook/file-manager/index.md @@ -0,0 +1,43 @@ +# Менеджер файлов + +<PluginInfo name="file-manager"></PluginInfo> + +## Введение + +Плагин "Менеджер файлов" предоставляет функционал для эффективного управления файлами, включая: +- Коллекцию файлов +- Поле для вложений +- Сервисы хранения файлов + +Файлы представляют собой записи в таблице данных (коллекции файлов), которые хранят метаданные и могут управляться через интерфейс менеджера. Поля вложений - это специальные реляционные поля, связанные с коллекцией файлов. Плагин поддерживает различные способы хранения: локальное хранилище, Alibaba Cloud OSS, Amazon S3 и Tencent Cloud COS. + +## Руководство пользователя + +### Коллекция файлов + +Система включает встроенную коллекцию для хранения всех файлов, связанных с полями вложений. Также можно создавать новые коллекции для хранения специфических файлов. + +[Подробнее в документации по коллекциям файлов](/handbook/file-manager/file-collection) + +### Поле вложений + +Специальные реляционные поля, связанные с коллекцией файлов. Можно создавать через "Поле вложения" или настраивать через "Ассоциативное поле". + +[Подробнее в документации по полям вложений](/handbook/file-manager/field-attachment) + +### Хранение файлов + +Движок хранения файлов поддерживает: +- Локальное хранение (на жестком диске сервера) +- Облачные хранилища (Alibaba Cloud OSS, Amazon S3, Tencent Cloud COS) + +[Подробнее в документации по хранению файлов](./storage/index.md) + +### HTTP API + +Возможна загрузка файлов через HTTP API. [Документация по API](./http-api.md) + +## Разработка + +* [Расширение типов файлов на клиенте](./development/client-file-type.md) + diff --git a/docs/ru-RU/handbook/file-manager/storage/aliyun-oss.md b/docs/ru-RU/handbook/file-manager/storage/aliyun-oss.md new file mode 100644 index 0000000000..976e8ca570 --- /dev/null +++ b/docs/ru-RU/handbook/file-manager/storage/aliyun-oss.md @@ -0,0 +1,31 @@ +# Aliyun OSS + +Хранилище на основе Aliyun OSS. Перед использованием необходимо подготовить соответствующие учетные записи и права доступа. + +## Настройки + +![Пример настроек Aliyun OSS](https://static-docs.nocobase.com/20240712220011.png) + +:::info{title="Подсказка"} +Здесь описаны только специфичные параметры для Aliyun OSS. Общие параметры смотрите в разделе [Общие параметры хранилищ](./index.md#common-engine-parameters). +::: + +### Регион + +Укажите регион хранилища OSS, например: `oss-cn-hangzhou`. + +:::info{title="Подсказка"} +Регион можно посмотреть в [консоли Aliyun OSS](https://oss.console.aliyun.com/) - указывается только префикс (без полного доменного имени). +::: + +### AccessKey ID + +Идентификатор ключа доступа Alibaba Cloud. + +### AccessKey Secret + +Секретный ключ доступа Alibaba Cloud. + +### Bucket + +Название бакета OSS. diff --git a/docs/ru-RU/handbook/file-manager/storage/amazon-s3.md b/docs/ru-RU/handbook/file-manager/storage/amazon-s3.md new file mode 100644 index 0000000000..2584e0bc5f --- /dev/null +++ b/docs/ru-RU/handbook/file-manager/storage/amazon-s3.md @@ -0,0 +1,10 @@ +# Amazon S3 + +:::warning +Documentation Pending +::: + +<!-- +## Introduction + +## Handbook --> diff --git a/docs/ru-RU/handbook/file-manager/storage/index.md b/docs/ru-RU/handbook/file-manager/storage/index.md new file mode 100644 index 0000000000..6d72a6f274 --- /dev/null +++ b/docs/ru-RU/handbook/file-manager/storage/index.md @@ -0,0 +1,56 @@ +# Обзор + +## Встроенные хранилища + +В настоящее время NocoBase поддерживает следующие типы встроенных хранилищ: + +- [Локальное хранилище](./local.md) +- [Amazon S3](./amazon-s3.md) +- [Alibaba Cloud OSS](./aliyun-oss.md) +- [Tencent Cloud COS](./tencent-cos.md) + +При установке системы автоматически добавляется локальное хранилище, которое можно использовать сразу. Вы можете добавить новые хранилища или изменить параметры существующих. + +## Общие параметры хранилищ + +Помимо специфических параметров для каждого типа хранилища, существуют также общие параметры: + +### Название + +Имя хранилища, предназначенное для восприятия человеком. + +### Системное имя + +Системное имя хранилища, используемое для идентификации в системе. Должно быть уникальным в масштабах всей системы. Если не указано, генерируется случайным образом. + +### Базовый URL доступа + +Префикс URL-адреса, по которому файл будет доступен извне. Может быть, например, базовым URL CDN: `https://cdn.nocobase.com/app` (без завершающего символа `/`). + +### Путь + +Относительный путь, используемый при сохранении файлов. Эта часть автоматически добавляется к итоговому URL при обращении к файлу. Например: `user/avatar` (без начального и конечного символа `/`). + +### Ограничение размера файла + +Максимальный размер файла, который можно загрузить в это хранилище. Файлы большего размера загружены не будут. Максимальное ограничение в системе — 1 ГБ. + +### Хранилище по умолчанию + +Если установлено, это хранилище становится хранилищем по умолчанию для всей системы. Файлы, загружаемые в поля вложений или коллекции файлов без указания конкретного хранилища, будут сохраняться именно в это хранилище. Хранилище по умолчанию нельзя удалить. + +### Сохранять файлы при удалении записей + +Если установлено, загруженные файлы останутся в хранилище даже после удаления соответствующих записей в полях вложений или коллекциях файлов. По умолчанию файлы удаляются вместе с записями. + +Пример настройки локального хранилища: + +![Пример настройки движка хранилища файлов](https://static-docs.nocobase.com/20240529115151.png) + +:::info{title=Примечание} +После загрузки файла итоговый путь доступа формируется из нескольких частей: + +``` +<Базовый URL>/<Путь>/<ИмяФайла><Расширение> +``` +Например: `https://cdn.nocobase.com/app/user/avatar/20240529115151.png`. diff --git a/docs/ru-RU/handbook/file-manager/storage/local.md b/docs/ru-RU/handbook/file-manager/storage/local.md new file mode 100644 index 0000000000..f7a2ae72e9 --- /dev/null +++ b/docs/ru-RU/handbook/file-manager/storage/local.md @@ -0,0 +1,18 @@ +# Локальное хранилище + +Загружаемые файлы сохраняются в локальной директории на сервере. Подходит для небольших или тестовых сценариев использования, где количество файлов ограничено. + +## Настройки + +![Пример параметров движка хранилища файлов](https://static-docs.nocobase.com/20240529115151.png) + +:::info{title=Подсказка} +В этом разделе описаны только специфические параметры локального хранилища. Общие параметры см. в разделе [Общие параметры хранилища](./index.md#general-engine-parameters). +::: + +### Путь + +Путь определяет как относительный путь к файлу на сервере, так и путь для доступа по URL. Например, значение `user/avatar` (без начального и конечного символа `/`) означает: + +1. Относительный путь к загруженному файлу на сервере: `/path/to/nocobase-app/storage/uploads/user/avatar`. +2. Префикс URL для доступа к файлу: `http://localhost:13000/storage/uploads/user/avatar`. diff --git a/docs/ru-RU/handbook/file-manager/storage/s3-pro.md b/docs/ru-RU/handbook/file-manager/storage/s3-pro.md new file mode 100644 index 0000000000..1f44f8178e --- /dev/null +++ b/docs/ru-RU/handbook/file-manager/storage/s3-pro.md @@ -0,0 +1,275 @@ +# Хранилище файлов: S3 (Pro) + +<PluginInfo commercial="true" name="file-storage-s3-pro"></PluginInfo> + +## Введение + +На основе плагина управления файлами эта версия добавляет поддержку типов хранилищ, совместимых с протоколом S3. Любые сервисы объектного хранилища, поддерживающие протокол S3, могут быть интегрированы без дополнительных настроек — например, Amazon S3, Alibaba Cloud OSS, Tencent Cloud COS, MinIO, Cloudflare R2 и другие. Это значительно повышает совместимость и гибкость систем хранения. + +## Возможности + +1. **Прямая загрузка с клиента:** файлы загружаются напрямую в хранилище, минуя сервер NocoBase, что обеспечивает более эффективный и быстрый процесс загрузки. + +2. **Частный доступ:** все URL-адреса файлов представляют собой временные подписанные ссылки с ограниченным сроком действия, что гарантирует безопасный и контролируемый доступ к файлам. + +## Сценарии использования + +1. **Управление таблицей файлов:** централизованное управление и хранение всех загруженных файлов с поддержкой различных типов и методов хранения для удобной классификации и поиска. + +2. **Хранение в полях вложений:** хранение вложений, загруженных через формы или записи, с привязкой к конкретным записям данных. + +## Настройка плагина + +1. Включите плагин `plugin-file-storage-s3-pro`. + +2. Перейдите в раздел «Настройки → Менеджер файлов», чтобы открыть настройки управления файлами. + +3. Нажмите кнопку «Добавить новое» и выберите «S3 Pro». + +![](https://static-docs.nocobase.com/20250102160704938.png) + +4. В появившемся окне откроется подробная форма для заполнения. Ознакомьтесь с документацией по вашему провайдеру хранилища, получите необходимые параметры и введите их в форму. + +![](https://static-docs.nocobase.com/20250413190828536.png) + +## Настройка провайдера хранилища + +### Amazon S3 + +#### Создание бакета + +1. Перейдите в [консоль Amazon S3](https://ap-southeast-1.console.aws.amazon.com/s3/home). + +2. Нажмите кнопку «Create bucket» (Создать бакет) в правой части экрана. + +![Создание бакета](https://static-docs.nocobase.com/file-storage-s3-pro-1735355969452.png) + +3. Укажите имя бакета (`Bucket Name`), оставьте остальные параметры по умолчанию, прокрутите вниз и нажмите кнопку **«Create»** (Создать), чтобы завершить процесс. + +![Настройка бакета](https://static-docs.nocobase.com/file-storage-s3-pro-1735355969622.png) + +#### Настройка CORS + +1. В списке бакетов найдите и нажмите на созданный бакет, чтобы открыть его настройки. + +![Список бакетов](https://static-docs.nocobase.com/file-storage-s3-pro-1735355969980.png) + +2. Перейдите на вкладку «Permissions» (Разрешения) и прокрутите вниз до раздела CORS. + +![Вкладка разрешений](https://static-docs.nocobase.com/file-storage-s3-pro-1735355970155.png) + +3. Введите следующую конфигурацию (при необходимости настройте под себя) и сохраните: + +```json +[ + { + "AllowedHeaders": [ + "*" + ], + "AllowedMethods": [ + "POST", + "PUT" + ], + "AllowedOrigins": [ + "*" + ], + "ExposeHeaders": [ + "ETag" + ], + "MaxAgeSeconds": 3000 + } +] +``` + +![Правила CORS](https://static-docs.nocobase.com/file-storage-s3-pro-1735355970494.png) + +#### Получение AccessKey и SecretAccessKey + +1. Нажмите кнопку «Security credentials» (Учётные данные безопасности) в правом верхнем углу. + +![Учётные данные безопасности](https://static-docs.nocobase.com/file-storage-s3-pro-1735355970651.png) + +2. Прокрутите до раздела «Access Keys» (Ключи доступа) и нажмите «Create Access Key» (Создать ключ доступа). + +![Создать ключ доступа](https://static-docs.nocobase.com/file-storage-s3-pro-1735355970832.png) + +3. Согласитесь с условиями (для рабочих сред рекомендуется использовать IAM). + +![Соглашение на ключ доступа](https://static-docs.nocobase.com/file-storage-s3-pro-1735355970996.png) + +4. Сохраните отображаемые Access Key и Secret Access Key. + +![Данные ключа доступа](https://static-docs.nocobase.com/file-storage-s3-pro-1735355971168.png) + +#### Получение параметров и настройка + +1. Используйте полученные `AccessKey ID` и `AccessKey Secret`. + +2. Перейдите в свойства бакета, чтобы найти `Bucket Name` (имя бакета) и `Region` (регион). + +![Детали бакета](https://static-docs.nocobase.com/file-storage-s3-pro-1735355971345.png) + +#### Публичный доступ (опционально) + +Для публичного доступа к файлам настройте следующее: + +1. В панели разрешений перейдите к «Object Ownership» (Владение объектами), нажмите «Edit» (Изменить) и включите ACL. + +![Включить ACL](https://static-docs.nocobase.com/file-storage-s3-pro-1735355971508.png) + +2. Прокрутите до «Block public access» (Блокировка публичного доступа), нажмите «Edit» и разрешите управление через ACL. + +![Блокировка публичного доступа](https://static-docs.nocobase.com/file-storage-s3-pro-1735355971668.png) + +3. В настройках NocoBase отметьте опцию «Public access» (Публичный доступ). + +#### Настройка миниатюр (опционально) + +Эта настройка необязательна и используется, если требуется оптимизировать размер или качество изображений при предварительном просмотре. **Обратите внимание: развертывание может повлечь дополнительные расходы. Подробности см. в условиях и тарифах AWS.** + +1. Перейдите на страницу [Dynamic Image Transformation for Amazon CloudFront](https://aws.amazon.com/solutions/implementations/dynamic-image-transformation-for-amazon-cloudfront/?nc1=h_ls). + +2. Нажмите кнопку `Launch in the AWS Console` внизу страницы, чтобы начать развертывание. + ![](https://static-docs.nocobase.com/20250221164214117.png) + +3. Следуйте инструкциям для завершения настройки. Обратите внимание на следующие параметры: + 1. При создании стека укажите имя бакета Amazon S3, в котором хранятся исходные изображения. Введите имя созданного ранее бакета. + 2. Если выбрано развертывание демо-интерфейса, после завершения вы сможете протестировать обработку изображений. В консоли AWS CloudFormation выберите свой стек, перейдите на вкладку «Outputs» (Выходные данные), найдите значение ключа `DemoUrl` и перейдите по ссылке, чтобы открыть демо-интерфейс. + 3. Решение использует библиотеку `sharp` для Node.js для эффективной обработки изображений. Исходный код доступен на GitHub и может быть адаптирован под ваши нужды. + + ![](https://static-docs.nocobase.com/20250221164315472.png) + ![](https://static-docs.nocobase.com/20250221164404755.png) + +4. После завершения настройки дождитесь, пока статус развертывания изменится на `CREATE_COMPLETE`. + +5. В настройках NocoBase учтите следующее: + 1. `Правило для миниатюр`: укажите параметры обработки изображений, например `?width=100`. Подробности см. в [документации AWS](https://docs.aws.amazon.com/solutions/latest/serverless-image-handler/use-supported-query-param-edits.html). + 2. `Базовый URL доступа`: введите значение из Outputs → ApiEndpoint после развертывания. + 3. `Полный стиль URL-доступа`: выберите **Ignore** (так как имя бакета уже указано в настройках, дополнительные действия не требуются). + + ![](https://static-docs.nocobase.com/20250414152135514.png) + +#### Пример настройки + +![](https://static-docs.nocobase.com/20250414152344959.png) + +#### Настройка CORS + +1. Перейдите на страницу сведений о бакете. + +![Страница сведений о бакете](https://static-docs.nocobase.com/file-storage-s3-pro-1735355973018.png) + +2. В меню выберите «Безопасность контента → CORS». + +![Меню CORS](https://static-docs.nocobase.com/file-storage-s3-pro-1735355973319.png) + +3. Нажмите «Создать правило», заполните поля и нажмите «ОК». + +![Настройка правила CORS](https://static-docs.nocobase.com/20250219171042784.png) + +#### Получение AccessKey и SecretAccessKey + +1. Нажмите «AccessKey» под аватаром вашего аккаунта. + +![Меню AccessKey](https://static-docs.nocobase.com/file-storage-s3-pro-1735355973884.png) + +2. Создайте AccessKey. Для рабочих сред рекомендуется ознакомиться с [Руководством по RAM AccessKey](https://help.aliyun.com/zh/ram/user-guide/create-an-accesskey-pair-1?spm=5176.28366559.0.0.1b5c3c2fUI9Ql8#section-rjh-18m-7kp). + +![Создать AccessKey](https://static-docs.nocobase.com/file-storage-s3-pro-1735355974171.png) + +3. Пройдите проверку учётной записи. + +![Проверка учётной записи](https://static-docs.nocobase.com/file-storage-s3-pro-1735355974509.png) + +4. Сохраните Access Key и Secret Access Key. + +![Данные AccessKey](https://static-docs.nocobase.com/file-storage-s3-pro-1735355974781.png) + +#### Получение параметров и настройка + +1. Используйте полученные `AccessKey ID` и `AccessKey Secret`. + +2. Перейдите в сведения о бакете, чтобы получить `Bucket Name` (имя бакета). + +![Имя бакета](https://static-docs.nocobase.com/file-storage-s3-pro-1735355975063.png) + +3. Прокрутите вниз, чтобы найти `Region` (регион), исключив `.aliyuncs.com`. + +![Сведения о регионе](https://static-docs.nocobase.com/file-storage-s3-pro-1735355975437.png) + +4. Получите `Endpoint` и добавьте префикс `https://`. + +![Настройка Endpoint](https://static-docs.nocobase.com/file-storage-s3-pro-1735355975715.png) + +#### Настройка миниатюр (опционально) + +Эта настройка необязательна и применяется только при необходимости оптимизации размера или качества изображений в предварительном просмотре. + +1. Заполните соответствующие параметры в поле `Правило для миниатюр`. Подробнее о параметрах см. в разделе [Параметры обработки изображений](https://help.aliyun.com/zh/oss/user-guide/img-parameters/?spm=a2c4g.11186623.help-menu-31815.d_4_14_1_1.170243033CdbSm&scm=20140722.H_144582._.OR_help-T_cn~zh-V_1). + +2. Убедитесь, что настройки `Полный стиль URL загрузки` и `Полный стиль URL доступа` одинаковы. + +#### Пример настройки + +![](https://static-docs.nocobase.com/20250414152525600.png) + +### MinIO + +#### Создание бакета + +1. Нажмите на меню **Buckets** слева → Нажмите **Create Bucket**, чтобы открыть страницу создания. + +2. Введите имя бакета, затем нажмите кнопку **Save** (Сохранить). + +![Создание бакета](https://static-docs.nocobase.com/20250106111325326.png) + +#### Получение AccessKey и SecretAccessKey + +1. Перейдите в раздел **Access Keys** → Нажмите кнопку **Create access key**, чтобы открыть страницу создания. + +![Создать ключ доступа](https://static-docs.nocobase.com/20250106111922957.png) + +2. Нажмите кнопку **Save** (Сохранить). + +![Сохранить ключ доступа](https://static-docs.nocobase.com/20250106111850639.png) + +3. Сохраните **Access Key** и **Secret Key** из всплывающего окна для дальнейшей настройки. + +![Данные ключа доступа](https://static-docs.nocobase.com/20250106112831483.png) + +#### Настройка параметров + +1. Перейдите на страницу **Менеджер файлов** в NocoBase. + +2. Нажмите кнопку **Добавить новое** и выберите **S3 Pro**. + +3. Заполните форму следующим образом: + - **AccessKey ID** и **AccessKey Secret**: используйте значения, сохранённые на предыдущем шаге. + - **Region** (Регион): для локальных развертываний MinIO понятие региона не применяется. Установите значение `"auto"`. + - **Endpoint**: введите доменное имя или IP-адрес вашего развернутого сервиса. + - Установите параметр **Force path style** (Принудительный стиль пути) в значение **Path-Style**. Итоговый URL файла будет иметь вид: + `https://{Endpoint}/{bucket-name}/{fileKey}`. + +#### Пример настройки + +![](https://static-docs.nocobase.com/20250414152700671.png) + +### Tencent COS + +См. предыдущие настройки. Процесс аналогичен. + +#### Пример настройки + +![](https://static-docs.nocobase.com/20250414153252872.png) + +### Cloudflare R2 + +См. предыдущие настройки. Процесс аналогичен. + +#### Пример настройки + +![](https://static-docs.nocobase.com/20250414154500264.png) + +## Руководство пользователя + +См. документацию по плагину [file-manager](https://docs.nocobase.com/handbook/file-manager/) diff --git a/docs/ru-RU/handbook/file-manager/storage/tencent-cos.md b/docs/ru-RU/handbook/file-manager/storage/tencent-cos.md new file mode 100644 index 0000000000..77dab5b3c1 --- /dev/null +++ b/docs/ru-RU/handbook/file-manager/storage/tencent-cos.md @@ -0,0 +1,31 @@ +# Tencent COS + +Хранилище на основе Tencent Cloud COS. Перед использованием необходимо подготовить соответствующие учетные записи и права доступа. + +## Настройки + +![Пример настроек Tencent COS](https://static-docs.nocobase.com/20240712222125.png) + +:::info{title="Подсказка"} +В этом разделе описаны только специфичные параметры для Tencent COS. Общие параметры смотрите в разделе [Общие параметры хранилищ](./index.md#common-engine-parameters). +::: + +### Регион + +Укажите регион хранилища COS, например: `ap-chengdu`. + +:::info{title="Подсказка"} +Регион можно посмотреть в [консоли Tencent COS](https://console.cloud.tencent.com/cos) - указывается только префикс (без полного доменного имени). +::: + +### SecretId + +Идентификатор ключа доступа Tencent Cloud. + +### SecretKey + +Секретный ключ доступа Tencent Cloud. + +### Bucket + +Название бакета COS, например: `qing-cdn-1234189398`. diff --git a/docs/ru-RU/handbook/file-storage-cos/index.md b/docs/ru-RU/handbook/file-storage-cos/index.md new file mode 100644 index 0000000000..d32f55245e --- /dev/null +++ b/docs/ru-RU/handbook/file-storage-cos/index.md @@ -0,0 +1,7 @@ +# Tencent Cloud COS + +<PluginInfo name="file-storage-cos"></PluginInfo> + +## Введение + +## Мануал diff --git a/docs/ru-RU/handbook/file-storage-oss/index.md b/docs/ru-RU/handbook/file-storage-oss/index.md new file mode 100644 index 0000000000..50d159d17f --- /dev/null +++ b/docs/ru-RU/handbook/file-storage-oss/index.md @@ -0,0 +1,7 @@ +# Alibaba Cloud OSS + +<PluginInfo name="file-storage-oss"></PluginInfo> + +## Introduction + +## Hand book diff --git a/docs/ru-RU/handbook/file-storage-s3/index.md b/docs/ru-RU/handbook/file-storage-s3/index.md new file mode 100644 index 0000000000..b5ba7d79db --- /dev/null +++ b/docs/ru-RU/handbook/file-storage-s3/index.md @@ -0,0 +1,7 @@ +# Amazon S3 + +<PluginInfo name="file-storage-s3"></PluginInfo> + +## Introduction + +## Hand book diff --git a/docs/ru-RU/handbook/graph-collection-manager/index.md b/docs/ru-RU/handbook/graph-collection-manager/index.md new file mode 100644 index 0000000000..31260b9afb --- /dev/null +++ b/docs/ru-RU/handbook/graph-collection-manager/index.md @@ -0,0 +1,24 @@ +# Менеджер по сбору графиков + +<PluginInfo name="graph-collection-manager"></PluginInfo> + +## Введение + +Это инструмент, аналогичный ER diagrams, который в настоящее время поддерживает только основную базу данных. + +## Установка + +Этот предустановленный плагин необходимо активировать, прежде чем его можно будет использовать. + +## Introduction +Это инструмент, аналогичный ER diagrams, который в настоящее время поддерживает только основную базу данных. + +## Установка + +Этот предварительно настроенный плагин необходимо активировать, прежде чем его можно будет использовать. + +![20240322221627](https://static-docs.nocobase.com/20240322221627.png) + +## Руководство пользователя + +![20240410075906](https://static-docs.nocobase.com/20240410075906.png) diff --git a/docs/ru-RU/handbook/index.md b/docs/ru-RU/handbook/index.md new file mode 100644 index 0000000000..fad505bb2b --- /dev/null +++ b/docs/ru-RU/handbook/index.md @@ -0,0 +1,11 @@ +# Справочник и практическое руководство + +1. Если вы только начинаете знакомство с NocoBase, рекомендуется начать с раздела [«Моделирование данных — обзор»](/handbook/data-modeling). В нём вы узнаете об основных возможностях системы моделирования данных в NocoBase. +2. Далее вы можете добавить [«Страницы»](/handbook/ui/pages) и [«Блоки»](/handbook/ui/blocks) в интерфейс. Выбирайте подходящие блоки для отображения данных из источников. +3. Затем настройте [«Поля»](/handbook/ui/fields) и [«Действия»](/handbook/ui/actions) для этих блоков. На этом этапе уже можно реализовать простую обработку данных. +4. Если вы хотите объединять действия в последовательности, обратитесь к разделу [«Бизнес-процессы (Workflow)»](/handbook/workflow). Workflow предоставляет различные триггеры и узлы действий, позволяя реализовать любую логику обработки данных. +5. Для всех действий необходимо настроить права доступа. Перейдите в раздел [«Пользователи и права доступа»](/handbook/acl). Здесь также объясняется концепция [«Подразделений»](/handbook/departments), где описано управление пользователями, ролями и организационной структурой. +6. Если у вас уже есть провайдер идентификации (IdP), ознакомьтесь с главой [«Аутентификация пользователей»](/handbook/auth). В ней описано, как интегрировать сторонние системы авторизации. +7. В разделе [«Системные настройки»](/handbook/system-settings) вы можете включить поддержку нескольких языков. Если ваш язык переведён не полностью, воспользуйтесь [«Управлением локализацией»](/handbook/localization-management) — вы можете как дополнить перевод, так и внести вклад в развитие NocoBase. +8. Раздел [«Логирование и мониторинг»](/handbook/logger) — важный инструмент для администрирования и поддержки системы. Он помогает разработчикам вовремя находить и устранять ошибки, оптимизировать производительность, обеспечивать безопасность и стабильность системы. +9. Все установленные плагины отображаются в [«Менеджере плагинов»](/handbook/plugin-manager). Чтобы использовать плагин, его нужно активировать. Если имеющихся плагинов недостаточно, вы можете [создать собственный плагин](/development) и подключить его через менеджер. diff --git a/docs/ru-RU/handbook/ip-restriction/index.md b/docs/ru-RU/handbook/ip-restriction/index.md new file mode 100644 index 0000000000..8ac90d3d16 --- /dev/null +++ b/docs/ru-RU/handbook/ip-restriction/index.md @@ -0,0 +1,48 @@ +# Ограничение по IP-адресам + +<PluginInfo licenseBundled="true" name="ip-restriction"></PluginInfo> + +## Введение + +NocoBase позволяет администраторам настраивать белые и чёрные списки IP-адресов пользователей, чтобы ограничить несанкционированные внешние подключения или блокировать известные вредоносные IP-адреса, тем самым снижая риски безопасности. Также поддерживается просмотр журналов отказов в доступе для выявления подозрительных IP-адресов. + +## Настройка правил + +![2025-01-23-10-07-34-20250123100733](https://static-docs.nocobase.com/2025-01-23-10-07-34-20250123100733.png) + +### Режимы фильтрации по IP + +- **Чёрный список**: если IP-адрес пользователя совпадает с адресом из списка, система **запрещает** доступ; все остальные IP-адреса по умолчанию **разрешены**. +- **Белый список**: если IP-адрес пользователя совпадает с адресом из списка, система **разрешает** доступ; все остальные IP-адреса по умолчанию **запрещены**. + +### Список IP-адресов + +Используется для определения IP-адресов, которым разрешён или запрещён доступ к системе. Его функция зависит от выбранного режима фильтрации. Поддерживается ввод как отдельных IP-адресов, так и CIDR-сетей. Несколько адресов можно разделять запятыми или переносами строк. + +## Просмотр журналов + +После отказа в доступе IP-адрес пользователя записывается в системный журнал, и соответствующий файл журнала можно скачать для анализа. + +![2025-01-17-13-33-51-20250117133351](https://static-docs.nocobase.com/2025-01-17-13-33-51-20250117133351.png) + +Пример записи в журнале: + +![2025-01-14-14-42-06-20250114144205](https://static-docs.nocobase.com/2025-01-14-14-42-06-20250114144205.png) + +## Рекомендации по настройке + +### Рекомендации для режима чёрного списка + +- Добавляйте известные вредоносные IP-адреса, чтобы предотвратить возможные сетевые атаки. +- Регулярно проверяйте и обновляйте чёрный список, удаляя устаревшие или ненужные IP-адреса. + +### Рекомендации для режима белого списка + +- Добавляйте доверенные внутренние IP-адреса (например, офисные сетевые сегменты), чтобы обеспечить безопасный доступ к критически важным системам. +- Избегайте включения в белый список динамически выделяемых IP-адресов, чтобы предотвратить перебои в доступе. + +### Общие рекомендации + +- Используйте CIDR-сети для упрощения настройки, например, вместо добавления отдельных IP-адресов укажите сеть `192.168.0.0/24`. +- Регулярно создавайте резервные копии конфигурации списка IP-адресов, чтобы быстро восстановиться после ошибок или сбоев системы. +- Регулярно отслеживайте журналы доступа, выявляйте подозрительные IP-адреса и своевременно корректируйте чёрный или белый список. diff --git a/docs/ru-RU/handbook/localization-management/index.md b/docs/ru-RU/handbook/localization-management/index.md new file mode 100644 index 0000000000..0a2d725afd --- /dev/null +++ b/docs/ru-RU/handbook/localization-management/index.md @@ -0,0 +1,53 @@ +# Управление локализацией + +<PluginInfo name="localization-management"></PluginInfo> + +## Введение + +Плагин "Управление локализацией" предназначен для помощи в управлении и реализации процесса локализации NocoBase. Он переводит меню, таблицы данных, поля и все плагины NocoBase для адаптации к языку и культуре конкретного региона. + +## Установка + +Это встроенный плагин, поэтому дополнительная установка не требуется. + +## Руководство пользователя + +### Активация плагина + +![](https://static-docs.nocobase.com/d16f6ecd6bfb8d1e8acff38f23ad37f8.png) + +### Управление локализацией + +![](https://static-docs.nocobase.com/c117b5337941f0afd564152053666480.png) + +### Синхронизация переводов + +![](https://static-docs.nocobase.com/bc380a4ebdb2af075abcab5f16287cf9.png) + +После синхронизации будут отображены все переводимые элементы для текущего языка. + +![](https://static-docs.nocobase.com/cf501e6b4d2f67520ad35b00d1ed3446.png) + +### Публикация + +После завершения перевода необходимо нажать кнопку "Опубликовать", чтобы изменения вступили в силу. + +![](https://static-docs.nocobase.com/1f9dc52defb37ac67912011ba31c3160.png) + +### Перевод на другие языки + +Включите другие языки в "Системных настройках", например, упрощенный китайский. + +![](https://static-docs.nocobase.com/618830967aaeb643c892fce355d59a73.png) + +Переключитесь на этот язык. + +![](https://static-docs.nocobase.com/35548a7bf099df4f30d160c72863c6b8.png) + +Синхронизируйте элементы. + +![](https://static-docs.nocobase.com/12f39cfcd7d8d9ce3d367426b959af16.png) + +Выполните перевод и опубликуйте. + +![](https://static-docs.nocobase.com/eb22725dcab6807dc8a410f5e10e9492.png) diff --git a/docs/ru-RU/handbook/localization-management/static/BFRcbhE31oEAHOxss5ncRnEvnZb.png b/docs/ru-RU/handbook/localization-management/static/BFRcbhE31oEAHOxss5ncRnEvnZb.png new file mode 100644 index 0000000000..3e52179dc1 Binary files /dev/null and b/docs/ru-RU/handbook/localization-management/static/BFRcbhE31oEAHOxss5ncRnEvnZb.png differ diff --git a/docs/ru-RU/handbook/localization-management/static/DxQ8bDrtsoi8ObxadwZcCYntn9d.png b/docs/ru-RU/handbook/localization-management/static/DxQ8bDrtsoi8ObxadwZcCYntn9d.png new file mode 100644 index 0000000000..b51c6e242c Binary files /dev/null and b/docs/ru-RU/handbook/localization-management/static/DxQ8bDrtsoi8ObxadwZcCYntn9d.png differ diff --git a/docs/ru-RU/handbook/localization-management/static/GaqEbrgAdokzgJxqicMcdKxMnQf.png b/docs/ru-RU/handbook/localization-management/static/GaqEbrgAdokzgJxqicMcdKxMnQf.png new file mode 100644 index 0000000000..ec4c28e927 Binary files /dev/null and b/docs/ru-RU/handbook/localization-management/static/GaqEbrgAdokzgJxqicMcdKxMnQf.png differ diff --git a/docs/ru-RU/handbook/localization-management/static/IkBhbaqrfodzsMxxueIcUENnnTd.png b/docs/ru-RU/handbook/localization-management/static/IkBhbaqrfodzsMxxueIcUENnnTd.png new file mode 100644 index 0000000000..ff36c8d38b Binary files /dev/null and b/docs/ru-RU/handbook/localization-management/static/IkBhbaqrfodzsMxxueIcUENnnTd.png differ diff --git a/docs/ru-RU/handbook/localization-management/static/IkFDbWE8ios6qSxp78scf2BOnQg.png b/docs/ru-RU/handbook/localization-management/static/IkFDbWE8ios6qSxp78scf2BOnQg.png new file mode 100644 index 0000000000..dd15f11bee Binary files /dev/null and b/docs/ru-RU/handbook/localization-management/static/IkFDbWE8ios6qSxp78scf2BOnQg.png differ diff --git a/docs/ru-RU/handbook/localization-management/static/Pi1nbxvVEoqSIox28FkcYkw7nID.png b/docs/ru-RU/handbook/localization-management/static/Pi1nbxvVEoqSIox28FkcYkw7nID.png new file mode 100644 index 0000000000..8d3a232439 Binary files /dev/null and b/docs/ru-RU/handbook/localization-management/static/Pi1nbxvVEoqSIox28FkcYkw7nID.png differ diff --git a/docs/ru-RU/handbook/localization-management/static/S49abMq61oBfMFxRvs7cZTgHnoh.png b/docs/ru-RU/handbook/localization-management/static/S49abMq61oBfMFxRvs7cZTgHnoh.png new file mode 100644 index 0000000000..a1db38f6ab Binary files /dev/null and b/docs/ru-RU/handbook/localization-management/static/S49abMq61oBfMFxRvs7cZTgHnoh.png differ diff --git a/docs/ru-RU/handbook/localization-management/static/TmD3bXzJ2onTXcxyaWXc2g30n0e.png b/docs/ru-RU/handbook/localization-management/static/TmD3bXzJ2onTXcxyaWXc2g30n0e.png new file mode 100644 index 0000000000..562afbd77b Binary files /dev/null and b/docs/ru-RU/handbook/localization-management/static/TmD3bXzJ2onTXcxyaWXc2g30n0e.png differ diff --git a/docs/ru-RU/handbook/localization-management/static/XO9TbVodPo01SrxFPrkcUsVmngg.png b/docs/ru-RU/handbook/localization-management/static/XO9TbVodPo01SrxFPrkcUsVmngg.png new file mode 100644 index 0000000000..970b990d5c Binary files /dev/null and b/docs/ru-RU/handbook/localization-management/static/XO9TbVodPo01SrxFPrkcUsVmngg.png differ diff --git a/docs/ru-RU/handbook/logger/index.md b/docs/ru-RU/handbook/logger/index.md new file mode 100644 index 0000000000..383de3603c --- /dev/null +++ b/docs/ru-RU/handbook/logger/index.md @@ -0,0 +1,143 @@ +### **Журналы (Логи)** + +#### **Введение** +Журналы — важный инструмент для поиска и устранения проблем в системе. Серверные логи NocoBase в основном включают журналы запросов к интерфейсам и системные операционные логи. Поддерживаются настройки уровня логирования, стратегии ротации, размера, формата вывода и другие параметры. В этом документе описаны основные сведения о серверных логах NocoBase, а также способы использования плагина логирования для архивации и скачивания логов. + +--- + +### **Настройка логов** +Параметры, связанные с логами (например, уровень логирования, способ вывода, формат отображения), можно настроить с помощью [переменных окружения](../../welcome/getting-started/env.md#logger_transport). + +--- + +### **Форматы логов** +NocoBase поддерживает четыре различных формата логов. + +#### `console` +Формат по умолчанию в режиме разработки. Сообщения отображаются с цветовой подсветкой. + +``` +2023-12-30 22:40:06 [info ] response method=GET path=/api/uiSchemas:getJsonSchema/nocobase-admin-menu res={ "status ":200} action={ "actionName ": "getJsonSchema ", "resourceName ": "uiSchemas ", "params ":{ "filterByTk ": "nocobase-admin-menu ", "resourceName ": "uiSchemas ", "resourceIndex ": "nocobase-admin-menu ", "actionName ": "getJsonSchema "}} userId=1 status=200 cost=5 app=main reqId=ccf4e3bd-beb0-4350-af6e-b1fc1d9b6c3f +2023-12-30 22:43:12 [debug] Database dialect: mysql module=application metho d=install app=main reqId=31ffa8b5-f377-456b-a295-0c8a28938228 +2023-12-30 22:43:12 [warn ] app is installed module=application method=install app=main re qId=31ffa8b5-f377-456b-a295-0c8a28938228 +``` + +#### `json` +Формат по умолчанию в производственной среде. + +```json +{ + "level ": "info ", + "timestamp ": "2023-12-26 22:04:56 ", + "reqId ": "7612ef42-58e8-4c35-bac2-2e6c9d8ec96e ", + "message ": "response ", + "method ": "POST ", + "path ": "/api/authenticators:publicList ", + "res ": { "status ": 200 }, + "action ": { + "actionName ": "publicList ", + "resourceName ": "authenticators ", + "params ": { "resourceName ": "authenticators ", "actionName ": "publicList " } + }, + "status ": 200, + "cost ": 16 +} +``` + +#### `logfmt` +Дополнительную информацию можно найти по адресу: https://brandur.org/logfmt + +``` +level=info timestamp=2023-12-21 14:18:02 reqId=8b59a40d-68ee-4c97-8001-71a47a92805a +message=response method=POST path=/api/authenticators:publicList res={ "status ":200} +action={ "actionName ": "publicList ", "resourceName ": "authenticators ", "params ":{ "resourceName ": "authenticators ", "actionName ": "publicList "}} +userId=undefined status=200 cost=14 +``` + +#### `delimiter` +Разделитель — символ `|`. + +``` +info|2023-12-26 22:07:09|13cd16f0-1568-418d-ac37-6771ee650e14|response|POST|/api/authenticators:publicList|{ "status ":200}|{ "actionName ": "publicList ", "resourceName ": "authenticators ", "params ":{ "resourceName ": "authenticators ", "actionName ": "publicList "}}||200|25 +``` + +--- + +### **Каталог логов** +Основная структура каталога с файлами логов NocoBase: + +- `storage/logs` — каталог для вывода логов + - `main` — основное приложение + - `request_YYYY-MM-DD.log` — лог запросов + - `system_YYYY-MM-DD.log` — системный лог + - `system_error_YYYY-MM-DD.log` — лог системных ошибок + - `sql_YYYY-MM-DD.log` — лог выполнения SQL-запросов + - ... + - `sub-app` — имя подприложения + - `request_YYYY-MM-DD.log` + - ... + +--- + +### **Файлы логов** + +#### **Лог запросов** +`request_YYYY-MM-DD.log` — журналы запросов и ответов к интерфейсам. + +| Поле | Описание | +|------------|---------| +| level | Уровень логирования | +| timestamp | Время записи лога в формате `YYYY-MM-DD hh:mm:ss` | +| message | `request` или `response` | +| userId | Присутствует только в `response` | +| method | Метод запроса | +| path | Путь запроса | +| req / res | Содержимое запроса / ответа | +| action | Запрашиваемые ресурсы и параметры | +| status | Код статуса ответа | +| cost | Время выполнения запроса (в миллисекундах) | +| app | Имя текущего приложения | +| reqId | Идентификатор запроса | + +:::info{title=Примечание} +`reqId` передаётся на фронтенд через заголовок ответа `X-Request-Id`. +::: + +--- + +#### **Системный лог** +`system_YYYY-MM-DD.log` — логи работы приложения, промежуточного ПО (middleware), плагинов и других системных операций. Логи уровня `error` дополнительно записываются в отдельный файл `system_error_YYYY-MM-DD.log`. + +| Поле | Описание | +|-------------|---------| +| level | Уровень логирования | +| timestamp | Время записи лога в формате `YYYY-MM-DD hh:mm:ss` | +| message | Сообщение лога | +| module | Модуль | +| submodule | Подмодуль | +| method | Вызываемый метод | +| meta | Дополнительная информация (в формате JSON) | +| app | Имя текущего приложения | +| reqId | Идентификатор запроса | + +--- + +#### **Лог выполнения SQL** +`sql_YYYY-MM-DD.log` — лог выполнения SQL-запросов к базе данных. Для операций `INSERT INTO` сохраняются только первые 2000 символов. + +| Поле | Описание | +|-------------|---------| +| level | Уровень логирования | +| timestamp | Время записи лога в формате `YYYY-MM-DD hh:mm:ss` | +| sql | SQL-запрос | +| app | Имя текущего приложения | +| reqId | Идентификатор запроса | + +--- + +### **Архивация и скачивание логов** +1. Перейдите на страницу управления логами. +2. Выберите нужные файлы логов для скачивания. +3. Нажмите кнопку загрузки. + +![Пример интерфейса](https://static-docs.nocobase.com/2024-04-10_10-50-50.png) diff --git a/docs/ru-RU/handbook/logger/static/2023-12-26-23-01-17.png b/docs/ru-RU/handbook/logger/static/2023-12-26-23-01-17.png new file mode 100644 index 0000000000..b5ecfdbc2d Binary files /dev/null and b/docs/ru-RU/handbook/logger/static/2023-12-26-23-01-17.png differ diff --git a/docs/ru-RU/handbook/migration-manager/index.md b/docs/ru-RU/handbook/migration-manager/index.md new file mode 100644 index 0000000000..31e2f14e8a --- /dev/null +++ b/docs/ru-RU/handbook/migration-manager/index.md @@ -0,0 +1,92 @@ +# Менеджер миграций + +<PluginInfo licenseBundled="true" name="migration-manager"></PluginInfo> + +## Введение + +Менеджер миграций помогает переносить конфигурации приложений из одного окружения в другое. Его основная задача — миграция «конфигураций приложений». Если вам требуется полный перенос данных, рекомендуем использовать «[Менеджер резервного копирования](/handbook/backups)» для создания резервных копий и восстановления всего приложения. + +## Установка + +Менеджер миграций зависит от [Менеджера резервного копирования](/handbook/backups). Убедитесь, что плагин Менеджера резервного копирования уже установлен и активирован. Подробнее см. в разделе [Установка и обновление коммерческих плагинов](/welcome/getting-started/plugin). + +## Процесс и принципы работы + +Менеджер миграций переносит таблицы и данные из основной базы данных на основе указанных правил миграции, перемещая их из одного экземпляра приложения в другой. Обратите внимание, что он не переносит данные из внешних баз данных или подприложений. + +![20250102202546](https://static-docs.nocobase.com/20250102202546.png) + +## Правила миграции + +### Встроенные правила + +Менеджер миграций может переносить все таблицы в основной базе данных и поддерживает пять встроенных правил: + +1. **Только схема** + Переносит только структуру (схему) таблиц — данные не вставляются и не обновляются. + +2. **Перезапись (очистка и повторная вставка)** + Удаляет все существующие записи из целевой таблицы базы данных, затем вставляет новые данные. + +3. **Обновление или вставка (Upsert)** + Проверяет, существует ли запись (по первичному ключу). Если существует — обновляет её, если нет — вставляет новую. + +4. **Вставка без обновления (Insert-ignore)** + Вставляет новые записи, но если запись уже существует (по первичному ключу), вставка игнорируется (обновления не происходит). + +5. **Пропуск** + Пропускает обработку таблицы полностью (без изменений структуры или переноса данных). + +**Дополнительные примечания:** + +- «Перезапись», «Обновление или вставка» и «Вставка без обновления» также синхронизируют изменения структуры таблиц. +- Если таблица использует автоинкрементный ID в качестве первичного ключа или не имеет первичного ключа, правила «Обновление или вставка» и «Вставка без обновления» не могут быть применены. +- «Обновление или вставка» и «Вставка без обновления» используют первичный ключ для определения существования записи. + +### Подробная схема работы + +![20250102204909](https://static-docs.nocobase.com/20250102204909.png) + +### Интерфейс настройки + +Вы можете настроить правила миграции в интерфейсе: + +![20250102205450](https://static-docs.nocobase.com/20250102205450.png) + +Включение независимых правил: + +![20250107105005](https://static-docs.nocobase.com/20250107105005.png) + +Выбор таблиц, к которым применяются эти правила: + +![20250107104644](https://static-docs.nocobase.com/20250107104644.png) + +## Файлы миграции + +![20250102205844](https://static-docs.nocobase.com/20250102205844.png) + +### Создание новой миграции + +![20250102205857](https://static-docs.nocobase.com/20250102205857.png) + +### Выполнение миграции + +![20250102205915](https://static-docs.nocobase.com/20250102205915.png) + +Во время выполнения система проверяет переменные окружения (подробнее о [Переменных окружения](/handbook/environment-variables)): + +![20250102212311](https://static-docs.nocobase.com/20250102212311.png) + +Если какие-либо обязательные переменные окружения отсутствуют, появится запрос на их добавление перед продолжением: + +![20250102210009](https://static-docs.nocobase.com/20250102210009.png) + +## Логи миграции + +![20250102205738](https://static-docs.nocobase.com/20250102205738.png) + +## Откат + +Перед выполнением любой миграции автоматически создаётся резервная копия текущего приложения. Если миграция завершится неудачно или результаты окажутся неожиданными, вы можете выполнить откат с помощью [Менеджера резервного копирования](/handbook/backups). + +![20250105195029](https://static-docs.nocobase.com/20250105195029.png) diff --git a/docs/ru-RU/handbook/mobile-client/index.md b/docs/ru-RU/handbook/mobile-client/index.md new file mode 100644 index 0000000000..0d235f98f3 --- /dev/null +++ b/docs/ru-RU/handbook/mobile-client/index.md @@ -0,0 +1,17 @@ +# Мобильный + +<PluginInfo name="mobile-client"></PluginInfo> + +## Введение + +Предоставляет возможность настройки мобильных страниц. + +## Установка + +Это предустановленный плагин, который необходимо активировать перед использованием. + +![20240324171718](https://static-docs.nocobase.com/20240324171718.png) + +## Использование + +![20240324171605](https://static-docs.nocobase.com/20240324171605.png) diff --git a/docs/ru-RU/handbook/mobile/index.md b/docs/ru-RU/handbook/mobile/index.md new file mode 100644 index 0000000000..afdaa7b9f7 --- /dev/null +++ b/docs/ru-RU/handbook/mobile/index.md @@ -0,0 +1,71 @@ +# Мобильный плагин + +<PluginInfo name="mobile"></PluginInfo> + +## Введение + +Этот плагин упрощает настройку мобильных страниц, используя фреймворк на основе Ant Design Mobile. Он предлагает различные точки расширения и поддерживает интеграцию определённых десктопных блоков. + +:::warning +Старый плагин `plugin-mobile-client` устарел. Начиная с версии v1.3, рекомендуется переходить на `plugin-mobile`. Эти два плагина несовместимы, поэтому новая версия потребует полной перенастройки мобильных параметров. +::: + +## Установка + +Этот плагин предустановлен, но требует активации для работы. + +![20240712113500](https://static-docs.nocobase.com/20240712113500.png) + +## Руководство пользователя + +### Интерфейс настройки UI + +NocoBase предоставляет специализированный интерфейс настройки для мобильных устройств. + +![20240828220321](https://static-docs.nocobase.com/20240828220321.png) + +### Панель вкладок + +Поддерживает добавление двух типов: ссылки и страницы. + +![20240828223244](https://static-docs.nocobase.com/20240828223244.png) + +### Добавление блоков + +В настоящее время можно добавлять следующие десктопные блоки: + +![20240828223454](https://static-docs.nocobase.com/20240828223454.png) + +### Настройка страниц + +![20240828221452](https://static-docs.nocobase.com/20240828221452.png) + +### Вкладки страниц + +![20240828222225](https://static-docs.nocobase.com/20240828222225.png) + +### Подстраницы + +На мобильных устройствах всплывающие действия открываются как подстраницы с функцией свайпа назад. + +<video width="100%" controls> + <source src="https://static-docs.nocobase.com/20240828222736_rec_.mp4" type="video/mp4"> +</video> + +### Фильтрация + +Для фильтрации используется метод взаимодействия [Popup](https://mobile.ant.design/components/popup). + +![20240828230549](https://static-docs.nocobase.com/20240828230549.png) + +### Настройка прав доступа к меню + +Вы можете настроить права доступа к меню так же, как и в десктопной версии (плагин mobile должен быть сначала активирован): + +![20240903221327_rec_](https://static-docs.nocobase.com/20240903221327_rec_.gif) + +## Руководство разработчика + +В настоящее время поддерживаются следующие точки расширения: + +![20240712115610](https://static-docs.nocobase.com/20240712115610.png) diff --git a/docs/ru-RU/handbook/multi-app-manager/index.md b/docs/ru-RU/handbook/multi-app-manager/index.md new file mode 100644 index 0000000000..3d8d29529e --- /dev/null +++ b/docs/ru-RU/handbook/multi-app-manager/index.md @@ -0,0 +1,54 @@ +# Менеджер мульти-приложений + +<PluginInfo name="multi-app-manager"></PluginInfo> + +## Введение + +Динамическое управление несколькими приложениями без необходимости отдельных развертываний, где каждое приложение является независимым экземпляром. + +:::warning +Плагин управления мульти-приложениями не предоставляет возможности совместного использования пользователей. Интеграция может быть выполнена через "[Плагин аутентификации](/handbook/auth)" или с использованием "[Плагина переключения приложений](/handbook/app-switching)". +::: + +## Установка + +Это предустановленный плагин, который требует активации перед использованием. + +![20240327144151](https://static-docs.nocobase.com/20240327144151.png) + +## Руководство пользователя + +![20240327144327](https://static-docs.nocobase.com/20240327144327.png) + +### Добавление приложений + +![20240327150722](https://static-docs.nocobase.com/20240327150722.png) + +### Методы запуска + +Предоставляется два метода запуска: + +- Запуск при первом посещении: Подприложение запускается только при первом посещении URL подприложения пользователем; +- Запуск вместе с основным приложением: При запуске основного приложения подприложения также запускаются, что увеличивает время запуска основного приложения. + +![20240327170218](https://static-docs.nocobase.com/20240327170218.png) + +### Пользовательский домен + +Подприложения могут быть доступны через подпути `/apps/:appName/admin/`, например: + +```bash +http://localhost:13000/apps/a_7zkxoarusnx/admin/z45sjaukasd +``` + +Дополнительно, подприложениям можно настроить независимые поддомены, которые требуют резолвинга домена на текущий IP. При использовании nginx домен также нужно добавить в конфигурацию nginx. + +![20240327170301](https://static-docs.nocobase.com/20240327170301.png) + +### Отображение в меню + +:::warning +Список подприложений, отображаемый в текущем выпадающем меню справа, является лишь набором быстрых ссылок. Пользователи не являются общими; подприложения требуют входа и могут использоваться только root-аккаунтом основного приложения. Полноценные возможности переключения приложений будут предоставлены в коммерческом плагине "[Переключение приложений](//handbook/app-switching)". +::: + +![20240327151239](https://static-docs.nocobase.com/20240327151239.png) diff --git a/docs/ru-RU/handbook/multi-keyword-filter/index.md b/docs/ru-RU/handbook/multi-keyword-filter/index.md new file mode 100644 index 0000000000..ea4923908e --- /dev/null +++ b/docs/ru-RU/handbook/multi-keyword-filter/index.md @@ -0,0 +1,99 @@ +### **Фильтрация по нескольким ключевым словам** + +#### **Введение** +Плагин «Фильтрация по нескольким ключевым словам» добавляет в платформу NocoBase мощную функцию текстовой фильтрации, позволяя использовать несколько ключевых слов для фильтрации данных в полях с однострочным текстом. Это значительно повышает гибкость и эффективность поиска данных. + +Плагин предоставляет для полей с однострочным текстом два дополнительных оператора фильтрации: +- **Совпадает с любым из**: отображает записи, содержащие любое из указанных ключевых слов. +- **Не совпадает ни с одним из**: отображает записи, которые не содержат ни одного из указанных ключевых слов. + +--- + +#### **Сценарии использования** +- Фильтрация по нескольким кодам продуктов, меткам или категориям. +- Массовая фильтрация по большому количеству ключевых слов, импортированных из Excel-файла. +- Быстрый поиск записей, соответствующих нескольким условиям. + +--- + +#### **Область применения** +Плагин поддерживается в следующих компонентах: +- Поля с однострочным текстом в **блоках формы фильтрации** + ![Пример](https://static-docs.nocobase.com/20250417170714.png) +- Поля с однострочным текстом в **кнопках фильтрации** + ![Пример](https://static-docs.nocobase.com/20250417170923.png) +- Поля с однострочным текстом в **фильтрах диапазона данных** + ![Пример](https://static-docs.nocobase.com/20250417171011.png) +- Поля с однострочным текстом в **правилах связывания** + ![Пример](https://static-docs.nocobase.com/20250417171124.png) + +--- + +#### **Как использовать** + +**1. Добавьте поле с однострочным текстом** +Например, в форме фильтрации установите для поля оператор фильтрации «**Совпадает с любым из**» или «**Не совпадает ни с одним из**». +![Анимация](https://static-docs.nocobase.com/20250417165918_rec_.gif) + +**2. Введите ключевые слова** +Существует два способа ввода ключевых слов: + +**2.1 Ввод вручную** +- Введите ключевые слова непосредственно в поле ввода. +- Несколько слов можно разделять запятыми, переносами строк или китайскими запятыми (,). +- После ввода нажмите кнопку фильтрации, чтобы выполнить поиск. + +**2.2 Импорт из Excel** +- Подготовьте Excel-файл (поддерживаются форматы `.xlsx` или `.xls`) с ключевыми словами. +- Нажмите кнопку **«Импортировать из Excel»** справа от поля ввода. +- Выберите и загрузите файл. + - Если в Excel только один столбец: + Система автоматически импортирует все непустые значения из этого столбца. + - Если в Excel несколько столбцов: + Откроется диалог выбора столбцов. + - Вы можете выбрать один или несколько столбцов для импорта. + - При выборе одного столбца: все непустые значения из него будут добавлены как ключевые слова. + - При выборе нескольких столбцов: значения из всех выбранных столбцов будут объединены, дубликаты автоматически удалены. +- Нажмите **«Подтвердить»**, чтобы завершить импорт. + ![Анимация](https://static-docs.nocobase.com/20250417170324_rec_.gif) + +**3. Результат фильтрации** +- **Совпадает с любым из**: отображаются записи, в которых значение поля совпадает хотя бы с одним из ключевых слов. +- **Не совпадает ни с одним из**: отображаются записи, в которых значение поля не совпадает ни с одним из ключевых слов. + +--- + +#### **Часто задаваемые вопросы** + +**Как удалить уже добавленные ключевые слова?** +- Нажмите крестик (×) на метке ключевого слова, чтобы удалить одно слово. +- Или нажмите крестик (×) справа от поля ввода, чтобы удалить все ключевые слова сразу. + ![Пример](https://static-docs.nocobase.com/20250417165604.png) + +**Сколько ключевых слов можно импортировать?** +Плагин поддерживает импорт большого количества ключевых слов, но рекомендуется ограничивать их разумным числом (например, несколько сотен), чтобы не снижать производительность запросов. + +**Какие требования к формату импортируемых ключевых слов?** +- Excel-файл должен содержать хотя бы один столбец с данными. +- Пустые значения автоматически игнорируются. +- Дубликаты удаляются автоматически. + +**Поддерживается ли нечёткое (приблизительное) совпадение?** +Нет, данный плагин обеспечивает **только точное совпадение**. + +--- + +#### **Советы и рекомендации** +- Сохраняйте часто используемые списки ключевых слов в Excel-файле для быстрого импорта. +- При импорте из нескольких столбцов можно объединять ключевые слова из разных источников. +- Используйте оператор **«Не совпадает ни с одним из»**, чтобы быстро исключить ненужные данные. + +--- + +#### **Системные требования** +- Версия NocoBase: **1.7.0-beta.18 или выше** + +--- + +Благодаря плагину «Фильтрация по нескольким ключевым словам» вы сможете эффективнее управлять и анализировать данные, особенно при работе с большими объёмами информации и частыми многокритериальными фильтрами. Этот инструмент значительно повысит вашу производительность! + diff --git a/docs/ru-RU/handbook/notification-email/index.md b/docs/ru-RU/handbook/notification-email/index.md new file mode 100644 index 0000000000..5d96b2ad1b --- /dev/null +++ b/docs/ru-RU/handbook/notification-email/index.md @@ -0,0 +1,25 @@ +# Уведомления по email + +<PluginInfo name="notification-email"></PluginInfo> + +## Введение + +Отправка уведомлений через email-канал, в настоящее время поддерживается только метод передачи через SMTP. + +## Установка + +Это встроенный плагин, который необходимо активировать перед использованием. + +![20240928192940](https://static-docs.nocobase.com/20240928192940.png) + +## Руководство пользователя + +### Настройка email-канала + +В настоящее время поддерживается только метод передачи через SMTP. + +![20240928191819](https://static-docs.nocobase.com/20240928191819.png) + +### Настройка уведомлений в рабочих процессах + +![20240928191935](https://static-docs.nocobase.com/20240928191935.png) diff --git a/docs/ru-RU/handbook/notification-in-app-message/index.md b/docs/ru-RU/handbook/notification-in-app-message/index.md new file mode 100644 index 0000000000..cdb95d7bce --- /dev/null +++ b/docs/ru-RU/handbook/notification-in-app-message/index.md @@ -0,0 +1,43 @@ +### **Уведомления: Внутриприкладное сообщение (In-App Message)** + +<PluginInfo name="notification-in-app-message"></PluginInfo> + +#### **Введение** + +Плагин позволяет пользователям получать уведомления в виде сообщений непосредственно внутри приложения NocoBase в режиме реального времени. + +#### **Установка** + +Этот плагин предустановлен, дополнительная настройка не требуется. + +#### **Добавление канала внутриприкладных сообщений** + +Перейдите в раздел управления уведомлениями, нажмите кнопку добавления и выберите «Внутриприкладное сообщение». +![2024-11-08-08-33-26-20241108083326](https://static-docs.nocobase.com/2024-11-08-08-33-26-20241108083326.png) + +Заполните имя канала и описание, затем нажмите «Отправить». +![2024-11-08-08-34-32-20241108083431](https://static-docs.nocobase.com/2024-11-08-08-34-32-20241108083431.png) + +Новый канал появится в списке. +![2024-11-08-08-34-52-20241108083452](https://static-docs.nocobase.com/2024-11-08-08-34-52-20241108083452.png) + +#### **Пример использования** + +Чтобы наглядно продемонстрировать, как работает внутриприкладное сообщение, рассмотрим пример сценария «Сопровождение маркетинговых лидов». + +Представьте, что ваша команда запускает крупную маркетинговую кампанию, целью которой является отслеживание откликов и потребностей потенциальных клиентов. Используя внутриприкладные сообщения, вы можете: + +**Создать канал уведомлений:** Сначала создайте канал с названием «Маркетинговые лиды» в разделе управления уведомлениями — это поможет членам команды быстро понять его назначение. +![2024-11-08-08-34-32-20241108083431](https://static-docs.nocobase.com/2024-11-08-08-34-32-20241108083431.png) + +**Настроить рабочий процесс:** Создайте рабочий процесс, который автоматически запускает уведомления при появлении нового лида. Добавьте в этот процесс узел «Уведомление», выберите канал «Маркетинговые лиды» и настройте текст сообщения в соответствии с целями кампании. Например: +![image-1-2024-10-27-14-07-17](https://static-docs.nocobase.com/image-1-2024-10-27-14-07-17.png) + +**Получать уведомления в реальном времени:** Как только рабочий процесс будет запущен, все соответствующие участники команды немедленно получат уведомления, что позволит оперативно реагировать. + +![image-2-2024-10-27-14-07-22](https://static-docs.nocobase.com/image-2-2024-10-27-14-07-22.png) + +**Управление и отслеживание сообщений:** Внутриприкладные сообщения группируются по названию канала. Вы можете фильтровать их по статусу «прочитано» или «непрочитано», чтобы определить приоритеты. Нажатие на «Просмотр» перенаправляет по заранее настроенной ссылке, что позволяет эффективно управлять задачами. + +![20241027140648-2024-10-27-14-06-51-2024-10-29-13-26-41](https://static-docs.nocobase.com/20241027140648-2024-10-27-14-06-51-2024-10-29-13-26-41.png) + diff --git a/docs/ru-RU/handbook/notification-manager/development/api.md b/docs/ru-RU/handbook/notification-manager/development/api.md new file mode 100644 index 0000000000..6707a4e4f6 --- /dev/null +++ b/docs/ru-RU/handbook/notification-manager/development/api.md @@ -0,0 +1,134 @@ +# API (Программный интерфейс) + +## Серверная часть + +### `BaseNotificationChannel` + +Абстрактный класс, представляющий базовый шаблон для различных типов каналов уведомлений. Определяет основные интерфейсы для реализации каналов. Для добавления нового канала уведомлений необходимо наследовать этот класс и реализовать его методы. + +```ts +export abstract class BaseNotificationChannel<Message = any> { + constructor(protected app: Application) {} + abstract send(params: { + channel: ChannelOptions; + message: Message; + }): Promise<{ message: Message; status: 'success' | 'fail'; reason?: string }>; +} +``` + +### `PluginNotificationManagerServer` + +Серверный плагин для управления уведомлениями. Предоставляет методы для регистрации типов каналов уведомлений и отправки уведомлений. + +#### `registerChannelType()` + +Регистрирует новый тип канала на серверной стороне. Пример использования: + +```ts +import PluginNotificationManagerServer from '@nocobase/plugin-notification-manager'; +import { Plugin } from '@nocobase/server'; +import { ExampleServer } from './example-server'; +export class PluginNotificationExampleServer extends Plugin { + async load() { + const notificationServer = this.pm.get(PluginNotificationManagerServer) as PluginNotificationManagerServer; + notificationServer.registerChannelType({ type: 'example-sms', Channel: ExampleServer }); + } +} + +export default PluginNotificationExampleServer; +``` + +##### Сигнатура + +`registerChannelType({ type, Channel }: {type: string, Channel: BaseNotificationChannel })` + +#### `send()` + +Метод для отправки уведомлений через указанный канал. + +```ts +send('in-app-message', + message: [ + receivers: [1, 2, 3], + receiverType: 'userId', + content: 'Тестовое сообщение в приложении', + title: 'Заголовок тестового сообщения' + ], + triggerFrom: 'workflow') + +send('email', + message: [ + receivers: ['a@163.com', 'b@163.com'], + receiverType: 'email', + content: 'Тестовое email-сообщение', + title: 'Заголовок тестового email' + ], + triggerFrom: 'workflow') +``` + +##### Сигнатура + +`send(sendConfig: {channelName: String, message: Object, receivers: ReceiversType, triggerFrom: String })` + +Поле `receivers` поддерживает два формата: +- ID пользователей NocoBase (`userId`) +- Пользовательские конфигурации каналов (`channel-self-defined`) + +```ts +type ReceiversType = + | { value: number[]; type: 'userId' } + | { value: any; type: 'channel-self-defined'; channelType: string }; +``` + +##### Подробная информация + +`sendConfig` + +| Свойство | Тип | Описание | +| -------------- | ---------------- | ---------------------- | +| `channelName` | `string` | Идентификатор канала | +| `message` | `object` | Объект сообщения | +| `receivers` | `ReceiversType` | Получатели | +| `triggerFrom` | `string` | Источник триггера | + +## Клиентская часть + +### `PluginNotificationManagerClient` + +#### `channelTypes` + +Библиотека зарегистрированных типов каналов. + +##### Сигнатура + +`channelTypes: Registry<registerTypeOptions>` + +#### `registerChannelType()` + +Регистрирует тип канала на клиентской стороне. + +##### Сигнатура + +`registerChannelType(params: registerTypeOptions)` + +##### Типы + +```ts +type registerTypeOptions = { + title: string; // Отображаемое название канала + type: string; // Идентификатор канала + components: { + ChannelConfigForm?: ComponentType // Компонент формы конфигурации канала; + MessageConfigForm?: ComponentType<{ variableOptions: any }> // Компонент формы конфигурации сообщения; + ContentConfigForm?: ComponentType<{ variableOptions: any }> // Компонент формы конфигурации контента (только для содержимого сообщения, без конфигурации получателей); + }; + meta?: { // Метаданные конфигурации канала + createable?: boolean // Возможность создания новых каналов; + editable?: boolean // Возможность редактирования конфигурации канала; + deletable?: boolean // Возможность удаления конфигурации канала; + }; +}; + +type RegisterChannelType = (params: ChannelType) => void +``` + diff --git a/docs/ru-RU/handbook/notification-manager/development/extension.md b/docs/ru-RU/handbook/notification-manager/development/extension.md new file mode 100644 index 0000000000..6cb7b43ed6 --- /dev/null +++ b/docs/ru-RU/handbook/notification-manager/development/extension.md @@ -0,0 +1,286 @@ +# Расширение возможностей + +NocoBase поддерживает расширение типов каналов уведомлений, включая SMS-уведомления, push-уведомления в приложениях и другие. + +## Клиентская часть + +### Регистрация типа канала + +Интерфейс настройки канала и сообщения регистрируется через метод `registerChannelType`, предоставляемый клиентским плагином управления уведомлениями: + +```ts +import PluginNotificationManagerClient from '@nocobase/plugin-notification-manager/client'; + +class PluginNotificationExampleClient extends Plugin { + async afterAdd() {} + + async beforeLoad() {} + + async load() { + const notification = this.pm.get(PluginNotificationManagerClient); + notification.registerChannelType({ + title: 'Пример SMS', // Название типа канала + type: 'example-sms', // Идентификатор типа канала + components: { + ChannelConfigForm, // Форма настройки канала + MessageConfigForm, // Форма настройки сообщения + }, + }); + } +} + +export default PluginNotificationExampleClient; +``` + +## Серверная часть + +### Расширение абстрактного класса + +Основная задача серверной разработки - наследование от абстрактного класса `BaseNotificationChannel` и реализация метода `send`, содержащего бизнес-логику отправки уведомлений: + +```ts +import { BaseNotificationChannel } from '@nocobase/plugin-notification-manager'; + +export class ExampleServer extends BaseNotificationChannel { + async send(args): Promise<any> { + console.log('ExampleServer send', args); + return { status: 'success', message: args.message }; + } +} +``` + +### Регистрация на сервере + +Для регистрации серверного класса необходимо вызвать метод `registerChannelType`: + +```ts +import PluginNotificationManagerServer from '@nocobase/plugin-notification-manager'; +import { Plugin } from '@nocobase/server'; +import { ExampleServer } from './example-server'; +export class PluginNotificationExampleServer extends Plugin { + async load() { + const notificationServer = this.pm.get(PluginNotificationManagerServer) as PluginNotificationManagerServer; + notificationServer.registerChannelType({ type: 'example-sms', Channel: ExampleServer }); + } +} + +export default PluginNotificationExampleServer; +``` + +## Полный пример + +Рассмотрим пример расширения для добавления SMS-уведомлений через SMS-шлюз платформы. + +### Создание плагина + +1. Выполните команду для создания плагина: `yarn pm add @nocobase/plugin-notification-example` + +### Разработка клиентской части + +Необходимо создать два компонента: +- `ChannelConfigForm` - форма настройки канала +- `MessageConfigForm` - форма настройки сообщения + +#### ChannelConfigForm + +Для работы с SMS требуется API-ключ и секретный ключ. Создайте файл `ChannelConfigForm.tsx` в директории `src/client`: + +```ts +import React from 'react'; +import { SchemaComponent } from '@nocobase/client'; +import useLocalTranslation from './useLocalTranslation'; + +const ChannelConfigForm = () => { + const t = useLocalTranslation(); + return ( + <SchemaComponent + scope={{ t }} + schema={{ + type: 'object', + properties: { + apiKey: { + 'x-decorator': 'FormItem', + type: 'string', + title: '{{t("Transport")}}', + 'x-component': 'Input', + }, + secret: { + 'x-decorator': 'FormItem', + type: 'string', + title: '{{t("Transport")}}', + 'x-component': 'Input', + }, + }, + }} + /> + ); +}; + +export default ChannelConfigForm; +``` + +# Форма настройки сообщений + +Форма настройки сообщения включает конфигурацию получателей (`receivers`) и содержимого сообщения (`content`). Создайте файл `MessageConfigForm.tsx` в директории `src/client`: + +```ts +import React from 'react'; +import { SchemaComponent } from '@nocobase/client'; +import useLocalTranslation from './useLocalTranslation'; + +const MessageConfigForm = ({ variableOptions }) => { + const { t } = useLocalTranslation(); + return ( + <SchemaComponent + scope={{ t }} + schema={{ + type: 'object', + properties: { + to: { + type: 'array', + required: true, + title: `{{t("Получатели")}}`, + 'x-decorator': 'FormItem', + 'x-component': 'ArrayItems', + items: { + type: 'void', + 'x-component': 'Space', + properties: { + sort: { + type: 'void', + 'x-decorator': 'FormItem', + 'x-component': 'ArrayItems.SortHandle', + }, + input: { + type: 'string', + 'x-decorator': 'FormItem', + 'x-component': 'Variable.Input', + 'x-component-props': { + scope: variableOptions, + useTypedConstant: ['string'], + placeholder: `{{t("Номер телефона")}}`, + }, + }, + remove: { + type: 'void', + 'x-decorator': 'FormItem', + 'x-component': 'ArrayItems.Remove', + }, + }, + }, + properties: { + add: { + type: 'void', + title: `{{t("Добавить номер телефона")}}`, + 'x-component': 'ArrayItems.Addition', + }, + }, + }, + content: { + type: 'string', + required: true, + title: `{{t("Содержимое")}}`, + 'x-decorator': 'FormItem', + 'x-component': 'Variable.RawTextArea', + 'x-component-props': { + scope: variableOptions, + placeholder: 'Привет,', + autoSize: { + minRows: 10, + }, + }, + }, + }, + }} + /> + ); +}; + +export default MessageConfigForm +``` + +## Регистрация клиентских компонентов + +После разработки компонентов форм зарегистрируем их в ядре управления уведомлениями. Предположим, название платформы - "Пример". Редактируем `src/client/index.tsx`: + +```ts +import { Plugin } from '@nocobase/client'; +import PluginNotificationManagerClient from '@nocobase/plugin-notification-manager/client'; +import { tval } from '@nocobase/utils/client'; +import ChannelConfigForm from './ChannelConfigForm'; +import MessageConfigForm from './MessageConfigForm'; + +class PluginNotificationExampleClient extends Plugin { + async afterAdd() {} + + async beforeLoad() {} + + async load() { + const notification = this.pm.get(PluginNotificationManagerClient); + notification.registerChannelType({ + title: tval('Пример SMS', { ns: '@nocobase/plugin-notification-example' }), + type: 'example-sms', + components: { + ChannelConfigForm, + MessageConfigForm, + }, + }); + } +} + +export default PluginNotificationExampleClient; +``` + +На этом клиентская часть разработки завершена. + +## Серверная разработка + +Основная задача серверной части - расширить абстрактный класс `BaseNotificationChannel` и реализовать метод `send`. В директории `src/server` создаем файл `example-server.ts`: + +```ts +import { BaseNotificationChannel } from '@nocobase/plugin-notification-manager'; + +export class ExampleServer extends BaseNotificationChannel { + async send(args): Promise<any> { + console.log('ExampleServer send', args); + return { status: 'success', message: args.message }; + } +} +``` + +Затем регистрируем серверный плагин, редактируя `src/server/plugin.ts`: + +```ts +import PluginNotificationManagerServer from '@nocobase/plugin-notification-manager'; +import { Plugin } from '@nocobase/server'; +import { ExampleServer } from './example-server'; +export class PluginNotificationExampleServer extends Plugin { + async load() { + const notificationServer = this.pm.get(PluginNotificationManagerServer) as PluginNotificationManagerServer; + notificationServer.registerChannelType({ type: 'example-sms', Channel: ExampleServer }); + } +} + +export default PluginNotificationExampleServer; +``` + +## Регистрация и запуск плагина + +1. Выполните команду регистрации: `yarn pm add @nocobase/plugin-notification-example` +2. Активируйте плагин: `yarn pm enable @nocobase/plugin-notification-example` + +## Настройка канала + +На странице управления каналами уведомлений вы увидите, что канал `Пример SMS` активирован. +![20241009164207-2024-10-09-16-42-08](https://static-docs.nocobase.com/20241009164207-2024-10-09-16-42-08.png) + +Добавьте тестовый канал. +![20250418074409-2025-04-18-07-44-09](https://static-docs.nocobase.com/20250418074409-2025-04-18-07-44-09.png) + +Создайте новый workflow и настройте узел уведомлений. +![20250418074832-2025-04-18-07-48-32](https://static-docs.nocobase.com/20250418074832-2025-04-18-07-48-32.png) + +При запуске workflow в консоли будет выведена следующая информация. +![20250418081746-2025-04-18-08-17-48](https://static-docs.nocobase.com/20250418081746-2025-04-18-08-17-48.png) + + diff --git a/docs/ru-RU/handbook/notification-manager/index.md b/docs/ru-RU/handbook/notification-manager/index.md new file mode 100644 index 0000000000..e6bc8623cd --- /dev/null +++ b/docs/ru-RU/handbook/notification-manager/index.md @@ -0,0 +1,37 @@ +### **Менеджер уведомлений** + +<PluginInfo name="notification-manager"></PluginInfo> + +#### **Введение** + +Менеджер уведомлений — это централизованная служба, интегрирующая различные каналы уведомлений и предоставляющая единый интерфейс для настройки каналов, управления уведомлениями и ведения журнала событий. Он также отличается высокой гибкостью и поддерживает расширение за счёт добавления дополнительных каналов. + +![20240928112556](https://static-docs.nocobase.com/20240928112556.png) + +- **Фиолетовая область**: Менеджер уведомлений предоставляет комплексный сервис, включающий настройку каналов и запись логов, а также возможность подключения дополнительных каналов уведомлений. +- **Зелёная область**: «Внутриприкладное сообщение» — встроенный канал, позволяющий пользователям получать уведомления непосредственно внутри приложения. +- **Красная область**: «Электронная почта» — расширяемый канал, позволяющий пользователям получать уведомления по email (встроена поддержка протокола SMTP). + +#### **Управление каналами** + +![20240928181752](https://static-docs.nocobase.com/20240928181752.png) + +Поддерживаемые в настоящее время каналы: + +- [Внутриприкладное сообщение](/handbook/notification-in-app-message) +- [Электронная почта](/handbook/notification-email) (встроенный протокол SMTP) + +Для подключения дополнительных каналов обратитесь к документации по [расширению каналов](./extension). + +#### **Журналы уведомлений** + +Система записывает подробную информацию о каждом уведомлении, включая его статус. Это удобный инструмент для анализа и диагностики проблем. + +![20240928181649](https://static-docs.nocobase.com/20240928181649.png) + +#### **Узел уведомления в рабочем процессе** + +![20240928181726](https://static-docs.nocobase.com/20240928181726.png) + +Узел уведомления в рабочем процессе позволяет отправлять уведомления через настроенные каналы при выполнении определённых условий. Вы можете выбрать нужный канал, настроить содержание сообщения и указать получателей. + diff --git a/docs/ru-RU/handbook/password-policy/index.md b/docs/ru-RU/handbook/password-policy/index.md new file mode 100644 index 0000000000..b32ef926ff --- /dev/null +++ b/docs/ru-RU/handbook/password-policy/index.md @@ -0,0 +1,96 @@ +# Политика паролей + +<PluginInfo licenseBundled="true" name="password-policy"></PluginInfo> + +## Введение + +Настройка правил для паролей, срока их действия и политики безопасности при входе для всех пользователей, а также управление заблокированными учетными записями. + +## Правила паролей + +![](https://static-docs.nocobase.com/202412281329313.png) + +### Минимальная длина пароля + +Установите минимальное требование к длине пароля (максимальная длина - 64 символа). + +### Требования к сложности пароля + +Доступны следующие варианты: + +- Должен содержать буквы и цифры +- Должен содержать буквы, цифры и символы +- Должен содержать цифры, заглавные и строчные буквы +- Должен содержать цифры, заглавные и строчные буквы, а также символы +- Должен содержать как минимум 3 из 4: цифры, заглавные буквы, строчные буквы и специальные символы +- Без ограничений + +![](https://static-docs.nocobase.com/202412281331649.png) + +### Пароль не должен содержать имя пользователя + +Определите, может ли пароль содержать имя текущего пользователя. + +### История паролей + +Запомните количество последних использованных паролей пользователя. При смене пароля пользователь не сможет повторно использовать эти пароли. 0 означает отсутствие ограничений (максимальное значение - 24). + +## Настройка срока действия пароля + +![](https://static-docs.nocobase.com/202412281335588.png) + +### Срок действия пароля + +Период, в течение которого пароль пользователя остается действительным. После истечения срока действия администратор должен сбросить пароль, прежде чем пользователь сможет войти с его помощью. Если настроены другие методы входа, пользователь может использовать их. + +### Канал уведомлений об истечении срока действия пароля + +В течение 10 дней до истечения срока действия пароля пользователю будет приходить напоминание при каждом входе. По умолчанию напоминание отправляется через внутренний канал сообщений "Напоминание об истечении срока действия пароля", которым можно управлять в разделе уведомлений. + +### Рекомендации по настройке + +Поскольку истечение срока действия пароля может привести к невозможности входа (включая учетные записи администраторов), рекомендуется своевременно менять пароли и создавать в системе несколько учетных записей с правами изменения паролей пользователей. + +## Безопасность входа по паролю + +Установите ограничения на количество неудачных попыток входа. + +![](https://static-docs.nocobase.com/202412281339724.png) + +### Максимальное количество неудачных попыток входа + +Установите максимальное количество попыток входа, которые пользователь может совершить в течение указанного интервала времени. + +### Интервал времени для подсчета попыток (в секундах) + +Установите временной интервал (в секундах) для расчета максимального количества неудачных попыток входа. + +### Время блокировки (в секундах) + +Установите продолжительность блокировки пользователя после превышения лимита неудачных попыток входа (0 означает отсутствие ограничений). В течение периода блокировки пользователю запрещен доступ к системе через любые методы аутентификации, включая API-ключи. Для ручной разблокировки см. [Блокировка пользователей](./user-lockout.md). + +### Сценарии использования + +#### Без ограничений + +Нет ограничений на количество неудачных попыток входа. + +![](https://static-docs.nocobase.com/202412281343226.png) + +#### Ограничение частоты попыток без блокировки + +Пример: пользователь может пытаться войти не более 5 раз в течение 5 минут. + +![](https://static-docs.nocobase.com/202412281344412.png) + +#### Блокировка после превышения лимита + +Пример: если пользователь совершает 5 последовательных неудачных попыток входа в течение 5 минут, учетная запись блокируется на 2 часа. + +![](https://static-docs.nocobase.com/202412281344952.png) + +### Рекомендации по настройке + +- Ограничение количества попыток входа и временного интервала обычно используется для защиты от brute-force атак (подбора пароля). +- Решение о блокировке пользователя должно приниматься с учетом реальных сценариев использования. Злоумышленники могут намеренно вводить неверные пароли для целевой учетной записи, вызывая ее блокировку. Для защиты используйте комбинацию с ограничениями по IP и лимитами API-запросов. +- Поскольку блокировка учетной записи ограничивает доступ к системе (включая учетные записи администраторов), рекомендуется создать несколько учетных записей с правами разблокировки пользователей. diff --git a/docs/ru-RU/handbook/password-policy/user-lockout.md b/docs/ru-RU/handbook/password-policy/user-lockout.md new file mode 100644 index 0000000000..3f599d6a2e --- /dev/null +++ b/docs/ru-RU/handbook/password-policy/user-lockout.md @@ -0,0 +1,19 @@ +### **Блокировка пользователей** + +<PluginInfo licenseBundled="true" name="password-policy"></PluginInfo> + +#### **Введение** + +Позволяет управлять заблокированными пользователями, а также вручную блокировать пользователей. + +![](https://static-docs.nocobase.com/202412281450083.png) + +#### **Разблокировка пользователя** + +Пользователи, заблокированные из-за превышения количества попыток входа с неправильным паролем, могут быть разблокированы путём удаления соответствующей записи. + +#### **Блокировка пользователя** + +Добавление записи пользователя позволяет вручную заблокировать его. После блокировки пользователь не сможет получить доступ к системе ни одним способом, включая использование API-ключей. + +![](https://static-docs.nocobase.com/202412281450512.png) diff --git a/docs/ru-RU/handbook/plugin-manager/index.md b/docs/ru-RU/handbook/plugin-manager/index.md new file mode 100644 index 0000000000..9d5cadbd8d --- /dev/null +++ b/docs/ru-RU/handbook/plugin-manager/index.md @@ -0,0 +1,16 @@ +# Управление плагинами + +<PluginInfo name="plugin-manager"></PluginInfo> + + +## Менеджер плагинов + +Нажав на значок менеджера плагинов в правом верхнем углу, вы можете перейти на страницу менеджера плагинов. Здесь вы можете просматривать, устанавливать, включать и отключать плагины. + +![2024-04-10_08-47-45](https://static-docs.nocobase.com/2024-04-10_08-47-45.png) + +## Центр настроек плагинов + +Плагины обычно поставляются со своей собственной страницей настроек. Нажав на значок настроек в правом верхнем углу, вы можете увидеть меню всех страниц настроек плагина. Нажав на соответствующее меню, вы можете установить соответствующий плагин. + +![2024-04-10_08-52-41](https://static-docs.nocobase.com/2024-04-10_08-52-41.png) diff --git a/docs/ru-RU/handbook/public-forms/index.md b/docs/ru-RU/handbook/public-forms/index.md new file mode 100644 index 0000000000..b6526f3524 --- /dev/null +++ b/docs/ru-RU/handbook/public-forms/index.md @@ -0,0 +1,43 @@ +# Публичные формы + +<PluginInfo name="public-forms"></PluginInfo> + +## Введение + +Функционал для публикации форм сбора информации, доступных для заполнения анонимными пользователями. + +## Установка + +Это предустановленный плагин, который требует активации перед использованием. + +![20241028150028](https://static-docs.nocobase.com/20241028150028.png) + +## Инструкция по использованию + +### Список публичных форм + +![20241028150853](https://static-docs.nocobase.com/20241028150853.png) + +### Создание публичной формы + +![20241028150937](https://static-docs.nocobase.com/20241028150937.png) + +### Настройка формы + +![20241028151223](https://static-docs.nocobase.com/20241028151223.png) + +### Параметры публичной формы + +![20241028151353](https://static-docs.nocobase.com/20241028151353.png) + +### Просмотр публичной формы + +![20241028151415](https://static-docs.nocobase.com/20241028151415.png) + +### Защита паролем + +![20241028151438](https://static-docs.nocobase.com/20241028151438.png) + +### Уведомление об успешной отправке + +![20241028152554](https://static-docs.nocobase.com/20241028152554.png) diff --git a/docs/ru-RU/handbook/release-management/index.md b/docs/ru-RU/handbook/release-management/index.md new file mode 100644 index 0000000000..aa003d5bf2 --- /dev/null +++ b/docs/ru-RU/handbook/release-management/index.md @@ -0,0 +1,52 @@ +### Управление выпусками + +#### Введение + +На практике для обеспечения безопасности данных и стабильности приложения обычно используются несколько сред, например, среда разработки, промежуточная среда (предрелизная) и производственная среда. В этом документе приведены примеры двух распространённых процессов низко- и безкодовой разработки, а также подробно описано, как реализовать управление выпусками в NocoBase. + +#### Установка + +Для управления выпусками необходимы три плагина. Убедитесь, что все следующие плагины активированы. + +##### Переменные окружения + +- Встроенный плагин, по умолчанию установлен и активирован. +- Обеспечивает централизованную настройку и управление переменными окружения и ключами, используется для хранения конфиденциальных данных, повторно используемых конфигурационных параметров, изоляции по средам и т.д. ([Просмотреть документацию](environment-variables)). + +##### Менеджер резервного копирования + +- Доступен только в Professional-версии и выше ([Подробнее](https://www.nocobase.com/en/commercial)). +- Поддерживает создание резервных копий и восстановление, включая расписание резервного копирования, обеспечивая безопасность данных и быстрое восстановление. ([Просмотреть документацию](/handbook/backups)). + +##### Менеджер миграций + +- Доступен только в Professional-версии и выше ([Подробнее](https://www.nocobase.com/en/commercial)). +- Используется для переноса конфигураций приложения из одной среды в другую ([Просмотреть документацию](/handbook/migration-manager)). + +#### Распространённые процессы безкодовой разработки + +##### Одна среда разработки, односторонний выпуск + +Этот подход подходит для простых процессов разработки. Используются одна среда разработки, одна предрелизная среда и одна производственная среда. Изменения передаются из среды разработки в предрелизную среду, а затем развертываются в производственной среде. В этом процессе конфигурации можно изменять только в среде разработки — в предрелизной и производственной средах изменения запрещены. + +![20250106234710](https://static-docs.nocobase.com/20250106234710.png) + +При настройке правил миграции, при необходимости, выберите **«Перезаписать»** для встроенных таблиц в ядре и плагинах; для всех остальных можно оставить настройки по умолчанию, если нет особых требований. + +![20250105194845](https://static-docs.nocobase.com/20250105194845.png) + +##### Несколько сред разработки, объединённый выпуск + +Этот подход подходит для командной разработки или сложных проектов. Несколько параллельных сред разработки могут использоваться независимо, а все изменения объединяются в одну предрелизную среду для тестирования и проверки, после чего развертываются в производственной среде. В этом процессе конфигурации можно изменять только в средах разработки — в предрелизной и производственной средах изменения запрещены. + +![20250107103829](https://static-docs.nocobase.com/20250107103829.png) + +При настройке правил миграции, при необходимости, выберите **«Вставить или обновить»** для встроенных таблиц в ядре и плагинах; для всех остальных можно оставить настройки по умолчанию, если нет особых требований. + +![20250105194942](https://static-docs.nocobase.com/20250105194942.png) + +#### Откат изменений + +Перед выполнением миграции система автоматически создаёт резервную копию текущего приложения. Если миграция завершилась с ошибкой или результат не соответствует ожиданиям, вы можете выполнить откат и восстановление с помощью [Менеджера резервного копирования](/handbook/backups). + +![20250105195029](https://static-docs.nocobase.com/20250105195029.png) diff --git a/docs/ru-RU/handbook/routes/index.md b/docs/ru-RU/handbook/routes/index.md new file mode 100644 index 0000000000..964fd5ff0f --- /dev/null +++ b/docs/ru-RU/handbook/routes/index.md @@ -0,0 +1,59 @@ +# Маршрутизация + +<PluginInfo name="client"></PluginInfo> + +## Введение + +Менеджер маршрутов - это инструмент для управления путями главной страницы системы, поддерживающий конечные точки `desktop` и `mobile`. Созданные маршруты автоматически синхронизируются с меню (можно настроить скрытие в меню). Аналогично, пункты меню, добавленные через интерфейс меню, также отображаются в списке маршрутов. + +![20250107115449](https://static-docs.nocobase.com/20250107115449.png) + +## Руководство пользователя + +### Типы маршрутов + +Система поддерживает четыре типа маршрутов: + +- Группа (group): Для группировки маршрутов, может содержать подмаршруты +- Страница (page): Внутренняя страница системы +- Вкладка (tab): Для переключения между вкладками на странице +- Ссылка (link): Внутренняя или внешняя ссылка для прямого перехода + +### Добавление маршрута + +Нажмите кнопку "Добавить" в правом верхнем углу: + +1. Выберите тип маршрута (Type) +2. Укажите название (Title) +3. Выберите иконку (Icon) +4. Настройте отображение в меню (Show in menu) +5. Включите/отключите вкладки страницы (Enable page tabs) +6. Для типа "страница" система автоматически генерирует уникальный путь (Path) + +![20250124131803](https://static-docs.nocobase.com/20250124131803.png) + +### Действия с маршрутами + +Для каждого маршрута доступны: + +- Добавить подмаршрут +- Редактировать конфигурацию +- Просмотреть страницу +- Удалить маршрут + +### Групповые операции + +Панель инструментов предоставляет: + +- Обновить список +- Удалить выбранное +- Скрыть в меню +- Показать в меню + +### Фильтрация + +Используйте фильтр в верхней части для поиска нужных маршрутов. + +:::info{title=Важно} +Изменения маршрутов напрямую влияют на структуру навигационного меню. Проверяйте корректность настроек перед сохранением. +::: diff --git a/docs/ru-RU/handbook/security.md b/docs/ru-RU/handbook/security.md new file mode 100644 index 0000000000..c56d0b6436 --- /dev/null +++ b/docs/ru-RU/handbook/security.md @@ -0,0 +1,239 @@ +# Руководство по безопасности NocoBase + +NocoBase уделяет внимание безопасности данных и приложений на всех этапах, от функционального дизайна до реализации системы. Платформа имеет встроенные многочисленные функции безопасности, такие как аутентификация пользователей, управление доступом и шифрование данных, а также позволяет гибко настраивать политики безопасности в соответствии с реальными потребностями. Будь то защита пользовательских данных, управление правами доступа или изоляция сред разработки и производства, NocoBase предлагает практические инструменты и решения. Это руководство предназначено для обеспечения безопасного использования NocoBase, помогая пользователям защищать безопасность данных, приложений и окружения, гарантируя эффективное использование системных функций при соблюдении безопасности пользователей. + +## Аутентификация пользователей + +Аутентификация пользователей используется для идентификации пользовательских учетных записей, предотвращения несанкционированного доступа к системе и защиты от злоупотребления пользовательскими учетными записями. + +### Политика токенов + +По умолчанию NocoBase использует JWT (JSON Web Token) для аутентификации серверных API и поддерживает настройку следующих политик токенов: + +| Параметр Конфигурации | Описание | +|----------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Срок действия сессии | Максимальное время действия каждой сессии пользователя. В течение срока действия сессии токен будет автоматически обновляться. По истечении времени действия пользователь должен войти снова. | +| Срок действия токена |Срок действия каждого выпущенного API-токена. По истечении срока действия токена, если он находится в пределах срока действия сессии и не превышает лимит обновления, сервер автоматически выдаст новый токен для поддержания сессии пользователя, в противном случае пользователь должен войти снова. (Каждый токен может быть обновлен только один раз) | +| Лимит обновления истекшего токена | Максимальное время, в течение которого допускается обновление токена после его истечения. | + +Обычно мы рекомендуем администраторам: + +- Установить более короткий срок действия токена, чтобы ограничить время его экспозиции. +- Установить разумный срок действия сессии, который будет длиннее срока действия токена, но не слишком длинным, чтобы сбалансировать удобство пользователя и безопасность. Используйте механизм автоматического обновления токена, чтобы гарантировать, что активные сессии пользователей не прерываются, одновременно снижая риск злоупотребления долгосрочными сессиями. +- Установить разумный лимит обновления истекшего токена, чтобы токен естественным образом истекал, когда пользователь длительное время неактивен, без выпуска нового токена, снижая риск злоупотребления неактивными сессиями пользователей. + +### Хранение токенов на клиенте + +По умолчанию токены пользователей хранятся в LocalStorage браузера. После закрытия страницы браузера и повторного открытия, если токен все еще действителен, пользователь не должен входить снова. + +Если вы хотите, чтобы пользователи каждый раз входили при открытии страницы, вы можете установить переменную окружения `API_CLIENT_STORAGE_TYPE=sessionStorage`, чтобы сохранять токен пользователя в SessionStorage браузера, тем самым достигая цели повторного входа пользователя при каждом открытии страницы. + +### Политика паролей + +> Профессиональная версия и выше + +NocoBase supports setting password rules and password login attempt lock policies for all users to enhance the security of NocoBase applications that have password login enabled. You can refer to [Password Policy](./password-policy/index.md) to understand each configuration item. + +#### Правила паролей + +| Параметр Конфигурации | Описание | +|----------------------------------------|--------------------------------------------------------------------------------------------------------------------| +| **Минимальная длина пароля** | Минимальная длина пароля, максимальная длина — 64. | +| **Сложность пароля** | Установка требований к сложности пароля, типы символов, которые должны быть включены. | +| **Запрет включения имени пользователя в пароле** | Установка, может ли пароль включать имя текущего пользователя. | +| **Помнить историю паролей** | Количество недавно использованных паролей, которые помнит пользователь. Пользователь не может повторно использовать их при изменении пароля. | + +#### Настройка срока действия пароля + +| Параметр конфигурации | Описание | +|-------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| **Срок действия пароля** | Срок действия паролей пользователей. Пользователи должны изменить свои пароли до истечения срока действия, чтобы пересчитать его. Если они не изменят свои пароли до истечения срока действия, они не смогут войти с использованием старого пароля и потребуется помощь администратора для сброса. <br>Если настроены другие способы входа, пользователи могут войти с использованием других методов.| +| **Канал уведомлений о приближающемся истечении срока действия пароля** | За 10 дней до истечения срока действия пароля пользователя будет отправляться уведомление при каждом входе пользователя. | + +#### Безопасность входа по паролю + +| Параметр конфишурации | Описание | +|------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| **Максимальное количество попыток входа с неверным паролем** | Установка максимального количества попыток входа пользователя в указанном временном интервале. | +| **Максимальный временной интервал попыток входа с неверным паролем (секунды)** | Установка временного интервала для расчета максимального количества неудачных попыток входа пользователя, в секундах. | +| **Время блокировки (секунды)** | Установка времени блокировки пользователя после превышения лимита неудачных попыток входа (0 означает отсутствие лимита). <br>В период блокировки пользователь не сможет получить доступ к системе ни через один метод аутентификации, включая API-ключи. | + +Обычно мы рекомендуем: + +- Установить сильные правила паролей, чтобы снизить риск угадывания паролей по ассоциации или перебором. +- Установить разумный срок действия пароля, чтобы принудительно заставлять пользователей регулярно менять пароли. +- Комбинировать количество неудачных попыток входа и временные настройки, чтобы ограничивать частые попытки входа в короткий промежуток времени и предотвращать перебор паролей. +- При строгих требованиях к безопасности можно установить разумное время блокировки пользователя после превышения лимита входа. Однако следует отметить, что настройка времени блокировки может быть злонамеренно использована. Атакующие могут намеренно вводить неверный пароль несколько раз для целевых аккаунтов, заставляя их блокироваться и становиться недоступными для нормального использования. В реальной эксплуатации можно комбинировать ограничения по IP, ограничения частоты API и другие средства для предотвращения таких атак. +- Изменить стандартное имя пользователя, адрес электронной почты и пароль NocoBase, чтобы предотвратить их злонамеренное использование. +- Поскольку как истечение срока действия пароля, так и блокировка аккаунта могут препятствовать доступу к системе, включая аккаунты администраторов, рекомендуется настроить несколько аккаунтов в системе, имеющих права сброса паролей и разблокировки пользователей. + +![](https://static-docs.nocobase.com/202501031618900.png) + +### Блокировка пользователей + +> Профессиональная версия и выше, включена в плагин политики паролей + +Управление пользователями, заблокированными за превышение лимита неудачных попыток входа. Можно активно разблокировать их или активно добавлять аномальных пользователей в список заблокированных. После блокировки пользователь будет запрещен от доступа к системе через любой метод аутентификации, включая API-ключи. + +![](https://static-docs.nocobase.com/202501031618399.png) + +### Единый вход (SSO) + +> Коммерческий плагин + +NocoBase предоставляет богатый набор плагинов аутентификации SSO, поддерживающих множество основных протоколов, таких как OIDC, SAML 2.0, LDAP и CAS. Одновременно NocoBase имеет полный набор интерфейсов расширения методов аутентификации, что позволяет быстро разрабатывать и подключать другие типы аутентификации. Вы можете легко подключить свой существующий IdP к NocoBase для централизованного управления пользовательскими учетными записями на IdP, повышая безопасность. +![](https://static-docs.nocobase.com/202501031619427.png) + +### Двухфакторная аутентификация + +> Корпоративная версия + +Двухфакторная аутентификация требует от пользователей предоставления второй части действительной информации для подтверждения своей личности при входе с использованием пароля, например, отправки одноразового динамического кода верификации на доверенное устройство пользователя, чтобы подтвердить личность пользователя и гарантировать, что она не будет злоупотреблена, что снижает риск утечки паролей. + +### Контроль доступа по IP + +> Корпоративная версия + + +- В условиях строгой безопасности можно настроить белый список IP-адресов, чтобы разрешить доступ только определенным IP-адресам или диапазонам IP-адресов, ограничивая несанкционированные внешние сетевые подключения и снижая риски безопасности на уровне источника. +- При доступе через публичную сеть, если администратор обнаруживает аномальный доступ, можно настроить черный список IP-адресов, чтобы блокировать известные злонамеренные IP-адреса или доступы из подозрительных источников, снижая угрозы, такие как злонамеренное сканирование и перебор паролей. +- Ведутся журналы записей для отклоненных запросов на доступ. + +## Управление доступом + +Настройка различных ролей в системе и назначение соответствующих прав доступа для ролей позволяет детально контролировать права доступа пользователей к ресурсам. Администраторы должны настраивать разумно в соответствии с потребностями реальных сценариев, чтобы снизить риск утечки системных ресурсов. + +### Роли и права доступа + +NocoBase контролирует права доступа пользователей к ресурсам путем настройки ролей в системе, авторизации различных ролей и привязки пользователей к соответствующим ролям. Каждый пользователь может иметь несколько ролей, и пользователи могут переключаться между ролями для работы с ресурсами с разных точек зрения. Если установлен плагин департаментов, можно также привязывать роли и департаменты, чтобы пользователи имели роли, привязанные к своим департаментам. + +![](https://static-docs.nocobase.com/202501031620965.png) + +### Права доступа к системной конфигурации + +Права доступа к системной конфигурации включают следующие настройки: + +- Разрешить интерфейс конфигурации +- Разрешить установку, включение и отключение плагинов +- Разрешить настройку плагинов +- Разрешить очистку кэша и перезапуск приложения +- Права доступа для каждого плагина + +### Права доступа к меню + +Права доступа к меню используются для контроля доступа пользователей к различным страницам меню, включая рабочий стол и мобильную версию. +![](https://static-docs.nocobase.com/202501031620717.png) + +### Права доступа к данным + +NocoBase обеспечивает детальный контроль над разрешениями пользователей на доступ к данным в системе, гарантируя, что разные пользователи могут получать доступ только к данным, связанным с их обязанностями, предотвращая злоупотребление полномочиями и утечку данных. + +#### Глобальный контроль + +![](https://static-docs.nocobase.com/202501031620866.png) + +#### Контроль на уровне таблиц и полей + +![](https://static-docs.nocobase.com/202501031621047.png) + +#### Контроль области данных + +Установите объем данных, с которыми могут работать пользователи. Обратите внимание, что объем данных здесь отличается от объема данных, настроенных в блоке. Объем данных, настроенный в блоке, обычно используется только для внешней фильтрации данных. Если вам необходимо строго контролировать разрешение пользователей на доступ к ресурсам данных, вам необходимо настроить его здесь, который контролируется сервером. +![](https://static-docs.nocobase.com/202501031621712.png) + +## Безопасность данных + +В процессе хранения и резервного копирования данных NocoBase предоставляет эффективный механизм для обеспечения безопасности данных. + +### Хранение паролей + +Пароли пользователей NocoBase шифруются и хранятся с использованием алгоритма scrypt, что эффективно противодействует массовым аппаратным атакам. + +### Переменные окружения и ключи + +При использовании сторонних сервисов в NocoBase мы рекомендуем настраивать информацию о сторонних ключах в переменные окружения и хранить их в зашифрованном виде. Это удобно для настройки и использования в разных местах и повышает безопасность. Подробнее о методах использования можно узнать в документации. + + +По умолчанию ключ шифруется с использованием алгоритма AES-256-CBC. NocoBase автоматически генерирует 32-битный ключ шифрования и сохраняет его в storage/.data/environment/aes_key.dat. Пользователи должны должным образом хранить файл ключа, чтобы предотвратить его кражу. Если вам нужно перенести данные, файл ключа также должен быть перенесен вместе с данными. + +![](https://static-docs.nocobase.com/202501031622612.png) + +### Хранение файлов + +Если вам нужно хранить конфиденциальные файлы, рекомендуется использовать облачное хранилище, совместимое с протоколом S3, и использовать коммерческий плагин Хранение файлов: S3 (Pro) для включения приватного чтения и записи файлов. Если вам нужно использовать его в локальной сети, рекомендуется использовать приложения для хранения, поддерживающие приватную установку и совместимые с протоколом S3, такие как MinIO. +![](https://static-docs.nocobase.com/202501031623549.png) + +### Резервное копирование приложения + +Для обеспечения безопасности данных приложения и предотвращения потери данных мы рекомендуем регулярно резервировать базу данных. + +Открытая версия может использовать инструменты базы данных для резервного копирования, подробнее см. на сайте: https://www.nocobase.com/en/blog/nocobase-backup-restore . Мы также рекомендуем хранить файлы резервных копий в безопасном месте, чтобы предотвратить утечку данных. + +Профессиональные и выше версии могут использовать менеджер резервного копирования для резервного копирования. Менеджер резервного копирования предоставляет следующие функции: + +- Автоматическое резервное копирование по расписанию: периодическое автоматическое резервное копирование экономит время и сокращает объем ручных операций, а безопасность данных становится более надежной. +- Синхронизация файлов резервных копий с облачным хранилищем: Изоляция файлов резервных копий от самого приложения, чтобы предотвратить потерю файлов резервных копий при недоступности службы из-за сбоев сервера. +- Шифрование файлов резервных копий: Установка пароля для файлов резервных копий, чтобы снизить риск потери данных при утечке файлов резервных копий. + +![](https://static-docs.nocobase.com/202501031623107.png) + +## Безопасность среды выполнения + +Правильная установка NocoBase и обеспечение безопасности среды выполнения являются одним из ключевых факторов для обеспечения безопасности приложений NocoBase. + +### Установка HTTPS + +Для предотвращения атак "man-in-the-middle attacks" мы рекомендуем добавить SSL/TLS-сертификат на ваш сайт приложения NocoBase, чтобы обеспечить безопасность данных при передаче через сеть. + +### Транспортное шифрование API + +> Корпоративная версия + +В средах с более строгими требованиями к безопасности данных NocoBase поддерживает включение транспортного шифрования API для шифрования содержимого запросов и ответов API, предотвращения передачи открытого текста и увеличения порога взлома данных. + +### Локальное развертывание + +По умолчанию NocoBase не требует связи со сторонними сервисами, и команда NocoBase не собирает никакую информацию пользователей. Соединение с сервером NocoBase требуется только при выполнении следующих двух операций: + +1. Автоматическая загрузка коммерческих плагинов через платформу сервисов NocoBase. +2. Онлайн-верификация и активация приложения для коммерческой версии. + +Если вы готовы пожертвовать некоторым уровнем удобства, эти две операции также поддерживают выполнение в автономном режиме и не требуют прямого подключения к серверу NocoBase. + +NocoBase поддерживает полную установку в локальной сети, подробнее в: +- https://www.nocobase.com/en/blog/load-docker-image +- [Upload plugins to the plugin directory to install and upgrade](../welcome/getting-started/plugin#installing-and-updating-plugins-via-plugin-directory-upload) + + ### Изоляция нескольких сред + +> Профессиональная версия и выше + +В реальной эксплуатации мы рекомендуем предприятиям изолировать тестовые и производственные среды для обеспечения безопасности данных приложения и среды выполнения в производственной среде. С помощью плагина управления миграциями можно мигрировать данные приложения между разными средами. + +![](https://static-docs.nocobase.com/202501031627729.png) + +## Аудит и мониторинг + +### Журналы аудита + +> Корпоративная версия + +Функция журнала аудита NocoBase записывает активность пользователей в системе. Записывая ключевые операции и поведение доступа пользователей, администраторы могут: + +- Проверять информацию о доступе пользователей, такие как IP-адрес, устройство и время операции, для своевременного обнаружения аномального поведения. +- Отслеживать историю операций с ресурсами данных в системе. + +![](https://static-docs.nocobase.com/202501031627719.png) + +![](https://static-docs.nocobase.com/202501031627922.png) + +### Журналы приложения + +NocoBase предоставляет несколько типов журналов, чтобы помочь пользователям понимать состояние работы системы и записи поведения, что позволяет своевременно идентифицировать и локализовать проблемы системы, обеспечивая ее безопасность и управляемость с разных сторон. Основные типы журналов включают: + +- Журнал запросов: Журналы API -запросов, включая посещенные URL, методы HTTP, параметры запроса, время ответа и коды состояния. +- Журнал системы: Записи событий работы приложения, включая запуск службы, изменения конфигурации, сообщения об ошибках и ключевые операции. +- Журнал SQL: Записи операций базы данных и их времени выполнения, включая операции запроса, обновления, вставки и удаления. +- Журнал рабочего процесса: журнал выполнения рабочего процесса, включая время выполнения, информацию о выполнении и информацию об ошибках. +- + diff --git a/docs/ru-RU/handbook/system-settings/index.md b/docs/ru-RU/handbook/system-settings/index.md new file mode 100644 index 0000000000..52f85f8f13 --- /dev/null +++ b/docs/ru-RU/handbook/system-settings/index.md @@ -0,0 +1,10 @@ +# Системные настройки + +<PluginInfo name="system-settings"></PluginInfo> + +## Введение +Для настройки общей информации о системе, такой как название системы, основной логотип, включенный язык и т.д. + +## Руководство пользователя + +![20240324191444](https://static-docs.nocobase.com/20240324191444.png) diff --git a/docs/ru-RU/handbook/system-settings/language-settings.md b/docs/ru-RU/handbook/system-settings/language-settings.md new file mode 100644 index 0000000000..07888ffdb2 --- /dev/null +++ b/docs/ru-RU/handbook/system-settings/language-settings.md @@ -0,0 +1,15 @@ +# Языковые настройки + +<PluginInfo name="system-settings"></PluginInfo> + +В "Системных настройках", установив "Включенные языки", вы можете настроить глобальную языковую среду системы, при этом по умолчанию используется первый язык. + +![20240324192005](https://static-docs.nocobase.com/20240324192005.png) + +Если включено несколько языков, пользователи могут настроить свои языковые предпочтения в личном кабинете пользователя (в правом верхнем углу). + +![20240324192509](https://static-docs.nocobase.com/20240324192509.png) + +Если языковая среда, которую вы используете, не переведена, вы можете использовать плагин "[Localization Management](/handbook/localization-management)" для выполнения переводов. + +![20240324193055](https://static-docs.nocobase.com/20240324193055.png) diff --git a/docs/ru-RU/handbook/telemetry-prometheus/index.md b/docs/ru-RU/handbook/telemetry-prometheus/index.md new file mode 100644 index 0000000000..946a8c53fe --- /dev/null +++ b/docs/ru-RU/handbook/telemetry-prometheus/index.md @@ -0,0 +1,71 @@ +# Телеметрия - Prometheus + +<PluginInfo name="telemetry-prometheus"></PluginInfo> + +## Введение + +Этот плагин преобразует данные в формате OpenTelemetry Protocol (OTLP) в формат Prometheus и предоставляет интерфейс для сбора метрик Prometheus. + +## Установка + +:::info{title=Примечание} +Это коммерческий плагин. Подробности см. на странице [Коммерческая версия NocoBase](https://www.nocobase.com/commercial). +::: + +## Руководство пользователя + +### Переменные окружения + +Перед запуском NocoBase необходимо настроить следующие переменные окружения: + +#### TELEMETRY_ENABLED + +Установите значение `on`. + +```bash +TELEMETRY_ENABLED=on +``` + +#### TELEMETRY_METRIC_READER + +Добавьте `prometheus`. + +```bash +TELEMETRY_METRIC_READER=prometheus +``` + +#### TELEMETRY_PROMETHEUS_SERVER + +Определяет, запускать ли отдельный сервер: + +- `off` - интерфейс сбора метрик будет доступен по `/api/prometheus:metrics` +- `on` - интерфейс сбора метрик будет доступен по `:port/metrics` + +#### TELEMETRY_PROMETHEUS_PORT + +Порт для отдельного сервера (если активирован). По умолчанию `9464`. + +#### Связанные документы + +- [Переменные окружения](../../welcome/getting-started/env.md#telemetry_enabled) + +### Конфигурация Prometheus + +Для отдельного сервера: + +```yaml +scrape_configs: + - job_name: 'nocobase' + static_configs: + - targets: ['localhost:9464'] +``` + +Для внутреннего API: + +```yaml +scrape_configs: + - job_name: 'nocobase' + metrics_path: '/api/prometheus:metrics' + static_configs: + - targets: ['localhost:13001'] +``` diff --git a/docs/ru-RU/handbook/template-handlebars/index.md b/docs/ru-RU/handbook/template-handlebars/index.md new file mode 100644 index 0000000000..b99d70e9d5 --- /dev/null +++ b/docs/ru-RU/handbook/template-handlebars/index.md @@ -0,0 +1,155 @@ +### **Шаблоны Handlebars** + +#### **Введение** + +Handlebars — это популярный шаблонизатор, который позволяет динамически вставлять данные в HTML с помощью простого синтаксиса шаблонов. + +#### **Использование** + +##### **Базовый синтаксис шаблонов** + +В Handlebars основной синтаксис включает: + +- Выражение подстановки `{{variable}}` — для вывода данных. +- Условное выражение `{{#if condition}}...{{/if}}` — для логических условий. +- Цикл `{{#each array}}...{{/each}}` — для перебора массивов. + +Например, при наличии следующих данных: + +```js +const context = { + title: "Пример шаблона Handlebars", + items: ["Яблоко", "Банан", "Апельсин"] +}; +``` + +И шаблона: + +```html +<h1>{{title}}</h1> +<ul> + {{#each items}} + <li>{{this}}</li> + {{/each}} +</ul> +``` + +Будет сгенерирован следующий HTML: + +```html +<h1>Пример шаблона Handlebars</h1> +<ul> + <li>Яблоко</li> + <li>Банан</li> + <li>Апельсин</li> +</ul> +``` + +Более подробную информацию можно найти в разделе: +[Основные функции](/api/handlebars-helpers/core) + +--- + +#### **Операции сравнения** + +Вы можете использовать операторы сравнения в условных выражениях. Поддерживаются следующие функции: +`eq` (равно), `ne` (не равно), `gt` (больше), `lt` (меньше) и другие. + +Пример: + +```handlebars +{{#if (eq 10 10)}} + <p>Равно</p> +{{else}} + <p>Не равно</p> +{{/if}} +``` + +Также доступны логические операторы `and`, `or`, `not`: + +```handlebars +{{#if (and true true)}} + <p>Оба значения истинны!</p> +{{/if}} + +{{#if (or false true)}} + <p>Хотя бы одно значение истинно!</p> +{{/if}} +``` + +Более подробно см. в разделе: +[Сравнение](/api/handlebars-helpers/comparison) + +--- + +#### **Математические операции** + +В шаблонах можно выполнять простые математические операции: + +```handlebars +{{add 4 5}} <!-- Результат: 9 --> +{{minus 10 3}} <!-- Результат: 7 --> +``` + +Подробнее см. в разделе: +[Математика](/api/handlebars-helpers/math) + +--- + +#### **Работа со строками** + +```handlebars +{{uppercase "hello world"}} +<!-- Результат: HELLO WORLD --> + +{{ellipsis "foo bar baz" 7}} +<!-- Результат: foo bar… --> +``` + +Подробнее см. в разделе: +[Строки](/api/handlebars-helpers/string) + +--- + +#### **Работа с датами** + +```handlebars +<p>{{dateFormat "2024-09-25" "YYYY"}}</p> <!-- Результат: 2024 --> +``` + +Подробнее см. в разделе: +[Даты](/api/handlebars-helpers/date) + +--- + +#### **Операции с массивами и объектами** + +```handlebars +<p>Первый элемент: {{first items}}</p> <!-- Результат: Первый элемент: Яблоко --> +<p>Последний элемент: {{last items}}</p> <!-- Результат: Последний элемент: Апельсин --> +``` + +Подробнее см. в разделах: +[Массивы](/api/handlebars-helpers/array) +[Объекты](/api/handlebars-helpers/object) + +--- + +#### **Дополнительные вспомогательные функции (Helpers)** + +| Категория | Описание | +|---------------|---------| +| **Core** | Встроенные методы Handlebars | +| **Array** | Методы для работы с массивами | +| **Comparison**| Операторы и методы сравнения | +| **Date** | Методы для работы с датами и временем | +| **HTML** | Методы для обработки HTML-документов | +| **I18n** | Поддержка интернационализации | +| **Math** | Математические функции | +| **Number** | Форматирование и обработка чисел | +| **Object** | Методы для работы с объектами | +| **Path** | Методы для работы с путями и файловой системой | +| **Regex** | Методы для работы с регулярными выражениями | +| **String** | Методы для обработки строк | +| **URL** | Методы для разбора и построения URL | + diff --git a/docs/ru-RU/handbook/template-json/index.md b/docs/ru-RU/handbook/template-json/index.md new file mode 100644 index 0000000000..94da20fb9f --- /dev/null +++ b/docs/ru-RU/handbook/template-json/index.md @@ -0,0 +1,57 @@ +### **JSON-шаблон** + +#### **Введение** + +В JSON-шаблоне переменные представляются в виде строк и должны быть заключены в двойные кавычки, например: `{{xxxx}}`. В процессе разбора (парсинга) значение каждой переменной преобразуется в соответствующий тип данных в зависимости от её фактического содержимого. Таким образом, хотя сама переменная в шаблоне является строкой, итоговое значение после разбора может быть любого типа — строкой, числом, объектом, массивом, `null` или `undefined`. + +#### **Пример** + +Дан следующий JSON-шаблон: + +```json +{ + "key1": "{{current.key1}}", + "key2": "{{current.key2}}", + "key3": "{{current.key3}}", + "key4": "{{current.key4}}", + "key5": "{{current.key5}}", + "key6": "{{current.key6}}", + "key7": { + "key1": "{{current.key1}}", + "key2": "{{current.key2}}" + }, + "key8": ["{{current.key1}}", "{{current.key3}}"], + "key9": "{{current.key1}} - \"{{current.key3}}\" - {{current.key3}} - val9" +} +``` + +Имеются следующие текущие значения переменных: + +```json +{ + "key1": "val1", + "key2": null, + "key3": 3, + "key4": {"k": "v"}, + "key5": [1, 2, 3], + "key6": undefined +} +``` + +Результат парсинга будет следующим: + +```json +{ + "key1": "val1", + "key2": null, + "key3": 3, + "key4": {"k": "v"}, + "key5": [1, 2, 3], + "key7": { + "key1": "val1", + "key2": null + }, + "key8": ["val1", 3], + "key9": "val1 - \"3\" - 3 - val9" +} +``` diff --git a/docs/ru-RU/handbook/template-string/index.md b/docs/ru-RU/handbook/template-string/index.md new file mode 100644 index 0000000000..15f4f0728d --- /dev/null +++ b/docs/ru-RU/handbook/template-string/index.md @@ -0,0 +1,2 @@ +# Строковый шаблон + diff --git a/docs/ru-RU/handbook/theme-editor/index.md b/docs/ru-RU/handbook/theme-editor/index.md new file mode 100644 index 0000000000..806edc0655 --- /dev/null +++ b/docs/ru-RU/handbook/theme-editor/index.md @@ -0,0 +1,72 @@ +# Редактор тем + +> Примечание: Текущая функциональность тем реализована на основе antd 5.x версии. Рекомендуется ознакомиться с концепцией [Настройки темы](https://ant.design/docs/react/customize-theme#%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-%D1%82%D0%B5%D0%BC%D1%8B) перед изучением этого документа. + +## Введение + +Этот плагин представляет собой инструмент для изменения стилей всего интерфейса. В текущей версии поддерживается редактирование глобальных параметров [SeedToken](https://ant.design/docs/react/customize-theme#seedtoken), [MapToken](https://ant.design/docs/react/customize-theme#maptoken) и [AliasToken](https://ant.design/docs/react/customize-theme#aliastoken), а также включение [темной](https://ant.design/docs/react/customize-theme#%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BF%D1%80%D0%B5%D0%B4%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D1%85-%D1%82%D0%B5%D0%BC) темы и компактного режима. В будущих версиях планируется поддержка [настройки тем на уровне компонентов](https://ant.design/docs/react/customize-theme#%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-%D0%BA%D0%BE%D0%BC%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%82%D0%BE%D0%B2). + +## Инструкция по использованию + +### Активация плагина тем + +1. Обновите NocoBase до последней версии (v0.11.1 или выше) +2. Найдите карточку "Редактор тем" в разделе "Управление плагинами" +3. Нажмите кнопку "Активировать" в правом нижнем углу карточки +4. Дождитесь обновления страницы + +![20240409132838](https://static-docs.nocobase.com/20240409132838.png) + +### Переход на страницу настройки тем + +После активации нажмите кнопку настроек в левом нижнем углу карточки. Вы перейдете на страницу редактирования тем. По умолчанию доступно четыре варианта: "Стандартная тема", "Темная тема", "Компактная тема" и "Компактная темная тема". + +![20240409133020](https://static-docs.nocobase.com/20240409133020.png) + +## Добавление новой темы + +1. Нажмите кнопку "Добавить новую тему" +2. Выберите "Создать полностью новую тему" +3. В правой части страницы откроется редактор тем, где можно настроить цвета, размеры, стили и другие параметры +4. Введите название темы и нажмите "Сохранить" + +![20240409133147](https://static-docs.nocobase.com/20240409133147.png) + +## Применение новой темы + +Наведите курсор в правый верхний угол страницы, чтобы увидеть переключатель тем. Выберите новую тему из списка. + +![20240409133247](https://static-docs.nocobase.com/20240409133247.png) + +## Редактирование существующей темы + +1. Нажмите кнопку "Редактировать" в левом нижнем углу карточки темы +2. В правой части откроется редактор для внесения изменений +3. Нажмите "Сохранить" для применения изменений + +![20240409134413](https://static-docs.nocobase.com/20240409134413.png) + +## Настройка доступности тем для пользователей + +Новые темы по умолчанию доступны для выбора пользователями. Чтобы скрыть тему из списка выбора: + +1. Найдите нужную тему +2. Отключите переключатель "Доступна для выбора" в правом нижнем углу карточки + +![20240409133331](https://static-docs.nocobase.com/20240409133331.png) + +## Установка темы по умолчанию + +1. Найдите нужную тему +2. Включите переключатель "Тема по умолчанию" в правом нижнем углу карточки + +Примечание: Стандартная тема не может быть удалена. + +![20240409133409](https://static-docs.nocobase.com/20240409133409.png) + +## Удаление темы + +1. Нажмите кнопку "Удалить" под карточкой темы +2. Подтвердите действие во всплывающем окне + +![20240409133435](https://static-docs.nocobase.com/20240409133435.png) diff --git a/docs/ru-RU/handbook/token-policy/index.md b/docs/ru-RU/handbook/token-policy/index.md new file mode 100644 index 0000000000..19840e5728 --- /dev/null +++ b/docs/ru-RU/handbook/token-policy/index.md @@ -0,0 +1,72 @@ +### **Политика токенов** + +<PluginInfo name="auth"></PluginInfo> + +#### **Введение** + +Политика безопасности токенов — это функциональная настройка, предназначенная для повышения безопасности системы и улучшения пользовательского опыта. Она включает три основных параметра: «Срок действия сессии», «Срок действия токена» и «Лимит времени на обновление просроченного токена». + +#### **Место настройки** + +Параметры находятся в разделе: Настройки плагина → Безопасность → Политика токенов: + +![20250105111821-2025-01-05-11-18-24](https://static-docs.nocobase.com/20250105111821-2025-01-05-11-18-24.png) + +--- + +#### **Срок действия сессии** + +**Определение:** + +Срок действия сессии — это максимальный период времени, в течение которого система позволяет пользователю оставаться в активной сессии после входа в систему. + +**Функция:** + +Если срок действия сессии истёк, при следующем обращении к системе пользователь получит ответ с кодом ошибки 401 и будет перенаправлен на страницу входа для повторной аутентификации. + +**Пример:** + +Если срок действия сессии установлен в 8 часов, то сессия завершится через 8 часов после входа пользователя, при условии, что не было дополнительных действий. + +**Рекомендуемые настройки:** + +- Для кратковременных операций: рекомендуется 1–2 часа — для повышения безопасности. +- Для длительной работы: можно установить 8 часов, чтобы соответствовать рабочим потребностям. + +--- + +#### **Срок действия токена** + +**Определение:** + +Срок действия токена — это период жизни каждого токена, выданного системой в течение активной сессии пользователя. + +**Функция:** + +Когда токен истекает, система автоматически выдаёт новый токен, чтобы поддерживать сессию активной. +Каждый просроченный токен можно обновить только один раз. + +**Рекомендуемые настройки:** + +Из соображений безопасности рекомендуется устанавливать значение от 15 до 30 минут. +Настройку можно корректировать в зависимости от сценария использования: + +- Высокая безопасность: срок действия токена можно сократить до 10 минут или менее. +- Низкий уровень риска: срок действия можно увеличить до 1 часа. + +--- + +#### **Лимит времени на обновление просроченного токена** + +**Определение:** + +Лимит времени на обновление просроченного токена — это максимальный временной интервал, в течение которого пользователь может получить новый токен с помощью операции обновления после истечения срока действия текущего токена. + +**Особенности:** + +- Если лимит времени превышен, пользователь должен войти в систему заново, чтобы получить новый токен. +- Операция обновления **не продлевает** срок действия сессии — она лишь генерирует новый токен. + +**Рекомендуемые настройки:** + +Для обеспечения безопасности рекомендуется устанавливать значение от 5 до 10 минут. diff --git a/docs/ru-RU/handbook/two-factor-authentication/index.md b/docs/ru-RU/handbook/two-factor-authentication/index.md new file mode 100644 index 0000000000..ad6535b2a9 --- /dev/null +++ b/docs/ru-RU/handbook/two-factor-authentication/index.md @@ -0,0 +1,47 @@ +# Аутентификация: Двухфакторная аутентификация (2FA) + +<PluginInfo name="two-factor-authentication" licenseBundled="true"></PluginInfo> + +## Введение + +Двухфакторная аутентификация (2FA) - это дополнительная мера безопасности при входе в приложение. При включенной 2FA пользователям требуется предоставить дополнительную форму аутентификации (например, OTP-код, TOTP и т.д.) помимо пароля. + +:::info{title=Примечание} +В текущей версии 2FA применяется только для входа по паролю. Если в вашем приложении включен SSO или другие методы аутентификации, используйте многофакторную аутентификацию (MFA), предоставляемую соответствующим IdP. +::: + +## Активация плагина + +![](https://static-docs.nocobase.com/202502282108145.png) + +## Настройка администратором + +После активации плагина на странице управления аутентификаторами появится подраздел для настройки 2FA. + +Администратор должен: +1. Включить опцию "Обязательная двухфакторная аутентификация для всех пользователей" +2. Выбрать доступный тип аутентификатора для привязки + +Если доступные аутентификаторы отсутствуют, сначала создайте их на странице управления верификацией (см. [Верификация](../verification/index.md)). + +![](https://static-docs.nocobase.com/202502282109802.png) + +## Процесс входа пользователя + +После включения 2FA при входе по паролю пользователь проходит дополнительную проверку: + +1. Если аутентификатор не привязан: + - Система предложит привязать доступный аутентификатор + - После успешной привязки доступ в приложение будет разрешен + +![](https://static-docs.nocobase.com/202502282110829.png) + +2. Если аутентификатор уже привязан: + - Потребуется подтвердить личность с помощью привязанного аутентификатора + - После успешной проверки доступ будет разрешен + +![](https://static-docs.nocobase.com/202502282110148.png) + +После входа пользователь может привязать дополнительные аутентификаторы в личном кабинете. + +![](https://static-docs.nocobase.com/202502282110024.png) diff --git a/docs/ru-RU/handbook/ui-schema-storage/index.md b/docs/ru-RU/handbook/ui-schema-storage/index.md new file mode 100644 index 0000000000..602a953ee7 --- /dev/null +++ b/docs/ru-RU/handbook/ui-schema-storage/index.md @@ -0,0 +1,12 @@ +# Хранилище схем пользовательского интерфейса + +:::предупреждение +Документ находится на рассмотрении. +::: + +<!-- +## Введение + +## Установка + +## Инструкции --> diff --git a/docs/ru-RU/handbook/ui/actions/action-settings/affter-successful.md b/docs/ru-RU/handbook/ui/actions/action-settings/affter-successful.md new file mode 100644 index 0000000000..a5cb5f90e4 --- /dev/null +++ b/docs/ru-RU/handbook/ui/actions/action-settings/affter-successful.md @@ -0,0 +1,33 @@ +# Действия после успешной отправки формы + +## Введение + +Функционал "После успешной отправки" позволяет настроить поведение системы после завершения операции. Вы можете: + +- Настраивать кастомные сообщения об успехе +- Выбирать автоматическое или ручное закрытие уведомлений +- Определять дальнейшее поведение: + - Остаться на текущей странице/попапе + - Вернуться на предыдущую страницу (по умолчанию) + - Перенаправить на указанный маршрут + +![20240413213519](https://static-docs.nocobase.com/20240413213519.png) +![20241012125623](https://static-docs.nocobase.com/20241012125623.png) + +### Варианты поведения: + +1. **Остаться на текущей странице/попапе** - после успешной операции окно/маршрут не закрывается +2. **Вернуться назад (по умолчанию)** - попап автоматически закрывается после успешной операции +3. **Перенаправление** - переход на указанный маршрут после успешного выполнения + +### Перенаправление на конкретный маршрут + +Кнопка "Отправить" поддерживает динамическую передачу переменных из ответа сервера для использования в перенаправлении. + +![20250405162542](https://static-docs.nocobase.com/20250405162542.png) + +Пример использования: +После успешного создания записи можно перенаправить пользователя на страницу деталей этой записи, передав ID созданной записи в URL. + +![20250405162732](https://static-docs.nocobase.com/20250405162732.png) + diff --git a/docs/ru-RU/handbook/ui/actions/action-settings/assign-values.md b/docs/ru-RU/handbook/ui/actions/action-settings/assign-values.md new file mode 100644 index 0000000000..33747a333a --- /dev/null +++ b/docs/ru-RU/handbook/ui/actions/action-settings/assign-values.md @@ -0,0 +1,31 @@ +### **Назначение значений полей** + +#### **Введение** + +Назначение значений полей позволяет предварительно задать значения для полей до выполнения операций. Эта функция обеспечивает автоматическое заполнение данных при создании или обновлении записей, устраняя необходимость ручного ввода. Типичные сценарии использования включают массовое обновление статусов заказов или автоматическую установку времени доставки на текущее время при подтверждении доставки заказа. + +![20240413103137](https://static-docs.nocobase.com/20240413103137.png) + +![20240413215221](https://static-docs.nocobase.com/20240413215221.png) + +#### **Инструкция по использованию** + +##### **Настройка полей** + +Настраивать можно только поля из текущей таблицы. + +![20240413103207](https://static-docs.nocobase.com/20240413103207.png) + +##### **Константы** + +Можно задать фиксированные значения (константы) для назначения. + +![20240426153323](https://static-docs.nocobase.com/20240426153323.png) + +##### **Переменные** + +Разные типы полей поддерживают различные типы переменных, что обеспечивает гибкость в зависимости от используемых данных. + +![20240426153534](https://static-docs.nocobase.com/20240426153534.png) + +Более подробную информацию о переменных см. в разделе [Переменные](/handbook/ui/variables). diff --git a/docs/ru-RU/handbook/ui/actions/action-settings/bind-workflow.md b/docs/ru-RU/handbook/ui/actions/action-settings/bind-workflow.md new file mode 100644 index 0000000000..7ad92bdb5e --- /dev/null +++ b/docs/ru-RU/handbook/ui/actions/action-settings/bind-workflow.md @@ -0,0 +1,17 @@ +### **Привязка рабочих процессов** + +#### **Введение** + +Привязка рабочего процесса — это мощный способ автоматизации обработки данных. Связывая операцию с рабочим процессом, вы обеспечиваете бесперебойное прохождение данных через бизнес-процессы. Важно отметить, что рабочие процессы запускаются только после успешной отправки данных; если операция завершается с ошибкой, рабочий процесс активирован не будет. + +![20240413095247](https://static-docs.nocobase.com/20240413095247.png) + +![20240413095309](https://static-docs.nocobase.com/20240413095309.png) + +Следующие кнопки операций в настоящее время поддерживают привязку к рабочим процессам: + +- Кнопки **«Отправить»** и **«Сохранить»** в формах создания записей. +- Кнопки **«Отправить»** и **«Сохранить»** в формах редактирования записей. +- Кнопка **«Обновить данные»** в строках данных (включая таблицы, списки, доски канбан и т.д.). + +Более подробную информацию см. в разделе [События после действий](/handbook/workflow-action-trigger) документации по рабочим процессам. diff --git a/docs/ru-RU/handbook/ui/actions/action-settings/double-check.md b/docs/ru-RU/handbook/ui/actions/action-settings/double-check.md new file mode 100644 index 0000000000..7ad92bdb5e --- /dev/null +++ b/docs/ru-RU/handbook/ui/actions/action-settings/double-check.md @@ -0,0 +1,17 @@ +### **Привязка рабочих процессов** + +#### **Введение** + +Привязка рабочего процесса — это мощный способ автоматизации обработки данных. Связывая операцию с рабочим процессом, вы обеспечиваете бесперебойное прохождение данных через бизнес-процессы. Важно отметить, что рабочие процессы запускаются только после успешной отправки данных; если операция завершается с ошибкой, рабочий процесс активирован не будет. + +![20240413095247](https://static-docs.nocobase.com/20240413095247.png) + +![20240413095309](https://static-docs.nocobase.com/20240413095309.png) + +Следующие кнопки операций в настоящее время поддерживают привязку к рабочим процессам: + +- Кнопки **«Отправить»** и **«Сохранить»** в формах создания записей. +- Кнопки **«Отправить»** и **«Сохранить»** в формах редактирования записей. +- Кнопка **«Обновить данные»** в строках данных (включая таблицы, списки, доски канбан и т.д.). + +Более подробную информацию см. в разделе [События после действий](/handbook/workflow-action-trigger) документации по рабочим процессам. diff --git a/docs/ru-RU/handbook/ui/actions/action-settings/edit-button.md b/docs/ru-RU/handbook/ui/actions/action-settings/edit-button.md new file mode 100644 index 0000000000..f5cbeeb1ff --- /dev/null +++ b/docs/ru-RU/handbook/ui/actions/action-settings/edit-button.md @@ -0,0 +1,9 @@ +# Кнопка редактирования + +## Введение + +Вы можете настроить название кнопки, ее значок и цвет фона. Вы можете выбрать один из трех вариантов цвета: по умолчанию, выделенный или красный. Если выбран значок, на кнопке может отображаться только значок. + +![20250405140611](https://static-docs.nocobase.com/20250405140611.png) + +![20250405140640](https://static-docs.nocobase.com/20250405140640.png) diff --git a/docs/ru-RU/handbook/ui/actions/action-settings/linkage-rule.md b/docs/ru-RU/handbook/ui/actions/action-settings/linkage-rule.md new file mode 100644 index 0000000000..2070ded5ae --- /dev/null +++ b/docs/ru-RU/handbook/ui/actions/action-settings/linkage-rule.md @@ -0,0 +1,52 @@ +# Правила связей действий + +## Введение + +Правила связей действий позволяют динамически управлять атрибутами действий (видимость, доступность, скрытие, отключение) на основе заданных условий. Начиная с версии `v1.7.0-beta.19` все кнопки поддерживают настройку правил связей. + +> **Примечание**: В текущей версии правила связей действий не поддерживают прямую привязку к значениям формы (проверка условий по полям текущей формы невозможна). Правила позволяют управлять действиями на основе контекстных данных или системных переменных. + +![20240423113057](https://static-docs.nocobase.com/20240423113057.png) + +## Инструкция по использованию + +![20250418152329](https://static-docs.nocobase.com/20250418152329.png) + +Действие срабатывает при выполнении условий (по умолчанию - без условий). В условиях можно использовать константы и переменные. + +## Константы + +Пример: Редактировать можно только заказы со статусом "В ожидании". + +![20250418150033](https://static-docs.nocobase.com/20250418150033.png) + +## Переменные + +### Системные переменные + +Пример 1: Отключить кнопку удаления для заказов с датой доставки позже текущего дня. + +![20250418145825](https://static-docs.nocobase.com/20250418145825.png) + +Пример 2: Кнопка массового удаления в заголовке таблицы заказов доступна только для роли администратора. + +![20250418150637](https://static-docs.nocobase.com/20250418150637.png) + +![20250418150826](https://static-docs.nocobase.com/20250418150826.png) + +### Контекстные переменные + +Пример: Кнопка "Добавить" в деталях заказа (ассоциативный блок) активна только при статусе заказа "Ожидает оплаты". + +![20250418145312](https://static-docs.nocobase.com/20250418145312.png) + +![20250418150429](https://static-docs.nocobase.com/20250418150429.png) + +Подробнее о переменных: [Переменные](/handbook/ui/variables) + +## Планы развития + +- В разработке: + - Поддержка правил связей для текущей формы + +Подробнее о правилах связей: [Правила связей](/handbook/ui/linkage-rule) diff --git a/docs/ru-RU/handbook/ui/actions/action-settings/open-mode.md b/docs/ru-RU/handbook/ui/actions/action-settings/open-mode.md new file mode 100644 index 0000000000..f1cfb0b41b --- /dev/null +++ b/docs/ru-RU/handbook/ui/actions/action-settings/open-mode.md @@ -0,0 +1,15 @@ +# Режим открытия + +## Введение + +Существует два способа открыть всплывающее окно: с помощью ящика или диалогового окна, при этом по умолчанию используется ящик. Ящики идеально подходят для управления большими объемами информации и выполнения сложных операций, в то время как диалоговые окна лучше подходят для простого содержимого или быстрых действий. Всплывающее окно можно закрыть, нажав на оверлей. + +![20240413102507](https://static-docs.nocobase.com/20240413102507.png) + +- ящик + +![20240423120702](https://static-docs.nocobase.com/20240423120702.png) + +- диалоговое окно + +![20240423120721](https://static-docs.nocobase.com/20240423120721.png) diff --git a/docs/ru-RU/handbook/ui/actions/action-settings/popup-size.md b/docs/ru-RU/handbook/ui/actions/action-settings/popup-size.md new file mode 100644 index 0000000000..3e46b2e47f --- /dev/null +++ b/docs/ru-RU/handbook/ui/actions/action-settings/popup-size.md @@ -0,0 +1,7 @@ +# Размер всплывающего окна + +## Введение + +Всплывающие окна доступны в трех размерах: Большом, среднем и маленьком, причем по умолчанию используется средний размер. Вы можете настроить размер всплывающего окна в соответствии с содержимым. + +![20240413102716](https://static-docs.nocobase.com/20240413102716.png) diff --git a/docs/ru-RU/handbook/ui/actions/index.md b/docs/ru-RU/handbook/ui/actions/index.md new file mode 100644 index 0000000000..a43c76eff8 --- /dev/null +++ b/docs/ru-RU/handbook/ui/actions/index.md @@ -0,0 +1,32 @@ +# Действия (Actions) + +## Описание + +В пользовательском интерфейсе Действия представлены кнопками, которые выполняют определенные команды. Эти кнопки могут быть размещены: + +- Непосредственно на страницах +- В диалоговых окнах +- В выдвижных панелях +- В комбинации с блоками + +Текущие динамические настройки Действий в основном применяются при совместном использовании с блоками. + +### Действия внутри блоков + +![20240412113815](https://static-docs.nocobase.com/20240412113815.png) + +### Конструктор операций (Панель инструментов) + +В отличие от блоков и полей, конструктор операций содержит только две иконки: +1. Перетаскивание +2. Настройка действий + +![20240412113855](https://static-docs.nocobase.com/20240412113855.png) + +### Изменение порядка действий + +Для изменения порядка кнопок: +1. Зажмите иконку "Перетаскивание" в конструкторе кнопок +2. Переместите кнопки в нужном порядке + +![20240412114236](https://static-docs.nocobase.com/20240412114236.gif) diff --git a/docs/ru-RU/handbook/ui/actions/permission.md b/docs/ru-RU/handbook/ui/actions/permission.md new file mode 100644 index 0000000000..a27dd13e15 --- /dev/null +++ b/docs/ru-RU/handbook/ui/actions/permission.md @@ -0,0 +1,75 @@ +### **Права на операции** + +#### **Введение** + +В NocoBase права на операции в основном делятся на две категории: + +- **Права на ресурсы коллекции**: используются для единообразного контроля базовых операций, таких как Создание, Просмотр, Обновление и Удаление, для разных ролей. Эти права применяются ко всей коллекции в рамках источника данных и обеспечивают согласованность операций с коллекцией на различных страницах или во всплывающих окнах. +- **Независимые права на операции**: используются для тонкой настройки управления конкретными операциями для разных ролей, например, запуск рабочих процессов, пользовательские запросы, внешние ссылки и т.д. Эти права обеспечивают контроль на уровне отдельных операций, позволяя разным ролям выполнять определённые действия, не влияя при этом на общие настройки прав коллекции. + +--- + +#### **Права на ресурсы коллекции** + +В системе управления правами NocoBase операции с коллекциями, как правило, классифицируются по принципу CRUD (Create, Read, Update, Delete), что обеспечивает согласованность и стандартизацию управления правами. Например: + +- **Право на создание (Create)**: контролирует все действия, связанные с созданием данных в коллекции, такие как добавление или дублирование записей. Если у роли есть право на создание для коллекции, то операции «создать» и «дублировать» будут доступны на всех страницах и во всех всплывающих окнах. +- **Право на удаление (Delete)**: управляет операцией удаления из коллекции, включая массовое удаление в блоках коллекций или удаление отдельных записей в блоках детализации. Права остаются одинаковыми для всех типов операций удаления. +- **Право на обновление (Update)**: контролирует операции, связанные с изменением данных, например, редактирование или обновление записей. +- **Право на просмотр (View)**: определяет видимость данных в коллекции. Соответствующие блоки данных (список, детализация и т.д.) будут отображаться только в том случае, если у роли есть право на просмотр этой коллекции. + +Такой обобщённый подход к управлению правами подходит для стандартизированного контроля доступа к данным и обеспечивает единообразие операций с одной и той же коллекцией на разных страницах, во всплывающих окнах и блоках, что делает систему управления правами единой и простой в сопровождении. + +##### **Глобальные права** + +Глобальные права применяются ко всем коллекциям в рамках источника данных и классифицируются по типу ресурса, как показано ниже: + +![20250306204756](https://static-docs.nocobase.com/20250306204756.png) + +##### **Права для конкретной коллекции** + +Права для конкретной коллекции переопределяют глобальные права и позволяют более детально управлять доступом к отдельным коллекциям. Эти права делятся на две категории: + +1. **Права на операции**: включают операции добавления, просмотра, редактирования, удаления, экспорта и импорта. Настройка прав осуществляется с учётом диапазона данных: + + - **Все данные**: пользователь может выполнять операции со всеми записями в коллекции. + - **Собственные данные**: пользователь может выполнять операции только с данными, которые он создал сам. + +2. **Права на поля**: позволяют настраивать права доступа к каждому полю в рамках различных операций. Например, некоторые поля могут быть доступны только для просмотра и не подлежать редактированию. + +![20250306205042](https://static-docs.nocobase.com/20250306205042.png) + +--- + +#### **Независимые права на операции** + +> **Примечание**: данная функция поддерживается начиная с версии v1.6.0-beta.13. + +В отличие от единых прав на операции, независимые права применяются к отдельным операциям. Это позволяет одной и той же операции иметь разные настройки прав в разных местах. + +Такая модель прав особенно удобна для персонализированных операций, например: + +- **Запуск рабочих процессов**: запуск рабочих процессов может требоваться на разных страницах по-разному, поэтому нуждается в отдельной настройке прав. +- **Пользовательские операции**: операции с уникальной бизнес-логикой, которые должны управляться независимо. +- **Всплывающие окна, ссылки и т.д.**: эти операции могут быть настроены индивидуально по видимости и правам доступа. + +В настоящее время следующие операции поддерживают независимую настройку прав: + +- Всплывающие окна (управление видимостью и правами на операции во всплывающих окнах) +- Ссылки (ограничение доступа ролей к внешним или внутренним ссылкам) +- Запуск рабочих процессов (разрешение на запуск разных рабочих процессов на разных страницах) +- Операции в панели действий (например, сканирование, всплывающие окна, запуск рабочих процессов, внешние ссылки) +- Пользовательские запросы (отправка запросов к сторонним сервисам) + +Настроив независимые права на операции, можно достичь детального контроля над действиями разных ролей, что делает систему управления правами более гибкой. + +![20250306215749](https://static-docs.nocobase.com/20250306215749.png) + +Если ни одна роль не указана, по умолчанию операция будет видна всем ролям. + +![20250306215854](https://static-docs.nocobase.com/20250306215854.png) + +--- + +#### **Связанная документация** +[Настройка прав доступа](/handbook/acl/user) diff --git a/docs/ru-RU/handbook/ui/actions/types/add-new.md b/docs/ru-RU/handbook/ui/actions/types/add-new.md new file mode 100644 index 0000000000..b3238523da --- /dev/null +++ b/docs/ru-RU/handbook/ui/actions/types/add-new.md @@ -0,0 +1,18 @@ +# Добавление записи + +## Введение + +Операция "Добавить" позволяет создавать новые записи в таблице данных текущего блока. Через настройку блока формы можно вводить новые данные в связанную таблицу. + +![20240413210523](https://static-docs.nocobase.com/20240413210523.png) +![20240423200432](https://static-docs.nocobase.com/20240423200432.png) + +## Настройки операции + +![20240413210716](https://static-docs.nocobase.com/20240413210716.png) + +Основные параметры конфигурации: +- [Настройка кнопки редактирования](/handbook/ui/actions/action-settings/edit-button) +- [Режим открытия](/handbook/ui/actions/action-settings/open-mode) +- [Размер всплывающего окна](/handbook/ui/actions/action-settings/popup-size) +- Включение подтаблицы (Наследуемая таблица) diff --git a/docs/ru-RU/handbook/ui/actions/types/add-record.md b/docs/ru-RU/handbook/ui/actions/types/add-record.md new file mode 100644 index 0000000000..bcbb748da9 --- /dev/null +++ b/docs/ru-RU/handbook/ui/actions/types/add-record.md @@ -0,0 +1,39 @@ +### **Добавление записи** + +#### **Введение** + +Функция «Добавить запись» позволяет пользователям добавлять новые записи в любую таблицу данных в рамках выполнения операции. + +![20240423202949](https://static-docs.nocobase.com/20240423202949.png) + +Выберите целевую таблицу данных и добавьте блок формы. + +![20240423203010](https://static-docs.nocobase.com/20240423203010.png) + +#### **Использование таблицы для выбора записей** + +Данная функция в настоящее время предназначена для установки значений по умолчанию в операции «Добавить запись» внутри блоков таблиц. + +Например, таблицы «Заказы» и «Товары» связаны отношением «многие ко многим». В блоке таблицы «Товары» можно настроить операцию «Добавить запись», чтобы вносить данные в таблицу «Заказы». + +![20240426101803](https://static-docs.nocobase.com/20240426101803.png) + +В этом случае установите значение по умолчанию для поля связи «Товар» в таблице «Заказы» как «Выбранные в таблице записи». + +![20240426101823](https://static-docs.nocobase.com/20240426101823.png) + +![20240426101922](https://static-docs.nocobase.com/20240426101922.png) + +Ниже приведён полный пример работы: + +<video width="100%" height="440" controls> +<source src="https://static-docs.nocobase.com/20240426102142.mp4" type="video/mp4"> +</video> + +#### **Параметры настройки операции** + +![20240423203050](https://static-docs.nocobase.com/20240423203050.png) + +- [Настройка кнопки](/handbook/ui/actions/action-settings/edit-button) +- [Режим открытия](/handbook/ui/actions/action-settings/open-mode) +- [Размер всплывающего окна](/handbook/ui/actions/action-settings/popup-size) diff --git a/docs/ru-RU/handbook/ui/actions/types/delete.md b/docs/ru-RU/handbook/ui/actions/types/delete.md new file mode 100644 index 0000000000..a49628d1b5 --- /dev/null +++ b/docs/ru-RU/handbook/ui/actions/types/delete.md @@ -0,0 +1,18 @@ +# Удаление записей + +## Введение + +Операция удаления позволяет удалять записи данных. Доступны два варианта: +1. Удаление одной записи через кнопку в строке таблицы +2. Массовое удаление нескольких записей с помощью группового действия + +![20240413211215](https://static-docs.nocobase.com/20240413211215.png) + +## Настройки операции + +![20240413211439](https://static-docs.nocobase.com/20240413211439.png) + +Основные параметры: +- [Настройка кнопки](/handbook/ui/actions/action-settings/edit-button) - внешний вид и расположение кнопки удаления +- [Подтверждение действия](/handbook/ui/actions/action-settings/double-check) - включение дополнительного подтверждения перед удалением +- Обновление данных после выполнения - по умолчанию включено, автоматически обновляет данные блока после успешного удаления diff --git a/docs/ru-RU/handbook/ui/actions/types/edit.md b/docs/ru-RU/handbook/ui/actions/types/edit.md new file mode 100644 index 0000000000..ee40b42322 --- /dev/null +++ b/docs/ru-RU/handbook/ui/actions/types/edit.md @@ -0,0 +1,26 @@ +### **Редактирование** + +#### **Введение** + +Функция редактирования является частью действий с записями и использует текущую запись в качестве контекста. Форма редактирования открывается во всплывающем окне, где пользователь может настроить и добавить различные блоки по своему усмотрению. + +![20240412115736](https://static-docs.nocobase.com/20240412115736.png) + +Настройте блоки данных в соответствии с вашими требованиями. + +![20240421110538](https://static-docs.nocobase.com/20240421110538.png) + +#### **Параметры настройки операции** + +![20240421110728](https://static-docs.nocobase.com/20240421110728.png) + +### **Правила связывания** + +Пример: редактирование отключено для заказов, которые уже получены. +![20240423211911](https://static-docs.nocobase.com/20240423211911.png) + +Более подробную информацию см. в разделе [Правило связывания](/handbook/ui/actions/action-settings/linkage-rule). + +- [Кнопка редактирования](/handbook/ui/actions/action-settings/edit-button): настройка заголовка, цвета и значка кнопки. +- [Режим открытия](/handbook/ui/actions/action-settings/open-mode): выбор между всплывающим окном (Pop-up) и выезжающей панелью (Drawer). +- [Размер всплывающего окна](/handbook/ui/actions/action-settings/popup-size): размер по умолчанию — Средний (доступные размеры: Большой/Средний/Малый). diff --git a/docs/ru-RU/handbook/ui/actions/types/filter.md b/docs/ru-RU/handbook/ui/actions/types/filter.md new file mode 100644 index 0000000000..934e4c6cf5 --- /dev/null +++ b/docs/ru-RU/handbook/ui/actions/types/filter.md @@ -0,0 +1,23 @@ +# Фильтрация данных + +## Введение + +Операции фильтрации доступны в блоках данных и позволяют пользователям задавать различные условия для отбора информации. Важно учитывать, что если для блока данных уже задан диапазон, условия фильтрации будут объединены с ним в итоговые правила отбора. + +![20240413105921](https://static-docs.nocobase.com/20240413105921.png) + +## Настройки фильтрации + +![20240413110004](https://static-docs.nocobase.com/20240413110004.png) + +### Доступные для фильтрации поля + +По умолчанию все поля таблицы доступны для фильтрации. В списке условий можно выбрать только активированные поля. + +Также доступны для использования поля из связанных таблиц. + +![20240423200041](https://static-docs.nocobase.com/20240423200041.png) + +Основные настройки: +- [Редактирование кнопки](/handbook/ui/actions/action-settings/edit-button) - настройка внешнего вида и расположения элемента фильтрации + diff --git a/docs/ru-RU/handbook/ui/actions/types/link.md b/docs/ru-RU/handbook/ui/actions/types/link.md new file mode 100644 index 0000000000..89e63af846 --- /dev/null +++ b/docs/ru-RU/handbook/ui/actions/types/link.md @@ -0,0 +1,38 @@ +### **Ссылка** + +#### **Введение** + +Операция «Ссылка» работает через навигацию по маршрутам и поддерживает передачу переменных. Целевая страница может динамически изменять своё содержимое на основе переданных данных, что делает данную функцию удобной для настройки внутри блоков данных. + +![20240603150755](https://static-docs.nocobase.com/20240603150755.png) + +#### **Настройка операции** + +![20240603150823](https://static-docs.nocobase.com/20240603150823.png) + +##### **Редактирование ссылки** + +![20240603150944](https://static-docs.nocobase.com/20240603150944.png) + +![20240603224322](https://static-docs.nocobase.com/20240603224322.png) + +#### **Сценарии использования** + +Пример: таблицы «Автор» и «Статья» связаны отношением «один ко многим». В таблице «Автор» можно настроить операцию-ссылку «Просмотр публикаций». При клике по этой ссылке ID автора передаётся как параметр в таблицу статей, и на целевой странице отображаются только статьи, соответствующие этому автору. + +![20240603151934](https://static-docs.nocobase.com/20240603151934.png) + +#### **Открытие в новом окне** + +Если включена опция «Открыть в новом окне», ссылка будет открываться в отдельной вкладке браузера. + +![20240718160541](https://static-docs.nocobase.com/20240718160541.png) + +Ниже приведён полный пример настройки: + +<video width="100%" height="440" controls> +<source src="https://static-docs.nocobase.com/20240603224044.mp4" type="video/mp4"> +</video> + +- [Редактирование кнопки](/handbook/ui/actions/action-settings/edit-button): настройка заголовка, цвета и значка кнопки. +- [Правило связывания](/handbook/ui/actions/action-settings/linkage-rule): динамическое управление состоянием кнопки. diff --git a/docs/ru-RU/handbook/ui/actions/types/pop-up.md b/docs/ru-RU/handbook/ui/actions/types/pop-up.md new file mode 100644 index 0000000000..caf5c5ca35 --- /dev/null +++ b/docs/ru-RU/handbook/ui/actions/types/pop-up.md @@ -0,0 +1,21 @@ +# Настраиваемое всплывающее окно + +## Введение + +Функция настраиваемого всплывающего окна работает аналогично действиям просмотра и редактирования. Это часть кнопок строки таблицы и использует текущую запись в качестве контекста. Пользователи могут настроить несколько всплывающих действий в рамках операций со строкой таблицы. + +![20240413104530](https://static-docs.nocobase.com/20240413104530.png) + +Во всплывающем окне можно настраивать блоки по необходимости. + +![20240426161322](https://static-docs.nocobase.com/20240426161322.png) + +## Параметры настройки операции + +![20240413104602](https://static-docs.nocobase.com/20240413104602.png) + +Основные настройки включают: +- [Редактирование кнопки](/handbook/ui/actions/action-settings/edit-button): Настройка заголовка, цвета и иконки кнопки +- [Правила связей](/handbook/ui/actions/action-settings/linkage-rule): Динамическое управление состоянием кнопки (Видимость/Доступность) +- [Режим открытия](/handbook/ui/actions/action-settings/open-mode): Всплывающее окно/Выдвижная панель +- [Размер всплывающего окна](/handbook/ui/actions/action-settings/popup-size): По умолчанию используется средний размер (Большой/Средний/Маленький) diff --git a/docs/ru-RU/handbook/ui/actions/types/refresh.md b/docs/ru-RU/handbook/ui/actions/types/refresh.md new file mode 100644 index 0000000000..5b57f957e6 --- /dev/null +++ b/docs/ru-RU/handbook/ui/actions/types/refresh.md @@ -0,0 +1,3 @@ +# Обновление + +![20240421112050](https://static-docs.nocobase.com/20240421112050.png) diff --git a/docs/ru-RU/handbook/ui/actions/types/save-record.md b/docs/ru-RU/handbook/ui/actions/types/save-record.md new file mode 100644 index 0000000000..1fc4bb375f --- /dev/null +++ b/docs/ru-RU/handbook/ui/actions/types/save-record.md @@ -0,0 +1,26 @@ +# Сохранение записи + +## Введение + +Операция сохранения данных позволяет назначать значения полям через механизм присвоения значений, который имеет приоритет над значениями, введенными в форме. Эта операция может быть интегрирована с рабочими процессами для автоматизации обработки данных. + +![20240413214755](https://static-docs.nocobase.com/20240413214755.png) +![20240413214926](https://static-docs.nocobase.com/20240413214926.png) + +## Настройки операции + +### Присвоение значений полям + +При настройке присвоения значений, назначенное значение будет переопределять любое значение, введенное в форме для того же поля, обеспечивая приоритет предустановленного значения. + +![20240423213245](https://static-docs.nocobase.com/20240423213245.png) + +Подробнее: [Присвоение значений полям](/handbook/ui/actions/action-settings/assign-value) + +Основные параметры: +- [Настройка кнопки](/handbook/ui/actions/action-settings/edit-button) +- [Подтверждение действия](/handbook/ui/actions/action-settings/double-check) +- [Действия после успешного сохранения](/handbook/ui/actions/action-settings/affter-successful) +- [Привязка рабочего процесса](/handbook/ui/actions/action-settings/bind-workflow) +- Пропуск обязательной проверки +- Обновление после выполнения diff --git a/docs/ru-RU/handbook/ui/actions/types/submit.md b/docs/ru-RU/handbook/ui/actions/types/submit.md new file mode 100644 index 0000000000..7f6c1a299d --- /dev/null +++ b/docs/ru-RU/handbook/ui/actions/types/submit.md @@ -0,0 +1,36 @@ +### **Отправка (Submit)** + +#### **Введение** + +Функция отправки предназначена для сохранения данных формы (доступна только в блоках форм) и может интегрироваться с рабочими процессами для автоматизации обработки данных. + +![20240413093210](https://static-docs.nocobase.com/20240413093210.png) + +#### **Параметры настройки операции** + +![20240413095124](https://static-docs.nocobase.com/20240413095124.png) + +##### **Режим сохранения** + +Для операции отправки в блоках форм, предназначенных только для добавления новых данных, можно настроить способ сохранения. + +![20240413101209](https://static-docs.nocobase.com/20240413101209.png) + +![20240413100531](https://static-docs.nocobase.com/20240413100531.png) + +Доступны следующие режимы: + +1. **Вставить и создать новую запись** — всегда создавать новую запись. +2. **Вставить, только если запись не существует** — запись добавляется только в случае отсутствия совпадений (требуется указать поля для проверки существования записи). +3. **Вставить, если запись не существует, иначе — обновить** — если запись найдена по заданным полям, она будет обновлена, в противном случае — создана новая. + +##### **Привязка рабочих процессов** + +Привязанный рабочий процесс запускается только после успешной отправки данных. + +![20240417120149](https://static-docs.nocobase.com/20240417120149.png) + +Более подробную информацию см. в разделе [Привязка рабочих процессов](/handbook/ui/actions/action-settings/bind-workflow). + +- [Редактирование кнопки](/handbook/ui/actions/action-settings/edit-button) +- [Двойное подтверждение](/handbook/ui/actions/action-settings/double-check) diff --git a/docs/ru-RU/handbook/ui/actions/types/trigger-workflow.md b/docs/ru-RU/handbook/ui/actions/types/trigger-workflow.md new file mode 100644 index 0000000000..c3897eb1de --- /dev/null +++ b/docs/ru-RU/handbook/ui/actions/types/trigger-workflow.md @@ -0,0 +1,5 @@ +# Запуск рабочего процесса + +<PluginInfo name="workflow-custom-action-trigger" link="/handbook/workflow-custom-action-trigger" commercial="true"></PluginInfo> + +<embed src="../../../workflow-custom-action-trigger/action.md#L3-L999"></embed> diff --git a/docs/ru-RU/handbook/ui/actions/types/update-record.md b/docs/ru-RU/handbook/ui/actions/types/update-record.md new file mode 100644 index 0000000000..d03651c7cf --- /dev/null +++ b/docs/ru-RU/handbook/ui/actions/types/update-record.md @@ -0,0 +1,34 @@ +# Обновление записи + +## Введение + +Кастомные операции со строками позволяют обновлять данные через настройку присвоения значений полям с точной логикой обновления для каждого поля. + +![20240413212430](https://static-docs.nocobase.com/20240413212430.png) + +## Настройки операции + +![20240413212816](https://static-docs.nocobase.com/20240413212816.png) + +### Правила связей + +Пример: Кнопка скрывается при статусе счета "Отменен". + +![20240423210252](https://static-docs.nocobase.com/20240423210252.png) + +Подробнее: [Правила связей](/handbook/ui/actions/action-settings/linkage-rule) + +### Присвоение значений полям + +Пример: Обновление времени получения в текущей записи на текущее время. + +![20240423210506](https://static-docs.nocobase.com/20240423210506.png) + +Подробнее: [Присвоение значений](/handbook/ui/actions/action-settings/assign-values) + +Основные настройки: +- [Редактирование кнопки](/handbook/ui/actions/action-settings/edit-button) +- [Подтверждение действия](/handbook/ui/actions/action-settings/double-check) +- [Действия после успеха](/handbook/ui/actions/action-settings/affter-successful) +- [Привязка workflow](/handbook/ui/actions/action-settings/bind-workflow) +- Обновление данных после выполнения diff --git a/docs/ru-RU/handbook/ui/actions/types/view.md b/docs/ru-RU/handbook/ui/actions/types/view.md new file mode 100644 index 0000000000..3e04a8c21c --- /dev/null +++ b/docs/ru-RU/handbook/ui/actions/types/view.md @@ -0,0 +1,16 @@ +### **Просмотр** + +#### **Обзор** + +Операция «Просмотр» — это кнопка уровня строки, которая использует текущую запись в качестве контекста. Открывается во всплывающем окне и позволяет пользователям настраивать блоки содержимого, повышая гибкость интерфейса. + +![20240412115458](https://static-docs.nocobase.com/20240412115458.png) + +#### **Параметры настройки операции** + +![20240413104839](https://static-docs.nocobase.com/20240413104839.png) + +- [Редактирование кнопки](/handbook/ui/actions/action-settings/edit-button) +- [Правило связывания](/handbook/ui/actions/action-settings/linkage-rule) +- [Режим открытия](/handbook/ui/actions/action-settings/open-mode) +- [Размер всплывающего окна](/handbook/ui/actions/action-settings/popup-size) diff --git a/docs/ru-RU/handbook/ui/blocks/block-settings/block-delete.md b/docs/ru-RU/handbook/ui/blocks/block-settings/block-delete.md new file mode 100644 index 0000000000..f2f675ea5b --- /dev/null +++ b/docs/ru-RU/handbook/ui/blocks/block-settings/block-delete.md @@ -0,0 +1,7 @@ +# Удалить блок + +## Введение + +Удаление блока с текущей страницы является необратимым действием. + +![20240407175143](https://static-docs.nocobase.com/20240407175143.png) diff --git a/docs/ru-RU/handbook/ui/blocks/block-settings/block-height.md b/docs/ru-RU/handbook/ui/blocks/block-settings/block-height.md new file mode 100644 index 0000000000..b9c2db4c21 --- /dev/null +++ b/docs/ru-RU/handbook/ui/blocks/block-settings/block-height.md @@ -0,0 +1,40 @@ +# Настройка высоты блоков + +## Введение + +Настройки высоты блоков в NocoBase поддерживают три варианта: высота по умолчанию, заданная высота и полная высота. Эта функция доступна для большинства блоков, за исключением диаграмм Ганта. Для блоков с графиками высота регулируется через специальные параметры. + +![20240602194552](https://static-docs.nocobase.com/20240602194552.png) + +![20240602194609](https://static-docs.nocobase.com/20240602194609.png) + +### Высота по умолчанию + +Каждый тип блока обрабатывает высоту по умолчанию по-своему. Например, таблицы и формы автоматически подстраивают высоту под содержимое, а канбан-доски по умолчанию занимают 70% высоты окна просмотра. + +### Заданная высота + +Пользователи могут вручную задавать общую высоту внешнего контейнера блока. Внутренние компоненты блока затем автоматически распределяют доступное пространство. + +![20240604172359](https://static-docs.nocobase.com/20240604172359.gif) + +### Полная высота + +Режим полной высоты, аналогично заданной высоте, автоматически определяет и распределяет высоту блока исходя из видимой области окна. Этот подход исключает появление скроллбаров на уровне страницы, ограничивая их внутренними областями отдельных блоков. + +Обработка высоты немного различается для разных типов блоков: + +- Таблицы: скроллинг происходит внутри tbody; +- Формы/Детали: скроллится область Grid, кроме раздела операций; +- Списки/Карточки: скроллится область Grid, кроме операций и пагинации; +- Канбан: каждая колонка скроллится независимо; +- Карты и Календари: адаптируются под полную высоту без скроллбаров; +- Iframes/Markdown: фиксированная высота внешнего контейнера со скроллингом внутри блока. + +#### Пример таблицы с полной высотой + +![20240604172439](https://static-docs.nocobase.com/20240604172439.gif) + +#### Пример формы с полной высотой + +![20240604222711](https://static-docs.nocobase.com/20240604222711.gif) diff --git a/docs/ru-RU/handbook/ui/blocks/block-settings/block-layout.md b/docs/ru-RU/handbook/ui/blocks/block-settings/block-layout.md new file mode 100644 index 0000000000..63f49db637 --- /dev/null +++ b/docs/ru-RU/handbook/ui/blocks/block-settings/block-layout.md @@ -0,0 +1,27 @@ +# Макет + +:::информация{заголовок=Совет} +Версия NocoBase должна быть бета-версией 1.3.34 или выше. +::: +## Введение + +Компоненты формы, такие как блоки форм, блоки сведений и блоки списков, поддерживают настройки макета. Варианты компоновки включают вертикальную компоновку (при которой надписи и поля ввода располагаются отдельными строками) и горизонтальную компоновку (при которой надписи и поля ввода располагаются рядом). Такой гибкий выбор компоновки позволяет оптимизировать работу пользователя в зависимости от конкретных потребностей, обеспечивая четкость и эффективность ввода информации. + +![20241021204953](https://static-docs.nocobase.com/20241021204953.png) + +### Вертикальный (по умолчанию) + +Вложенные формы и подформа (всплывающее окно) также поддерживают конфигурацию макета, при этом макет по умолчанию установлен на вертикальный. + +![20241021205047](https://static-docs.nocobase.com/20241021205047.png) + +### Горизонтальный + +При горизонтальном расположении надписи и поля ввода располагаются рядом, что позволяет лучше использовать пространство. + + +![20241021205131](https://static-docs.nocobase.com/20241021205131.png) + +The main form uses a vertical layout, while the subform uses a horizontal layout. + +![20241021205203](https://static-docs.nocobase.com/20241021205203.png) diff --git a/docs/ru-RU/handbook/ui/blocks/block-settings/block-linkage-rule.md b/docs/ru-RU/handbook/ui/blocks/block-settings/block-linkage-rule.md new file mode 100644 index 0000000000..4a341af60a --- /dev/null +++ b/docs/ru-RU/handbook/ui/blocks/block-settings/block-linkage-rule.md @@ -0,0 +1,68 @@ +### **Правила связывания блоков** + +> **Примечание**: Эта функция поддерживается начиная с версии v1.7.0-beta.24. + +#### **Введение** + +Правила связывания блоков позволяют пользователям динамически управлять видимостью блоков, обеспечивая контроль отображения элементов на уровне блока. Поскольку блоки являются контейнерами для полей и кнопок действий, данная функция даёт возможность гибко управлять отображением всего представления с точки зрения блока. + +![20250427140619](https://static-docs.nocobase.com/20250427140619.png) + +![20250427144259](https://static-docs.nocobase.com/20250427144259.png) + +> **Примечание**: Перед применением правил связывания блока сначала выполняется **проверка прав доступа (ACL)**. Правила связывания применяются только в том случае, если у пользователя есть соответствующие права доступа. Другими словами, правила связывания вступают в силу только после успешного прохождения проверки прав ACL на просмотр. Если правила связывания отсутствуют, блок отображается по умолчанию. + +#### **Управление блоками с помощью глобальных переменных** + +Правила связывания поддерживают управление отображением блоков через глобальные переменные. Например, разные роли могут иметь права на просмотр одной и той же коллекции заказов, но отображаемые данные могут быть персонализированы и различаться. Настраивая поля и действия, отображаемые в блоке, в зависимости от роли пользователя, можно гибко управлять отображением данных и правами на действия. + +##### **Роль — Служба поддержки клиентов** + +- **Диапазон данных**: может просматривать только заказы со статусом «Ожидает отправки»; скрываются конфиденциальные данные, такие как информация о платежах и данные клиентов со скидками. +- **Действия**: + - Просмотр деталей заказа + - Обработка возвратов/обменов + - Создание запроса на возврат средств +- **Доступные поля**: НомерЗаказа, ДатаЗаказа, СтатусЗаказа, АдресДоставки (исключая конфиденциальные поля: ОбщаяСумма, Скидка, Клиенты и т.д.). + +![20250427141800](https://static-docs.nocobase.com/20250427141800.png) + +##### **Роль — Финансовый отдел** + +- **Диапазон данных**: может просматривать только заказы со статусами «Оплачено» или «Возврат средств»; не требуется отображение деталей товаров или информации о клиентах. +- **Действия**: + - Проверка запроса на возврат + - Создание счёта +- **Доступные поля**: НомерЗаказа, ДатаЗаказа, СтатусЗаказа, АдресДоставки, ОбщаяСумма (исключая конфиденциальные поля: Товары, Клиенты и т.д.). + +![20250427142420](https://static-docs.nocobase.com/20250427142420.png) + +#### **Управление блоками с помощью контекстных переменных** + +Блоками также можно управлять с помощью переменных контекста. Например, можно использовать контекстные переменные «текущая запись», «текущая форма» или «текущая запись во всплывающем окне» для динамического отображения блоков. + +**Пример:** Блок «Информация о доставке» будет отображаться только тогда, когда статус заказа — «Отправлен». + +![20250427143707](https://static-docs.nocobase.com/20250427143707.png) + +![20250427143951](https://static-docs.nocobase.com/20250427143951.png) + +#### **Markdown в блоках** + +**Пример:** Настройка отображения информации о трекинге через Markdown в блоке детализации. + +![20250427150236](https://static-docs.nocobase.com/20250427150236.png) + +![20250427150308](https://static-docs.nocobase.com/20250427150308.png) + +Информация в формате Markdown будет отображаться только при статусе заказа «Отправлен». + +![20250427150341](https://static-docs.nocobase.com/20250427150341.png) + +Результат: + +<video width="100%" height="440" controls> + <source src="https://static-docs.nocobase.com/20250427150738.mp4" type="video/mp4"> +</video> + +Более подробную информацию о правилах связывания см. в разделе [Правила связывания](/handbook/ui/linkage-rule). diff --git a/docs/ru-RU/handbook/ui/blocks/block-settings/block-title.md b/docs/ru-RU/handbook/ui/blocks/block-settings/block-title.md new file mode 100644 index 0000000000..2fcc70a620 --- /dev/null +++ b/docs/ru-RU/handbook/ui/blocks/block-settings/block-title.md @@ -0,0 +1,9 @@ +# Заголовок блока + +## Введение + +Пользовательский заголовок блока. + +![20240407175754](https://static-docs.nocobase.com/20240407175754.png) + +![20240423110346](https://static-docs.nocobase.com/20240423110346.png) diff --git a/docs/ru-RU/handbook/ui/blocks/block-settings/connect-block.md b/docs/ru-RU/handbook/ui/blocks/block-settings/connect-block.md new file mode 100644 index 0000000000..8b83ea34cb --- /dev/null +++ b/docs/ru-RU/handbook/ui/blocks/block-settings/connect-block.md @@ -0,0 +1,36 @@ +# Подключение блоков данных + +## Введение + +Подключение блоков данных - это мощная функция, которая обеспечивает динамическую фильтрацию между различными компонентами данных. По своей сути, эта функциональность предполагает установление связи между двумя коллекциями: исходной коллекцией (первичной коллекцией) и целевой коллекцией (коллекцией внешних ключей). Это соединение облегчает фильтрацию данных и взаимодействие с ними. + +Варианты подключения блоков разнообразны, в том числе: +- Блоки данных из одной коллекции на текущей странице или во всплывающем окне. +- Блоки из разных коллекций с ограничениями на внешний ключ +- Блоки из коллекций с отношениями наследования + +Пользователи могут подключать несколько блоков одновременно, повышая гибкость взаимодействия с данными. Независимо от выбранного метода, основной принцип остается неизменным: исходная коллекция (активно подключаемая коллекция) предоставляет параметры фильтра целевой коллекции (подключенной коллекции), обеспечивая точную фильтрацию и отображение данных. + +## Руководство пользователя + +### Подключение блоков фильтров к блокам данных + +![Illustration of connecting filter blocks to data blocks](https://static-docs.nocobase.com/20240407180953.png) + +### Подключение блоков данных к другим блокам данных + +#### Связь между блоками данных из одной коллекции + +Пример: Создание динамической связи между блоком сбора заказа и соответствующим ему блоком сведений о заказе. + + <video width="100%" height="440" controls> + <source src="https://static-docs.nocobase.com/20240407161700.mp4" type="video/mp4"> + </video> + +#### Связь между связанными блоками сбора данных (разные блоки сбора данных с ограничениями по внешнему ключу) + +Пример: Использование отношения "многие к одному" между сбором заказов и сбором клиентов для реализации связи фильтрации. Эта настройка позволяет пользователям запрашивать данные о заказе для конкретного клиента, создавая соединение между блоком сбора данных о клиентах и блоком сбора заказов. + + <video width="100%" height="440" controls> + <source src="https://static-docs.nocobase.com/20240407163523.mp4" type="video/mp4"> + </video> diff --git a/docs/ru-RU/handbook/ui/blocks/block-settings/data-scope.md b/docs/ru-RU/handbook/ui/blocks/block-settings/data-scope.md new file mode 100644 index 0000000000..657d093baa --- /dev/null +++ b/docs/ru-RU/handbook/ui/blocks/block-settings/data-scope.md @@ -0,0 +1,39 @@ +### **Диапазон данных** + +#### **Введение** + +Диапазон данных — это мощная функция, позволяющая пользователям задавать условия фильтрации по умолчанию для блоков данных. Эта возможность даёт возможность динамически настраивать объём отображаемых данных в соответствии с конкретными потребностями, улучшая общее впечатление от использования. + +#### **Руководство пользователя** + +![20240407180322](https://static-docs.nocobase.com/20240407180322.png) + +Поля фильтрации поддерживают выбор полей из текущей таблицы, а также из связанных таблиц (до трёх уровней вложенности). + +![20240422113637](https://static-docs.nocobase.com/20240422113637.png) + +##### **Операторы** + +Разные типы полей поддерживают различные операторы. Например, текстовые поля поддерживают операторы «равно», «не равно», «содержит». Числовые поля позволяют использовать операторы «больше» и «меньше», а поля даты предлагают такие варианты, как «в диапазоне» или «до определённой даты». + +![20240424154003](https://static-docs.nocobase.com/20240424154003.png) + +##### **Статические значения** + +Пример: установка статуса заказа как «Отправлен». + +<video width="100%" height="440" controls> + <source src="https://static-docs.nocobase.com/20240415204206.mp4" type="video/mp4"> +</video> + +##### **Переменные значения** + +Пример: «Дата доставки» раньше «вчера». + +![20240422090134](https://static-docs.nocobase.com/20240422090134.png) + +<video width="100%" height="440" controls> + <source src="https://static-docs.nocobase.com/20240415214709.mp4" type="video/mp4"> +</video> + +Более подробную информацию о переменных см. в разделе [Переменные](/handbook/ui/variables). diff --git a/docs/ru-RU/handbook/ui/blocks/block-settings/field-linkage-rule.md b/docs/ru-RU/handbook/ui/blocks/block-settings/field-linkage-rule.md new file mode 100644 index 0000000000..44400b2740 --- /dev/null +++ b/docs/ru-RU/handbook/ui/blocks/block-settings/field-linkage-rule.md @@ -0,0 +1,79 @@ +# Field Linkage Rules + +## Введение + +Правила связей полей позволяют динамически изменять атрибуты полей в блоках формы/детализации на основе действий пользователя. В настоящее время правила связей поддерживаются в следующих блоках: + +- [Блок формы](/handbook/ui/blocks/data-blocks/form#%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0-%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9) +- [Блок детализации](/handbook/ui/blocks/data-blocks/details#%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0-%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9) +- [Подформа](/handbook/ui/fields/specific/nester) (требуется версия v1.3.17-beta или выше) +- [Подтаблица](/handbook/ui/fields/specific/sub-table) (требуется версия v1.3.17-beta или выше) + +## Инструкции по использованию + +#### **Блок формы** + +В блоках формы правила связей могут динамически изменять атрибуты полей на основе условий: + +- **Управление видимостью полей**: Определять видимость текущего поля на основе значений других полей. +- **Установка обязательности полей**: Динамически делать поле обязательным или необязательным. +- **Присвоение значений**: Автоматически заполнять поля значениями на основе условий. +- **Настройка опций**: Динамически обновлять доступные варианты в выпадающих списках. +- **Ограничение диапазона дат**: В полях даты/времени ограничивать выбираемый диапазон. + +#### **Блок детализации** + +В блоках детализации правила связей в основном используются для управления видимостью полей. + +![20250418161037](https://static-docs.nocobase.com/20250418161037.png) + +## Связи атрибутов +### Присвоение значений + +Пример: При отметке заказа как дополнительного, статус автоматически устанавливается в "Ожидает проверки". + +![20250418161712](https://static-docs.nocobase.com/20250418161712.png) + +### Обязательные поля + +Пример: При статусе "Ожидает оплаты" сумма заказа становится обязательной. + +![20250418163252](https://static-docs.nocobase.com/20250418163252.png) + +### Видимость/Скрытие + +Пример: Способ оплаты отображается только при статусе "Ожидает оплаты". + +![20250418163733](https://static-docs.nocobase.com/20250418163733.png) + +### Опции + +> **Примечание**: Доступно с версии `v1.7.0-beta.2`. + +Динамическая настройка опций для полей типа `select`, `radioGroup` и других на основе изменений в форме. + +Пример: "Рассрочка" доступна только при сумме заказа свыше 10 000. + +![20250418164806](https://static-docs.nocobase.com/20250418164806.png) + +Пример работы: + +<video width="100%" height="440" controls> + <source src="https://static-docs.nocobase.com/20250418164831.mp4" type="video/mp4"> +</video> + +### Диапазон дат + +> **Примечание**: Доступно с версии `v1.7.0-beta.2`. + +Динамическое ограничение выбираемого диапазона дат на основе других полей формы. + +Пример: Дата доставки не может быть раньше даты заказа. + +![20250418165500](https://static-docs.nocobase.com/20250418165500.png) + +Пример: Дата доставки ограничена сегодняшним днем и крайним сроком заказа. + +![20250418170520](https://static-docs.nocobase.com/20250418170520.png) + +Подробнее см. [Правила связей](/handbook/ui/linkage-rule). diff --git a/docs/ru-RU/handbook/ui/blocks/block-settings/loading-mode.md b/docs/ru-RU/handbook/ui/blocks/block-settings/loading-mode.md new file mode 100644 index 0000000000..0201d372ff --- /dev/null +++ b/docs/ru-RU/handbook/ui/blocks/block-settings/loading-mode.md @@ -0,0 +1,13 @@ +# Режим загрузки данных + +## Введение + +Метод загрузки данных по умолчанию - "Загружать все данные, когда критерии фильтрации пусты". "Критерии фильтрации" относятся к значениям в ** блоке фильтрации **. Другой вариант - "Не загружать данные, когда критерии фильтрации пусты". + +### Загрузить все данные, когда фильтр пуст. + +![![20240407170234](httpsstatic-docs.nocobase.com20240407170234.png)](https://static-docs.nocobase.com/![20240407170234](httpsstatic-docs.nocobase.com20240407170234.png).gif) + +### Не загружать данные, когда фильтр пуст + +![20240721160327_rec_](https://static-docs.nocobase.com/20240721160327_rec_.gif) diff --git a/docs/ru-RU/handbook/ui/blocks/block-settings/sorting-rule.md b/docs/ru-RU/handbook/ui/blocks/block-settings/sorting-rule.md new file mode 100644 index 0000000000..ce2b386595 --- /dev/null +++ b/docs/ru-RU/handbook/ui/blocks/block-settings/sorting-rule.md @@ -0,0 +1,23 @@ +# Правила сортировки + +## Введение + +Настройка правил сортировки позволяет определить критерии сортировки по умолчанию для блоков данных, гарантируя, что информация в каждом блоке будет представлена в определенном, заранее определенном порядке. + +## Руководство пользователя + +![20240407192159](https://static-docs.nocobase.com/20240407192159.png) + +![20240421115056](https://static-docs.nocobase.com/20240421115056.png) + +В настоящее время система поддерживает сортировку только по полям в текущей таблице. + +### Правило единой сортировки + +![20240407192248](https://static-docs.nocobase.com/20240407192248.png) + +### Несколько правил сортировки + +Эта функция идеально подходит для сложных сценариев сортировки. Например, вы можете сначала упорядочить данные по статусу заказа, а затем упорядочить товары в каждой категории статуса в соответствии со временем их доставки. + +![20240407193837](https://static-docs.nocobase.com/20240407193837.png) diff --git a/docs/ru-RU/handbook/ui/blocks/data-blocks/details.md b/docs/ru-RU/handbook/ui/blocks/data-blocks/details.md new file mode 100644 index 0000000000..53fcb62b5a --- /dev/null +++ b/docs/ru-RU/handbook/ui/blocks/data-blocks/details.md @@ -0,0 +1,56 @@ +# Detail Block + +## Введение + +Блок деталей используется для отображения значений каждого поля записи данных в детализированном виде. Он поддерживает гибкие макеты полей и включает различные функции для работы с данными. + +## Добавление блока + +<video width="100%" height="440" controls> + <source src="https://static-docs.nocobase.com/20240417122622.mp4" type="video/mp4"> +</video> + +## Настройки блока + +![20240511114328](https://static-docs.nocobase.com/20240511114328.png) + +### Настройка области данных + +Пример: Отображение только отправленных заказов. + +![20240417122910](https://static-docs.nocobase.com/20240417122910.png) + +Подробнее см. [Настройка области данных](/handbook/ui/blocks/block-settings/data-scope). + +### Настройка правил сортировки + +![20240417123300](https://static-docs.nocobase.com/20240417123300.png) + +Подробнее см. [Правила сортировки](/handbook/ui/blocks/block-settings/sorting-rule). + +- [Настройка режима загрузки данных](/handbook/ui/blocks/block-settings/loading-mode) +- [Сохранение как шаблон блока](/handbook/block-template) + +### Правила связей + +Правила связей в блоках деталей поддерживают динамическую настройку видимости полей. + +Пример: Скрыть дату доставки, если дата получения раньше даты доставки. + +![20240511115156](https://static-docs.nocobase.com/20240511115156.png) + +Подробнее см. [Правила связей](/handbook/ui/blocks/block-settings/field-linkage-rule). + +### Настройка высоты блока + +Пример: Установка блока деталей заказа в режим "полная высота". + +![20240604232307](https://static-docs.nocobase.com/20240604232307.gif) + +Подробнее см. [Высота блока](/handbook/ui/blocks/block-settings/block-height). + +## Настройка полей + +### Поля текущей таблицы + +![202404172...] diff --git a/docs/ru-RU/handbook/ui/blocks/data-blocks/form.md b/docs/ru-RU/handbook/ui/blocks/data-blocks/form.md new file mode 100644 index 0000000000..6f5add19ba --- /dev/null +++ b/docs/ru-RU/handbook/ui/blocks/data-blocks/form.md @@ -0,0 +1,92 @@ +### **Блок формы** + +#### **Введение** + +Блок формы — это основной блок для создания интерфейсов ввода и редактирования данных. Он обладает высокой степенью настраиваемости и использует соответствующие компоненты в зависимости от модели данных для отображения необходимых полей. С помощью правил связывания блок формы может динамически отображать поля. Кроме того, его можно комбинировать с рабочими процессами для автоматического запуска процессов и обработки данных, что дополнительно повышает эффективность работы или позволяет реализовывать логическую оркестровку. + +#### **Добавление блока** + +#### **Параметры настройки блока** + +![Параметры](https://static-docs.nocobase.com/20240416220148.png) + +##### **Правила связывания** + +Управление поведением полей формы с помощью правил связывания. + +![Связывание](https://static-docs.nocobase.com/20240416220254.png) + +Более подробно см. в разделе [Правила связывания](/handbook/ui/blocks/block-settings/field-linkage-rule). + +##### **Шаблоны данных формы (поддерживаются только для форм создания новых записей)** + +Цель шаблонов данных формы — упростить процесс ввода данных и повысить эффективность. Путем фильтрации одной записи или группы записей в диапазоне данных в качестве шаблона, выбранный шаблон данных будет подставлен в форму в качестве значений по умолчанию. + +![Пример](https://static-docs.nocobase.com/20240408143719.png) + +![Пример](https://static-docs.nocobase.com/20240424143911.png) + +- Отфильтруйте одну запись или группу записей в качестве шаблонных данных. +- Выберите поле заголовка для идентификации шаблонных данных. +- Выберите поля шаблона — выбранные поля будут автоматически подставлены в форму. + +##### **Синхронизация из полей формы** + +Автоматически анализирует настроенные поля в текущем блоке формы как поля шаблона. +Если в будущем будут внесены изменения в поля блока формы (например, изменение компонентов полей связи), вы можете снова открыть настройку шаблона и нажать кнопку синхронизации, чтобы обеспечить согласованность между формой и шаблоном. + +Следующие поля **не** будут включены в шаблон данных: + +- Первичный ключ +- Внешний ключ +- Поля с запретом дублирования +- Поля сортировки +- Поля последовательности +- Пароль +- Создано пользователем +- Дата создания +- Последнее обновление пользователем +- Дата последнего обновления + +##### **Для полей связи** + +- Обычные поля и поля связей `hasOne` и `hasMany` копируются. +- Поля связей `belongsTo` и `belongsToMany` ссылаются, но ссылки могут превращаться в копии. Например, при изменении селектора на подформу, связь изменяется со ссылки на копию (после копирования все поля становятся необязательными). + +##### **Примеры сценариев** + +**Описание сценария:** Платформа электронной коммерции регулярно добавляет новые товары, многие атрибуты которых схожи или идентичны уже существующим товарам. + +**Решение:** Выберите существующий товар в качестве шаблона и используйте его атрибуты как шаблон данных формы. При создании нового товара пользователь может выбрать применение этого шаблона, что позволит быстро скопировать атрибуты из шаблона в новую запись, повысив эффективность ввода. + +**Создание шаблона рекламной акции** + +![Пример](https://static-docs.nocobase.com/20240408145855.png) + +**Быстрое создание рекламных товаров** + +- [Редактировать заголовок блока](/handbook/ui/blocks/block-settings/block-title) +- [Сохранить как шаблон блока](/handbook/block-template) + +#### **Настройка полей** + +##### **Поля текущей коллекции** + +![Поля](https://static-docs.nocobase.com/20240416230739.png) + +##### **Поля связанных коллекций** + +Поля из связанных таблиц в форме доступны только для чтения и обычно используются в сочетании с полями связи для отображения нескольких значений связанных данных. + +![Поля](https://static-docs.nocobase.com/20240416230811.png) + +Параметры настройки полей формы см. в разделе [Поля формы](/handbook/ui/fields/generic/form-item). + +#### **Настройка действий** + +![Действия](https://static-docs.nocobase.com/20240417115249.png) + +- [Отправить](/handbook/ui/actions/types/submit) +- [Сохранить данные](/handbook/ui/actions/types/save-record) +- [Пользовательский запрос](/handbook/action-custom-request) +- [Запустить рабочий процесс](/handbook/workflow/manual/triggers/cutom-action-trigger) diff --git a/docs/ru-RU/handbook/ui/blocks/data-blocks/grid-card.md b/docs/ru-RU/handbook/ui/blocks/data-blocks/grid-card.md new file mode 100644 index 0000000000..689466489e --- /dev/null +++ b/docs/ru-RU/handbook/ui/blocks/data-blocks/grid-card.md @@ -0,0 +1,88 @@ +# Grid Cards + +## Введение + +Блок Grid Card предоставляет компактный и визуально привлекательный способ отображения сводной информации о записях данных. Благодаря гибкой настройке количества колонок в зависимости от размера экрана, он обеспечивает удобный просмотр на любых устройствах. + +## Добавление блоков + +<video width="100%" height="440" controls> + <source src="https://static-docs.nocobase.com/20240418120045.mp4" type="video/mp4"> +</video> + +## Настройки блока + +![20240419220708](https://static-docs.nocobase.com/20240419220708.png) + +### Область данных + +<video width="100%" height="440" controls> + <source src="https://static-docs.nocobase.com/20240419173617.mp4" type="video/mp4"> +</video> + +Подробное руководство см. в разделе [Настройка области данных](/handbook/ui/blocks/block-settings/data-scope). + +### Настройка количества колонок в строке + +![20240408160228](https://static-docs.nocobase.com/20240408160228.png) + +Количество колонок можно адаптировать под разные размеры экранов для оптимального отображения. + +![20240408160844](https://static-docs.nocobase.com/20240408160844.png) + +### Настройка метода загрузки данных + +Пример: Связь блоков данных и настройка метода загрузки. + +Таблицы "Заказы" и "Товары" имеют связь "многие ко многим". Блок таблицы заказов и блок Grid Card товаров можно связать для фильтрации данных. В этом случае метод загрузки данных для блока Grid Card настраивается как "После фильтрации данных". + +<video width="100%" height="440" controls> + <source src="https://static-docs.nocobase.com/20240419175643.mp4" type="video/mp4"> +</video> + +### Настройка высоты блока + +Пример: Настройка блока Grid Card заказов в режиме "Полная высота" для расширенного просмотра. + +![20240604232619](https://static-docs.nocobase.com/20240604232619.gif) + +Подробнее см. [Высота блока](/handbook/ui/blocks/block-settings/block-height). + +- [Настройка правил сортировки](/handbook/ui/blocks/block-settings/sorting-rule) +- [Сохранение как шаблон блока](/handbook/block-template) + +## Настройка полей + +### Поля текущей таблицы + +![20240418123118](https://static-docs.nocobase.com/20240418123118.png) + +### Поля связанных таблиц + +![20240418123147](https://static-docs.nocobase.com/20240418123147.png) + +Полное руководство по настройке полей для блока Grid Card см. в разделе [Поля детальной формы](/handbook/ui/fields/generic/detail-form-item). + +## Настройка действий + +### Глобальные действия + +![20240418122905](https://static-docs.nocobase.com/20240418122905.png) + +- [Фильтрация](/handbook/ui/actions/types/filter) +- [Добавление](/handbook/ui/actions/types/add-new) +- [Удаление](/handbook/ui/actions/types/delete) +- [Обновление](/handbook/ui/actions/types/refresh) +- [Импорт](/handbook/action-import) +- [Экспорт](/handbook/action-export) + +### Действия со строками + +![20240419222251](https://static-docs.nocobase.com/20240419222251.png) + +- [Редактирование](/handbook/ui/actions/types/edit) +- [Удаление](/handbook/ui/actions/types/delete) +- [Всплывающее окно](/handbook/ui/actions/types/pop-up) +- [Обновление записи](/handbook/ui/actions/types/update-record) +- [Пользовательский запрос](/handbook/action-custom-request) +- [Запуск workflow](/handbook/workflow/manual/triggers/custom-action) diff --git a/docs/ru-RU/handbook/ui/blocks/data-blocks/list.md b/docs/ru-RU/handbook/ui/blocks/data-blocks/list.md new file mode 100644 index 0000000000..dbed79b62f --- /dev/null +++ b/docs/ru-RU/handbook/ui/blocks/data-blocks/list.md @@ -0,0 +1,79 @@ +### **Блок списка** + +#### **Введение** + +Блок списка отображает данные в формате списка и подходит для таких сценариев, как списки задач, новости, информация о товарах и другие случаи представления данных. + +#### **Добавление блока** + +#### **Параметры настройки блока** + +![Параметры](https://static-docs.nocobase.com/20240417224539.png) + +##### **Настройка диапазона данных** + +Как показано на изображении: фильтр по умолчанию выбирает заказы со статусом «Возврат». + +![Диапазон данных](https://static-docs.nocobase.com/20240417224701.png) + +Более подробно см. в разделе [Настройка диапазона данных](/handbook/ui/blocks/block-settings/data-scope). + +##### **Настройка правил сортировки** + +Как показано на изображении: заказы сортируются по сумме заказа в порядке убывания. + +![Сортировка](https://static-docs.nocobase.com/20240417225302.png) + +Более подробно см. в разделе [Настройка правил сортировки](/handbook/ui/blocks/block-settings/sorting-rule). + +##### **Настройка метода загрузки данных** + +Обычно используется совместно с блоком фильтрации — данные загружаются только после применения фильтра. + +Более подробно см. в разделе [Настройка метода загрузки данных](/handbook/ui/blocks/block-settings/loading-mode). + +##### **Настройка высоты блока** + +Пример: установка высоты блока списка заказов в режим «Полная высота». + +![Высота](https://static-docs.nocobase.com/20240604233102.gif) + +Более подробно см. в разделе [Высота блока](/handbook/ui/blocks/block-settings/block-height). + +- [Редактировать заголовок блока](/handbook/ui/blocks/block-settings/block-title) +- [Сохранить как шаблон блока](/handbook/block-template) + +#### **Настройка полей** + +##### **Поля основной таблицы** + +![Основные поля](https://static-docs.nocobase.com/20240417230027.png) + +##### **Поля связанных таблиц** + +![Связанные поля](https://static-docs.nocobase.com/20240417230115.png) + +Более подробно о настройке полей списка см. в разделе [Поля детализации](/handbook/ui/fields/generic/detail-form-item). + +#### **Настройка действий** + +##### **Глобальные действия** + +![Глобальные действия](https://static-docs.nocobase.com/20240421115811.png) + +- [Фильтр](/handbook/ui/actions/types/filter) +- [Добавить новое](/handbook/ui/actions/types/add-new) +- [Обновить](/handbook/ui/actions/types/refresh) +- [Импорт](/handbook/action-import) +- [Экспорт](/handbook/action-export) + +##### **Действия со строками** + +![Действия со строками](https://static-docs.nocobase.com/20240418114424.png) + +- [Просмотр](/handbook/ui/actions/types/view) +- [Редактирование](/handbook/ui/actions/types/edit) +- [Удаление](/handbook/ui/actions/types/delete) +- [Всплывающее окно](/handbook/ui/actions/types/pop-up) +- [Обновить запись](/handbook/ui/actions/types/update-record) +- [Пользовательский запрос](/handbook/action-custom-request) diff --git a/docs/ru-RU/handbook/ui/blocks/data-blocks/table.md b/docs/ru-RU/handbook/ui/blocks/data-blocks/table.md new file mode 100644 index 0000000000..8b91fd2cfa --- /dev/null +++ b/docs/ru-RU/handbook/ui/blocks/data-blocks/table.md @@ -0,0 +1,91 @@ +# Table Block + +## Введение + +Блок таблицы - один из основных блоков данных в NocoBase, отображающий и управляющий структурированными данными в табличной форме. Он обладает гибкими настройками для кастомизации столбцов, ширины колонок, правил сортировки, области данных и включает различные встроенные действия: фильтрация, добавление, дублирование, редактирование, удаление и другие. + +## Добавление блоков + +<video width="100%" height="440" controls> + <source src="https://static-docs.nocobase.com/20240415215027.mp4" type="video/mp4"> +</video> + +## Настройки блока + +![20240415215319](https://static-docs.nocobase.com/20240415215319.png) + +### Область данных + +Пример: Фильтр по умолчанию для счетов со статусом "Отправлено". + +![20240415215404](https://static-docs.nocobase.com/20240415215404.png) + +Подробнее см. [Настройка области данных](/handbook/ui/blocks/block-settings/data-scope). + +### Настройка правил сортировки + +Пример: Отображение счетов в обратном порядке по дате отправки. + +![20240415215509](https://static-docs.nocobase.com/20240415215509.png) + +Подробнее см. [Настройка правил сортировки](/handbook/ui/blocks/block-settings/sorting-rule). + +### Подключение блоков данных + +Пример: Связь блока таблицы заказов с блоком деталей заказа для синхронизации фильтрации. + +<video width="100%" height="440" controls> + <source src="https://static-docs.nocobase.com/20240415221426.mp4" type="video/mp4"> +</video> + +Подробнее см. [Подключение блоков данных](/handbook/ui/blocks/block-settings/connect-block). + +- [Редактирование заголовка блока](/handbook/ui/blocks/block-settings/block-title) +- [Настройка режима загрузки данных](/handbook/ui/blocks/block-settings/loading-mode) +- [Сохранение как шаблон блока](/handbook/block-template) + +## Настройка полей + +### Поля текущей коллекции + +![20240415223714](https://static-docs.nocobase.com/20240415223714.png) + +### Поля связанных коллекций + +![20240415223746](https://static-docs.nocobase.com/20240415223746.png) + +### Отображение наследуемых полей таблицы (поля родительской таблицы) + +Пример: Таблица арендных заказов наследуется от таблицы заказов. + +![20240415224242](https://static-docs.nocobase.com/20240415224242.png) + +Настройки полей столбцов таблицы см. в [Поля столбцов таблицы](/handbook/ui/fields/generic/table-column). + +## Настройка действий + +### Глобальные действия + +![20240415225525](https://static-docs.nocobase.com/20240415225525.png) + +- [Фильтрация](/handbook/ui/actions/types/filter) +- [Добавление](/handbook/ui/actions/types/add-new) +- [Удаление](/handbook/ui/actions/types/delete) +- [Обновление](/handbook/ui/actions/types/refresh) +- [Импорт](/handbook/action-import) +- [Экспорт](/handbook/action-export) +- [Добавление записи](/handbook/action-add-record) +- [Массовое обновление](/handbook/action-bulk-update) +- [Массовое редактирование](/handbook/action-bulk-edit) + +### Действия со строками + +![20240415225657](https://static-docs.nocobase.com/20240415225657.png) + +- [Просмотр](/handbook/ui/actions/types/view) +- [Редактирование](/handbook/ui/actions/types/edit) +- [Дублирование](/handbook/action-duplicate) +- [Удаление](/handbook/ui/actions/types/delete) +- [Всплывающее окно](/handbook/ui/actions/types/pop-up) +- [Обновление записи](/handbook/ui/actions/types/update-record) +- [Пользовательский запрос](/handbook/action-custom-request) diff --git a/docs/ru-RU/handbook/ui/blocks/filter-blocks/collapse.md b/docs/ru-RU/handbook/ui/blocks/filter-blocks/collapse.md new file mode 100644 index 0000000000..892474efea --- /dev/null +++ b/docs/ru-RU/handbook/ui/blocks/filter-blocks/collapse.md @@ -0,0 +1,38 @@ +# Collapse Filter Block + +## Введение + +Блок фильтрации Collapse необходимо использовать в связке с блоком данных для предоставления возможностей фильтрации для блока данных. Он поддерживает выбор связанных полей и полей с опциями в качестве фильтрующих полей, отображая их в свертываемом панельном виде. + +## Добавление блока + +![20240408212222](https://static-docs.nocobase.com/20240408212222.png) + +Пример: Настройка блока сворачивания заказов и блока таблицы заказов для реализации связанной фильтрации. + +<video width="100%" height="440" controls> + <source src="https://static-docs.nocobase.com/20240408212817.mp4" type="video/mp4"> +</video> + +## Настройки блока + +![20240421173427](https://static-docs.nocobase.com/20240421173427.png) + +### Подключение блоков данных + +Пример: Подключение того же блока таблицы данных во всплывающем окне для реализации связанной фильтрации. + +<video width="100%" height="440" controls> + <source src="https://static-docs.nocobase.com/20240408214743.mp4" type="video/mp4"> +</video> + +Для получения дополнительной информации см. [Подключение блоков данных](/handbook/ui/blocks/block-settings/connect-block) + +- [Редактирование заголовка блока](/handbook/ui/blocks/block-settings/block-title) +- [Сохранение как шаблон блока](/handbook/block-template) + +## Настройка полей + +Только реляционные поля и поля с опциями поддерживаются в качестве фильтрующих полей. + +![20240408212301](https://static-docs.nocobase.com/20240408212301.png) diff --git a/docs/ru-RU/handbook/ui/blocks/filter-blocks/form.md b/docs/ru-RU/handbook/ui/blocks/filter-blocks/form.md new file mode 100644 index 0000000000..f1996a3b87 --- /dev/null +++ b/docs/ru-RU/handbook/ui/blocks/filter-blocks/form.md @@ -0,0 +1,60 @@ +### **Блок фильтрации формы** + +#### **Введение** + +Блок фильтрации формы может быть подключён к блоку данных. После подключения он предоставляет возможность фильтрации. + +#### **Добавление блока** + +<video width="100%" height="440" controls> + <source src="https://static-docs.nocobase.com/20240426172722.mp4" type="video/mp4"> +</video> + +#### **Настройки блока** + +![20240421172115](https://static-docs.nocobase.com/20240421172115.png) + +##### **Подключение к блоку данных** + +Пример: блок фильтрации формы подключается к блоку детализации данных для реализации связывания. + +<video width="100%" height="440" controls> + <source src="https://static-docs.nocobase.com/20240421170947.mp4" type="video/mp4"> +</video> + +Более подробно см. в разделе [Подключение к блоку данных](/handbook/ui/blocks/block-settings/connect-block) + +- [Редактировать заголовок блока](/handbook/ui/blocks/block-settings/block-title) +- [Правила связывания](/handbook/ui/blocks/block-settings/field-linkage-rule) +- [Сохранить как шаблон блока](/handbook/block-template) + +#### **Настройка полей** + +##### **Поля в текущей коллекции** + +![20240421171135](https://static-docs.nocobase.com/20240421171135.png) + +##### **Поля в связанных коллекциях** +> Начиная с версии v1.3.14-beta поддерживаются настройки полей связей «многие ко многим» и «один ко многим». + +Поддерживается использование полей связанных коллекций в качестве условий фильтрации. + +**Пример:** Коллекция «Заказы» имеет поле связи «многие к одному» — «Клиент». Фильтрация заказов осуществляется по имени и номеру телефона клиента. + +<video width="100%" height="440" controls> + <source src="https://static-docs.nocobase.com/20240421171437.mp4" type="video/mp4"> +</video> + +##### **Установка значений по умолчанию для полей** + +Как и в обычном [блоке формы](/handbook/ui/blocks/data-blocks/form), можно задавать значения по умолчанию для обычных и связанных полей. **Если поле имеет значение по умолчанию, при первой загрузке страницы автоматически запускается операция фильтрации, и подключённый блок данных отображает соответствующие данные.** + +#### **Настройка операций** + +![Операции фильтрации](https://static-docs.nocobase.com/20240421171839.png) + +##### **Кнопка «Сбросить»** + +По умолчанию при нажатии кнопки «Сбросить» значения по умолчанию полей сохраняются. Если требуется очистить и значения по умолчанию, можно открыть параметры настройки и включить опцию «Очистить значения по умолчанию». + +![20240716183611](https://static-docs.nocobase.com/20240716183611.png) diff --git a/docs/ru-RU/handbook/ui/blocks/index.md b/docs/ru-RU/handbook/ui/blocks/index.md new file mode 100644 index 0000000000..8650356340 --- /dev/null +++ b/docs/ru-RU/handbook/ui/blocks/index.md @@ -0,0 +1,61 @@ +# Блоки + +Блоки являются контейнерами для данных и контента. Они могут размещаться на Страницах, в Модальных окнах или Выдвижных панелях, причем несколько блоков можно свободно перетаскивать и компоновать. + +## Типы блоков + +![Типы блоков](https://static-docs.nocobase.com/f71af45b5cd914ea0558f760ddbbba58.png) + +- **Блоки данных**: Используются для отображения данных из источников в интерфейсе. +- **Блоки фильтров**: Используют данные из источников как критерии фильтрации для других блоков данных. +- **Прочие блоки**: Содержат специфический или независимый контент (задачи workflow, журналы аудита, Markdown и т.д.). + +## Добавление блоков + +Блоки могут размещаться на Страницах, в Модальных окнах или Выдвижных панелях. + +### Блоки на странице + +Доступные типы блоков на странице: +- Блоки данных +- Блоки фильтров +- Прочие блоки + +![](https://static-docs.nocobase.com/dad0a394d33dd26f31c3202a76bb0153.png) + +### Блоки во всплывающих окнах (Модальных или Выдвижных) + +Всплывающие окна бывают двух видов: Модальные и Выдвижные. Как и страницы, они могут содержать блоки, но обычно используются для добавления, редактирования или просмотра отдельных записей. Доступные типы блоков: +- Блоки данных +- Прочие блоки + +![2024-04-10_11-27-04](https://static-docs.nocobase.com/2024-04-10_11-27-04.png) + +## Конструктор блоков + +Каждый блок имеет три значка в правом верхнем углу (слева направо): +1. Перетаскивание для изменения расположения +2. Быстрое добавление блока +3. Настройка блока + +![](https://static-docs.nocobase.com/b488f3013532a246df59b89c0688a58f.png) + +Простые блоки (например, Markdown) содержат все настройки в пункте "Настройка блока". + +![](https://static-docs.nocobase.com/f37e277863068b2661f66d4020af806a.png) + +Сложные блоки данных дополнительно предоставляют: +- "Настройка полей" +- "Настройка действий" + +![](https://static-docs.nocobase.com/71b550da637d23145a5f62d48ee8521b.png) + +Также возможны более сложные вложенные структуры, например в Блоках диаграмм. + +![](https://static-docs.nocobase.com/07588190b3f41ae3060e71d8b76b4447.png) + +## Компоновка блоков + +Расположение нескольких блоков можно изменять перетаскиванием. + +![](https://static-docs.nocobase.com/f6692295ac0917f3babce9a60ce80879.gif) diff --git a/docs/ru-RU/handbook/ui/blocks/other-blocks/markdown.md b/docs/ru-RU/handbook/ui/blocks/other-blocks/markdown.md new file mode 100644 index 0000000000..4d10e1eea8 --- /dev/null +++ b/docs/ru-RU/handbook/ui/blocks/other-blocks/markdown.md @@ -0,0 +1,110 @@ +# Markdown Block + +## Введение + +Блоки Markdown могут использоваться без привязки к источнику данных. Они определяются с использованием синтаксиса Markdown и подходят для отображения форматированного текстового содержимого. + +## Добавление блоков + +Блоки Markdown можно добавлять внутри страниц или всплывающих окон. + +![20240612205004](https://static-docs.nocobase.com/20240612205004.png) + +Встроенные блоки Markdown также можно добавлять внутри блоков форм и блоков с деталями. + +![20240612205215](https://static-docs.nocobase.com/20240612205215.png) + +## Шаблонизатор + +### Строковые шаблоны + +Используйте `{{xxx}}` для интерполяции. + +![20240817175031](https://static-docs.nocobase.com/20240817175031.png) + +### Handlebars + +Поддерживает использование богатого синтаксиса, такого как условия и циклы, для динамического генерации HTML-контента. + +![20240817175355](https://static-docs.nocobase.com/20240817175355.png) + +![20240817175501](https://static-docs.nocobase.com/20240817175501.png) + +Для получения дополнительной информации обратитесь к [Handlebars шаблонам](/handbook/template-handlebars). + +## Использование переменных + +Поддерживаемые переменные в Markdown зависят от местоположения. + +Markdown на странице поддерживает общие системные переменные, такие как текущий пользователь, текущая роль, переменные даты и т. д. + +![20240612205857](https://static-docs.nocobase.com/20240612205857.png) + +Markdown во всплывающих окнах операций со строками блоков (или подстраницах) поддерживает больше переменных контекста данных, таких как текущая запись, текущая запись всплывающего окна и т. д. + +![20240612210333](https://static-docs.nocobase.com/20240612210333.png) + +### Связанные данные в переменных + +Например, заказ/доставка (один к одному). + +Используйте переменную 'текущая запись всплывающего окна' в блоке Markdown всплывающего окна деталей операции, чтобы отобразить номер доставки текущего заказа. + +#### Строковые шаблоны автоматически обрабатывают связанные данные (путем автоматической загрузки необходимых связанных данных) + +![20241210165519](https://static-docs.nocobase.com/20241210165519.png) + +![20241210165541](https://static-docs.nocobase.com/20241210165541.png) + +#### В настоящее время Handlebars не поддерживает предварительную загрузку связанных данных. Пользователям необходимо явно настроить соответствующие связанные поля в блоке данных, чтобы получить соответствующие данные во время рендеринга. + +![20241210165625](https://static-docs.nocobase.com/20241210165625.png) + +После настройки связанного поля 'Доставка' в блоке таблицы заказов, блок Markdown в деталях операции (с использованием Handlebars) сможет получить доступ и отобразить связанные данные. + +![20241210165655](https://static-docs.nocobase.com/20241210165655.png) + +### Правила синтаксиса + +Помимо разницы в предварительной загрузке связанных данных, между двумя шаблонами также есть различия в правилах синтаксиса. Например, при использовании переменных со связью "многие ко многим" полученные данные обычно представляют собой массив. Два шаблона по-разному обрабатывают данные типа массива. + +Например, заказ/продукт (многие ко многим) + +Используйте переменную 'текущая запись всплывающего окна' в блоке Markdown всплывающего окна деталей операции, чтобы отобразить названия продуктов, связанных с текущим заказом (несколько элементов). + +#### Строковые шаблоны отображают массивы, разделяя элементы запятыми (',') + +![20241210170508](https://static-docs.nocobase.com/20241210170508.png) + +![20241210170545](https://static-docs.nocobase.com/20241210170545.png) + +#### Шаблоны Handlebars используют `#each` для перебора данных массива + +![20241210205357](https://static-docs.nocobase.com/20241210205357.png) + +Связанные данные, которые будут использоваться, должны быть настроены в блоке данных + +![20241210170814](https://static-docs.nocobase.com/20241210170814.png) + +```javascript +<ul> + {{#each $nPopupRecord.products }} + <li>{{this.product_name}}</li> + {{/each}} +</ul> +``` + +Для более подробного знакомства с переменными ознакомьтесь с разделом [Редактирование UI / Переменные](/handbook/ui/variables). + +## QR-коды + +Markdown также поддерживает настройку QR-кодов, которые можно использовать в сочетании с переменными. + +```html +<qr-code value="https://www.nocobase.com/" type="svg"></qr-code> +``` + +## План развития + +- Запланировано или в процессе + - Поддержка предварительной загрузки связанных данных в Handlebars. diff --git a/docs/ru-RU/handbook/ui/blocks/other-blocks/workflow-approval.md b/docs/ru-RU/handbook/ui/blocks/other-blocks/workflow-approval.md new file mode 100644 index 0000000000..733d1976e2 --- /dev/null +++ b/docs/ru-RU/handbook/ui/blocks/other-blocks/workflow-approval.md @@ -0,0 +1,3 @@ +# Рабочий процесс: Блоки утверждения + +<embed src="../../../workflow-approval/block.md#L3-L999"></embed> diff --git a/docs/ru-RU/handbook/ui/blocks/other-blocks/workflow-manual-todos.md b/docs/ru-RU/handbook/ui/blocks/other-blocks/workflow-manual-todos.md new file mode 100644 index 0000000000..e11d528b65 --- /dev/null +++ b/docs/ru-RU/handbook/ui/blocks/other-blocks/workflow-manual-todos.md @@ -0,0 +1,3 @@ +# Рабочий процесс: Ручной блок задач + +<embed src="../../../workflow-manual/block.md#L3-L999"></embed> diff --git a/docs/ru-RU/handbook/ui/blocks/static/BEmxbD2SgoUTDexnYjzcmh7Knhg.png b/docs/ru-RU/handbook/ui/blocks/static/BEmxbD2SgoUTDexnYjzcmh7Knhg.png new file mode 100644 index 0000000000..a2479759d1 Binary files /dev/null and b/docs/ru-RU/handbook/ui/blocks/static/BEmxbD2SgoUTDexnYjzcmh7Knhg.png differ diff --git a/docs/ru-RU/handbook/ui/blocks/static/EicAbMa7Jo2MD9x8FSfcpgTGnHc.png b/docs/ru-RU/handbook/ui/blocks/static/EicAbMa7Jo2MD9x8FSfcpgTGnHc.png new file mode 100644 index 0000000000..45698aa228 Binary files /dev/null and b/docs/ru-RU/handbook/ui/blocks/static/EicAbMa7Jo2MD9x8FSfcpgTGnHc.png differ diff --git a/docs/ru-RU/handbook/ui/blocks/static/ImutbF0YDoWldOxrPilcwQFHnSe.png b/docs/ru-RU/handbook/ui/blocks/static/ImutbF0YDoWldOxrPilcwQFHnSe.png new file mode 100644 index 0000000000..32ab59bd33 Binary files /dev/null and b/docs/ru-RU/handbook/ui/blocks/static/ImutbF0YDoWldOxrPilcwQFHnSe.png differ diff --git a/docs/ru-RU/handbook/ui/blocks/static/JNiLb7rksoY07ox092ycaarenGd.png b/docs/ru-RU/handbook/ui/blocks/static/JNiLb7rksoY07ox092ycaarenGd.png new file mode 100644 index 0000000000..d5b5018b25 Binary files /dev/null and b/docs/ru-RU/handbook/ui/blocks/static/JNiLb7rksoY07ox092ycaarenGd.png differ diff --git a/docs/ru-RU/handbook/ui/blocks/static/L0aJb1V9DoETnNxrr1gcz0g0nDb.png b/docs/ru-RU/handbook/ui/blocks/static/L0aJb1V9DoETnNxrr1gcz0g0nDb.png new file mode 100644 index 0000000000..cc7603c71d Binary files /dev/null and b/docs/ru-RU/handbook/ui/blocks/static/L0aJb1V9DoETnNxrr1gcz0g0nDb.png differ diff --git a/docs/ru-RU/handbook/ui/blocks/static/OpBcbf9UlooZ5UxZDwwcHZi8nWf.png b/docs/ru-RU/handbook/ui/blocks/static/OpBcbf9UlooZ5UxZDwwcHZi8nWf.png new file mode 100644 index 0000000000..717d3ea48e Binary files /dev/null and b/docs/ru-RU/handbook/ui/blocks/static/OpBcbf9UlooZ5UxZDwwcHZi8nWf.png differ diff --git a/docs/ru-RU/handbook/ui/blocks/static/PSD8bf1fzoZkIUxJW7lc4XuGnee.png b/docs/ru-RU/handbook/ui/blocks/static/PSD8bf1fzoZkIUxJW7lc4XuGnee.png new file mode 100644 index 0000000000..b8aeaf4f3a Binary files /dev/null and b/docs/ru-RU/handbook/ui/blocks/static/PSD8bf1fzoZkIUxJW7lc4XuGnee.png differ diff --git a/docs/ru-RU/handbook/ui/blocks/static/Tvjfb4qr4osyzxxPKdRcfn1knsd.png b/docs/ru-RU/handbook/ui/blocks/static/Tvjfb4qr4osyzxxPKdRcfn1knsd.png new file mode 100644 index 0000000000..77c986e9d2 Binary files /dev/null and b/docs/ru-RU/handbook/ui/blocks/static/Tvjfb4qr4osyzxxPKdRcfn1knsd.png differ diff --git a/docs/ru-RU/handbook/ui/blocks/static/Uo6ubaMwFo5bi1xVMU5cshlTn1g.png b/docs/ru-RU/handbook/ui/blocks/static/Uo6ubaMwFo5bi1xVMU5cshlTn1g.png new file mode 100644 index 0000000000..4abc2a9a88 Binary files /dev/null and b/docs/ru-RU/handbook/ui/blocks/static/Uo6ubaMwFo5bi1xVMU5cshlTn1g.png differ diff --git a/docs/ru-RU/handbook/ui/blocks/static/XjdHbvC9ZotdQAx8GJoczwoancc.gif b/docs/ru-RU/handbook/ui/blocks/static/XjdHbvC9ZotdQAx8GJoczwoancc.gif new file mode 100644 index 0000000000..a43b0c6712 Binary files /dev/null and b/docs/ru-RU/handbook/ui/blocks/static/XjdHbvC9ZotdQAx8GJoczwoancc.gif differ diff --git a/docs/ru-RU/handbook/ui/blocks/static/image.png b/docs/ru-RU/handbook/ui/blocks/static/image.png new file mode 100644 index 0000000000..9f9954a8a6 Binary files /dev/null and b/docs/ru-RU/handbook/ui/blocks/static/image.png differ diff --git a/docs/ru-RU/handbook/ui/fields/association-field.md b/docs/ru-RU/handbook/ui/fields/association-field.md new file mode 100644 index 0000000000..4c48f5ec75 --- /dev/null +++ b/docs/ru-RU/handbook/ui/fields/association-field.md @@ -0,0 +1,85 @@ +# Компоненты полей связей + +## Введение + +Компоненты полей связей в NocoBase помогают отображать и работать со связанными данными. Они универсальны для любых типов связей и настраиваются под конкретные задачи. + +### Выпадающий список + +Используется по умолчанию для связей (кроме файловых коллекций). Отображает значение поля-заголовка для быстрого выбора связанных данных. + +![20240429205659](https://static-docs.nocobase.com/20240429205659.png) + +Подробнее: [Выпадающий список](/handbook/ui/fields/specific/select) + +### Выбор записи + +Отображает данные во всплывающем окне. Позволяет настраивать поля связей для точного выбора. + +![20240429210824](https://static-docs.nocobase.com/20240429210824.png) + +Подробнее: [Выбор записи](/handbook/ui/fields/specific/picker) + +### Каскадный выбор + +Подходит для древовидных коллекций. Позволяет выбирать данные по иерархии (регионы, категории и т.д.). + +![20240429213256](https://static-docs.nocobase.com/20240429213256.png) + +Подробнее: [Каскадный выбор](/handbook/ui/fields/specific/cascade-select) + +### Подформа + +Позволяет работать со сложными связями прямо на текущей странице без лишних всплывающих окон. + +![20240429215953](https://static-docs.nocobase.com/20240429215953.png) + +Подробнее: [Подформа](/handbook/ui/fields/specific/nester) + +### Подформа (всплывающая) + +Упрощает основную форму, вынося редко используемые поля во всплывающее окно. + +![20240429222237](https://static-docs.nocobase.com/20240429222237.gif) + +Подробнее: [Подформа (всплывающая)](/handbook/ui/fields/specific/popover-nester) + +### Подтаблица + +Отображает связи "один-ко-многим" в виде таблицы с возможностью пакетного добавления. + +![20240429222505](https://static-docs.nocobase.com/20240429222505.png) + +Подробнее: [Подтаблица](/handbook/ui/fields/specific/sub-table) + +### Подробности + +Режим чтения для подформы с вложенным отображением связанных данных. + +![20240822223651](https://static-docs.nocobase.com/20240822223651.png) + +Подробнее: [Подробности](/handbook/ui/fields/specific/sub-detail) + +### Файловый менеджер + +Специальный компонент для связей с файловыми коллекциями. + +![20240429222753](https://static-docs.nocobase.com/20240429222753.png) + +Подробнее: [Файловый менеджер](/handbook/ui/fields/specific/file-manager) + +### Заголовок + +Отображает ключевую информацию связанных данных в режиме чтения. + +![20240429223646](https://static-docs.nocobase.com/20240429223646.png) + +Подробнее: [Заголовок](/handbook/ui/fields/specific/title) + +### Тег + +Классифицирует и маркирует связанные данные с использованием цветового поля. + +![20240429225054](https://static-docs.nocobase.com/20240429225054.png) + +Подробнее: [Тег](/handbook/ui/fields/specific/tag) diff --git a/docs/ru-RU/handbook/ui/fields/field-settings/data-scope.md b/docs/ru-RU/handbook/ui/fields/field-settings/data-scope.md new file mode 100644 index 0000000000..debcc7f71a --- /dev/null +++ b/docs/ru-RU/handbook/ui/fields/field-settings/data-scope.md @@ -0,0 +1,35 @@ +# Настройка области данных + +## Введение + +Область данных для полей связей аналогична настройке области данных для блоков, позволяя задавать критерии фильтрации по умолчанию для связанных данных. + +## Инструкция + +![20240422153711](https://static-docs.nocobase.com/20240422153711.png) + +### Статическое значение + +Пример: В качестве связанных элементов можно выбрать только товары, которые сейчас в продаже. + +![20240422155953](https://static-docs.nocobase.com/20240422155953.png) + +### Переменное значение + +Пример: В качестве связанных элементов можно выбрать только товары с датой производства ранее прошлого месяца. + +![20240422163640](https://static-docs.nocobase.com/20240422163640.png) + +Подробнее о переменных: [Переменные](/handbook/ui/variables) + +### Связь полей отношений + +Поля связей могут быть связаны через настройку области данных. + +Пример: В форме заказа есть поле связи "многие-ко-многим" для "Товаров" и "многие-к-одному" для "Клиентов". В таблице товаров есть поле связи "многие-ко-многим" для "Клиентов". В блоке формы заказа выбираемые товары - это те, что связаны с клиентом, выбранным в текущей форме. + +![20240422154145](https://static-docs.nocobase.com/20240422154145.png) + +<video width="100%" height="440" controls> + <source src="https://static-docs.nocobase.com/20240422155351.mp4" type="video/mp4"> +</video> diff --git a/docs/ru-RU/handbook/ui/fields/field-settings/default-value.md b/docs/ru-RU/handbook/ui/fields/field-settings/default-value.md new file mode 100644 index 0000000000..c8cd389435 --- /dev/null +++ b/docs/ru-RU/handbook/ui/fields/field-settings/default-value.md @@ -0,0 +1,124 @@ +### **Значения по умолчанию** + +#### **Введение** + +Значения по умолчанию — это начальные значения полей в новой записи. Вы можете задать значения по умолчанию при настройке полей в таблице данных или указать их для полей в блоке формы создания записи. Эти значения могут быть константами или переменными. + +#### **Где можно настроить значения по умолчанию?** + +##### **Поля таблицы данных** + +![Поля таблицы](https://static-docs.nocobase.com/20240411095933.png) + +##### **Поля в формах создания** + +Большинство полей в формах создания поддерживают установку значений по умолчанию. + +![Поля в форме](https://static-docs.nocobase.com/20240411100030.png) + +##### **Добавление подформ** + +При добавлении подформ в форме создания или редактирования, новые связанные данные будут заполняться значениями по умолчанию. + +**Подформа «Добавить новое»** + +![Подформа](https://static-docs.nocobase.com/20240411100341.png) + +**Вложенная таблица «Добавить новое»** + +![Вложенная таблица](https://static-docs.nocobase.com/20240411100424.png) +![Пример](https://static-docs.nocobase.com/20240411100634.png) + +При редактировании существующих данных, если поле пустое, оно не будет заполнено значением по умолчанию. Значения по умолчанию применяются только к новым записям и не сохраняются в таблице. + +![Пример](https://static-docs.nocobase.com/20240411100729.png) + +#### **Значения по умолчанию для связанных данных** + +Значения по умолчанию доступны только для типов связей «многие к одному» и «многие ко многим», если используются компоненты выбора (Select, RecordPicker). + +![Связанные данные](https://static-docs.nocobase.com/20240411101025.png) + +#### **Переменные значений по умолчанию** + +##### **Какие переменные доступны?** + +- Переменные даты; +- Текущий пользователь; +- Текущая запись (понятие применимо только к существующим данным); +- Текущая форма (желательно, чтобы отображались только поля формы); +- Текущий объект (понятие для каждой строки данных во вложенной форме); +- Записи, выбранные в таблице (пока доступно только для комбинации «Блок таблицы + Форма добавления записи»). + +Более подробно о переменных см. в разделе [Переменные](/handbook/ui/variables). + +#### **Типы переменных для значений по умолчанию** + +Существует два типа: переменные для независимых полей и переменные для связанных полей. + +##### **Переменные для значений по умолчанию в связанных полях** + +- Объект переменной должен быть записью коллекции; +- Данные должны быть из таблицы на пути наследования (текущая таблица или родительская/дочерняя); +- Переменная «Записи, выбранные в таблице» доступна только для полей связи «многие ко многим» и «один ко многим / многие к одному»; +- При работе с несколькими уровнями данных — применяется выравнивание (flatten) и удаление дубликатов. + +```js +// Записи, выбранные в таблице: +[{id:1},{id:2},{id:3},{id:4}] + +// Записи, выбранные в таблице / один к одному: +[{one-to-one: {id:2}}, {one-to-one: {id:3}}, {one-to-one: {id:3}}] +// После выравнивания и удаления дубликатов +[{id: 2}, {id: 3}] + +// Записи, выбранные в таблице / многие ко многим: +[{many-to-many: [{id: 1}, {id:2}]}, {many-to-many: [{id:3}, {id:4}]}] +// После выравнивания +[{id:1},{id:2},{id:3},{id:4}] +``` + +##### **Переменные для значений по умолчанию в независимых полях** + +- Тип должен быть совместимым (например, строки совместимы с числами, объекты с методом toString); +- Поля JSON — особые, могут хранить данные любого типа. + +#### **Иерархия полей (опциональные поля)** + +![Иерархия](https://static-docs.nocobase.com/20240411101157.png) + +**Для независимых полей:** +- При выборе полей с несколькими уровнями поддерживается только связь «один к одному»; «многие ко многим» не поддерживается; +- Поля JSON — особые, могут иметь меньше ограничений. + +**Для связанных полей:** +- `hasOne`: поддерживает только «один к одному»; +- `hasMany`: поддерживает «один к одному» (внутренне преобразуется) и «многие ко многим»; +- `belongsToMany`: поддерживает «один к одному» (внутренне преобразуется) и «многие ко многим»; +- `belongsTo`: обычно для «один к одному», но если родительская связь `hasMany`, то поддерживается и «многие ко многим» (так как `hasMany`/`belongsTo` по сути является «многие ко многим»). + +#### **Особые случаи** + +«Многие ко многим» эквивалентно комбинации «один ко многим / многие к одному». + +**Модель** + +![Модель](https://static-docs.nocobase.com/20240411101558.png) + +При установке переменной значения по умолчанию для связи «многие ко многим», если переменная содержит несколько записей, будут выбраны все эти записи, как показано ниже: + +Когда таблица в блоке и таблица поля связи — одна и та же. + +![Пример](https://static-docs.nocobase.com/20240411103021.png) + +#### **Почему связи «один к одному» и «один ко многим» не поддерживают значения по умолчанию?** + +Например, в связи A.B, если b1 связан с a1, он не может быть связан с a2. Если b1 свяжут с a2 — он отвяжется от a1. В этом случае данные не являются общими, а значения по умолчанию работают по принципу общего доступа (обе записи могут быть связаны). Поэтому для «один к одному» и «один ко многим» значения по умолчанию недоступны. + +#### **Почему во вложенных формах и таблицах с «многие к одному» и «многие ко многим» нельзя задавать значения по умолчанию?** + +Потому что вложенные формы и таблицы предназначены для прямого редактирования связанных данных (включая добавление и удаление), а значения по умолчанию работают по механизму общего доступа (обе записи могут быть связаны), но не изменяют данные связи. Поэтому в этом сценарии значения по умолчанию неуместны. + +Кроме того, во вложенных формах и таблицах есть подполя, и становится неясно, к чему относится значение по умолчанию — к строкам или столбцам. + +Учитывая это, правильнее не разрешать устанавливать значения по умолчанию для любых типов вложенных форм и таблиц. diff --git a/docs/ru-RU/handbook/ui/fields/field-settings/display-title.md b/docs/ru-RU/handbook/ui/fields/field-settings/display-title.md new file mode 100644 index 0000000000..15b58bb416 --- /dev/null +++ b/docs/ru-RU/handbook/ui/fields/field-settings/display-title.md @@ -0,0 +1,10 @@ +# Отображать заголовок + +## Введение + +Эта опция определяет, будут ли отображаться заголовки полей. По умолчанию она включена, но позволяет отключить ее в зависимости от требований к оформлению, при необходимости скрывая отображение заголовка. + +![20240411113316](https://static-docs.nocobase.com/20240411113316.png) + + +![20240411113353](https://static-docs.nocobase.com/20240411113353.png) diff --git a/docs/ru-RU/handbook/ui/fields/field-settings/edit-description.md b/docs/ru-RU/handbook/ui/fields/field-settings/edit-description.md new file mode 100644 index 0000000000..3bddb4bee8 --- /dev/null +++ b/docs/ru-RU/handbook/ui/fields/field-settings/edit-description.md @@ -0,0 +1,11 @@ +# Редактировать описание + +## Введение + +Описания полей - это короткий текст, выделенный светло-серым цветом под компонентом "Поле", который может быть использован для того, чтобы помочь пользователям понять назначение поля и требования к вводу данных. + +![20240411114048](https://static-docs.nocobase.com/20240411114048.png) + +![20240423111043](https://static-docs.nocobase.com/20240423111043.png) + +![20240411114433](https://static-docs.nocobase.com/20240411114433.png) diff --git a/docs/ru-RU/handbook/ui/fields/field-settings/edit-title.md b/docs/ru-RU/handbook/ui/fields/field-settings/edit-title.md new file mode 100644 index 0000000000..51a316dbee --- /dev/null +++ b/docs/ru-RU/handbook/ui/fields/field-settings/edit-title.md @@ -0,0 +1,10 @@ +# Изменить название поля + +## Введение + +Название поля относится к имени или метке, определяемой полем, которые могут быть персонализированы в соответствии с потребностями различных блоков. + +![20240411110825](https://static-docs.nocobase.com/20240411110825.png) + + +![20240418093955](https://static-docs.nocobase.com/20240418093955.png) diff --git a/docs/ru-RU/handbook/ui/fields/field-settings/edit-tooltip.md b/docs/ru-RU/handbook/ui/fields/field-settings/edit-tooltip.md new file mode 100644 index 0000000000..3e01ea4415 --- /dev/null +++ b/docs/ru-RU/handbook/ui/fields/field-settings/edit-tooltip.md @@ -0,0 +1,9 @@ +# Редактировать всплывающую подсказку + +## Введение + +Когда пользователь наводит курсор мыши на поле, появляется всплывающая подсказка с дополнительной информацией или рекомендациями. Эта всплывающая подсказка обычно содержит такие сведения, как назначение поля, формат ввода и любые ограничения, помогая пользователям лучше понимать и использовать поле.![20240412112137](https://static-docs.nocobase.com/20240412112137.png) + +![20240412112218](https://static-docs.nocobase.com/20240412112218.png) + +![20240412112247](https://static-docs.nocobase.com/20240412112247.png) diff --git a/docs/ru-RU/handbook/ui/fields/field-settings/field-component.md b/docs/ru-RU/handbook/ui/fields/field-settings/field-component.md new file mode 100644 index 0000000000..f9179273b5 --- /dev/null +++ b/docs/ru-RU/handbook/ui/fields/field-settings/field-component.md @@ -0,0 +1,13 @@ +# Компонент поля + +## Введение + +Некоторые поля поддерживают несколько компонентов, что позволяет нам выбрать наиболее подходящий для отображения значения поля. Например, компонент `URL" можно переключить на компонент `Предварительный просмотр`. + +![20240807092556](https://static-docs.nocobase.com/20240807092556.png) + +![20240807092716](https://static-docs.nocobase.com/20240807092716.png) + +![20240807092859](https://static-docs.nocobase.com/20240807092859.png) + +Если вам нужно развернуть дополнительные компоненты, обратитесь к [Развернуть компоненты поля значений](/plugin-samples/field/value).。 diff --git a/docs/ru-RU/handbook/ui/fields/field-settings/number-format.md b/docs/ru-RU/handbook/ui/fields/field-settings/number-format.md new file mode 100644 index 0000000000..fb55dc5275 --- /dev/null +++ b/docs/ru-RU/handbook/ui/fields/field-settings/number-format.md @@ -0,0 +1,23 @@ +# Числовой формат + +## Введение + +**Числовой формат** - это процесс визуального улучшения и стандартизации числовых полей (включая поля формул), чтобы сделать их более удобочитаемыми. Это включает в себя настройку таких параметров, как разделители на тысячи, десятичная точность, преобразование единиц измерения и научная нотация. Настраивая числовое форматирование, вы можете учитывать предпочтения в числовых выражениях для различных регионов и отраслей промышленности. + +![20240417220017](https://static-docs.nocobase.com/20240417220017.png) + +![20240417220039](https://static-docs.nocobase.com/20240417220039.png) + +## Инструкции по использованию + +Эта функция поддерживает простое преобразование единиц измерения, тысячные разделители, префиксы и суффиксы, точную настройку и научную нотацию. + +Пример: Отформатируйте сумму заказа таким образом, чтобы она включала символ валюты (например, символ китайского юаня ¥), разделители в тысячах (например, запятые или точки) и определенную десятичную точность, чтобы сумма была понятной. + +<video width="100%" height="440" controls> + <source src="https://static-docs.nocobase.com/20240417220140.mp4" type="video/mp4"> +</video> + +Используемая научная нотация. + +![20240417220416](https://static-docs.nocobase.com/20240417220416.png) diff --git a/docs/ru-RU/handbook/ui/fields/field-settings/pattern.md b/docs/ru-RU/handbook/ui/fields/field-settings/pattern.md new file mode 100644 index 0000000000..611ef0fd0b --- /dev/null +++ b/docs/ru-RU/handbook/ui/fields/field-settings/pattern.md @@ -0,0 +1,11 @@ +# Шаблон + +##### Введение + +В отличие от блоков, компоненты field предлагают три различных шаблона, особенно для полей в формах. Переключение между этими режимами настраивает соответствующие параметры конфигурации полей. + +- Редактируемый +- Доступный только для чтения (не редактируемый) +- Удобный для чтения (режим просмотра) + +![20240411112743](https://static-docs.nocobase.com/20240411112743.png) diff --git a/docs/ru-RU/handbook/ui/fields/field-settings/required.md b/docs/ru-RU/handbook/ui/fields/field-settings/required.md new file mode 100644 index 0000000000..057c18c096 --- /dev/null +++ b/docs/ru-RU/handbook/ui/fields/field-settings/required.md @@ -0,0 +1,23 @@ +# Обязательные поля + +## Введение + +"Обязательный" - это фундаментальное правило проверки формы. Вы можете включить его непосредственно в настройках поля или динамически настроить с помощью правил привязки формы. + +## Статическая настройка + +Вы можете напрямую указать обязательное поле, что идеально подходит для полей, которые всегда должны заполняться пользователями, таких как имя пользователя и пароль. + +![20240411114641](https://static-docs.nocobase.com/20240411114641.png) + +## Динамическая настройка (требуется при определенных условиях) + +Обязательные поля можно задать условно, используя правила привязки блока формы. + +Пример: Поле даты отправки становится обязательным, когда статус заказа помечен как "отправлено". + +![20240412110939](https://static-docs.nocobase.com/20240412110939.png) + +<video width="100%" height="440" controls> + <source src="https://static-docs.nocobase.com/20240417112915.mp4" type="video/mp4"> +</video> diff --git a/docs/ru-RU/handbook/ui/fields/field-settings/style.md b/docs/ru-RU/handbook/ui/fields/field-settings/style.md new file mode 100644 index 0000000000..f5d9cd3721 --- /dev/null +++ b/docs/ru-RU/handbook/ui/fields/field-settings/style.md @@ -0,0 +1,29 @@ +# Настройка стилей + +## Введение +Правила привязки стилей полей являются важным инструментом для улучшения взаимодействия с пользователем. Динамическая настройка стилей улучшает визуальный эффект элемента и помогает пользователям быстро идентифицировать ключевую информацию. К основным свойствам стиля относятся: + +- `цвет" +- `цвет фона` +- `выравнивание текста` +- `размер шрифта` +- `вес шрифта` +- `стиль шрифта` + +Обычно используются для выделения ключевой информации на основе статуса поля, указания аномалий или визуального указания. + +## Использование + +Пример: Динамически измените цвет поля сумма заказа в зависимости от суммы заказа. Если сумма заказа превышает 1000, установите зеленый цвет; если сумма заказа меньше или равна 1000, установите красный цвет. + +![20250418171434](https://static-docs.nocobase.com/20250418171434.png) + +- **Правило 1**: Установите условие на **сумму заказа, превышающую 10000**, и цвет поля будет зеленым. + +![20250418171640](https://static-docs.nocobase.com/20250418171640.png) + +- **Правило 2**: Установите условие на **сумму заказа, меньшую или равную 1000**, и цвет поля будет красным. + +![20250418171900](https://static-docs.nocobase.com/20250418171900.png) + +Для получения более подробной информации обратитесь к [Правилам подключения](/handbook/ui/linkage-rule). diff --git a/docs/ru-RU/handbook/ui/fields/field-settings/title-field.md b/docs/ru-RU/handbook/ui/fields/field-settings/title-field.md new file mode 100644 index 0000000000..59f6f97617 --- /dev/null +++ b/docs/ru-RU/handbook/ui/fields/field-settings/title-field.md @@ -0,0 +1,23 @@ +# Поле заголовка + +## Введение + +Поле заголовка является ключевым элементом в компонентах реляционных полей, служащим видимым идентификатором реляционных данных в пользовательском интерфейсе. + +## Расположение конфигурации для поля заголовка + +### Глобальная конфигурация в таблице данных + +Этот параметр применяется ко всему приложению. + +![20240422210646](https://static-docs.nocobase.com/20240422210646.png) + +### Настройка в компонентах реляционных полей + +Эта настройка ограничена конкретным блоком и имеет приоритет над глобальными настройками. + +![20240422210935](https://static-docs.nocobase.com/20240422210935.png) + +![20240422211020](https://static-docs.nocobase.com/20240422211020.png) + +![20240422211116](https://static-docs.nocobase.com/20240422211116.png) diff --git a/docs/ru-RU/handbook/ui/fields/field-settings/validation-rules.md b/docs/ru-RU/handbook/ui/fields/field-settings/validation-rules.md new file mode 100644 index 0000000000..a1e62b4809 --- /dev/null +++ b/docs/ru-RU/handbook/ui/fields/field-settings/validation-rules.md @@ -0,0 +1,27 @@ +# Правила проверки + +## Введение + +Настройка правил проверки имеет решающее значение для обеспечения соответствия введенных пользователем данных ожидаемым стандартам. Несмотря на наличие предустановленных форматов проверки, пользователи также могут гибко определять пользовательские правила. + +![20240411112215](https://static-docs.nocobase.com/20240411112215.png) + +Мы предоставляем несколько предустановленных форматов проверки для часто используемых типов данных, включая числовые значения, идентификационные номера, адреса электронной почты и номера телефонов. + +![20240411112413](https://static-docs.nocobase.com/20240411112413.png) + +### Проверка длины/размера + +Эта функция позволяет проверять минимальное значение числовых данных, при этом текущая поддержка ограничивается константами. + +<video width="100%" height="440" controls> + <source src="https://static-docs.nocobase.com/20240417111233.mp4" type="video/mp4"> +</video> + +### Проверка пользовательских регулярных выражений + +Пример: Создайте пользовательское регулярное выражение для проверки сингапурских телефонных номеров и настройте соответствующие сообщения об ошибках. + +![20240417222427](https://static-docs.nocobase.com/20240417222427.png) + +![20240417222548](https://static-docs.nocobase.com/20240417222548.png) diff --git a/docs/ru-RU/handbook/ui/fields/generic/bulk-edit-form-item.md b/docs/ru-RU/handbook/ui/fields/generic/bulk-edit-form-item.md new file mode 100644 index 0000000000..0f572a141b --- /dev/null +++ b/docs/ru-RU/handbook/ui/fields/generic/bulk-edit-form-item.md @@ -0,0 +1,30 @@ +# Массовое редактирование полей + +## Введение + +Форма массового редактирования - это специализированный блок для пакетного изменения данных. + +![20240425100652](https://static-docs.nocobase.com/20240425100652.png) +![20240422151115](https://static-docs.nocobase.com/20240422151115.png) + +## Настройка полей + +Доступна настройка только полей текущей таблицы. Доступны три метода обновления: + +- **Без изменений:** Поле сохраняет исходное значение +- **Изменить на:** Поле становится обязательным для заполнения +- **Очистить:** Значение поля сбрасывается + +![20240425100730](https://static-docs.nocobase.com/20240425100730.png) + +Для полей связей доступно переключение между различными компонентами. + +![20240425100857](https://static-docs.nocobase.com/20240425100857.png) + +## Параметры настройки полей + +- [Изменение названия поля](/handbook/ui/fields/field-settings/edit-title) +- [Отображаемое название](/handbook/ui/fields/field-settings/display-title) +- [Описание поля](/handbook/ui/fields/field-settings/edit-description) +- [Всплывающая подсказка](/handbook/ui/fields/field-settings/edit-tooltip) +- [Правила валидации](/handbook/ui/fields/field-settings/validation-rules) diff --git a/docs/ru-RU/handbook/ui/fields/generic/detail-form-item.md b/docs/ru-RU/handbook/ui/fields/generic/detail-form-item.md new file mode 100644 index 0000000000..cc64863e87 --- /dev/null +++ b/docs/ru-RU/handbook/ui/fields/generic/detail-form-item.md @@ -0,0 +1,46 @@ +### **Поля детализации** + +#### **Введение** + +В блоках детализации, списках и сетках конфигурация полей в целом одинакова и в основном сосредоточена на способе отображения полей в режиме просмотра. + +![20240409131155](https://static-docs.nocobase.com/20240409131155.png) + +#### **Параметры настройки полей** + +##### **Форматирование поля даты** + +![20240417223807](https://static-docs.nocobase.com/20240417223807.png) + +Более подробную информацию см. в разделе [Форматирование даты](/handbook/ui/fields/specific/date-picker). + +##### **Форматирование числового поля** + +![20240417223608](https://static-docs.nocobase.com/20240417223608.png) + +Функция поддерживает базовые преобразования единиц измерения, разделители тысяч, настройку префиксов и суффиксов, установку точности и научную нотацию. + +![20240417223709](https://static-docs.nocobase.com/20240417223709.png) + +Более подробно см. в разделе [Форматирование чисел](/handbook/ui/fields/field-settings/number-format). + +- [Редактировать заголовок поля](/handbook/ui/fields/field-settings/edit-title) +- [Отображать заголовок](/handbook/ui/fields/field-settings/display-title) +- [Редактировать описание поля](/handbook/ui/fields/field-settings/edit-description) +- [Редактировать всплывающую подсказку поля](/handbook/ui/fields/field-settings/edit-tooltip) + +##### **Компонент поля** + +Некоторые поля позволяют переключаться на разные компоненты. Например, компонент `URL` можно изменить на компонент `Preview` (Просмотр). + +![20240806165321](https://static-docs.nocobase.com/20240806165321.png) + +Если необходимо добавить больше компонентов, см. раздел [Расширение компонентов полей со значениями](/plugin-samples/field/value). + +##### **Стиль** + +![2024-06-26-15-16-09-表单样式入口](https://static-docs.nocobase.com/2024-06-26-15-16-09-%E8%A1%A8%E5%8D%95%E9%A3%8E%E6%A0%BC%E5%85%A5%E5%8F%A3.png) + +![2024-06-26-15-21-31-样式配置](https://static-docs.nocobase.com/2024-06-26-15-21-31-%E6%A0%B7%E5%BC%8F%E9%85%8D%E7%BD%AE.png) + +![2024-06-26-15-22-42-表单-最终效果](https://static-docs.nocobase.com/2024-06-26-15-22-42-%E8%A1%A8%E5%8D%95-%E6%9C%80%E7%BB%88%E6%95%88%E6%9E%9C.png) diff --git a/docs/ru-RU/handbook/ui/fields/generic/filter-collapse-item.md b/docs/ru-RU/handbook/ui/fields/generic/filter-collapse-item.md new file mode 100644 index 0000000000..fe3cd2dd6a --- /dev/null +++ b/docs/ru-RU/handbook/ui/fields/generic/filter-collapse-item.md @@ -0,0 +1,31 @@ +# Поля сворачиваемой панели + +## Введение + +Блок сворачиваемого фильтра поддерживает только реляционные поля и поля с вариантами выбора в качестве критериев фильтрации. + +## Настройки полей + +![20240409120906](https://static-docs.nocobase.com/20240409120906.png) + +### Установка области данных + +Определение области данных для реляционных полей. + +![20240422152530](https://static-docs.nocobase.com/20240422152530.png) + +Пример: Фильтрация товаров без акционных предложений. + +![20240422152614](https://static-docs.nocobase.com/20240422152614.png) + +Дополнительная информация: [Установка области данных](/handbook/ui/fields/field-settings/data-scope). + +### Поле заголовка + +![20240423085854](https://static-docs.nocobase.com/20240423085854.png) + +Подробнее: [Поле заголовка](/handbook/ui/fields/field-settings/title-field). + +- Отображение по умолчанию (свёрнуто) +- Определение правил сортировки (для реляционных данных) +- Настройка заголовка diff --git a/docs/ru-RU/handbook/ui/fields/generic/filter-form-item.md b/docs/ru-RU/handbook/ui/fields/generic/filter-form-item.md new file mode 100644 index 0000000000..043884abd2 --- /dev/null +++ b/docs/ru-RU/handbook/ui/fields/generic/filter-form-item.md @@ -0,0 +1,28 @@ +### **Блоки фильтрации — Поля формы** + +#### **Введение** + +Форма фильтрации позволяет выбирать поля как из текущей таблицы, так и из связанных таблиц (включая поля по связям), чтобы использовать их в качестве критериев фильтрации. + +![20240409100014](https://static-docs.nocobase.com/20240409100014.png) + +**Пример:** Предположим, вы хотите фильтровать заказы, используя поля из связанной таблицы. Таблицы «Заказы» и «Клиенты» связаны отношением «один ко многим». В этом случае вы можете настроить поля «Имя клиента» и «Номер телефона» из таблицы «Клиенты» в качестве критериев фильтрации, чтобы сузить список заказов. + +![20240422151626](https://static-docs.nocobase.com/20240422151626.png) + +#### **Параметры настройки полей** + +##### **Операторы** + +Выбор правильных операторов фильтрации имеет важное значение для повышения точности и эффективности поиска. Для полей типа «строка» по умолчанию включено нечёткое совпадение. + +![20240412112748](https://static-docs.nocobase.com/20240412112748.png) + +![20240412112823](https://static-docs.nocobase.com/20240412112823.png) + +![20240422151953](https://static-docs.nocobase.com/20240422151953.png) + +- [Редактировать заголовок поля](/handbook/ui/fields/field-settings/edit-title) +- [Отображать заголовок](/handbook/ui/fields/field-settings/display-title) +- [Редактировать описание поля](/handbook/ui/fields/field-settings/edit-description) +- [Редактировать всплывающую подсказку поля](/handbook/ui/fields/field-settings/edit-tooltip) diff --git a/docs/ru-RU/handbook/ui/fields/generic/form-item.md b/docs/ru-RU/handbook/ui/fields/generic/form-item.md new file mode 100644 index 0000000000..680bf7a8bc --- /dev/null +++ b/docs/ru-RU/handbook/ui/fields/generic/form-item.md @@ -0,0 +1,59 @@ +# Блоки данных - Поля формы + +## Введение + +Различные типы полей формы имеют разные параметры конфигурации, позволяя пользователям расширять их через плагины для удовлетворения индивидуальных потребностей. + +![20240408221914](https://static-docs.nocobase.com/20240408221914.png) + +Поля связанных таблиц (связи один-к-одному или многие-к-одному) отображаются только для чтения. + +![20240413222636](https://static-docs.nocobase.com/20240413222636.png) + +<video width="100%" height="440" controls> + <source src="https://static-docs.nocobase.com/20240413223027.mp4" type="video/mp4"> +</video> + +## Настройки полей + +### Значения по умолчанию + +Поддержка установки констант/переменных в качестве значений по умолчанию. + +![20240417094124](https://static-docs.nocobase.com/20240417094124.png) + +Подробнее: [Установка значений по умолчанию](/handbook/ui/fields/field-settings/default-value). + +### Настройка правил валидации + +![20240417095037](https://static-docs.nocobase.com/20240417095037.png) + +Подробнее: [Настройка правил валидации](/handbook/ui/fields/field-settings/validation-rules). + +### Обязательные поля + +![20240417111850](https://static-docs.nocobase.com/20240417111850.png) + +Подробнее: [Обязательные поля](/handbook/ui/fields/field-settings/required). + +- [Изменение названия поля](/handbook/ui/fields/field-settings/edit-title) +- [Отображаемое название](/handbook/ui/fields/field-settings/display-title) +- [Описание поля](/handbook/ui/fields/field-settings/edit-description) +- [Всплывающая подсказка](/handbook/ui/fields/field-settings/edit-tooltip) +- [Шаблон](/handbook/ui/fields/field-settings/pattern) + +### Компоненты полей + +Некоторые поля поддерживают переключение между компонентами. Например, компонент `URL` можно переключить на компонент `Предпросмотр`. + +![20240806164801](https://static-docs.nocobase.com/20240806164801.png) + +Для расширения компонентов см.: [Расширение компонентов полей значений](/plugin-samples/field/value). + +### Стиль + +В режиме чтения можно настроить стиль формы. + +![2024-06-26-15-16-09-Form Style Entry](https://static-docs.nocobase.com/2024-06-26-15-16-09-表单风格入口.png) +![2024-06-26-15-21-31-Style Configuration](https://static-docs.nocobase.com/2024-06-26-15-21-31-样式配置.png) +![2024-06-26-15-22-42-Final Form Effect](https://static-docs.nocobase.com/2024-06-26-15-22-42-表单-最终效果.png) diff --git a/docs/ru-RU/handbook/ui/fields/generic/table-column.md b/docs/ru-RU/handbook/ui/fields/generic/table-column.md new file mode 100644 index 0000000000..a90f0628d8 --- /dev/null +++ b/docs/ru-RU/handbook/ui/fields/generic/table-column.md @@ -0,0 +1,72 @@ +### **Поля таблицы** + +#### **Введение** + +Поля таблицы предлагают расширенный набор функций, выходящих за рамки базовой настройки ширины столбца, заголовков полей и сортировки. Они обеспечивают улучшенные параметры отображения для специализированных полей, таких как поля даты, связанных данных и числовые поля, позволяя более точно и информативно представлять данные. + +![20240511140644](https://static-docs.nocobase.com/20240511140644.png) + +#### **Параметры настройки полей** + +##### **Форматирование поля даты** + +![20240417114116](https://static-docs.nocobase.com/20240417114116.png) + +Полная информация о параметрах форматирования даты доступна в руководстве [Форматирование даты](/handbook/ui/fields/specific/date-picker). + +##### **Форматирование числового поля** + +![20240417215229](https://static-docs.nocobase.com/20240417215229.png) + +Функция форматирования числовых полей включает следующие возможности: +- Простое преобразование единиц +- Разделители тысяч +- Префиксы и суффиксы +- Настройка точности +- Научная нотация + +![20240417215425](https://static-docs.nocobase.com/20240417215425.png) + +Подробное описание возможностей форматирования чисел доступно в документации [Форматирование чисел](/handbook/ui/fields/field-settings/number-format). + +##### **Сортировка** + +Текущая функция сортировки позволяет сортировать данные по одному столбцу на текущей странице. Обратите внимание, что в данной версии сортировка по полям связей не поддерживается. + +![20240422115501](https://static-docs.nocobase.com/20240422115501.png) + +##### **Фиксированные столбцы** + +![20240511140524](https://static-docs.nocobase.com/20240511140524.png) + +##### **Компоненты полей** + +Некоторые поля позволяют переключаться между разными типами компонентов. Например, компонент `URL` можно изменить на компонент `Preview` (Просмотр). + +![20240806165152](https://static-docs.nocobase.com/20240806165152.png) + +Разработчикам, желающим расширить доступный набор компонентов, рекомендуется ознакомиться с руководством [Расширение компонентов полей со значениями](/plugin-samples/field/value). + +##### **Стили** + +Функция стилей позволяет динамически настраивать цвет текста и фона столбца в зависимости от заданных условий. Чтобы продемонстрировать эту мощную функцию, рассмотрим пример с таблицей детализации банковских транзакций: + +**Сценарий:** Мы хотим визуально различать доходы (положительные суммы) и расходы (отрицательные суммы) в столбце «Сумма транзакции». + +**Пошаговое руководство:** + +1. Откройте настройки поля «Сумма транзакции» и перейдите к параметру «Стиль». +![style-menu-2024-08-08-18-23-13](https://static-docs.nocobase.com/style-menu-2024-08-08-18-23-13.png) + +2. Создайте первое условное правило: для положительных сумм (доходы) установите зелёный цвет текста. + - Нажмите «Добавить правило связывания» + - Настройте: когда сумма транзакции > 0, применить зелёный цвет +![style-green-2024-08-08-18-33-34](https://static-docs.nocobase.com/style-green-2024-08-08-18-33-34.png) + +3. Создайте второе условное правило: для отрицательных сумм (расходы) установите красный цвет текста. + - Снова нажмите «Добавить правило связывания» + - Настройте: когда сумма транзакции < 0, применить красный цвет +![style-red-2024-08-08-18-35-01](https://static-docs.nocobase.com/style-red-2024-08-08-18-35-01.png) + +Результат — наглядное визуальное представление финансовых данных: +![result-2024-08-08-18-38-05](https://static-docs.nocobase.com/result-2024-08-08-18-38-05.png) diff --git a/docs/ru-RU/handbook/ui/fields/index.md b/docs/ru-RU/handbook/ui/fields/index.md new file mode 100644 index 0000000000..a5d99e071a --- /dev/null +++ b/docs/ru-RU/handbook/ui/fields/index.md @@ -0,0 +1,33 @@ +### **Поля** + +В пользовательском интерфейсе поля — это компоненты, которые служат контейнерами для отдельных единиц данных. Различные типы данных отображаются с помощью разных компонентов полей. Поля должны быть привязаны к блокам и не могут функционировать самостоятельно. + +#### **Поля внутри блоков** + +Поля, как правило, используются не изолированно, а как вложенные элементы в блоках с данными. Такие блоки обычно содержат раздел «Настроенные колонки», в котором представлен список полей из текущей таблицы данных. + +![](https://static-docs.nocobase.com/c5ea18ad1847332fe78075413f23de46.png) + +#### **Конструктор полей (панель инструментов)** + +Как и блоки, компоненты полей имеют три иконки в правом верхнем углу: + +- Перетаскивание для изменения макета +- Быстрое добавление поля +- Настройка параметров поля + +![](https://static-docs.nocobase.com/30cc5fcaeeb171862f79449a72a7fcf9.png) + +#### **Макет полей** + +Вы можете настраивать макет полей внутри блока, перетаскивая и изменяя порядок полей по своему усмотрению. + +![](https://static-docs.nocobase.com/0825ea8c014c9073f505e74f707ded66.gif) + +#### **Компоненты полей** + +Некоторые поля поддерживают переключение между различными компонентами. Например, компонент `URL` можно изменить на компонент `Preview` (Просмотр). + +![20240806164801](https://static-docs.nocobase.com/20240806164801.png) + +Если необходимо добавить дополнительные компоненты, см. раздел [Расширение компонентов полей со значениями](/plugin-samples/field/value). diff --git a/docs/ru-RU/handbook/ui/fields/specific/cascade-select.md b/docs/ru-RU/handbook/ui/fields/specific/cascade-select.md new file mode 100644 index 0000000000..bd20f0f900 --- /dev/null +++ b/docs/ru-RU/handbook/ui/fields/specific/cascade-select.md @@ -0,0 +1,21 @@ +### **Каскадный выбор** + +#### **Введение** + +Каскадный селектор предназначен для полей связи, целевая таблица которых имеет древовидную структуру. Он позволяет выбирать данные по уровням иерархии дерева и поддерживает нечёткий поиск для упрощения процесса выбора. + +#### **Инструкция** + +- Для связей «один к одному» каскадный селектор настраивается на единичный выбор. + +![20240409205542](https://static-docs.nocobase.com/20240409205542.png) + +- Для связей «один ко многим» каскадный селектор поддерживает множественный выбор и позволяет сортировать выбранные элементы перетаскиванием. + +![20240409210705](https://static-docs.nocobase.com/20240409210705.png) + +#### **Параметры настройки поля** + +- [Поле заголовка](/handbook/ui/fields/field-settings/title-field): определяет отображаемое содержимое в каскадном компоненте (поле заголовка), что упрощает идентификацию. + +- [Компонент поля](/handbook/ui/fields/association-field): предоставляет возможность переключения на другие компоненты полей связи, такие как выпадающие списки, выбор данных и другие. diff --git a/docs/ru-RU/handbook/ui/fields/specific/date-picker.md b/docs/ru-RU/handbook/ui/fields/specific/date-picker.md new file mode 100644 index 0000000000..c0069b195c --- /dev/null +++ b/docs/ru-RU/handbook/ui/fields/specific/date-picker.md @@ -0,0 +1,21 @@ +# Поле выбора даты + +## Введение + +Поле даты предоставляет гибкие возможности настройки форматов отображения даты и времени. + +## Настройка форматов даты + +### Поля таблицы данных + +![20240417114311](https://static-docs.nocobase.com/20240417114311.png) + +### Настройки поля + +![20240409174158](https://static-docs.nocobase.com/20240409174158.png) + +Помимо предустановленных форматов даты и времени, система поддерживает пользовательские форматы для индивидуальной настройки отображения. + +![20240409174559](https://static-docs.nocobase.com/20240409174559.png) + +![20240422165602](https://static-docs.nocobase.com/20240422165602.png) diff --git a/docs/ru-RU/handbook/ui/fields/specific/file-manager.md b/docs/ru-RU/handbook/ui/fields/specific/file-manager.md new file mode 100644 index 0000000000..90e9938a3f --- /dev/null +++ b/docs/ru-RU/handbook/ui/fields/specific/file-manager.md @@ -0,0 +1,13 @@ +# Файловый менеджер + +## Введение + +Файловый менеджер представляет собой специализированный компонент для работы со связями, где целевая таблица является файловой таблицей. Этот инструмент оптимизирует управление файлами в структуре базы данных. + +![20240410213026](https://static-docs.nocobase.com/20240410213026.png) + +## Настройки поля + +- [Компонент поля](/handbook/ui/fields/association-field): Возможность переключения между различными компонентами полей связей (выпадающие списки, селекторы данных и др.) +- Быстрая загрузка: Включена по умолчанию, позволяет мгновенно ассоциировать файлы после загрузки +- Выбор файла: Также включен по умолчанию, предоставляет возможность ассоциировать ранее загруженные файлы diff --git a/docs/ru-RU/handbook/ui/fields/specific/nester.md b/docs/ru-RU/handbook/ui/fields/specific/nester.md new file mode 100644 index 0000000000..a9f160087f --- /dev/null +++ b/docs/ru-RU/handbook/ui/fields/specific/nester.md @@ -0,0 +1,40 @@ +### **Вложенная форма (Nester)** + +#### **Введение** + +Вложенные формы — это удобное решение для сценариев, в которых связанные данные необходимо создать до их привязки. Они позволяют отображать многоранговые связанные данные в виде чёткой вложенной структуры. В отличие от выбора данных и выпадающих списков, вложенные формы дают возможность напрямую управлять полями связанной таблицы в рамках текущего блока страницы. Кроме того, они обеспечивают одновременную отправку связанных данных вместе с основной формой. + +#### **Инструкция по использованию** + +##### **Вложенные формы для связей «многие ко многим»** + +![20240409213911](https://static-docs.nocobase.com/20240409213911.png) + +Удобное отображение вложенных многоуровневых связей, например, товаров и их остатков на складе. + +![20240422172545](https://static-docs.nocobase.com/20240422172545.png) + +##### **Вложенные формы для связей «один к одному»** + +![20240409214419](https://static-docs.nocobase.com/20240422172545.png) + +#### **Параметры настройки поля** + +##### **Добавление/связывание нескольких записей (включено по умолчанию)** + +При активации этой функции пользователи могут добавлять несколько записей, просто нажимая на значок «+». + +![20240422172237](https://static-docs.nocobase.com/20240422172237.png) + +##### **Компонент поля** + +[Компонент поля](/handbook/ui/fields/association-field): переключение на другие компоненты полей связи, например, выпадающий список, выбор данных и др. + +##### **Правила связывания** +:::info{title=Подсказка} +Требуется версия NocoBase **v1.3.17-beta или выше**. +::: + +![20240906083737_rec_](https://static-docs.nocobase.com/20240906083737_rec_.gif) + +Более подробную информацию см. в разделе [Правила связывания](/handbook/ui/blocks/block-settings/field-linkage-rule) diff --git a/docs/ru-RU/handbook/ui/fields/specific/picker.md b/docs/ru-RU/handbook/ui/fields/specific/picker.md new file mode 100644 index 0000000000..7fafef6352 --- /dev/null +++ b/docs/ru-RU/handbook/ui/fields/specific/picker.md @@ -0,0 +1,45 @@ +# Выбор записей + +## Введение + +**Выбор записей** представлен в виде всплывающего табличного селектора, позволяющего: +- Выбирать существующие ассоциации данных для целевой таблицы +- Добавлять новые данные в целевую таблицу с последующей ассоциацией + +![20240410114516](https://static-docs.nocobase.com/20240410114516.png) + +Пример: таблица заказов содержит поле связи "многие-ко-многим" - "Товары". + +Уже выбранные данные не отображаются в табличном селекторе. + +<video width="100%" height="440" controls> + <source src="https://static-docs.nocobase.com/20240410121032.mp4" type="video/mp4"> +</video> + +В табличном селекторе доступно управление целевой таблицей (добавление, удаление, импорт, экспорт и др.). + +![20240410115239](https://static-docs.nocobase.com/20240410115239.png) + +## Настройки поля + +### Разрешить добавление данных + +Позволяет добавлять данные в целевую таблицу с последующим выбором. + +<video width="100%" height="440" controls> + <source src="https://static-docs.nocobase.com/20240422214222.mp4" type="video/mp4"> +</video> + +### Разрешить множественное добавление/ассоциацию + +Ограничивает множественные связи, разрешая ассоциировать только один элемент данных. + +### Поле-заголовок + +![20240422205632](https://static-docs.nocobase.com/20240422205632.gif) + +Подробнее: [Поле-заголовок](/handbook/ui/fields/field-settings/title-field) + +- [Размер всплывающего окна](/handbook/ui/actions/action-settings/popup-size) + +- [Компоненты полей](/handbook/ui/fields/association-field) diff --git a/docs/ru-RU/handbook/ui/fields/specific/popover-nester.md b/docs/ru-RU/handbook/ui/fields/specific/popover-nester.md new file mode 100644 index 0000000000..d8071056cd --- /dev/null +++ b/docs/ru-RU/handbook/ui/fields/specific/popover-nester.md @@ -0,0 +1,46 @@ +### **Вложенное всплывающее окно (Popover Nester)** + +#### **Введение** + +В сложных связанных таблицах с глубокой иерархией и большим количеством полей бывает сложно наглядно представить связи между данными в формате подформы. Решение «Подформа (всплывающее окно)» улучшает отображение, представляя связанные подформы в удобном всплывающем виде, что упрощает взаимодействие с данными и их визуализацию. + +#### **Инструкция по использованию** + +##### **Во вложенной таблице** + +![20240422204245](https://static-docs.nocobase.com/20240422204245.png) + +![20240422204155](https://static-docs.nocobase.com/20240422204155.png) + +##### **В блоках формы** + +![20240430094409](https://static-docs.nocobase.com/20240430094409.png) + +#### **Параметры настройки поля** + +##### **Поле заголовка** + +![20240409230258](https://static-docs.nocobase.com/20240409230258.png) + +Значение поля заголовка динамически отображается снаружи всплывающего окна, обеспечивая актуальное обновление информации в реальном времени. + +![20240409225851](https://static-docs.nocobase.com/20240409225851.png) + +##### **Разрешить добавление/связывание нескольких записей (включено по умолчанию)** + +По умолчанию можно добавлять или связывать несколько записей. При отключении этой опции можно добавить или связать только одну запись. + +![20240422202542](https://static-docs.nocobase.com/20240422202542.png) + +##### **Компонент поля** + +[Компонент поля](/handbook/ui/fields/association-field): переключение на другие компоненты полей связи, например, выпадающий список, выбор данных и др. + +##### **Правила связывания** +:::info{title=Подсказка} +Требуется версия NocoBase **v1.3.17-beta или выше**. +::: + +![20240906085955_rec_](https://static-docs.nocobase.com/20240906085955_rec_.gif) + +Более подробную информацию см. в разделе [Правила связывания](/handbook/ui/blocks/block-settings/field-linkage-rule) diff --git a/docs/ru-RU/handbook/ui/fields/specific/select.md b/docs/ru-RU/handbook/ui/fields/specific/select.md new file mode 100644 index 0000000000..bcbf103113 --- /dev/null +++ b/docs/ru-RU/handbook/ui/fields/specific/select.md @@ -0,0 +1,59 @@ +# Выбор (Select) + +## Введение + +Селектор предоставляет удобный способ выбора или ассоциации данных в целевой таблице, как для существующих записей, так и для новых. Выпадающие варианты поддерживают нечеткий поиск для удобной навигации. + +![20240409230638](https://static-docs.nocobase.com/20240409230638.png) + +## Настройки поля + +### Быстрое создание: сначала добавление, затем выбор + +#### Добавление через выпадающее меню + +Новые данные в целевой таблице автоматически выбираются и связываются при отправке формы. Идеально для простых сценариев, например тегов. + +Пример: таблица заказов содержит поле связи "многие-ко-многим" - "Тег" + +<video width="100%" height="440" controls> + <source src="https://static-docs.nocobase.com/20240410113002.mp4" type="video/mp4"> +</video> + +#### Добавление через всплывающее окно + +Позволяет настроить новую форму во всплывающем окне, подходит для сложных сценариев, например товаров. + +Пример: таблица заказов содержит поле связи "многие-ко-многим" - "Товары" + +<video width="100%" height="440" controls> + <source src="https://static-docs.nocobase.com/20240410113351.mp4" type="video/mp4"> +</video> + +### Установка диапазона данных + +Определяет, какие данные будут отображаться в выпадающем списке. + +![20240422204957](https://static-docs.nocobase.com/20240422204957.png) + +Подробнее: [Установка диапазона данных](/handbook/ui/fields/field-settings/data-scope) + +### Настройка правил сортировки + +Определяет порядок отображения вариантов в выпадающем списке. + +Пример: отображение в порядке убывания по дате производства. + +![20240422205340](https://static-docs.nocobase.com/20240422205340.png) + +### Разрешить множественное добавление/ассоциацию + +Ограничивает связь в полях "многие-ко-многим" одним элементом данных. + +### Поле-заголовок + +![20240422205632](https://static-docs.nocobase.com/20240422205632.gif) + +Подробнее: [Поле-заголовок](/handbook/ui/fields/field-settings/title-field) + +- [Компоненты полей](/handbook/ui/fields/association-field) diff --git a/docs/ru-RU/handbook/ui/fields/specific/sub-detail.md b/docs/ru-RU/handbook/ui/fields/specific/sub-detail.md new file mode 100644 index 0000000000..955c411a0e --- /dev/null +++ b/docs/ru-RU/handbook/ui/fields/specific/sub-detail.md @@ -0,0 +1,42 @@ +### **Вложенная детализация (Sub detail)** + +#### **Введение** + +Вложенная детализация — это специализированный компонент для подформ в режиме просмотра. В отличие от компонентов «метка» и «заголовок», вложенная детализация позволяет отображать более объёмные данные из текущей таблицы и настраивать отображение связанных таблиц. Это обеспечивает наглядное представление многоранговых связанных данных в виде вложенной структуры. + +#### **Инструкция** + +##### **Вложенная детализация для полей связи «многие ко многим»** + +![20240822225058](https://static-docs.nocobase.com/20240822225058.png) + +Функция поддерживает вложенное отображение полей с многоуровневыми связями, например: Заказы/Товары/Остатки или Заказы/Товары/Поставщики. + +![20240822225231](https://static-docs.nocobase.com/20240822225231.png) + +##### **Вложенная детализация для полей связи «один к одному»** + +![20240822230215](https://static-docs.nocobase.com/20240822230215.png) + +#### **Параметры настройки поля** + +##### **Настройка правил сортировки** + +Можно изменить порядок отображения данных в связях «многие ко многим». + +![20240822230359](https://static-docs.nocobase.com/20240822230359.png) + +![20240822230422](https://static-docs.nocobase.com/20240822230422.png) + +##### **Компонент поля** + +[Компонент поля](/handbook/ui/fields/association-field): переключение на другие компоненты полей связи, например, выпадающий список, выбор данных и др. + +##### **Правила связывания** +:::info{title=Подсказка} +Требуется версия NocoBase **v1.3.17-beta или выше**. +::: + +![20240906090603_rec_](https://static-docs.nocobase.com/20240906090603_rec_.gif) + +Более подробную информацию см. в разделе [Правила связывания](/handbook/ui/blocks/block-settings/field-linkage-rule) diff --git a/docs/ru-RU/handbook/ui/fields/specific/sub-table.md b/docs/ru-RU/handbook/ui/fields/specific/sub-table.md new file mode 100644 index 0000000000..9220d44d64 --- /dev/null +++ b/docs/ru-RU/handbook/ui/fields/specific/sub-table.md @@ -0,0 +1,59 @@ +# Подтаблица + +## Введение + +Подтаблицы идеально подходят для управления полями связей "многие-ко-многим". Они поддерживают: +- Массовое создание данных целевой таблицы с ассоциациями +- Выбор из существующих данных для ассоциации + +## Инструкция по использованию + +![20240410151306](https://static-docs.nocobase.com/20240410151306.png) + +Разные типы полей в подтаблице отображаются различными компонентами. Крупные поля (например, rich text, JSON, многострочный текст) редактируются через всплывающее окно. + +![20240410154316](https://static-docs.nocobase.com/20240410154316.png) + +Пример связей в подтаблице: +Заказ (один-ко-многим) > Товар (один-ко-многим) > Склад. + +![20240410152232](https://static-docs.nocobase.com/20240410152232.png) + +По умолчанию компоненты полей связей - выпадающие списки (с поддержкой выбора данных или подформ через всплывающие окна). + +![20240410152847](https://static-docs.nocobase.com/20240410152847.png) + +Поддержка перетаскивания для сортировки. + +![20240422215629](https://static-docs.nocobase.com/20240422215629.gif) + +## Настройки полей + +### Разрешить выбор существующих данных (по умолчанию отключено) + +Позволяет ассоциировать данные из существующих записей. + +![20240410160432](https://static-docs.nocobase.com/20240410160432.png) +![20240410160714](https://static-docs.nocobase.com/20240410160714.png) + +### Компонент поля + +[Компонент поля](/handbook/ui/fields/association-field): Переключение между компонентами полей связей (выпадающий список, выбор данных и др.) + +### Правила связей +:::info{title=Подсказка} +Требуется версия NocoBase v1.3.17-beta или выше. +::: + +![20240906084911_rec_](https://static-docs.nocobase.com/20240906084911_rec_.gif) + +Подробнее: [Правила связей](/handbook/ui/blocks/block-settings/field-linkage-rule) + +### Разрешить разъединение + +:::info{title=Подсказка} +Требуется версия NocoBase v1.3.34-beta или выше. +::: + +![20241021210710](https://static-docs.nocobase.com/20241021210710.png) +![20241021211909](https://static-docs.nocobase.com/20241021211909.png) diff --git a/docs/ru-RU/handbook/ui/fields/specific/tag.md b/docs/ru-RU/handbook/ui/fields/specific/tag.md new file mode 100644 index 0000000000..f2bf60d15e --- /dev/null +++ b/docs/ru-RU/handbook/ui/fields/specific/tag.md @@ -0,0 +1,35 @@ +### **Теги** + +#### **Введение** + +Теги служат компонентом отображения в режиме просмотра поля связи. Для их использования необходимо настроить поле заголовка и поле цвета. + +#### **Инструкция по использованию** + +##### **Использование тегов в таблице** + +В таблице заказов есть поле связи «многие к одному» с названием «Теги». + +Таблица тегов включает два поля: «Название тега» и «Цвет тега». + +![20240410212554](https://static-docs.nocobase.com/20240410212554.png) + +##### **Использование тегов в детализации** + +![20240410212625](https://static-docs.nocobase.com/20240410212625.png) + +#### **Параметры настройки поля** + +##### **Поле заголовка** + +![20240422220237](https://static-docs.nocobase.com/20240422220237.png) + +Более подробно см. в разделе [Поле заголовка](/handbook/ui/fields/field-settings/title-field). + +##### **Включить ссылку (включено по умолчанию)** + +При клике по тегу открывается всплывающее окно, в котором можно настроить детали связанной записи или форму редактирования. + +![20240410212643](https://static-docs.nocobase.com/20240410212643.png) + +Более подробную информацию см. в разделе [Компонент поля](/handbook/ui/fields/association-field). diff --git a/docs/ru-RU/handbook/ui/fields/specific/title.md b/docs/ru-RU/handbook/ui/fields/specific/title.md new file mode 100644 index 0000000000..ca87d61b62 --- /dev/null +++ b/docs/ru-RU/handbook/ui/fields/specific/title.md @@ -0,0 +1,17 @@ +# Заголовок + +## Введение + +В режиме чтения компонентом по умолчанию для полей взаимосвязи является компонент заголовка, который помечает текущую связанную запись, отображая значение поля заголовка. + +## Параметры конфигурации поля + +![20240429223353](https://static-docs.nocobase.com/20240429223353.png) + +### Включить ссылку (включена по умолчанию) + +При нажатии на нее откроется всплывающее окно, позволяющее настроить конфигурационный блок для управления данными. + +![20240429223831](https://static-docs.nocobase.com/20240429223831.png) + +Более подробную информацию смотрите в разделе [Компоненты поля](/handbook/ui/fields/association-field). diff --git a/docs/ru-RU/handbook/ui/linkage-rule.md b/docs/ru-RU/handbook/ui/linkage-rule.md new file mode 100644 index 0000000000..3d46fc5111 --- /dev/null +++ b/docs/ru-RU/handbook/ui/linkage-rule.md @@ -0,0 +1,104 @@ +# Правила связей + +## Введение + +В NocoBase правила связей - это механизм управления интерактивным поведением элементов интерфейса. Они позволяют настраивать отображение и логику работы блоков, полей и действий на основе различных условий, обеспечивая гибкий low-code опыт взаимодействия. + +С помощью правил связей можно: + +- Скрывать/показывать блоки в зависимости от роли пользователя +- Автоматически заполнять или сбрасывать значения полей формы +- Блокировать поля ввода при определенных условиях +- Динамически настраивать стили полей (цвета, шрифты) +- Управлять видимостью и доступностью действий + +## Настройка условий + +![20250417214217](https://static-docs.nocobase.com/20250417214217.png) + +### Переменные слева + +Определяют объект оценки в правиле связи. Доступные переменные: + +- Контекстные: `「Текущая форма/xxx」`, `「Текущая запись/xxx」` +- Системные: `Текущий пользователь`, `Текущая роль` + +> ✅ Доступные переменные зависят от контекста блока + +### Операторы + +Логические операторы для сравнения переменной слева и значения справа. Разные типы переменных поддерживают разные операторы: + +- Текст: `$includes`, `$eq`, `$ne` +- Числа: `$eq`, `$gt`, `$lt` +- Булевы: `$isTruly`, `$isFalsy` +- Массивы: `$match`, `$anyOf` + +### Значение справа + +Используется для сравнения с переменной слева. Может быть: + +- Константой +- Контекстной переменной +- Системной переменной + +## Логика выполнения + +### Триггер условия + +Действия выполняются при выполнении условия. Если условие не задано - выполняются по умолчанию. + +### Множественные правила + +При одновременном выполнении нескольких правил, приоритет имеет последнее. + +## Управление правилами + +Для каждого правила доступно: + +- Настройка имени +- Сортировка +- Удаление +- Включение/отключение +- Копирование + +## О переменных + +Подробнее о переменных: [Переменные](/handbook/ui/variables) + +## Правила связей блоков + +> **Примечание**: Доступно с версии v1.7.0-beta.24 + +Позволяют динамически управлять видимостью блоков. + +👉 Подробнее: [Правила связей блоков](/handbook/ui/blocks/block-settings/block-linkage-rule) + +## Правила связей полей + +Управляют свойствами полей в формах: + +- Видимость +- Обязательность +- Значения +- Опции +- Диапазоны дат + +👉 Подробнее: [Правила связей полей](/handbook/ui/blocks/block-settings/field-linkage-rule) + +## Правила связей действий + +Управляют поведением операций на основе записей и переменных. + +👉 Подробнее: [Правила связей действий](/handbook/ui/actions/action-settings/linkage-rule) + +## Правила стилей полей + +Динамическая настройка стилей: + +- Цвет +- Размер шрифта +- Начертание +- Выравнивание + +👉 Подробнее: [Стили полей](/handbook/ui/fields/field-settings/style) diff --git a/docs/ru-RU/handbook/ui/menus/index.md b/docs/ru-RU/handbook/ui/menus/index.md new file mode 100644 index 0000000000..7c3d55180d --- /dev/null +++ b/docs/ru-RU/handbook/ui/menus/index.md @@ -0,0 +1,51 @@ +# Меню + +Меню используются для организации страниц и внешних ссылок. В шаблоне макета страницы NocoBase по умолчанию меню расположено вверху и слева. Верхнее меню является основным, а боковое - вторичным с возможностью бесконечной вложенности подменю. + +## Типы пунктов меню + +В NocoBase есть три встроенных типа пунктов меню: + +- Группа +- Страница +- Ссылка + +![](https://static-docs.nocobase.com/ccf6f42d3cc2677d440f9e33b9488d1c.png) + +### Группа + +"Группа" используется для объединения пунктов меню, которые могут располагаться вверху или слева. Внутри группы можно создавать подгруппы, что позволяет создавать меню с бесконечной вложенностью. + +![](https://static-docs.nocobase.com/e59b2088fd68666cd240a26566616a3e.png) + +### Страница + +Страница может служить контейнером для блоков, содержащим различные блоки. (См. [Страницы](./pages/index.md)) + +![](https://static-docs.nocobase.com/4cd259f6b79f6792df72ccc291da2af9.png) + +### Ссылка + +Ссылки могут перенаправлять на сторонние URL-адреса. В URL и параметрах поиска можно использовать переменные. + +![20240709231114](https://static-docs.nocobase.com/20240709231114.png) + +## Настройка меню + +После входа в режим конфигурации интерфейса в правом верхнем углу пункта меню есть две иконки: + +- Перетаскивание для перемещения +- Настройка пункта меню + +![](https://static-docs.nocobase.com/963ba10e36d04fd258fea0e996231f68.png) + +### Настройка пункта меню + +![](https://static-docs.nocobase.com/0a9a05bd88d8bad9d711102a730f351d.png) + +- Редактировать: включает заголовок пункта меню, иконку и т.д. +- Переместить в: кроме перетаскивания, можно быстро переместить пункт меню с помощью "Переместить в", что позволяет переместить пункт меню вперед, назад или внутрь другого пункта меню. +- Вставить перед +- Вставить после +- Вставить внутрь (только для групп) +- Удалить diff --git a/docs/ru-RU/handbook/ui/menus/static/Jp3NbdeVBojspWxvcWhcuDTlnOe.png b/docs/ru-RU/handbook/ui/menus/static/Jp3NbdeVBojspWxvcWhcuDTlnOe.png new file mode 100644 index 0000000000..a2751410cc Binary files /dev/null and b/docs/ru-RU/handbook/ui/menus/static/Jp3NbdeVBojspWxvcWhcuDTlnOe.png differ diff --git a/docs/ru-RU/handbook/ui/menus/static/LTdGbCxxHopt9ix1Nuncj73VnQb.png b/docs/ru-RU/handbook/ui/menus/static/LTdGbCxxHopt9ix1Nuncj73VnQb.png new file mode 100644 index 0000000000..f686eb3de7 Binary files /dev/null and b/docs/ru-RU/handbook/ui/menus/static/LTdGbCxxHopt9ix1Nuncj73VnQb.png differ diff --git a/docs/ru-RU/handbook/ui/menus/static/OpdHbIbJ8oZX75x777ycylHxn1Q.png b/docs/ru-RU/handbook/ui/menus/static/OpdHbIbJ8oZX75x777ycylHxn1Q.png new file mode 100644 index 0000000000..4a609a506b Binary files /dev/null and b/docs/ru-RU/handbook/ui/menus/static/OpdHbIbJ8oZX75x777ycylHxn1Q.png differ diff --git a/docs/ru-RU/handbook/ui/menus/static/SYzbbocHfoNFtsxomWJcUno7nog.png b/docs/ru-RU/handbook/ui/menus/static/SYzbbocHfoNFtsxomWJcUno7nog.png new file mode 100644 index 0000000000..dc01db58ab Binary files /dev/null and b/docs/ru-RU/handbook/ui/menus/static/SYzbbocHfoNFtsxomWJcUno7nog.png differ diff --git a/docs/ru-RU/handbook/ui/menus/static/T0LTbjTBEo24UaxU9Btc6xgbnMf.png b/docs/ru-RU/handbook/ui/menus/static/T0LTbjTBEo24UaxU9Btc6xgbnMf.png new file mode 100644 index 0000000000..197266e57c Binary files /dev/null and b/docs/ru-RU/handbook/ui/menus/static/T0LTbjTBEo24UaxU9Btc6xgbnMf.png differ diff --git a/docs/ru-RU/handbook/ui/menus/static/ZLYibDXwToMdqRxMTy4cyTion1f.png b/docs/ru-RU/handbook/ui/menus/static/ZLYibDXwToMdqRxMTy4cyTion1f.png new file mode 100644 index 0000000000..a89a582a69 Binary files /dev/null and b/docs/ru-RU/handbook/ui/menus/static/ZLYibDXwToMdqRxMTy4cyTion1f.png differ diff --git a/docs/ru-RU/handbook/ui/pages/index.md b/docs/ru-RU/handbook/ui/pages/index.md new file mode 100644 index 0000000000..7c4669c1ee --- /dev/null +++ b/docs/ru-RU/handbook/ui/pages/index.md @@ -0,0 +1,55 @@ +### **Страница** + +Страницы NocoBase могут выступать в качестве контейнеров для блоков. Они подобны холсту, на котором вы можете свободно размещать различные блоки. + +#### **Структура страницы** + +После создания страницы через [меню](/handbook/ui/menus) вы увидите, что пустая страница состоит из двух частей: + +1. **Шапка (Header)** + 1. Название страницы + 2. Вкладки (Tabs) +2. **Контейнер блоков** + +![2024-01-20_08-23-10](https://static-docs.nocobase.com/2024-01-20_08-23-10.jpg) + +#### **Настройки страницы** + +Наведя курсор на значок настройки в правом верхнем углу страницы, вы увидите доступные параметры конфигурации: + +![2024-01-20_08-24-27](https://static-docs.nocobase.com/2024-01-20_08-24-27.jpg) + +Доступные параметры: + +- **Включить шапку страницы**: управляет отображением шапки; +- **Отображать название страницы**: показывать ли название страницы в шапке; +- **Редактировать название страницы**: по умолчанию название страницы совпадает с названием пункта меню, может быть изменено; +- **Включить вкладки**: отключено по умолчанию, при включении можно добавлять несколько вкладок. + +##### **Включение шапки** + +Обычно шапку включают, чтобы отображать название страницы и вкладки. Однако в некоторых случаях её можно отключить. Например, при создании страницы «Панель управления» (Dashboard), где содержание страницы уже ясно из верхнего меню. В таком случае шапку можно отключить и отображать только блоки на странице. + +![20240120084618](https://static-docs.nocobase.com/20240120084618.png) + +##### **Название страницы** + +По умолчанию название страницы совпадает с названием пункта меню. Его можно изменить, нажав «Редактировать название страницы». Как и в случае с шапкой, иногда название не нужно отображать, и требуется только показ вкладок — в этом случае отображение названия можно отключить. + +![2024-01-20_08-28-43](https://static-docs.nocobase.com/2024-01-20_08-28-43.jpg) + +##### **Включение вкладок** + +Если содержание страницы слишком объёмное или его целесообразно разделить на несколько независимых частей, можно включить вкладки. Каждая вкладка представляет собой отдельный контейнер блоков. Например, на странице заказов мы добавили три вкладки для отображения всех заказов, завершённых заказов и заказов с возвратом. При наведении на заголовок вкладки в правом верхнем углу появляются кнопки сортировки и настройки. + +![2024-01-20_08-47-15](https://static-docs.nocobase.com/2024-01-20_08-47-15.jpg) + +#### **Добавление блоков** + +Нажмите «Добавить блок», чтобы добавить на страницу неограниченное количество блоков (см. описание [Блоков](./blocks/index.md)). + +![2024-01-20_08-48-36](https://static-docs.nocobase.com/2024-01-20_08-48-36.jpg) + +После добавления нескольких блоков вы можете использовать кнопку перемещения в правом верхнем углу каждого блока, чтобы свободно перетаскивать и располагать их, изменяя макет для достижения наилучшего визуального эффекта. + +![page-block](https://static-docs.nocobase.com/page-block.gif) diff --git a/docs/ru-RU/handbook/ui/pages/static/C3xvb09t4oGOlhxxI5jcy2B7ncc.png b/docs/ru-RU/handbook/ui/pages/static/C3xvb09t4oGOlhxxI5jcy2B7ncc.png new file mode 100644 index 0000000000..ff6e6bf2cb Binary files /dev/null and b/docs/ru-RU/handbook/ui/pages/static/C3xvb09t4oGOlhxxI5jcy2B7ncc.png differ diff --git a/docs/ru-RU/handbook/ui/pages/static/U0kXblh2Yo5S5hx91c2cYggrnYf.gif b/docs/ru-RU/handbook/ui/pages/static/U0kXblh2Yo5S5hx91c2cYggrnYf.gif new file mode 100644 index 0000000000..a43b0c6712 Binary files /dev/null and b/docs/ru-RU/handbook/ui/pages/static/U0kXblh2Yo5S5hx91c2cYggrnYf.gif differ diff --git a/docs/ru-RU/handbook/ui/pages/static/VpP2bTwhooaxrqxy5gYc4KJFnUc.png b/docs/ru-RU/handbook/ui/pages/static/VpP2bTwhooaxrqxy5gYc4KJFnUc.png new file mode 100644 index 0000000000..3a1725bca0 Binary files /dev/null and b/docs/ru-RU/handbook/ui/pages/static/VpP2bTwhooaxrqxy5gYc4KJFnUc.png differ diff --git a/docs/ru-RU/handbook/ui/pages/static/YPqEb1UEMoNzszxAHeDcNrsjnie.png b/docs/ru-RU/handbook/ui/pages/static/YPqEb1UEMoNzszxAHeDcNrsjnie.png new file mode 100644 index 0000000000..933e11052e Binary files /dev/null and b/docs/ru-RU/handbook/ui/pages/static/YPqEb1UEMoNzszxAHeDcNrsjnie.png differ diff --git a/docs/ru-RU/handbook/ui/pop-up.md b/docs/ru-RU/handbook/ui/pop-up.md new file mode 100644 index 0000000000..fb01923943 --- /dev/null +++ b/docs/ru-RU/handbook/ui/pop-up.md @@ -0,0 +1,118 @@ +### **Всплывающее окно (Popup)** + +#### **Введение** + +Всплывающее окно — это небольшое окно на странице, используемое для отображения дополнительного контента в рамках текущей страницы. Оно может открываться в виде выезжающей панели (drawer) или диалогового окна (dialog), например, для просмотра деталей заказа или товара, а также для редактирования данных. + +Операции с всплывающими окнами играют важную роль в настройке интерфейса NocoBase. Многие блоки предоставляют различные действия с всплывающими окнами, которые можно использовать для добавления, просмотра и редактирования данных. При этом такие операции можно гибко настраивать под различные сценарии и потребности. + +--- + +#### **Типы и размеры** + +Начиная с версии **v1.3.0-alpha**, поддерживается открытие всплывающего окна в виде [страницы](/handbook/ui/pop-up#page). + +Существует два основных типа всплывающих окон: **выезжающая панель (drawer)** и **диалоговое окно (dialog)**. Тип и размер окна настраиваются при конфигурации действия. + +##### **Выезжающая панель (Drawer)** + +![Drawer](https://static-docs.nocobase.com/2024-06-13_09-45-33-2024-06-13-09-46-11.png) + +##### **Диалоговое окно (Dialog)** + +![Dialog](https://static-docs.nocobase.com/2024-06-13_09-45-56-2024-06-13-09-46-20.png) + +##### **Страница (Page)** + +:::info{title=Подсказка} +Требуется версия NocoBase **v1.3.0-alpha или выше**. +::: + +![Page](https://static-docs.nocobase.com/20240809170648.png) + +--- + +#### **Сценарии использования** + +Основные сценарии использования всплывающих окон включают: + +- **Действия с всплывающими окнами в блоках** — используются для добавления, просмотра и редактирования данных. +- **Действия с всплывающими окнами для связанных данных** — позволяют просматривать и редактировать расширенную информацию по связанным записям. + +##### **Всплывающие окна в блоках** + +![Popup Actions of the Block](https://static-docs.nocobase.com/20240511141127.png) + +##### **Всплывающие окна для связанных данных** + +![Popup Actions of Relationship Data](https://static-docs.nocobase.com/20240511141247.png) + +--- + +#### **Общий доступ к данным одной записи** + +:::info{title=Подсказка} +Требуется версия NocoBase **v1.3.0-alpha или выше**. +::: + +Если вы хотите поделиться данными одной записи с другими пользователями, просто скопируйте URL из адресной строки браузера после открытия всплывающего окна и отправьте его. При открытии этой ссылки у получателя автоматически откроется соответствующее всплывающее окно. + +![Sharing a Single Record's Data](https://static-docs.nocobase.com/20240809173339_rec_.gif) + +--- + +#### **Добавление блоков** + +В всплывающее окно можно добавлять следующие типы блоков: + +![Adding Blocks](https://static-docs.nocobase.com/20240511141349.png) + +Данные во всплывающем окне делятся на три категории: + +1. **Текущая запись** — отображает данные текущей записи. +2. **Связанная запись** — отображает данные, связанные с текущей записью. +3. **Другие записи** — отображает данные из других таблиц. + +![Data Dimensions](https://static-docs.nocobase.com/20240511141442.png) + +--- + +##### **Текущая запись** + +**Пример:** Отображение данных текущего заказа. + +![Current Record](https://static-docs.nocobase.com/20240511141809.gif) + +--- + +##### **Связанная запись** + +**Пример:** Отображение данных о товарах, связанных с текущим заказом. + +![Relationship Record](https://static-docs.nocobase.com/20240511143040.gif) + +--- + +##### **Другие записи** + +**Пример:** Настройка блока с информацией о складе в операции всплывающего окна блока таблицы заказов. + +![Other Records](https://static-docs.nocobase.com/20240511143415.gif) + +--- + +#### **Использование переменных** + +- **Всплывающее окно действия строки:** каждое окно содержит переменную **«Текущая запись всплывающего окна»**, которая представляет запись текущей строки. +- **Всплывающее окно поля связи:** переменная **«Текущая запись всплывающего окна»** представляет выбранную связанную запись. + +Блоки внутри всплывающего окна могут использовать переменную **«Текущая запись всплывающего окна»** в следующих сценариях: + +- Настройка диапазона данных для блоков. +- Настройка диапазона данных для полей связи. +- Установка значений по умолчанию для полей (в формах добавления данных). +- Настройка правил связывания для действий. +- Назначение значений полей в операциях отправки формы. + +Более подробно о переменных см. в разделе [Переменные](/handbook/ui/variables). + diff --git a/docs/ru-RU/handbook/ui/ui-editor/index.md b/docs/ru-RU/handbook/ui/ui-editor/index.md new file mode 100644 index 0000000000..734450c386 --- /dev/null +++ b/docs/ru-RU/handbook/ui/ui-editor/index.md @@ -0,0 +1,45 @@ +# Редактор интерфейса + +## Режим WYSIWYG + +NocoBase использует режим конфигурации интерфейса "что видишь, то и получаешь" (WYSIWYG). Нажатие кнопки "Редактор интерфейса" позволяет переключаться между режимом конфигурации и режимом использования. + +![2024-01-20_11-42-20](https://static-docs.nocobase.com/2024-01-20_11-42-20.jpg) + +Режим использования: + +![2024-01-20_11-28-46](https://static-docs.nocobase.com/2024-01-20_11-28-46.jpg) + +Режим конфигурации: + +![2024-01-20_11-29-50](https://static-docs.nocobase.com/2024-01-20_11-29-50.jpg) + +## Шаблон макета + +NocoBase включает шаблон макета с областями навигации сверху и слева, а также областью содержимого справа. + +![2024-01-20_11-36-38](https://static-docs.nocobase.com/2024-01-20_11-36-38.jpg) + +## Элементы конфигурации + +При входе в режим конфигурации интерфейса на нем появятся оранжевые настраиваемые элементы. Обычно точка входа для параметров каждого настраиваемого элемента находится в правом верхнем углу этого элемента. Почти все элементы можно настраивать и просматривать в реальном времени на интерфейсе, например: + +Элементы конфигурации для меню: + +![2024-01-20_11-30-29](https://static-docs.nocobase.com/2024-01-20_11-30-29.jpg) + +Элементы конфигурации для страницы: + +![2024-01-20_11-30-52](https://static-docs.nocobase.com/2024-01-20_11-30-52.jpg) + +Элементы конфигурации для блока: + +![2024-01-20_11-31-20](https://static-docs.nocobase.com/2024-01-20_11-31-20.jpg) + +Элементы конфигурации для действия: + +![2024-01-20_11-31-50](https://static-docs.nocobase.com/2024-01-20_11-31-50.jpg) + +Элементы конфигурации для столбца таблицы: + +![2024-01-20_11-32-08](https://static-docs.nocobase.com/2024-01-20_11-32-08.jpg) diff --git a/docs/ru-RU/handbook/ui/variables.md b/docs/ru-RU/handbook/ui/variables.md new file mode 100644 index 0000000000..0ff171bab1 --- /dev/null +++ b/docs/ru-RU/handbook/ui/variables.md @@ -0,0 +1,173 @@ +# Переменные + +## Введение +Переменные представляют собой набор токенов, используемых для идентификации значений в текущем контексте. Они могут применяться в таких сценариях, как настройка области данных блока, значения по умолчанию для полей, правила связей, рабочие процессы и т.д. + +![2024-09-25_20-08-38-2024-09-25-20-11-51](https://static-docs.nocobase.com/2024-09-25_20-08-38-2024-09-25-20-11-51.png) + +## Поддерживаемые переменные + +### Текущий пользователь + +Представляет данные пользователя, выполнившего вход в систему. + +![20240416154950](https://static-docs.nocobase.com/20240416154950.png) + +### Текущая роль + +Идентификатор роли (название роли) текущего пользователя. + +![20240416155100](https://static-docs.nocobase.com/20240416155100.png) + +### Текущая форма + +Значение текущей формы, используется только в блоках форм. Применяется в следующих сценариях: + +- Правила связей текущей формы +- Значения по умолчанию для полей формы (действительно только при добавлении новых данных) +- Настройки области данных для связанных полей +- Конфигурация значений полей для действий отправки + +#### Правила связей текущей формы + +![20240416170732_rec_](https://static-docs.nocobase.com/20240416170732_rec_.gif) + +#### Значения по умолчанию для полей формы + +![20240416171129_rec_](https://static-docs.nocobase.com/20240416171129_rec_.gif) + +#### Настройки области данных для связанных полей + +Используется для обработки связей между отношениями: + +![20240416171743_rec_](https://static-docs.nocobase.com/20240416171743_rec_.gif) + +#### Конфигурация значений полей для действий отправки + +![20240416171215_rec_](https://static-docs.nocobase.com/20240416171215_rec_.gif) + +### Текущий объект + +Используется только для настройки полей в подформах и подтаблицах блоков форм, представляет значение каждого элемента: + +- Значения по умолчанию для подполей +- Область данных для связанных подполей + +#### Значения по умолчанию для подполей + +![20240416172933_rec_](https://static-docs.nocobase.com/20240416172933_rec_.gif) + +#### Область данных для связанных подполей + +![20240416173043_rec_](https://static-docs.nocobase.com/20240416173043_rec_.gif) + +### Родительский объект + +Аналогично "Текущему объекту", представляет родительский объект текущего объекта. Поддерживается в NocoBase v1.3.34-beta и выше. + +### Текущая запись + +Запись представляет собой строку в коллекции. Переменная "Текущая запись" используется в "Правилах связей действий строки" блоков отображения. + +#### Правила связей действий строки + +![20240416174813_rec_](https://static-docs.nocobase.com/20240416174813_rec_.gif) + +### Текущая запись всплывающего окна + +Всплывающие действия играют важную роль в конфигурации интерфейса NocoBase. + +- Всплывающее окно действия строки: каждое окно имеет переменную "Текущая запись всплывающего окна", представляющую текущую запись строки. +- Всплывающее окно связанного поля: каждое окно имеет переменную "Текущая запись всплывающего окна", представляющую запись выбранного отношения. + +Блоки во всплывающем окне могут использовать переменную "Текущая запись всплывающего окна" в следующих сценариях: + +- Настройка области данных для блоков +- Настройка области данных для связанных полей +- Настройка значений по умолчанию для полей (форма добавления данных) +- Настройка правил связей для действий +- Конфигурация значений полей для действий отправки формы + +#### Настройка области данных для блоков + +![20240416224307_rec_](https://static-docs.nocobase.com/20240416224307_rec_.gif) + +#### Настройка области данных для связанных полей + +![20240416224641_rec_](https://static-docs.nocobase.com/20240416224641_rec_.gif) + +#### Настройка значений по умолчанию для полей + +![20240416223846_rec_](https://static-docs.nocobase.com/20240416223846_rec_.gif) + +#### Настройка правил связей для действий + +![20240416223101_rec_](https://static-docs.nocobase.com/20240416223101_rec_.gif) + +#### Конфигурация значений полей для действий отправки формы + +![20240416224014_rec_](https://static-docs.nocobase.com/20240416224014_rec_.gif) + +### Выбранная запись таблицы + +Значения по умолчанию для полей формы, используемые только для действия "Добавить запись" в блоке таблицы. + +#### Значение по умолчанию поля формы для действия "Добавить запись" + +### Родительская запись (устарело) + +Используется только в блоках связей, представляет исходную запись связанных данных. + +:::warning +"Родительская запись" устарела, рекомендуется использовать "Текущую запись всплывающего окна". +::: + +### Переменные даты + +Доступные переменные: + +- Текущее время +- Вчера +- Сегодня +- Завтра +- Прошлая неделя +- Текущая неделя +- Следующая неделя +- Прошлый месяц +- Текущий месяц +- Следующий месяц +- Прошлый квартал +- Текущий квартал +- Следующий квартал +- Прошлый год +- Текущий год +- Следующий год +- Последние 7 дней +- Следующие 7 дней +- Последние 30 дней +- Следующие 30 дней +- Последние 90 дней +- Следующие 90 дней + +<br /> + +:::warning +Кроме "Текущего времени", которое является моментом (строка), остальные переменные даты представляют периоды (массивы). В настоящее время периоды могут использоваться только в области данных и не могут применяться для значений по умолчанию полей. +::: + +Примеры использования: + +- Настройка условий для полей даты в области данных блока +- Настройка условий для полей даты в области данных связанных полей +- Настройка условий для полей даты в правилах связей действий +- Настройка значений по умолчанию для полей даты + +### Параметры URL + +Эта переменная представляет параметры поиска в URL текущей страницы. Доступна только при наличии строки запроса в URL страницы. Удобно использовать вместе с [Ссылкой](/handbook/ui/actions/types/link). + +![20240603200410](https://static-docs.nocobase.com/20240603200410.gif) + +### API токен + +Значение этой переменной представляет собой строку, которая служит учетными данными для доступа к API NocoBase. Может использоваться для аутентификации пользователя. diff --git a/docs/ru-RU/handbook/user-data-sync/dev/resource.md b/docs/ru-RU/handbook/user-data-sync/dev/resource.md new file mode 100644 index 0000000000..292aefd162 --- /dev/null +++ b/docs/ru-RU/handbook/user-data-sync/dev/resource.md @@ -0,0 +1,85 @@ +# Расширение целевых ресурсов синхронизации + +## Обзор + +NocoBase изначально поддерживает синхронизацию данных пользователей в таблицы «Пользователи» (User) и «Подразделения» (Department). Кроме того, платформа позволяет расширять целевые ресурсы синхронизации данных, чтобы записывать данные в другие таблицы или выполнять пользовательскую обработку по необходимости. + +:::warning{title=Экспериментальная функция} +Полная документация находится в стадии разработки. +::: + +## Интерфейс обработчика целевого ресурса + +```ts +export abstract class UserDataResource { + name: string; + accepts: SyncAccept[]; + db: Database; + logger: SystemLogger; + + constructor(db: Database, logger: SystemLogger) { + this.db = db; + this.logger = logger; + } + + /** + * Абстрактный метод обновления записи. + * @param record — исходная запись данных. + * @param resourcePks — первичные ключи целевого ресурса. + * @param matchKey — необязательное поле, по которому выполняется сопоставление (например, email, username и т.д.). + * @returns Массив изменённых ресурсов записи. + */ + abstract update( + record: OriginRecord, + resourcePks: PrimaryKey[], + matchKey?: string, + ): Promise<RecordResourceChanged[]>; + + /** + * Абстрактный метод создания новой записи. + * @param record — исходная запись данных. + * @param matchKey — поле, по которому выполняется сопоставление. + * @returns Массив созданных или изменённых ресурсов записи. + */ + abstract create( + record: OriginRecord, + matchKey: string, + ): Promise<RecordResourceChanged[]>; + + /** + * Репозиторий записей синхронизации пользовательских данных. + */ + get syncRecordRepo() { + return this.db.getRepository('userDataSyncRecords'); + } + + /** + * Репозиторий связей между записями синхронизации и целевыми ресурсами. + */ + get syncRecordResourceRepo() { + return this.db.getRepository('userDataSyncRecordsResources'); + } +} +``` + +## Регистрация целевых ресурсов + +Метод: `registerResource(resource: UserDataResource, options?: ToposortOptions)` + +Пример регистрации пользовательского ресурса: + +```ts +import { Plugin } from '@nocobase/server'; +import PluginUserDataSyncServer from '@nocobase/plugin-user-data-sync'; + +class CustomUserResourcePluginServer extends Plugin { + async load() { + const userDataSyncPlugin = this.app.pm.get(PluginUserDataSyncServer); + if (userDataSyncPlugin && userDataSyncPlugin.enabled) { + userDataSyncPlugin.resourceManager.registerResource(new CustomDataSyncResource(this.db, this.app.logger)); + } + } +} +``` + +Этот код регистрирует пользовательский обработчик синхронизации данных (`CustomDataSyncResource`), который будет участвовать в процессе синхронизации и может выполнять операции создания или обновления записей в кастомных таблицах на основе входящих данных. diff --git a/docs/ru-RU/handbook/user-data-sync/dev/source.md b/docs/ru-RU/handbook/user-data-sync/dev/source.md new file mode 100644 index 0000000000..3efe7a1c88 --- /dev/null +++ b/docs/ru-RU/handbook/user-data-sync/dev/source.md @@ -0,0 +1,139 @@ +# Расширение источников синхронизированных данных + +## Обзор + +NocoBase позволяет расширять типы источников данных для синхронизации пользовательской информации по мере необходимости. + +## Серверная часть + +### Интерфейс источника данных + +Встроенный плагин синхронизации предоставляет базовые функции регистрации и управления. Для создания нового типа источника необходимо унаследовать абстрактный класс `SyncSource` и реализовать стандартные интерфейсы. + +```ts +import { SyncSource, UserData } from '@nocobase/plugin-user-data-sync'; + +class CustomSyncSource extends SyncSource { + async pull(): Promise<UserData[]> { + return []; + } +} +``` + +Класс `SyncSource` содержит свойство `options` для доступа к конфигурациям. + +```ts +import { SyncSource, UserData } from '@nocobase/plugin-user-data-sync'; + +class CustomSyncSource extends SyncSource { + async pull(): Promise<UserData[]> { + //... + const { appid, secret } = this.options; + //... + return []; + } +} +``` + +### Описание полей `UserData` + +| Поле | Описание | +|--------------|-----------------------------------------| +| `dataType` | Тип данных: `user` или `department` | +| `uniqueKey` | Уникальный идентификатор | +| `records` | Записи данных | +| `sourceName` | Название источника | + +Для `dataType = 'user'`: + +| Поле | Описание | +|---------------|------------------------| +| `id` | ID пользователя | +| `nickname` | Никнейм | +| `avatar` | Аватар | +| `email` | Email | +| `phone` | Телефон | +| `departments` | ID отделов | + +Для `dataType = 'department'`: + +| Поле | Описание | +|------------|---------------------| +| `id` | ID отдела | +| `name` | Название отдела | +| `parentId` | ID родительского отдела | + +### Пример реализации + +```ts +import { SyncSource, UserData } from '@nocobase/plugin-user-data-sync'; + +class CustomSyncSource extends SyncSource { + async pull(): Promise<UserData[]> { + const ThirdClientApi = new ThirdClientApi( + this.options.appid, + this.options.secret, + ); + const departments = await this.clientapi.getDepartments(); + const users = await this.clientapi.getUsers(); + + return [ + { + dataType: 'department', + uniqueKey: 'id', + records: departments, + sourceName: this.instance.name, + }, + { + dataType: 'user', + uniqueKey: 'id', + records: users, + sourceName: this.instance.name, + }, + ]; + } +} +``` + +### Регистрация типа источника + +```ts +import UserDataSyncPlugin from '@nocobase/plugin-user-data-sync'; + +class CustomSourcePlugin extends Plugin { + async load() { + const syncPlugin = this.app.pm.get(UserDataSyncPlugin) as UserDataSyncPlugin; + if (syncPlugin) { + syncPlugin.sourceManager.registerType('custom-source-type', { + syncSource: CustomSyncSource, + title: 'Кастомный источник', + }); + } + } +} +``` + +## Клиентская часть + +Интерфейс регистрирует тип источника через метод `registerType`: + +```ts +import SyncPlugin from '@nocobase/plugin-user-data-sync/client'; + +class CustomSourcePlugin extends Plugin { + async load() { + const sync = this.app.pm.get(SyncPlugin); + sync.registerType(authType, { + components: { + AdminSettingsForm, // Форма администрирования + }, + }); + } +} +``` + +### Форма администрирования + +![Форма настроек](https://static-docs.nocobase.com/202412041429835.png) + +Верхняя часть содержит общие настройки, нижняя - кастомные конфигурации. diff --git a/docs/ru-RU/handbook/user-data-sync/index.md b/docs/ru-RU/handbook/user-data-sync/index.md new file mode 100644 index 0000000000..959748beff --- /dev/null +++ b/docs/ru-RU/handbook/user-data-sync/index.md @@ -0,0 +1,45 @@ +# Синхронизация пользовательских данных + +<PluginInfo name="user-data-sync"></PluginInfo> + +## Введение + +Данная функция позволяет регистрировать и управлять источниками синхронизации пользовательских данных. По умолчанию предоставляется HTTP API, но дополнительные источники данных могут быть добавлены через плагины. Поддерживается синхронизация с таблицами **Пользователи** и **Отделы**, с возможностью расширения на другие ресурсы через плагины. + +## Установка + +Это встроенный плагин, не требующий отдельной установки. + +## Управление источниками данных и синхронизация + +![](https://static-docs.nocobase.com/202412041043465.png) + +:::info +Если не установлены плагины, предоставляющие источники синхронизации, данные пользователей можно синхронизировать через HTTP API. См. [Источник данных - HTTP API](./sources/api). +::: + +## Добавление источника данных + +После установки плагина с источником синхронизации можно добавить соответствующий источник данных. Только активные источники отображают кнопки "Синхронизировать" и "Задачи". + +> Пример: WeCom (корпоративный WeChat) + +![](https://static-docs.nocobase.com/202412041053785.png) + +## Синхронизация данных + +Нажмите кнопку **Синхронизировать** для начала процесса. + +![](https://static-docs.nocobase.com/202412041055022.png) + +Кнопка **Задачи** позволяет просматривать статус синхронизации. После успешного завершения данные доступны в списках Пользователей и Отделов. + +![](https://static-docs.nocobase.com/202412041202337.png) + +Для неудачных задач доступна функция **Повторить**. + +![](https://static-docs.nocobase.com/202412041058337.png) + +При возникновении ошибок можно провести диагностику через системные логи. Исходные записи синхронизации хранятся в директории `user-data-sync` в папке логов приложения. + +![](https://static-docs.nocobase.com/202412041205655.png) diff --git a/docs/ru-RU/handbook/user-data-sync/sources/api.md b/docs/ru-RU/handbook/user-data-sync/sources/api.md new file mode 100644 index 0000000000..9d6e7aa40d --- /dev/null +++ b/docs/ru-RU/handbook/user-data-sync/sources/api.md @@ -0,0 +1,75 @@ +# Синхронизация пользовательских данных через HTTP API + +## Получение API-ключа + +См. раздел [API-ключи](../api-keys). Убедитесь, что у роли, связанной с API-ключом, есть необходимые права для синхронизации пользовательских данных. + +## Обзор API + +### Пример + +```bash +curl 'https://localhost:13000/api/userData:push' \ + -H 'Authorization: Bearer <token>' \ + --data-raw '{"dataType":"user","records":[]}' # подробности тела запроса см. ниже +``` + +### Конечная точка (Endpoint) + +``` +POST /api/userData:push +``` + +## Формат данных пользователя + +### UserData + +| Параметр | Тип | Описание | +|-------------|----------------------------------------|--------------------------------------------------------------------------| +| dataType | `'user' \| 'department'` | Обязательно. Тип передаваемых данных. Используйте `'user'` для данных пользователей. | +| matchKey | `'username' \| 'email' \| 'phone'` | Необязательно. Поле, по которому будет выполняться сопоставление с существующими пользователями в системе. | +| records | `UserRecord[]` | Обязательно. Массив записей с данными пользователей. | + +### UserRecord + +| Параметр | Тип | Описание | +|--------------|--------------|--------------------------------------------------------------------------| +| uid | `string` | Обязательно. Уникальный идентификатор пользователя в источнике данных. Неизменяем для одного пользователя. | +| nickname | `string` | Необязательно. Псевдоним пользователя. | +| username | `string` | Необязательно. Имя пользователя. | +| email | `string` | Необязательно. Адрес электронной почты пользователя. | +| phone | `string` | Необязательно. Номер телефона пользователя. | +| departments | `string[]` | Необязательно. Массив идентификаторов (UID) подразделений, к которым принадлежит пользователь. | +| isDeleted | `boolean` | Необязательно. Указывает, удалена ли запись. | +| `<field>` | `any` | Необязательно. Пользовательские поля из таблицы пользователей. | + +## Формат данных подразделений + +:::info +Передача данных подразделений требует, чтобы был установлен и включён плагин [Подразделения](../../departments). +::: + +### DepartmentData + +| Параметр | Тип | Описание | +|-------------|-----------------------------|--------------------------------------------------------------------------| +| dataType | `'user' \| 'department'` | Обязательно. Тип передаваемых данных. Используйте `'department'` для данных подразделений. | +| records | `DepartmentRecord[]` | Обязательно. Массив записей с данными подразделений. | + +### DepartmentRecord + +| Параметр | Тип | Описание | +|--------------|--------------|--------------------------------------------------------------------------| +| uid | `string` | Обязательно. Уникальный идентификатор подразделения в источнике данных. Неизменяем. | +| title | `string` | Обязательно. Название подразделения. | +| parentUid | `string` | Необязательно. Идентификатор (UID) вышестоящего подразделения. | +| isDeleted | `boolean` | Необязательно. Указывает, удалена ли запись. | +| `<field>` | `any` | Необязательно. Пользовательские поля из таблицы подразделений. | + +:::info +Передача данных является идемпотентной — многократная отправка одинаковых данных приведёт к одинаковому результату. + +Если при передаче данных о подразделении родительское подразделение ещё не создано, установить связь невозможно. После создания родительского подразделения повторно отправьте данные. + +Аналогично, если при передаче данных о пользователе подразделение ещё не создано, пользователь не сможет быть связан с этим подразделением. Сначала отправьте данные подразделений, а затем повторно отправьте данные пользователей. +::: diff --git a/docs/ru-RU/handbook/users/field-created-by.md b/docs/ru-RU/handbook/users/field-created-by.md new file mode 100644 index 0000000000..6302850ec6 --- /dev/null +++ b/docs/ru-RU/handbook/users/field-created-by.md @@ -0,0 +1,14 @@ +# Создатель + +<PluginInfo name="users"></PluginInfo> + +## Введение + +## Настройка полей + +![Конфигурация полей](https://static-docs.nocobase.com/20240512174625.png) + +## Пример + +Будет добавлено позже. + diff --git a/docs/ru-RU/handbook/users/field-updated-by.md b/docs/ru-RU/handbook/users/field-updated-by.md new file mode 100644 index 0000000000..038ca9ae3c --- /dev/null +++ b/docs/ru-RU/handbook/users/field-updated-by.md @@ -0,0 +1,13 @@ +# Last Updated By + +<PluginInfo name="users"></PluginInfo> + +## Introduction + +## Field Configuration + +![20240512174708](https://static-docs.nocobase.com/20240512174708.png) + +## Example + +To be added. diff --git a/docs/ru-RU/handbook/users/index.md b/docs/ru-RU/handbook/users/index.md new file mode 100644 index 0000000000..b61b79eed0 --- /dev/null +++ b/docs/ru-RU/handbook/users/index.md @@ -0,0 +1,53 @@ +# https://static-docs.nocobase.com + +<PluginInfo name="https://static-docs.nocobase.com"></PluginInfo> + +## Введение + +Плагин `https://static-docs.nocobase.com` предоставляет базовую модель пользователя и интерфейс управления пользователями. + +## Установка + +Встроенный плагин — отдельная установка не требуется. + +## Инструкция по использованию + +### Управление пользователями + +Данный плагин предоставляет интерфейс управления пользователями в центре настроек. После инициализации приложения автоматически добавляется учётная запись суперадминистратора, которую нельзя удалить. Суперадминистратор обладает правами Root и имеет доступ ко всем ресурсам. + +![](https://static-docs.nocobase.com/44bf40f56b45d4dd96c424fb08082cf6.png) + +Кроме того, вы можете добавлять различные блоки (например, табличные блоки) из коллекции `https://static-docs.nocobase.com` для управления пользователями: + +![](https://static-docs.nocobase.com/76b5a4652f869541a9e8f18a4568a7c9.png) + +### Добавление пользователя + +![](https://static-docs.nocobase.com/4f8ef9ffc1c17f275b62b462f6385b19.png) + +![](https://static-docs.nocobase.com/437828173950bd7c21b40a6243ffe150.png) + +### Изменение профиля пользователя + +![](https://static-docs.nocobase.com/d25e06872bd1d48ed8c1139728fa5ff3.png) + +![](https://static-docs.nocobase.com/c140bcaab240385b9b5aca32a2ec2801.png) + +### Смена пароля пользователя + +![](https://static-docs.nocobase.com/26c24c4cebda3d144dc4e9b728c2ede5.png) + +![](https://static-docs.nocobase.com/23a2b2223cb5b387b3699cc6143302e8.png) + +### Настройки + +:::info{title=Подсказка} +Версия NocoBase должна быть не ниже v1.3.34-beta. +::: + +Настройте, разрешено ли пользователям редактировать свой профиль и изменять свой пароль (настройка применяется ко всем пользователям). + +![20241021212438](https://static-docs.nocobase.com/20241021212438.png) + +![20241021212659](https://static-docs.nocobase.com/20241021212659.png) diff --git a/docs/ru-RU/handbook/users/static/2024-03-02-12-10-34.png b/docs/ru-RU/handbook/users/static/2024-03-02-12-10-34.png new file mode 100644 index 0000000000..6ef217efa1 Binary files /dev/null and b/docs/ru-RU/handbook/users/static/2024-03-02-12-10-34.png differ diff --git a/docs/ru-RU/handbook/users/static/2024-03-03-17-26-33.png b/docs/ru-RU/handbook/users/static/2024-03-03-17-26-33.png new file mode 100644 index 0000000000..74a2471c48 Binary files /dev/null and b/docs/ru-RU/handbook/users/static/2024-03-03-17-26-33.png differ diff --git a/docs/ru-RU/handbook/users/static/2024-03-03-17-44-08.png b/docs/ru-RU/handbook/users/static/2024-03-03-17-44-08.png new file mode 100644 index 0000000000..83bd6b0eb9 Binary files /dev/null and b/docs/ru-RU/handbook/users/static/2024-03-03-17-44-08.png differ diff --git a/docs/ru-RU/handbook/users/static/2024-03-03-17-45-32.png b/docs/ru-RU/handbook/users/static/2024-03-03-17-45-32.png new file mode 100644 index 0000000000..e8bbc9e5ad Binary files /dev/null and b/docs/ru-RU/handbook/users/static/2024-03-03-17-45-32.png differ diff --git a/docs/ru-RU/handbook/users/static/2024-03-03-17-45-58.png b/docs/ru-RU/handbook/users/static/2024-03-03-17-45-58.png new file mode 100644 index 0000000000..9813fe233b Binary files /dev/null and b/docs/ru-RU/handbook/users/static/2024-03-03-17-45-58.png differ diff --git a/docs/ru-RU/handbook/users/static/2024-03-03-17-46-29.png b/docs/ru-RU/handbook/users/static/2024-03-03-17-46-29.png new file mode 100644 index 0000000000..df8d070b04 Binary files /dev/null and b/docs/ru-RU/handbook/users/static/2024-03-03-17-46-29.png differ diff --git a/docs/ru-RU/handbook/users/static/2024-03-03-17-46-49.png b/docs/ru-RU/handbook/users/static/2024-03-03-17-46-49.png new file mode 100644 index 0000000000..d03f0d6b7f Binary files /dev/null and b/docs/ru-RU/handbook/users/static/2024-03-03-17-46-49.png differ diff --git a/docs/ru-RU/handbook/users/static/2024-03-03-17-47-09.png b/docs/ru-RU/handbook/users/static/2024-03-03-17-47-09.png new file mode 100644 index 0000000000..19734cf17d Binary files /dev/null and b/docs/ru-RU/handbook/users/static/2024-03-03-17-47-09.png differ diff --git a/docs/ru-RU/handbook/verification-totp-authenticator/index.md b/docs/ru-RU/handbook/verification-totp-authenticator/index.md new file mode 100644 index 0000000000..40e1a76fdd --- /dev/null +++ b/docs/ru-RU/handbook/verification-totp-authenticator/index.md @@ -0,0 +1,37 @@ +# Аутентификация: TOTP-аутентификатор + +<PluginInfo name="verification-totp-authenticator" commercial="true"></PluginInfo> + +## Введение + +TOTP-аутентификатор позволяет пользователям привязывать любые аутентификаторы, соответствующие спецификации TOTP (Time-based One-Time Password, <a href="https://www.rfc-editor.org/rfc/rfc6238" target="_blank">RFC-6238</a>), и выполнять проверку личности с использованием одноразовых паролей на основе времени. + +## Настройка администратором + +1. Перейдите на страницу управления верификацией: + +![](https://static-docs.nocobase.com/202502271726791.png) + +2. Добавьте новый аутентификатор TOTP: + +![](https://static-docs.nocobase.com/202502271745028.png) + +3. Для TOTP-аутентификатора требуется только уникальный идентификатор и название, дополнительная настройка не нужна: + +![](https://static-docs.nocobase.com/202502271746034.png) + +## Привязка пользователем + +После добавления аутентификатора пользователи могут привязать TOTP-аутентификатор в личном кабинете: + +![](https://static-docs.nocobase.com/202502272252324.png) + +:::warning +Плагин в настоящее время не предоставляет механизм резервных кодов. После привязки TOTP-аутентификатора пользователям рекомендуется сохранить его в надежном месте. В случае утери аутентификатора можно использовать альтернативный метод верификации для подтверждения личности, отвязать утерянный аутентификатор и привязать новый. +::: + +## Отвязка аутентификатора + +Для отвязки TOTP-аутентификатора требуется подтверждение через уже привязанный метод верификации: + +![](https://static-docs.nocobase.com/202502282103205.png) diff --git a/docs/ru-RU/handbook/verification/dev/api.md b/docs/ru-RU/handbook/verification/dev/api.md new file mode 100644 index 0000000000..68a41a539f --- /dev/null +++ b/docs/ru-RU/handbook/verification/dev/api.md @@ -0,0 +1,63 @@ +# API + +## IVerification + +### `verify()` + +### `onActionComplete()` + +### `getBoundInfo()` + +### `getPublicBoundInfo()` + +### `validateBoundInfo()` + +### `bind()` + +## Verification + +### `verificator` + +### `ctx` + +### `options` + +### `verify()` + +### `getBoundInfo()` + +## OTPVerification + +### `expiresIn` + +### `verify()` + +### `bind()` + +### `onActionComplete()` + +## VerificationManager + +### `registerVerificationType()` + +### `listTypes()` + +### `registerAction()` + +### `registerScene()` + +### `addSceneRule()` + +### `getVerificationTypesByScene()` + +### `getVerification()` + +### `getVerificator()` + +### `getVerificators()` + +### `getBoundInfo()` + +### `verify()` + +### `middleware()` diff --git a/docs/ru-RU/handbook/verification/dev/scene.md b/docs/ru-RU/handbook/verification/dev/scene.md new file mode 100644 index 0000000000..0b9479f573 --- /dev/null +++ b/docs/ru-RU/handbook/verification/dev/scene.md @@ -0,0 +1,13 @@ +# Расширение сценариев верификации + +## Основные понятия + +## Регистрация действий верификации + +## Регистрация сценариев верификации + +## Привязка сценариев и типов верификации + +## Автоматическая верификация + +## Ручная верификация diff --git a/docs/ru-RU/handbook/verification/dev/type.md b/docs/ru-RU/handbook/verification/dev/type.md new file mode 100644 index 0000000000..210e39378e --- /dev/null +++ b/docs/ru-RU/handbook/verification/dev/type.md @@ -0,0 +1,11 @@ +# Расширение типов проверки + +## Клиентская часть + +### Регистрация формы настройки + +## Серверная часть + +### Реализация класса проверки + +### Регистрация типа проверки diff --git a/docs/ru-RU/handbook/verification/index.md b/docs/ru-RU/handbook/verification/index.md new file mode 100644 index 0000000000..bc068f5efb --- /dev/null +++ b/docs/ru-RU/handbook/verification/index.md @@ -0,0 +1,26 @@ +# Проверка + +:::info{title=Примечание} +Начиная с версии `1.6.0-alpha.30`, оригинальная функция «кода подтверждения» была модернизирована до функции «Управление проверкой», которая поддерживает управление и интеграцию различных методов верификации пользователей. После привязки пользователем соответствующего метода проверки он может выполнять подтверждение личности по мере необходимости. Эта функция будет стабильно поддерживаться, начиная с версии `1.7.0`. +::: + +<PluginInfo name="verification"></PluginInfo> + +## Введение + +**Центр управления проверками поддерживает управление и интеграцию различных методов верификации пользователей.** Например: + +- Код подтверждения по SMS — предоставляется стандартным плагином проверки. См. также: [Аутентификация: SMS](../../handbook/verification/sms) +- Аутентификатор TOTP — см. также: [Аутентификация: Аутентификатор TOTP](../verification-totp-authenticator/index.md) + +Разработчики также могут расширять функционал за счёт добавления других типов проверки с помощью плагинов. Подробнее см.: [Расширение типов проверки](../../handbook/verification/dev/type) + +**После привязки соответствующего метода проверки пользователь может выполнять верификацию личности по мере необходимости.** Например: + +- Вход через SMS-подтверждение — см. также: [Аутентификация: SMS](../auth-sms/index.md) +- Двухфакторная аутентификация (2FA) — см. также: [Аутентификация: Двухфакторная аутентификация (2FA)](../two-factor-authentication/index.md) +- Повторная проверка для рискованных операций — поддержка в будущем + +Разработчики могут также интегрировать верификацию личности в другие необходимые сценарии с помощью расширения плагинов. Подробнее см.: [Расширение сценариев проверки](../../handbook/verification/dev/scene) + +**Различия и взаимосвязь между модулем проверки и модулем аутентификации пользователей:** Модуль аутентификации пользователей в первую очередь отвечает за проверку личности при входе в систему, при этом такие процессы, как вход по SMS или двухфакторная аутентификация, опираются на средства проверки, предоставляемые модулем управления проверками. В свою очередь, модуль управления проверками используется для верификации личности при выполнении различных рискованных операций, одной из которых является вход пользователя в систему. diff --git a/docs/ru-RU/handbook/verification/sms/dev.md b/docs/ru-RU/handbook/verification/sms/dev.md new file mode 100644 index 0000000000..bfe8691f45 --- /dev/null +++ b/docs/ru-RU/handbook/verification/sms/dev.md @@ -0,0 +1,98 @@ +# Расширение SMS-провайдеров + +Эта статья объясняет, как расширить функциональность SMS-провайдеров в функции [Аутентификация по SMS](./index.md) с помощью плагина. + +## Клиентская часть + +### Регистрация формы конфигурации + +При настройке SMS-верификатора после выбора типа SMS-провайдера появляется соответствующая форма конфигурации. Эту форму необходимо зарегистрировать на клиентской стороне. + +![](https://static-docs.nocobase.com/202503011221912.png) + +Пример кода: + +```ts +import { Plugin, SchemaComponent } from '@nocobase/client'; +import PluginVerificationClient from '@nocobase/plugin-verification/client'; +import React from 'react'; + +const CustomSMSProviderSettingsForm: React.FC = () => { + return <SchemaComponent schema={{ + type: 'void', + properties: { + accessKeyId: { + title: `{{t("Access Key ID", { ns: "${NAMESPACE}" })}}`, + type: 'string', + 'x-decorator': 'FormItem', + 'x-component': 'TextAreaWithGlobalScope', + required: true, + }, + accessKeySecret: { + title: `{{t("Access Key Secret", { ns: "${NAMESPACE}" })}}`, + type: 'string', + 'x-decorator': 'FormItem', + 'x-component': 'TextAreaWithGlobalScope', + 'x-component-props': { password: true }, + required: true, + }, + } + }} /> +} + +class PluginCustomSMSProviderClient extends Plugin { + async load() { + const plugin = this.app.pm.get('verification') as PluginVerificationClient; + plugin.smsOTPProviderManager.registerProvider('custom-sms-provider-name', { + components: { + AdminSettingsForm: CustomSMSProviderSettingsForm, + }, + }); + } +} +``` + +## Серверная часть + +### Реализация интерфейса отправки + +Плагин верификации уже включает процесс генерации одноразовых паролей (OTP), поэтому разработчикам нужно только реализовать логику отправки сообщений. + +Пример реализации: + +```ts +class CustomSMSProvider extends SMSProvider { + constructor(options) { + super(options); + // options содержит конфигурацию с клиента + const options = this.options; + // ... + } + + async send(phoneNumber: string, data: { code: string }) { + // Логика отправки SMS + // ... + } +} +``` + +### Регистрация типа верификации + +После реализации интерфейса отправки его необходимо зарегистрировать. + +```ts +import { Plugin } from '@nocobase/server'; +import PluginVerificationServer from '@nocobase/plugin-verification'; +import { tval } from '@nocobase/utils'; + +class PluginCustomSMSProviderServer extends Plugin { + async load() { + const plugin = this.app.pm.get('verification') as PluginVerificationServer; + // Имя должно соответствовать клиентской части + plugin.smsOTPProviderManager.registerProvider('custom-sms-provider-name', { + title: tval('Кастомный SMS-провайдер', { ns: namespace }), + provider: CustomSMSProvider, + }); + } +} +``` diff --git a/docs/ru-RU/handbook/verification/sms/index.md b/docs/ru-RU/handbook/verification/sms/index.md new file mode 100644 index 0000000000..488e61e8a2 --- /dev/null +++ b/docs/ru-RU/handbook/verification/sms/index.md @@ -0,0 +1,47 @@ +# Аутентификация по SMS + +<PluginInfo name="verification"></PluginInfo> + +## Введение + +SMS-верификация - это встроенный метод подтверждения, который генерирует одноразовый динамический пароль (OTP) и отправляет его пользователю через SMS. + +## Добавление SMS-верификатора + +1. Перейдите на страницу управления верификацией: + +![](https://static-docs.nocobase.com/202502271726791.png) + +2. Нажмите **Добавить - SMS OTP**: + +![](https://static-docs.nocobase.com/202502271726056.png) + +## Настройка администратора + +![](https://static-docs.nocobase.com/202502271727711.png) + +Поддерживаемые SMS-провайдеры: +- <a href="https://www.aliyun.com/product/sms" target="_blank">Aliyun Cloud SMS</a> +- <a href="https://cloud.tencent.com/product/sms" target="_blank">Tencent Cloud SMS</a> + +Разработчики могут добавить поддержку других провайдеров через плагины. Подробнее: [Расширение SMS-провайдеров](../../../handbook/verification/sms/dev) + +## Привязка телефона пользователем + +После добавления верификатора пользователи могут привязать номер телефона в личном кабинете: + +![](https://static-docs.nocobase.com/202502271737016.png) + +![](https://static-docs.nocobase.com/202502271737769.png) + +![](https://static-docs.nocobase.com/202502271738515.png) + +После успешной привязки пользователь может проходить верификацию в соответствующих сценариях: + +![](https://static-docs.nocobase.com/202502271739607.png) + +## Отвязка телефона + +Для отвязки номера требуется подтверждение через уже привязанный метод верификации: + +![](https://static-docs.nocobase.com/202502282103205.png) diff --git a/docs/ru-RU/handbook/wecom/auth.md b/docs/ru-RU/handbook/wecom/auth.md new file mode 100644 index 0000000000..cada58154c --- /dev/null +++ b/docs/ru-RU/handbook/wecom/auth.md @@ -0,0 +1,92 @@ +# Аутентификация через WeCom + +<PluginInfo commercial="true" name="wecom"></PluginInfo> + +## Обзор + +Плагин **WeCom** позволяет пользователям входить в NocoBase с использованием своих учетных записей WeCom. + +## Активация плагина + +![](https://static-docs.nocobase.com/202406272056962.png) + +## Создание и настройка приложения WeCom + +1. Войдите в консоль администратора WeCom и создайте кастомное приложение: +![](https://static-docs.nocobase.com/202406272101321.png) +![](https://static-docs.nocobase.com/202406272102087.png) + +2. В деталях приложения найдите раздел "Авторизованный вход WeCom": +![](https://static-docs.nocobase.com/202406272104655.png) + +3. Установите домен обратного вызова на домен приложения NocoBase: +![](https://static-docs.nocobase.com/202406272105662.png) + +4. Настройте веб-авторизацию OAuth 2.0: +![](https://static-docs.nocobase.com/202406272107063.png) +![](https://static-docs.nocobase.com/202406272107899.png) + +5. Добавьте IP-адреса NocoBase в доверенные: +![](https://static-docs.nocobase.com/202406272108834.png) +![](https://static-docs.nocobase.com/202406272109805.png) + +## Получение ключей + +1. Скопируйте ID предприятия: +![](https://static-docs.nocobase.com/202406272111637.png) + +2. Получите AgentId и Secret из настроек приложения: +![](https://static-docs.nocobase.com/202406272122322.png) + +## Настройка аутентификации в NocoBase + +1. Перейдите в управление плагинами аутентификации: +![](https://static-docs.nocobase.com/202406272115044.png) + +2. Добавьте новый метод WeCom: +![](https://static-docs.nocobase.com/202406272115805.png) + +### Параметры конфигурации + +![](https://static-docs.nocobase.com/202412041459250.png) + +| Параметр | Описание | Требуемая версия | +|--------------------------------------------------------------------------|--------------------------------------------------------------------------|------------------| +| Создавать нового пользователя при несовпадении номера телефона | Автоматическая регистрация новых пользователей | - | +| ID компании | ID предприятия из консоли WeCom | - | +| AgentId | Из настроек приложения WeCom | - | +| Secret | Из настроек приложения WeCom | - | +| Домен | Домен текущего приложения | - | +| Ссылка для редиректа | Куда перенаправлять после входа | `v1.4.0` | +| Автоматический вход | Вход без подтверждения в браузере WeCom (только для одного аутентификатора) | `v1.4.0` | +| Ссылка на главную страницу | Основная ссылка приложения | - | + +## Настройка главной страницы приложения + +Для версий `v1.4.0+` при включении "Автоматического входа" ссылка может быть упрощена до формата: `https://<url>/<path>`. + +Пример: +- Мобильная версия: `https://example.nocobase.com/m` +- Десктоп: `https://example.nocobase.com/admin` + +Добавьте эту ссылку в поле главной страницы приложения WeCom: +![](https://static-docs.nocobase.com/202406272123631.png) +![](https://static-docs.nocobase.com/202406272123048.png) + +## Процесс входа + +1. На странице входа нажмите кнопку для входа через WeCom: +![](https://static-docs.nocobase.com/202406272124608.png) + +:::warning +Первая авторизация должна быть выполнена в клиенте WeCom из-за ограничений на передачу конфиденциальных данных. +::: + +## Первичная авторизация + +1. Откройте клиент WeCom +2. Перейдите в рабочий стол +3. Найдите ваше приложение внизу списка +4. Нажмите для завершения авторизации + +<img src="https://static-docs.nocobase.com/202406272131113.png" width="400" /> diff --git a/docs/ru-RU/handbook/wecom/index.md b/docs/ru-RU/handbook/wecom/index.md new file mode 100644 index 0000000000..cfc9f661bb --- /dev/null +++ b/docs/ru-RU/handbook/wecom/index.md @@ -0,0 +1,13 @@ +# WeCom + +<PluginInfo commercial="true" name="wecom"></PluginInfo> + +## Введение + +Плагин **WeCom** предоставляет функции интеграции с корпоративным мессенджером WeChat (Enterprise WeChat), включая методы аутентификации, каналы уведомлений и источники синхронизации пользовательских данных. + +См. также: + +- [Аутентификация: WeCom](./auth.md) +- [Уведомления: WeCom](./notification.md) +- [Источник синхронизации: WeCom](./user-data-sync.md) diff --git a/docs/ru-RU/handbook/wecom/notification.md b/docs/ru-RU/handbook/wecom/notification.md new file mode 100644 index 0000000000..ea144b4e3a --- /dev/null +++ b/docs/ru-RU/handbook/wecom/notification.md @@ -0,0 +1,27 @@ +# Уведомления: WeCom + +<PluginInfo commercial="true" name="wecom"></PluginInfo> + +## Введение + +Плагин **WeCom** позволяет приложению отправлять уведомления пользователям в системе WeCom. + +## Добавление и настройка аутентификатора WeCom + +Сначала необходимо добавить и настроить аутентификатор WeCom в NocoBase. Подробнее см. в разделе [Аутентификация пользователей — WeCom](./auth). Только те системные пользователи, которые вошли в систему через WeCom, могут получать уведомления через этот канал. + +## Добавление канала уведомлений WeCom + +![](https://static-docs.nocobase.com/202412041522365.png) + +## Настройка канала уведомлений WeCom + +Выберите только что настроенный аутентификатор. + +![](https://static-docs.nocobase.com/202412041525284.png) + +## Настройка узла уведомления в рабочем процессе + +Выберите настроенный канал уведомлений WeCom. Поддерживаются три типа сообщений: текстовая карточка, Markdown и шаблонная карточка. + +![](https://static-docs.nocobase.com/202412041529319.png) diff --git a/docs/ru-RU/handbook/wecom/user-data-sync.md b/docs/ru-RU/handbook/wecom/user-data-sync.md new file mode 100644 index 0000000000..b978e58dd0 --- /dev/null +++ b/docs/ru-RU/handbook/wecom/user-data-sync.md @@ -0,0 +1,53 @@ +# Синхронизация данных пользователей из WeCom + +<PluginInfo commercial="true" name="wecom"></PluginInfo> + +## Введение + +Плагин **WeCom** позволяет синхронизировать данные пользователей и подразделений из WeCom с NocoBase. + +## Создание и настройка приложения WeCom + +1. Создайте кастомное приложение в админ-панели WeCom +2. Получите следующие параметры: + - **ID предприятия** (Corporate ID) + - **ID приложения** (AgentID) + - **Секретный ключ** (Secret) + +Подробная инструкция доступна в разделе [Аутентификация пользователей - WeCom](./auth). + +## Добавление источника синхронизации в NocoBase + +1. Перейдите в раздел: Пользователи и права > Синхронизация > Добавить +2. Заполните необходимые данные: + +![](https://static-docs.nocobase.com/202412041251867.png) + +## Настройка синхронизации адресной книги + +1. В админ-панели WeCom перейдите: Безопасность и управление > Инструменты управления +2. Выберите "Синхронизация адресной книги": + +![](https://static-docs.nocobase.com/202412041249958.png) + +3. Настройте доверенные IP-адреса предприятия: + +![](https://static-docs.nocobase.com/202412041250776.png) + +После завершения этих шагов можно начинать синхронизацию данных. + +## Настройка сервера приема событий + +Для оперативного обновления данных при изменениях в WeCom необходимо: + +1. Скопировать адрес для callback-уведомлений: + +![](https://static-docs.nocobase.com/202412041256547.png) + +2. Ввести этот адрес в настройках WeCom +3. Получить Token и EncodingAESKey +4. Завершить настройку источника данных в NocoBase: + +![](https://static-docs.nocobase.com/202412041257947.png) + +Теперь система будет автоматически синхронизировать изменения пользователей и подразделений. diff --git a/docs/ru-RU/handbook/workflow-action-trigger/action.md b/docs/ru-RU/handbook/workflow-action-trigger/action.md new file mode 100644 index 0000000000..2ee4a9dec2 --- /dev/null +++ b/docs/ru-RU/handbook/workflow-action-trigger/action.md @@ -0,0 +1,17 @@ +# Настройка действий + +При настройке действий в локальном триггерном режиме, после завершения конфигурации рабочего процесса, необходимо вернуться к пользовательскому интерфейсу и привязать этот рабочий процесс к соответствующей кнопке операции формы в нужном блоке данных. + +Рабочий процесс, привязанный к кнопке **«Отправить»** (включая кнопку **«Сохранить запись»**), будет запускаться после того, как пользователь отправит форму и операция с данными будет завершена. + +![Операция после события — Кнопка Отправить](https://static-docs.nocobase.com/ae12d219b8400d75b395880ec4cb2bda.png) + +Чтобы привязать рабочий процесс, достаточно выбрать пункт **«Привязать рабочие процессы»** в меню настройки кнопки, чтобы открыть диалоговое окно конфигурации привязки. Здесь можно настроить запуск нескольких рабочих процессов. Если ни один процесс не настроен, это означает, что при нажатии кнопки никакие рабочие процессы запущены не будут. Для каждого рабочего процесса необходимо указать, будет ли запуск осуществляться с использованием данных всей формы или данных определённого связного поля внутри формы. Затем, на основе выбранной модели данных, следует выбрать рабочий процесс формы, соответствующий модели данных связанной таблицы. + +![Операция после события — Настройка привязки рабочего процесса — Выбор контекста](https://static-docs.nocobase.com/358315fc175849a7fbadbe3276ac6fed.png) + +![Операция после события — Настройка привязки рабочего процесса — Выбор рабочего процесса](https://static-docs.nocobase.com/175a71a61b93540cce62a1cb124eb0b5.png) + +:::info{title="Примечание"} +Убедитесь, что рабочий процесс включён, прежде чем выбирать его в указанном выше интерфейсе. +::: diff --git a/docs/ru-RU/handbook/workflow-action-trigger/example.md b/docs/ru-RU/handbook/workflow-action-trigger/example.md new file mode 100644 index 0000000000..b64402cec0 --- /dev/null +++ b/docs/ru-RU/handbook/workflow-action-trigger/example.md @@ -0,0 +1,34 @@ +# Пример + +**Результат:** Окончательный отредактированный перевод + +--- + +Рассмотрим пошаговый процесс добавления новой операции. + +Представим сценарий, связанный с «Заявками на расходы». После того как сотрудник подаёт заявку на возмещение расходов, система должна автоматически проверить сумму, а при необходимости — запустить ручное согласование для сумм, превышающих установленный лимит. Только заявки, прошедшие эту проверку, будут одобрены и переданы в финансовый отдел для дальнейшей обработки. + +Для начала создадим коллекцию «Расходы» со следующими полями: + +- **Название проекта:** Текст (однострочный) +- **Заявитель:** Связь «Многие к одному» (Пользователь) +- **Сумма:** Числовое значение +- **Статус:** Выбор из списка (варианты: «Согласовано», «Обработано») + +Далее создадим рабочий процесс, отнесённый к категории **«Событие после действия»**, и настроим модель таблицы данных триггера на коллекцию «Расходы»: + +![Пример — Настройка триггера — Выбор таблицы данных](https://static-docs.nocobase.com/6e1abb5c3e1198038676115943714f07.png) + +После включения рабочего процесса можно приступить к настройке конкретных узлов обработки. + +Затем на пользовательском интерфейсе создадим блок таблицы для таблицы данных «Расходы» и добавим кнопку «Добавить» в панель инструментов, убедившись, что соответствующие поля формы настроены корректно. В настройках кнопки «Отправить» формы откройте диалоговое окно **«Привязать рабочий процесс»**, выберите данные всей формы в качестве контекста и свяжите их с ранее созданным рабочим процессом: + +![Пример — Настройка кнопки формы — Привязка рабочего процесса](https://static-docs.nocobase.com/fc00bdcdb975bb8850e5cab235f854f3.png) + +После завершения настройки формы вернёмся к рабочему процессу, чтобы организовать логику обработки. Например, если сумма возмещения превышает 500, потребуется ручная проверка администратором; в противном случае заявка будет автоматически одобрена. После одобрения создаётся запись о расходах и передаётся в финансовый отдел для дальнейшей обработки (подробности опущены). + +![Пример — Поток процесса](https://static-docs.nocobase.com/059e8e3d5ffb34cc2da6880fa3dc490b.png) + +Если отвлечься от последующей финансовой обработки, настройка процесса подачи заявок на расходы завершена. Когда сотрудник заполняет и отправляет заявку, система запускает соответствующий рабочий процесс. Если сумма меньше 500, запись создаётся автоматически и ожидает дальнейших действий со стороны финансового отдела. Если сумма превышает этот порог, заявка проходит проверку руководителем. После одобрения запись создаётся и передаётся в финотдел для обработки. + +Этот пример рабочего процесса может также применяться к стандартной кнопке **«Отправить»**, в зависимости от того, требуется ли в бизнес-сценарии создание записи до перехода к последующим шагам. diff --git a/docs/ru-RU/handbook/workflow-action-trigger/http-api.md b/docs/ru-RU/handbook/workflow-action-trigger/http-api.md new file mode 100644 index 0000000000..a6e9d51214 --- /dev/null +++ b/docs/ru-RU/handbook/workflow-action-trigger/http-api.md @@ -0,0 +1,48 @@ +# HTTP API + +События после операции можно запускать не только через взаимодействие с пользовательским интерфейсом, но и с помощью HTTP API, что предоставляет гибкий способ программного запуска рабочих процессов. + +:::info{title="Примечание"} +При запуске событий после операции через HTTP API важно убедиться, что рабочий процесс активен, а конфигурация таблицы данных соответствует ожидаемой. Если эти условия не выполнены, вызов может завершиться неудачей или привести к ошибкам. +::: + +Для рабочих процессов, привязанных к конкретным кнопкам операций, можно использовать следующий метод вызова (в примере — кнопка создания записи в таблице `posts`): + +```bash +curl -X POST -H 'Authorization: Bearer <ваш токен>' -H 'X-Role: <имя_роли>' -d \ + '{ + "title": "Привет, мир!", + "content": "Это тестовая публикация." + }' \ + "http://localhost:3000/api/posts:create?triggerWorkflows=workflowKey" +``` + +В этом примере параметр URL `triggerWorkflows` указывает ключ рабочего процесса. Если необходимо, можно указать несколько рабочих процессов, разделив их запятыми. Ключ рабочего процесса можно посмотреть, наведя курсор на название рабочего процесса в верхней части холста: + +![Способ просмотра ключа рабочего процесса](https://static-docs.nocobase.com/20240426135108.png) + +При успешном выполнении этот запрос запустит соответствующее событие после операции для таблицы `posts`. + +:::info{title="Примечание"} +Поскольку внешние API-вызовы требуют аутентификации пользователя, в HTTP-запросах необходимо передавать те же учётные данные, что и при стандартных запросах через интерфейс. Это включает заголовок `Authorization` (или параметр `token`, полученный при входе в систему) и заголовок `X-Role`, который указывает текущую роль пользователя. +::: + +Если необходимо запустить событие, связанное с отношением один-к-одному (в настоящее время отношения «многие-к-одному» не поддерживаются), можно использовать символ `!` в параметрах, чтобы указать данные триггера для поля связи: + +```bash +curl -X POST -H 'Authorization: Bearer <ваш токен>' -H 'X-Role: <имя_роли>' -d \ + '{ + "title": "Привет, мир!", + "content": "Это тестовая публикация.", + "category": { + "title": "Тестовая категория" + } + }' \ + "http://localhost:3000/api/posts:create?triggerWorkflows=workflowKey!category" +``` + +При успешном выполнении будет запущено соответствующее событие после операции для таблицы `categories`. + +:::info{title="Примечание"} +Если событие настроено в глобальном режиме, нет необходимости указывать рабочий процесс через параметр URL `triggerWorkflows`. Достаточно просто выполнить операцию с соответствующей таблицей данных — это автоматически запустит привязанный рабочий процесс. +::: diff --git a/docs/ru-RU/handbook/workflow-action-trigger/index.md b/docs/ru-RU/handbook/workflow-action-trigger/index.md new file mode 100644 index 0000000000..4402abbb20 --- /dev/null +++ b/docs/ru-RU/handbook/workflow-action-trigger/index.md @@ -0,0 +1,53 @@ +# Обзор + +<PluginInfo name="workflow-action-trigger" link="/handbook/workflow-action-trigger"></PluginInfo> + +В системе все изменения данных, инициированные пользователями, обычно выполняются через различные операции, чаще всего - нажатие кнопок. Это может быть кнопка отправки формы или действие в блоке данных. События после действия (Post-action) позволяют привязать конкретные workflow к этим кнопкам, гарантируя запуск процесса после успешного действия пользователя. + +Например, при добавлении или обновлении данных можно настроить опцию "Привязать workflow" для кнопки. После успешного выполнения действия привязанный workflow запустится автоматически. + +С технической стороны, поскольку обработка Post-action событий происходит на уровне middleware (с использованием Koa middleware), даже HTTP API вызовы к NocoBase могут запускать определенные Post-action события. + +:::info{title="Примечание"} +Изначально Post-action события назывались "События формы". В ранних версиях эта функция работала только с кнопками форм. Начиная с версии `v0.20`, она стала доступна и для кнопок действий в блоках данных, что привело к переименованию в "События после действия". +::: + +## Частые вопросы + +### Разница между Post-action и Pre-action событиями + +Ключевое отличие между этими типами событий - момент их срабатывания в цикле запроса-ответа операции: + +![Последовательность операций](https://static-docs.nocobase.com/Handbook/20240916013804.png) + +Pre-action события срабатывают до выполнения операции (до обработки запроса). Они могут использоваться для валидации или модификации данных запроса. Если запрос блокируется, операция не выполняется. + +Post-action события срабатывают после успешного завершения действия пользователя. На этом этапе данные уже успешно сохранены, и можно запускать процессы на основе результата. + +### Разница между Post-action и событиями таблиц + +Хотя оба типа событий срабатывают после изменений данных, их реализации различаются: + +- Post-action события работают на уровне API +- События таблиц реагируют на изменения данных в таблицах + +События таблиц ближе к ядру системы. Одно событие может вызвать цепную реакцию изменений в связанных таблицах. Они не содержат информации о пользователе. + +Post-action события теснее связаны с пользовательским интерфейсом, отражая результаты действий пользователей. Контекст этих процессов включает пользовательскую информацию, что делает их идеальными для workflow, инициированных пользователями. В будущих версиях NocoBase планируется расширение Post-action событий. + +Еще одно важное отличие: Post-action события можно выборочно привязывать к конкретным формам, тогда как события таблиц работают для всех изменений данных в таблице. + +## Установка + +Это встроенный плагин, не требующий установки. + +## Руководство пользователя + +Использование Post-action событий включает несколько аспектов: + +- [Настройка триггера](./trigger.md) +- [Настройка действий](./action.md) + +Примеры практического применения можно найти в разделе [Примеры](./example.md). + +Для интеграции с внешними системами см. [Внешние вызовы](./http-api.md). diff --git a/docs/ru-RU/handbook/workflow-action-trigger/trigger.md b/docs/ru-RU/handbook/workflow-action-trigger/trigger.md new file mode 100644 index 0000000000..dd8e2a72f2 --- /dev/null +++ b/docs/ru-RU/handbook/workflow-action-trigger/trigger.md @@ -0,0 +1,51 @@ +# Настройка триггера + +#### Создание workflow + +Для создания workflow выберите тип триггера "Событие после действия": + +![Создание workflow с триггером пост-действия](https://static-docs.nocobase.com/13c87035ec1bb7332514676d3e896007.png) + +#### Режим выполнения + +При настройке событий после действия доступны два режима выполнения: + +![Выбор синхронного или асинхронного режима](https://static-docs.nocobase.com/bc83525c7e539d578f9e2e20baf9ab69.png) + +Используйте синхронный режим, если процесс должен выполняться и предоставлять обратную связь сразу после действия пользователя. В остальных случаях подходит асинхронный режим по умолчанию, где действие пользователя завершается мгновенно, а workflow продолжает выполняться в фоновом режиме. + +#### Настройка таблицы данных + +Для начала настройки перейдите на холст workflow и кликните на триггер, чтобы открыть окно параметров. Сначала выберите таблицу данных для привязки: + +![Выбор таблицы данных](https://static-docs.nocobase.com/35c49a91eba731127edcf76719c97634.png) + +#### Выбор режима триггера + +Затем определите режим срабатывания - локальный или глобальный: + +![Выбор режима триггера](https://static-docs.nocobase.com/317809c48b2f2a2d38aedc7d08abdadc.png) + +- **Локальный режим**: workflow срабатывает только на явно привязанных кнопках действий. Подходит для кастомизации под конкретные формы. +- **Глобальный режим**: workflow активируется любой кнопкой действия в таблице, независимо от происхождения формы. + +В локальном режиме можно привязать: +- Кнопки "Отправить" и "Сохранить" в новых формах +- Кнопки "Отправить" и "Сохранить" в формах редактирования +- Кнопку "Обновить данные" в строках таблиц + +#### Выбор типа действия + +В глобальном режиме укажите тип действия: +- "Создание записи" +- "Обновление записи" + +Workflow запускается после успешного выполнения выбранной операции. + +#### Предзагрузка связанных данных + +Если последующие шаги требуют связанных данных, выберите соответствующие поля отношений для предзагрузки: + +![Предзагрузка связей](https://static-docs.nocobase.com/5cded063509c7ba1d34f49bec8d68227.png) + +Эти данные будут доступны во всем workflow после срабатывания. diff --git a/docs/ru-RU/handbook/workflow-aggregate/index.md b/docs/ru-RU/handbook/workflow-aggregate/index.md new file mode 100644 index 0000000000..09ac7e5463 --- /dev/null +++ b/docs/ru-RU/handbook/workflow-aggregate/index.md @@ -0,0 +1,59 @@ +# Агрегация + +<PluginInfo name="workflow-aggregate" link="/handbook/workflow-aggregate"></PluginInfo> + +Этот плагин предназначен для выполнения агрегатных запросов к данным в таблицах, соответствующих заданным условиям, с возвратом статистических результатов. Особенно полезен для формирования отчетных данных. + +Узел использует агрегатные функции базы данных и в текущей версии поддерживает запросы к одному полю в одной таблице данных. Полученная статистика сохраняется в выходных данных узла и становится доступной для последующих узлов workflow. + +## Установка + +Это встроенный плагин, не требующий дополнительной установки. + +## Руководство пользователя + +### Создание узла + +В интерфейсе настройки workflow нажмите "+" в процессе, чтобы добавить узел "Агрегатный запрос": + +![Создание узла агрегации](https://static-docs.nocobase.com/7f9d806ebf5064f80c30f8b67f316f0f.png) + +### Настройка узла + +![Настройка узла агрегации](https://static-docs.nocobase.com/57362f747b9992230567c6bb5e986fd2.png) + +#### Агрегатные функции + +Поддерживаются пять SQL-функций: `COUNT`, `SUM`, `AVG`, `MIN` и `MAX`. Выберите нужную функцию для выполнения запроса. + +#### Тип цели + +Два способа выбора цели запроса: +1. Прямой выбор таблицы и поля +2. Выбор связанной таблицы и поля из контекста workflow + +#### Уникальные значения + +Соответствует ключевому слову `DISTINCT` в SQL. Поле для уникальности должно совпадать с выбранным полем таблицы. + +#### Условия фильтрации + +Применяются аналогично стандартным запросам таблицы с использованием переменных workflow. + +### Пример + +Рассмотрим пример подсчета общего количества статей в категории после добавления новой статьи. + +Создадим две таблицы: +1. "Статьи" (связь многие-к-одному с "Категориями") +2. "Категории" (связь один-ко-многим со "Статьями") + +Настроим workflow, срабатывающий при добавлении новой статьи, с узлом агрегации: + +![Пример настройки](https://static-docs.nocobase.com/542272e638c6c0a567373d1b37ddda78.png) + +Узел будет подсчитывать количество статей в категории новой статьи и сохранять результат. + +:::info{title=Совет} +Для доступа к связанным данным в триггере таблицы настройте "Предзагрузку ассоциаций", иначе поля будут недоступны. +::: diff --git a/docs/ru-RU/handbook/workflow-approval/action.md b/docs/ru-RU/handbook/workflow-approval/action.md new file mode 100644 index 0000000000..98509458e2 --- /dev/null +++ b/docs/ru-RU/handbook/workflow-approval/action.md @@ -0,0 +1,11 @@ +# Настройка инициирования согласования + +После настройки и активации workflow согласования, вы можете привязать его к кнопке отправки соответствующей формы таблицы данных. Эта настройка позволяет пользователям автоматически запускать процесс согласования при отправке формы: + +![Привязка workflow к кнопке](https://static-docs.nocobase.com/2872ff108c61d7bf6d0bfb19886774c6.png) + +После привязки workflow пользователи будут запускать процесс согласования при каждой отправке формы. + +:::info{title=Совет} +Кнопка инициирования согласования в настоящее время поддерживает только кнопки "Отправить" (или "Сохранить") в формах "Добавления" или "Редактирования". Она не поддерживает кнопку "Отправить в Workflow" (которая может быть привязана только к "Событию после действия"). +::: diff --git a/docs/ru-RU/handbook/workflow-approval/advanced.md b/docs/ru-RU/handbook/workflow-approval/advanced.md new file mode 100644 index 0000000000..60a74f7910 --- /dev/null +++ b/docs/ru-RU/handbook/workflow-approval/advanced.md @@ -0,0 +1,37 @@ +# Расширенное понимание + +## Снимок данных, отправленных на согласование + +В процессе согласования данные управляются на основе принципа **неменяемости транзакционных данных**. Каждая отправка данных создаёт снимок (snapshot), который затем отслеживается и передаётся в ходе процесса согласования. Поток этого процесса выглядит следующим образом: + +![Диаграмма процесса снимка данных на согласовании](https://static-docs.nocobase.com/62a545a85d9e72c6b47e4b52707c4380.png) + +Когда в процессе выполняются действия, такие как «отозвать» или «вернуть», система сохраняет снимок данных, которые существовали на тот момент, в рамках одного и того же документа заявки: + +![Пример процесса снимка данных на согласовании](https://static-docs.nocobase.com/62800d88772c88f1eaa11f6f493aea55.png) + +Как показано выше, каждый раз, когда данные отзываются и затем повторно отправляются, создаётся новый снимок для этого конкретного цикла подачи заявки. + +## Статусы процесса согласования + +Для инициатора заявки поле статуса документа указывает текущую стадию процесса согласования и обычно отражает следующие состояния: + +| Статус | Описание | +|----------------|--------| +| Черновик | Заявитель временно сохранил данные формы, но ещё не отправил её официально для запуска процесса. | +| Отправлено | Заявка отправлена и ожидает согласования. На этом этапе ни один из согласующих ещё не обработал заявку, и при наличии соответствующей настройки инициатор всё ещё может отозвать заявку. | +| В процессе | Заявка прошла как минимум один этап согласования, и по крайней мере один из согласующих уже вынес своё решение. На этом этапе инициатор уже не может отозвать заявку. | +| Возвращено | Заявка была возвращена одним из согласующих, что позволяет инициатору внести изменения и повторно отправить её. | +| Согласовано | Все этапы согласования пройдены, и заявка была одобрена на каждом этапе — процесс завершён. | +| Отклонено | Заявка была отклонена на одном из этапов согласования, в результате чего процесс завершён досрочно. | + +Для каждого этапа согласования создаётся запись о действии, выполненного назначенным согласующим. В каждой записи согласующего имеется поле статуса, указывающее текущее состояние обработки, которое обычно включает следующие значения: + +| Статус | Описание | +|----------------|--------| +| Назначен | Запись для соответствующего согласующего создана, но поскольку правило обработки требует последовательного согласования, согласующий должен дождаться завершения обработки предыдущим согласующим, прежде чем сможет действовать. | +| Ожидание | Заявка ожидает действий от текущего согласующего. | +| Возвращено | Текущий согласующий вернул заявку. | +| Согласовано | Текущий согласующий одобрил заявку. | +| Отклонено | Текущий согласующий отклонил заявку. | +| Не обработано | Заявка достигла конечного состояния согласно правилам обработки узла после действий других согласующих, либо рабочий процесс стал недействительным, поэтому от текущего согласующего больше не требуется никаких действий. | diff --git a/docs/ru-RU/handbook/workflow-approval/block.md b/docs/ru-RU/handbook/workflow-approval/block.md new file mode 100644 index 0000000000..f1b70a3baf --- /dev/null +++ b/docs/ru-RU/handbook/workflow-approval/block.md @@ -0,0 +1,75 @@ +# Блоки, связанные с процессом согласования + +## Блок согласования в деталях данных + +Во всплывающем окне деталей отправленного элемента можно настроить блок согласования, который отображает соответствующие записи и предоставляет точки входа для обработки: + +![Создание блока согласования](https://static-docs.nocobase.com/6b40f47474609d1dfd33618d80228189.png) + +### Действия инициатора + +Блок отображает основную информацию о заявке и историю согласования. Инициатор может просматривать детали своей заявки во всплывающем окне. Если отзыв разрешен и процесс находится на первом узле согласования, но еще не обработан ни одним согласующим, инициатор может отозвать заявку: + +![Просмотр инициатора](https://static-docs.nocobase.com/5c7d4a6dca8de820d154487e41808c2a.png) + +При отзыве заявки запись об отзыве отображается в блоке согласования. Нажатие на нее открывает заявку для повторного редактирования: + +![Просмотр после отзыва](https://static-docs.nocobase.com/df52cb5203c1fd0a2f7af1757fbf6ecd.png) + +Содержимое остается прежним, позволяя внести изменения и отправить повторно: + +![Повторная отправка](https://static-docs.nocobase.com/4b3a6119e9871760d2dbdc8a2a75ff2c.png) + +### Действия согласующих + +Согласующие также могут просматривать содержание через этот блок. В истории обработки, если текущий пользователь является ответственным за узел, в столбце деталей появляется кнопка "Просмотр": + +![Обработка узла согласующим](https://static-docs.nocobase.com/b160090482823ff5dc87592d0d5cedec.png) + +Во всплывающем окне отображается интерфейс согласующего, включающий детали заявки и панель действий: + +![Окно обработки согласующим](https://static-docs.nocobase.com/26acffffd314e86a658334ae9bef9d9b.png) + +Согласующие могут выполнять действия: утвердить, отклонить или вернуть на доработку. После действия создается соответствующая запись в истории. При возврате инициатор может изменить заявку и отправить повторно: + +![Возврат на доработку](https://static-docs.nocobase.com/5da879b24923ed25c31be658636ada64.png) + +Утверждение или отклонение изменяет статус согласно правилам узла: + +![Утверждение заявки](https://static-docs.nocobase.com/b020b1f82fce7c27b905ecf0b4c0046d.png) + +При настройке передачи или дополнительных подписей согласующие могут выполнять эти операции. Передача назначает ответственность за узел другому пользователю: + +![Операция передачи](https://static-docs.nocobase.com/20241226235129.png) + +После передачи новый пользователь появляется в списке согласующих: + +![После передачи](https://static-docs.nocobase.com/20241226235334.png) + +Дополнительная подпись позволяет добавить нескольких пользователей в список обработки: + +![Дополнительная подпись](https://static-docs.nocobase.com/20241226235556.png) + +Для последовательной обработки указывается порядок новых согласующих: + +![После дополнительной подписи](https://static-docs.nocobase.com/20241227000005.png) + +## Блок центра согласования + +Плагин предоставляет два глобальных блока для управления процессами: "Инициация согласования" и "Задачи на согласование": + +![Создание блока центра](https://static-docs.nocobase.com/fb3957320f082159f6f1f908937894b6.png) + +Блок "Инициация согласования" позволяет запускать новые процессы: + +![Инициация нового согласования](https://static-docs.nocobase.com/a888630f892f15882eb1ec6b8826c528.png) + +Пользователи могут просматривать статус своих заявок: + +![Просмотр списка инициированных](https://static-docs.nocobase.com/4379ff809ae6a545dccab434cf6a6cfb.png) + +Блок "Задачи на согласование" предназначен для согласующих: + +![Просмотр обработанных деталей](https://static-docs.nocobase.com/bc425bd18837d6a918c609849c38da5d.png) + +Обработанные заявки отображаются без возможности изменения. diff --git a/docs/ru-RU/handbook/workflow-approval/http-api.md b/docs/ru-RU/handbook/workflow-approval/http-api.md new file mode 100644 index 0000000000..3321f8b99d --- /dev/null +++ b/docs/ru-RU/handbook/workflow-approval/http-api.md @@ -0,0 +1,44 @@ +# HTTP API + +События утверждения не ограничиваются действиями в пользовательском интерфейсе; их также можно активировать с помощью вызовов HTTP API. + +Для утверждений, инициированных из блоков данных и блоков центра утверждения, вы можете инициировать их с помощью вызова API (на примере кнопки создания таблицы «posts»): + +```bash +curl -X POST -H 'Authorization: Bearer <your token>' -H 'X-Role: <roleName>' -d \ + '{ + "title": "Hello, world!", + "content": "This is a test post." + }' + "http://localhost:3000/api/posts:create?triggerWorkflows=workflowKey" +``` + +Параметр URL `triggerWorkflows` является ключом рабочего процесса, с несколькими рабочими процессами, разделенными запятыми. Вы можете найти этот ключ, наведя курсор на имя "workflow" в верхней части холста "workflow": + +![Как просмотреть ключ рабочего процесса](https://static-docs.nocobase.com/20240426135108.png) + +После успешного вызова будет запущен рабочий процесс утверждения для таблицы `posts`. + +:::info{title="Примечание"} +Поскольку внешние вызовы также полагаются на идентификацию пользователя, вызовы HTTP API должны включать данные аутентификации, как и стандартные запросы интерфейса. Сюда входит заголовок `Authorization` или параметр `token` (токен, полученный при входе в систему), а также заголовок `X-Role` (указывающий текущую роль пользователя). +::: + +Если вам нужно вызвать событие, связанное с отношением «один к одному» (обратите внимание, что отношения «один ко многим» пока не поддерживаются), вы можете использовать `!` в параметрах, чтобы указать связанное поле, которое должно вызвать событие: + +```bash +curl -X POST -H 'Authorization: Bearer <your token>' -H 'X-Role: <roleName>' -d \ + '{ + "title": "Hello, world!", + "content": "This is a test post.", + "category": { + "title": "Test category" + } + }' + "http://localhost:3000/api/posts:create?triggerWorkflows=workflowKey!category" +``` + +При успешном выполнении вызова будет запущено событие утверждения для таблицы `categories`. + +:::info{title="Примечание"} +При запуске событий через вызовы HTTP API убедитесь, что рабочий процесс включен и конфигурация таблицы данных верна; в противном случае вызов может быть неуспешным или может привести к ошибкам. +::: diff --git a/docs/ru-RU/handbook/workflow-approval/index.md b/docs/ru-RU/handbook/workflow-approval/index.md new file mode 100644 index 0000000000..218ac5c419 --- /dev/null +++ b/docs/ru-RU/handbook/workflow-approval/index.md @@ -0,0 +1,22 @@ +# Обзор + +<PluginInfo commercial="true" name="workflow-approval" link="/handbook/workflow-approval"></PluginInfo> + +Процессы утверждения специально разработаны для рабочих процессов, инициированных и управляемых отдельными лицами для определения статуса связанных данных. +Обычно используемые в автоматизации офиса и других сценариях, требующих принятия решений человеком, эти процессы включают создание и управление рабочими процессами, такими как «Заявки на отпуск», «Утверждения возмещения расходов» и «Утверждения закупок материалов». + +Плагин утверждения предлагает специальный тип рабочего процесса (триггер), известный как «Утверждение (событие)», и специализированный узел «Утверждение». В сочетании с уникальными пользовательскими таблицами и блоками данных NocoBase он обеспечивает быстрое и гибкое создание и управление различными сценариями утверждения. + +## Руководство пользователя + +Процесс утверждения организован в несколько ключевых разделов: + +- [Конфигурация триггера](./trigger.md) +- [Конфигурация узла утверждения](./node.md) +- [Инициирование конфигурации утверждения](./action.md) +- [Соответствующие блоки утверждения](./block.md) +- [Задача рабочего процесса](./tasks.md) + +Для более глубокого погружения в эти концепции см. [Дополнительно](./advanced.md). + +Чтобы вызвать этот процесс из внешней системы, обратитесь к [HTTP API](./http-api.md). diff --git a/docs/ru-RU/handbook/workflow-approval/node.md b/docs/ru-RU/handbook/workflow-approval/node.md new file mode 100644 index 0000000000..b88f7adb4a --- /dev/null +++ b/docs/ru-RU/handbook/workflow-approval/node.md @@ -0,0 +1,114 @@ +# Конфигурация узла утверждения + +В "workflow" утверждения требуется специальный узел «Утверждение» для настройки логики обработки (утверждения, отклонения или возврата) инициированного запроса на утверждение утверждающими. Этот узел «Утверждение» используется исключительно в "workflow" утверждения. + +:::info{title=Tip} +**Отличие от общего узла «Ручное»:** Общий узел «Ручное» универсален и может использоваться в различных рабочих процессах для ручного ввода данных, принятия решений о продолжении процесса и других сценариях. Напротив, узел «Утверждение» специализирован для "workflow" утверждения и не применим в других типах "workflow". +::: + +## Создание узла + +Чтобы создать узел «Утверждение», щелкните знак «плюс» («+») в "workflow". Затем выберите один из доступных режимов прохода для настройки узла утверждения: + +![Создание узла утверждения](https://static-docs.nocobase.com/f15d61208a3918d005cd2031fc9b6ce7.png) + +## Режимы прохода + +Доступны два режима прохода: + +1. Режим прямого прохода: этот режим идеально подходит для более простых "Workflow", где результат на узле утверждения определяет, завершается ли процесс. Если запрос не одобрен, процесс немедленно завершается. + +![Режим прохождения узла утверждения - режим прямого прохода](https://static-docs.nocobase.com/a9d446a186f61c546607cf1c2534b287.png) + +2. Режим ветвления: этот режим обычно используется для более сложных рабочих процессов. После того, как узел утверждения выдает результат, последующие узлы могут выполняться в полученных ветках. + +![Режим пропуска узла утверждения — режим ветвления](https://static-docs.nocobase.com/57dc6a8907f3bb02fb28c354c241e4e5.png) + +Если узел настроен с операцией «Возврат», будет создана ветка «Возврат», и процесс принудительно завершится после завершения ветки возврата. + +После «одобрения» этого узла процесс продолжается как через ветку пропуска, так и через последующий "workflow". После операции «отклонения» настройка по умолчанию позволяет процессу продолжаться через последующий "workflow", хотя вы можете настроить узел на завершение процесса после выполнения ветки отклонения. + +:::info{title=Tip} +Режим пропуска нельзя изменить после создания узла. +::: + +## Утверждающие + +Утверждающие — это пользователи, ответственные за действия по утверждению на узле. Они могут состоять из одного или нескольких пользователей, выбранных из статического списка или динамического значения, указанного переменной. + +![Approval Node_Approvers](https://static-docs.nocobase.com/29c64297d577b9ca9457b1d7ac62287d.png) + +При использовании переменной можно выбрать только первичные ключи или внешние ключи из данных пользователя в контексте и результатах узла. Если выбранная переменная является массивом (в случаях отношений «многие ко многим»), каждый пользователь в массиве будет объединен в общую коллекцию утверждающих. + +## Режимы согласования + +Если есть только один утверждающий (включая случаи, когда дедуплицируются несколько переменных), утверждение будет обрабатываться исключительно этим пользователем, независимо от выбранного режима согласования. + +Для нескольких утверждающих выбранный режим согласования определяет метод обработки: + +1. Или: узел проходит с одобрения любого одного человека; все должны отклонить, чтобы узел был отклонен. +2. И: узел проходит, только если все утверждающие одобряют; одно отклонение приводит к отклонению. +3. Голосование: узел проходит, если большинство (как указано) утверждающих одобряет; в противном случае узел отклоняется. + +Для операции возврата, если любой пользователь в коллекции утверждающих выбирает возврат, узел напрямую выходит из "workflow". + +## Порядок обработки + +Для нескольких утверждающих порядок обработки определяет последовательность действий: + +1. Параллельно: все утверждающие могут действовать в любом порядке, последовательность не требуется. +2. Последовательно: утверждающие действуют в порядке, определенном в коллекции утверждающих, где каждый последующий пользователь может продолжить работу только после того, как предыдущий представил свое решение. + +Независимо от того, установлена ли обработка «Последовательно», сгенерированные результаты будут следовать правилам, изложенным в разделе «Режимы переговоров», при этом узел завершает выполнение после выполнения условий. + +## Выход из рабочего процесса после завершения ветки отклонения + +Когда «Режим ветвления» установлен на «Режим пропуска», вы можете выбрать выход из "workflow" после завершения ветки отклонения. Если выбрано, в конце ветки отклонения появится символ «✗», указывающий, что никакие дальнейшие узлы не будут выполняться после завершения этой ветки: + +![Выход после отклонения](https://static-docs.nocobase.com/1e740df93c128fb6fe54bf85a740e683.png) + +## Конфигурация интерфейса утверждающего + +Конфигурация интерфейса утверждающего предоставляет интерфейс для утверждающих, когда "workflow" достигает этого узла. Нажмите кнопку конфигурации, чтобы открыть окно настроек: + +![Всплывающее окно конфигурации интерфейса утверждающего](https://static-docs.nocobase.com/2c321ae164b436f1c572305ff27cc9dd.png) + +В этом окне конфигурации можно добавлять блоки, такие как сведения об отправке утверждения, панели операций и настраиваемый текст подсказки: + +![Добавить блок в конфигурацию интерфейса](https://static-docs.nocobase.com/9f8f11926e935ad8f8fbeec368edebfe.png) + +### Блок подробностей + +Блок подробностей содержимого утверждения включает данные, отправленные инициатором. Подобно стандартному блоку данных, вы можете свободно добавлять компоненты полей из таблицы данных и упорядочивать их для организации содержимого, которое должен просмотреть утверждающий: + +![Блок сведений в конфигурации интерфейса](https://static-docs.nocobase.com/1140ec13caeea1b364d12e057720a29c.png) + +### Блок формы + +Блок формы операции может включать кнопки, поддерживаемые этим узлом, такие как «Утвердить», «Отклонить», «Вернуть», «Переназначить» и «Добавить утверждающего»: + +![Блок формы операции в конфигурации интерфейса](https://static-docs.nocobase.com/20241226232013.png) + +Кроме того, в форму операции можно добавлять поля, которые может изменять утверждающий. Эти поля будут отображаться в форме операции, когда утверждающий обрабатывает утверждение. Утверждающий может изменять значения этих полей, и после отправки данные, используемые для утверждения, и соответствующий снимок данных в процессе утверждения будут обновлены одновременно. + +![approval_node_ui_configuration_action_form_modify_fields](https://static-docs.nocobase.com/20241226232124.png) + +### "Утвердить", "Отклонить" и "Вернуть" + +Среди кнопок операций утверждения "Утвердить", "Отклонить" и "Вернуть" являются решающими действиями. После отправки задача утверждающего на этом узле завершается. Дополнительные поля для заполнения во время отправки, такие как "Комментарии", можно добавить во всплывающее окно "Конфигурация обработки" для каждой кнопки. + +![Конфигурация обработки формы операции](https://static-docs.nocobase.com/20241226232225.png) + +### «Переназначить» и «Добавить утверждающего» + +«Переназначить» и «Добавить утверждающего» — это нерешающие операции, используемые для динамической корректировки утверждающих в "workflow" утверждения. «Переназначить» передает задачу утверждения текущего пользователя другому пользователю, тогда как «Добавить утверждающего» вставляет дополнительного утверждающего до или после текущего утверждающего, позволяя новому утверждающему продолжить процесс утверждения. + +После включения кнопок операций «Переназначить» или «Добавить утверждающего» необходимо установить «Назначаемый диапазон пользователей» в меню конфигурации кнопки, чтобы определить область пользователей, которые могут быть назначены в качестве новых утверждающих: + +![Форма операции Назначаемый диапазон пользователей](https://static-docs.nocobase.com/20241226232321.png) + +Подобно исходной конфигурации утверждающего узла, назначаемый диапазон пользователей может быть напрямую выбран утверждающими или на основе условий запроса из таблицы пользователей. Конечным результатом будет объединенная коллекция, исключающая пользователей, уже находящихся в коллекции утверждающих. + +:::warning{title=Важно} +Если вы включаете или отключаете кнопку операции или изменяете назначаемый диапазон пользователей, обязательно сохраните конфигурацию узла после закрытия окна конфигурации интерфейса. В противном случае изменения кнопки операции не вступят в силу. +::: diff --git a/docs/ru-RU/handbook/workflow-approval/tasks.md b/docs/ru-RU/handbook/workflow-approval/tasks.md new file mode 100644 index 0000000000..afef066d4d --- /dev/null +++ b/docs/ru-RU/handbook/workflow-approval/tasks.md @@ -0,0 +1,25 @@ +# Задачи рабочего процесса + +Центр задач рабочего процесса предоставляет пользователям единую точку входа для просмотра и обработки задач. Задачи, инициированные текущим пользователем, и задачи, которые необходимо выполнить, можно открыть с помощью кнопки центра задач на верхней панели инструментов. А с помощью навигации по категориям в левой части пользователь может просматривать различные типы задач. + +![20250310161203](https://static-docs.nocobase.com/20250310161203.png) + +## Мои заявки + +### Просмотр инициированных заявок + +![20250310161609](https://static-docs.nocobase.com/20250310161609.png) + +### Применить новое одобрение + +![20250310161658](https://static-docs.nocobase.com/20250310161658.png) + +## Мои задачи по одобрению + +### To-do список + +![20250310161934](https://static-docs.nocobase.com/20250310161934.png) + +### Подробности утверждения + +![20250310162111](https://static-docs.nocobase.com/20250310162111.png) diff --git a/docs/ru-RU/handbook/workflow-approval/trigger.md b/docs/ru-RU/handbook/workflow-approval/trigger.md new file mode 100644 index 0000000000..09b1c844aa --- /dev/null +++ b/docs/ru-RU/handbook/workflow-approval/trigger.md @@ -0,0 +1,46 @@ +# Конфигурация триггера + +## Создание рабочего процесса + +Чтобы настроить "workflow" утверждения, начните с выбора типа «Утверждение» во время процесса создания "workflow": + +![Утверждение триггера_Создание "workflow" утверждения](https://static-docs.nocobase.com/f52dda854f46a669e0c1c7fb487a17ea.png) + +Далее в интерфейсе конфигурации "workflow" щелкните триггер, чтобы открыть всплывающее окно для дополнительных параметров конфигурации. + +## Привязка таблиц данных + +Плагин утверждения NocoBase разработан с учетом гибкости, что позволяет интегрировать его с любым пользовательским набором данных. Это означает, что нет необходимости повторно настраивать модель данных для процессов утверждения. Вместо этого вы можете повторно использовать существующие наборы данных. +При настройке триггера первым шагом является выбор таблицы данных, чтобы определить, какие записи данных будут запускать "workflow" при создании или обновлении: + +![Approval Trigger_Trigger Configuration_Select Data Table](https://static-docs.nocobase.com/8732a4419b1e28d2752b8f601132c82d.png) + +После выбора таблицы данных привяжите "workflow" к кнопке отправки в форме, используемой для создания или редактирования данных в выбранной таблице: + +![Initiate Approval_Bind Workflow](https://static-docs.nocobase.com/2872ff108c61d7bf6d0bfb19886774c6.png) + +После отправки формы будет запущен соответствующий "workflow" утверждения. Отправленные данные будут сохранены в указанной таблице данных, а также будут сделаны моментальные снимки в потоке утверждения для будущего просмотра утверждающими лицами. + +## Отозвано + +Если процесс утверждения позволяет инициатору отозвать запрос, выберите опцию «Разрешено отозвать»: + +![Approval Trigger_Trigger Configuration_Allow Withdrawal](https://static-docs.nocobase.com/09185712fc55bc536892136ce0ade4a8.png) + +Если выбрана эта опция, инициатор может отозвать запрос на утверждение в любое время до того, как какой-либо утверждающий его обработает. Однако после обработки любых последующих узлов утверждения утверждение больше не может быть отозвано. + +## Настройка интерфейса формы для инициирования утверждений + +Наконец, вам нужно будет настроить интерфейс формы для инициатора. Этот интерфейс используется при инициировании утверждения из блока Approval Center или при повторной инициации после отзыва. Нажмите кнопку конфигурации, чтобы открыть всплывающее окно: + +![Approval Trigger_Trigger Configuration_Initiator Form](https://static-docs.nocobase.com/ca8b7e362d912138cf7d73bb60b37ac1.png) + +Вы можете добавить форму на основе таблицы привязанных данных или включить пояснительный текст (Markdown) для руководства инициатора. Форма обязательна; в противном случае инициатор не сможет продолжить работу при входе в этот интерфейс. + +После добавления блока формы вы можете настроить соответствующие компоненты полей таблицы данных и расположить их по мере необходимости для организации содержимого, которое нужно заполнить, аналогично обычному интерфейсу конфигурации формы: + +![Approval Trigger_Trigger Configuration_Initiator Form_Field Configuration](https://static-docs.nocobase.com/5a1e7f9c9d8de092c7b55585dad7d633.png) + +В дополнение к кнопке «Отправить» вы также можете добавить кнопку «Сохранить черновик» для поддержки временного хранения данных во время процесса: + +![Approval Trigger_Trigger Configuration_Initiator Form_Action Configuration](https://static-docs.nocobase.com/2f4850d2078e94538995a9df70d3d2d1.png) diff --git a/docs/ru-RU/handbook/workflow-custom-action-trigger/action.md b/docs/ru-RU/handbook/workflow-custom-action-trigger/action.md new file mode 100644 index 0000000000..2cd81f134a --- /dev/null +++ b/docs/ru-RU/handbook/workflow-custom-action-trigger/action.md @@ -0,0 +1,60 @@ +# Конфигурация действий + +В зависимости от типа контекста, настроенного в "workflow", конфигурация кнопок действий в разных блоках также будет отличаться. + +## Нет + +> v.1.6.0+ + +На панели действий и других блоках данных можно добавить кнопку «Запустить "workflow"»: + +![Блокировать кнопку добавления операции_панель операций](https://static-docs.nocobase.com/20250215221738.png) + +![Блокировать кнопку добавления операции_календарь](https://static-docs.nocobase.com/20250215221942.png) + +![Блокировать кнопку добавления операции_диаграмма Ганта](https://static-docs.nocobase.com/20250215221810.png) + +После добавления привяжите ранее созданный "workflow" с типом контекста «Нет», как пример кнопки на панели действий: + +![Кнопка привязки рабочего процесса_панель операций](https://static-docs.nocobase.com/20250215222120.png) + +![Выберите рабочий процесс для привязки_без контекста](https://static-docs.nocobase.com/20250215222234.png) + +## Отдельная запись + +В любом блоке данных у вас есть возможность добавить кнопку «Запустить "workflow"» на панель действий для отдельных строк данных, будь то формы, таблицы или страницы с подробностями: + +![Добавить кнопку действия в Block_Form](https://static-docs.nocobase.com/20240509165428.png) + +![Добавить кнопку действия в строку Block_Table](https://static-docs.nocobase.com/20240509165340.png) + +![Добавить кнопку действия в Block_Detail](https://static-docs.nocobase.com/20240509165545.png) + +После добавления кнопки вы можете связать ее с ранее созданным "workflow": + +![Привязать кнопку к рабочему процессу](https://static-docs.nocobase.com/20240509165631.png) + +![Выбрать рабочий процесс для Bind](https://static-docs.nocobase.com/20240509165658.png) + +После этого простое нажатие этой кнопки инициирует событие настраиваемого действия: + +![Trigger Result After Button Click](https://static-docs.nocobase.com/20240509170453.png) + +## Несколько записей + +> v.1.6.0+ + +В панели действий блока таблицы при добавлении кнопки «Trigger Workflow» будет дополнительная возможность выбора типа контекста как «None» или «Multiple Records»: + +![Блокировка кнопки добавления действия_table](https://static-docs.nocobase.com/20250215222507.png) + +При выборе «None» это глобальное событие, и только "workflow" с типом контекста, установленным на «Нет», могут быть привязаны. + +При выборе «Несколько записей» вы можете привязать "workflow" с типом «Несколько записей», которые могут использоваться для пакетных операций после выбора нескольких записей (в настоящее время поддерживается только в таблицах). +Доступные "workflow" ограничены теми, которые настроены для соответствия коллекции текущего блока данных: + +![20250215224436](https://static-docs.nocobase.com/20250215224436.png) + +При нажатии кнопки для запуска вы должны уже выбрать некоторые строки данных в таблице, в противном случае "workflow" не будет запущен: + +![20250215224736](https://static-docs.nocobase.com/20250215224736.png) diff --git a/docs/ru-RU/handbook/workflow-custom-action-trigger/example.md b/docs/ru-RU/handbook/workflow-custom-action-trigger/example.md new file mode 100644 index 0000000000..7f8d690d37 --- /dev/null +++ b/docs/ru-RU/handbook/workflow-custom-action-trigger/example.md @@ -0,0 +1,48 @@ +# Пример + +Представьте, что у нас есть коллекция «Sample». Для образцов, помеченных как «Collected», необходима операция «Send to Testing». Эта операция сначала проверяет основную информацию образца, генерирует запись «Testing», а затем обновляет статус образца на «Testing». Весь этот процесс слишком сложен, чтобы его можно было обработать простым нажатием кнопок «Create, Read, Update, Delete». +В таких сценариях идеальным решением являются события настраиваемых операций. + +Для начала создайте коллекцию «Sample» и коллекцию «Testing» и введите некоторые основные тестовые данные в коллекцию Sample: + +![Example_Sample_Data_Table](https://static-docs.nocobase.com/20240509172234.png) + +Далее вам нужно будет создать "workflow" «Custom action Event». Если вам требуется немедленная обратная связь во время операции, выберите синхронный режим (имейте в виду, что синхронный режим не поддерживает асинхронные узлы, такие как вмешательство человека): + +![Example_Create_Workflow](https://static-docs.nocobase.com/20240509173106.png) + +В конфигурации триггера выберите «Sample» в качестве коллекции: + +![Example_Trigger_Configuration](https://static-docs.nocobase.com/20240509173148.png) + +Теперь организуйте логику процесса в соответствии с потребностями вашего бизнеса. Например, вы можете настроить ее так, чтобы операция «Отправить на тестирование» была разрешена только в том случае, если параметр индекса превышает `90`; в противном случае выдается соответствующее предупреждение: + +![Example_Business_Logic_Arrangement](https://static-docs.nocobase.com/20240509174159.png) + +:::info{title=Note} +Узел "[Response Message](../../nodes/response-message.md)" может использоваться в синхронных событиях настраиваемых операций для отправки сообщений обратной связи клиенту. Эта функция недоступна в асинхронном режиме. +::: + +После настройки и включения рабочего процесса вернитесь в интерфейс таблицы и добавьте кнопку «Запустить рабочий процесс» в столбце операций: + +![Example_Add_Operation_Button](https://static-docs.nocobase.com/20240509174525.png) + +Далее в меню конфигурации кнопки выберите опцию привязки "workflow" и откройте окно конфигурации: + +![Example_Open_Workflow_Binding_Popup](https://static-docs.nocobase.com/20240509174633.png) + +Добавьте "workflow", который был включен ранее: + +![Example_Select_Workflow](https://static-docs.nocobase.com/20240509174723.png) + +После отправки переименуйте кнопку, чтобы отразить действие, например «Тестирование», и настройка завершена. + +Чтобы использовать эту функцию, выберите любой образец данных из таблицы и нажмите кнопку «Отправить на тестирование», чтобы запустить событие пользовательской операции. Согласно заранее установленной логике, если параметр индекса образца ниже 90, вы увидите предупреждающее сообщение, подобное этому: + +![Example_Inspection_Criteria_Not_Met](https://static-docs.nocobase.com/20240509175026.png) + +Если параметр индекса больше 90, процесс будет продолжаться, как и ожидалось, создавая запись «Тестирование записи» и обновляя статус образца на «Тестирование»: + +![Example_Inspection_Successful](https://static-docs.nocobase.com/20240509175247.png) + +И вот вам — простое событие пользовательской операции. Этот подход можно аналогичным образом применить к другим сложным бизнес-операциям, таким как обработка заказов или отправка отчетов, используя пользовательские события операций для достижения желаемых результатов. diff --git a/docs/ru-RU/handbook/workflow-custom-action-trigger/http-api.md b/docs/ru-RU/handbook/workflow-custom-action-trigger/http-api.md new file mode 100644 index 0000000000..526b1c0e6f --- /dev/null +++ b/docs/ru-RU/handbook/workflow-custom-action-trigger/http-api.md @@ -0,0 +1,62 @@ +# HTTP API + +События пользовательских действий могут быть вызваны не только действиями пользовательского интерфейса, но и вызовами HTTP API. В частности, эти события вводят новый тип операции, называемый `trigger`, для всех операций по сбору данных, что позволяет инициировать "workflow" через стандартный API операций NocoBase. + +Например, "workflow", обычно вызываемый кнопкой, можно вызвать с помощью следующей команды: + +```bash +curl -X POST -H 'Authorization: Bearer <your token>' -H 'X-Role: <roleName>' \ + "http://localhost:3000/api/samples:trigger/<:id>?triggerWorkflows=workflowKey" +``` + +Поскольку эта операция нацелена на одну запись данных, при ее вызове для существующих данных необходимо указать идентификатор строки данных, заменив часть `<:id>` URL. + +При вызове API для отправки формы (например, добавления или обновления данных) можно опустить идентификатор для новых записей, но необходимо предоставить соответствующие данные в качестве контекста выполнения: + +```bash +curl -X POST -H 'Authorization: Bearer <your token>' -H 'X-Role: <roleName>' -d \ + '{ + "title": "Sample 1", + "indicator": 91 + }' + "http://localhost:3000/api/samples:trigger?triggerWorkflows=workflowKey" +``` + +Для обновления формы необходимо указать как идентификатор строки данных, так и обновленные данные: + +```bash +curl -X POST -H 'Authorization: Bearer <your token>' -H 'X-Role: <roleName>' -d \ + '{ + "title": "Sample 1", + "indicator": 91 + }' + "http://localhost:3000/api/samples:trigger/<:id>?triggerWorkflows=workflowKey" +``` +Если предоставлены и идентификатор, и данные, то сначала будет загружена указанная строка данных, а затем предоставленные данные перезапишут исходную строку для создания окончательного контекста триггера. + +:::warning{title="Примечание"} +Если предоставлены реляционные данные, они также будут перезаписаны. Будьте особенно осторожны при работе с реляционными данными с предзагрузочными ассоциациями, чтобы избежать непреднамеренного изменения связанных данных. +::: + +Кроме того, параметр URL `triggerWorkflows` обозначает ключ(и) "workflow". Несколько "workflow" можно разделить запятыми. Вы можете получить этот ключ, наведя указатель мыши на имя "workflow" в верхней части холста "workflow": + +![Метод просмотра ключа рабочего процесса](https://static-docs.nocobase.com/20240426135108.png) + +После успешного вызова будет запущено событие пользовательской операции для таблицы `samples`. + +:::info{title="Tip"} +Поскольку внешние вызовы API также требуют аутентификации пользователя, необходимо включить в запрос информацию об аутентификации, как и в запросы, отправляемые из стандартного интерфейса. Сюда входит заголовок `Authorization` или параметр `token` (токен, полученный после входа в систему) и заголовок `X-Role` (текущее имя роли пользователя). +::: + +Если вам нужно вызвать событие для элемента данных "многие к одному" (в настоящее время не поддерживается для отношений "многие ко многим"), вы можете указать данные триггера соответствующего поля, используя `!` в параметре: + +```bash +curl -X POST -H 'Authorization: Bearer <your token>' -H 'X-Role: <roleName>' \ + "http://localhost:3000/api/posts:trigger/<:id>?triggerWorkflows=workflowKey!category" +``` + +После успешного вызова будет запущено пользовательское событие операции для соответствующей таблицы `categories`. + +:::info{title="Tip"} +При запуске события через HTTP API убедитесь, что "workflow" включен и конфигурация коллекции верна. В противном случае вызов может завершиться неудачей или привести к ошибкам. +::: diff --git a/docs/ru-RU/handbook/workflow-custom-action-trigger/index.md b/docs/ru-RU/handbook/workflow-custom-action-trigger/index.md new file mode 100644 index 0000000000..0472580787 --- /dev/null +++ b/docs/ru-RU/handbook/workflow-custom-action-trigger/index.md @@ -0,0 +1,21 @@ +# Обзор + +<PluginInfo name="workflow-custom-action-trigger" link="/handbook/workflow-custom-action-trigger" commercial="true"></PluginInfo> + +NocoBase предоставляет встроенные стандартные операции с данными, такие как создание, чтение, обновление и удаление. Однако, когда этих операций недостаточно для удовлетворения сложных бизнес-требований, можно использовать события настраиваемых действий в "workflow". Эти события можно связать с кнопкой "Trigger Workflow" на блоках страниц, что позволяет выполнять операции с данными, соответствующие конкретным потребностям. + +:::info{title=Note} +"Custom Action Event" развился из режима "Submit to Workflow", который находится в функции "Post-Action Event". Начиная с версии `v1.0.0-alpha.7`, он был выделен в отдельное событие и переименован в "Custom Action Event". + +::: + +## Руководство пользователя + +События пользовательских действий используются в нескольких ключевых областях: + +- [Конфигурация триггера](./trigger.md) +- [Конфигурация действия](./action.md) + +Практические примеры использования этих событий см. в разделе [Примеры](./example.md). + +Если требуется интеграция с внешней системой, см. руководство [Http Api](./http-api.md). diff --git a/docs/ru-RU/handbook/workflow-custom-action-trigger/trigger.md b/docs/ru-RU/handbook/workflow-custom-action-trigger/trigger.md new file mode 100644 index 0000000000..4be62af35a --- /dev/null +++ b/docs/ru-RU/handbook/workflow-custom-action-trigger/trigger.md @@ -0,0 +1,35 @@ +# Конфигурация триггера + +## Создание "workflow" + +При настройке "workflow" начните с выбора «Событие пользовательского действия»: + +![Создание рабочего процесса «Событие пользовательской операции»](https://static-docs.nocobase.com/20240509091820.png) + +## Конфигурация триггера + +### Тип контекста + +> v.1.6.0+ + +Различные типы контекста определяют, где "workflow" может быть привязан к кнопкам в разных блоках: + +* None: глобальное событие, которое может быть привязано к кнопкам действий на панели действий и других блоках данных. +* Отдельная запись: может быть привязана к кнопкам действий в блоках данных, таких как строки таблицы, формы и сведения. +* Несколько записей: может быть привязано к кнопкам пакетной операции в блоке таблицы. + +![Тип_контекста_конфигурации_триггера](https://static-docs.nocobase.com/20250215135808.png) + +### Коллекция + +Когда тип контекста — одна запись или несколько записей, вам нужно будет выбрать коллекцию, которая будет связана с вашей моделью данных: + +![Конфигурация триггера_Выбор таблицы данных](https://static-docs.nocobase.com/20240509150515.png) + +### Данные ассоциации для использования + +Если ваш "workflow" требует использования связанных данных из строки данных триггера, вы можете выбрать необходимые поля глубокой связи здесь: + +![Конфигурация триггера_Выбор связей данных для использования](https://static-docs.nocobase.com/20240509154856.png) + +Эти поля будут автоматически предварительно загружены в контекст "workflow" после запуска события, что сделает их доступными для использования в "workflow". diff --git a/docs/ru-RU/handbook/workflow-date-calculation/index.md b/docs/ru-RU/handbook/workflow-date-calculation/index.md new file mode 100644 index 0000000000..a9b886045e --- /dev/null +++ b/docs/ru-RU/handbook/workflow-date-calculation/index.md @@ -0,0 +1,131 @@ +# Расчет даты + +<PluginInfo name="workflow-date-calculation" link="/handbook/workflow-date-calculation" commercial="true"></PluginInfo> + +Узел расчета даты предлагает набор из девяти мощных функций, позволяющих выполнять такие операции, как добавление или вычитание периодов времени, форматирование строк времени и преобразование единиц длительности. Каждая функция разработана с определенными типами входных и выходных значений и может легко интегрировать результаты из других узлов в качестве переменных параметров. +Объединяя эти функции через конвейер вычислений, вы можете добиться желаемого результата с точностью. + +## Руководство пользователя + +### Создание узла + +Чтобы добавить узел «Вычисление даты» в интерфейсе конфигурации "workflow", просто нажмите кнопку «плюс» («+») в процессе: + +![Создать узел для вычисления даты](https://static-docs.nocobase.com/[图片].png) + +### Конфигурация узла + +![Конфигурация узла для вычисления даты](https://static-docs.nocobase.com/20240817184423.png) + +#### Входное значение + +Входные значения могут быть как переменными, так и константами даты. Переменные могут включать данные, которые запускают рабочий процесс или результаты из узлов выше по течению. Константы могут быть любой выбранной датой. + +#### Тип входного значения + +Тип входного значения определяет, как будет обрабатываться вход, и делится на два типа: + +* Тип даты: сюда входят любые входные данные, которые можно преобразовать в формат даты и времени, например числовые временные метки или строки, представляющие время. + +* Тип числа: тип входного значения влияет на выбор шагов расчета времени, поэтому крайне важно выбрать правильный тип. + +#### Шаги расчета + +Каждый шаг расчета состоит из определенной функции и ее конфигурации параметров. Конструкция конвейера позволяет передавать выходные данные одной функции непосредственно в следующую, обеспечивая последовательность вычислений и преобразований времени. + +Тип выходных данных после каждого шага фиксирован, что, в свою очередь, определяет функции, доступные для следующего шага. Если типы совместимы, расчет продолжается; если нет, результат текущего шага становится конечным выходом узла. + +### Функции расчета + +#### Добавить диапазон + +- Допустимый тип входного значения: Дата +- Параметры: + - Сумма для прибавления, которая может быть числовым значением или переменной внутри узла. + - Единица времени (например, дни, часы). +- Тип выходного значения: Дата +- Пример: если входное значение равно `2024-7-15 00:00:00`, сумма равна `1`, а единица измерения — «дни», выход будет равен `2024-7-16 00:00:00`. + +#### Вычесть диапазон + +- Допустимый тип входного значения: Дата +- Параметры: + - Сумма для вычитания, которая может быть числовым значением или переменной внутри узла. + - Единица времени (например, дни, часы). +- Тип выходного значения: Дата +- Пример: если входное значение равно `2024-7-15 00:00:00`, сумма равна `1`, а единица измерения - "дни", выходное значение будет равно `2024-7-14 00:00:00`. + +#### Получить разницу с другим значением данных + +- Принятый тип входного значения: Дата +- Параметры: + - Дата для сравнения, которая может быть константой или переменной в контексте "workflow". + - Единица времени (например, дни, часы). + - Следует ли брать абсолютное значение. +- Параметры округления: сохранить десятичные дроби, округлить, округлить в большую или меньшую сторону. +- Тип выходного значения: числовой +- Пример: если входное значение равно `2024-7-15 00:00:00`, и вы сравниваете его с `2024-7-16 06:00:00`, используя в качестве единицы измерения "дни", не принимая абсолютное значение и сохраняя десятичные знаки, выход будет равен `-1,25`. + +:::info{title=Примечание} +Если выбраны и абсолютное значение, и округление, сначала применяется абсолютное значение, а затем округление. +::: + +#### Получить значение в определенной единице измерения входной даты + +- Допустимый тип входного значения: Дата +- Параметры: + - Единица времени (например, дни, часы). +- Тип выходного значения: числовой +- Пример: если входное значение равно `2024-7-15 00:00:00`, а единица измерения - "дни", выход будет равен `15`. + +#### Установить время начала блока + +- Принятый тип входного значения: Дата +- Параметры: +- Единица времени (например, дни, часы). +- Тип выходного значения: Дата +- Пример: Если входное значение равно `2024-7-15 14:26:30`, а единица измерения — «дни», выход будет равен `2024-7-15 00:00:00`. + +#### Установить время окончания блока + +- Принятый тип входного значения: Дата +- Параметры: +- Единица времени (например, дни, часы). +- Тип выходного значения: Дата +- Пример: Если входное значение равно `2024-7-15 14:26:30`, а единица измерения — «дни», выход будет равен `2024-7-15 23:59:59`. + +#### Високосный год + +- Допустимый тип входного значения: Дата +- Параметры: Нет +- Выходной тип значения: Логический +- Пример: Если входное значение равно `2024-7-15 14:26:30`, выходное значение будет `true`. + +#### Формат в строку + +- Допустимый тип входного значения: Дата +- Параметры: +- Формат, как указано в [Day.js: Формат](https://day.js.org/docs/zh-CN/display/format). +- Выходной тип значения: Строка +- Пример: Если входное значение равно `2024-7-15 14:26:30`, а формат равен `время равно YYYY/MM/DD HH:mm:ss`, выходное значение будет `время равно 2024/07/15 14:26:30`. + +#### Преобразование единиц + +- Допустимый тип входного значения: Числовой +- Параметры: +- Исходная единица времени. +- Целевая единица времени. +- Параметры округления: сохранить десятичные знаки, округлить, округлить в большую или меньшую сторону. +- Тип выходного значения: Числовой +- Пример: если входное значение равно `2`, исходная единица — «недели», целевая единица — «дни», и десятичные знаки не сохраняются, выходное значение будет равно `14`. + +### Пример + +![Пример узла расчета даты](https://static-docs.nocobase.com/20240817184137.png) + +Представьте себе рекламную акцию, в которой вы хотите автоматически установить время окончания акции при создании продукта. Это время окончания будет последним днем следующей недели в 23:59:59. Для этого можно создать две функции времени и связать их в конвейер: + +1. Рассчитать дату для следующей недели. +2. Скорректировать дату на последний день этой недели в 23:59:59. + +Сделав это, вы сгенерируете желаемое значение времени, которое затем можно передать следующему узлу, например узлу изменения таблицы данных, чтобы установить время окончания акции в базе данных. diff --git a/docs/ru-RU/handbook/workflow-delay/index.md b/docs/ru-RU/handbook/workflow-delay/index.md new file mode 100644 index 0000000000..cf9e03a115 --- /dev/null +++ b/docs/ru-RU/handbook/workflow-delay/index.md @@ -0,0 +1,40 @@ +# Задержка + +<PluginInfo name="workflow-delay" link="/handbook/workflow-delay"></PluginInfo> + +Узел задержки позволяет вам ввести паузу в "workflow". После завершения задержки вы можете настроить, следует ли продолжать следующий шаг или преждевременно завершить "workflow". + +Этот узел часто используется в тандеме с параллельными узлами ветки. Добавив узел задержки к одной из веток, вы можете эффективно управлять тайм-аутами. Например, в сценарии, где одна ветка требует ручной обработки, а другая включает узел задержки, вы можете определить результат, если ручной процесс превысит отведенное время. +Выбор «сбой тайм-аута» означает, что ручной процесс должен быть завершен в течение указанного периода времени. С другой стороны, выбор «продолжение тайм-аута» позволяет "worklfow" обходить ручной процесс после истечения задержки. + +## Установка + +Этот плагин встроен и не требует установки. + +## Руководство пользователя + +### Создание узла + +В интерфейсе конфигурации "workflow" щелкните знак плюс («+») в потоке, чтобы добавить узел «Задержка»: + +![Создать узел задержки](https://static-docs.nocobase.com/d0816999c9f7acaec1c409bd8fb6cc36.png) + +### Конфигурация узла + +![Конфигурация узла задержки](https://static-docs.nocobase.com/5fe8a36535f20a087a0148ffa1cd2aea.png) + +#### Время задержки + +Вы можете указать длительность задержки, введя число и выбрав единицу времени. Поддерживаемые единицы включают секунды, минуты, часы, дни и недели. + +#### Статус тайм-аута + +Вы можете установить статус тайм-аута на «Успешно и продолжить» или «Сбой и выход». Параметр «Успешно и продолжить» гарантирует, что "workflow" перейдет к следующим шагам после окончания задержки. +Наоборот, параметр «Неудача и выход» завершает "workflow" со статусом сбоя после окончания задержки. + +### Пример + +В сценарии, где рабочий заказ должен быть выполнен в течение определенного периода времени, вы можете добавить ручной узел в одну ветвь и узел задержки в другую в параллельных ветках. +Если ручной процесс не отвечает в течение 10 минут, статус рабочего заказа будет обновлен до «Время ожидания не обработано». + +![Пример узла задержки — Организация рабочего процесса](https://static-docs.nocobase.com/898c84adc376dc211b003a62e16e8e5b.png) diff --git a/docs/ru-RU/handbook/workflow-dynamic-calculation/collection.md b/docs/ru-RU/handbook/workflow-dynamic-calculation/collection.md new file mode 100644 index 0000000000..944868cae5 --- /dev/null +++ b/docs/ru-RU/handbook/workflow-dynamic-calculation/collection.md @@ -0,0 +1,24 @@ +# Коллекция выражений + +## Создание шаблона «Коллекция выражений» + +Перед использованием узлов динамических операций выражений в "workflow" необходимо сначала создать таблицу шаблонов «Выражение» с помощью инструмента управления таблицами данных. Эта таблица служит хранилищем для различных выражений: + +![Создание таблицы шаблонов выражений](https://static-docs.nocobase.com/33afe3369a1ea7943f12a04d9d4443ce.png) + +## Ввод данных выражений + +После этого вы можете настроить блок таблицы и ввести несколько записей формул в таблицу шаблонов. Каждую строку в таблице шаблонов «Выражение» можно рассматривать как правило вычисления, разработанное для определенной модели данных в таблице. Вы можете использовать различные поля из моделей данных различных таблиц в качестве переменных, создавая уникальные выражения в качестве правил вычисления. Более того, вы можете использовать различные механизмы вычисления по мере необходимости. + +![Ввод данных выражений](https://static-docs.nocobase.com/761047f8daabacccbc6a924a73564093.png) + +:::info{title=Tip} +После того, как формулы установлены, их необходимо связать с бизнес-данными. Прямое связывание каждой строки бизнес-данных с данными формул может быть утомительным, поэтому распространенным подходом является использование таблицы метаданных, похожей на таблицу классификации, для создания отношения «многие к одному» (или «один к одному») с таблицей формул. +Затем бизнес-данные связываются с классифицированными метаданными в отношении «многие к одному». Этот подход позволяет вам просто указать соответствующие классифицированные метаданные при создании бизнес-данных, что упрощает поиск и использование соответствующих данных формул через установленный путь ассоциации. +::: + +## Загрузка соответствующих данных в процесс + +В качестве примера рассмотрим создание "workflow", запускаемого событием таблицы данных. При создании заказа триггер должен предварительно загрузить связанные данные о продукте вместе с данными выражения, связанными с продуктом: + +![Data Table Event_Trigger Configuration](https://static-docs.nocobase.com/f181f75b10007afd5de068f3458d2e04.png) diff --git a/docs/ru-RU/handbook/workflow-dynamic-calculation/example.md b/docs/ru-RU/handbook/workflow-dynamic-calculation/example.md new file mode 100644 index 0000000000..9831d57ba9 --- /dev/null +++ b/docs/ru-RU/handbook/workflow-dynamic-calculation/example.md @@ -0,0 +1,65 @@ +# Пример + +Следуя шагам настройки, описанным выше, давайте проиллюстрируем, как рассчитать окончательную цену для разных продуктов, применяя различные правила ценообразования в процессе размещения заказа. + +1. Настройте коллекцию продуктов: + + | Имя поля | Тип | + |-------------------| ---------------------- | + | Название продукта | Текст | + | Цена | Число | + | Правило цены |`belongsTo` (коллекция правил ценообразования)| + +2. Настройте коллекцию правил цен (используя шаблон коллекции выражений): + + | Имя поля | Тип | + |--------------------|------------------------------------| + | Имя правила | Текст | + | Коллекция | Одиночный выбор (сбор данных) | + | Расчетная машина | Одиночный выбор (mathjs/formulajs) | + | Выражение | Текст | + +3. Правила ценообразования на входе: + + | ID | Имя | Коллекция | Расчетная машина | Выражение | + | --- |---------|-----------| ------------------ | ------------------------- | + | 1 | 80% off | Продукт | formula.js | `{{Product.Price}} * 0.8` | + | 2 | 90% off | Продукт | formula.js | `{{Product.Price}} * 0.9` | + +4. Создайте продукты и назначьте правила ценообразования: + + | ID | Название продукта | Цена | Правило цены | + | --- | ------------- | ----- | ------------- | + | 1 | iPhone 14 Pro | 7999 | 2 | + | 2 | iPhone 13 Pro | 6999 | 1 | + +5. Настройте "workflow", запускаемый при создании заказа: + + ![Trigger_CreateOrder](https://static-docs.nocobase.com/f181f75b10007afd5de068f3458d2e04.png) + +6. Создайте узел расчета динамического выражения и настройте его с помощью правила «Данные триггера/Продукт/Цена»: + +![SelectDynamicExpressionData](https://static-docs.nocobase.com/21ccc63e604dd90b7d26c3c33c12d671.png) + +Установите источник данных переменной на продукт в данных триггера: + +![SelectVariableDataSource](https://static-docs.nocobase.com/afbffe9661539d26e4b175ae8a4b28f7.png) + +7. Добавьте узел обновления данных для обновления общей стоимости заказа с помощью результата из узла расчета: + +![UpdateOrderData](https://static-docs.nocobase.com/5cc7ffb113c8d6a2fd3b1b34abe06dcc.png) + +8. Запустите "workflow" при создании заказа и проверьте цены в заказе Список: + + | Заказать продукт | Цена | Правило цены | Общая цена | + | ---------------- |------|----------------|----------------------| + | iPhone 14 Pro | 7999 | Rule1: 90% off | 7999 \* 0.9 = 7199.1 | + | iPhone 13 Pro | 6999 | Rule2: 80% off | 6999 \* 0.8 = 5599.2 | + + Окончательная цена, отображаемая на изображении ниже, должна соответствовать рассчитанной цене в коллекции выше: + +![OrderTotalPrice_AfterCreation](https://static-docs.nocobase.com/a5610aca292e79c4841c97457bd3cc7c.png) + +:::info{title=Tip} +Поскольку "workflow" работает асинхронно, общая цена может не сразу отразиться в коллекции после создания заказа. Возможно, вам придется немного подождать, прежде чем обновлять страницу, чтобы увидеть обновленную общую цену. +::: diff --git a/docs/ru-RU/handbook/workflow-dynamic-calculation/index.md b/docs/ru-RU/handbook/workflow-dynamic-calculation/index.md new file mode 100644 index 0000000000..bb85ce9a61 --- /dev/null +++ b/docs/ru-RU/handbook/workflow-dynamic-calculation/index.md @@ -0,0 +1,21 @@ +# Обзор + +<PluginInfo name="workflow-dynamic-calculation" link="/handbook/workflow-dynamic-calculation"></PluginInfo> + +Узлы динамических вычислений отличаются от узлов операторов тем, что позволяют выполнять разнообразные вычисления на основе выражений, связанных с данными. +В то время как традиционные поля формул ограничены применением одной фиксированной формулы ко всем строкам данных, динамические вычисления решают это ограничение, позволяя "workflow" обрабатывать различные методы вычислений для различных строк данных. + +Например, для различных категорий продуктов в данных заказа могут потребоваться различные статистические формулы для вычисления определенных данных отчета. + +## Установка + +Этот плагин предварительно установлен и не требует дополнительной настройки. + +## Руководство пользователя + +Использование динамических выражений включает несколько ключевых разделов: + +- [Таблица шаблонов "Выражение"](./collection.md) +- [Узел](./node.md) + +Практические примеры см. в разделе [Примеры](./example.md). diff --git a/docs/ru-RU/handbook/workflow-dynamic-calculation/node.md b/docs/ru-RU/handbook/workflow-dynamic-calculation/node.md new file mode 100644 index 0000000000..7951b1564f --- /dev/null +++ b/docs/ru-RU/handbook/workflow-dynamic-calculation/node.md @@ -0,0 +1,23 @@ +# Конфигурация узла + +## Создание узла + +Создайте узел динамического расчета: + +![Создание узла динамического расчета](https://static-docs.nocobase.com/14613f73a7dfc822a30276c8c04cdeb7.png) + +## Конфигурация узла + +## Выражение расчета + +В отличие от параметров выражения в стандартном узле расчета, динамические выражения должны выбираться на основе предварительно загруженных данных, а не напрямую вводить выражение. Выберите предварительно загруженные данные правила скидки на продукт из триггера: + +![Выберите данные динамического выражения](https://static-docs.nocobase.com/21ccc63e604dd90b7d26c3c33c12d671.png) + +### Источник переменных данных + +Вам также необходимо выбрать объект строки данных из таблицы, который будет использоваться в качестве переменной в выражении. Это можно выбрать из контекста "workflow", где результаты были предварительно загружены или запрошены. Объект должен быть строкой данных из таблицы, связанной с данными выражения. В этом случае выберите данные продукта: + +![Выберите источник переменных данных](https://static-docs.nocobase.com/afbffe9661539d26e4b175ae8a4b28f7.png) + +Сохранение конфигурации узла завершает весь процесс настройки. diff --git a/docs/ru-RU/handbook/workflow-javascript/index.md b/docs/ru-RU/handbook/workflow-javascript/index.md new file mode 100644 index 0000000000..ce15a5f0c0 --- /dev/null +++ b/docs/ru-RU/handbook/workflow-javascript/index.md @@ -0,0 +1,123 @@ +# JavaScript + +<PluginInfo name="workflow-script" link="/handbook/workflow-script" commercial="true"></PluginInfo> + +Узел JavaScript позволяет пользователям выполнять пользовательские скрипты Node.js в "workflow". Эти скрипты могут использовать переменные "workflow" в качестве параметров и возвращать значения, которые могут использовать последующие узлы. + +Скрипт поддерживает большинство функций Node.js, но имеет некоторые отличия от собственной среды выполнения. Подробности см. в [Списке функций](#feature-list). + +## Руководство пользователя + +### Создание узла + +В интерфейсе конфигурации "workflow" нажмите кнопку «плюс» («+») в "workflow", чтобы добавить узел «Скрипт»: + +![20241007122632](https://static-docs.nocobase.com/20241007122632.png) + +### Конфигурация узла + +![20241007122825](https://static-docs.nocobase.com/20241007122825.png) + +#### Параметры + +Используйте параметры для передачи переменных или статических значений из контекста "workflow" в сценарий, делая их доступными в логике сценария. `name` представляет имя параметра, которое будет служить именем переменной в сценарии. `value` представляет значение параметра, которое может быть переменной "workflow" или константой. + +#### Содержимое скрипта + +Содержимое скрипта функционирует как одна функция, в которой вы можете написать любой код JavaScript, поддерживаемый средой Node.js. Используйте оператор `return`, чтобы предоставить значение в качестве выходных данных узла, сделав его доступным в качестве переменной для нижестоящих узлов. + +После написания скрипта используйте кнопку теста под редактором, чтобы открыть диалоговое окно выполнения теста. Заполните параметры статическими значениями для моделирования. В диалоговом окне отображаются возвращаемое значение и выходные данные (журналы) после выполнения. + +![20241007153631](https://static-docs.nocobase.com/20241007153631.png) + +#### Настройка тайм-аута + +Установите тайм-аут в миллисекундах. Значение `0` означает отсутствие тайм-аута. + +#### Продолжить рабочий процесс при ошибке + +Если включено, "workflow" будет продолжен, даже если скрипт обнаружит ошибку или тайм-аут. + +:::info{title="Примечание"} +Когда скрипт завершается неудачей, он не возвращает значение, а вывод узла будет содержать сообщение об ошибке. Если последующие узлы используют переменную результата из этого узла скрипта, обращайтесь с этим осторожно. +::: + +## Список функций + +### Версия Node.js + +Версия Node.js совпадает с версией, используемой основным приложением. + +### Поддержка модулей + +Скрипт позволяет ограниченно использовать модули, придерживаясь стандарта CommonJS. Используйте директиву `require()` для импорта модулей в ваш код. + +Он поддерживает собственные модули Node.js и модули, установленные в `node_modules` (включая зависимости, используемые NocoBase). Чтобы сделать модули доступными в коде, объявите их в переменной среды приложения `WORKFLOW_SCRIPT_MODULES`. Разделяйте несколько имен модулей запятыми, например: + +```ini +WORKFLOW_SCRIPT_MODULES=crypto,timers,lodash,dayjs +``` + +:::info{title="Примечание"} +Модули, не объявленные в `WORKFLOW_SCRIPT_MODULES`, включая собственные модули Node.js или установленные `node_modules`, **не могут** использоваться в скриптах. Эта стратегия позволяет администраторам контролировать модули, доступные пользователям, что снижает риск чрезмерных разрешений скрипта. +::: + +### Глобальные переменные + +Глобальные переменные, такие как `global`, `process`, `__dirname` и `__filename` **не поддерживаются**. + +```js +console.log(global); // выдаст ошибку: "global is not defined" +``` + +### Входные параметры + +Параметры, настроенные в узле, обрабатываются в скрипте как глобальные переменные и могут использоваться напрямую. Поддерживаются только базовые типы, такие как `boolean`, `number`, `string`, `object` и массивы. Объекты `Date` при передаче преобразуются в строки в формате ISO. +Другие сложные типы, такие как экземпляры пользовательских классов, не могут быть переданы напрямую. + +### Возвращаемые значения + +Используйте оператор `return` для возврата данных базовых типов (таких же, как правила параметров) в узел в качестве его выходных данных. Если код не содержит оператора `return`, узел не будет иметь выходного значения. + +```js +return 123; +``` + +### Вывод (журналы) + +**Поддерживает** ведение журнала через `console`. + +```js +console.log('hello world!'); +``` + +Вывод узла скрипта также будет записан в соответствующие файлы журнала "workflow". + +### Асинхронные операции + +**Поддерживает** асинхронные функции с использованием `async` и `await`. Также **поддерживает** глобальный объект `Promise`. + +```js +async function test() { +return Promise.resolve(1); +} + +const value = await test(); +return value; +``` + +### Таймеры + +Чтобы использовать такие методы, как `setTimeout`, `setInterval` или `setImmediate`, импортируйте их из пакета `timers` Node.js. + +```js +const { setTimeout, setInterval, setImmediate, clearTimeout, clearInterval, clearImmediate } = require('timers'); + +асинхронная функция sleep(time) { +return new Promise((resolve) => setTimeout(resolve, time)); +} + +await sleep(1000); + +return 123; +``` diff --git a/docs/ru-RU/handbook/workflow-json-query/index.md b/docs/ru-RU/handbook/workflow-json-query/index.md new file mode 100644 index 0000000000..cc6bd468b2 --- /dev/null +++ b/docs/ru-RU/handbook/workflow-json-query/index.md @@ -0,0 +1,138 @@ +# JSON-вычисления + +<PluginInfo name="workflow-json-query" link="/handbook/workflow-json-query" commercial="true"></PluginInfo> + +Этот плагин предназначен для преобразования и вычисления сложных JSON-данных, генерируемых различными узлами, что позволяет последующим узлам эффективно использовать эти данные. Например, SQL-операции и узлы HTTP-запросов часто возвращают результаты в формате JSON. Узел JSON-вычислений позволяет преобразовать эти данные в конкретные значения и форматы переменных, необходимые для последующих этапов workflow. + +## Руководство пользователя + +### Создание узла + +Чтобы добавить узел "JSON-вычисления" в интерфейсе конфигурации workflow, просто нажмите кнопку плюс ("+") в процессе: + +![Создание узла](https://static-docs.nocobase.com/7de796517539ad9dfc88b7160f1d0dd7.png) + +:::info{title=Совет} +Узлы JSON-вычислений обычно размещаются под другими узлами данных для удобства анализа их вывода. +::: + +### Конфигурация узла + +#### Движок парсинга + +Узел JSON-вычислений поддерживает различные движки парсинга, каждый со своим уникальным синтаксисом. Вы можете выбрать движок в зависимости от ваших потребностей. В настоящее время доступны три движка: + +- [JMESPath](https://jmespath.org/) +- [JSONPath Plus](https://jsonpath-plus.github.io/JSONPath/docs/ts/) +- [JSONata](https://jsonata.org/) + +![Выбор движка парсинга](https://static-docs.nocobase.com/29be3b92a62b7d20312d1673e749f2ec.png) + +#### Источник данных + +Источником данных может быть либо вывод вышестоящего узла, либо объект данных в контексте процесса. Обычно это неструктурированный объект данных, например, результаты SQL-узла или узла HTTP-запроса. + +![Источник данных](https://static-docs.nocobase.com/f5a97e20693b3d30b3a994a576aa282d.png) + +:::info{title=Совет} +Объекты данных, связанные с таблицами данных, обычно уже структурированы через информацию о конфигурации таблицы и, как правило, не требуют парсинга узлом JSON-вычислений. +::: + +#### Выражение парсинга + +Вы можете создать собственное выражение парсинга в соответствии с вашими потребностями и выбранным движком. + +![Выражение парсинга](https://static-docs.nocobase.com/181abd162fd32c09b62f6aa1d1cb3ed4.png) + +:::info{title=Совет} +Разные движки парсинга используют разный синтаксис; обратитесь к документации по ссылкам для получения подробной информации. +::: + +Начиная с версии `v1.0.0-alpha.15`, выражения поддерживают использование переменных. Эти переменные предварительно обрабатываются перед выполнением конкретного движка, заменяясь соответствующими строковыми значениями согласно правилам строковых шаблонов и объединяясь с другими статическими элементами выражения. Эта функция особенно полезна при динамическом построении выражений, например, при парсинге JSON-содержимого, требующего динамических ключей. + +#### Сопоставление свойств + +Когда результат парсинга представляет собой объект (или массив объектов), вы можете использовать сопоставление свойств для преобразования нужных атрибутов в подпеременные для использования последующими узлами. + +![Сопоставление свойств](https://static-docs.nocobase.com/b876abe4ccf6b4709eb8748f21ef3527.png) + +:::info{title=Совет} +Для результатов в виде объектов (или массивов объектов), если вы не выполняете сопоставление свойств, весь объект (или массив объектов) будет сохранен как одна переменная в результате узла, что делает невозможным прямой доступ к значениям атрибутов объекта как к отдельным переменным. +::: + +### Пример + +Предположим, вам нужно проанализировать данные из SQL-узла, который возвращает набор данных о заказах: + +```json +[ + [ + { + "id": 1, + "products": [ + { + "id": 1, + "title": "Product 1", + "price": 100, + "quantity": 1 + }, + { + "id": 2, + "title": "Product 2", + "price": 120, + "quantity": 2 + } + ] + }, + { + "id": 2, + "products": [ + { + "id": 3, + "title": "Product 3", + "price": 130, + "quantity": 1 + }, + { + "id": 4, + "title": "Product 4", + "price": 140, + "quantity": 2 + } + ] + } + ] +] +``` + +:::info{title=Совет} +Внешний массив в коде выше не случаен; он отражает типичный вывод SQL-узла. Это связано с тем, что результат SQL-узла представляет собой бинарный массив, где первый элемент содержит результаты запроса, а второй элемент — метаданные о запросе. +::: + +Если вам нужно проанализировать и вычислить общую стоимость для каждого заказа и собрать эти данные в объект с соответствующим ID заказа, готовый для обновления общей стоимости заказа, настройка будет выглядеть следующим образом: + +![Пример - Конфигурация парсинга SQL](https://static-docs.nocobase.com/e62322a868b26ff98120bfcd6dcdb3bd.png) + +1. Выберите движок парсинга JSONata; +2. Выберите результат SQL-узла в качестве источника данных; +3. Используйте выражение JSONata `$[0].{"id": id, "total": products.(price * quantity)}` для парсинга; +4. Выберите сопоставление свойств для отображения `id` и `total` как подпеременных; + +Конечный результат парсинга будет выглядеть так: + +```json +[ + { + "id": 1, + "total": 340 + }, + { + "id": 2, + "total": 410 + } +] +``` + +Затем вы можете перебрать массив завершенных заказов, чтобы обновить общую стоимость каждого заказа. + +![Обновление общей стоимости соответствующего заказа](https://static-docs.nocobase.com/b3329b0efe4471f5eed1f0673bef740e.png) diff --git a/docs/ru-RU/handbook/workflow-json-variable-mapping/index.md b/docs/ru-RU/handbook/workflow-json-variable-mapping/index.md new file mode 100644 index 0000000000..e5bac432a7 --- /dev/null +++ b/docs/ru-RU/handbook/workflow-json-variable-mapping/index.md @@ -0,0 +1,73 @@ +# Сопоставление переменных JSON + +> v1.6.0 + +Этот узел используется для преобразования сложных JSON-структур из результатов предыдущих узлов в переменные, которые можно использовать в последующих узлах. Например, после сопоставления результатов узлов SQL-запросов или HTTP-запросов вы сможете обращаться к их свойствам в последующих узлах. + +:::info{title=Совет} +В отличие от узла «Вычисление JSON», узел «Сопоставление переменных JSON» не поддерживает пользовательские выражения и не зависит от сторонних движков. Он предназначен исключительно для сопоставления значений свойств из JSON-структуры, что делает его проще в использовании. +::: + +## Руководство по использованию + +### Создание узла + +В интерфейсе настройки рабочего процесса нажмите кнопку «+» в цепочке, чтобы добавить узел **«Сопоставление переменных JSON»**: + +![Создание узла](https://static-docs.nocobase.com/20250113173635.png) + +### Настройка узла + +#### Источник данных + +Источником данных может быть результат предыдущего узла или объект данных из контекста рабочего процесса. Обычно это неструктурированный объект данных, например, результат узла SQL-запроса или HTTP-запроса. + +![Источник данных](https://static-docs.nocobase.com/20250113173720.png) + +#### Ввод образца данных + +Вставьте фрагмент примера данных и нажмите кнопку «Разобрать», чтобы автоматически сгенерировать список переменных: + +![Ввод образца данных](https://static-docs.nocobase.com/20250113182327.png) + +Если в автоматически сгенерированном списке есть ненужные переменные, вы можете удалить их, нажав кнопку удаления. + +:::info{title=Совет} +Образец данных — это не окончательный результат выполнения; он используется только для генерации списка переменных. +::: + +#### Включить индексы массивов в пути + +Если этот параметр не отмечен, содержимое массивов будет сопоставляться в соответствии с методом обработки переменных по умолчанию в NocoBase Workflow (см.: [Переменные](/handbook/workflow/advanced/variables#数据结构)). Например, для следующих данных: + +```json +{ + "a": 1, + "b": [ + { + "c": 2 + }, + { + "c": 3 + } + ] +} +``` + +Сгенерированная переменная `b.c` будет представлять массив `[2, 3]`. + +Если этот параметр отмечен, в пути переменных будут включены индексы массивов (например, `b.0.c` и `b.1.c`). + +![20250113184056](https://static-docs.nocobase.com/20250113184056.png) + +При включении индексов массивов убедитесь, что индексы во входных данных согласованы; в противном случае могут возникнуть ошибки парсинга. + +### Использование в последующих узлах + +В настройках последующих узлов вы можете использовать переменные, созданные узлом «Сопоставление переменных JSON»: + +![Использование в последующих узлах](https://static-docs.nocobase.com/20250113203658.png) + +Даже если JSON-структура сложная, после сопоставления вам нужно будет просто выбрать переменную, соответствующую нужному пути. + +--- diff --git a/docs/ru-RU/handbook/workflow-loop/index.md b/docs/ru-RU/handbook/workflow-loop/index.md new file mode 100644 index 0000000000..7fcb5446d4 --- /dev/null +++ b/docs/ru-RU/handbook/workflow-loop/index.md @@ -0,0 +1,113 @@ +# Цикл (Loop) + +<PluginInfo name="workflow-loop" link="/handbook/workflow-loop"></PluginInfo> + +Функционал цикла работает аналогично конструкциям `for`, `while` или `forEach` в языках программирования. Он предназначен для ситуаций, когда необходимо повторять определенные операции заданное количество раз или перебирать набор данных (например, массив). Узел цикла - это ваш основной инструмент для таких задач. + +## Установка + +Этот плагин предустановлен, поэтому дополнительная настройка не требуется. + +## Руководство пользователя + +### Создание узла + +В интерфейсе конфигурации workflow вы можете добавить узел "Цикл", нажав на знак плюс ("+") в процессе: + +![Создание узла цикла](https://static-docs.nocobase.com/b3c8061a66bfff037f4b9509ab0aad75.png) + +После создания узла цикла генерируется внутренняя ветка, специфичная для цикла. Вы можете заполнить эту ветку любым количеством узлов. Эти узлы будут иметь доступ не только к переменным контекста workflow, но и к локальным переменным, определенным в контексте цикла - таким как текущий объект данных или индекс итерации (который начинается с `0`). Эти локальные переменные ограничены исключительно циклом. Для вложенных циклов вы можете использовать переменные, специфичные для каждого уровня цикла. + +### Конфигурация узла + +![Конфигурация узла цикла](https://static-docs.nocobase.com/20241016135326.png) + +#### Объект цикла + +Узел цикла может обрабатывать различные типы данных для объекта цикла, каждый по-разному: + +1. **Массив**: Это наиболее распространенный случай использования. Обычно вы выбираете переменную контекста workflow, такую как результаты из узла запроса или предзагруженные данные из отношения многие-ко-многим. Если выбран массив, узел цикла будет перебирать каждый элемент, присваивая текущий элемент локальной переменной в контексте цикла для каждой итерации. + +2. **Число**: Когда объект цикла - число, оно рассматривается как количество итераций. Индекс в локальной переменной будет соответствовать значению объекта цикла. + +3. **Строка**: Если объект цикла - строка, цикл будет выполняться в соответствии с длиной строки, обрабатывая каждый символ по его индексу. + +4. **Другие**: Другие типы данных (включая объекты) рассматриваются как единый объект цикла, что приводит только к одной итерации - обычно не требующей цикла. + +Вы также можете вводить константы напрямую при работе с числами и строками. Например, ввод `5` (числовой тип) приведет к выполнению цикла 5 раз, а ввод `abc` (тип строки) приведет к 3 итерациям, обрабатывая `a`, `b` и `c` по отдельности. Инструмент выбора переменных позволяет выбрать тип константы, который вы хотите использовать. + +#### Условие цикла + +Начиная с версии `v1.4.0-beta`, добавлены параметры условия цикла, которые можно включить в конфигурации узла. + +**Условие** + +Аналогично конфигурации в узле условия, можно настроить комбинацию условий, а также использовать переменные из текущего цикла, такие как элемент цикла и индекс цикла. + +**Контрольная точка** + +Аналогично `while` и `do/while` в языках программирования, условия можно настроить для оценки либо перед каждой итерацией цикла, либо после ее завершения. Оценка после условия может выполнить другие узлы в теле цикла перед выполнением проверки условия. + +**Когда условие не выполняется** + +Аналогично операторам `break` и `continue` в языках программирования, можно использовать для определения, следует ли прервать или продолжить цикл. + +#### Обработка ошибок внутренних узлов в цикле + +Начиная с версии `v1.4.0-beta`, когда внутренний узел в цикле не выполняется (из-за невыполненных условий, ошибок и т.д.), следующий шаг можно определить через эту конфигурацию. Поддерживаются три метода обработки: + +* Выход из процесса (по умолчанию) +* Выход из цикла и продолжение процесса +* Переход к следующему элементу цикла + +Вы можете выбрать подходящий метод по мере необходимости. + +### Пример + +Рассмотрим следующий сценарий: при размещении заказа необходимо проверить наличие каждого товара в заказе. Если товар есть в наличии, его количество вычитается; в противном случае товар в деталях заказа помечается как недействительный. + +1. Создайте три коллекции: Товар <-(1:m)-- Детали заказа --(m:1)-> Заказ, со следующей моделью данных: + +| Название поля | Тип поля | +| -------------- | ----------------- | +| Детали заказа | Многие-к-одному (Детали) | +| Общая цена | Число | + +| Название поля | Тип поля | +| ---------- | ----------------- | +| Товар | Один-ко-многим (Товар) | +| Количество | Число | + +| Название поля | Тип поля | +| ----------- | ----------- | +| Название товара | Однострочный текст | +| Цена | Число | +| Наличие | Целое число | + +2. Создайте workflow, выбрав "Событие коллекции" в качестве триггера, и выберите таблицу "Заказ" с "Создать запись" в качестве триггера. Кроме того, предварительно загрузите данные отношений из таблицы "Детали заказа" и таблицы Товаров под деталями: + +![Пример конфигурации триггера узла цикла](https://static-docs.nocobase.com/0086601c2fc0e17a64d046a4c86b49b7.png) + +3. Создайте узел цикла, выбрав объект цикла как "Данные триггера / Детали заказа", который перебирает каждую запись в таблице деталей заказа: + +![Пример конфигурации узла цикла](https://static-docs.nocobase.com/2507becc32db5a9a0641c198605a20da.png) + +4. Внутри узла цикла создайте узел "Условие" для проверки наличия товара: + +![Пример конфигурации узла условия](https://static-docs.nocobase.com/a6d08d15786841e1a3512b38e4629852.png) + +5. Если товар есть в наличии, создайте узел "Вычисление" и узел "Обновить запись" под веткой "Да" для обновления количества после вычитания: + +![Пример конфигурации узла вычисления](https://static-docs.nocobase.com/8df3604c71f8f8705b1552d3ebfe3b50.png) + +![Пример конфигурации узла обновления наличия](https://static-docs.nocobase.com/2d84baa9b3b01bd85fccda9eec992378.png) + +6. Если товара нет в наличии, создайте узел "Обновить запись" под веткой "Нет" для обновления статуса детали заказа на "Недействительно": + +![Пример конфигурации узла обновления деталей заказа](https://static-docs.nocobase.com/4996613090c254c69a1d80f3b3a7fae2.png) + +Полная структура процесса показана ниже: + +![Пример структуры процесса узла цикла](https://static-docs.nocobase.com/6f59ef246c1f19976344a7624c4c4151.png) + +После настройки и активации этого workflow, каждый раз при создании нового заказа система будет автоматически проверять наличие каждого товара в заказе. Если товар есть в наличии, его количество будет вычтено; в противном случае товар в деталях заказа будет помечен как недействительный (помогая рассчитать действительную общую цену заказа). diff --git a/docs/ru-RU/handbook/workflow-manual/block.md b/docs/ru-RU/handbook/workflow-manual/block.md new file mode 100644 index 0000000000..b64d35fdbe --- /dev/null +++ b/docs/ru-RU/handbook/workflow-manual/block.md @@ -0,0 +1,19 @@ +# Блок задач (To-Do) + +Для удобства ручной обработки на страницу следует добавить список задач. Этот список будет отображать задания, требующие внимания, позволяя ответственным сотрудникам легко получать доступ и управлять конкретными задачами в рамках ручного узла. + +## Добавление блоков + +Чтобы добавить блок списка задач, выберите "Workflow Todo" из доступных блоков на странице: + +![Добавление блока задач для ручного узла](https://static-docs.nocobase.com/198b417454cd73b704267bf30fe5e647.png) + +Пример блока списка задач: + +![Пример списка задач](https://static-docs.nocobase.com/cfefb0d2c6a91c5c9dfa550d6b220f34.png) + +## Детали задачи + +Сотрудники могут кликнуть на соответствующую задачу, чтобы открыть всплывающее окно для ручной обработки: + +![Детали задачи](https://static-docs.nocobase.com/ccfd0533deebff6b3f6ef4408066e688.png) diff --git a/docs/ru-RU/handbook/workflow-manual/example.md b/docs/ru-RU/handbook/workflow-manual/example.md new file mode 100644 index 0000000000..c51192e176 --- /dev/null +++ b/docs/ru-RU/handbook/workflow-manual/example.md @@ -0,0 +1,85 @@ +# Примеры + +### Проверка статьи + +Представим сценарий, в котором обычный пользователь отправляет статью. Прежде чем статья будет опубликована, её должен проверить и одобрить администратор. Если статья не проходит проверку, она остаётся в черновике и не публикуется. Весь этот процесс можно реализовать с помощью узла «Обновить форму» в рамках ручного процесса. + +Для начала создайте рабочий процесс, который запускается при действии «Добавить статью», и добавьте в него узел ручного ввода: + +<figure> + <img alt="Ручной узел — Пример рабочего процесса проверки статьи" src="https://github.com/nocobase/nocobase/assets/525658/2021bf42-f372-4f69-9c84-5a786c061e0e" width="360" /> +</figure> + +Внутри этого узла назначьте ответственного — администратора. Затем в интерфейсе настройки добавьте блок, отображающий детали новой статьи на основе данных триггера: + +<figure> + <img alt="Ручной узел — Пример настройки узла: блок с деталями статьи" src="https://github.com/nocobase/nocobase/assets/525658/c61d0aac-23cb-4387-b60e-ce3cc7bf1c24" width="680" /> +</figure> + +Далее добавьте блок с формой «Обновить данные» в интерфейсе настройки. Эта форма должна быть связана с таблицей статей, чтобы администратор мог решить, одобрять ли статью. После добавления формы автоматически появится кнопка «Продолжить процесс», нажатие которой будет означать одобрение. Кроме того, добавьте кнопку «Прервать процесс» для случаев, когда статья отклоняется: + +<figure> + <img alt="Ручной узел — Пример настройки узла: форма и действия" src="https://github.com/nocobase/nocobase/assets/525658/4baaf41e-3d81-4ee8-a038-29db05e0d99f" width="673" /> +</figure> + +Когда процесс продолжается, статус статьи должен быть обновлён. Существует два основных способа сделать это. Первый — отобразить поле статуса статьи непосредственно в форме, чтобы оператор мог выбрать его. Этот метод особенно полезен в сценариях, где требуется активный ввод, например, при добавлении комментариев: + +<figure> + <img alt="Ручной узел — Пример настройки узла: поля формы" src="https://github.com/nocobase/nocobase/assets/525658/82ea4e0e-25fc-4921-841e-e1a2782a87d1" width="668" /> +</figure> + +Для более простого процесса вы можете вместо этого настроить значения полей формы непосредственно на кнопке «Продолжить процесс». Например, добавьте поле «Статус» со значением «Опубликовано». Тогда при нажатии кнопки статья автоматически обновится до статуса «Опубликовано»: + +<figure> + <img alt="Ручной узел — Пример настройки узла: присвоение значений в форме" src="https://github.com/nocobase/nocobase/assets/525658/0340bd9f-8323-4e4f-bc5a-8f81be3d6736" width="711" /> +</figure> + +Далее из меню настройки в правом верхнем углу блока формы выберите условия фильтрации данных для обновления. В данном случае выберите таблицу «Статья» и установите условие фильтрации: «ID равен Переменные триггера / Данные триггера / ID»: + +<figure> + <img alt="Ручной узел — Пример настройки узла: условия формы" src="https://github.com/nocobase/nocobase/assets/525658/da004055-0262-49ae-88dd-3844f3c92e28" width="1020" /> +</figure> + +Наконец, для повышения удобства использования можно настроить заголовки блоков, текст кнопок и подсказки внутри полей формы: + +<figure> + <img alt="Ручной узел — Пример настройки узла: итоговая форма" src="https://github.com/nocobase/nocobase/assets/525658/21db5f6b-690b-49c1-8259-4f7b8874620d" width="678" /> +</figure> + +После выполнения этих шагов закройте панель настройки и нажмите кнопку сохранения. Рабочий процесс готов. После включения этого процесса при добавлении новой статьи он будет автоматически запускаться. Администратор увидит эту задачу в своём списке дел: + +<figure> + <img alt="Ручной узел — Пример: список задач по проверке статьи" src="https://github.com/nocobase/nocobase/assets/525658/4e1748cd-6a07-4045-82e5-286826607826" width="1363" /> +</figure> + +<figure> + <img alt="Ручной узел — Пример: детали задачи по проверке статьи" src="https://github.com/nocobase/nocobase/assets/525658/65f01fb1-8cb0-45f8-ac21-ec8ab59be449" width="680" /> +</figure> + +На основе деталей статьи администратор решает, публиковать её или нет. При нажатии кнопки «Одобрить» статус статьи обновляется на «Опубликовано». При нажатии кнопки «Отклонить» статья остаётся в черновике. + +### Утверждение отпуска + +Рассмотрим другой сценарий: сотрудник подаёт заявку на отпуск. Заявка должна быть одобрена руководителем, прежде чем вступит в силу, и данные об отпуске сотрудника будут соответствующим образом обновлены. Независимо от того, одобрена заявка или отклонена, сотруднику будет отправлено SMS-уведомление с помощью узла запроса (см. раздел [HTTP-запрос](#_HTTP_Request)). Этот процесс можно эффективно управлять с помощью пользовательской формы в узле ручного ввода. + +Создайте рабочий процесс, запускающийся при действии «Добавить заявку на отпуск», и добавьте узел ручного ввода, аналогично процессу проверки статьи. Однако в этом случае ответственным будет руководитель. Добавьте блок на основе данных триггера, чтобы отобразить детали новой заявки на отпуск. Затем добавьте блок с пользовательской формой, где руководитель может решить, одобрять ли заявку. Форма должна включать поля для статуса утверждения и причины отказа: + +<figure> + <img alt="Ручной узел — Пример настройки узла: утверждение отпуска" src="https://github.com/nocobase/nocobase/assets/525658/ef3bc7b8-56e8-4a4e-826e-ffd0b547d1b6" width="675" /> +</figure> + +В отличие от процесса проверки статьи, поскольку последующие шаги зависят от решения руководителя, здесь настроена только кнопка «Продолжить процесс» для отправки, а кнопка «Прервать процесс» не используется. + +Кроме того, после узла ручного ввода можно добавить узел условия, чтобы определить, одобрил ли руководитель заявку. В ветви «одобрено» добавьте узел обработки данных для обновления данных об отпуске, а после завершения ветви добавьте узел запроса для отправки SMS-уведомления сотруднику. Это завершит процесс, как показано ниже: + +<figure> + <img alt="Ручной узел — Пример: схема рабочего процесса утверждения отпуска" src="https://github.com/nocobase/nocobase/assets/525658/733f68da-e44f-4172-9772-a287ac2724f2" width="593" /> +</figure> + +Узел условия должен быть настроен по следующему критерию: **«Результат узла / Руководитель / Форма процесса / Утверждение» равно «Одобрено»**: + +<figure> + <img alt="Ручной узел — Пример: проверка условия утверждения отпуска" src="https://github.com/nocobase/nocobase/assets/525658/57b972f0-a3ce-4f33-8d40-4272ad205c20" width="678" /> +</figure> + +Данные в узле запроса можно настроить с использованием соответствующих переменных формы из узла ручного ввода, чтобы отправлять разные тексты SMS в зависимости от результата. После такой настройки рабочий процесс готов. После активации руководители смогут управлять заявками на отпуск прямо из списка своих задач, аналогично процессу проверки статьи. diff --git a/docs/ru-RU/handbook/workflow-manual/index.md b/docs/ru-RU/handbook/workflow-manual/index.md new file mode 100644 index 0000000000..b4525699f2 --- /dev/null +++ b/docs/ru-RU/handbook/workflow-manual/index.md @@ -0,0 +1,20 @@ +# Обзор + +<PluginInfo name="workflow-manual" link="/handbook/workflow-manual"></PluginInfo> + +Когда бизнес-процесс не может быть полностью автоматизирован, можно использовать ручной узел для передачи части полномочий по принятию решений человеку-оператору. + +При достижении ручного узла процесс приостанавливается и создает задачу для назначенного пользователя. В зависимости от статуса, выбранного пользователем при отправке, процесс либо возобновляется, либо остается на паузе, либо прекращается. Эта функция особенно ценна в сценариях, требующих утверждения процессов. + +## Установка + +Это встроенный плагин, не требующий дополнительной установки. + +## Руководство пользователя + +Использование ручных узлов делится на две части: + +- [Конфигурация узла](./node.md) +- [Блок задач (ToDo)](./block.md) + +Для более глубокого понимания практического применения вы можете обратиться к разделу [Примеры](./example.md). diff --git a/docs/ru-RU/handbook/workflow-manual/node.md b/docs/ru-RU/handbook/workflow-manual/node.md new file mode 100644 index 0000000000..5be3d040ba --- /dev/null +++ b/docs/ru-RU/handbook/workflow-manual/node.md @@ -0,0 +1,79 @@ +# Ручной узел + +## Создание узла + +В интерфейсе конфигурации workflow нажмите кнопку "+" внутри процесса, чтобы добавить узел "Ручной": + +![Создание ручного узла](https://static-docs.nocobase.com/4dd259f1aceeaf9b825abb4b257df909.png) + +## Настройка узла + +### Назначение ответственных + +Ручной узел требует назначения пользователя, который будет отвечать за выполнение задачи. Вы можете добавить список задач при настройке блоков на странице. Также необходимо настроить содержимое всплывающего окна задачи для каждого узла. + +Вы можете выбрать конкретного пользователя или использовать переменные для выбора первичного или внешнего ключа данных пользователя из контекста. + +![Настройка ручного узла - выбор переменной назначения](https://static-docs.nocobase.com/22fbca3b8e21fda3a831019037001445.png) + +:::info{title=Примечание} +В текущей версии ручной узел не поддерживает назначение нескольких пользователей, но эта функция планируется в будущих обновлениях. +::: + +### Настройка пользовательского интерфейса + +Настройка интерфейса списка задач является ключевой при конфигурации ручного узла. Нажав кнопку "Настроить", вы можете открыть отдельное всплывающее окно для конфигурации. Этот интерфейс работает как обычная страница и позволяет проектировать его с помощью WYSIWYG-редактора: + +![Настройка ручного узла - конфигурация интерфейса](https://static-docs.nocobase.com/fd360168c879743cf22d57440cd2590f.png) + +#### Вкладки + +Вкладки можно использовать для разделения различных типов контента. Например, одна вкладка может отображать утвержденные формы, другая - отклоненные, или вы можете использовать их для показа связанных данных. Вкладки можно свободно настраивать под ваши нужды. + +#### Блоки + +Доступные блоки делятся на две основные категории: Блоки данных и Блоки форм. Также доступны Markdown-блоки для информационных сообщений и статического контента. + +##### Блоки данных + +Блоки данных позволяют отображать информацию из триггеров или результаты обработки узлов, предоставляя контекст для исполнителя задачи. Например, если workflow запускается событием формы, можно создать блок данных для отображения деталей: + +![Настройка ручного узла - блок данных - триггер](https://static-docs.nocobase.com/675c3e58a1a4f45db310a72c2d0a404c.png) + +Аналогично можно настроить блоки данных для отображения результатов вышестоящих узлов: + +![Настройка ручного узла - блок данных - данные узла](https://static-docs.nocobase.com/a583e26e508e954b47e5ddff80d998c4.png) + +:::info{title=Примечание} +Во время настройки интерфейса данные не отображаются - они появятся только после запуска workflow. +::: + +##### Блоки форм + +Блоки форм критически важны, так как определяют продолжение workflow. Доступны три типа форм: + +- Пользовательская форма +- Форма создания записи +- Форма обновления записи + +![Настройка ручного узла - типы блоков форм](https://static-docs.nocobase.com/2d068f3012ab07e32a265405492104a8.png) + +Для форм создания/обновления нужно выбрать таблицу данных. Пользовательская форма создает временную форму без привязки к данным. + +Кнопки отправки формы можно настроить с тремя вариантами действий: + +- Продолжить процесс +- Завершить процесс +- Сохранить временно + +![Настройка ручного узла - типы кнопок формы](https://static-docs.nocobase.com/6b45995b14152e85a821dff6f6e3189a.png) + +Эти кнопки соответствуют состояниям узла: "Завершено", "Отклонено" или "Ожидание". Хотя бы одна из первых двух кнопок должна быть настроена. + +Для кнопки "Продолжить процесс" можно задать значения полей формы: + +![Настройка ручного узла - установка значений формы](https://static-docs.nocobase.com/2cec2d4e2957f068877e616dec3b56dd.png) + +![Настройка ручного узла - всплывающее окно значений](https://static-docs.nocobase.com/5ff51b60c76cdb76e6f1cc95dc3d8640.png) + +Это особенно полезно для проверки данных. Можно настроить несколько кнопок продолжения с разными значениями полей, что позволит workflow развиваться по разным сценариям. diff --git a/docs/ru-RU/handbook/workflow-parallel/index.md b/docs/ru-RU/handbook/workflow-parallel/index.md new file mode 100644 index 0000000000..de09cea729 --- /dev/null +++ b/docs/ru-RU/handbook/workflow-parallel/index.md @@ -0,0 +1,35 @@ +# Параллельные ветви + +Узлы параллельной ветки позволяют разделить процесс на несколько веток, каждая из которых настраивается с помощью отдельных узлов. В зависимости от выбранного режима ветви, подход к выполнению меняется. Когда необходимо выполнить несколько операций одновременно, узел параллельной ветки оказывается очень эффективным. + +## Установка + +Эта функция является встроенным плагином, поэтому установка не требуется. + +## Руководство пользователя + +### Создание узла + +В интерфейсе конфигурации "workflow" нажмите кнопку «плюс» («+»), чтобы добавить узел «Параллельная ветка» в процесс: + +![Parallel Branch_Add](https://static-docs.nocobase.com/9e0f3faa0b9335270647a30477559eac.png) + +После добавления узла параллельной ветки в процесс он автоматически создаст две подветки по умолчанию. Вы можете добавить больше ветвок, нажав соответствующую кнопку. Каждая ветка может включать столько узлов, сколько необходимо, а ненужные ветки можно удалить, нажав кнопку удаления в начале ветки. + +![Parallel Branch_Branch Management](https://static-docs.nocobase.com/36088a8b7970c8a1771eb3ee9bc2a757.png) + +### Конфигурация узла + +#### Режимы ветвления + +Узлы параллельного ветвления предлагают три режима: + +- **Все успешно**: процесс продолжает выполнять узлы, следующие за ветками, только если все ветки выполнены успешно. Если какая-либо ветка завершается раньше — из-за сбоя, ошибки или любого неуспешного состояния — весь узел параллельного ветвления завершается в этом состоянии. Это также называется «Режим всех». +- **Любой успешно**: процесс продолжит выполнять последующие узлы, как только какая-либо ветка будет выполнена успешно. Весь узел параллельного ветвления завершится раньше, только если все ветки завершатся неудачей или преждевременно, независимо от причины. Это известно как «Любой режим». +- **Любой успешный или неудачный**: процесс продолжит выполнение последующих узлов после успешного выполнения любой ветки. Однако если какая-либо ветка даст сбой, весь параллельный узел ветки будет завершен на ранней стадии в этом состоянии. Это также известно как «Режим гонки». + +Во всех режимах ветки выполняются последовательно слева направо. Процесс продолжает выполнение последующих узлов или завершается на ранней стадии после выполнения условий выбранного режима. + +### Пример + +См. пример, приведенный в разделе [Узел задержки](/handbook/workflow-delay#示例). diff --git a/docs/ru-RU/handbook/workflow-request-interceptor/action.md b/docs/ru-RU/handbook/workflow-request-interceptor/action.md new file mode 100644 index 0000000000..61895a5acd --- /dev/null +++ b/docs/ru-RU/handbook/workflow-request-interceptor/action.md @@ -0,0 +1,13 @@ +# Конфигурация действия + +Если вы установили конфигурацию триггера на «Срабатывает только при отправке формы, привязанной к этому "workflow"», вам необходимо вернуться в интерфейс формы и привязать "workflow" к соответствующей кнопке действия: + +![Привязка "workflow" к новому заказу](https://static-docs.nocobase.com/bae3931e60f9bcc51bbc222e40e891e5.png) + +В конфигурации привязки "workflow" выберите соответствующий "workflow". Обычно достаточно выбрать «Entire Form Data» в качестве контекста для запуска данных: + +![Выберите "workflow" для привязки](https://static-docs.nocobase.com/78e2f023029bd570c91ee4cd19b7a0a7.png) + +:::info{title=Примечание} +В настоящее время кнопки, привязанные к событиям до действия, поддерживают только кнопки «Отправить» (или «Сохранить»), «Обновить записи» и «Удалить» в формах для новых записей или обновлений. Кнопка «Trigger Workflow» не поддерживается (эту кнопку можно привязать только к событиям после действия). +::: diff --git a/docs/ru-RU/handbook/workflow-request-interceptor/advanced.md b/docs/ru-RU/handbook/workflow-request-interceptor/advanced.md new file mode 100644 index 0000000000..7d202fe816 --- /dev/null +++ b/docs/ru-RU/handbook/workflow-request-interceptor/advanced.md @@ -0,0 +1,42 @@ +# Расширенное понимание + +**Условия перехвата** + +В «событиях до действия» два конкретных условия могут привести к перехвату соответствующей операции: + +1. Процесс достигает узла «Завершить процесс». Как объяснялось ранее, если данные запуска не соответствуют условиям, установленным в узле «Условие», процесс следует по ветки «Нет», выполняя узел «Завершить процесс». Это приводит к завершению процесса, а запрошенная операция перехватывается. +2. Любой узел в процессе не может быть выполнен — будь то из-за ошибки или других исключительных обстоятельств. В таких случаях процесс завершается с соответствующим статусом, и операция перехватывается. Например, если «Запрос HTTP» используется для получения внешних данных и запрос не выполняется, процесс завершается в состоянии сбоя, одновременно перехватывая соответствующий запрос операции. + +После выполнения этих условий перехвата рассматриваемая операция полностью останавливается. Например, если перехвачена отправка заказа, соответствующие данные заказа не будут сгенерированы. + +**Параметры для соответствующих операций** + +В "workflow" «событий до действия» различные точки данных доступны как переменные внутри процесса в зависимости от операции: + +| Тип операции \\ Переменная | «Пользователь действовал» | «Роль пользователя выполнена» | Параметр операции: «ID» | Параметр: «Отправленные значения» | +| -------------------------- | ---------- | -------------------------- | ------------------------- | -------------------------------------------- | +| Создать запись | ✓ | ✓ | - | ✓ | +| Обновить запись | ✓ | ✓ | ✓ | ✓ | +| Удалить одну или несколько записей | ✓ | ✓ | ✓ | - | + +:::info{title=Tip} +Переменные "Переменные триггера / Параметр / Отправленные значения" в событиях до действия — это не фактические данные, хранящиеся в базе данных, а параметры, отправленные с операцией. Чтобы получить фактические данные базы данных, необходимо использовать узел "Запрос записи" в процессе. + +Кроме того, для операций удаления при работе с одной записью "ID" в параметрах операции — это простое значение. Однако для нескольких записей "ID" — это массив. +::: + +**Ответные сообщения** + +После настройки триггера можно определить соответствующую логику в "workflow". Обычно механизм ветвления узла «Условие» используется для принятия решения о «Завершении процесса» на основе определенных бизнес-условий, возвращая предопределенное «Ответное сообщение»: + +![Конфигурация процесса перехвата](https://static-docs.nocobase.com/cfddda5d8012fd3d0ca09f04ea610539.png) + +На этом этапе конфигурация "workflow" завершена. Вы можете проверить ее, отправив данные, которые не соответствуют настроенным условиям, что приведет к запуску логики перехвата. Это приведет к возврату ответного сообщения: + +![Сообщение об ошибке](https://static-docs.nocobase.com/06bd4a6b6ec499c853f0c39987f63a6a.png) + +**Состояние ответного сообщения** + +Если узел «Завершить процесс» настроен на выход со статусом «Успешно» и процесс достигает этого узла, запрос операции все равно будет перехвачен. Однако возвращенное ответное сообщение будет отображать статус «Успешно» (вместо «Ошибка»): + +![Сообщение об успешном статусе](https://static-docs.nocobase.com/9559bbf56067144759451294b18c790e.png) diff --git a/docs/ru-RU/handbook/workflow-request-interceptor/example.md b/docs/ru-RU/handbook/workflow-request-interceptor/example.md new file mode 100644 index 0000000000..cf6ef67f3f --- /dev/null +++ b/docs/ru-RU/handbook/workflow-request-interceptor/example.md @@ -0,0 +1,21 @@ +# Пример + +Основываясь на базовых инструкциях, предоставленных ранее, давайте рассмотрим пример сценария «Отправка заказа». В этом сценарии нам необходимо проверить уровень запасов всех продуктов, выбранных пользователем во время отправки заказа. Если у какого-либо продукта недостаточно запасов, отправка заказа будет заблокирована, и будет отображено соответствующее уведомление. Система выполнит итерацию по каждому продукту, и если у всех продуктов достаточно запасов, данные заказа будут успешно сгенерированы. + +Остальные шаги следуют той же процедуре, которая описана в инструкциях. Однако, поскольку заказ может включать несколько продуктов, в дополнение к установлению связи «многие ко многим» между «Заказ» <-- m:1 -- «Подробности» -- 1:m --> «Продукт» во время моделирования данных необходимо ввести узел «Цикл» в "workflow" «Событие перед действием». Этот цикл будет использоваться для проверки уровня запасов каждого продукта: + +![Example_Loop Check Process](https://static-docs.nocobase.com/8307de47d5629595ab6cf00f8aa898e3.png) + +Объект цикла должен быть установлен в массив "Details" в отправленных данных заказа: + +![Example_Loop Object Configuration](https://static-docs.nocobase.com/ed662b54cc1f5425e2b472053f89baba.png) + +В цикле используется узел проверки условия для определения достаточности запасов текущего продукта: + +![Example_Condition Check in Loop](https://static-docs.nocobase.com/4af91112934b0a04a4ce55e657c0833b.png) + +Другие конфигурации остаются в соответствии с теми, что указаны в основных инструкциях по использованию. При отправке заказа, если запас какого-либо продукта недостаточен, заказ будет заблокирован, и будет возвращено соответствующее уведомление. Во время тестирования вы можете попытаться отправить несколько продуктов в одном заказе, при этом у одного продукта будет недостаточно запасов, а у другого — достаточно. Полученное вами ответное сообщение будет выглядеть следующим образом: + +![Пример_Ответного сообщения на отправку](https://static-docs.nocobase.com/dd9e81084aa237bda0241d399ac19270.png) + +Как показано, ответное сообщение не указывает на недостаточный запас первого продукта, «iPhone 15 Pro», но указывает на недостаточный запас второго продукта, «iPhone 14 Pro». Это происходит, потому что запас первого продукта был достаточным, что позволило продолжить отправку, в то время как недостаточный запас второго продукта привел к блокировке заказа. diff --git a/docs/ru-RU/handbook/workflow-request-interceptor/http-api.md b/docs/ru-RU/handbook/workflow-request-interceptor/http-api.md new file mode 100644 index 0000000000..c05d0d3a11 --- /dev/null +++ b/docs/ru-RU/handbook/workflow-request-interceptor/http-api.md @@ -0,0 +1,64 @@ +# HTTP API + +Предоперационное событие интегрируется во время фазы обработки запроса, что позволяет запускать его через вызов HTTP API. + +Для "workflow", локально привязанных к кнопке действия, вы можете запустить их с помощью следующей команды (используя кнопку для таблицы `posts` в качестве примера): + +```bash +curl -X POST -H 'Authorization: Bearer <your token>' -H 'X-Role: <roleName>' -d \ + '{ + "title": "Hello, world!", + "content": "This is a test post." + }' + "http://localhost:3000/api/posts:create?triggerWorkflows=workflowKey" +``` +Параметр URL `triggerWorkflows` указывает ключ "workflow", с несколькими "workflow", разделенными запятыми. Вы можете найти этот ключ, наведя указатель мыши на имя "workflow" в верхней части холста "workflow": + +![Как просмотреть ключ рабочего процесса](https://static-docs.nocobase.com/20240426135108.png) + +После выполнения указанной выше команды будет запущено соответствующее событие предварительной операции для таблицы `posts`. После того, как связанный "workflow" будет обработан синхронно, данные будут созданы и возвращены как обычно. + +Если настроенный "workflow" достигнет «Завершения процесса», запрос будет перехвачен, и данные не будут созданы, следуя той же логике, что и операция интерфейса. Если статус конечного узла установлен на сбой, код статуса ответа будет `400`; в случае успеха он будет `200`. + +Если узел "Response Message" настроен до конечного узла, сгенерированное сообщение будет включено в ответ. Структура сообщения об ошибке следующая: + +```json +{ + "errors": [ + { + "message": "message from 'Response Message' node" + } + ] +} +``` + +Если «конечный узел» настроен успешно, структура сообщения выглядит следующим образом: + +```json +{ + "messages": [ + { + "message": "message from 'Response Message' node" + } + ] +} +``` + +:::info{title=Note} +Поскольку в "workflow" можно добавлять несколько узлов «Ответное сообщение», структура данных возвращаемого сообщения представляется в виде массива. +::: + +Если событие перед операцией настроено глобально, нет необходимости указывать соответствующий "workflow" с помощью параметра URL `triggerWorkflows` при вызове HTTP API. Простой вызов соответствующей операции таблицы данных автоматически запустит ее. + +```bash +curl -X POST -H 'Authorization: Bearer <your token>' -H 'X-Role: <roleName>' -d \ + '{ + "title": "Hello, world!", + "content": "This is a test post." + }' + "http://localhost:3000/api/posts:create" +``` + +:::info{title="Примечание"} +При запуске событий после операции через вызов HTTP API убедитесь, что "workflow" включен и конфигурация таблицы данных соответствует ожидаемой настройке. В противном случае вызов может завершиться неудачей или привести к ошибкам. +::: diff --git a/docs/ru-RU/handbook/workflow-request-interceptor/index.md b/docs/ru-RU/handbook/workflow-request-interceptor/index.md new file mode 100644 index 0000000000..5f4dffc4d7 --- /dev/null +++ b/docs/ru-RU/handbook/workflow-request-interceptor/index.md @@ -0,0 +1,17 @@ +# Обзор + +<PluginInfo name="workflow-request-interceptor" link="/handbook/workflow-request-interceptor" commercial="true"></PluginInfo> + +Плагин событий перед операцией представляет собой мощный механизм перехвата запросов на операции формы. Этот перехват происходит после отправки операции формы, но до ее обработки. Если запущенный процесс включает узел "Завершить процесс" или если какие-либо другие узлы не выполняются правильно (из-за ошибок или неполного выполнения), операция формы будет перехвачена. +В противном случае операция будет выполнена по плану. В сочетании с узлом "Сообщение ответа" эта функция позволяет настроить процесс для возврата клиенту определенных ответных сообщений, предлагая четкие и релевантные подсказки. События перед операцией идеально подходят для проверки бизнес-данных или логики, позволяя утверждать или перехватывать отправленные клиентом запросы на создание, обновление или удаление записей. + +## Руководство пользователя + +Использование предоперационных событий включает несколько ключевых шагов: + +- [Конфигурация триггера](./trigger.md) +- [Конфигурация операции](./node.md) + +Для более глубокого понимания вы можете изучить [Расширенное использование](./advanced.md) и увидеть, как оно применяется в реальных сценариях, просмотрев [Примеры](./example.md). + +Если вам необходимо интегрироваться с внешней системой, обратитесь к [Внешнему вызову](./http-api.md). diff --git a/docs/ru-RU/handbook/workflow-request-interceptor/trigger.md b/docs/ru-RU/handbook/workflow-request-interceptor/trigger.md new file mode 100644 index 0000000000..7132cdef95 --- /dev/null +++ b/docs/ru-RU/handbook/workflow-request-interceptor/trigger.md @@ -0,0 +1,21 @@ +# Конфигурация триггера + +## Создание триггера + +При настройке "workflow" выберите «Событие перед действием» в качестве типа события: + +![Событие перед действием](https://static-docs.nocobase.com/2add03f2bdb0a836baae5fe9864fc4b6.png) + +## Выбор таблицы данных + +Первым шагом в настройке триггера для перехвата "workflow" является выбор таблицы данных, связанной с действием: + +![Конфигурация события перехвата_Таблица данных](https://static-docs.nocobase.com/8f7122caca8159d334cf776f838d53d6.png) + +Далее выберите режим перехвата. Вы можете перехватывать только кнопки действий, связанные с этим "workflow", или перехватывать все выбранные действия для таблицы данных (независимо от формы, из которой исходит действие, и без необходимости привязывать соответствующий "workflow"): + +## Режим перехвата + +![Конфигурация событий перехвата_Режим перехвата](https://static-docs.nocobase.com/145a7f7c3ba440bb6ca93a5ee84f16e2.png) + +В настоящее время поддерживаемые типы действий включают «Создать», «Обновить» и «Удалить». Вы можете выбрать несколько типов действий одновременно. diff --git a/docs/ru-RU/handbook/workflow-request/index.md b/docs/ru-RU/handbook/workflow-request/index.md new file mode 100644 index 0000000000..33201f29cf --- /dev/null +++ b/docs/ru-RU/handbook/workflow-request/index.md @@ -0,0 +1,87 @@ +# HTTP-запросы + +<PluginInfo name="workflow-request" link="/handbook/workflow-request"></PluginInfo> + +Когда вам нужно взаимодействовать с другой веб-системой, узел HTTP-запроса — ваш инструмент. Этот узел позволяет отправлять HTTP-запрос на указанный адрес с данными в формате JSON или `application/x-www-form-urlencoded`, что обеспечивает бесперебойную связь с внешними системами. + +Если вы уже знакомы с такими инструментами, как Postman, освоить узел HTTP-запроса будет просто. Однако, в отличие от традиционных инструментов, этот узел использует контекстные переменные из текущего "wowrkflow", что делает его мощным дополнением к интеграции вашего бизнес-процесса. + +### Установка + +Это встроенный плагин, поэтому установка не требуется. + +### Руководство пользователя + +#### Создание узла + +В интерфейсе конфигурации "worklow" нажмите кнопку «плюс» («+») в вашем процессе, чтобы добавить узел «HTTP Request»: + +![HTTP Request_Add](https://static-docs.nocobase.com/46f2a6fc3f6869c80f8fbd362a54e644.png) + +#### Конфигурация узла + +![HTTP Request Node_Configuration](https://static-docs.nocobase.com/2fcb29af66b892fa704add52e2974a52.png) + +**Метод запроса** + +Выберите из доступных методов HTTP-запроса: `GET`, `POST`, `PUT`, `PATCH` и `DELETE`. + +**URL запроса** + +Укажите URL службы HTTP, включая протокол (`http://` или `https://`). Для безопасности рекомендуется `https://`. + +**Формат данных запроса** + +Это определяет `Content-Type` в заголовке запроса с параметрами для `application/json` и `application/x-www-form-urlencoded`. + +**Конфигурация заголовка запроса** + +Установите пары ключ-значение для заголовков запроса со значениями, которые могут динамически ссылаться на переменные из контекста "workflow". + +:::info{title=Note} +Заголовок `Content-Type` предопределен настройкой формата данных запроса. Ручной ввод здесь не переопределит эту конфигурацию. +::: + +**Параметры запроса** + +Определите пары ключ-значение для строки запроса. Значения могут динамически использовать переменные из контекста "workflow". + +**Тело запроса** + +В настоящее время тело запроса поддерживает только стандартный формат JSON. Используйте кнопку переменной в правом верхнем углу текстового редактора для вставки контекстных переменных. + +:::info{title=Note} +Убедитесь, что переменные в JSON используются как строки, например: `"a": "{{$context.data.a}}"`. +::: + +**Настройки тайм-аута** + +Если запрос слишком долго не отвечает, настройка тайм-аута отменит его, что приведет к преждевременному завершению текущего "workflow" со статусом сбоя. + +**Игнорировать сбой** + +Узел запроса считает любой код состояния HTTP между `200` и `299` успешным. Коды за пределами этого диапазона считаются сбоями. Если вы выберете опцию «Игнорировать сбойные запросы и продолжить "worflow"», "workflow" продолжится с последующими узлами, даже если запрос не будет выполнен. + +### Использование результатов ответа + +Результаты ответа HTTP-запроса можно проанализировать с помощью узла [JSON Query](./plugins/json-query.md), что позволяет использовать их в последующих узлах "workflow". + +Начиная с версии `v1.0.0-alpha.16`, ответ узла запроса включает три компонента, которые можно использовать в качестве переменных: + +- Код состояния +- Заголовки ответа +- Данные + +![HTTP Request Node_Response Result Usage](https://static-docs.nocobase.com/20240529110610.png) + +Код состояния ответа — это стандартный числовой код состояния HTTP, например `200` или `403`, предоставляемый службой. + +Заголовки ответа имеют формат JSON, а данные ответа — также в формате JSON — должны быть проанализированы с помощью узла JSON перед использованием. + +### Пример + +Например, вы можете настроить узел запроса для взаимодействия с облачной платформой для отправки уведомлений SMS. Вот как вы настроите API SMS Alibaba Cloud (с параметрами, адаптированными в соответствии с соответствующей документацией): + +![HTTP Request Node_Configuration](https://static-docs.nocobase.com/20240515124004.png) + +Когда "workflow" запускает этот узел, он вызывает API SMS Alibaba Cloud на основе конфигурации. В случае успеха текстовое сообщение будет отправлено через облачную службу SMS. diff --git a/docs/ru-RU/handbook/workflow-response-message/index.md b/docs/ru-RU/handbook/workflow-response-message/index.md new file mode 100644 index 0000000000..2cb1d8a8f5 --- /dev/null +++ b/docs/ru-RU/handbook/workflow-response-message/index.md @@ -0,0 +1,55 @@ +# Ответное сообщение + +<PluginInfo name="workflow-response-message" link="/handbook/workflow-response-message"></PluginInfo> + +Узел «Ответное сообщение» предназначен для доставки пользовательских сообщений клиенту, который инициирует операцию в определенных типах "workflow". + +:::info{title=Note} +В настоящее время этот узел можно использовать в типах "workflow" «Преддействие» и «Пользовательское действие (синхронный режим)». +::: + +## Руководство пользователя + +### Создание узла + +В поддерживаемых типах "workflow" вы можете вставить узел «Ответное сообщение» в любой точке "workflow". Для этого нажмите кнопку плюса («+») в "workflow", чтобы добавить узел «Ответное сообщение»: + +![Добавить узел](https://static-docs.nocobase.com/eac2b3565e95e4ce59f340624062ed3d.png) + +На протяжении всего процесса запроса ответные сообщения накапливаются в массиве. Когда процесс достигает узла Ответное сообщение, новое содержимое сообщения добавляется к этому массиву. После того, как сервер отправляет содержимое ответа, все сообщения в массиве доставляются вместе клиенту. + +### Конфигурация узла + +Содержимое сообщения структурировано как строка шаблона, что позволяет вставлять переменные. Вы можете настроить содержимое шаблона в конфигурации узла по мере необходимости: + +![Конфигурация узла](https://static-docs.nocobase.com/d5fa5f4002d50baf3ba16048818fddfc.png) + +По мере выполнения процесса и достижения этого узла шаблон анализируется для генерации окончательного содержимого сообщения. В приведенном выше примере конфигурации переменная «Переменные области действия / Цикл всех продуктов / Цель цикла / Продукт / Название» будет заменена определенными значениями во время фактического "workflow", например: + +``` +Недостаточно запасов для продукта «iPhone 14 Pro» +``` + +![Содержимое сообщения](https://static-docs.nocobase.com/06bd4a6b6ec499c853f0c39987f63a6a.png) + +### Конфигурация процесса + +Запрос статуса ответного сообщения определяется успехом или неудачей выполнения процесса. Если какой-либо узел в процессе не выполняется, весь процесс считается неудачей. В этом случае содержимое сообщения будет возвращено клиенту со статусом неудачи в качестве уведомления. + +Если вам необходимо активно определить статус неудачи в процессе, вы можете использовать «Конечный узел» и настроить его как неудачу. Когда процесс достигнет этого узла, он завершится со статусом сбоя, и сообщение будет возвращено клиенту со статусом сбоя. + +Если весь процесс завершится без сбоев и успешно завершится, содержимое сообщения будет возвращено клиенту со статусом успеха. + +:::info{title=Note} +Если в процессе определены несколько узлов ответных сообщений, содержимое выполненных узлов будет добавлено в массив. Когда процесс завершится, все содержимое сообщения будет возвращено клиенту вместе в качестве уведомления. +::: + +### Примеры использования + +#### "Workflow" «Преддействие события» + +В "workflow" «Преддействие события» ответное сообщение может использоваться для предоставления клиенту обратной связи после завершения процесса. Для получения дополнительных сведений см. [Перехват запроса](../triggers/pre-action.md). + +#### "Workflow" "Post-Action Event" + +В синхронном режиме в "workflow" "Post-Action Event" ответное сообщение отправляется клиенту после завершения процесса. В отличие от "workflow" "Pre-Action Event", где результат может отличаться, отображаемое здесь сообщение всегда является уведомлением об "успехе". Эта согласованность возникает, поскольку инициирующая операция уже была успешно выполнена, а успех связанного "workflow" не влияет на результат исходной операции. diff --git a/docs/ru-RU/handbook/workflow-sql/index.md b/docs/ru-RU/handbook/workflow-sql/index.md new file mode 100644 index 0000000000..374bb18fae --- /dev/null +++ b/docs/ru-RU/handbook/workflow-sql/index.md @@ -0,0 +1,74 @@ +# SQL Actions + +В некоторых сценариях, где стандартные узлы операций с таблицами данных не справляются с более сложными задачами, вы можете напрямую использовать узел SQL Action для выполнения сложных SQL-запросов в базе данных. + +В отличие от выполнения SQL-операций путем внешнего подключения к базе данных, в "workflow" вы можете использовать переменные из контекста "workflow" в качестве параметров в ваших SQL-выражениях. + +## FAQ + +### Как можно использовать результаты узла SQL Action? + +При использовании оператора `SELECT` результаты запроса сохраняются в узле в формате JSON Sequelize. Вы можете анализировать и использовать эти результаты с помощью плагина [JSON-query](/handbook/workflow-json-query). + +### Будут ли SQL-действия вызывать события таблицы? + +**Нет**. SQL-действия напрямую выполняют команды SQL в базе данных. Такие действия, как `CREATE` / `UPDATE` / `DELETE`, происходят в базе данных, в то время как события таблицы управляются на уровне приложения Node.js (обработка ORM). В результате эти операции не запускают события таблицы. + +## Установка + +Этот плагин встроен, поэтому установка не требуется. + +## Руководство пользователя + +### Создание узла + +В интерфейсе конфигурации "workflow" щелкните знак «плюс» («+») внутри потока, чтобы добавить узел «Действие SQL»: + +![Добавление действий SQL](https://static-docs.nocobase.com/0ce40a226d7a5bf3717813e27da40e62.png) + +### Настройка узла + +![Конфигурация узла SQL](https://static-docs.nocobase.com/98611dc13bcda04348bd0856561a7b04.png) + +#### Источник данных + +Выберите источник данных для выполнения SQL. + +Источник данных должен иметь тип базы данных, например, основной источник данных, тип PostgreSQL или любой другой источник данных, совместимый с Sequelize. + +#### Содержимое SQL + +Измените оператор SQL. В настоящее время поддерживается только один оператор SQL. + +Вы можете вставить требуемые переменные, нажав кнопку переменной в правом верхнем углу редактора. Перед выполнением переменные будут заменены соответствующими им значениями в тексте, а окончательный оператор SQL будет отправлен в базу данных для запроса. + +### Результаты выполнения узла + +Начиная с `v1.3.15-beta`, результатом выполнения узла SQL является массив, состоящий исключительно из данных. До этой версии результатом была собственная структура Sequelize, включающая метаданные запроса (для получения более подробной информации см.: [`sequelize.query()`](https://sequelize.org/api/v6/class/src/sequelize.js~sequelize#instance-method-query)). + +Например, следующий запрос: + +```sql +select count(id) from posts; +``` + +Результат до `v1.3.15-beta`: + +```json +[ + [ + { "count": 1 } + ], + { + // meta + } +] +``` + +Результат после `v1.3.15-beta`: + +```json +[ + { "count": 1 } +] +``` diff --git a/docs/ru-RU/handbook/workflow-subflow/index.md b/docs/ru-RU/handbook/workflow-subflow/index.md new file mode 100644 index 0000000000..d49cdd2dc8 --- /dev/null +++ b/docs/ru-RU/handbook/workflow-subflow/index.md @@ -0,0 +1,72 @@ +# Подпроцесс + +<PluginInfo name="workflow-subflow" link="/handbook/workflow-subflow" commercial="true"></PluginInfo> + +Используется для вызова других процессов в рамках рабочего процесса, позволяя текущим переменным процесса служить входными данными для подпроцесса и использовать выходные данные подпроцесса как переменные в последующих узлах текущего процесса. + +Процесс вызова подпроцесса иллюстрируется на диаграмме ниже: + +![20241230134634](https://static-docs.nocobase.com/20241230134634.png) + +Подпроцессы могут использоваться для повторного использования общей логики процесса, такой как отправка электронных писем или SMS, или для разделения сложного процесса на несколько подпроцессов для более легкого управления и обслуживания. + +## Пользовательское руководство + +По сути, "workflow" не различает, является ли процесс подпроцессом или нет: любой "workflow" может вызываться другими процессами и сам вызывать другие процессы. Все "workflow" равны, существуя только в отношениях "вызывающий-вызываемый". + +Использование подпроцессов происходит в двух местах: + +1. В основном процессе: как вызывающий, через узел "Вызов "workflow"". +2. В подпроцессе: в качестве вызываемого объекта сохраняются переменные, которые необходимо вывести в текущем процессе через узел «Вывод процесса», которые затем могут быть использованы последующими узлами "workflow", вызывающего текущий процесс. + +### Узел "Вызов "workflow"" + +#### Создание узла + +В интерфейсе конфигурации "workflow" нажмите кнопку плюс ("+") внутри процесса, чтобы добавить узел "Вызов "workfllow"": + +![Add Call Workflow Node](https://static-docs.nocobase.com/20241230001323.png) + + #### Настройка узла + +##### Выбор "workflow" + +Выберите "workflow" для вызова, который можно быстро найти с помощью поля поиска: + +![Select Workflow](https://static-docs.nocobase.com/20241230001534.png) + + +* Неактивные "workflow" все равно могут быть вызваны как подпроцессы. +* Когда текущий "workflow" находится в синхронном режиме, могут быть вызваны только синхронные подпроцессы. + +##### Настройка переменных триггера + +После выбора "workflow" также необходимо настроить триггерные переменные как входные данные для подпроцесса. Вы можете выбрать статические данные напрямую или выбрать переменные из текущего процесса: + +![Configure Trigger Variables](https://static-docs.nocobase.com/20241230162722.png) + +Для разных типов триггеров требуются разные переменные, которые можно настроить в форме по мере необходимости. + +### Узел "Вывод процесса" + +#### Создание узла + +В вызываемом рабочем процессе добавьте узел "Вывод процесса": + +![20241231002033](https://static-docs.nocobase.com/20241231002033.png) + +#### Настройка узла + +##### Выходное значение + +Введите или выберите переменные как выходные значения. Выходные значения могут быть любого типа, включая константы, такие как строки, числа, булевые значения, даты или пользовательский JSON. Они также могут быть другими переменными в процессе. + +![20241231003059](https://static-docs.nocobase.com/20241231003059.png) + +Если в вызываемом "workflow" добавлено несколько узлов "Вывод процесса", значение будет выводиться в соответствии с последним выполненным узлом "Вывод процесса" при вызове этого "workflow". + +### Использование вывода процесса + +Вернувшись к основному процессу, для использования выходных значений подпроцесса в других узлах ниже вызова "workflow" можно выбрать результат узла вызова "workflow". Если подпроцесс выводит простое значение, такое как строка, число, булево значение или дата (дата в формате UTC-строки), оно может быть использовано напрямую. Если это сложный объект (например, объект в коллекции), он должен сначала быть сопоставлен через узел разбора JSON, прежде чем его свойства можно будет использовать; в противном случае он может быть использован только как целый объект. + +Если подпроцесс не настроен на узел вывода процесса или не выводит никакого значения, то при использовании результата узла вызова "workflow" в основном процессе будет получено только нулевое значение (`null`) diff --git a/docs/ru-RU/handbook/workflow-variable/index.md b/docs/ru-RU/handbook/workflow-variable/index.md new file mode 100644 index 0000000000..14281dc595 --- /dev/null +++ b/docs/ru-RU/handbook/workflow-variable/index.md @@ -0,0 +1,78 @@ +# Пользовательские переменные + +<PluginInfo name="workflow-variable" link="/handbook/workflow-variable" commercial="true"></PluginInfo> + +В "workflow" переменные могут быть объявлены или присвоены значения существующим переменным, обычно для хранения временных данных в процессе. + +## Пользовательское руководство + +### Создание узлов + +Чтобы добавить узел "Переменная" в интерфейсе конфигурации "workflow", нажмите кнопку плюса ("+") в процессе: + +![Add Variable Node](https://static-docs.nocobase.com/53b1e48e777bfff7f2a08271526ef3ee.png) + +### Настройка узлов + +#### Режим + +Как и в программировании, переменная должна быть объявлена перед ее использованием или присвоением значения. При создании узла переменной необходимо выбрать его режим. Есть два варианта: + +![Select Mode](https://static-docs.nocobase.com/49d8b7b501de6faef6f303262aa14550.png) + +- Объявление новой переменной: Создает новую переменную. +- Присвоение значения существующей переменной: Присваивает значение ранее объявленной переменной, фактически обновляя ее значение. + +Если создаваемый узел является первым узлом переменной в процессе, доступен только режим объявления, так как нет предыдущих переменных для присвоения значений. + +При присвоении значения существующей переменной необходимо выбрать целевую переменную, которая была объявлена в узле: + +![Select the Variable to Assign](https://static-docs.nocobase.com/1ce8911548d7347e693d8cc8ac1953eb.png) + +#### Значение + +Значение переменной может быть любого типа, например, константа (строки, числа, булевые значения, даты) или другая переменная в "workflow". + +В режиме объявления установка значения переменной эквивалентна присвоению ей начального значения. + +![Declare Initial Value](https://static-docs.nocobase.com/4ce2c508986565ad537343013758c6a4.png) + +В режиме присвоения установка значения переменной изменяет значение целевой переменной на новое значение, которое будет использоваться в последующих шагах. + +![Assign Trigger Variable Value to Declared Variable](https://static-docs.nocobase.com/858bae180712ad279ae6a964a77a7659.png) + +### Использование значений переменных + +В узлах, следующих за узлом переменной, можно использовать значение переменной, выбрав его из группы "Результат узла". Например, в узле запроса значение переменной можно использовать как условие фильтрации запроса: + +![Use Variable Value as Query Filter Condition](https://static-docs.nocobase.com/1ca91c295254ff85999a1751499f14bc.png) + +### Пример + +Узлы переменных особенно полезны в ветках, где нужно вычислить новые значения или объединить их с существующими значениями (аналогично `reduce` или `concat`в программировании). Эти значения затем можно использовать после завершения ветки. Следующий пример демонстрирует, как создать объединенную строку получателей с использованием циклических и переменных узлов. + +Начните с создания "workflow", который активируется при обновлении данных таблицы. Этот "workflow" будет активирован при обновлении данных "Статья" и предварительно загрузит связанные данные "Авторы" (используются для получения получателей): + +![Configure Trigger](https://static-docs.nocobase.com/93327530a93c695c637d74cdfdcd5cde.png) + +Далее создайте узел переменной для хранения строки получателя: + +![Recipient Variable Node](https://static-docs.nocobase.com/d26fa4a7e7ee4f34e0d8392a51c6666e.png) + +Затем создайте узел ветвления цикла для итерации по авторам статьи и объединения их данных в строку получателя: + +![Loop through Authors of the Article](https://static-docs.nocobase.com/083fe62c943c17a643dc47ec2872e07c.png) + +Внутри циклической ветки сначала создайте узел оператора для объединения текущего автора со строкой хранения автора: + +![Concatenate Recipient String](https://static-docs.nocobase.com/5d21a990162f32cb8818d27b16fd1bcd.png) + +После узла оператора создайте еще один узел переменной в режиме присвоения. Выберите узел переменной получателя в качестве целевого и установите его значение на результат узла оператора: + +![Assign Concatenated Recipient String to Recipient Node](https://static-docs.nocobase.com/fc40ed95dd9b61d924b7ca11b23f9482.png) + +Когда циклическая ветка завершается, переменная получателя будет содержать объединенную строку всех авторов статьи. Затем можно использовать узел HTTP-запроса после цикла для вызова интерфейса отправки электронной почты, передав значение переменной получателя в качестве параметра получателя: + +![Send Email to Recipient through Request Node](https://static-docs.nocobase.com/37f71aa1a63e172bcb2dce10a250947e.png) + +Таким образом, с помощью циклических и переменных узлов реализуется простая функция массовой отправки электронной почты. diff --git a/docs/ru-RU/handbook/workflow-webhook/index.md b/docs/ru-RU/handbook/workflow-webhook/index.md new file mode 100644 index 0000000000..ccc65cfc0a --- /dev/null +++ b/docs/ru-RU/handbook/workflow-webhook/index.md @@ -0,0 +1,93 @@ +# Событие Webhook + +<PluginInfo name="workflow-webhook" link="/handbook/workflow-webhook" commercial="true"></PluginInfo> + +Триггер вебхука предоставляет системно сгенерированный URL для вызова третьей стороной через HTTP POST запросы. Этот URL запускает выполнение "workflow" при наступлении определенных событий, таких как обратные вызовы платежей или уведомления. + +## Пользовательское руководство + +### Создание триггера + +Создайте "workflow", выберите "Webhook Event" в качестве типа "workflow": + +![20241210105049](https://static-docs.nocobase.com/20241210105049.png) +[workflow-javascript](../workflow-javascript) +:::info{title="Подсказка"} +Основное различие между "Синхронными" и "Асинхронными" "workflow" заключается в их поведении ответа. Синхронные "workflow" ожидают завершения выполнения рабочего процесса перед возвратом ответа. В отличие от них, асинхронные "workflow" немедленно возвращают предварительно настроенный ответ, а затем выполняют рабочий процесс в фоновом режиме. +::: + +### Настройка триггера + +![20241210105441](https://static-docs.nocobase.com/20241210105441.png) + +#### Webhook URL + +URL автоматически генерируется и привязывается к "workflow". Используйте кнопку копирования, чтобы вставить URL в систему третьей стороны. + +HTTP запросы должны использовать метод POST. Другие методы возвращают ошибку`405`. + +#### Безопасность + +Поддерживается базовая HTTP аутентификация. Включив эту опцию и установив имя пользователя и пароль, вы можете защитить Webhook. Система третьей стороны должна включать имя пользователя и пароль в URL Webhook для аутентификации (Criteria Detail: [MDN: HTTP authentication](https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication#basic_authentication_scheme)). + +Когда имя пользователя и пароль установлены, система проверяет, соответствуют ли имя пользователя и пароль в запросе, и возвращает ошибку`401`, если совпадение не найдено. + +#### Парсинг данных запроса + +Данные в HTTP запросах должны быть распарсены, чтобы сделать их доступными для использования в "workflow". Распарсенные данные доступны как переменные в последующих узлах. + +Парсинг HTTP запроса делится на три части: + +1. Заголовки запроса + + Заголовки представляют собой простые пары ключ-значение в строковом формате. Укажите нужные вам поля, такие как `Date` , `X-Request-Id`, и т.д. + +2. Параметры запроса + +Параметры запроса — это параметры URL запроса, например`http://localhost:13000/api/webhook:trigger/1hfmkioou0d? query=1` Вставьте полный URL-пример или только часть параметров запроса и нажмите кнопку парсинга для автоматического парсинга пар ключ-значение. + + ! [20241210111155](https://static-docs.nocobase.com/20241210111155.png) + +Автоматический парсинг преобразует часть параметров URL в JSON-структуру и создает путь на основе иерархии параметров, например `query[0]`, `query[0].a`, и т.д. Имена путей можно вручную изменить, если они не удовлетворяют требованиям, но обычно это не требуется. Алиасы необязательны для отображения имени переменной при использовании в качестве переменной. Одновременно генерируются все таблицы параметров в примере. Если есть ненужные параметры, их можно удалить. + +3. Тело запроса + +Тело запроса — это тело HTTP запроса. В настоящее время поддерживаются только тела запросов в формате Content-Type application/json. Вы можете напрямую настроить путь для парсинга или ввести пример JSON и нажать кнопку парсинга для автоматического парсинга. + + ! [20241210112529](https://static-docs.nocobase.com/20241210112529.png) + +Автоматический парсинг JSON-структуры преобразует пары ключ-значение в пути, например, `{" a ": 1," b ": {" c" : 2}}` генерирует пути `a`, `b`, `b.c` и т.д. Алиасы необязательны для отображения имени переменной при использовании в качестве переменной. Одновременно генерируются все таблицы параметров в примере. Если есть ненужные параметры, их можно удалить. + +#### Настройка ответа + +Часть ответа вебхука настраивается по-разному для синхронных и асинхронных "workflow". В асинхронных "workflow" настройка ответа осуществляется непосредственно в триггере. После получения запроса вебхука конфигурация ответа в триггере сразу возвращается системе третьей стороны до выполнения рабочего процесса. В синхронных "workflow " ответ нужно обрабатывать в процессе, добавляя узлы ответа по мере необходимости (Detail: [Response nodes](#response nodes)). + +Обычно ответ на асинхронно вызванное событие вебхука имеет статус-код `200` и тело ответа `ok`. Вы также можете настроить статус-код, заголовок ответа и тело ответа. + +! [20241210114312](https://static-docs.nocobase.com/20241210114312.png) + +### Узел ответа + +Поддерживается только для использования в синхронном режиме рабочих процессов Webhook для ответов, возвращаемых системам третьей стороны. Например, если во время обработки обратного вызова платежа возникает неожиданный результат (например, ошибка или сбой), узел ответа может вернуть ошибочный ответ системе третьей стороны, чтобы некоторые системы третьей стороны могли повторить попытку позже в зависимости от состояния. + +Кроме того, выполнение узла ответа прекращает выполнение рабочего процесса, и последующие узлы не выполняются. Если в "workflow" не настроен узел ответа, система автоматически отвечает в зависимости от состояния выполнения процесса, возвращая `200` при успешном выполнении и `500` при неудачном выполнении. + +#### Создание узла ответа + +В интерфейсе конфигурации "workflow" нажмите кнопку плюса ("+") в процессе, чтобы добавить узел "Ответ": + +! [20241210115120](https://static-docs.nocobase.com/20241210115120.png) + +#### Конфигурация ответа + +! [20241210115500](https://static-docs.nocobase.com/20241210115500.png) + +В теле ответа можно использовать переменные из контекста "workflow". + +#### Пример + +В синхронном режиме рабочего процесса Webhook можно возвращать разные ответы в зависимости от различных условий бизнес-логики, как показано на рисунке ниже: + +! [20241210120655](https://static-docs.nocobase.com/20241210120655.png) + +Через узел условного ветвления проверяется, удовлетворяет ли состояние службы заданным условиям. Если да, отображается сообщение об успехе. В противном случае, отображается сообщение об ошибке. diff --git a/docs/ru-RU/handbook/workflow/advanced/executions.md b/docs/ru-RU/handbook/workflow/advanced/executions.md new file mode 100644 index 0000000000..0428a267f5 --- /dev/null +++ b/docs/ru-RU/handbook/workflow/advanced/executions.md @@ -0,0 +1,54 @@ +# План выполнения (история) + +После каждого запуска рабочего процесса создаётся соответствующий план выполнения, который отслеживает ход выполнения этой задачи. Каждый план выполнения имеет статус, указывающий текущее состояние выполнения, который можно посмотреть в списке и деталях истории выполнения: + +![Статус плана выполнения](https://static-docs.nocobase.com/d4440d92ccafac6fac85da4415bb2a26.png) + +Когда все узлы в основной ветви процесса выполняются до конца со статусом «Resolved» (успешно), весь план выполнения завершается со статусом «Resolved». Если в основной ветви процесса появляются узлы с финальным статусом, таким как «Failed» (неудача), «Error» (ошибка), «Canceled» (отменён) или «Rejected» (отклонён), план выполнения досрочно завершается с соответствующим статусом. Если узлы в основной ветви находятся в статусе «Pending» (в ожидании), весь план выполнения приостанавливается, но продолжает отображаться как «On going» (в процессе), пока ожидающий узел не будет возобновлён и выполнение не продолжится. Разные типы узлов по-разному обрабатывают статус «Pending». Например, узлы «Ручной ввод» ждут ручной обработки, а узлы «Задержка» — ждут наступления определённого времени. + +Статусы плана выполнения: + +| Статус | Соответствует статусу последнего </br> выполненного узла основного процесса | Пояснение | +|-------------|----------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Queueing (В очереди) | - | Процесс был запущен, план выполнения создан и ожидает в очереди назначения планировщиком. | +| On going (Выполняется) | Pending (В ожидании) | Узел запросил приостановку, ожидает дальнейшего ввода или обратного вызова для продолжения. | +| Resolved (Успешно) | Resolved (Успешно) | Проблем не возникло, все узлы выполнились по порядку и завершились. | +| Failed (Неудача) | Failed (Неудача) | Завершился с ошибкой из-за невыполнения логики настройки узла. | +| Error (Ошибка) | Error (Ошибка) | Узел столкнулся с необработанной программной ошибкой и завершился досрочно. | +| Canceled (Отменён) | Canceled (Отменён) | Ожидающий узел был отменён администратором и завершился досрочно. | +| Rejected (Отклонён) | Rejected (Отклонён) | В узлах, требующих ручной обработки, действие было отклонено пользователем, и последующие шаги не выполняются. | + +В примерах из раздела [Быстрый старт](../quick-start.md) мы уже убедились, что просмотр деталей истории выполнения рабочего процесса позволяет проверить, были ли все узлы выполнены корректно, а также посмотреть статус и результаты каждого узла. В некоторых расширенных рабочих процессах и узлах результаты выполнения могут быть множественными, например, результаты узла «Цикл»: + +![Результаты узла, выполненного несколько раз](https://static-docs.nocobase.com/bbda259fa2ddf62b0fc0f982efbedae9.png) + +:::info{title=Примечание} +Рабочие процессы могут запускаться одновременно, но выполняются последовательно, в очереди. Даже если несколько процессов запускаются одновременно, они будут выполняться по очереди, а не параллельно. Поэтому, когда статус показывает «Queueing» (в очереди), это означает, что один из процессов уже выполняется, и остальным нужно ждать. + +Статус «On going» (выполняется) означает только то, что план выполнения запущен, и обычно он приостановлен из-за состояния «Pending» одного из узлов. Это не означает, что процесс удерживает ресурсы выполнения в приоритетной позиции. Таким образом, даже если есть планы со статусом «On going», другие планы со статусом «Queueing» могут быть запланированы и выполнены. +::: + +## Статус выполнения узла + +Статус плана выполнения определяется каждым узлом. В плане выполнения после запуска каждый выполненный узел формирует свой статус, который определяет, будет ли процесс продолжаться дальше. Обычно после успешного выполнения узла следующий узел продолжает выполнение, пока не будут пройдены все узлы по порядку или не произойдёт прерывание. При встрече с узлами управления потоком, такими как «Ветвление», «Цикл», «Параллельно» и «Задержка», последовательность выполнения следующих узлов определяется настройками управляющего узла и данными контекста выполнения. + +Возможные статусы после выполнения узла: + +| Статус | Финальный? | Приводит к досрочному завершению? | Пояснение | +|--------|:------------------------:|:-------------------------:|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Pending (Ожидание) | Нет | Нет | Узел запрашивает приостановку, ожидает дальнейшего ввода или обратного вызова. | +| Resolved (Успешно) | Да | Нет | Проблем не возникло, узел успешно выполнен, процесс переходит к следующему узлу до завершения. | +| Failed (Неудача) | Да | Да | Неудача из-за невыполнения условий конфигурации узла. | +| Error (Ошибка) | Да | Да | Узел столкнулся с необработанной программной ошибкой и завершился досрочно. | +| Canceled (Отменён) | Да | Да | Узел в состоянии ожидания был отменён извне (администратором), процесс завершён досрочно. | +| Rejected (Отклонён) | Да | Да | В узлах, требующих ручной обработки, действие было отклонено пользователем, дальнейшее выполнение не продолжается. | + +За исключением статуса «Pending», все остальные статусы являются финальными. Только при финальном статусе «Resolved» процесс продолжает выполнение; в противном случае весь процесс завершается досрочно. Если узел находится в рамках ветви («Параллельные ветви», «Условие», «Цикл» и т.д.), его финальный статус обрабатывается узлом, открывшим ветвь, и так далее — это определяет дальнейший ход всего процесса. + +Например, когда мы используем узел «Условие» в режиме «Продолжить, если „да“», и при выполнении результат оказывается «ложь», весь процесс прерывается и завершается со статусом «Failed» (неудача), как показано на рисунке ниже: + +![Выполнение узла завершилось с ошибкой](https://static-docs.nocobase.com/993aecfa1465894bb574444f0a44313e.png) + +Примечание: + +Все финальные статусы, кроме «Resolved», можно считать неудачными, но причины различаются. Анализируя результаты узлов, можно точнее определить причину сбоя. diff --git a/docs/ru-RU/handbook/workflow/advanced/options.md b/docs/ru-RU/handbook/workflow/advanced/options.md new file mode 100644 index 0000000000..95f951c5c2 --- /dev/null +++ b/docs/ru-RU/handbook/workflow/advanced/options.md @@ -0,0 +1,34 @@ +# Расширенные настройки + +## Режимы выполнения + +Выполнение рабочего процесса зависит от выбранного при создании типа триггера и может происходить в режиме **«Асинхронно»** или **«Синхронно»**. + +- В **асинхронном режиме** после срабатывания события рабочий процесс попадает в очередь выполнения и обрабатывается по одному фоновым планировщиком. +- В **синхронном режиме** после срабатывания рабочий процесс не попадает в очередь, а сразу запускается и возвращает результат немедленно после завершения. + +По умолчанию асинхронно выполняются события: коллекции, после действия, пользовательские действия, по расписанию и согласование. Событие «перед действием» по умолчанию выполняется синхронно. + +При этом события коллекции, после действия и пользовательские действия поддерживают оба режима, и при создании рабочего процесса можно выбрать нужный: + +![Синхронный режим: создание синхронного рабочего процесса](https://static-docs.nocobase.com/39bc0821f50c1bde4729c531c6236795.png) + +Примечание: + +Синхронные рабочие процессы ограничены своим режимом и **не могут использовать узлы, возвращающие статус «в ожидании»**, такие как «Ручной процесс» и другие подобные. + +## Автоматическое удаление истории + +При частом запуске рабочих процессов можно уменьшить нагрузку на базу данных и снизить количество шумных записей, настроив автоматическое удаление истории выполнения. + +Аналогично, в окне создания и редактирования рабочего процесса можно указать, нужно ли автоматически удалять историю для этого процесса: + +![Настройка автоматического удаления истории](https://static-docs.nocobase.com/b2e4c08e7a01e213069912fe04baa7bd.png) + +Удаление истории можно настраивать в зависимости от статуса выполнения. Чаще всего рекомендуется выбирать только статус **«Успешно»**, чтобы сохранить историю неудачных запусков для последующей диагностики. + +Рекомендуется **не включать** автоматическое удаление истории при отладке рабочих процессов, чтобы иметь возможность анализировать логику выполнения по истории. + +Примечание: + +Удаление истории выполнения **не влияет** на счётчик уже выполненных рабочих процессов. diff --git a/docs/ru-RU/handbook/workflow/advanced/revisions.md b/docs/ru-RU/handbook/workflow/advanced/revisions.md new file mode 100644 index 0000000000..6edd56cdbe --- /dev/null +++ b/docs/ru-RU/handbook/workflow/advanced/revisions.md @@ -0,0 +1,22 @@ +# Редакции (версии workflow) + +После того как настроенный workflow был запущен хотя бы один раз, если требуется изменить его конфигурацию или параметры узлов, необходимо создать новую версию и затем вносить изменения. Это гарантирует, что при просмотре истории выполнения уже запущенных workflow они не будут затронуты будущими изменениями. + +На странице конфигурации workflow существующие версии можно просмотреть в меню версий в правом верхнем углу: + +![Просмотр версий workflow](https://static-docs.nocobase.com/ad93d2c08166b0e3e643fb148713a63f.png) + +В меню дополнительных операций ("...") справа можно выполнить "Копировать в новую версию" на основе текущей просматриваемой версии: + +![Копирование workflow в новую версию](https://static-docs.nocobase.com/2805798e6caca2af004893390a744256.png) + +После копирования в новую версию нажмите переключатель "Включить"/"Отключить". После перевода соответствующей версии в активное состояние новая версия workflow вступит в силу. + +Если требуется снова использовать старую версию, выберите её из меню версий и переведите в активное состояние с помощью переключателя "Вкл"/"Выкл" - тогда текущая просматриваемая версия станет активной, и последующие запуски будут выполняться по соответствующей версии workflow. + +Для отключения workflow переведите переключатель "Включено"/"Отключено" в неактивное состояние - после этого workflow больше не будет запускаться. + +Примечание: + +В отличие от "Дублирования" workflow в списке управления, операция "Копировать в новую версию" сохраняет workflow в той же группе с возможностью различения по версиям. Тогда как дублирование создает полностью новый независимый workflow, не связанный с предыдущими версиями, и счетчик выполненных запусков сбрасывается в ноль. +::: diff --git a/docs/ru-RU/handbook/workflow/advanced/variables.md b/docs/ru-RU/handbook/workflow/advanced/variables.md new file mode 100644 index 0000000000..01ffafe278 --- /dev/null +++ b/docs/ru-RU/handbook/workflow/advanced/variables.md @@ -0,0 +1,61 @@ +# Использование переменных + +## Основная концепция + +Как и переменные в языках программирования, **переменные** являются важным инструментом для связи и организации процессов в workflow. + +Когда каждый узел выполняется после срабатывания workflow, переменные могут использоваться в некоторых настройках конфигурации. Источником переменных являются данные результатов вышестоящих узлов, включая следующие категории: + +- Данные контекста триггера: В случаях, таких как триггеры действий и триггеры коллекций, объект одной записи может использоваться всеми узлами. Конкретная реализация может отличаться в зависимости от отдельного триггера. +- Данные вышестоящих узлов: При выполнении любого узла, данные результатов ранее завершенных узлов. +- Локальные переменные: Когда узел находится в некоторых специальных ветвях структуры, могут использоваться локальные переменные, специфичные для соответствующей ветки, например, в циклических структурах, где объекты данных для каждого цикла могут быть использованы. +- Системные переменные: Некоторые встроенные системные параметры, такие как текущее время и т.д. + +Мы уже использовали функцию переменных много раз в [Быстром старте](../quick-start.md), например, в узле вычислений мы можем использовать переменные для ссылки на данные контекста триггера для вычислений: + +![Использование функций и переменных в узле вычислений](https://static-docs.nocobase.com/837e4851a4c70a1932542caadef3431b.png) + +В узле обновления используем данные контекста триггера как переменные условий фильтрации и ссылаемся на результат узла вычислений как переменную значения поля для обновления записи: + +![Переменные в узле обновления данных](https://static-docs.nocobase.com/2e147c93643e7ebc709b9b7ab4f3af8c.png) + +## Структура данных + +Внутри переменная представляет собой структуру JSON, которая обычно может использоваться для доступа к конкретным частям данных в соответствии с JSONPath. Поскольку многие переменные основаны на коллекциях данных NocoBase, ассоциированные данные будут представлены в виде древовидной структуры объектов. Например, выбор значения поля связанных данных, которые были запрошены. Кроме того, когда ассоциированные данные имеют структуру "многие-ко-многим", переменная может быть массивом. + +Выбор переменной чаще всего требует выбора атрибута последнего уровня, обычно это простой тип данных, такой как число, строка и т.д. Однако, когда в иерархии переменной присутствует массив, атрибуты конечного уровня также будут отображаться в массив, и только если соответствующий узел поддерживает массивы, данные массива могут быть корректно обработаны. Например, в узле вычислений некоторые механизмы вычислений имеют функции, специально предназначенные для массивов, а в узле цикла объект цикла может напрямую выбирать массив. + +Например, когда узел запроса запрашивает несколько строк данных, результат узла будет массивом, содержащим несколько строк однородных данных: + +```json +[ + { + "id": 1, + "title": "Title 1" + }, + { + "id": 2, + "title": "Title 2" + } +] +``` + +Однако, когда он используется как переменная в последующих узлах, если выбранная переменная имеет форму `Результат узла / Узел запроса / Название`, она будет отображаться в плоский массив соответствующих значений полей: + +```json +["Title 1", "Title 2"] +``` + +Если это многомерный массив (например, поля ассоциации "многие-ко-многим"), после выравнивания соответствующего поля он станет одномерным массивом. + +## Встроенные системные переменные + +### Системное время + +Получение системного времени на момент выполнения на основе узла, где оно выполняется. Часовой пояс соответствует настройкам сервера. + +### Параметры диапазона дат + +Могут использоваться для настройки условий фильтрации полей даты в узлах запроса, обновления и удаления. Поддерживается только сравнение "Равно", а начальная и конечная точки диапазона дат основаны на настройках часового пояса сервера. + +![Параметры диапазона дат](https://static-docs.nocobase.com/20240817175354.png) diff --git a/docs/ru-RU/handbook/workflow/development/api.md b/docs/ru-RU/handbook/workflow/development/api.md new file mode 100644 index 0000000000..e3732194e5 --- /dev/null +++ b/docs/ru-RU/handbook/workflow/development/api.md @@ -0,0 +1,367 @@ +# Справочник по API + +## Серверная часть + +API, доступное в серверном пакете, показано в следующем коде: + +```ts +import PluginWorkflowServer, { + Trigger, + Instruction, + EXECUTION_STATUS, + JOB_STATUS, +} from '@nocobase/plugin-workflow'; +``` + +### `PluginWorkflowServer` + +Класс плагина Workflow. + +Обычно во время работы приложения экземпляр плагина Workflow можно получить, вызвав `app.pm.get<PluginWorkflowServer>(PluginWorkflowServer)` из любого места, где доступен экземпляр приложения `app` (далее именуемый `plugin`). + +### `registerTrigger()` + +Регистрирует новый тип триггера. + +**Сигнатура** + +`registerTrigger(type: string, trigger: typeof Trigger | Trigger)` + +**Параметры** + +| Параметр | Тип | Описание | +| -----------| -------------------------- | ---------------------- | +| `type` | `string` | Идентификатор типа триггера | +| `trigger` | `typeof Trigger \| Trigger`| Тип или экземпляр триггера | + +**Пример** + +```ts +import PluginWorkflowServer, { Trigger } from '@nocobase/plugin-workflow'; + +function handler(this: MyTrigger, workflow: WorkflowModel, message: string) { + // активировать workflow + this.workflow.trigger(workflow, { data: message.data }); +} + +class MyTrigger extends Trigger { + messageHandlers: Map<number, WorkflowModel> = new Map(); + on(workflow: WorkflowModel) { + const messageHandler = handler.bind(this, workflow); + // слушать событие для активации workflow + process.on( + 'message', + this.messageHandlers.set(workflow.id, messageHandler), + ); + } + + off(workflow: WorkflowModel) { + const messageHandler = this.messageHandlers.get(workflow.id); + // удалить слушатель + process.off('message', messageHandler); + } +} + +export default class MyPlugin extends Plugin { + load() { + // получить экземпляр плагина workflow + const workflowPlugin = + this.app.pm.get<PluginWorkflowServer>(PluginWorkflowServer); + + // зарегистрировать триггер + workflowPlugin.registerTrigger('myTrigger', MyTrigger); + } +} +``` + +### `registerInstruction()` + +Регистрирует новый тип узла. + +**Сигнатура** + +`registerInstruction(type: string, instruction: typeof Instruction | Instruction)` + +**Параметры** + +| Параметр | Тип | Описание | +| ------------- | ---------------------------------- | ----------------------- | +| `type` | `string` | Идентификатор типа узла | +| `instruction` | `typeof Instruction \| Instruction`| Тип или экземпляр узла | + +**Пример** + +```ts +import PluginWorkflowServer, { Instruction, JOB_STATUS } from '@nocobase/plugin-workflow'; + +class LogInstruction extends Instruction { + run(node, input, processor) { + console.log('моя команда выполняется!'); + return { + status: JOB_STATUS.RESOLVED, + }; + } +}; + +export default class MyPlugin extends Plugin { + load() { + // получить экземпляр плагина workflow + const workflowPlugin = this.app.pm.get<PluginWorkflowServer>(PluginWorkflowServer); + + // зарегистрировать команду + workflowPlugin.registerInstruction('log', LogInstruction); + } +} +``` + +### `trigger()` + +Активирует определенный workflow. В основном используется в пользовательских триггерах для запуска соответствующего workflow при обнаружении определенного пользовательского события. + +**Сигнатура** + +`trigger(workflow: Workflow, context: any)` + +**Параметры** + +| Параметр | Тип | Описание | +| --------- | -------------- | --------------------------------- | +| `workflow`| `WorkflowModel`| Объект workflow для активации | +| `context` | `object` | Контекстные данные при активации | + +:::info{title=Совет} +`context` в настоящее время является обязательным параметром; workflow не активируется без него. +::: + +**Пример** + +```ts +import { Trigger } from '@nocobase/plugin-workflow'; + +class MyTrigger extends Trigger { + timer: NodeJS.Timeout; + + on(workflow) { + // зарегистрировать событие + this.timer = setInterval(() => { + // активировать workflow + this.plugin.trigger(workflow, { date: new Date() }); + }, workflow.config.interval ?? 60000); + } +} +``` + +### `resume()` + +Возобновляет выполнение приостановленного рабочего процесса на определённой задаче узла. + +- Возобновить можно только рабочие процессы, находящиеся в состоянии `EXECUTION_STATUS.STARTED`. +- Возобновить можно только задачи узлов, находящиеся в состоянии `JOB_STATUS.PENDING`. + +**Сигнатура** + +`resume(job: JobModel)` + +**Параметры** + +| Параметр | Тип | Описание | +|---------|----------|------------------------------| +| `job` | `JobModel` | Обновлённый объект задачи | + +:::info{title=Совет} +Передаваемый объект задачи обычно является обновлённым и, как правило, имеет поле `status`, изменённое на значение, отличное от `JOB_STATUS.PENDING`; в противном случае выполнение останется приостановленным. +::: + +**Пример** + +См. [исходный код](https://github.com/nocobase/nocobase/blob/main/packages/plugins/%40nocobase/plugin-workflow-manual/src/server/actions.ts#L99). + +## `Trigger` + +Базовый класс для триггеров, используется для расширения пользовательских типов триггеров. + +| Параметр | Тип | Описание | +|------------------|------------------------------------------------------------|------------------------------------------| +| `constructor` | `(public readonly workflow: PluginWorkflowServer): Trigger` | Конструктор | +| `on?` | `(workflow: WorkflowModel): void` | Обработчик события при запуске рабочего процесса | +| `off?` | `(workflow: WorkflowModel): void` | Обработчик события при остановке рабочего процесса | + +`on`/`off` используются для регистрации/отмены регистрации слушателей событий при включении/выключении рабочего процесса. Передаваемый параметр — это экземпляр рабочего процесса, соответствующий триггеру, который можно обрабатывать в зависимости от конфигурации. Для некоторых типов триггеров, которые уже глобально слушают события, реализация этих методов может не потребоваться. Например, в триггере по расписанию можно зарегистрировать таймер в `on` и отменить его в `off`. + +## `Instruction` + +Базовый класс для типов инструкций, используется для расширения пользовательских типов узлов. + +| Параметр | Тип | Описание | +|------------------|----------------------------------------------------------------|------------------------------------------| +| `constructor` | `(public readonly workflow: PluginWorkflowServer): Instruction` | Конструктор | +| `run` | `Runner` | Логика выполнения при первом входе в узел | +| `resume?` | `Runner` | Логика выполнения при возобновлении после приостановки | +| `getScope?` | `(node: FlowNodeModel, data: any, processor: Processor): any` | Предоставляет локальные переменные, генерируемые узлом ветвления | + +**Связанные типы** + +```ts +export type Job = + | { + status: JOB_STATUS[keyof JOB_STATUS]; + result?: unknown; + [key: string]: unknown; + } + | JobModel + | null; + +export type InstructionResult = Job | Promise<Job>; + +export type Runner = ( + node: FlowNodeModel, + input: JobModel, + processor: Processor, +) => InstructionResult; + +export class Instruction { + run: Runner; + resume?: Runner; +} +``` + +`getScope` можно посмотреть в [реализации узла цикла](https://github.com/nocobase/nocobase/blob/main/packages/plugins/%40nocobase/plugin-workflow-loop/src/server/LoopInstruction.ts#L83), где он используется для предоставления локальных переменных внутри ветви. + +# Справочник по API + +## `JOB_STATUS` + +Таблица констант, представляющих статус задач узлов workflow. Используется для указания текущего состояния задачи узла. Статус, генерируемый узлом, также влияет на статус всего плана выполнения. + +| Название константы | Значение | +| --------------------------- | ----------------------------------------- | +| `JOB_STATUS.PENDING` | В ожидании: узел достигнут, но выполнение приостановлено | +| `JOB_STATUS.RESOLVED` | Успешно завершено | +| `JOB_STATUS.FAILED` | Неудача: выполнение узла не соответствует условиям | +| `JOB_STATUS.ERROR` | Ошибка: во время выполнения узла возникла неперехваченная ошибка | +| `JOB_STATUS.ABORTED` | Прервано: узел был остановлен другой логикой после приостановки | +| `JOB_STATUS.CANCELED` | Отменено: узел был отменен вручную после приостановки | +| `JOB_STATUS.REJECTED` | Отклонено: узел был отклонен вручную после приостановки | +| `JOB_STATUS.RETRY_NEEDED` | Требуется повторная попытка | + +## Клиентская часть + +API, доступное в клиентском пакете, показано в следующем коде: + +```ts +import PluginWorkflowClient, { + Trigger, + Instruction, +} from '@nocobase/plugin-workflow/client'; +``` + +### `PluginWorkflowClient` + +### `registerTrigger()` + +Регистрирует панель конфигурации, соответствующую типу триггера. + +**Сигнатура** + +`registerTrigger(type: string, trigger: typeof Trigger | Trigger): void` + +**Параметры** + +| Параметр | Тип | Описание | +| ---------- | -------------------------- | ------------------------------------ | +| `type` | `string` | Идентификатор типа триггера, должен совпадать с идентификатором при регистрации | +| `trigger` | `typeof Trigger \| Trigger` | Тип или экземпляр триггера | + +### `registerInstruction()` + +Регистрирует панель конфигурации, соответствующую типу узла. + +**Сигнатура** + +`registerInstruction(type: string, instruction: typeof Instruction | Instruction): void` + +**Параметры** + +| Параметр | Тип | Описание | +| ------------- | ---------------------------------- | ------------------------------------ | +| `type` | `string` | Идентификатор типа узла, должен совпадать с идентификатором при регистрации | +| `instruction` | `typeof Instruction \| Instruction` | Тип или экземпляр узла | + +#### `registerInstructionGroup()` + +Регистрирует группу типов узлов. NocoBase по умолчанию предоставляет 4 группы типов узлов: + +* `'control'`: Управляющие +* `'collection'`: Операции с таблицами данных +* `'manual'`: Ручная обработка +* `'extended'`: Другие расширенные типы + +Для расширения другими группами можно использовать этот метод. + +**Сигнатура** + +`registerInstructionGroup(type: string, group: { label: string }): void` + +**Параметры** + +| Параметр | Тип | Описание | +| -------- | ------------------ | --------------------------------- | +| `type` | `string` | Идентификатор группы узлов | +| `group` | `{ label: string }` | Информация о группе (сейчас только заголовок) | + +**Пример** + +```js +export default class YourPluginClient extends Plugin { + load() { + const pluginWorkflow = this.app.pm.get(PluginWorkflowClient); + + pluginWorkflow.registerInstructionGroup('ai', { label: `{{t("AI", { ns: "${NAMESPACE}" })}}` }); + } +} +``` + +## `Trigger` + +Базовый класс для триггеров, используется для расширения пользовательских типов триггеров. + +| Параметр | Тип | Описание | +| ---------------- | ---------------------------------------- | ------------------------------------ | +| `title` | `string` | Название типа триггера | +| `fieldset` | `{ [key: string]: ISchema }` | Набор опций конфигурации триггера | +| `scope?` | `{ [key: string]: any }` | Набор объектов, используемых в схеме конфигурации | +| `components?` | `{ [key: string]: React.FC }` | Набор компонентов, используемых в схеме конфигурации | +| `useVariables?` | `(config: any, options: UseVariableOptions) => VariableOptions` | Метод получения данных контекста триггера | + +- Если `useVariables` не задан, это означает, что данный тип триггера не предоставляет функцию получения значений, и данные контекста триггера нельзя выбрать в узлах потока. + +## `Instruction` + +Базовый класс для узлов, используется для расширения пользовательских типов узлов. + +| Параметр | Тип | Описание | +| ----------------------- | ---------------------------------------- | ----------------------------------------------------------------------- | +| `group` | `string` | Идентификатор группы типов узлов (опционально: `'control'`/`'collection'`/`'manual'`/`'extended'`) | +| `fieldset` | `Record<string, ISchema>` | Набор опций конфигурации узла | +| `scope?` | `Record<string, Function>` | Набор объектов, используемых в схеме конфигурации | +| `components?` | `Record<string, React.FC>` | Набор компонентов, используемых в схеме конфигурации | +| `Component?` | `React.FC` | Пользовательский компонент отрисовки узла | +| `useVariables?` | `(node, options: UseVariableOptions) => VariableOption` | Метод предоставления опций переменных узла | +| `useScopeVariables?` | `(node, options?) => VariableOptions` | Метод предоставления локальных переменных для ветки | +| `useInitializers?` | `(node) => SchemaInitializerItemType` | Метод предоставления опций инициализатора для узла | +| `isAvailable?` | `(ctx: NodeAvailableContext) => boolean` | Метод определения доступности узла в текущей среде | + +**Связанные типы** + +```ts +export type NodeAvailableContext = { + workflow: object; + upstream: object; + branchIndex: number; +}; +``` + +- Если `useVariables` не задан, это означает, что данный тип узла не предоставляет функцию получения значений, и результаты этого типа узла нельзя выбрать в потоке. Если результат является единичным значением (не выбирается), можно вернуть статическое содержимое (см. [исходный код узла вычислений](https://github.com/nocobase/nocobase/blob/main/packages/plugins/@nocobase/plugin-workflow/src/client/nodes/calculation.tsx#L68)). Если требуется выбор (например, свойство объекта), можно предоставить пользовательский компонент вывода (см. [исходный код узла создания данных](https://github.com/nocobase/nocobase/blob/main/packages/plugins/@nocobase/plugin-workflow/src/client/nodes/create.tsx#L41)). +- `Component`: Пользовательский компонент отрисовки узла, используется, когда стандартная отрисовка недостаточна. Например, для предоставления дополнительных кнопок операций или других интерактивных элементов для начального узла ветки (см. [исходный код параллельной ветки](https://github.com/nocobase/nocobase/blob/main/packages/plugins/@nocobase/plugin-workflow-parallel/src/client/ParallelInstruction.tsx)). +- `useInitializers`: Используется для предоставления методов инициализации блоков. Например, в ручном узле можно инициализировать соответствующие пользовательские блоки на основе вышестоящего узла (см. [исходный код узла создания данных](https://github.com/nocobase/nocobase/blob/main/packages/plugins/@nocobase/plugin-workflow/src/client/nodes/create.tsx#L71)). +- `isAvailable`: В основном используется для определения, может ли узел быть использован (добавлен) в текущей среде. Текущая среда включает текущий workflow, вышестоящие узлы и текущий индекс ветки. diff --git a/docs/ru-RU/handbook/workflow/development/index.md b/docs/ru-RU/handbook/workflow/development/index.md new file mode 100644 index 0000000000..f417d943d3 --- /dev/null +++ b/docs/ru-RU/handbook/workflow/development/index.md @@ -0,0 +1,12 @@ +# Обзор + +Хотя встроенные функции рабочих процессов являются мощными, они могут не охватывать все возможные сценарии. Например, стандартные типы узлов могут не удовлетворять всем операциям, необходимым в разнообразных бизнес-контекстах. Чтобы устранить эти пробелы, мы предлагаем расширяемую платформу для рабочих процессов, позволяющую добавлять новые типы триггеров и расширять функциональность узлов. Когда встроенных возможностей недостаточно, такие расширения позволяют создавать кастомные решения с использованием подходов низкого кода (low-code). + +Эти расширения делятся на две основные категории: + +- [Расширение типов триггеров](./trigger.md) +- [Расширение типов узлов](./instruction.md) + +## Дополнительные материалы + +- [Справочник API](./api.md) diff --git a/docs/ru-RU/handbook/workflow/development/instruction.md b/docs/ru-RU/handbook/workflow/development/instruction.md new file mode 100644 index 0000000000..b4fda9acd2 --- /dev/null +++ b/docs/ru-RU/handbook/workflow/development/instruction.md @@ -0,0 +1,330 @@ +# Расширение типов узлов + +Тип узла по сути представляет собой операционную команду, где разные команды соответствуют разным операциям, выполняемым в рабочем процессе. + +Как и в случае с триггерами, расширение типа узла включает в себя как серверную, так и клиентскую части. Серверная часть отвечает за реализацию логики зарегистрированных команд, а клиентская предоставляет интерфейс для настройки параметров узла, где находится команда. + +## Серверная часть + +### Простейшая команда узла + +Ядро команды — это функция, то есть в классе команды должен быть реализован метод `run` для выполнения логики команды. Эта функция может выполнять любые необходимые операции, такие как операции с базой данных, файловые операции или вызовы сторонних API. + +Все команды должны наследоваться от базового класса `Instruction`. Простейшая команда требует только реализации функции `run`: + +```ts +import { Instruction, JOB_STATUS } from '@nocobase/plugin-workflow'; + +export class MyInstruction extends Instruction { + run(node, input, processor) { + console.log('моя команда выполняется!'); + return { + status: JOB_STATUS.RESOLVED, + }; + } +} +``` + +Затем зарегистрируйте эту команду в плагине рабочих процессов: + +```ts +export default class MyPlugin extends Plugin { + load() { + // получение экземпляра плагина рабочих процессов + const workflowPlugin = this.app.getPlugin<WorkflowPlugin>(WorkflowPlugin); + + // регистрация команды + workflowPlugin.registerInstruction('my-instruction', MyInstruction); + } +} +``` + +Значение статуса (`status`) в возвращаемом объекте команды обязательно и должно быть одним из значений константы `JOB_STATUS`. Это значение определяет последующий поток процесса после выполнения узла. Обычно используется `JOB_STATUS.RESOLVED`, что означает успешное выполнение узла и продолжение выполнения последующих узлов. Если есть результаты, которые нужно сохранить заранее, можно также вызвать метод `processor.saveJob` и вернуть объект, сгенерированный этим методом. Исполнитель создаст запись результата выполнения на основе этого объекта. + +### Результаты узла + +Если есть конкретный результат выполнения, особенно данные, предназначенные для использования последующими узлами, их можно вернуть через атрибут `result` и сохранить в объекте задачи узла: + +```ts +import { Instruction, JOB_STATUS } from '@nocobase/plugin-workflow'; + +export class RandomStringInstruction extends Instruction { + run(node, input, processor) { + // пользовательская конфигурация из узла + const { digit = 1 } = node.config; + const result = `${Math.round(10 ** digit * Math.random())}`.padStart( + digit, + '0', + ); + return { + status: JOB_STATUS.RESOLVED, + result, + }; + } +}; +``` + +`node.config` — это элемент конфигурации узла, который может быть любым требуемым значением и будет сохранен как поле типа `JSON` в соответствующей записи узла в базе данных. + +### Обработка ошибок команды + +Если во время выполнения могут возникнуть исключения, их можно перехватить заранее и вернуть статус ошибки: + +```ts +import { JOB_STATUS } from '@nocobase/plugin-workflow'; + +export const errorInstruction = { + run(node, input, processor) { + try { + throw new Error('исключение'); + } catch (error) { + return { + status: JOB_STATUS.ERROR, + result: error, + }; + } + }, +}; +``` + +Если предсказуемые исключения не перехвачены, движок рабочих процессов автоматически перехватит их и вернет статус ошибки, чтобы избежать сбоев программы из-за неперехваченных исключений. + +### Асинхронные узлы + +Когда необходимо управлять потоком или выполнять асинхронные (долгие) операции ввода-вывода, метод `run` может вернуть объект со статусом `JOB_STATUS.PENDING`, указывая исполнителю на необходимость ожидания (приостановки) до завершения какой-либо внешней асинхронной операции, после чего движок рабочих процессов будет уведомлен о продолжении выполнения. Если в функции `run` возвращается статус ожидания, команда должна реализовать метод `resume`; иначе рабочий процесс не сможет возобновиться. + +```ts +import { Instruction, JOB_STATUS } from '@nocobase/plugin-workflow'; + +export class PayInstruction extends Instruction { + async run(node, input, processor) { + // задача может быть создана сначала через processor + const job = await processor.saveJob({ + status: JOB_STATUS.PENDING, + }); + + const { plugin } = processor; + // выполнить оплату асинхронно + paymentService.pay(node.config, (result) => { + // уведомить processor о возобновлении задачи + return plugin.resume(job.id, result); + }); + + // вернуть созданный экземпляр задачи + return job; + } + + resume(node, job, processor) { + // проверить статус оплаты + job.set('status', job.result.status === 'ok' ? JOB_STATUS.RESOLVED : JOB_STATUS.REJECTED); + return job; + } +}; +``` + +`paymentService` относится к платежному сервису, и рабочий процесс возобновляет соответствующую задачу после срабатывания обратного вызова от сервиса, в то время как текущий процесс сначала завершается. После этого движок рабочих процессов создает новый процессор, передавая задачу методу `resume` узла для продолжения выполнения ранее приостановленного узла. + +"Асинхронные операции", упомянутые здесь, не совпадают с `async`-функциями в JavaScript, а относятся к взаимодействию с другими внешними системами, где определенные операции могут возвращать результат не сразу. Например, платежный сервис может потребовать ожидания последующего уведомления для получения результата. + +### Статус результата узла + +Статус выполнения узла влияет на успех или неудачу всего рабочего процесса. В целом, при отсутствии ветвления, сбой одного узла напрямую приводит к сбою всего процесса. Наиболее распространённый сценарий — при успешном выполнении узла, следующий узел в последовательности продолжает выполнение, и так до тех пор, пока не останется последующих узлов. В этом случае рабочий процесс завершается со статусом «успешно». + +Если во время выполнения узел возвращает статус «ошибка», движок обработает это в зависимости от двух следующих ситуаций: + +1. Если узел, вернувший статус ошибки, находится в основном процессе и не входит в какую-либо ветвь, созданную вышестоящим узлом, весь основной процесс будет считаться неудачным, и процесс завершится. + +2. Если узел, вернувший статус ошибки, находится внутри ветви, ответственность за определение следующего состояния процесса переходит к узлу, который создал эту ветвь. Внутренняя логика этого узла определит последующее состояние процесса, рекурсивно возвращаясь к основному процессу. + +В конечном итоге, итоговое состояние всего процесса определяется узлом в основном процессе. Если этот узел возвращает статус «ошибка», весь процесс завершается с соответствующим статусом. + +Если любой узел возвращает статус «в ожидании» (pending) после выполнения, весь процесс временно приостанавливается и ожидает события, определённого соответствующим узлом, чтобы возобновить выполнение. Например, в [ручном узле](../manual/nodes/manual) процесс останавливается на этом узле со статусом «в ожидании» и ждёт ручного вмешательства — чтобы решить, продолжать ли выполнение. Если пользователь введёт статус «одобрено», последующие узлы продолжат выполнение; в противном случае, обработка пойдёт по логике ошибки, как описано выше. + +Для получения дополнительной информации о возвращаемых статусах команд см. раздел [Справочник API рабочего процесса](./api#JOB_STATUS). + +### Досрочное завершение + +В некоторых особых процессах может потребоваться завершить процесс непосредственно внутри определённого узла. Это можно сделать, вернув значение `null`. Это означает, что текущий процесс завершается, и последующие узлы выполняться не будут. + +Такая ситуация чаще всего встречается в узлах, управляющих потоком выполнения, например, в [узле параллельной ветви](../manual/nodes/parallel) (см. [исходный код](https://github.com/nocobase/nocobase/blob/main/packages/plugins/%40nocobase/plugin-workflow-parallel/src/server/ParallelInstruction.ts#L87)). Текущий процесс узла завершается, но для каждой подветви создаются новые процессы, которые продолжают своё выполнение. + +:::warn{title=Совет} +Создание ветвей с помощью расширенных узлов — сложная задача, требующая тщательной обработки и полного тестирования. +::: + +### Узнать больше + +Для детального описания каждого параметра при определении типов узлов см. раздел [Справочник API рабочего процесса](./api#instruction). + +## Фронтенд + +Как и в случае с триггерами, форма конфигурации команды (типа узла) должна быть реализована на стороне клиента. + +### Самый простой узел + +Все команды должны быть унаследованы от базового класса `Instruction`, используя соответствующие свойства и методы для настройки и использования узла. + +Например, необходимо предоставить интерфейс конфигурации для узла типа «случайная строка чисел» (`randomString`), определённого на сервере. У этого узла есть параметр `digit`, обозначающий количество цифр в случайном числе. В форме конфигурации мы используем поле ввода числа для получения данных от пользователя. + +```tsx | pure +import WorkflowPlugin, { Instruction, VariableOption } from '@nocobase/workflow/client'; + +class MyInstruction extends Instruction { + title = 'Случайная строка чисел'; + type = 'randomString'; + group = 'extended'; + fieldset = { + 'digit': { + type: 'number', + title: 'Количество цифр', + name: 'digit', + 'x-decorator': 'FormItem', + 'x-component': 'InputNumber', + 'x-component-props': { + min: 1, + max: 10, + }, + default: 6, + }, + }; + useVariables(node, options): VariableOption { + return { + value: node.key, + label: node.title, + }; + } +} + +export default class MyPlugin extends Plugin { + load() { + // получаем экземпляр плагина workflow + const workflowPlugin = this.app.getPlugin<WorkflowPlugin>(WorkflowPlugin); + + // регистрируем инструкцию + workflowPlugin.registerInstruction('log', LogInstruction); + } +} +``` + +Совет: + +Идентификатор типа узла, зарегистрированный на стороне клиента, должен совпадать с идентификатором на сервере, иначе возникнут ошибки. + +# Предоставление результатов узла в качестве переменных + +Обратите внимание на метод `useVariables` в примере выше. Если результат узла (часть `result`) должен использоваться последующими узлами в качестве переменной, этот метод должен быть реализован в производном классе команды, возвращая объект, соответствующий типу `VariableOption`. Этот объект описывает структуру результата выполнения узла, предоставляя сопоставление имен переменных для выбора и использования в последующих узлах. + +Тип `VariableOption` определяется следующим образом: + +```ts +export type VariableOption = { + value?: string; + label?: string; + children?: VariableOption[] | null; + [key: string]: any; +}; +``` + +Ключевой атрибут — `value`, представляющий сегментированное значение пути имени переменной, `label` для отображения в интерфейсе и `children` для представления многоуровневой структуры переменных, когда результат узла является глубоким объектом. + +Используемая переменная выражается внутри системы как строка шаблона пути, разделенная `.`. Например, `{{jobsMapByNodeKey.2dw92cdf.abc}}`. Здесь `$jobsMapByNodeKey` представляет набор результатов всех узлов (определено внутренне, не требует обработки), `2dw92cdf` — это `key` узла, а `abc` — пользовательский атрибут в объекте результата узла. + +Кроме того, поскольку результат узла может быть простым значением, первый уровень **обязательно** должен быть описанием узла: + +```ts +{ + value: node.key, + label: node.title, +} +``` + +То есть первый уровень — это `key` и заголовок узла. Например, в [ссылке на код](https://github.com/nocobase/nocobase/blob/main/packages/plugins/%40nocobase/plugin-workflow/src/client/nodes/calculation.tsx#L77) узла вычисления, опции в интерфейсе при использовании результата узла вычисления выглядят следующим образом: + +![Результат узла вычисления](https://static-docs.nocobase.com/20240514230014.png) + +Когда результат узла является сложным объектом, можно использовать `children` для дальнейшего описания атрибутов глубокого уровня. Например, пользовательская команда возвращает следующие данные JSON: + +```json +{ + "message": "ok", + "data": { + "id": 1, + "name": "test", + } +} +``` + +Тогда метод `useVariables` может вернуть: + +```ts +useVariables(node, options): VariableOption { + return { + value: node.key, + label: node.title, + children: [ + { + value: 'message', + label: 'Сообщение', + }, + { + value: 'data', + label: 'Данные', + children: [ + { + value: 'id', + label: 'ID', + }, + { + value: 'name', + label: 'Имя', + }, + ], + }, + ], + }; +} +``` + +Таким образом, следующий интерфейс можно использовать для выбора среди переменных в последующих узлах: + +![Сопоставленные переменные результата](https://static-docs.nocobase.com/20240514230103.png) + +:::info{title="Совет"} +Когда структура в результате является массивом глубоких объектов, `children` также можно использовать для описания пути, но он не может содержать индексы массива. Это связано с тем, что в обработке переменных рабочего процесса NocoBase описание пути переменной для массивов объектов автоматически преобразуется в массив глубоких значений, и индексы массива не могут использоваться для доступа к конкретному значению. Вы можете обратиться к содержимому в разделе "Рабочий процесс: Расширенное использование" в [Расширенных переменных](../manual/advanced#Использование-переменных). +::: + +### Доступность узла + +По умолчанию узлы могут быть добавлены в рабочие процессы произвольно. Однако в некоторых случаях узлы могут не подходить для определенных типов рабочих процессов или ветвей. В таких случаях можно использовать метод `isAvailable` для настройки доступности узлов: + +```ts +// Определение типа +export abstract class Instruction { + isAvailable?(ctx: NodeAvailableContext): boolean; +} + +export type NodeAvailableContext = { + // экземпляр плагина рабочего процесса + engine: WorkflowPlugin; + // экземпляр текущего рабочего процесса + workflow: object; + // вышестоящий узел + upstream: object; + // узел как начало ветви (номер индекса ветви) + branchIndex: number; +}; +``` + +Метод `isAvailable` возвращает `true`, когда узел доступен, и `false`, когда недоступен. Параметр `ctx` содержит контекстную информацию текущего узла, которую можно использовать для определения доступности узла. + +В большинстве случаев метод `isAvailable` не нужно реализовывать, и узел доступен по умолчанию. Наиболее частая необходимость в этой настройке возникает, когда узел может быть операцией с высокой стоимостью и не подходит для рабочего процесса в синхронном процессе. В этом случае метод `isAvailable` можно использовать для ограничения использования узла. Например: + +```ts +isAvailable({ engine, workflow, upstream, branchIndex }) { + return !engine.isWorkflowSync(workflow); +} +``` + +### Узнать больше + +Подробное определение каждого параметра при определении типов узлов можно найти в разделе [Справочник API рабочего процесса](./api#instruction-1). diff --git a/docs/ru-RU/handbook/workflow/development/trigger.md b/docs/ru-RU/handbook/workflow/development/trigger.md new file mode 100644 index 0000000000..ff3866f0ef --- /dev/null +++ b/docs/ru-RU/handbook/workflow/development/trigger.md @@ -0,0 +1,109 @@ +# **Расширение типов триггеров** + +Каждый рабочий процесс должен быть настроен с определённым триггером, который служит точкой входа для выполнения процесса. + +Типы триггеров обычно соответствуют определённым событиям в системе. На протяжении жизненного цикла приложения любое событие, которое можно подписаться, может быть определено как тип триггера. Примеры включают получение запросов, операции с таблицами данных или запланированные задачи. + +Типы триггеров регистрируются в реестре триггеров плагина с использованием уникальных строковых идентификаторов. Плагин рабочих процессов включает несколько встроенных триггеров: + +- `'collection'`: Активируется операциями с таблицами данных. +- `'schedule'`: Активируется запланированными задачами. +- `'action'`: Активируется событиями после выполнения операций. + +При расширении типов триггеров важно убедиться, что каждый идентификатор уникален. Серверная часть должна обрабатывать регистрацию подписки и отписки от триггеров, а клиентская часть должна предоставлять соответствующий интерфейс для настройки. + +## **Реализация на стороне сервера** + +Любой пользовательский триггер должен наследоваться от базового класса `Trigger` и реализовывать методы `on` и `off`, которые управляют подпиской и отпиской от определённых событий системы. Метод `on` должен вызывать `this.workflow.trigger()` внутри колбэка события, чтобы активировать рабочий процесс. Метод `off` должен обеспечивать корректную очистку при отписке. + +Свойство `this.workflow` ссылается на экземпляр плагина рабочих процессов, который передаётся в базовый класс `Trigger` при создании. + +```ts +import { Trigger } from '@nocobase/plugin-workflow'; + +class MyTrigger extends Trigger { + timer: NodeJS.Timeout; + + on(workflow) { + // Регистрация события + this.timer = setInterval(() => { + // Активация рабочего процесса + this.workflow.trigger(workflow, { date: new Date() }); + }, workflow.config.interval ?? 60000); + } + + off(workflow) { + // Отмена регистрации события + clearInterval(this.timer); + } +} +``` + +Затем зарегистрируйте экземпляр триггера в движке рабочих процессов в плагине, который расширяет функциональность: + +```ts +import WorkflowPlugin from '@nocobase/plugin-workflow'; + +export default class MyPlugin extends Plugin { + load() { + // Получение экземпляра плагина рабочих процессов + const workflowPlugin = this.app.pm.get(WorkflowPlugin) as WorkflowPlugin; + + // Регистрация триггера + workflowPlugin.registerTrigger('interval', MyTrigger); + } +} +``` + +После запуска сервера триггер типа `'interval'` будет доступен для добавления и выполнения. + +## **Настройка на стороне клиента** + +На клиентской стороне основная задача — предоставить интерфейс для настройки, адаптированный под конкретные параметры, необходимые для каждого типа триггера. Каждый тип триггера также должен быть зарегистрирован в плагине рабочих процессов. + +Например, для настройки интервального триггера, упомянутого выше, определите поле `interval` в интерфейсе формы: + +```ts +import { Trigger } from '@nocobase/workflow/client'; + +class MyTrigger extends Trigger { + title = 'Триггер по интервалу'; + // Поля конфигурации триггера + fieldset = { + interval: { + type: 'number', + title: 'Интервал', + name: 'config.interval', + 'x-decorator': 'FormItem', + 'x-component': 'InputNumber', + default: 60000, + }, + }; +} +``` + +Затем зарегистрируйте этот тип триггера в экземпляре плагина рабочих процессов в расширяющем плагине: + +```ts +import { Plugin } from '@nocobase/client'; +import WorkflowPlugin from '@nocobase/plugin-workflow/client'; + +import MyTrigger from './MyTrigger'; + +export default class extends Plugin { + // При необходимости измените экземпляр приложения здесь + async load() { + const workflow = this.app.pm.get(WorkflowPlugin) as WorkflowPlugin; + workflow.registerTrigger('interval', MyTrigger); + } +} +``` + +После регистрации новый тип триггера появится в интерфейсе настройки рабочих процессов. + +Совет + +Убедитесь, что идентификатор типа триггера, зарегистрированный на стороне клиента, совпадает с идентификатором на стороне сервера, чтобы избежать ошибок. + + +Для получения дополнительной информации о определении типов триггеров обратитесь к разделу [Справочник API рабочих процессов](./api#pluginregisterTrigger). diff --git a/docs/ru-RU/handbook/workflow/index.md b/docs/ru-RU/handbook/workflow/index.md new file mode 100755 index 0000000000..dae5bc7639 --- /dev/null +++ b/docs/ru-RU/handbook/workflow/index.md @@ -0,0 +1,35 @@ +# Обзор + +## Введение + +Плагин Workflow (Рабочие процессы) — это мощный инструмент, известный в отрасли как система управления бизнес-процессами (BPM). Он предназначен для проектирования и организации бизнес-процессов на основе моделей данных. Путем настройки условий триггеров и узлов потока он обеспечивает автоматическое выполнение бизнес-процессов. + +В приложениях NocoBase плагин Workflow разработан для сценариев no-code, позволяя пользователям через интерфейс настраивать и обрабатывать типовые бизнес-задачи. Это дает возможность динамически изменять бизнес-процессы прямо во время работы системы. + +Каждый рабочий процесс состоит из триггера и нескольких узлов. Благодаря специфической функциональности каждого узла, workflow описывает бизнес-логику, которая должна выполняться при возникновении соответствующего события в системе. Типичный рабочий процесс показан на следующей диаграмме: + +![Пример рабочего процесса](https://static-docs.nocobase.com/4511011beac54779cb68e66555ebf8a8.png) + +Функционал приведенного workflow: Когда пользователь отправляет форму заказа, система автоматически проверяет наличие товаров на складе. Если товары есть в достаточном количестве, их запас уменьшается; в противном случае заказ помечается как недействительный. + +В более общем смысле рабочие процессы в NocoBase позволяют решать следующие задачи: + +- **Автоматическая обработка данных**: Например, автоматическая обработка данных в коллекции согласно предопределенным workflow, такой как расчет и обновление связанных данных после срабатывания события. +- **Бизнес-процессы с участием человека**: Когда процесс не может быть полностью автоматизирован, часть решений может быть делегирована пользователю через ручные узлы (например, утверждение и проверка). После обработки пользователем процесс продолжается. +- **Интеграция с внешними системами**: Через узлы запросов (или узлы с функционалом вызова сторонних сервисов) можно взаимодействовать с API внешних систем для обмена данными. + +## Установка + +Workflow — это встроенный плагин NocoBase, не требующий дополнительной установки. + +## Дополнительные материалы + +- [Быстрый старт](./quick-start.md) +- Продвинутые темы + - [Выполнения](./advanced/executions.md) + - [Расширенные настройки](./advanced/options.md) + - [Переменные](./advanced/variables.md) + - [Ревизии](./advanced/revisions.md) +- [Триггеры](./triggers/index.md) +- [Узлы](./nodes/index.md) +- [Руководство разработчика](./development/index.md) diff --git a/docs/ru-RU/handbook/workflow/nodes/aggregate.md b/docs/ru-RU/handbook/workflow/nodes/aggregate.md new file mode 100644 index 0000000000..6385dd6c1c --- /dev/null +++ b/docs/ru-RU/handbook/workflow/nodes/aggregate.md @@ -0,0 +1,3 @@ +# Совокупный запрос + +<embed src="../../workflow-aggregate/index.md#L3-L999"></embed> diff --git a/docs/ru-RU/handbook/workflow/nodes/approval.md b/docs/ru-RU/handbook/workflow/nodes/approval.md new file mode 100644 index 0000000000..a385bbc14f --- /dev/null +++ b/docs/ru-RU/handbook/workflow/nodes/approval.md @@ -0,0 +1,9 @@ +# Одобрение + +<PluginInfo commercial="true" name="workflow-approval" link="/handbook/workflow-approval"></PluginInfo> + +<embed src="../../workflow-approval/node.md#L3-L999"></embed> + +## Сопутствующий контент + +Кроме конфигурации узла, есть также некоторые сопутствующие материалы об утверждении, которые можно более подробно изучить в [документации по плагину](../../workflow-approval/index.md). diff --git a/docs/ru-RU/handbook/workflow/nodes/calculation.md b/docs/ru-RU/handbook/workflow/nodes/calculation.md new file mode 100644 index 0000000000..e1180406a3 --- /dev/null +++ b/docs/ru-RU/handbook/workflow/nodes/calculation.md @@ -0,0 +1,48 @@ +# Узел вычислений + +## Обзор + +Хотя узел вычислений не управляет потоком процесса, он выполняет важную функцию в рабочем процессе. Этот узел позволяет вычислять выражения, а результат сохраняется для последующего использования другими узлами. По сути, он заменяет вызов функции и присваивание значения переменной в языках программирования. + +## Создание узла + +В интерфейсе конфигурации workflow нажмите кнопку "+" в потоке, чтобы добавить узел "Вычисление": + +![Добавление узла вычислений](https://static-docs.nocobase.com/58a455540d26945251cd143eb4b16579.png) + +## Настройка узла + +![Конфигурация узла вычислений](https://static-docs.nocobase.com/6a155de3f6a883d8cd1881b2d9c33874.png) + +### Движок вычислений + +Определяет синтаксис поддерживаемых выражений. Доступные варианты: + +1. **Math.js** - математические вычисления (индексация массивов с 1) +2. **Formula.js** - формулы (индексация массивов с 0) +3. **Шаблон строки** - простая конкатенация значений + +Примечание: +Math.js и Formula.js поддерживают множество встроенных функций для работы с данными. Подробности в их официальной документации. + + +### Выражение + +Строковое представление формулы расчета, состоящее из: +- Переменных контекста workflow +- Констант +- Операторов +- Поддерживаемых функций + +При ошибках в синтаксисе или несоответствии типов узел завершится с ошибкой. + +## Пример использования + +### Расчет общей суммы заказа + +Для заказов с несколькими позициями можно вычислить общую сумму как сумму произведений цены на количество: + +![Пример конфигурации](https://static-docs.nocobase.com/85966b0116afb49aa966eeaa85e78dae.png) + +Здесь используется функция `SUMPRODUCT` из Formula.js для поэлементного умножения массивов цен и количеств с последующим суммированием. + diff --git a/docs/ru-RU/handbook/workflow/nodes/condition.md b/docs/ru-RU/handbook/workflow/nodes/condition.md new file mode 100644 index 0000000000..f849faeacf --- /dev/null +++ b/docs/ru-RU/handbook/workflow/nodes/condition.md @@ -0,0 +1,33 @@ +# Условие + +Аналогично оператору `if` в языках программирования, узел «Условие» определяет направление дальнейшего выполнения рабочего процесса на основе результата настроенного условия. + +## Создание узла + +Существует два режима работы узла «Условие»: «Продолжить, если „истина“» и «Продолжить, если „истина“ или „ложь“». При создании узла необходимо выбрать один из этих режимов, и после создания изменить его в настройках уже нельзя. + +![Выбор режима для условия](https://static-docs.nocobase.com/3de27308c1179523d8606c66bf3a5fb4.png) + +В режиме **«Продолжить, если „истина“»** рабочий процесс продолжит выполнение последующих узлов только в случае, если результат проверки условия — «истина». В противном случае выполнение будет прервано, и рабочий процесс завершится досрочно со статусом «ошибка». + +![Режим «Продолжить, если „истина“»](https://static-docs.nocobase.com/0f6ae1afe61d501f8eb1f6dedb3d4ad7.png) + +Этот режим подходит для сценариев, в которых дальнейшее выполнение недопустимо при невыполнении условия. Например, при настройке кнопки формы для отправки заказа, привязанной к событию «Перед действием», если на складе недостаточно товара, процесс не должен продолжаться и создавать заказ, а должен завершиться с ошибкой. + +В режиме **«Продолжить, если „истина“ или „ложь“»** узел условия создаёт две ветви рабочего процесса — одну для случая «истина», другую — для случая «ложь». В каждой ветви можно независимо настроить последующие узлы. После завершения выполнения любой из ветвей управление автоматически возвращается в основную ветвь (на уровень выше узла условия), и выполнение продолжается. + +![Режим «Продолжить, если „истина“ или „ложь“»](https://static-docs.nocobase.com/974a1fcd8603629b64ffce6c55d59282.png) + +Этот режим подходит для сценариев, в которых при выполнении и невыполнении условия нужно выполнять разные действия. Например, проверить, существует ли запись, и если не существует — добавить её, а если существует — обновить. + +## Настройка узла + +### Вычислительный движок + +В настоящее время поддерживаются три движка: + +- **Базовый**: вычисляет логический результат с помощью простых бинарных операций и группировки с помощью «И» и «ИЛИ». +- **Math.js**: вычисляет логический результат на основе выражений, поддерживаемых движком [Math.js](https://mathjs.org/). +- **Formula.js**: вычисляет логический результат на основе выражений, поддерживаемых движком [Formula.js](https://formulajs.info/). + +Во всех трёх случаях в качестве операндов можно использовать переменные из контекста рабочего процесса. diff --git a/docs/ru-RU/handbook/workflow/nodes/create.md b/docs/ru-RU/handbook/workflow/nodes/create.md new file mode 100644 index 0000000000..71c7a4597f --- /dev/null +++ b/docs/ru-RU/handbook/workflow/nodes/create.md @@ -0,0 +1,40 @@ +# Создание записи + +Используется для добавления новой строки данных в определённую коллекцию. + +Значения полей новой записи могут использовать переменные из контекста рабочего процесса. При назначении значений полям ассоциаций можно напрямую ссылаться на соответствующие переменные данных в контексте — это могут быть как объекты, так и значения внешних ключей. Если переменные не используются, необходимо вручную вводить значения внешних ключей. Для полей множественных ассоциаций значения внешних ключей следует разделять запятыми. + +## Создание узла + +В интерфейсе настройки рабочего процесса нажмите кнопку «+» в цепочке и добавьте узел «Создать запись»: + +![Создание узла «Создать запись»](https://static-docs.nocobase.com/386c8c01c89b1eeab848510e77f4841a.png) + +## Настройка узла + +![Пример настройки узла создания записи](https://static-docs.nocobase.com/5f7b97a51b64a1741cf82a4d4455b610.png) + +### Коллекция + +Выберите коллекцию, в которую будет добавлена новая запись. + +### Значения полей + +Назначьте значения полям коллекции. Можно использовать переменные из контекста рабочего процесса или вручную ввести статические значения. + +Примечание: +Запись, добавленная с помощью узла «Создать» в рабочем процессе, **не обновляет автоматически** такие поля, как «Создатель» и «Последний изменявший». Вам необходимо вручную настроить значения этих полей в зависимости от ситуации. + +### Предварительная загрузка связанных данных + +Если поля новой записи включают поля ассоциаций и вы хотите использовать соответствующие связанные данные в последующих узлах рабочего процесса, вы можете отметить нужные поля ассоциаций в настройке предварительной загрузки. После добавления новой записи соответствующие связанные данные будут автоматически загружены и сохранены вместе с результатом узла. + +## Пример + +Например, при добавлении или обновлении записи в коллекции «Посты» требуется автоматически создавать запись в коллекции «Версии постов», чтобы фиксировать историю изменений. Это можно реализовать с помощью узла «Создать запись»: + +![Пример конфигурации рабочего процесса](https://static-docs.nocobase.com/dfd4820d49c145fa331883fc09c9161f.png) + +![Пример настройки узла](https://static-docs.nocobase.com/1a0992e66170be12a068da6503298868.png) + +При такой конфигурации, при любом изменении данных в коллекции «Посты», автоматически будет создаваться запись в «Версии постов», фиксирующая историю изменений статьи. diff --git a/docs/ru-RU/handbook/workflow/nodes/date-calculation.md b/docs/ru-RU/handbook/workflow/nodes/date-calculation.md new file mode 100644 index 0000000000..e48c629b99 --- /dev/null +++ b/docs/ru-RU/handbook/workflow/nodes/date-calculation.md @@ -0,0 +1,3 @@ +# Расчет даты + +<embed src="../../workflow-date-calculation/index.md#L3-L999"></embed> diff --git a/docs/ru-RU/handbook/workflow/nodes/delay.md b/docs/ru-RU/handbook/workflow/nodes/delay.md new file mode 100644 index 0000000000..a41ce85ec9 --- /dev/null +++ b/docs/ru-RU/handbook/workflow/nodes/delay.md @@ -0,0 +1,3 @@ +# Задержка + +<embed src="../../workflow-delay/index.md#L3-L999"></embed> diff --git a/docs/ru-RU/handbook/workflow/nodes/destroy.md b/docs/ru-RU/handbook/workflow/nodes/destroy.md new file mode 100644 index 0000000000..2ca11b5402 --- /dev/null +++ b/docs/ru-RU/handbook/workflow/nodes/destroy.md @@ -0,0 +1,47 @@ +# Узлы рабочих процессов + +## Обзор + +Узлы представляют собой базовые элементы логической организации рабочего процесса. Каждый workflow может содержать любое количество узлов, где каждый тип узла соответствует определенной инструкции, определяющей его поведение. Конфигурация узла задает параметры этой инструкции, включая объекты данных для операций и другие аспекты его функционирования. + +Примечание: +Триггеры рабочих процессов не считаются узлами, хотя и отображаются на диаграмме как входные точки. Это концептуально разные элементы. Подробнее см. раздел [Триггеры](../triggers/index.md). + + +## Классификация узлов + +По функциональному назначению реализованные на данный момент узлы делятся на 5 категорий (всего 24 типа): + +### 1. Управление потоком +- [Условие](./condition.md) +- [Задержка](./delay.md) (плагин @nocobase/plugin-workflow-deley) +- [Завершение процесса](./end.md) +- [JSON-маппинг переменных](./json-variable-mapping.md) (плагин @nocobase/plugin-workflow-json-variable-mapping) +- [Цикл](./loop.md) (плагин @nocobase/plugin-workflow-loop) +- [Параллельное ветвление](./parallel.md) (плагин @nocobase/plugin-workflow-parallel) +- [Пользовательская переменная](./variable.md) (плагин @nocobase/plugin-workflow-variable) +- [Вызов подпроцесса](./subflow.md) (плагин @nocobase/plugin-workflow-subflow) +- [Вывод данных](./output.md) (плагин @nocobase/plugin-workflow-subflow) + +### 2. Вычисления +- [Вычисления](./calculation.md) +- [Дата и время](./date-calculation.md) (плагин @nocobase/plugin-workflow-date-calculation) +- [Динамические выражения](./dynamic-calculation.md) (плагин @nocobase/plugin-workflow-dynamic-calculation) +- [JSON-запросы](./json-query.md) (плагин @nocobase/plugin-workflow-json-query) + +### 3. Операции с таблицами данных +- [Создание записи](./create.md) +- [Обновление записи](./update.md) +- [Удаление записи](./destroy.md) +- [Запрос записи](./query.md) +- [Агрегатные запросы](./aggregate.md) (плагин @nocobase/plugin-workflow-aggregate) +- [SQL-операции](./sql.md) (плагин @nocobase/plugin-workflow-sql) + +### 4. Ручная обработка +- [Ручная обработка](./manual.md) (плагин @nocobase/plugin-workflow-manual) +- [Согласование](./approval.md) (плагин @nocobase/plugin-workflow-approval) + +### 5. Другие расширения +- [HTTP-запрос](./request.md) (плагин @nocobase/plugin-workflow-request) +- [Ответное сообщение](./response-message.md) (плагин @nocobase/plugin-workflow-response-message) +- [JavaScript](./javascript.md) (плагин @nocobase/plugin-workflow-javascript) diff --git a/docs/ru-RU/handbook/workflow/nodes/dynamic-calculation.md b/docs/ru-RU/handbook/workflow/nodes/dynamic-calculation.md new file mode 100644 index 0000000000..4a01f96c63 --- /dev/null +++ b/docs/ru-RU/handbook/workflow/nodes/dynamic-calculation.md @@ -0,0 +1,7 @@ +# Динамический расчет + +<embed src="../../workflow-dynamic-calculation/node.md#L3-L999"></embed> + +## Связанный контент + +Кроме конфигурации узла, есть также некоторые связанные с динамическими вычислениями материалы, которые можно более подробно изучить в [документации по плагину](../../workflow-dynamic-calculation/index.md). diff --git a/docs/ru-RU/handbook/workflow/nodes/end.md b/docs/ru-RU/handbook/workflow/nodes/end.md new file mode 100644 index 0000000000..9af27c3b42 --- /dev/null +++ b/docs/ru-RU/handbook/workflow/nodes/end.md @@ -0,0 +1,22 @@ +# Завершение процесса + +При выполнении этот узел немедленно завершает текущее выполнение рабочего процесса и устанавливает статус, заданный в настройках узла. Обычно используется для управления логикой выполнения: позволяет выйти из текущего рабочего процесса при выполнении определённых условий, не продолжая последующую обработку. Аналогичен инструкции `return` в языках программирования, которая используется для выхода из выполняемой функции. + +## Создание узла + +В интерфейсе настройки рабочего процесса нажмите кнопку «+» в цепочке и добавьте узел «Завершение процесса»: + +![Добавить узел завершения процесса](https://static-docs.nocobase.com/672186ab4c8f7313dd3cf9c880b524b8.png) + +## Настройка узла + +![Настройка узла «Завершение процесса»](https://static-docs.nocobase.com/bb6a597f25e9afb72836a14a0fe0683e.png) + +### Статус завершения + +Статус завершения влияет на итоговый статус плана выполнения рабочего процесса. Может быть настроен как «Успешно» или «Ошибка». Когда рабочий процесс достигает этого узла, он немедленно завершается с указанным статусом. + +Примечание: +При использовании в рабочих процессах типа «Перед действием» узел будет перехватывать запросы действий. Подробнее см. в [инструкции по использованию «Перед действием»](../triggers/pre-action). + +Помимо перехвата запросов, настройка статуса завершения также влияет на статус информационного ответа в поле «Сообщение ответа» для этого типа рабочих процессов. diff --git a/docs/ru-RU/handbook/workflow/nodes/index.md b/docs/ru-RU/handbook/workflow/nodes/index.md new file mode 100755 index 0000000000..647015db22 --- /dev/null +++ b/docs/ru-RU/handbook/workflow/nodes/index.md @@ -0,0 +1,46 @@ +# Узлы рабочих процессов + +## Обзор + +Узлы представляют собой базовые элементы логической организации рабочего процесса. Каждый workflow может содержать любое количество узлов, где каждый тип узла соответствует определенной инструкции, определяющей его поведение. Конфигурация узла задает параметры этой инструкции, включая объекты данных для операций и другие аспекты его функционирования. + +Триггеры рабочих процессов не считаются узлами, хотя и отображаются на диаграмме как входные точки. Это концептуально разные элементы. Подробнее см. раздел [Триггеры](../triggers/index.md). + +## Классификация узлов + +По функциональному назначению реализованные на данный момент узлы делятся на 5 категорий (всего 24 типа): + +### 1. Управление потоком +- [Условие](./condition.md) +- [Задержка](./delay.md) (плагин @nocobase/plugin-workflow-deley) +- [Завершение процесса](./end.md) +- [JSON-маппинг переменных](./json-variable-mapping.md) (плагин @nocobase/plugin-workflow-json-variable-mapping) +- [Цикл](./loop.md) (плагин @nocobase/plugin-workflow-loop) +- [Параллельное ветвление](./parallel.md) (плагин @nocobase/plugin-workflow-parallel) +- [Пользовательская переменная](./variable.md) (плагин @nocobase/plugin-workflow-variable) +- [Вызов подпроцесса](./subflow.md) (плагин @nocobase/plugin-workflow-subflow) +- [Вывод данных](./output.md) (плагин @nocobase/plugin-workflow-subflow) + +### 2. Вычисления +- [Вычисления](./calculation.md) +- [Дата и время](./date-calculation.md) (плагин @nocobase/plugin-workflow-date-calculation) +- [Динамические выражения](./dynamic-calculation.md) (плагин @nocobase/plugin-workflow-dynamic-calculation) +- [JSON-запросы](./json-query.md) (плагин @nocobase/plugin-workflow-json-query) + +### 3. Операции с таблицами данных +- [Создание записи](./create.md) +- [Обновление записи](./update.md) +- [Удаление записи](./destroy.md) +- [Запрос записи](./query.md) +- [Агрегатные запросы](./aggregate.md) (плагин @nocobase/plugin-workflow-aggregate) +- [SQL-операции](./sql.md) (плагин @nocobase/plugin-workflow-sql) + +### 4. Ручная обработка +- [Ручная обработка](./manual.md) (плагин @nocobase/plugin-workflow-manual) +- [Согласование](./approval.md) (плагин @nocobase/plugin-workflow-approval) + +### 5. Другие расширения +- [HTTP-запрос](./request.md) (плагин @nocobase/plugin-workflow-request) +- [Ответное сообщение](./response-message.md) (плагин @nocobase/plugin-workflow-response-message) +- [JavaScript](./javascript.md) (плагин @nocobase/plugin-workflow-javascript) + diff --git a/docs/ru-RU/handbook/workflow/nodes/javascript.md b/docs/ru-RU/handbook/workflow/nodes/javascript.md new file mode 100644 index 0000000000..ced52fb87c --- /dev/null +++ b/docs/ru-RU/handbook/workflow/nodes/javascript.md @@ -0,0 +1,3 @@ +# JavaScript + +<embed src="../../workflow-javascript/index.md#L3-L999"></embed> diff --git a/docs/ru-RU/handbook/workflow/nodes/json-query.md b/docs/ru-RU/handbook/workflow/nodes/json-query.md new file mode 100644 index 0000000000..d439a8e53b --- /dev/null +++ b/docs/ru-RU/handbook/workflow/nodes/json-query.md @@ -0,0 +1,3 @@ +# JSON-запрос + +<embed src="../../workflow-json-query/index.md#L3-L999"></embed> diff --git a/docs/ru-RU/handbook/workflow/nodes/json-variable-mapping.md b/docs/ru-RU/handbook/workflow/nodes/json-variable-mapping.md new file mode 100644 index 0000000000..3944d27cb1 --- /dev/null +++ b/docs/ru-RU/handbook/workflow/nodes/json-variable-mapping.md @@ -0,0 +1,3 @@ +# Сопоставление переменных в формате JSON + +<embed src="../../workflow-json-variable-mapping/index.md#L3-L999"></embed> diff --git a/docs/ru-RU/handbook/workflow/nodes/loop.md b/docs/ru-RU/handbook/workflow/nodes/loop.md new file mode 100644 index 0000000000..9b57df6656 --- /dev/null +++ b/docs/ru-RU/handbook/workflow/nodes/loop.md @@ -0,0 +1,3 @@ +# Loop + +<embed src="../../workflow-loop/index.md#L3-L999"></embed> diff --git a/docs/ru-RU/handbook/workflow/nodes/manual.md b/docs/ru-RU/handbook/workflow/nodes/manual.md new file mode 100644 index 0000000000..8d4c0704b9 --- /dev/null +++ b/docs/ru-RU/handbook/workflow/nodes/manual.md @@ -0,0 +1,9 @@ +# Ручной процесс + +<PluginInfo name="workflow-manual" link="/handbook/workflow-manual"></PluginInfo> + +<embed src="../../workflow-manual/node.md#L3-L999"></embed> + +## Сопутствующий контент + +Кроме конфигурации узла, есть также некоторые сведения о ручном процессе, которые можно более подробно изучить в [документации по плагину].(../../workflow-manual/index.md). diff --git a/docs/ru-RU/handbook/workflow/nodes/output.md b/docs/ru-RU/handbook/workflow/nodes/output.md new file mode 100644 index 0000000000..5d6bbb3efd --- /dev/null +++ b/docs/ru-RU/handbook/workflow/nodes/output.md @@ -0,0 +1,3 @@ +# Вывод + +Refer to [Subprocess Plugin: Process Output](../../workflow-subflow/index.md#process-output-node). diff --git a/docs/ru-RU/handbook/workflow/nodes/parallel.md b/docs/ru-RU/handbook/workflow/nodes/parallel.md new file mode 100644 index 0000000000..90f151b9a6 --- /dev/null +++ b/docs/ru-RU/handbook/workflow/nodes/parallel.md @@ -0,0 +1,3 @@ +# Параллельная ветвь + +<embed src="../../workflow-parallel/index.md#L3-L999"></embed> diff --git a/docs/ru-RU/handbook/workflow/nodes/query.md b/docs/ru-RU/handbook/workflow/nodes/query.md new file mode 100644 index 0000000000..6e06e0be73 --- /dev/null +++ b/docs/ru-RU/handbook/workflow/nodes/query.md @@ -0,0 +1,42 @@ +# Запрос записи + +Используется для поиска и получения записей данных, соответствующих определённым условиям, из коллекции. + +Можно настроить запрос одной или нескольких записей. Результат запроса можно использовать как переменную в последующих узлах. При запросе нескольких записей результатом будет массив. При пустом результате можно выбрать, следует ли продолжать выполнение последующих узлов. + +## Создание узла + +В интерфейсе настройки рабочего процесса нажмите кнопку «+» и добавьте узел «Запросить запись»: + +![Запросить запись — Добавление](https://static-docs.nocobase.com/c1ef2b851b437806faf7a39c6ab9d33a.png) + +## Настройка узла + +![Запросить запись — Настройка узла](https://static-docs.nocobase.com/20240520131324.png) + +### Коллекция + +Выберите коллекцию, из которой нужно выполнить запрос. + +### Тип результата + +Существует два типа результата: «Одна запись» и «Несколько записей»: + +- **Одна запись**: результатом будет объект первой найденной записи или `null`, если подходящих записей нет. +- **Несколько записей**: результатом будет массив найденных записей или пустой массив (`[]`), если записи не найдены. Может использоваться для обработки в узле цикла. + +### Условия фильтрации + +Аналогично условиям фильтрации при обычном запросе к коллекции. Можно использовать переменные контекста рабочего процесса. + +### Сортировка + +При запросе одной или нескольких записей можно задать правила сортировки для получения нужного результата. Например, чтобы получить самую свежую запись, отсортируйте по полю «Дата создания» в порядке убывания. + +### Пагинация + +Если набор результатов может быть большим, можно использовать пагинацию для ограничения количества возвращаемых записей. Например, чтобы получить 10 самых свежих записей, отсортируйте по полю «Время создания» по убыванию и установите пагинацию: 1 страница, 10 записей на странице. + +### Обработка пустого результата + +В режиме одной записи, если нет подходящих данных, результат будет `null`. В режиме нескольких записей — пустой массив (`[]`). Можно выбрать опцию «Прервать выполнение рабочего процесса, если результат запроса пуст». При включении этой опции, если результат пуст, последующие узлы выполняться не будут, и рабочий процесс завершится досрочно со статусом «ошибка». diff --git a/docs/ru-RU/handbook/workflow/nodes/request.md b/docs/ru-RU/handbook/workflow/nodes/request.md new file mode 100644 index 0000000000..59412e3f73 --- /dev/null +++ b/docs/ru-RU/handbook/workflow/nodes/request.md @@ -0,0 +1,3 @@ +# HTTP-запрос + +<embed src="../../workflow-request/index.md#L3-L999"></embed> diff --git a/docs/ru-RU/handbook/workflow/nodes/response-message.md b/docs/ru-RU/handbook/workflow/nodes/response-message.md new file mode 100644 index 0000000000..8f17663f32 --- /dev/null +++ b/docs/ru-RU/handbook/workflow/nodes/response-message.md @@ -0,0 +1,3 @@ +# Ответное сообщение + +<embed src="../../workflow-response-message/index.md#L3-L999"></embed> diff --git a/docs/ru-RU/handbook/workflow/nodes/response.md b/docs/ru-RU/handbook/workflow/nodes/response.md new file mode 100644 index 0000000000..76b823c44f --- /dev/null +++ b/docs/ru-RU/handbook/workflow/nodes/response.md @@ -0,0 +1,5 @@ +# HTTP-ответ + +Узел HTTP-ответа может использоваться в событии Webhook (в синхронном режиме) для возврата ответа сторонней системе. + +See: [Response](/handbook/workflow-webhook#Response)。 diff --git a/docs/ru-RU/handbook/workflow/nodes/sql.md b/docs/ru-RU/handbook/workflow/nodes/sql.md new file mode 100644 index 0000000000..44b99f9126 --- /dev/null +++ b/docs/ru-RU/handbook/workflow/nodes/sql.md @@ -0,0 +1,3 @@ +# Операция SQL + +<embed src="../../workflow-sql/index.md#L3-L999"></embed> diff --git a/docs/ru-RU/handbook/workflow/nodes/subflow.md b/docs/ru-RU/handbook/workflow/nodes/subflow.md new file mode 100644 index 0000000000..02bfe10031 --- /dev/null +++ b/docs/ru-RU/handbook/workflow/nodes/subflow.md @@ -0,0 +1,3 @@ +# Рабочий процесс вызова + +Refer to [Subprocess Plugin: Call Workflow](../../workflow-subflow/index.md#call-workflow-node). diff --git a/docs/ru-RU/handbook/workflow/nodes/update.md b/docs/ru-RU/handbook/workflow/nodes/update.md new file mode 100644 index 0000000000..6f61abd631 --- /dev/null +++ b/docs/ru-RU/handbook/workflow/nodes/update.md @@ -0,0 +1,41 @@ +# Обновление записи + +Используется для обновления записей данных, соответствующих определённым условиям, в коллекции. + +Разделы выбора коллекции и назначения полей аналогичны узлу «Создать запись». Основные отличия узла «Обновить запись» от узла «Создать запись» — это условия фильтрации и необходимость выбора режима обновления. Кроме того, узел обновления возвращает количество успешно обновлённых строк данных, которое можно просмотреть только в истории выполнения, но нельзя использовать как переменную в последующих узлах. + +## Создание узла + +В интерфейсе настройки рабочего процесса нажмите кнопку «+» в рабочем процессе и добавьте узел «Обновить запись»: + +![Обновить запись — Добавление](https://static-docs.nocobase.com/9ff24d7bc173b3a71decc1f70ca9fb66.png) + +## Настройка узла + +![Обновить запись — Настройка узла](https://static-docs.nocobase.com/98e0f941c57275fc835f08260d0b2e86.png) + +### Коллекция + +Выберите коллекцию, в которой нужно обновить записи. + +### Режим обновления + +Существуют два режима обновления: «Пакетный» и «По одному». В пакетном режиме обновление каждой записи **не вызывает** событий коллекции. В режиме «по одному» каждое обновление записи может вызывать события коллекции. Однако при обновлении по одному могут возникнуть проблемы с производительностью, особенно при большом объёме данных, поэтому используйте этот режим с осторожностью. Обычно выбор режима зависит от целевых данных и необходимости запуска других событий рабочего процесса. Если вы обновляете одну запись по первичному ключу, рекомендуется использовать режим «по одному». Если вы обновляете несколько записей по условиям фильтрации, рекомендуется использовать пакетный режим. + +### Условия фильтрации + +Аналогично условиям фильтрации при обычном запросе к коллекции. Можно использовать переменные контекста рабочего процесса. + +### Значения полей + +Аналогично назначению полей в узле «Создать запись». Можно использовать переменные из контекста рабочего процесса или вручную ввести статические значения. + +**Примечание**: Узел обновления в рабочем процессе **не обновляет автоматически** поле «Последний изменивший», его значение нужно настраивать вручную в зависимости от ситуации. + +## Пример + +Например, при создании «Поста» нужно автоматически обновить поле «Количество постов» в коллекции «Категория поста». Это можно реализовать с помощью узла обновления: + +![Обновить запись — Пример настройки узла](https://static-docs.nocobase.com/98e0f941c57275fc835f08260d0b2e86.png) + +Когда рабочий процесс запускается, поле «Количество постов» в коллекции «Категория поста» автоматически обновляется до текущего значения +1. diff --git a/docs/ru-RU/handbook/workflow/nodes/variable.md b/docs/ru-RU/handbook/workflow/nodes/variable.md new file mode 100644 index 0000000000..1122edd9b2 --- /dev/null +++ b/docs/ru-RU/handbook/workflow/nodes/variable.md @@ -0,0 +1,3 @@ +# Пользовательская переменная + +<embed src="../../workflow-variable/index.md#L3-L999"></embed> diff --git a/docs/ru-RU/handbook/workflow/plugins/aggregate.md b/docs/ru-RU/handbook/workflow/plugins/aggregate.md new file mode 100644 index 0000000000..0bc47544bd --- /dev/null +++ b/docs/ru-RU/handbook/workflow/plugins/aggregate.md @@ -0,0 +1,64 @@ +# Агрегация (Aggregate) + +<PluginInfo name="workflow-aggregate" link="/handbook/workflow-aggregate"></PluginInfo> + +## Обзор + +Этот плагин предназначен для выполнения агрегатных запросов к данным в таблицах, соответствующих заданным условиям, с возвратом статистических результатов. Особенно полезен для генерации статистических данных для отчётов. + +Узел работает с использованием агрегатных функций базы данных и в текущей версии поддерживает запросы к одному полю в одной таблице данных. Полученная статистика сохраняется в выходных данных узла и становится доступной для последующих узлов рабочего процесса. + +## Установка + +Это встроенный плагин, не требующий дополнительной установки. + +## Руководство пользователя + +### Создание узла + +В интерфейсе конфигурации workflow нажмите кнопку "+" в потоке процесса, чтобы добавить узел "Агрегатный запрос": + +![Создание узла агрегатного запроса](https://static-docs.nocobase.com/7f9d806ebf5064f80c30f8b67f316f0f.png) + +### Настройка узла + +![Конфигурация узла агрегатного запроса](https://static-docs.nocobase.com/57362f747b9992230567c6bb5e986fd2.png) + +#### Агрегатные функции + +Поддерживаются пять SQL-функций: +- `COUNT` - подсчёт записей +- `SUM` - сумма значений +- `AVG` - среднее значение +- `MIN` - минимальное значение +- `MAX` - максимальное значение + +#### Тип цели + +Два метода выбора цели запроса: +1. Прямой выбор таблицы и поля +2. Выбор связанной таблицы из контекста workflow + +#### DISTINCT + +Соответствует ключевому слову `DISTINCT` в SQL. Поле для DISTINCT должно совпадать с выбранным полем таблицы. + +#### Условия фильтрации + +Применяются стандартные условия фильтрации, аналогичные запросам к таблицам, с использованием переменных контекста workflow. + +### Пример + +Рассмотрим пример "подсчёта общего количества статей в категории после добавления новой статьи". + +Создадим две таблицы: +1. "Статьи" (с полем "Категория" - связь многие-к-одному) +2. "Категории" (с обратной связью одна-ко-многим) + +Настроим workflow, срабатывающий при добавлении новой статьи, с узлом агрегации: + +![Пример конфигурации](https://static-docs.nocobase.com/542272e638c6c0a567373d1b37ddda78.png) + +После срабатывания узел подсчитает общее количество статей в категории новой статьи. + +Для доступа к связанным данным в триггере события таблицы необходимо настроить "Предзагрузку ассоциаций", иначе эти поля будут недоступны для выбора. diff --git a/docs/ru-RU/handbook/workflow/quick-start.md b/docs/ru-RU/handbook/workflow/quick-start.md new file mode 100644 index 0000000000..099377275c --- /dev/null +++ b/docs/ru-RU/handbook/workflow/quick-start.md @@ -0,0 +1,94 @@ +# Быстрый старт + +## Настройка рабочего процесса + +Чтобы настроить рабочий процесс (workflow), перейдите на страницу управления плагином Workflow, открыв меню конфигурации плагинов в верхней панели навигации: + +![Ссылка на управление плагином Workflow](https://static-docs.nocobase.com/872169fb0cf277715178d1a6804e12cd.png) + +На странице управления будут отображены все созданные рабочие процессы: + +![Управление рабочими процессами](https://static-docs.nocobase.com/6d31e5c6c94a51513e6569dbc410c01f.png) + +Нажмите кнопку «Добавить» для создания нового рабочего процесса и выберите событие коллекции: + +![Создание рабочего процесса](https://static-docs.nocobase.com/57f23ce3c91d153ea235f95268a63d98.png) + +Нажмите ссылку «Настроить» в списке, чтобы перейти на страницу конфигурации рабочего процесса: + +![Пустой рабочий процесс](https://static-docs.nocobase.com/d6a3bc6b3fd03cba5bb10f142c38e2bf.png) + +Затем нажмите на карточку триггера, чтобы открыть боковую панель настройки. Выберите ранее созданную коллекцию (например, «Posts») и условие запуска «После добавления записи», затем нажмите «Сохранить», чтобы завершить настройку триггера: + +![Настройка триггера](https://static-docs.nocobase.com/f96015efe87759d6836d2a1c58d92884.png) + +Далее вы можете нажать кнопку «+» в рабочем процессе, чтобы добавить узел. Например, выберите узел «Вычисление», чтобы объединить поля «Title» и «ID» данных триггера: + +![Добавление узла операции](https://static-docs.nocobase.com/60eeee25e6847a91fad50784c8c508ad.png) + +Нажмите на карточку узла, чтобы открыть его настройки. Используйте функцию `CONCATENATE` из Formula.js для объединения полей «Title» и «ID», вставив поля с помощью селектора переменных: + +![Узел операции с функцией и переменными](https://static-docs.nocobase.com/837e4851a4c70a1932542caadef3431b.png) + +Затем создайте узел «Обновить запись», чтобы сохранить результат в поле «Title»: + +![Создание узла обновления данных](https://static-docs.nocobase.com/494f72dff72b4410240b04c59cbbd322.png) + +Аналогично, нажмите на карточку, чтобы открыть настройки узла «Обновить запись». Выберите коллекцию «Posts», укажите ID записи из триггера, выберите поле «Title» для обновления и в качестве значения укажите результат из узла вычисления: + +![Настройка узла обновления данных](https://static-docs.nocobase.com/2e147c93643e7ebc709b9b7ab4f3af8c.png) + +Наконец, нажмите переключатель «Вкл/Выкл» в правом верхнем углу панели инструментов, чтобы включить рабочий процесс. После этого он сможет запускаться и выполняться. + +## Запуск рабочего процесса + +Вернитесь на главную страницу и создайте запись «post» с помощью блока данных. Заполните заголовок поста: + +![Создание данных поста](https://static-docs.nocobase.com/d21a1a5833d5f54f52678ea18e9922f2.png) + +После отправки и обновления блока вы увидите, что заголовок поста автоматически изменился на форму «Заголовок поста + ID поста»: + +![Заголовок поста изменённый рабочим процессом](https://static-docs.nocobase.com/3a700445896965c46c70ac51a07bbdb9.png) + +:::info{title=Примечание} +Так как рабочий процесс, запускаемый в коллекции, выполняется асинхронно, вы можете не увидеть обновлённую запись сразу после отправки. Однако, после обновления страницы или блока через некоторое время обновлённые данные появятся. +::: + +## Просмотр истории выполнения + +Рабочий процесс, запущенный ранее, успешно выполнился. Вернёмся на страницу управления рабочими процессами, чтобы посмотреть соответствующую историю выполнения: + +![Просмотр списка рабочих процессов](https://static-docs.nocobase.com/92952de7fe6472db7d247a915e36100a.png) + +В списке рабочих процессов видно, что в истории выполнения есть одна запись. Нажав на ссылку с числом в столбце «Выполнено», вы откроете историю выполнения соответствующего рабочего процесса: + +![Список истории выполнения рабочего процесса](https://static-docs.nocobase.com/00537af15c6ae43d745106178242bc09.png) + +Нажав на ссылку «Просмотр», вы попадёте на страницу деталей конкретного выполнения. Здесь можно увидеть статус выполнения и результаты данных каждого узла: + +![Детали истории выполнения рабочего процесса](https://static-docs.nocobase.com/93ec7ce25391d71cf7a109c9d03d5a48.png) + +Данные контекста триггера и результаты узлов можно посмотреть, нажав на кнопку статуса в правом верхнем углу соответствующей карточки. Например, посмотрим результаты узла вычисления: + +![Результат узла вычисления](https://static-docs.nocobase.com/10c22b923d3de0a0d58fa9283780f592.png) + +Можно увидеть, что результат узла вычисления включает вычисленный заголовок — именно эти данные далее обновляются узлом «Обновить запись». + +## Итоги + +Выполнив описанные шаги, мы завершили настройку и запуск простого рабочего процесса, а также познакомились с основными понятиями: + +- **Рабочий процесс (Workflow)**: Определяет базовую информацию, включая имя, тип триггера и статус «Вкл/Выкл». В рамках одного рабочего процесса можно настроить несколько узлов. Является контейнером для процесса. +- **Триггер (Trigger)**: Каждый рабочий процесс содержит триггер, который настраивается на определённые условия запуска. Является точкой входа. +- **Узел (Node)**: Единица инструкции внутри рабочего процесса, выполняющая конкретные действия. Несколько узлов связаны между собой по принципу «вход-выход», формируя полный процесс. +- **Выполнение (Execution)**: Конкретный запуск рабочего процесса после срабатывания триггера. Также называется записью выполнения или историей выполнения. Включает информацию о статусе и контекстных данных триггера. Для каждого узла существует соответствующий результат выполнения, содержащий статус и данные. + +Для более глубокого изучения ознакомьтесь со следующими материалами: + +- Продвинутые темы + - [Использование переменных](./advanced/variables.md) + - [План выполнения (История)](./advanced/executions.md) + - [Редакции](./advanced/revisions.md) + - [Расширенные настройки](./advanced/options.md) +- [Обзор триггеров](./triggers/index.md) +- [Обзор узлов](./nodes/index.md) diff --git a/docs/ru-RU/handbook/workflow/triggers/approval.md b/docs/ru-RU/handbook/workflow/triggers/approval.md new file mode 100644 index 0000000000..264bb60e09 --- /dev/null +++ b/docs/ru-RU/handbook/workflow/triggers/approval.md @@ -0,0 +1,27 @@ +# Утверждение (Approval) + +<PluginInfo commercial="true" name="workflow-approval" link="/handbook/workflow-approval"></PluginInfo> + +## Обзор + +Плагин Workflow Approval предоставляет функциональность для создания процессов утверждения в NocoBase. Это коммерческий плагин, который позволяет: + +- Настраивать многоуровневые процессы утверждения +- Создавать маршруты утверждения с условиями +- Управлять правами утверждающих +- Отслеживать историю утверждений + +## Основные возможности + +<embed src="../../workflow-approval/trigger.md#L3-L999"></embed> + +## Связанные материалы + +Помимо конфигурации триггеров, в [документации плагина](../../workflow-approval/index.md) вы можете найти дополнительную информацию о: + +- Настройке многоступенчатых процессов утверждения +- Управлении правами и ролями утверждающих +- Кастомизации форм утверждения +- Интеграции с другими плагинами +- Расширенных сценариях использования + diff --git a/docs/ru-RU/handbook/workflow/triggers/collection.md b/docs/ru-RU/handbook/workflow/triggers/collection.md new file mode 100644 index 0000000000..f23f066773 --- /dev/null +++ b/docs/ru-RU/handbook/workflow/triggers/collection.md @@ -0,0 +1,82 @@ +# Событие коллекции + +Типы триггеров событий коллекции отслеживают события добавления, удаления и обновления записей в коллекции. При выполнении действия с записью коллекции, соответствующего настроенным условиям, будет запущен связанный рабочий процесс. Например: уменьшение запасов товара после добавления нового заказа, ожидание ручной проверки после добавления комментария и т.д. + +## Основное использование + +Изменения коллекции могут быть нескольких типов: + +1. После добавления записи +2. После обновления записи +3. После добавления или обновления записи +4. После удаления записи + +![Выбор времени срабатывания](https://static-docs.nocobase.com/81275602742deb71e0c830eb97aa612c.png) + +Вы можете выбрать момент срабатывания в соответствии с бизнес-потребностями. При выборе типа изменения, включающего обновление записи, можно также ограничить поля, изменения в которых должны вызывать срабатывание. Если поля не выбраны - триггер сработает при любом изменении. + +![Выбор изменяемых полей](https://static-docs.nocobase.com/874a1475f01298b3c00267b2b4674611.png) + +Дополнительно можно настроить условия для каждого поля записи. Триггер сработает только при выполнении условий для указанных полей. + +![Настройка условий для данных](https://static-docs.nocobase.com/264ae3835dcd75cee0eef7812c11fe0c.png) + +После срабатывания события коллекции исходная запись будет добавлена в контекст выполнения как данные триггера для использования последующими узлами. Однако если последующим узлам нужны связанные поля этой записи, необходимо сначала настроить их предварительную загрузку. + +## Важные замечания + +### Пакетные операции не поддерживаются + +События коллекции пока не поддерживают срабатывание при пакетных операциях с данными. Например, при добавлении статьи и нескольких связанных тегов сработает только workflow для добавления статьи. + +### Внешние изменения не вызывают срабатывание + +Изменения данных, сделанные напрямую в БД (не через интерфейс NocoBase), не активируют события коллекции. Операции через SQL-узлы также считаются прямыми изменениями БД. + +### Внешние источники данных + +Начиная с версии 0.20, workflow поддерживает внешние источники данных. События коллекции будут срабатывать для внешних источников только если операции выполняются через приложение NocoBase. + +## Пример + +Рассмотрим сценарий расчета общей суммы заказа и уменьшения запасов после его добавления. + +Сначала создаем коллекции "Товары" и "Заказы" со следующей структурой: + +**Товары:** +| Поле | Тип | +|------|-----| +| Название | Текст | +| Цена | Число | +| Запасы | Целое число | + +**Заказы:** +| Поле | Тип | +|------|-----| +| Номер | Автономер | +| Товар | Многие-к-одному (Товар) | +| Итоговая сумма | Число | + +Добавляем тестовые товары: +- iPhone 14 Pro - 7999 руб. (10 шт.) +- iPhone 13 Pro - 5999 руб. (0 шт.) + +Создаем workflow на основе события коллекции "Заказы": + +![Пример триггера добавления заказа](https://static-docs.nocobase.com/094392a870dddc65aeb20357f62ddc08.png) + +Настройки: +- Коллекция: "Заказы" +- Срабатывание: "После добавления данных" +- Условия: нет +- Предзагрузка связей: "Товар" + +Затем настраиваем узлы workflow для проверки запасов и обработки заказа: + +![Логика обработки заказа](https://static-docs.nocobase.com/7713ea1aaa0f52a0dc3c92aba5e58f05.png) + +После активации workflow: +- При заказе iPhone 14 Pro запасы уменьшатся до 9 +- При заказе iPhone 13 Pro заказ будет удален из-за отсутствия товара + +![Результат выполнения](https://static-docs.nocobase.com/24cbe51e24ba4804b3bd48d99415c54f.png) diff --git a/docs/ru-RU/handbook/workflow/triggers/custom-action.md b/docs/ru-RU/handbook/workflow/triggers/custom-action.md new file mode 100644 index 0000000000..c66fc9e93d --- /dev/null +++ b/docs/ru-RU/handbook/workflow/triggers/custom-action.md @@ -0,0 +1,26 @@ +# Пользовательское действие (Custom Action) + +<PluginInfo commercial="true" name="workflow-custom-action-trigger" link="/handbook/workflow-custom-action-trigger"></PluginInfo> + +## Обзор + +Плагин Workflow Custom Action Trigger предоставляет возможность создавать и настраивать пользовательские триггеры действий в NocoBase. Это коммерческий плагин, который позволяет: + +- Создавать собственные события для запуска рабочих процессов +- Настраивать условия срабатывания триггеров +- Интегрировать пользовательские действия в бизнес-процессы + +## Основные возможности + +<embed src="../../workflow-custom-action-trigger/trigger.md#L3-L999"></embed> + +## Связанные материалы + +Помимо конфигурации триггеров, в [документации плагина](../../workflow-custom-action-trigger/index.md) вы можете найти дополнительную информацию о: + +- Создании сложных пользовательских триггеров +- Интеграции с другими плагинами +- Расширенных сценариях использования +- Настройке прав доступа для пользовательских действий +- Отладке и мониторинге пользовательских триггеров + diff --git a/docs/ru-RU/handbook/workflow/triggers/index.md b/docs/ru-RU/handbook/workflow/triggers/index.md new file mode 100755 index 0000000000..5409afb19c --- /dev/null +++ b/docs/ru-RU/handbook/workflow/triggers/index.md @@ -0,0 +1,23 @@ +# Обзор + +Триггеры являются точками входа для запуска рабочего процесса. Когда во время выполнения приложения происходит событие, соответствующее условиям триггера, рабочий процесс запускается. Тип триггера определяет и тип самого рабочего процесса — он выбирается при создании рабочего процесса и в дальнейшем изменению не подлежит. В настоящее время поддерживаются следующие типы триггеров: + +- [События коллекций](./collection.md) (встроенные) +- [Запланированные задачи](./schedule.md) (встроенные) +- [События перед действием](./pre-action.md) (предоставляется плагином @nocobase/plugin-workflow-request-interceptor) +- [Пользовательские события действий](./custom-action.md) (предоставляется плагином @nocobase/plugin-workflow-custom-action-trigger) +- [События после действия](./post-action.md) (предоставляется плагином @nocobase/plugin-workflow-action-trigger) +- [Согласование](./approval.md) (предоставляется плагином @nocobase/plugin-workflow-approval) +- [Вебхуки](./webhook.md) (предоставляется плагином @nocobase/plugin-workflow-webhook) + +Временные точки срабатывания каждого типа триггера показаны на следующей диаграмме: + +![События рабочего процесса](https://static-docs.nocobase.com/20240514214606.png) + +Например, когда пользователь отправляет форму, когда данные в коллекции изменяются в результате действий пользователя или вызова программы, либо когда наступает запланированное время выполнения задачи — соответствующий рабочий процесс будет запущен. + +Триггеры, связанные с данными (например, действия, события коллекций), обычно передают контекстные данные триггера. Эти данные можно использовать в узлах рабочего процесса для автоматической обработки. Например, когда пользователь отправляет форму, привязанную к рабочему процессу, отправленные данные попадают в контекст выполнения, и последующие узлы могут использовать их как переменные. + +После создания рабочего процесса триггер отображается на странице просмотра как начальный узел в начале цепочки. Нажмите на карточку, чтобы открыть панель настройки. В зависимости от типа триггера можно настроить соответствующие условия. + +![Узел триггера](https://static-docs.nocobase.com/e8dc1937e41b2712b67d84d60e94b11e.png) diff --git a/docs/ru-RU/handbook/workflow/triggers/post-action.md b/docs/ru-RU/handbook/workflow/triggers/post-action.md new file mode 100644 index 0000000000..7f4e5d5024 --- /dev/null +++ b/docs/ru-RU/handbook/workflow/triggers/post-action.md @@ -0,0 +1,9 @@ +# Событие после действия + +<PluginInfo name="workflow-action-trigger" link="/handbook/workflow-action-trigger"></PluginInfo> + +<embed src="../../workflow-action-trigger/trigger.md#L3-L999"></embed> + +## Связанные материалы + +Помимо настройки триггера, существуют и другие темы, связанные с триггером после действия, которые можно изучить дополнительно в [документации плагина](../../workflow-action-trigger/index.md). diff --git a/docs/ru-RU/handbook/workflow/triggers/pre-action.md b/docs/ru-RU/handbook/workflow/triggers/pre-action.md new file mode 100644 index 0000000000..79d524b4b1 --- /dev/null +++ b/docs/ru-RU/handbook/workflow/triggers/pre-action.md @@ -0,0 +1,9 @@ +# Триггер перед действием + +<PluginInfo commercial="true" name="workflow-request-interceptor" link="/handbook/workflow-request-interceptor"></PluginInfo> + +<embed src="../../workflow-request-interceptor/trigger.md#L3-L999"></embed> + +## Связанные материалы + +Помимо настройки триггера, существуют и другие связанные темы, касающиеся триггера перед действием, с которыми можно ознакомиться дополнительно в [документации плагина](../../workflow-request-interceptor/index.md). diff --git a/docs/ru-RU/handbook/workflow/triggers/schedule.md b/docs/ru-RU/handbook/workflow/triggers/schedule.md new file mode 100644 index 0000000000..b143e8d160 --- /dev/null +++ b/docs/ru-RU/handbook/workflow/triggers/schedule.md @@ -0,0 +1,73 @@ +# Планируемое событие + +Планируемые задачи — это события, срабатывающие по временным условиям, включающие два режима: + +- Пользовательское время: Регулярные триггеры по расписанию, аналогичные cron, на основе системного времени. +- Поле времени коллекции: Срабатывание по значению временного поля в коллекции. + +Когда система достигает времени (с точностью до секунд), соответствующего настроенным условиям срабатывания, запускается соответствующий рабочий процесс. + +## Основное использование + +### Создание планируемого события + +При создании рабочего процесса в списке выберите тип "Планируемое событие": + +![Создание планируемого события](https://static-docs.nocobase.com/e09b6c9065167875b2ca7de5f5a799a7.png) + +### Режим пользовательского времени + +Для регулярного режима сначала настройте время начала на любую точку времени (с точностью до секунд). Время начала можно установить как в будущем, так и в прошлом. Если установлено прошедшее время, система проверит соответствие времени на основе настроенного условия повтора. Если условие повтора не настроено, рабочий процесс не сработает при времени начала в прошлом. + +Есть два способа настройки правил повтора: + +- Интервал времени: Срабатывание через фиксированные промежутки после времени начала, например каждый час, каждые 30 минут и т.д. +- Расширенный режим: Использование cron-правил для настройки срабатывания в фиксированные моменты даты и времени. + +После настройки правила повтора можно также настроить условие завершения — по фиксированному моменту времени или по количеству выполнений. + +### Режим поля времени коллекции + +Использование поля времени коллекции для определения времени начала — это режим триггера, сочетающий обычные планируемые задачи с полем времени коллекции. Этот режим упрощает некоторые узлы в специфических процессах и делает конфигурацию более интуитивной. Например, для изменения статуса неоплаченных заказов старше 30 минут на "отменён" достаточно настроить планируемую задачу в режиме поля времени коллекции, выбрав время начала как "30 минут после поля времени создания заказа". + +## Связанные рекомендации + +### Планируемые задачи при остановленном приложении + +Если настроенные временные условия выполнены, но сервис приложения NocoBase остановлен или выключен, соответствующие планируемые задачи будут пропущены. После перезапуска сервиса пропущенные задачи не выполнятся автоматически. Рекомендуется предусматривать обработку таких ситуаций или резервные механизмы. + +### Счётчик повторов + +При настройке количества повторов в условии завершения учитывается общее количество выполнений одного рабочего процесса во всех версиях. Например, если задача уже выполнялась 10 раз в версии 1, а максимальное количество повторов равно 10, workflow больше не сработает, даже если его скопировать в новую версию. Однако при дублировании в новый рабочий процесс счётчик выполнений сбрасывается. + +### Разница между интервальным временем и расширенным режимом + +Интервальное время в правиле повтора отсчитывается от момента предыдущего срабатывания (или времени начала), тогда как расширенный режим срабатывает в фиксированные моменты. Например, при настройке "каждые 30 минут" и последнем срабатывании в 12:01:23 следующее будет в 12:31:23. Расширенный режим работает как cron — срабатывает строго по заданным временным точкам. + +## Пример + +Допустим, мы хотим каждую минуту проверять заказы, не оплаченные более 30 минут, и автоматически менять их статус на "отменён". Реализуем это обоими способами. + +### Режим пользовательского времени + +Создаём workflow на основе планируемой задачи, выбираем режим "Пользовательское время", устанавливаем время начала не позднее текущего момента, настраиваем повтор "каждую минуту" без условия завершения: + +![Настройка триггера - пользовательское время](https://static-docs.nocobase.com/71131e3f2034263f883062389b356cbd.png) + +Затем настраиваем другие узлы workflow для вычисления времени "30 минут назад" и обновления статуса неоплаченных заказов, созданных до этого времени: + +![Логика обработки](https://static-docs.nocobase.com/188bc5287ffa1fb24a4e7baa1de6eb29.png) + +После активации workflow будет срабатывать каждую минуту, вычислять временную границу и обновлять статусы. + +### Режим поля времени коллекции + +Создаём workflow, выбираем режим "Поле времени коллекции", указываем коллекцию "Заказы", устанавливаем время начала как "30 минут после создания заказа", выбираем "без повтора": + +![Настройка триггера - поле коллекции](https://static-docs.nocobase.com/d40d5aef57f42799d31cc5882dd94246.png) + +Затем настраиваем узел обновления для изменения статуса конкретного заказа (ID берётся из контекста срабатывания): + +![Узел обновления](https://static-docs.nocobase.com/491dde9df8f773f5b14a4fd8ceac9d3e.png) + +В отличие от первого способа, здесь не требуется вычислять временную границу — workflow срабатывает уже для конкретных записей, соответствующих условию по времени. diff --git a/docs/ru-RU/handbook/workflow/triggers/webhook.md b/docs/ru-RU/handbook/workflow/triggers/webhook.md new file mode 100644 index 0000000000..48d89cbb17 --- /dev/null +++ b/docs/ru-RU/handbook/workflow/triggers/webhook.md @@ -0,0 +1,4 @@ +# Webhook + +<embed src="../../workflow-webhook/index.md#L3-L999"></embed> + diff --git a/docs/ru-RU/index.md b/docs/ru-RU/index.md new file mode 100644 index 0000000000..3243ecb333 --- /dev/null +++ b/docs/ru-RU/index.md @@ -0,0 +1,3 @@ +# Индекс + +<Navigate replace to="/welcome/introduction"></Navigate> diff --git a/docs/ru-RU/manual/blocks-guide/charts.md b/docs/ru-RU/manual/blocks-guide/charts.md new file mode 100755 index 0000000000..17dda3b4c6 --- /dev/null +++ b/docs/ru-RU/manual/blocks-guide/charts.md @@ -0,0 +1,104 @@ +# Диаграммы в NocoBase + +В настоящее время для работы с диаграммами в NocoBase требуется использование конфигурационных файлов или написание кода. Система использует библиотеку [g2plot](https://g2plot.antv.vision/en/examples) и теоретически поддерживает все типы диаграмм, представленные на сайте библиотеки. В данный момент доступны для настройки: + +- Столбчатые диаграммы +- Горизонтальные диаграммы +- Линейные графики +- Круговые диаграммы +- Диаграммы площадей + +## Добавление и редактирование диаграмм + +![chart-edit.gif](https://static-docs.nocobase.com/97c1d74a7ca9d0e8d2971cca2ab8de50.gif) + +## Настройка диаграмм + +Исходная конфигурация диаграмм использует статические JSON-данные: + +```json +{ + "data": [ + {"type": "Мебель и техника", "sales": 38}, + {"type": "Продукты питания", "sales": 52}, + {"type": "Фрукты", "sales": 61}, + {"type": "Косметика", "sales": 145}, + {"type": "Товары для детей", "sales": 48}, + {"type": "Импортные продукты", "sales": 38}, + {"type": "Напитки", "sales": 38}, + {"type": "Бытовая химия", "sales": 38} + ], + "xField": "type", + "yField": "sales", + "label": { + "position": "middle", + "style": { + "fill": "#FFFFFF", + "opacity": 0.6 + } + }, + "xAxis": { + "label": { + "autoHide": true, + "autoRotate": false + } + }, + "meta": { + "type": {"alias": "Категория"}, + "sales": {"alias": "Продажи"} + } +} +``` + +## Динамические данные + +Поле `data` поддерживает выражения. NocoBase включает функцию `requestChartData(config)` для запроса данных диаграмм. Параметры config: [https://github.com/axios/axios#request-config](https://github.com/axios/axios#request-config) + +Пример: +```json +{ + "data": "{{requestChartData({ url: 'collectionName:getColumnChartData' })}}", + ...остальные параметры... +} +``` + +Пример HTTP API: +```bash +GET /api/collectionName:getColumnChartData +``` + +## Реализация на сервере + +Для таблицы `collectionName` необходимо добавить метод `getColumnChartData`: + +```js +app.resourcer.registerActionHandlers({ + 'collectionName:getColumnChartData': async (ctx, next) => { + ctx.body = []; // Возвращаемые данные + await next(); + }, +}); +``` + +## Видео примеры + +### Статические данные +[Видео](https://user-images.githubusercontent.com/1267426/198877269-1c56562b-167a-4808-ada3-578f0872bce1.mp4) + +### Динамические данные +[Видео](https://user-images.githubusercontent.com/1267426/198877336-6bd85f0b-17c5-40a5-9442-8045717cc7b0.mp4) + +### Другие типы диаграмм +Поддерживаются все диаграммы с [g2plot](https://g2plot.antv.vision/en/examples) +[Видео](https://user-images.githubusercontent.com/1267426/198877347-7fc2544c-b938-4e34-8a83-721b3f62525e.mp4) + +## JS-выражения + +Синтаксис: +```js +{ + "key1": "{{ js выражение }}" +} +``` + +[Пример использования](https://user-images.githubusercontent.com/1267426/198877361-808a51cc-6c91-429f-8cfc-8ad7f747645a.mp4) diff --git a/docs/ru-RU/manual/blocks-guide/charts/Chart-Dynamic-1.m4v b/docs/ru-RU/manual/blocks-guide/charts/Chart-Dynamic-1.m4v new file mode 100644 index 0000000000..76d8c994b2 Binary files /dev/null and b/docs/ru-RU/manual/blocks-guide/charts/Chart-Dynamic-1.m4v differ diff --git a/docs/ru-RU/manual/blocks-guide/charts/Chart-Js-1.m4v b/docs/ru-RU/manual/blocks-guide/charts/Chart-Js-1.m4v new file mode 100644 index 0000000000..482b078eb4 Binary files /dev/null and b/docs/ru-RU/manual/blocks-guide/charts/Chart-Js-1.m4v differ diff --git a/docs/ru-RU/manual/blocks-guide/charts/Chart-More-1.m4v b/docs/ru-RU/manual/blocks-guide/charts/Chart-More-1.m4v new file mode 100644 index 0000000000..944d8da258 Binary files /dev/null and b/docs/ru-RU/manual/blocks-guide/charts/Chart-More-1.m4v differ diff --git a/docs/ru-RU/manual/blocks-guide/charts/Chart-Static-1.m4v b/docs/ru-RU/manual/blocks-guide/charts/Chart-Static-1.m4v new file mode 100644 index 0000000000..8009d7a07d Binary files /dev/null and b/docs/ru-RU/manual/blocks-guide/charts/Chart-Static-1.m4v differ diff --git a/docs/ru-RU/manual/blocks-guide/charts/chart-edit.gif b/docs/ru-RU/manual/blocks-guide/charts/chart-edit.gif new file mode 100755 index 0000000000..86a3540a31 Binary files /dev/null and b/docs/ru-RU/manual/blocks-guide/charts/chart-edit.gif differ diff --git a/docs/ru-RU/manual/collection/collection-fdw/enable-federated.md b/docs/ru-RU/manual/collection/collection-fdw/enable-federated.md new file mode 100644 index 0000000000..b244e06e9b --- /dev/null +++ b/docs/ru-RU/manual/collection/collection-fdw/enable-federated.md @@ -0,0 +1,51 @@ +# Как активировать движок Federated в MySQL + +По умолчанию модуль Federated в MySQL отключен. Для его включения необходимо изменить конфигурационный файл my.cnf. Для версии в Docker можно использовать volumes для обработки расширений: + +## Настройка для Docker + +```yml +mysql: + image: mysql:8.1.0 + volumes: + - ./storage/mysql-conf:/etc/mysql/conf.d + environment: + MYSQL_DATABASE: nocobase + MYSQL_USER: nocobase + MYSQL_PASSWORD: nocobase + MYSQL_ROOT_PASSWORD: nocobase + restart: always + networks: + - nocobase +``` + +## Создание конфигурационного файла + +1. Создайте файл `./storage/mysql-conf/federated.cnf` со следующим содержимым: + +```conf +[mysqld] +federated +``` + +## Перезапуск MySQL + +Выполните команду для перезапуска контейнера MySQL: + +```bash +docker compose up -d mysql +``` + +## Проверка активации + +Чтобы убедиться, что движок Federated активирован, выполните SQL-запрос: + +```sql +show engines +``` + +Результат должен показывать поддержку Federated: + +![Проверка движка](https://static-docs.nocobase.com/ac5d97cf902ad164e141633a41a23e46.png) + +После этих действий движок Federated будет доступен для использования в вашей базе данных MySQL. diff --git a/docs/ru-RU/manual/collection/collection-fdw/image-1.png b/docs/ru-RU/manual/collection/collection-fdw/image-1.png new file mode 100644 index 0000000000..28ad3aa627 Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-fdw/image-1.png differ diff --git a/docs/ru-RU/manual/collection/collection-fdw/image-10.png b/docs/ru-RU/manual/collection/collection-fdw/image-10.png new file mode 100644 index 0000000000..3fa17d784d Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-fdw/image-10.png differ diff --git a/docs/ru-RU/manual/collection/collection-fdw/image-2.png b/docs/ru-RU/manual/collection/collection-fdw/image-2.png new file mode 100644 index 0000000000..032241693e Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-fdw/image-2.png differ diff --git a/docs/ru-RU/manual/collection/collection-fdw/image-3.png b/docs/ru-RU/manual/collection/collection-fdw/image-3.png new file mode 100644 index 0000000000..93c3e0631a Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-fdw/image-3.png differ diff --git a/docs/ru-RU/manual/collection/collection-fdw/image-4.png b/docs/ru-RU/manual/collection/collection-fdw/image-4.png new file mode 100644 index 0000000000..72f11fdc5b Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-fdw/image-4.png differ diff --git a/docs/ru-RU/manual/collection/collection-fdw/image-5.png b/docs/ru-RU/manual/collection/collection-fdw/image-5.png new file mode 100644 index 0000000000..01b08cd71e Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-fdw/image-5.png differ diff --git a/docs/ru-RU/manual/collection/collection-fdw/image-6.png b/docs/ru-RU/manual/collection/collection-fdw/image-6.png new file mode 100644 index 0000000000..092b33cb60 Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-fdw/image-6.png differ diff --git a/docs/ru-RU/manual/collection/collection-fdw/image-7.png b/docs/ru-RU/manual/collection/collection-fdw/image-7.png new file mode 100644 index 0000000000..793c6aef76 Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-fdw/image-7.png differ diff --git a/docs/ru-RU/manual/collection/collection-fdw/image-8.png b/docs/ru-RU/manual/collection/collection-fdw/image-8.png new file mode 100644 index 0000000000..50a754339d Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-fdw/image-8.png differ diff --git a/docs/ru-RU/manual/collection/collection-fdw/image-9.png b/docs/ru-RU/manual/collection/collection-fdw/image-9.png new file mode 100644 index 0000000000..26e966f7a6 Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-fdw/image-9.png differ diff --git a/docs/ru-RU/manual/collection/collection-fdw/image.png b/docs/ru-RU/manual/collection/collection-fdw/image.png new file mode 100644 index 0000000000..332858e2c3 Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-fdw/image.png differ diff --git a/docs/ru-RU/manual/collection/collection-fdw/index.md b/docs/ru-RU/manual/collection/collection-fdw/index.md new file mode 100644 index 0000000000..2db9a3a452 --- /dev/null +++ b/docs/ru-RU/manual/collection/collection-fdw/index.md @@ -0,0 +1,60 @@ +# Подключение внешних таблиц данных + +## Введение + +Плагин для подключения удаленных таблиц данных реализован на основе технологии Foreign Data Wrapper. В настоящее время поддерживаются базы данных MySQL и PostgreSQL. + +### MySQL + +MySQL использует механизм `federated`, который требует активации и поддерживает подключение к удаленным MySQL и совместимым СУБД, таким как MariaDB. Подробнее см. документацию [Federated Storage Engine](https://dev.mysql.com/doc/refman/8.0/en/federated-storage-engine.html). + +### PostgreSQL + +В PostgreSQL подключение к различным типам удаленных данных осуществляется через расширения `fdw`. В настоящее время поддерживаются: + +- [postgres_fdw](https://www.postgresql.org/docs/current/postgres-fdw.html) - подключение к удаленным PostgreSQL +- [mysql_fdw (в разработке)](https://github.com/EnterpriseDB/mysql_fdw) - подключение к MySQL +- Другие типы расширений FDW см. в [PostgreSQL Foreign Data Wrappers](https://wiki.postgresql.org/wiki/Foreign_data_wrappers). Для интеграции с NocoBase требуется реализация соответствующих интерфейсов. + +## Установка + +**Предварительные требования:** +- Локальная MySQL (используемая NocoBase) должна иметь активированный `federated` ([инструкция](./enable-federated.md)) + +Затем установите и активируйте плагин через менеджер плагинов: + +![Установка плагина](https://static-docs.nocobase.com/f84276c5712851fb3ff33af3f1ff0f59.png) + +## Руководство пользователя + +В разделе "Управление таблицами > Создать таблицу" выберите "Подключить внешние данные": + +![Подключение внешних данных](https://static-docs.nocobase.com/029d946a6d067d1c35a39755219d623c.png) + +В выпадающем списке "Сервис БД" выберите существующее подключение или создайте новое: + +![Сервис БД](https://static-docs.nocobase.com/766271708a911950a5599d60d6be4a4d.png) + +Создание сервиса БД: + +![Создание сервиса БД](https://static-docs.nocobase.com/1e357216e04cc4f200bd6212827281c8.png) + +После выбора сервиса БД укажите нужную таблицу в выпадающем списке "Удаленная таблица": + +![Выбор таблицы](https://static-docs.nocobase.com/e91fd6152b52b4fc01b3808053cc8dc4.png) + +Настройте поля: + +![Настройка полей](https://static-docs.nocobase.com/e618fecc5fe327f6a495e61405e5f040.png) + +При изменении структуры удаленной таблицы можно выполнить "Синхронизацию с удаленной таблицей": + +![Синхронизация](https://static-docs.nocobase.com/3751a9a39f933889fb3fcc4d85a6f4ad.png) + +Процесс синхронизации: + +![Процесс синхронизации](https://static-docs.nocobase.com/13f18200e31ea223fdd8dadaff1e9d28.png) + +Отображение в интерфейсе: + +![Отображение в интерфейсе](https://static-docs.nocobase.com/368fca27a99277d9360ca81350949357.png) diff --git a/docs/ru-RU/manual/collection/collection-templates/calender/index.md b/docs/ru-RU/manual/collection/collection-templates/calender/index.md new file mode 100644 index 0000000000..8f1c841b52 --- /dev/null +++ b/docs/ru-RU/manual/collection/collection-templates/calender/index.md @@ -0,0 +1,13 @@ +# Календарная таблица + +![](https://static-docs.nocobase.com/0077dbdbb296afb00ba055e7bf5e9acc.png) + +Шаблон таблицы данных календаря - это шаблон данных, используемый для управления данными, связанными со временем, обычно используемый для хранения и управления информацией, связанной с датой/временем, такой как события, встречи, задачи и т.д. Ниже приведены предварительно определенные поля шаблона таблицы данных календаря: + +1. Время создания и окончания: Представляет дату и время начала и окончания события. +2. Создатель и обновитель: человек, который публикует информацию о событии. +3. Частота повторения: Определите порядок повторения событий, например, ежедневно, еженедельно, ежемесячно и т.д. + +С помощью шаблона таблицы данных календаря вы можете легко создавать информацию, связанную со временем, и управлять ею, а также поддерживать планирование, напоминания и отслеживание хода выполнения задач. Этот шаблон обычно используется в управлении личным расписанием, совместной работе в команде, планировании собраний и других приложениях + +![](https://static-docs.nocobase.com/e516666868f98162ddf9481109df8aba.png) diff --git a/docs/ru-RU/manual/collection/collection-templates/calender/static/JHaTbG3rCo4L0yxUUYQc1OfTnrd.png b/docs/ru-RU/manual/collection/collection-templates/calender/static/JHaTbG3rCo4L0yxUUYQc1OfTnrd.png new file mode 100644 index 0000000000..d825191401 Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-templates/calender/static/JHaTbG3rCo4L0yxUUYQc1OfTnrd.png differ diff --git a/docs/ru-RU/manual/collection/collection-templates/calender/static/UX2nbqRrdormvlxqQrFcFf3EnCc.png b/docs/ru-RU/manual/collection/collection-templates/calender/static/UX2nbqRrdormvlxqQrFcFf3EnCc.png new file mode 100644 index 0000000000..cecffde5cf Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-templates/calender/static/UX2nbqRrdormvlxqQrFcFf3EnCc.png differ diff --git a/docs/ru-RU/manual/collection/collection-templates/expression/index.md b/docs/ru-RU/manual/collection/collection-templates/expression/index.md new file mode 100644 index 0000000000..a373cec2ba --- /dev/null +++ b/docs/ru-RU/manual/collection/collection-templates/expression/index.md @@ -0,0 +1,75 @@ +# Использование таблиц выражений + +## Основные понятия + +В отличие от полей формул в таблицах данных, которые применяются ко всей таблице единообразно, динамические выражения позволяют выполнять вычисления с разными формулами для каждой строки данных. Вычисления с динамическими выражениями **поддерживаются только в рабочих процессах**. + +Таблица выражений предназначена для хранения различных формул для одного типа данных. Обычно она имеет отношение «многие к одному» (belongsTo) с таблицей данных, участвующей в вычислениях: + +Отношение «многие к одному» — это типичный случай, но на практике связь между обычной таблицей данных и таблицей выражений может быть установлена произвольно. Сценарий, когда одна строка данных связана с несколькими выражениями, обычно требует дополнительных отличительных полей или используется в циклах для выполнения различных вычислений для одной строки. + +Три поля таблицы выражений и их значения: + +- **Таблица данных**: эквивалент параметра функции, источник полей-переменных, доступных в выражении. Вычисления могут базироваться только на полях одной таблицы данных. +- **Вычислительный движок**: доступны варианты `mathjs` и `formulajs`, рекомендуется использовать `formulajs`. +- **Выражение**: эквивалент содержимого функции, при выполнении вычисления возвращает результат на основе конфигурации. + +## Пример + +Рассмотрим пример расчета итоговой цены в процессе заказа товара с учетом различных правил скидок для разных товаров. + +1. Создайте таблицу товаров: + +| Название поля | Тип | +|---------------|------------------------| +| Название товара | Текст | +| Цена товара | Число | +| Правило скидки | belongsTo (Таблица правил скидок) | + +2. Создайте таблицу правил скидок (с использованием шаблона таблицы выражений): + +| Название поля | Тип | +|---------------|-------------------------| +| Название правила | Текст | +| Таблица данных | Выбор (таблица данных) | +| Вычислительный движок | Выбор (mathjs/formulajs) | +| Выражение | Текст | + +3. Создайте правила скидок: + +| ID | Название | Таблица данных | Вычислительный движок | Выражение | +|-----|----------------|----------------|-----------------------|------------------------| +| 1 | Скидка 20% | Товары | formulajs | {{Товары.Цена}} * 0.8 | +| 2 | Скидка 10% | Товары | formulajs | {{Товары.Цена}} * 0.9 | + +4. Создайте товары и свяжите их с правилами скидок: + +| ID | Название товара | Цена | ID правила скидки | +|-----|-----------------|------|-------------------| +| 1 | iPhone 14 Pro | 7999 | 2 | +| 2 | iPhone 13 Pro | 5999 | 1 | + +5. Создайте рабочий процесс, который запускается при создании заказа: + +![Создание рабочего процесса](https://static-docs.nocobase.com/fda005ee028675b7ac5f11784b5fc437.png) + +6. Добавьте узел вычисления, настройте динамическое выражение на основе данных триггера/товары/правило скидки: + +![Настройка узла вычисления](https://static-docs.nocobase.com/67de28dcda9fc0f662933ea0a6d272d6.png) + +Настройте источник переменных данных на товары из данных триггера: + +![Настройка источника данных](https://static-docs.nocobase.com/c58eeb07213d7fe6bb6c19b84b187e23.png) + +7. Добавьте узел обновления данных, настройте обновление общей стоимости заказа на результат вычисления узла: + +![Обновление данных](https://static-docs.nocobase.com/a1200868b89997ed3caa8332b1ebca4f.png) + +8. Создайте заказ, запустите рабочий процесс, затем проверьте список заказов и убедитесь в правильности цен: + +![Проверка цен](https://static-docs.nocobase.com/6e62f43a46f7959d487c4d581a3af3ce.png) + +| Товар заказа | Оригинальная цена | Правило скидки | Итоговая цена | +|---------------|-------------------|----------------|-----------------------| +| iPhone 14 Pro | 7999 | Скидка 10% | 7999 * 0.9 = 7199.1 | +| iPhone 13 Pro | 5999 | Скидка 20% | 5999 * 0.8 = 4799.2 | diff --git a/docs/ru-RU/manual/collection/collection-templates/expression/static/A6xibwy6ZoyskKxGmdQc7jOcnRe.png b/docs/ru-RU/manual/collection/collection-templates/expression/static/A6xibwy6ZoyskKxGmdQc7jOcnRe.png new file mode 100644 index 0000000000..baa8f1c5c9 Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-templates/expression/static/A6xibwy6ZoyskKxGmdQc7jOcnRe.png differ diff --git a/docs/ru-RU/manual/collection/collection-templates/expression/static/OLLTb4M2vocObkxd3bkcxZkLnqh.png b/docs/ru-RU/manual/collection/collection-templates/expression/static/OLLTb4M2vocObkxd3bkcxZkLnqh.png new file mode 100644 index 0000000000..e228d75fc4 Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-templates/expression/static/OLLTb4M2vocObkxd3bkcxZkLnqh.png differ diff --git a/docs/ru-RU/manual/collection/collection-templates/expression/static/OTDBbV7ygocjFLxQyt0czIorn5c.png b/docs/ru-RU/manual/collection/collection-templates/expression/static/OTDBbV7ygocjFLxQyt0czIorn5c.png new file mode 100644 index 0000000000..949f28f924 Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-templates/expression/static/OTDBbV7ygocjFLxQyt0czIorn5c.png differ diff --git a/docs/ru-RU/manual/collection/collection-templates/expression/static/V6sCbY59GoZ6g5xlAaJcutx5nUb.png b/docs/ru-RU/manual/collection/collection-templates/expression/static/V6sCbY59GoZ6g5xlAaJcutx5nUb.png new file mode 100644 index 0000000000..04441cccfc Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-templates/expression/static/V6sCbY59GoZ6g5xlAaJcutx5nUb.png differ diff --git a/docs/ru-RU/manual/collection/collection-templates/expression/static/YLhxb1qGxoniCgxB13IcrDiZntf.png b/docs/ru-RU/manual/collection/collection-templates/expression/static/YLhxb1qGxoniCgxB13IcrDiZntf.png new file mode 100644 index 0000000000..d3d39470cc Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-templates/expression/static/YLhxb1qGxoniCgxB13IcrDiZntf.png differ diff --git a/docs/ru-RU/manual/collection/collection-templates/file/index.md b/docs/ru-RU/manual/collection/collection-templates/file/index.md new file mode 100644 index 0000000000..04e56cd838 --- /dev/null +++ b/docs/ru-RU/manual/collection/collection-templates/file/index.md @@ -0,0 +1,13 @@ +# Файловая таблица + +![](https://static-docs.nocobase.com/6b7dd77d7f3b4a77667d75f5991d5e9f.png) + +Шаблон таблицы данных файловой таблицы предоставляется через подключаемый модуль файлового менеджера + +![](https://static-docs.nocobase.com/c7893abe6b165c7237327618da7f49e5.png) + +- Поддержка пользовательского расширенного типа хранилища файлов + +![](https://static-docs.nocobase.com/f2a5341252a91d2cab8a98b853024966.png) + +![](https://static-docs.nocobase.com/230482a819cb3c05b2302887300582a6.png) diff --git a/docs/ru-RU/manual/collection/collection-templates/file/static/BOlXbQXsOo5ae8xTC6Gc4lAlnRe.png b/docs/ru-RU/manual/collection/collection-templates/file/static/BOlXbQXsOo5ae8xTC6Gc4lAlnRe.png new file mode 100644 index 0000000000..e6ab9bcac0 Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-templates/file/static/BOlXbQXsOo5ae8xTC6Gc4lAlnRe.png differ diff --git a/docs/ru-RU/manual/collection/collection-templates/file/static/JRRtb9rtfoNfWOxkEVQcWF0Nndd.png b/docs/ru-RU/manual/collection/collection-templates/file/static/JRRtb9rtfoNfWOxkEVQcWF0Nndd.png new file mode 100644 index 0000000000..b5a2bdd987 Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-templates/file/static/JRRtb9rtfoNfWOxkEVQcWF0Nndd.png differ diff --git a/docs/ru-RU/manual/collection/collection-templates/file/static/PJhDbmWJgo2kBNxtDqIcMmCjnvh.png b/docs/ru-RU/manual/collection/collection-templates/file/static/PJhDbmWJgo2kBNxtDqIcMmCjnvh.png new file mode 100644 index 0000000000..0fbb3ed575 Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-templates/file/static/PJhDbmWJgo2kBNxtDqIcMmCjnvh.png differ diff --git a/docs/ru-RU/manual/collection/collection-templates/file/static/Z3Jgb8N4QosogDxOvBMc33RPnQb.png b/docs/ru-RU/manual/collection/collection-templates/file/static/Z3Jgb8N4QosogDxOvBMc33RPnQb.png new file mode 100644 index 0000000000..31695a65c1 Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-templates/file/static/Z3Jgb8N4QosogDxOvBMc33RPnQb.png differ diff --git a/docs/ru-RU/manual/collection/collection-templates/general/index.md b/docs/ru-RU/manual/collection/collection-templates/general/index.md new file mode 100644 index 0000000000..28453b0633 --- /dev/null +++ b/docs/ru-RU/manual/collection/collection-templates/general/index.md @@ -0,0 +1,14 @@ +# Обычная таблица + +![](https://static-docs.nocobase.com/5a1663c897d5300a65909a904b073395.png) + +Обычный шаблон таблицы данных, поддерживающий пользовательскую настройку поведения таблицы данных: + +- Автоматическое создание поля идентификатора +- Создатель записей +- Запишите последнее обновление пользователя +- Время создания записи +- Запишите время последнего обновления +- Записи строк можно сортировать + +![](https://static-docs.nocobase.com/43ffcb2de53c610e33f4dd5c440b4324.png) diff --git a/docs/ru-RU/manual/collection/collection-templates/general/static/JM3ab75AroudtGxgvszc7aEznnb.png b/docs/ru-RU/manual/collection/collection-templates/general/static/JM3ab75AroudtGxgvszc7aEznnb.png new file mode 100644 index 0000000000..26e81026ca Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-templates/general/static/JM3ab75AroudtGxgvszc7aEznnb.png differ diff --git a/docs/ru-RU/manual/collection/collection-templates/general/static/NG7NbgZIpolAp8xXy8JcKJDRnGe.png b/docs/ru-RU/manual/collection/collection-templates/general/static/NG7NbgZIpolAp8xXy8JcKJDRnGe.png new file mode 100644 index 0000000000..8b15fc3611 Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-templates/general/static/NG7NbgZIpolAp8xXy8JcKJDRnGe.png differ diff --git a/docs/ru-RU/manual/collection/collection-templates/index.md b/docs/ru-RU/manual/collection/collection-templates/index.md new file mode 100644 index 0000000000..ca9788228a --- /dev/null +++ b/docs/ru-RU/manual/collection/collection-templates/index.md @@ -0,0 +1 @@ +# Шаблон технического паспорта diff --git a/docs/ru-RU/manual/collection/collection-templates/sql/index.md b/docs/ru-RU/manual/collection/collection-templates/sql/index.md new file mode 100644 index 0000000000..5494f85b2a --- /dev/null +++ b/docs/ru-RU/manual/collection/collection-templates/sql/index.md @@ -0,0 +1,47 @@ +# SQL-таблицы + +## Введение + +![SQL-таблицы](https://static-docs.nocobase.com/c6221758f3aea2f45d0df7b815353697.png) + +SQL Collection предоставляет способ получения данных с помощью SQL-запросов. После получения полей данных через SQL-запрос и настройки их метаданных пользователи могут использовать их так же, как обычные таблицы, в таблицах, диаграммах, рабочих процессах и т.д. Это подходит для сценариев связанных запросов, статистики и других. + +## Создание + +![Создание SQL-таблицы](https://static-docs.nocobase.com/64b3a663285be6377141901c2ff3e1f0.png) + +1. Введите SQL-запрос в поле ввода SQL и нажмите «Выполнить» (Execute). Система попытается проанализировать, какие таблицы и поля используются в запросе, и извлечь метаданные полей из исходных таблиц. + +![Анализ SQL-запроса](https://static-docs.nocobase.com/513f2161226dd1e705ab0cf0efb2be90.png) + +2. Если система некорректно определила исходные таблицы и поля, можно вручную выбрать соответствующие таблицы и поля, чтобы использовать их метаданные. Сначала нужно выбрать исходную таблицу, чтобы затем выбрать поля этой таблицы в настройках источников полей. + +![Ручной выбор таблицы и полей](https://static-docs.nocobase.com/966759acf8d6f7380d27feb4edcc15ed.png) + +3. Если поле не имеет соответствующего исходного поля, система определит тип поля на основе типа данных. Если результат определения неверный, можно вручную выбрать тип поля. + +![Выбор типа поля](https://static-docs.nocobase.com/0e752127ab3e46c0742522891310906b.png) + +4. Во время настройки полей в области предварительного просмотра можно увидеть результат отображения. + +![Предварительный просмотр](https://static-docs.nocobase.com/d741d8b43785e003d35fc0b53fc0e649.png) + +5. После завершения настройки и проверки корректности необходимо нажать кнопку «Подтвердить» (Confirm) под полем ввода SQL для окончательной отправки. + +## Редактирование + +1. Если SQL-запрос изменился, можно нажать кнопку «Редактировать» (Edit), чтобы изменить SQL-запрос и перенастроить поля. +2. Для изменения метаданных полей можно использовать функцию «Настроить поля» (Configure fields), как для обычных таблиц, чтобы изменить настройки полей. + +## Синхронизация + +![Синхронизация полей](https://static-docs.nocobase.com/dd5c0ea1b3def4c8bf4d5fcdb81fac3a.png) + +Если SQL-запрос не изменился, но структура таблицы в базе данных изменилась, можно синхронизировать и настроить поля, нажав «Настроить поля» (Configure fields) — «Синхронизировать с базой данных» (Sync from database). + +## Сравнение SQL-таблиц и представлений базы данных + +| Тип шаблона | Применимые сценарии | Принцип реализации | Поддержка операций добавления/удаления/изменения | +|-------------------|------------------------------------------------------------------------------------|--------------------|-----------------------------------------------| +| SQL | Простые модели, легкие сценарии, когда неудобно работать с базой данных, нежелание поддерживать представления, полное управление через UI | SQL-подзапросы | Не поддерживается | +| Представления базы данных | Сложные модели, требующие взаимодействия с базой данных, изменения данных, лучшей и стабильной поддержки базы данных | Представления базы данных | Частичная поддержка | diff --git a/docs/ru-RU/manual/collection/collection-templates/sql/static/FbR1bpv4DoSq0oxKAFxcKo1tnPh.png b/docs/ru-RU/manual/collection/collection-templates/sql/static/FbR1bpv4DoSq0oxKAFxcKo1tnPh.png new file mode 100644 index 0000000000..c646124f54 Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-templates/sql/static/FbR1bpv4DoSq0oxKAFxcKo1tnPh.png differ diff --git a/docs/ru-RU/manual/collection/collection-templates/sql/static/KjtpbmJvOoTW0VxZIXEcIWVVnkd.png b/docs/ru-RU/manual/collection/collection-templates/sql/static/KjtpbmJvOoTW0VxZIXEcIWVVnkd.png new file mode 100644 index 0000000000..c7618a58c0 Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-templates/sql/static/KjtpbmJvOoTW0VxZIXEcIWVVnkd.png differ diff --git a/docs/ru-RU/manual/collection/collection-templates/sql/static/LMe9bH9VTovGZyxFg41cgZwynDd.png b/docs/ru-RU/manual/collection/collection-templates/sql/static/LMe9bH9VTovGZyxFg41cgZwynDd.png new file mode 100644 index 0000000000..180f3b9991 Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-templates/sql/static/LMe9bH9VTovGZyxFg41cgZwynDd.png differ diff --git a/docs/ru-RU/manual/collection/collection-templates/sql/static/OVq4bpTpxob4jSx4BaOcFDIfnLg.png b/docs/ru-RU/manual/collection/collection-templates/sql/static/OVq4bpTpxob4jSx4BaOcFDIfnLg.png new file mode 100644 index 0000000000..2106af8bdd Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-templates/sql/static/OVq4bpTpxob4jSx4BaOcFDIfnLg.png differ diff --git a/docs/ru-RU/manual/collection/collection-templates/sql/static/OtJJbUmi0oz1LNx82PPcQkgWnIc.png b/docs/ru-RU/manual/collection/collection-templates/sql/static/OtJJbUmi0oz1LNx82PPcQkgWnIc.png new file mode 100644 index 0000000000..e1f7fa5824 Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-templates/sql/static/OtJJbUmi0oz1LNx82PPcQkgWnIc.png differ diff --git a/docs/ru-RU/manual/collection/collection-templates/sql/static/OwJ3b5kQPo6ASNx7uKvc8NAGnYc.png b/docs/ru-RU/manual/collection/collection-templates/sql/static/OwJ3b5kQPo6ASNx7uKvc8NAGnYc.png new file mode 100644 index 0000000000..82072da867 Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-templates/sql/static/OwJ3b5kQPo6ASNx7uKvc8NAGnYc.png differ diff --git a/docs/ru-RU/manual/collection/collection-templates/sql/static/WROObVm7Fojhj5xPq52cmINZn7b.png b/docs/ru-RU/manual/collection/collection-templates/sql/static/WROObVm7Fojhj5xPq52cmINZn7b.png new file mode 100644 index 0000000000..f3ce2adb4f Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-templates/sql/static/WROObVm7Fojhj5xPq52cmINZn7b.png differ diff --git a/docs/ru-RU/manual/collection/collection-templates/tree/index.md b/docs/ru-RU/manual/collection/collection-templates/tree/index.md new file mode 100644 index 0000000000..ec2e3fc23f --- /dev/null +++ b/docs/ru-RU/manual/collection/collection-templates/tree/index.md @@ -0,0 +1,52 @@ +# Древовидная коллекция + +![Дерево таблиц](https://static-docs.nocobase.com/48ea3612a65ba18ea6d898b25a78c4f4.png) + +Как и обычные таблицы, поддерживает настройку поведения таблицы данных. + +![Настройка поведения](https://static-docs.nocobase.com/f49bac32396d6fbdbf979de37a2546f7.png) + +Предопределенные поля шаблона дерева таблиц: + +```go +[ + { + interface: 'integer', + name: 'parentId', + type: 'bigInt', + isForeignKey: true, + }, + { + interface: 'm2o', + type: 'belongsTo', + name: 'parent', + foreignKey: 'parentId', + treeParent: true, + onDelete: 'CASCADE', + }, + { + interface: 'o2m', + type: 'hasMany', + name: 'children', + foreignKey: 'parentId', + treeChildren: true, + onDelete: 'CASCADE', + }, +] +``` + +Инициализация полей после создания дерева таблиц: + +![Инициализация полей](https://static-docs.nocobase.com/0b06b5a954c8d40567d3dcafa2baff96.png) + +Шаблон дерева таблиц реализует древовидную структуру через самоассоциативные поля: + +- Поле связи с родительским узлом (Many-to-One): обычно называется «Parent», оно устанавливает связь с другими записями в той же таблице, указывая родительский узел для каждой записи. +- Поле связи с дочерними узлами (One-to-Many): обычно называется «Children», оно указывает, что каждый узел может иметь несколько дочерних узлов. + +## Использование в блоках + +- Таблица в виде дерева: включена по умолчанию (при отключении данные возвращаются в плоском виде). +- Добавление дочерней записи: позволяет добавить дочернюю запись для текущей записи. + +![Использование в блоках](https://static-docs.nocobase.com/97a7ddf0f26c323a2c986d10b43d7174.png) diff --git a/docs/ru-RU/manual/collection/collection-templates/tree/static/MmJhbxcoeo66DqxMDhaclBGPndh.png b/docs/ru-RU/manual/collection/collection-templates/tree/static/MmJhbxcoeo66DqxMDhaclBGPndh.png new file mode 100644 index 0000000000..df21bdeb90 Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-templates/tree/static/MmJhbxcoeo66DqxMDhaclBGPndh.png differ diff --git a/docs/ru-RU/manual/collection/collection-templates/tree/static/MtYebfdtAook0ZxJZkfcrGTAnHh.png b/docs/ru-RU/manual/collection/collection-templates/tree/static/MtYebfdtAook0ZxJZkfcrGTAnHh.png new file mode 100644 index 0000000000..8e806ba124 Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-templates/tree/static/MtYebfdtAook0ZxJZkfcrGTAnHh.png differ diff --git a/docs/ru-RU/manual/collection/collection-templates/tree/static/Q1OgbmzcHowD3fxFylUcGMBbndc.png b/docs/ru-RU/manual/collection/collection-templates/tree/static/Q1OgbmzcHowD3fxFylUcGMBbndc.png new file mode 100644 index 0000000000..61f9e288a8 Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-templates/tree/static/Q1OgbmzcHowD3fxFylUcGMBbndc.png differ diff --git a/docs/ru-RU/manual/collection/collection-templates/tree/static/VDg1bTG3noShtXxtU7QcwGMKnch.png b/docs/ru-RU/manual/collection/collection-templates/tree/static/VDg1bTG3noShtXxtU7QcwGMKnch.png new file mode 100644 index 0000000000..537b9b8484 Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-templates/tree/static/VDg1bTG3noShtXxtU7QcwGMKnch.png differ diff --git a/docs/ru-RU/manual/collection/collection-templates/view/index.md b/docs/ru-RU/manual/collection/collection-templates/view/index.md new file mode 100644 index 0000000000..e347e565e3 --- /dev/null +++ b/docs/ru-RU/manual/collection/collection-templates/view/index.md @@ -0,0 +1,64 @@ +# Представления базы данных + +![Представления базы данных](https://static-docs.nocobase.com/3e33ae5e23399105ab83c7d5ecb32a26.png) + +## Основные понятия + +Представление базы данных — это виртуальная таблица, которая формируется на основе результатов запросов к одной или нескольким таблицам базы данных. Она имеет структуру, схожую с таблицей, но не хранит данные физически. Представления позволяют пользователям получать доступ к данным и управлять ими более простым и абстрактным способом. + +Подключение представлений базы данных к коллекциям (Collection) в NocoBase — это эффективный способ создания таблиц. Создание представлений в базе данных позволяет использовать их в управлении коллекциями, отображая как таблицы данных, что особенно полезно для статистических сценариев. Этот подход повышает удобство поддержки таблиц данных и обеспечивает гибкость в различных сценариях применения. + +Пример сценария статистики для системы управления заказами: + +Таблица заказов связана с таблицей клиентов. Необходимо подсчитать сумму продаж и общее количество продаж для каждого клиента, отображая поля: имя клиента, номер телефона клиента, сумма продаж, общее количество продаж. + +Создание представления в базе данных: + +```go +SELECT t2.customer_name, + t2.mobile_number, + sum(t1.amount) AS sum_amount, + sum(t1.quantity) AS sum_quantity + FROM Orders t1 + JOIN Customers t2 ON t1.f_6ln1f7tqn9b = t2.id + GROUP BY t2.customer_name, t2.mobile_number; +``` + +Представление в базе данных: + +![Представление в базе данных](https://static-docs.nocobase.com/a5eaaadd358f41b33e036198cf0600ce.png) + +## Создание таблицы данных на основе представления + +В NocoBase представление можно отобразить в виде таблицы данных (Collection). + +Выбор целевого представления: + +![Выбор представления](https://static-docs.nocobase.com/cf950e4d2851bdde475838a2f040a79e.png) + +- Поддерживается настройка имен столбцов (полей) представления. +- Исходные поля: мета-поля исходной таблицы. Если поле (например, агрегированное) не имеет источника, можно указать интерфейс поля. +- Поддержка операций добавления, удаления и изменения данных представления (по умолчанию отключена). + +![Настройка полей представления](https://static-docs.nocobase.com/0d99fc9047f25119dbce0c396a866cf7.png) + +Полный процесс настройки показан на изображении: + +![Процесс настройки](https://static-docs.nocobase.com/bd0f54c899b4d8740779dd0cb8f1d65f.gif) + +- Функция «Sync from database» позволяет обновлять конфигурацию таблицы представления (если представление в базе данных изменено, можно повторно синхронизировать данные). +- Удаление: удаление здесь затрагивает только поля таблицы представления, а не поля исходной таблицы. + +![Синхронизация и удаление](https://static-docs.nocobase.com/39e906c75a7f7a3d1c38d8fa0be7d068.png) + +Поддержка операций добавления, удаления и изменения данных таблицы представления (по умолчанию отключена). Если включена, соответствующий блок поддерживает операции добавления, удаления и т.д. + +![Настройка операций](https://static-docs.nocobase.com/064ce37acb2f1f61cfe91a5892b34bdb.png) + +## Использование таблицы представления в интерфейсе + +- Как источник данных для блоков + +Таблицы, созданные на основе представлений, могут быть выбраны в качестве источника данных в любых блоках, так же как и таблицы, созданные любым другим способом. + +![Использование в интерфейсе](https://static-docs.nocobase.com/1208a826507e9dd210ba63f9bfeaa90d.gif) diff --git a/docs/ru-RU/manual/collection/collection-templates/view/static/AEvTbdf38oXhlnxlS6lcPpV0nVe.png b/docs/ru-RU/manual/collection/collection-templates/view/static/AEvTbdf38oXhlnxlS6lcPpV0nVe.png new file mode 100644 index 0000000000..d69740a3ab Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-templates/view/static/AEvTbdf38oXhlnxlS6lcPpV0nVe.png differ diff --git a/docs/ru-RU/manual/collection/collection-templates/view/static/Ey2Ob9o39oP95Yx2bRIcbamznLd.gif b/docs/ru-RU/manual/collection/collection-templates/view/static/Ey2Ob9o39oP95Yx2bRIcbamznLd.gif new file mode 100644 index 0000000000..7410b41f5f Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-templates/view/static/Ey2Ob9o39oP95Yx2bRIcbamznLd.gif differ diff --git a/docs/ru-RU/manual/collection/collection-templates/view/static/PGUxb8ur2oylWdxn9wuc99vVnrc.gif b/docs/ru-RU/manual/collection/collection-templates/view/static/PGUxb8ur2oylWdxn9wuc99vVnrc.gif new file mode 100644 index 0000000000..ad00d575d6 Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-templates/view/static/PGUxb8ur2oylWdxn9wuc99vVnrc.gif differ diff --git a/docs/ru-RU/manual/collection/collection-templates/view/static/PguWbMOdAoA5wYxPWopcFGNMn7b.png b/docs/ru-RU/manual/collection/collection-templates/view/static/PguWbMOdAoA5wYxPWopcFGNMn7b.png new file mode 100644 index 0000000000..ca4c95f4ec Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-templates/view/static/PguWbMOdAoA5wYxPWopcFGNMn7b.png differ diff --git a/docs/ru-RU/manual/collection/collection-templates/view/static/PnZ1bBK5OopbXFxkqBfclaTknih.png b/docs/ru-RU/manual/collection/collection-templates/view/static/PnZ1bBK5OopbXFxkqBfclaTknih.png new file mode 100644 index 0000000000..001395d8fd Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-templates/view/static/PnZ1bBK5OopbXFxkqBfclaTknih.png differ diff --git a/docs/ru-RU/manual/collection/collection-templates/view/static/QVhmbkwRso7zrAxP3e8cjoKbndf.png b/docs/ru-RU/manual/collection/collection-templates/view/static/QVhmbkwRso7zrAxP3e8cjoKbndf.png new file mode 100644 index 0000000000..26520b545b Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-templates/view/static/QVhmbkwRso7zrAxP3e8cjoKbndf.png differ diff --git a/docs/ru-RU/manual/collection/collection-templates/view/static/Rh9Vb4rLXorm57xKGaWcQdR1nkh.png b/docs/ru-RU/manual/collection/collection-templates/view/static/Rh9Vb4rLXorm57xKGaWcQdR1nkh.png new file mode 100644 index 0000000000..8f74b817fc Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-templates/view/static/Rh9Vb4rLXorm57xKGaWcQdR1nkh.png differ diff --git a/docs/ru-RU/manual/collection/collection-templates/view/static/T2qXbDwugovgGJxjmOWcnYQfnYc.png b/docs/ru-RU/manual/collection/collection-templates/view/static/T2qXbDwugovgGJxjmOWcnYQfnYc.png new file mode 100644 index 0000000000..69fd8f6418 Binary files /dev/null and b/docs/ru-RU/manual/collection/collection-templates/view/static/T2qXbDwugovgGJxjmOWcnYQfnYc.png differ diff --git a/docs/ru-RU/manual/collection/fields/advanced.md b/docs/ru-RU/manual/collection/fields/advanced.md new file mode 100644 index 0000000000..37d477f361 --- /dev/null +++ b/docs/ru-RU/manual/collection/fields/advanced.md @@ -0,0 +1,6 @@ +# Расширенный тип + +- Формула +- Последовательность +- JSON +- Коллекция diff --git a/docs/ru-RU/manual/collection/fields/basic.md b/docs/ru-RU/manual/collection/fields/basic.md new file mode 100644 index 0000000000..6de0a43df5 --- /dev/null +++ b/docs/ru-RU/manual/collection/fields/basic.md @@ -0,0 +1,14 @@ +# Базовый тип + +- Однострочный текст +- Имя пользователя +- Длинный текст +- Телефон +- Электронная почта +- URL-адрес +- Целое число +- Количество +- Процент +- Пароль +- Цвет +- Значок diff --git a/docs/ru-RU/manual/collection/fields/choices.md b/docs/ru-RU/manual/collection/fields/choices.md new file mode 100644 index 0000000000..76dfc228d9 --- /dev/null +++ b/docs/ru-RU/manual/collection/fields/choices.md @@ -0,0 +1,8 @@ +# Выбор типа + +- Флажок +- Одиночный выбор +- Множественный выбор +- Группа радиостанций +- Группа флажков + diff --git a/docs/ru-RU/manual/collection/fields/date.md b/docs/ru-RU/manual/collection/fields/date.md new file mode 100644 index 0000000000..0e56ce49f9 --- /dev/null +++ b/docs/ru-RU/manual/collection/fields/date.md @@ -0,0 +1,4 @@ +# Дата и время + +- Дата и время +- Время diff --git a/docs/ru-RU/manual/collection/fields/index.md b/docs/ru-RU/manual/collection/fields/index.md new file mode 100644 index 0000000000..696bd80a0b --- /dev/null +++ b/docs/ru-RU/manual/collection/fields/index.md @@ -0,0 +1 @@ +# Обзор diff --git a/docs/ru-RU/manual/collection/fields/map.md b/docs/ru-RU/manual/collection/fields/map.md new file mode 100644 index 0000000000..095b6644dd --- /dev/null +++ b/docs/ru-RU/manual/collection/fields/map.md @@ -0,0 +1 @@ +# Геометрия на основе карты diff --git a/docs/ru-RU/manual/collection/fields/media.md b/docs/ru-RU/manual/collection/fields/media.md new file mode 100644 index 0000000000..0bd11f5e59 --- /dev/null +++ b/docs/ru-RU/manual/collection/fields/media.md @@ -0,0 +1,5 @@ +# Мультимедиа + +- Markdown +- Форматированный текст +- Вложение diff --git a/docs/ru-RU/manual/collection/fields/relation.md b/docs/ru-RU/manual/collection/fields/relation.md new file mode 100644 index 0000000000..46ea806c1f --- /dev/null +++ b/docs/ru-RU/manual/collection/fields/relation.md @@ -0,0 +1,9 @@ +# Тип отношений + +Используется для установления различных отношений + +- Индивидуальный (принадлежащий) +- Один к одному (есть один) +- Один ко многим +- Много к одному +- Многие ко многим diff --git a/docs/ru-RU/manual/collection/fields/system.md b/docs/ru-RU/manual/collection/fields/system.md new file mode 100644 index 0000000000..85d2b596ca --- /dev/null +++ b/docs/ru-RU/manual/collection/fields/system.md @@ -0,0 +1,8 @@ +# Системная информация + +- Идентификатор +- Идентификатор таблицы (используется в таблице наследования) +- Создан по адресу +- Последнее обновление по адресу +- Создан пользователем +- Последнее обновление пользователем diff --git a/docs/ru-RU/manual/collection/index.md b/docs/ru-RU/manual/collection/index.md new file mode 100644 index 0000000000..696bd80a0b --- /dev/null +++ b/docs/ru-RU/manual/collection/index.md @@ -0,0 +1 @@ +# Обзор diff --git a/docs/ru-RU/manual/collection/inherit.md b/docs/ru-RU/manual/collection/inherit.md new file mode 100644 index 0000000000..cb85900857 --- /dev/null +++ b/docs/ru-RU/manual/collection/inherit.md @@ -0,0 +1,55 @@ +# Наследование таблиц данных + +Наследование таблиц данных — это уникальная функция базы данных PostgreSQL (требуется подключение к PostgreSQL), которая позволяет создавать дочерние таблицы на основе родительской таблицы. Дочерние таблицы наследуют структуру, определения полей и индексы родительской таблицы. Эта функция используется для управления большими объемами данных, реализации партиционирования данных и оптимизации производительности. Каждая дочерняя таблица может хранить данные, соответствующие определенным условиям, например, данные, разделенные по времени, что уменьшает объем сканируемых данных при запросах и повышает производительность. Кроме того, запросы к родительской и дочерним таблицам прозрачны: пользователи могут работать с набором унаследованных таблиц как с одной таблицей, что упрощает операции и запросы, делая работу с большими данными более эффективной. + +## Одиночное наследование + +В режиме одиночного наследования одна таблица может наследовать другую, при этом дочерняя таблица наследует структуру, поля и ограничения родительской таблицы. Этот подход используется для представления иерархии сущностей, позволяя дочерней таблице сохранять общие атрибуты и добавлять специфические. + +В системе заказов, например, таблица «Оптовые заказы» может наследовать родительскую таблицу «Заказы» для обработки оптовых заказов с добавлением специфичных полей, таких как оптовая цена, номер партии и т.д. + +![Пример одиночного наследования](https://docs-cn.nocobase.com/static/WNA9beotVoYfLqxfBsVcchhvn9y.36308e75.gif) + +Иерархия наследования для таблицы товаров может быть организована следующим образом: + +1. Родительская таблица «Товары» (Products): содержит общую информацию о товарах, такую как ID товара, название, цена, складской запас. +2. Дочерняя таблица «Электронные товары» (ElectronicsProduct): наследует таблицу «Товары» и добавляет специфичные поля, такие как размер экрана, операционная система. +3. Дочерняя таблица «Одежда» (ApparelProduct): наследует таблицу «Товары» и содержит атрибуты, специфичные для одежды, такие как размер, цвет, материал. +4. Дочерняя таблица «Пищевые продукты» (FoodProduct): наследует таблицу «Товары» и включает поля, такие как срок годности, тип продукта. +5. Дочерняя таблица «Мебель» (FurnitureProduct): наследует таблицу «Товары» и содержит специфичные атрибуты, такие как габариты, материал. + +## Множественное наследование + +Множественное наследование позволяет одной таблице наследовать структуру, поля и ограничения сразу нескольких родительских таблиц. Этот подход используется для моделирования сущностей с множественными связями. + +Пример моделирования данных для заказов, транспортных накладных и товаров: в системе есть три основные сущности — заказы, транспортные накладные и товары. Один заказ может включать несколько товаров, один заказ может соответствовать нескольким транспортным накладным (например, если товары отправляются в разные места), а одна транспортная накладная может быть связана с несколькими заказами. Эти множественные связи можно реализовать с помощью дочерней таблицы (таблицы-связки), которая наследует несколько родительских таблиц (множественное наследование). + +1. Родительская таблица «Заказы» (Orders): содержит основную информацию о заказах, например, ID заказа. +2. Родительская таблица «Транспортные накладные» (Shipments): содержит номер накладной, информацию о способе транспортировки. +3. Родительская таблица «Товары» (Products): содержит атрибуты товаров, такие как ID товара, название, цена. +4. Дочерняя таблица «Товары заказа» (OrderProduct): наследует таблицы «Заказы» и «Товары». Каждая запись представляет товар в заказе и содержит информацию, например, о количестве. +5. Дочерняя таблица «Связь заказа и накладной» (OrderShipment): наследует таблицы «Заказы» и «Транспортные накладные». Каждая запись представляет связь между заказом и накладной с соответствующей информацией. + +![Пример множественного наследования](https://docs-cn.nocobase.com/static/HjXmbyAndo07izxp9AQcA5YSnyd.ac606504.gif) + +## Переопределение полей + +В отношениях наследования дочерняя таблица может переопределять или изменять поля, унаследованные от родительской таблицы, чтобы адаптировать их под конкретные потребности. + +![Переопределение полей](https://docs-cn.nocobase.com/static/WNA9beotVoYfLqxfBsVcchhvn9y.36308e75.gif) + +### Переопределение полей связей + +Например, если таблица A имеет отношение «многие ко многим» с таблицей B, а таблица A1 наследует A, таблица B1 наследует B, то A1 также связана с B. Однако B содержит данные как самой B, так и всех ее дочерних таблиц, а A1 может быть нужно видеть только данные B1. В этом случае в A1 можно переопределить поле связи, изменив целевую таблицу B на B1. То есть в отношении A1.B можно изменить целевую таблицу B (с выбором из B и ее дочерних таблиц) на B1. + +Пример: в таблице «Оптовые заказы» поле связи с товарами переопределяется (целевая таблица изменяется на «Электронные товары»). + +![Переопределение поля связи](https://docs-cn.nocobase.com/static/HjXmbyAndo07izxp9AQcA5YSnyd.ac606504.gif) + +### Переопределение полей с опциями + +В родительской таблице «Товары» есть поле с опциями «Размер». Для таблицы «Одежда» это поле можно переопределить как размеры одежды (S, M, L), а для таблицы «Электронные товары» — как объем памяти (32GB, 64GB, 128GB). + +## Совместное использование внешних ключей + +Совместное использование внешних ключей — это стратегия, позволяющая нескольким таблицам использовать одно и то же поле внешнего ключа для установления связей между таблицами. Это особенно полезно, когда несколько таблиц должны ссылаться на одну и ту же сущность. В случае наследования таблиц данных такой общий внешний ключ обеспечивает связь каждой дочерней таблицы с другими таблицами, что позволяет строить более сложные модели данных. diff --git a/docs/ru-RU/manual/collection/management.md b/docs/ru-RU/manual/collection/management.md new file mode 100644 index 0000000000..4cdaea3709 --- /dev/null +++ b/docs/ru-RU/manual/collection/management.md @@ -0,0 +1,21 @@ +# Управление таблицами данных + +### Управление таблицами данных + +Добавление, удаление, модификация и сортировка таблиц данных перетаскиванием + +![](https://static-docs.nocobase.com/a8ba0e5c00db508225f3858e5b224f7c.gif) + +### Управление полями таблицы данных + +Добавление, удаление и модификация полей спецификации + +![](https://static-docs.nocobase.com/c692613fdfa4d3dac895257e0dc42d3c.gif) + +### Управление классификацией технических паспортов + +Таблицы данных могут быть организованы в соответствии с различными стандартами, чтобы сделать структуру данных более понятной и упростить управление данными + +Добавление, удаление, модификация и сортировка таблицы данных по классификации + +![](https://static-docs.nocobase.com/665f120f44e1e30b9468db59bf433a59.gif) diff --git a/docs/ru-RU/manual/collection/multiple-databases.md b/docs/ru-RU/manual/collection/multiple-databases.md new file mode 100644 index 0000000000..03b165270d --- /dev/null +++ b/docs/ru-RU/manual/collection/multiple-databases.md @@ -0,0 +1 @@ +# Источник данных с несколькими базами данных diff --git a/docs/ru-RU/manual/collection/static/A8yMbUDaSo9zWpxs2Dncrqwjn9e.png b/docs/ru-RU/manual/collection/static/A8yMbUDaSo9zWpxs2Dncrqwjn9e.png new file mode 100644 index 0000000000..3d9ba1a44f Binary files /dev/null and b/docs/ru-RU/manual/collection/static/A8yMbUDaSo9zWpxs2Dncrqwjn9e.png differ diff --git a/docs/ru-RU/manual/collection/static/BBPvbjjv0or01vx1SzBcXtN9n9f.png b/docs/ru-RU/manual/collection/static/BBPvbjjv0or01vx1SzBcXtN9n9f.png new file mode 100644 index 0000000000..c8a34c5cab Binary files /dev/null and b/docs/ru-RU/manual/collection/static/BBPvbjjv0or01vx1SzBcXtN9n9f.png differ diff --git a/docs/ru-RU/manual/collection/static/Dpmeb5HinokF1Pxfu0BcAmgOnfd.gif b/docs/ru-RU/manual/collection/static/Dpmeb5HinokF1Pxfu0BcAmgOnfd.gif new file mode 100644 index 0000000000..f4eab4cfc7 Binary files /dev/null and b/docs/ru-RU/manual/collection/static/Dpmeb5HinokF1Pxfu0BcAmgOnfd.gif differ diff --git a/docs/ru-RU/manual/collection/static/EUynbO9QPo1iHpxQxwXcYyTLnMf.gif b/docs/ru-RU/manual/collection/static/EUynbO9QPo1iHpxQxwXcYyTLnMf.gif new file mode 100644 index 0000000000..01b2c88079 Binary files /dev/null and b/docs/ru-RU/manual/collection/static/EUynbO9QPo1iHpxQxwXcYyTLnMf.gif differ diff --git a/docs/ru-RU/manual/collection/static/HjXmbyAndo07izxp9AQcA5YSnyd.gif b/docs/ru-RU/manual/collection/static/HjXmbyAndo07izxp9AQcA5YSnyd.gif new file mode 100644 index 0000000000..0f82a879c6 Binary files /dev/null and b/docs/ru-RU/manual/collection/static/HjXmbyAndo07izxp9AQcA5YSnyd.gif differ diff --git a/docs/ru-RU/manual/collection/static/JgMZbj7izo2Ugex8vKmc6fTzntb.gif b/docs/ru-RU/manual/collection/static/JgMZbj7izo2Ugex8vKmc6fTzntb.gif new file mode 100644 index 0000000000..3393f06c36 Binary files /dev/null and b/docs/ru-RU/manual/collection/static/JgMZbj7izo2Ugex8vKmc6fTzntb.gif differ diff --git a/docs/ru-RU/manual/collection/static/L6vtbzAUAoxNn6xNwDkcveQenPg.gif b/docs/ru-RU/manual/collection/static/L6vtbzAUAoxNn6xNwDkcveQenPg.gif new file mode 100644 index 0000000000..6585f48d56 Binary files /dev/null and b/docs/ru-RU/manual/collection/static/L6vtbzAUAoxNn6xNwDkcveQenPg.gif differ diff --git a/docs/ru-RU/manual/collection/static/OYC6b09tEor0E6x5WTXc5FjvnIc.gif b/docs/ru-RU/manual/collection/static/OYC6b09tEor0E6x5WTXc5FjvnIc.gif new file mode 100644 index 0000000000..e4747a90c6 Binary files /dev/null and b/docs/ru-RU/manual/collection/static/OYC6b09tEor0E6x5WTXc5FjvnIc.gif differ diff --git a/docs/ru-RU/manual/collection/static/PM70bxBbDo14KcxYke1cl6GQn9S.gif b/docs/ru-RU/manual/collection/static/PM70bxBbDo14KcxYke1cl6GQn9S.gif new file mode 100644 index 0000000000..34cec4d684 Binary files /dev/null and b/docs/ru-RU/manual/collection/static/PM70bxBbDo14KcxYke1cl6GQn9S.gif differ diff --git a/docs/ru-RU/manual/collection/static/PQKrbFbmUoYcX6xS6d7c8Enun4a.gif b/docs/ru-RU/manual/collection/static/PQKrbFbmUoYcX6xS6d7c8Enun4a.gif new file mode 100644 index 0000000000..6341cafa38 Binary files /dev/null and b/docs/ru-RU/manual/collection/static/PQKrbFbmUoYcX6xS6d7c8Enun4a.gif differ diff --git a/docs/ru-RU/manual/collection/static/R35gbnMFjolgS9xfO9wczmXmnG0.gif b/docs/ru-RU/manual/collection/static/R35gbnMFjolgS9xfO9wczmXmnG0.gif new file mode 100644 index 0000000000..697001106e Binary files /dev/null and b/docs/ru-RU/manual/collection/static/R35gbnMFjolgS9xfO9wczmXmnG0.gif differ diff --git a/docs/ru-RU/manual/collection/static/TkNGb5tLRoY7JVxjlIrc9Ol3njd.png b/docs/ru-RU/manual/collection/static/TkNGb5tLRoY7JVxjlIrc9Ol3njd.png new file mode 100644 index 0000000000..b5d957beca Binary files /dev/null and b/docs/ru-RU/manual/collection/static/TkNGb5tLRoY7JVxjlIrc9Ol3njd.png differ diff --git a/docs/ru-RU/manual/collection/static/UPPCbpZb5oU9Frxyc0JcIzbhn1b.gif b/docs/ru-RU/manual/collection/static/UPPCbpZb5oU9Frxyc0JcIzbhn1b.gif new file mode 100644 index 0000000000..36fa7f9a82 Binary files /dev/null and b/docs/ru-RU/manual/collection/static/UPPCbpZb5oU9Frxyc0JcIzbhn1b.gif differ diff --git a/docs/ru-RU/manual/collection/static/WNA9beotVoYfLqxfBsVcchhvn9y.gif b/docs/ru-RU/manual/collection/static/WNA9beotVoYfLqxfBsVcchhvn9y.gif new file mode 100644 index 0000000000..ad2e4159d2 Binary files /dev/null and b/docs/ru-RU/manual/collection/static/WNA9beotVoYfLqxfBsVcchhvn9y.gif differ diff --git a/docs/ru-RU/manual/collection/static/WPoJbqedXozxb0xAQP3cKghzn8d.gif b/docs/ru-RU/manual/collection/static/WPoJbqedXozxb0xAQP3cKghzn8d.gif new file mode 100644 index 0000000000..15d164275b Binary files /dev/null and b/docs/ru-RU/manual/collection/static/WPoJbqedXozxb0xAQP3cKghzn8d.gif differ diff --git a/docs/ru-RU/manual/collection/static/X8RTbD6FPodn1dxk3OscieZrnie.png b/docs/ru-RU/manual/collection/static/X8RTbD6FPodn1dxk3OscieZrnie.png new file mode 100644 index 0000000000..72c863300d Binary files /dev/null and b/docs/ru-RU/manual/collection/static/X8RTbD6FPodn1dxk3OscieZrnie.png differ diff --git a/docs/ru-RU/manual/core-concepts/a-b-c.md b/docs/ru-RU/manual/core-concepts/a-b-c.md new file mode 100755 index 0000000000..074d2d26c4 --- /dev/null +++ b/docs/ru-RU/manual/core-concepts/a-b-c.md @@ -0,0 +1,21 @@ +# A·B·C + +На уровне безкодовой разработки основные концепции NocoBase можно свести к `A·B·C`. + +`A·B·C` — это сокращение от `Action·Block·Collection`, то есть `Операции·Блоки·Таблицы данных`. Через `Collection` проектируется структура данных, через `Block` организуется и отображается данные, а через `Action` осуществляется взаимодействие с данными. + +## Разделение данных и представлений + +При определении данных сосредоточьтесь на данных; при определении представлений — на представлениях. + +Абстрагируйте бизнес-логику через определение данных, а затем используйте блоки для организации содержимого и отображения данных в желаемом виде. + +## Одни данные, множество представлений + +Создайте единую модель данных для бизнеса, а затем через блоки настройте различные способы представления этих данных для разных сценариев, ролей или комбинаций. + +## Управление через операции + +Таблицы данных определяют структуру данных, блоки — способ их представления. Но что управляет взаимодействием и изменением данных? Ответ — операции. + +Блоки отображают данные для пользователя, а операции отправляют команды пользователя на сервер для выполнения взаимодействия или изменения данных. diff --git a/docs/ru-RU/manual/core-concepts/actions.md b/docs/ru-RU/manual/core-concepts/actions.md new file mode 100755 index 0000000000..131a83ecdc --- /dev/null +++ b/docs/ru-RU/manual/core-concepts/actions.md @@ -0,0 +1,31 @@ +# Операции + +`Операции` — это набор действий для достижения определенной цели. В NocoBase операции используются для обработки данных или взаимодействия с сервером. Обычно операции запускаются нажатием на кнопку. + +## Типы операций + +На данный момент NocoBase поддерживает более 10 типов операций, а в будущем можно будет добавить новые через плагины. + +| Название | Описание | +|------------------|--------------------------------------------------------------------------| +| Фильтрация | Указывает диапазон отображаемых данных | +| Добавить | Открывает всплывающее окно для добавления новых данных, обычно содержит блок формы | +| Просмотреть | Открывает всплывающее окно для просмотра данных, обычно содержит блок деталей | +| Редактировать | Открывает всплывающее окно для изменения данных, обычно содержит блок формы | +| Удалить | Открывает диалоговое окно для удаления данных, удаление происходит после подтверждения | +| Экспорт | Экспортирует данные в Excel, часто используется вместе с фильтрацией | +| Печать | Открывает окно печати браузера для печати указанных данных, часто используется с блоком деталей | +| Отправить | Отправляет данные указанного блока формы на сервер | +| Обновить | Обновляет данные в текущем блоке | +| Импорт | Импортирует данные из шаблона Excel | +| Массовое редактирование | Массовое редактирование данных | +| Массовое обновление | Массовое обновление данных | +| Открыть всплывающее окно | Открывает всплывающее окно или выдвижную панель, в которой можно разместить блоки | +| Обновить данные | Автоматически обновляет указанные поля при нажатии | +| Пользовательский запрос | Отправляет запрос к стороннему сервису | + +## Настройка операций + +В режиме конфигурации интерфейса наведите курсор на кнопку операции, и в правом верхнем углу появятся доступные параметры настройки для этой операции. Например, для операции фильтрации: + +![action-config-5.jpg](https://static-docs.nocobase.com/9562124b304e77e0fc576476781df2bd.jpg) diff --git a/docs/ru-RU/manual/core-concepts/actions/action-config-5.jpg b/docs/ru-RU/manual/core-concepts/actions/action-config-5.jpg new file mode 100755 index 0000000000..b9429826f6 Binary files /dev/null and b/docs/ru-RU/manual/core-concepts/actions/action-config-5.jpg differ diff --git a/docs/ru-RU/manual/core-concepts/blocks.md b/docs/ru-RU/manual/core-concepts/blocks.md new file mode 100755 index 0000000000..46dc69b27c --- /dev/null +++ b/docs/ru-RU/manual/core-concepts/blocks.md @@ -0,0 +1,87 @@ +# Блоки + +Блоки — это представления для отображения и управления данными. В NocoBase страницы, всплывающие окна и выдвижные панели рассматриваются как контейнеры для блоков. Контейнеры подобны холсту, на котором можно размещать различные блоки. + +Благодаря разделению данных и представлений в NocoBase, страницы используют блоки для работы с данными, а различные типы блоков позволяют организовывать и управлять данными в разных формах. + +## Структура блока + +Полноценный блок состоит из трех частей: + +1. **Область содержимого**: основная часть блока. +2. **Область операций**: место для размещения кнопок операций, используемых для управления данными блока. +3. **Область конфигурации**: кнопки для настройки параметров блока. + +![6.block.jpg](https://static-docs.nocobase.com/07ea73c9abcc16846dd5cd0c960d7cb0.jpg) + +## Типы блоков + +![add-block.jpg](https://static-docs.nocobase.com/c105b36b1f61420f2082d8bc5153f3f0.jpg) + +NocoBase в настоящее время поддерживает более 10 типов блоков, а в будущем можно будет добавить новые через плагины. + +- **Блоки данных**: предназначены для организации данных. + - **Таблица**: отображает множество записей в виде таблицы, может показывать как одну таблицу данных, так и несколько связанных таблиц. + - **Форма**: блок с различными полями ввода для создания или редактирования данных, поддерживает как одну таблицу, так и несколько связанных таблиц. + - **Детали**: отображает данные одной конкретной записи, может показывать данные как из одной таблицы, так и из нескольких связанных таблиц. + - **Календарь**: отображает множество записей в формате календаря, подходит для данных с важными временными характеристиками. + - **Канбан**: отображает множество записей в формате канбан-доски, подходит для управления производственными процессами. +- **Блоки диаграмм**: предназначены для графического отображения статистических данных. Поддерживаются: столбчатые диаграммы, линейные диаграммы, круговые диаграммы, графики площади и др. +- **Другие блоки**: предназначены для отображения специальных данных. + - **Markdown**: текстовое содержимое, написанное в формате Markdown. + - **Журнал операций**: отображает записи изменений данных в таблице, включая создание, редактирование и удаление. + +## Добавление блока + +Войдите в режим конфигурации интерфейса и нажмите кнопку «Добавить блок» (Add block) на странице или во всплывающем окне. Процесс добавления состоит из 4 шагов: + +1. Выберите тип блока: доступные типы включают таблицу, форму, детали, календарь, канбан, Markdown. +2. Выберите коллекцию (Collection): отображается список всех доступных коллекций. +3. Выберите способ создания: создать пустой блок или использовать шаблон. +4. Выберите шаблон: если на шаге 3 выбран шаблон, на шаге 4 выбирается конкретный шаблон. + +![6.block-add.jpg](https://static-docs.nocobase.com/4a4dad014fddada53f2d49f5dba681fb.jpg) + +## Настройка блока + +Настройка блока включает три аспекта: + +- Настройка содержимого блока. +- Настройка операций блока. +- Настройка свойств блока. + +### Настройка содержимого блока + +Для примера возьмем блок таблицы: содержимое блока — это столбцы, отображаемые в таблице. Нажмите «Настроить столбцы» (Configure columns), чтобы выбрать отображаемые столбцы: + +![6.block-content.gif](https://static-docs.nocobase.com/4644fe7e4f6a93e58d63219a1ef19633.gif) + +### Настройка операций блока + +Для блока таблицы доступны операции, такие как фильтрация, добавление, удаление, просмотр, редактирование и пользовательские действия. Нажмите кнопку «Настроить действия» (Configure actions), чтобы настроить операции. Каждую кнопку действия можно настроить отдельно: + +![6.block-content.gif](https://static-docs.nocobase.com/4644fe7e4f6a93e58d63219a1ef19633.gif) + +### Настройка свойств блока + +Наведите курсор на правый верхний угол блока, чтобы увидеть кнопки конфигурации. Для блока таблицы доступны следующие свойства: + +- Заголовок блока (Block title) +- Сортировка перетаскиванием (Drag & drop sorting) +- Установка области данных (Set the data scope) +- Установка правил сортировки по умолчанию (Set default sorting rules) +- Количество записей на странице (Records per page) + +## Настройка макета + +На странице можно разместить как один блок, так и несколько блоков в комбинации. Вы можете перетаскивать блоки, чтобы настроить их положение и ширину. + +![block-drag.gif](https://static-docs.nocobase.com/afa28c9ec8958c0581ec70f6d40891b6.gif) + +## Шаблоны блоков + +Вы можете сохранить блок как шаблон, чтобы в дальнейшем использовать его для быстрого создания новых блоков. + +Например, форма для таблицы данных, используемая как для добавления, так и для редактирования данных, может быть сохранена как шаблон и применена в интерфейсах для добавления и редактирования. + +![block-template.jpg](https://static-docs.nocobase.com/d024cfc5dfd96bfc3ed48cd5c9963cde.jpg) diff --git a/docs/ru-RU/manual/core-concepts/blocks/6.block-add.jpg b/docs/ru-RU/manual/core-concepts/blocks/6.block-add.jpg new file mode 100755 index 0000000000..cd609413f9 Binary files /dev/null and b/docs/ru-RU/manual/core-concepts/blocks/6.block-add.jpg differ diff --git a/docs/ru-RU/manual/core-concepts/blocks/6.block-content.gif b/docs/ru-RU/manual/core-concepts/blocks/6.block-content.gif new file mode 100755 index 0000000000..8f79be9fa8 Binary files /dev/null and b/docs/ru-RU/manual/core-concepts/blocks/6.block-content.gif differ diff --git a/docs/ru-RU/manual/core-concepts/blocks/6.block-content1.gif b/docs/ru-RU/manual/core-concepts/blocks/6.block-content1.gif new file mode 100755 index 0000000000..8f79be9fa8 Binary files /dev/null and b/docs/ru-RU/manual/core-concepts/blocks/6.block-content1.gif differ diff --git a/docs/ru-RU/manual/core-concepts/blocks/6.block.jpg b/docs/ru-RU/manual/core-concepts/blocks/6.block.jpg new file mode 100755 index 0000000000..b609af5a0a Binary files /dev/null and b/docs/ru-RU/manual/core-concepts/blocks/6.block.jpg differ diff --git a/docs/ru-RU/manual/core-concepts/blocks/6.collection-setting.gif b/docs/ru-RU/manual/core-concepts/blocks/6.collection-setting.gif new file mode 100755 index 0000000000..d969e34e89 Binary files /dev/null and b/docs/ru-RU/manual/core-concepts/blocks/6.collection-setting.gif differ diff --git a/docs/ru-RU/manual/core-concepts/blocks/add-block.jpg b/docs/ru-RU/manual/core-concepts/blocks/add-block.jpg new file mode 100755 index 0000000000..2b463f2cf2 Binary files /dev/null and b/docs/ru-RU/manual/core-concepts/blocks/add-block.jpg differ diff --git a/docs/ru-RU/manual/core-concepts/blocks/block-drag.gif b/docs/ru-RU/manual/core-concepts/blocks/block-drag.gif new file mode 100755 index 0000000000..69563d0dcb Binary files /dev/null and b/docs/ru-RU/manual/core-concepts/blocks/block-drag.gif differ diff --git a/docs/ru-RU/manual/core-concepts/blocks/block-template.jpg b/docs/ru-RU/manual/core-concepts/blocks/block-template.jpg new file mode 100755 index 0000000000..86da281e0e Binary files /dev/null and b/docs/ru-RU/manual/core-concepts/blocks/block-template.jpg differ diff --git a/docs/ru-RU/manual/core-concepts/collections.md b/docs/ru-RU/manual/core-concepts/collections.md new file mode 100755 index 0000000000..0a9ac8f4fb --- /dev/null +++ b/docs/ru-RU/manual/core-concepts/collections.md @@ -0,0 +1,59 @@ +# Таблицы данных + +Перед разработкой системы обычно проводится абстрагирование бизнес-логики и создание модели данных. Таблицы данных в NocoBase состоят из полей (столбцов) и записей (строк). Концепция таблиц данных близка к таблицам реляционных баз данных, но понятие полей немного отличается. + +Например, в таблице данных, описывающей заказы, каждый столбец содержит информацию о конкретном атрибуте заказа, таком как адрес доставки, а каждая строка содержит все данные о конкретном заказе, такие как номер заказа, имя клиента, телефон, адрес доставки и т.д. + +## Разделение данных и представлений + +В NocoBase `данные` и `представления` разделены и управляются отдельно с помощью таблиц данных и блоков соответственно. + +Это означает, что: + +- Вы можете создать **одну** таблицу данных и разработать для нее **один** интерфейс для отображения и работы с данными. +- Вы можете создать **одну** таблицу данных и разработать для нее **несколько** интерфейсов для разных сценариев или ролей. +- Вы можете создать **несколько** таблиц данных и разработать для них **один** интерфейс, чтобы одновременно отображать и работать с данными из разных таблиц. +- Вы даже можете создать **несколько** таблиц данных и разработать для них **несколько** интерфейсов, каждый из которых будет работать с несколькими таблицами и выполнять уникальные функции. + +Проще говоря, разделение данных и интерфейса делает **организацию и управление данными более гибкими**, а способ представления данных зависит от того, как вы настроите интерфейс. + +## Типы полей + +NocoBase в настоящее время поддерживает десятки типов полей, перечисленных ниже, а в будущем можно будет добавить новые через плагины. + +| Название | Тип | +|--------------------------|---------------| +| Однострочный текст | Базовый тип | +| Иконка | Базовый тип | +| Многострочный текст | Базовый тип | +| Пароль | Базовый тип | +| Номер телефона | Базовый тип | +| Число | Базовый тип | +| Целое число | Базовый тип | +| Электронная почта | Базовый тип | +| Процент | Базовый тип | +| Выпадающее меню (один выбор) | Выбор | +| Выпадающее меню (множественный выбор) | Выбор | +| Административные районы Китая | Выбор | +| Флажок | Выбор | +| Радиокнопка | Выбор | +| Чекбокс | Выбор | +| Связь | Тип связи | +| Один к одному (belongs to) | Тип связи | +| Один к одному (has one) | Тип связи | +| Один ко многим | Тип связи | +| Много к одному | Тип связи | +| Много ко многим | Тип связи | +| Формула | Расширенный тип | +| Автокодирование | Расширенный тип | +| JSON | Расширенный тип | +| Markdown | Мультимедиа | +| Форматированный текст | Мультимедиа | +| Вложение | Мультимедиа | +| Дата | Дата и время | +| Время | Дата и время | +| ID | Системная информация | +| Создатель | Системная информация | +| Дата создания | Системная информация | +| Последний редактор | Системная информация | +| Дата последнего изменения | Системная информация | diff --git a/docs/ru-RU/manual/core-concepts/containers.md b/docs/ru-RU/manual/core-concepts/containers.md new file mode 100755 index 0000000000..eb39f5f2b3 --- /dev/null +++ b/docs/ru-RU/manual/core-concepts/containers.md @@ -0,0 +1,22 @@ +# Контейнер + +В NocoBase страницы, всплывающие окна и выдвижные ящики рассматриваются как контейнеры для блоков. Контейнер похож на холст, на котором могут быть размещены различные блоки. + +## Страница +![container-page.jpg](https://static-docs.nocobase.com/0ce51dbad3cd83a23b0d161e6d020bc0.jpg) + +## Всплывающее окно + +![container-dialog.jpg](https://static-docs.nocobase.com/d7fc5dde40f18e533c6e7fe897e23c0c.jpg) + +## Ящик + +![container-drawer.jpg](https://static-docs.nocobase.com/34bc8abcace4343595545ff02629c02a.jpg) + +## Поддержка вкладок в контейнере + +Во всплывающие окна, ящики и страницы вы можете добавить несколько вкладок.Добавьте разные блоки на каждую вкладку, чтобы отображать разное содержимое и действия.Например, во всплывающем окне информации о клиенте добавьте 3 вкладки для отображения личной информации клиента, истории заказов и оценки клиентов.: + +![7.tabs.gif](https://static-docs.nocobase.com/af3574040a0435a1beb47bc8a46f1fde.gif) + +![container-tab-2.jpg](https://static-docs.nocobase.com/5f6e8ea9222ed084e0703e87a42cc696.jpg) diff --git a/docs/ru-RU/manual/core-concepts/containers/7.tabs.gif b/docs/ru-RU/manual/core-concepts/containers/7.tabs.gif new file mode 100755 index 0000000000..df7c895aa7 Binary files /dev/null and b/docs/ru-RU/manual/core-concepts/containers/7.tabs.gif differ diff --git a/docs/ru-RU/manual/core-concepts/containers/container-dialog.jpg b/docs/ru-RU/manual/core-concepts/containers/container-dialog.jpg new file mode 100755 index 0000000000..b5984954d1 Binary files /dev/null and b/docs/ru-RU/manual/core-concepts/containers/container-dialog.jpg differ diff --git a/docs/ru-RU/manual/core-concepts/containers/container-drawer.jpg b/docs/ru-RU/manual/core-concepts/containers/container-drawer.jpg new file mode 100755 index 0000000000..b550ea29ec Binary files /dev/null and b/docs/ru-RU/manual/core-concepts/containers/container-drawer.jpg differ diff --git a/docs/ru-RU/manual/core-concepts/containers/container-page.jpg b/docs/ru-RU/manual/core-concepts/containers/container-page.jpg new file mode 100755 index 0000000000..c765777ead Binary files /dev/null and b/docs/ru-RU/manual/core-concepts/containers/container-page.jpg differ diff --git a/docs/ru-RU/manual/core-concepts/containers/container-tab-2.jpg b/docs/ru-RU/manual/core-concepts/containers/container-tab-2.jpg new file mode 100755 index 0000000000..07b1a982b8 Binary files /dev/null and b/docs/ru-RU/manual/core-concepts/containers/container-tab-2.jpg differ diff --git a/docs/ru-RU/manual/core-concepts/menus.md b/docs/ru-RU/manual/core-concepts/menus.md new file mode 100755 index 0000000000..c551770fed --- /dev/null +++ b/docs/ru-RU/manual/core-concepts/menus.md @@ -0,0 +1,43 @@ +# Меню + +В настоящее время NocoBase поддерживает три типа пунктов меню: + +- Страница: переход на страницу, связанную с NocoBase; +- Группа: группировка меню для объединения однотипных пунктов в одном месте; +- Ссылка: переход по указанному URL. + +Например, для системы складского учета, если в вашем бизнесе есть управление складскими местами, включающее журнал операций прихода/расхода, запросы остатков и переход в ERP для подачи заявки на складское место, меню можно настроить следующим образом: + +``` +- Управление складскими местами (группа) + - Запрос остатков (страница) + - Журнал операций прихода/расхода (страница) + - Переход в ERP для подачи заявки на складское место (ссылка) +``` + +## Расположение по умолчанию + +В встроенных шаблонах страниц NocoBase меню отображается вверху и слева. + +![menu-position.jpg](https://static-docs.nocobase.com/d4d0a34c74684c988e369abf5a227186.jpg) + +## Добавление + +![5.menu-add.jpg](https://static-docs.nocobase.com/c11557b3bed06be90b98e395c94f7fc7.jpg) + +Нажмите «Добавить пункт меню» (Add menu item) и выберите тип пункта. Поддерживаются подменю неограниченной вложенности. + +## Настройка и сортировка + +Наведите курсор на пункт меню, в правом верхнем углу появятся кнопки для сортировки и настройки. Удерживая кнопку сортировки, можно перетаскивать пункты для изменения порядка. + +Доступные операции для настройки пунктов меню: + +- Редактировать (Edit) +- Переместить в (Move to) +- Вставить до (Insert before) +- Вставить после (Insert after) +- Вставить внутрь (Insert Inner) +- Удалить (Delete) + +![menu-move.gif](https://static-docs.nocobase.com/ffd21aebbbd1b10a5138ada9727d33a8.gif) diff --git a/docs/ru-RU/manual/core-concepts/menus/5.menu-add.jpg b/docs/ru-RU/manual/core-concepts/menus/5.menu-add.jpg new file mode 100755 index 0000000000..da89a6f932 Binary files /dev/null and b/docs/ru-RU/manual/core-concepts/menus/5.menu-add.jpg differ diff --git a/docs/ru-RU/manual/core-concepts/menus/menu-move.gif b/docs/ru-RU/manual/core-concepts/menus/menu-move.gif new file mode 100755 index 0000000000..1e278d8685 Binary files /dev/null and b/docs/ru-RU/manual/core-concepts/menus/menu-move.gif differ diff --git a/docs/ru-RU/manual/core-concepts/menus/menu-position.jpg b/docs/ru-RU/manual/core-concepts/menus/menu-position.jpg new file mode 100755 index 0000000000..8e21a0a187 Binary files /dev/null and b/docs/ru-RU/manual/core-concepts/menus/menu-position.jpg differ diff --git a/docs/ru-RU/manual/data-visualization/chart-block.md b/docs/ru-RU/manual/data-visualization/chart-block.md new file mode 100644 index 0000000000..770d07eb1d --- /dev/null +++ b/docs/ru-RU/manual/data-visualization/chart-block.md @@ -0,0 +1,22 @@ +# Блок диаграмм + +Блок диаграмм — это панель для организации нескольких диаграмм. + +## Добавление + +Нажмите «Добавить блок» (Add block) — «Диаграммы» (Charts), чтобы создать пустой блок диаграмм. + +![Добавление блока диаграмм](https://static-docs.nocobase.com/790faf0a126e4ffcc3ff976818325cfd.png) + +В блоке диаграмм нажмите «Добавить блок» (Add block) — «Диаграмма» (Chart), выберите соответствующую таблицу данных (Collection), чтобы создать и настроить диаграмму. Таблицы данных, для которых есть права просмотра, могут быть использованы для настройки диаграмм, иначе они будут скрыты в списке опций. + +![Создание диаграммы](https://static-docs.nocobase.com/93ed2fada2478fba1b243d8705717a34.png) + +## Настройка + +- Диаграммы в блоке диаграмм можно свободно перетаскивать и организовывать, как обычные блоки. +- Нажмите кнопку «Настроить» (Configure), чтобы изменить текущую диаграмму. +- Нажмите кнопку «Копировать» (Duplicate), чтобы быстро создать копию текущей диаграммы. +- Можно «Редактировать заголовок блока» (Edit block title), чтобы добавить заголовок или описание для текущей диаграммы. + +![Настройка диаграммы](https://static-docs.nocobase.com/76787ede47aa514636dcb100f599740e.png) diff --git a/docs/ru-RU/manual/data-visualization/configure.md b/docs/ru-RU/manual/data-visualization/configure.md new file mode 100644 index 0000000000..2c5b2e1cdf --- /dev/null +++ b/docs/ru-RU/manual/data-visualization/configure.md @@ -0,0 +1,63 @@ +# Панель конфигурации + +Панель конфигурации диаграмм делится на три части: конфигурация данных, конфигурация диаграммы и предварительный просмотр диаграммы. + +![Панель конфигурации](https://static-docs.nocobase.com/b397cf9ab751b1652ab7d2de81ec0f11.png) + +## Конфигурация данных + +![Конфигурация данных](https://static-docs.nocobase.com/801c019fc92c2fe756d622585b214d6e.png) + +- Выпадающее меню вверху показывает текущую таблицу данных (Collection), которую можно переключить через меню. +- После настройки нажмите «Выполнить запрос» (Run query), чтобы получить данные по заданной конфигурации. Панель «Данные» (Data) отобразит результаты. + +### Метрики (Measures) + +![Метрики](https://static-docs.nocobase.com/35caab4b0dea7c2378e2fe226439aa51.png) + +Поля метрик — это основные данные, которые отображаются на диаграмме. Метрики можно агрегировать с помощью функций, таких как `Сумма (Sum)`, `Количество (Count)`, `Среднее (Avg)`, `Максимум (Max)`, `Минимум (Min)`. Можно задать несколько полей метрик и установить для них псевдонимы. + +### Измерения (Dimensions) + +![Измерения](https://static-docs.nocobase.com/7d0568757e6d999d67c316c2ff28d8e7.png) + +Поля измерений обычно используются для группировки данных диаграммы. Для полей типа даты поддерживаются форматы, показанные на изображении, форматирование выполняется с помощью функций базы данных (например, `date_format` в MySQL). Форматирование других типов данных описано в разделе [Преобразование данных](#преобразование-данных). + +:::info +**Форматирование измерений (Dimensions Format) VS Преобразование данных (Transform)** + +- Форматирование измерений происходит до получения финальных данных, группировка выполняется по отформатированным значениям, что часто требуется при фильтрации по временным периодам. +- Преобразование данных выполняется для дальнейшей обработки ответа, например, для улучшения читаемости. Преобразование происходит на стороне фронтенда. +::: + +### Фильтрация (Filter) + +![Фильтрация](https://static-docs.nocobase.com/42e35ace7a63776f6ba82325975128b5.png) + +Конфигурация фильтров позволяет фильтровать данные перед группировкой. Доступны переменные «Текущий пользователь» и «Текущая дата» для создания динамических фильтров. + +### Сортировка (Sort) и Ограничение (Limit) + +![Сортировка и ограничение](https://static-docs.nocobase.com/a49a841116b5c9a42fb79d3431257651.png) + +По умолчанию максимальное количество записей в наборе данных ограничено 2000. + +### Кэширование + +![Кэширование](https://static-docs.nocobase.com/3d1e3f3282384d50bd7be3a580a07c4f.png) + +При включении кэширования диаграмма будет отображать кэшированные данные. + +## Конфигурация диаграммы + +![Конфигурация диаграммы](https://static-docs.nocobase.com/4b9b518258613b5a8c8d3e3cd7f6f9a8.png) + +- Тип диаграммы (Chart Type) — тип диаграммы для отображения. NocoBase использует [G2Plot](https://g2plot.antv.antgroup.com/) как библиотеку диаграмм по умолчанию. Для расширения другими библиотеками см. [Руководство разработчика](../dev/index.md). +- Базовая конфигурация — после выбора типа диаграммы появляются соответствующие настройки визуализации. Поля обычно выбираются из выпадающего меню, включающего базовые поля коллекции и их псевдонимы. +- JSON-конфигурация — если базовых настроек недостаточно, можно использовать JSON для настройки дополнительных свойств диаграммы. См. [документацию G2Plot](https://g2plot.antv.antgroup.com/api/plot-api). + +## Преобразование данных + +![Преобразование данных](https://static-docs.nocobase.com/86511c44dd3825bdcc3954d4132cd7a0.png) + +Преобразование данных позволяет дополнительно обрабатывать данные ответа от интерфейса. Поддерживаются типы данных: `number`, `date`, `time`, `datetime`. Для полей, не относящихся к этим типам, можно вручную выбрать один из них для применения соответствующих методов преобразования. diff --git a/docs/ru-RU/manual/data-visualization/filter.md b/docs/ru-RU/manual/data-visualization/filter.md new file mode 100644 index 0000000000..c95db3a8fb --- /dev/null +++ b/docs/ru-RU/manual/data-visualization/filter.md @@ -0,0 +1,60 @@ +# Блок фильтров + +Блок фильтров в блоке диаграмм используется для динамической фильтрации нескольких диаграмм в текущем блоке диаграмм. + +## Включение/отключение + +Чтобы включить или отключить блок фильтров, в блоке диаграмм нажмите «Добавить блок» (Add block) — «Фильтр» (Filter). + +![Включение блока фильтров](https://static-docs.nocobase.com/d0e6b116952fa6b719acb0f858b432c3.png) + +## Настройка полей фильтрации + +### Поля таблицы данных + +Для таблиц данных, используемых в диаграммах текущего блока, можно выбрать соответствующие поля таблицы, чтобы создать поле формы фильтра. + +![Выбор полей таблицы](https://static-docs.nocobase.com/e2ef150e9beb8c78004d9049a7536219.png) + +Можно настроить поля формы: + +![Настройка полей формы](https://static-docs.nocobase.com/215f0b996e69bf2d5b99746e6d521c3d.png) + +- Настройка заголовка отображаемого поля +- Настройка описания поля +- Настройка оператора, применяемого при фильтрации + ![Операторы фильтрации](https://static-docs.nocobase.com/d6a593a330d27da4ea78124dfdb8450d.png) + +- Настройка значения по умолчанию для поля, с возможностью использования переменных. Тип данных переменной должен соответствовать типу данных текущего поля. + ![Значения по умолчанию](https://static-docs.nocobase.com/37dee4008f3283db24d491fb8f0404fa.png) + + Например: + + - Установить значение по умолчанию как ID текущего пользователя, чтобы после загрузки страницы автоматически отфильтровать данные текущего пользователя. + - Установить значение по умолчанию как текущую дату, чтобы после загрузки страницы автоматически отфильтровать данные по текущей дате. + +### Пользовательские поля + +В некоторых случаях может потребоваться использовать одно поле фильтра для фильтрации разных полей из разных таблиц. Например, использовать одно поле даты для фильтрации разных полей даты в разных таблицах. В таких случаях можно создать пользовательское поле. + +![Создание пользовательского поля](https://static-docs.nocobase.com/87544594246453d175ef265030c0801a.png) + +При добавлении пользовательского поля необходимо задать заголовок поля, выбрать компонент поля и выполнить соответствующую настройку. Также можно выбрать поле из таблиц данных, используемых в текущем блоке, чтобы применить его метаданные и избежать повторной настройки. + +![Настройка пользовательского поля](https://static-docs.nocobase.com/ef09136d674d4b7356e819350bcac804.png) + +Чтобы использовать пользовательское поле фильтра, откройте настройки соответствующей диаграммы, затем в конфигурации фильтрации данных добавьте условие фильтра и используйте переменную из «Текущего фильтра» (Current filter). Тип фильтруемого поля должен соответствовать типу пользовательского поля формы фильтра. + +![Использование текущего фильтра](https://static-docs.nocobase.com/f9f2487c4da4b2024af1556743beab6c.png) + +Для пользовательских полей также можно настроить заголовок, описание и значение по умолчанию. + +![Настройка пользовательских полей](https://static-docs.nocobase.com/4a8feb12404f5cc5e74d589263307e5a.png) + +## Настройка действий блока + +- Фильтровать (Filter) — применить условия фильтрации +- Сбросить (Reset) — сбросить форму фильтра +- Свернуть/развернуть (Collapse / Expand) — свернуть в одну строку или развернуть на несколько строк + +![Действия блока](https://static-docs.nocobase.com/8619ac90fa045b3a9c6d6610f7be1a81.png) diff --git a/docs/ru-RU/manual/data-visualization/index.md b/docs/ru-RU/manual/data-visualization/index.md new file mode 100644 index 0000000000..41efbf5b32 --- /dev/null +++ b/docs/ru-RU/manual/data-visualization/index.md @@ -0,0 +1,23 @@ +# Визуализация данных + +## Введение + +Плагин визуализации данных NocoBase предоставляет функции визуального поиска данных и богатый набор компонентов для построения диаграмм. На основе данных системных коллекций пользователи могут быстро создавать визуальные панели, гибко организовывать диаграммы и проводить анализ бизнес-данных. + +![Визуализация данных](https://static-docs.nocobase.com/51be43d5400d6294f6c20d11009f23c4.png) + +## Установка + +## Дорожная карта (RoadMap) + +- Запланировано или в процессе: + - Детализация данных для отдельных диаграмм с возможностью взаимодействия с таблицами + - Улучшенная интеграция с SQL Collection + - Настройка интерактивности диаграмм, например, переход по ссылкам +- Добавление диаграмм в другие блоки +- Более удобная обработка и преобразование данных +- Поддержка Having +- Добавление других блоков в блок диаграмм, например, Markdown +- Комбинирование нескольких запросов (Query) в одной диаграмме +- Оптимизация контроля прав доступа +- ... diff --git a/docs/ru-RU/manual/data-visualization/static/2023-11-28-14-06-23.png b/docs/ru-RU/manual/data-visualization/static/2023-11-28-14-06-23.png new file mode 100644 index 0000000000..defc3e8a58 Binary files /dev/null and b/docs/ru-RU/manual/data-visualization/static/2023-11-28-14-06-23.png differ diff --git a/docs/ru-RU/manual/data-visualization/static/2023-11-28-15-16-21.png b/docs/ru-RU/manual/data-visualization/static/2023-11-28-15-16-21.png new file mode 100644 index 0000000000..7127e73a70 Binary files /dev/null and b/docs/ru-RU/manual/data-visualization/static/2023-11-28-15-16-21.png differ diff --git a/docs/ru-RU/manual/data-visualization/static/2023-11-28-15-17-23.png b/docs/ru-RU/manual/data-visualization/static/2023-11-28-15-17-23.png new file mode 100644 index 0000000000..8a23b77ba0 Binary files /dev/null and b/docs/ru-RU/manual/data-visualization/static/2023-11-28-15-17-23.png differ diff --git a/docs/ru-RU/manual/data-visualization/static/2023-11-28-15-19-16.png b/docs/ru-RU/manual/data-visualization/static/2023-11-28-15-19-16.png new file mode 100644 index 0000000000..2228432a52 Binary files /dev/null and b/docs/ru-RU/manual/data-visualization/static/2023-11-28-15-19-16.png differ diff --git a/docs/ru-RU/manual/data-visualization/static/2023-11-28-17-48-11.png b/docs/ru-RU/manual/data-visualization/static/2023-11-28-17-48-11.png new file mode 100644 index 0000000000..d127ba7a59 Binary files /dev/null and b/docs/ru-RU/manual/data-visualization/static/2023-11-28-17-48-11.png differ diff --git a/docs/ru-RU/manual/data-visualization/static/2023-11-28-18-03-03.png b/docs/ru-RU/manual/data-visualization/static/2023-11-28-18-03-03.png new file mode 100644 index 0000000000..030514f64a Binary files /dev/null and b/docs/ru-RU/manual/data-visualization/static/2023-11-28-18-03-03.png differ diff --git a/docs/ru-RU/manual/data-visualization/static/2023-11-28-20-23-34.png b/docs/ru-RU/manual/data-visualization/static/2023-11-28-20-23-34.png new file mode 100644 index 0000000000..ae3348255d Binary files /dev/null and b/docs/ru-RU/manual/data-visualization/static/2023-11-28-20-23-34.png differ diff --git a/docs/ru-RU/manual/data-visualization/static/2023-11-28-20-27-51.png b/docs/ru-RU/manual/data-visualization/static/2023-11-28-20-27-51.png new file mode 100644 index 0000000000..24f15ca777 Binary files /dev/null and b/docs/ru-RU/manual/data-visualization/static/2023-11-28-20-27-51.png differ diff --git a/docs/ru-RU/manual/data-visualization/static/2023-11-28-20-29-44.png b/docs/ru-RU/manual/data-visualization/static/2023-11-28-20-29-44.png new file mode 100644 index 0000000000..8e7f901758 Binary files /dev/null and b/docs/ru-RU/manual/data-visualization/static/2023-11-28-20-29-44.png differ diff --git a/docs/ru-RU/manual/data-visualization/static/2023-11-28-20-32-30.png b/docs/ru-RU/manual/data-visualization/static/2023-11-28-20-32-30.png new file mode 100644 index 0000000000..e5f02f3dfb Binary files /dev/null and b/docs/ru-RU/manual/data-visualization/static/2023-11-28-20-32-30.png differ diff --git a/docs/ru-RU/manual/data-visualization/static/2023-11-28-20-38-59.png b/docs/ru-RU/manual/data-visualization/static/2023-11-28-20-38-59.png new file mode 100644 index 0000000000..e9b974b83c Binary files /dev/null and b/docs/ru-RU/manual/data-visualization/static/2023-11-28-20-38-59.png differ diff --git a/docs/ru-RU/manual/data-visualization/static/2023-11-28-20-39-43.png b/docs/ru-RU/manual/data-visualization/static/2023-11-28-20-39-43.png new file mode 100644 index 0000000000..4705a6ad23 Binary files /dev/null and b/docs/ru-RU/manual/data-visualization/static/2023-11-28-20-39-43.png differ diff --git a/docs/ru-RU/manual/data-visualization/static/2023-11-28-20-42-32.png b/docs/ru-RU/manual/data-visualization/static/2023-11-28-20-42-32.png new file mode 100644 index 0000000000..075874c61b Binary files /dev/null and b/docs/ru-RU/manual/data-visualization/static/2023-11-28-20-42-32.png differ diff --git a/docs/ru-RU/manual/data-visualization/static/2023-11-28-20-45-41.png b/docs/ru-RU/manual/data-visualization/static/2023-11-28-20-45-41.png new file mode 100644 index 0000000000..8979f6012a Binary files /dev/null and b/docs/ru-RU/manual/data-visualization/static/2023-11-28-20-45-41.png differ diff --git a/docs/ru-RU/manual/data-visualization/static/2023-11-28-20-49-18.png b/docs/ru-RU/manual/data-visualization/static/2023-11-28-20-49-18.png new file mode 100644 index 0000000000..17485590d9 Binary files /dev/null and b/docs/ru-RU/manual/data-visualization/static/2023-11-28-20-49-18.png differ diff --git a/docs/ru-RU/manual/data-visualization/static/2023-11-28-20-50-20.png b/docs/ru-RU/manual/data-visualization/static/2023-11-28-20-50-20.png new file mode 100644 index 0000000000..1318273d2e Binary files /dev/null and b/docs/ru-RU/manual/data-visualization/static/2023-11-28-20-50-20.png differ diff --git a/docs/ru-RU/manual/data-visualization/static/A680brszPoHrB7xFEWucIdjjnSg.png b/docs/ru-RU/manual/data-visualization/static/A680brszPoHrB7xFEWucIdjjnSg.png new file mode 100644 index 0000000000..970e3462b1 Binary files /dev/null and b/docs/ru-RU/manual/data-visualization/static/A680brszPoHrB7xFEWucIdjjnSg.png differ diff --git a/docs/ru-RU/manual/data-visualization/static/BlkEby9Z7or3CWxvhTCcLXumnHf.png b/docs/ru-RU/manual/data-visualization/static/BlkEby9Z7or3CWxvhTCcLXumnHf.png new file mode 100644 index 0000000000..dfef1a1017 Binary files /dev/null and b/docs/ru-RU/manual/data-visualization/static/BlkEby9Z7or3CWxvhTCcLXumnHf.png differ diff --git a/docs/ru-RU/manual/data-visualization/static/DEFSbBh6WoujLyxoktHcXEADnom.png b/docs/ru-RU/manual/data-visualization/static/DEFSbBh6WoujLyxoktHcXEADnom.png new file mode 100644 index 0000000000..6ae09ac625 Binary files /dev/null and b/docs/ru-RU/manual/data-visualization/static/DEFSbBh6WoujLyxoktHcXEADnom.png differ diff --git a/docs/ru-RU/manual/data-visualization/static/E2pwbBm4BofyHzxut4jcjonJn0s.png b/docs/ru-RU/manual/data-visualization/static/E2pwbBm4BofyHzxut4jcjonJn0s.png new file mode 100644 index 0000000000..ee654dd5bb Binary files /dev/null and b/docs/ru-RU/manual/data-visualization/static/E2pwbBm4BofyHzxut4jcjonJn0s.png differ diff --git a/docs/ru-RU/manual/data-visualization/static/K0trbvxhxoVayLx84sUcX5nLnUh.png b/docs/ru-RU/manual/data-visualization/static/K0trbvxhxoVayLx84sUcX5nLnUh.png new file mode 100644 index 0000000000..42ec6e996b Binary files /dev/null and b/docs/ru-RU/manual/data-visualization/static/K0trbvxhxoVayLx84sUcX5nLnUh.png differ diff --git a/docs/ru-RU/manual/data-visualization/static/OjTRbDlhHo32npxFBsicKGJinXd.png b/docs/ru-RU/manual/data-visualization/static/OjTRbDlhHo32npxFBsicKGJinXd.png new file mode 100644 index 0000000000..68d884f5cd Binary files /dev/null and b/docs/ru-RU/manual/data-visualization/static/OjTRbDlhHo32npxFBsicKGJinXd.png differ diff --git a/docs/ru-RU/manual/data-visualization/static/R0VlbVbkEoVcL1xA2xEcxHQLn1c.png b/docs/ru-RU/manual/data-visualization/static/R0VlbVbkEoVcL1xA2xEcxHQLn1c.png new file mode 100644 index 0000000000..a07d41fb05 Binary files /dev/null and b/docs/ru-RU/manual/data-visualization/static/R0VlbVbkEoVcL1xA2xEcxHQLn1c.png differ diff --git a/docs/ru-RU/manual/data-visualization/static/SVYhbc1LNoFSvzxYoOAc78mvn3e.png b/docs/ru-RU/manual/data-visualization/static/SVYhbc1LNoFSvzxYoOAc78mvn3e.png new file mode 100644 index 0000000000..53b307c6a4 Binary files /dev/null and b/docs/ru-RU/manual/data-visualization/static/SVYhbc1LNoFSvzxYoOAc78mvn3e.png differ diff --git a/docs/ru-RU/manual/data-visualization/static/SdgrbugCjopiffxOrLZcZKhxnEh.png b/docs/ru-RU/manual/data-visualization/static/SdgrbugCjopiffxOrLZcZKhxnEh.png new file mode 100644 index 0000000000..7fea068317 Binary files /dev/null and b/docs/ru-RU/manual/data-visualization/static/SdgrbugCjopiffxOrLZcZKhxnEh.png differ diff --git a/docs/ru-RU/manual/data-visualization/static/TUZCbKXHOo6fN6xfxSWcjkhhngg.png b/docs/ru-RU/manual/data-visualization/static/TUZCbKXHOo6fN6xfxSWcjkhhngg.png new file mode 100644 index 0000000000..05d7e9a83e Binary files /dev/null and b/docs/ru-RU/manual/data-visualization/static/TUZCbKXHOo6fN6xfxSWcjkhhngg.png differ diff --git a/docs/ru-RU/manual/data-visualization/static/TdsOb1FBfomRaxxSdrHciggGnub.png b/docs/ru-RU/manual/data-visualization/static/TdsOb1FBfomRaxxSdrHciggGnub.png new file mode 100644 index 0000000000..5fed0a0726 Binary files /dev/null and b/docs/ru-RU/manual/data-visualization/static/TdsOb1FBfomRaxxSdrHciggGnub.png differ diff --git a/docs/ru-RU/manual/data-visualization/static/UrFGbUN1GonqkpxyaUUclAefns3.png b/docs/ru-RU/manual/data-visualization/static/UrFGbUN1GonqkpxyaUUclAefns3.png new file mode 100644 index 0000000000..9ff3163b87 Binary files /dev/null and b/docs/ru-RU/manual/data-visualization/static/UrFGbUN1GonqkpxyaUUclAefns3.png differ diff --git a/docs/ru-RU/manual/file-manager/aliyun-oss.md b/docs/ru-RU/manual/file-manager/aliyun-oss.md new file mode 100644 index 0000000000..8bcd198a23 --- /dev/null +++ b/docs/ru-RU/manual/file-manager/aliyun-oss.md @@ -0,0 +1 @@ +# Aliyun OSS diff --git a/docs/ru-RU/manual/file-manager/amazon-s3.md b/docs/ru-RU/manual/file-manager/amazon-s3.md new file mode 100644 index 0000000000..5f4a3f276f --- /dev/null +++ b/docs/ru-RU/manual/file-manager/amazon-s3.md @@ -0,0 +1 @@ +# Amazon S3 diff --git a/docs/ru-RU/manual/file-manager/index.md b/docs/ru-RU/manual/file-manager/index.md new file mode 100644 index 0000000000..56d4de2076 --- /dev/null +++ b/docs/ru-RU/manual/file-manager/index.md @@ -0,0 +1,10 @@ +# Файловый менеджер + +Документация, подлежащая дополнению + +<!-- +## представлять + +## устанавливать + +## Инструкция по применению -> diff --git a/docs/ru-RU/manual/file-manager/local.md b/docs/ru-RU/manual/file-manager/local.md new file mode 100644 index 0000000000..e81a1f945b --- /dev/null +++ b/docs/ru-RU/manual/file-manager/local.md @@ -0,0 +1 @@ +# Локальное хранилище diff --git a/docs/ru-RU/manual/file-manager/tencent-cos.md b/docs/ru-RU/manual/file-manager/tencent-cos.md new file mode 100644 index 0000000000..ffadb51851 --- /dev/null +++ b/docs/ru-RU/manual/file-manager/tencent-cos.md @@ -0,0 +1 @@ +# Tencent COS diff --git a/docs/ru-RU/manual/localization-management/index.md b/docs/ru-RU/manual/localization-management/index.md new file mode 100644 index 0000000000..d3de995239 --- /dev/null +++ b/docs/ru-RU/manual/localization-management/index.md @@ -0,0 +1,47 @@ +# Управление локализацией + +## Введение + +## Установка + +## Руководство по использованию + +### Активация плагина + +![Активация плагина](https://static-docs.nocobase.com/d16f6ecd6bfb8d1e8acff38f23ad37f8.png) + +### Управление локализацией + +![Управление локализацией](https://static-docs.nocobase.com/c117b5337941f0afd564152053666480.png) + +### Синхронизация переводимых элементов + +![Синхронизация переводимых элементов](https://static-docs.nocobase.com/bc380a4ebdb2af075abcab5f16287cf9.png) + +После синхронизации будет отображен список всех переводимых элементов. + +![Список переводимых элементов](https://static-docs.nocobase.com/cf501e6b4d2f67520ad35b00d1ed3446.png) + +### Публикация + +После завершения перевода необходимо нажать кнопку «Опубликовать», чтобы изменения вступили в силу. + +![Публикация](https://static-docs.nocobase.com/1f9dc52defb37ac67912011ba31c3160.png) + +### Перевод на другие языки + +Включение других языков, например, упрощенного китайского. + +![Включение языка](https://static-docs.nocobase.com/618830967aaeb643c892fce355d59a73.png) + +Переключение языка. + +![Переключение языка](https://static-docs.nocobase.com/35548a7bf099df4f30d160c72863c6b8.png) + +Синхронизация элементов. + +![Синхронизация элементов](https://static-docs.nocobase.com/12f39cfcd7d8d9ce3d367426b959af16.png) + +Перевод и публикация. + +![Перевод и публикация](https://static-docs.nocobase.com/eb22725dcab6807dc8a410f5e10e9492.png) diff --git a/docs/ru-RU/manual/localization-management/static/BFRcbhE31oEAHOxss5ncRnEvnZb.png b/docs/ru-RU/manual/localization-management/static/BFRcbhE31oEAHOxss5ncRnEvnZb.png new file mode 100644 index 0000000000..3e52179dc1 Binary files /dev/null and b/docs/ru-RU/manual/localization-management/static/BFRcbhE31oEAHOxss5ncRnEvnZb.png differ diff --git a/docs/ru-RU/manual/localization-management/static/DxQ8bDrtsoi8ObxadwZcCYntn9d.png b/docs/ru-RU/manual/localization-management/static/DxQ8bDrtsoi8ObxadwZcCYntn9d.png new file mode 100644 index 0000000000..b51c6e242c Binary files /dev/null and b/docs/ru-RU/manual/localization-management/static/DxQ8bDrtsoi8ObxadwZcCYntn9d.png differ diff --git a/docs/ru-RU/manual/localization-management/static/GaqEbrgAdokzgJxqicMcdKxMnQf.png b/docs/ru-RU/manual/localization-management/static/GaqEbrgAdokzgJxqicMcdKxMnQf.png new file mode 100644 index 0000000000..ec4c28e927 Binary files /dev/null and b/docs/ru-RU/manual/localization-management/static/GaqEbrgAdokzgJxqicMcdKxMnQf.png differ diff --git a/docs/ru-RU/manual/localization-management/static/IkBhbaqrfodzsMxxueIcUENnnTd.png b/docs/ru-RU/manual/localization-management/static/IkBhbaqrfodzsMxxueIcUENnnTd.png new file mode 100644 index 0000000000..ff36c8d38b Binary files /dev/null and b/docs/ru-RU/manual/localization-management/static/IkBhbaqrfodzsMxxueIcUENnnTd.png differ diff --git a/docs/ru-RU/manual/localization-management/static/IkFDbWE8ios6qSxp78scf2BOnQg.png b/docs/ru-RU/manual/localization-management/static/IkFDbWE8ios6qSxp78scf2BOnQg.png new file mode 100644 index 0000000000..dd15f11bee Binary files /dev/null and b/docs/ru-RU/manual/localization-management/static/IkFDbWE8ios6qSxp78scf2BOnQg.png differ diff --git a/docs/ru-RU/manual/localization-management/static/Pi1nbxvVEoqSIox28FkcYkw7nID.png b/docs/ru-RU/manual/localization-management/static/Pi1nbxvVEoqSIox28FkcYkw7nID.png new file mode 100644 index 0000000000..8d3a232439 Binary files /dev/null and b/docs/ru-RU/manual/localization-management/static/Pi1nbxvVEoqSIox28FkcYkw7nID.png differ diff --git a/docs/ru-RU/manual/localization-management/static/S49abMq61oBfMFxRvs7cZTgHnoh.png b/docs/ru-RU/manual/localization-management/static/S49abMq61oBfMFxRvs7cZTgHnoh.png new file mode 100644 index 0000000000..a1db38f6ab Binary files /dev/null and b/docs/ru-RU/manual/localization-management/static/S49abMq61oBfMFxRvs7cZTgHnoh.png differ diff --git a/docs/ru-RU/manual/localization-management/static/TmD3bXzJ2onTXcxyaWXc2g30n0e.png b/docs/ru-RU/manual/localization-management/static/TmD3bXzJ2onTXcxyaWXc2g30n0e.png new file mode 100644 index 0000000000..562afbd77b Binary files /dev/null and b/docs/ru-RU/manual/localization-management/static/TmD3bXzJ2onTXcxyaWXc2g30n0e.png differ diff --git a/docs/ru-RU/manual/localization-management/static/XO9TbVodPo01SrxFPrkcUsVmngg.png b/docs/ru-RU/manual/localization-management/static/XO9TbVodPo01SrxFPrkcUsVmngg.png new file mode 100644 index 0000000000..970b990d5c Binary files /dev/null and b/docs/ru-RU/manual/localization-management/static/XO9TbVodPo01SrxFPrkcUsVmngg.png differ diff --git a/docs/ru-RU/manual/mobile-client/index.md b/docs/ru-RU/manual/mobile-client/index.md new file mode 100644 index 0000000000..ee9a165dd7 --- /dev/null +++ b/docs/ru-RU/manual/mobile-client/index.md @@ -0,0 +1,10 @@ +# Мобильный терминал + +Документация, подлежащая дополнению + +<!-- +## представлять + +## устанавливать + +## Инструкция по применению -> diff --git a/docs/ru-RU/manual/mobile/development/frontend.md b/docs/ru-RU/manual/mobile/development/frontend.md new file mode 100644 index 0000000000..847a54e508 --- /dev/null +++ b/docs/ru-RU/manual/mobile/development/frontend.md @@ -0,0 +1,3 @@ +## Настройки инициализатора схемы + +![20240712115610](https://static-docs.nocobase.com/20240712115610.png) diff --git a/docs/ru-RU/manual/mobile/index.md b/docs/ru-RU/manual/mobile/index.md new file mode 100644 index 0000000000..ffdf48f92b --- /dev/null +++ b/docs/ru-RU/manual/mobile/index.md @@ -0,0 +1,17 @@ +# Мобильный терминал + +<PluginInfo name="mobile"></PluginInfo> + +## Представление + +Предоставьте возможность настраивать мобильные страницы. + +## Установка + +Предварительно настроенные плагины необходимо активировать, прежде чем их можно будет использовать. + +![20240712113500](https://static-docs.nocobase.com/20240712113500.png) + +## Применение + +![20240712113531](https://static-docs.nocobase.com/20240712113531.png) diff --git a/docs/ru-RU/manual/plugin-manager/plugin-manager/index.md b/docs/ru-RU/manual/plugin-manager/plugin-manager/index.md new file mode 100644 index 0000000000..8777a8f9e9 --- /dev/null +++ b/docs/ru-RU/manual/plugin-manager/plugin-manager/index.md @@ -0,0 +1,45 @@ +# Менеджер плагинов + +Менеджер плагинов позволяет добавлять плагины через интерфейс, предоставляя простой, интуитивно понятный и легкий способ расширения функциональности NocoBase. С его помощью можно легко расширять и настраивать функции приложения, включая установку, обновление и удаление плагинов. + +### Компоненты менеджера плагинов + +1. **Локальные плагины / Маркетплейс плагинов** +2. **Категории плагинов** (встроенные, включенные, отключенные, с проблемами; поддерживается поиск по названию плагина) +3. **Добавление нового плагина** +4. **Основной интерфейс настройки плагинов** + +![]() + +#### Просмотр документации плагина + +При клике на плагин можно быстро ознакомиться с его документацией (включая описание, проверку совместимости зависимостей и журнал обновлений). + +![]() + +#### Добавление плагина + +Поддерживается установка плагинов в режиме plug-and-play. Плагины можно добавлять через интерфейс следующими способами: +- Загрузка из npm registry (включая частные реестры) +- Локальная загрузка +- Загрузка по URL + +![]() + +#### Активация плагина + +![]() + +#### Отключение плагина + +![]() + +#### Удаление плагина + +![]() + +#### Обновление плагина + +В настоящее время обновление доступно только для плагинов, находящихся в директории `storage/plugins`, как показано на изображении: + +![]() diff --git a/docs/ru-RU/manual/plugin-manager/plugin-manager/static/DtkpbfloNog6gtxM6RWcqDYwnph.png b/docs/ru-RU/manual/plugin-manager/plugin-manager/static/DtkpbfloNog6gtxM6RWcqDYwnph.png new file mode 100644 index 0000000000..cc02c0f8bb Binary files /dev/null and b/docs/ru-RU/manual/plugin-manager/plugin-manager/static/DtkpbfloNog6gtxM6RWcqDYwnph.png differ diff --git a/docs/ru-RU/manual/plugin-manager/plugin-manager/static/Ehu2boQ2xowSrnxpMS1ctIprnMd.png b/docs/ru-RU/manual/plugin-manager/plugin-manager/static/Ehu2boQ2xowSrnxpMS1ctIprnMd.png new file mode 100644 index 0000000000..ce13dfa7c0 Binary files /dev/null and b/docs/ru-RU/manual/plugin-manager/plugin-manager/static/Ehu2boQ2xowSrnxpMS1ctIprnMd.png differ diff --git a/docs/ru-RU/manual/plugin-manager/plugin-manager/static/K8JDbo9JCo9iCExVEw4cKHfOnPg.png b/docs/ru-RU/manual/plugin-manager/plugin-manager/static/K8JDbo9JCo9iCExVEw4cKHfOnPg.png new file mode 100644 index 0000000000..43c3fe3595 Binary files /dev/null and b/docs/ru-RU/manual/plugin-manager/plugin-manager/static/K8JDbo9JCo9iCExVEw4cKHfOnPg.png differ diff --git a/docs/ru-RU/manual/plugin-manager/plugin-manager/static/LcP9b9oVwoN5ZQx2CZScJ7TAn9c.gif b/docs/ru-RU/manual/plugin-manager/plugin-manager/static/LcP9b9oVwoN5ZQx2CZScJ7TAn9c.gif new file mode 100644 index 0000000000..5bafff0964 Binary files /dev/null and b/docs/ru-RU/manual/plugin-manager/plugin-manager/static/LcP9b9oVwoN5ZQx2CZScJ7TAn9c.gif differ diff --git a/docs/ru-RU/manual/plugin-manager/plugin-manager/static/Mgo0bjYccoNjmNxNT8rcfF0tndd.png b/docs/ru-RU/manual/plugin-manager/plugin-manager/static/Mgo0bjYccoNjmNxNT8rcfF0tndd.png new file mode 100644 index 0000000000..c5c349d81e Binary files /dev/null and b/docs/ru-RU/manual/plugin-manager/plugin-manager/static/Mgo0bjYccoNjmNxNT8rcfF0tndd.png differ diff --git a/docs/ru-RU/manual/plugin-manager/plugin-manager/static/NOz2b4To1o1fMbxqnb8cfqacnfT.gif b/docs/ru-RU/manual/plugin-manager/plugin-manager/static/NOz2b4To1o1fMbxqnb8cfqacnfT.gif new file mode 100644 index 0000000000..71f3c87a5b Binary files /dev/null and b/docs/ru-RU/manual/plugin-manager/plugin-manager/static/NOz2b4To1o1fMbxqnb8cfqacnfT.gif differ diff --git a/docs/ru-RU/manual/plugin-manager/plugin-manager/static/VehkbE6RqogLlcxoRrVcEvpJn0e.gif b/docs/ru-RU/manual/plugin-manager/plugin-manager/static/VehkbE6RqogLlcxoRrVcEvpJn0e.gif new file mode 100644 index 0000000000..68ddab50c0 Binary files /dev/null and b/docs/ru-RU/manual/plugin-manager/plugin-manager/static/VehkbE6RqogLlcxoRrVcEvpJn0e.gif differ diff --git a/docs/ru-RU/manual/plugin-manager/plugin-settings/index.md b/docs/ru-RU/manual/plugin-manager/plugin-settings/index.md new file mode 100644 index 0000000000..9163e251ae --- /dev/null +++ b/docs/ru-RU/manual/plugin-manager/plugin-settings/index.md @@ -0,0 +1,12 @@ +# Центр управления плагинами + +Центр управления предоставляет пользователям платформу для централизованного управления и настройки системной информации и параметров, связанных с работой.Пользователи могут настраивать систему, моделирование таблиц данных, конфигурацию рабочего процесса и подключаемых модулей в соответствии со своими конкретными бизнес-потребностями и личными предпочтениями + +Состав подключаемого центра управления: + +1. Лучшие элементы быстрой настройки +2. Список всех активированных конфигураций подключаемого модуля +3. Вкладка подключаемого модуля +4. Текстовое содержимое + +![](https://static-docs.nocobase.com/1c0e3cb111e993232b51aa6233e07478.jpeg) diff --git a/docs/ru-RU/manual/plugin-manager/plugin-settings/static/N50VbOPHpoKvYVxacuUc1i6Cnrd.jpeg b/docs/ru-RU/manual/plugin-manager/plugin-settings/static/N50VbOPHpoKvYVxacuUc1i6Cnrd.jpeg new file mode 100644 index 0000000000..0285ff522e Binary files /dev/null and b/docs/ru-RU/manual/plugin-manager/plugin-settings/static/N50VbOPHpoKvYVxacuUc1i6Cnrd.jpeg differ diff --git a/docs/ru-RU/manual/system-settings/index.md b/docs/ru-RU/manual/system-settings/index.md new file mode 100644 index 0000000000..5814b69bcc --- /dev/null +++ b/docs/ru-RU/manual/system-settings/index.md @@ -0,0 +1,11 @@ +# Системные настройки + +Документация, подлежащая дополнению + + +<!-- +## Представлять + +## Устанавливать + +## Инструкция по применению -> diff --git a/docs/ru-RU/manual/theme-editor/index.md b/docs/ru-RU/manual/theme-editor/index.md new file mode 100644 index 0000000000..22058c6552 --- /dev/null +++ b/docs/ru-RU/manual/theme-editor/index.md @@ -0,0 +1,9 @@ +# Редактор тем + +Документация, подлежащая дополнению + +## Представлять + +## Устанавливать + +## Инструкция по применению -> diff --git a/docs/ru-RU/manual/ui/actions/add-new.md b/docs/ru-RU/manual/ui/actions/add-new.md new file mode 100644 index 0000000000..1811ee564a --- /dev/null +++ b/docs/ru-RU/manual/ui/actions/add-new.md @@ -0,0 +1 @@ +# Добавить diff --git a/docs/ru-RU/manual/ui/actions/add-record.md b/docs/ru-RU/manual/ui/actions/add-record.md new file mode 100644 index 0000000000..c07540b549 --- /dev/null +++ b/docs/ru-RU/manual/ui/actions/add-record.md @@ -0,0 +1,5 @@ +# Добавить данные + +Пользовательские операции добавления данных позволяют пользователям добавлять данные в любую таблицу данных в ходе операции + +![](https://static-docs.nocobase.com/70c3982c59d6c7b7f36e225f4c208d2f.png) diff --git a/docs/ru-RU/manual/ui/actions/custom-request.md b/docs/ru-RU/manual/ui/actions/custom-request.md new file mode 100644 index 0000000000..23286646e3 --- /dev/null +++ b/docs/ru-RU/manual/ui/actions/custom-request.md @@ -0,0 +1,5 @@ +# Пользовательский запрос + +Настройте адрес запроса для операции пользовательского запроса в соответствии с конкретными потребностями бизнеса. Дополнительные сведения см. в документации по подключаемому модулю пользовательского запроса. + +![](https://static-docs.nocobase.com/69d610904dbec87ef719e5345915f5a2.png) diff --git a/docs/ru-RU/manual/ui/actions/delete.md b/docs/ru-RU/manual/ui/actions/delete.md new file mode 100644 index 0000000000..4e1786f43f --- /dev/null +++ b/docs/ru-RU/manual/ui/actions/delete.md @@ -0,0 +1,5 @@ +# Удаление + +Операция удаления используется для удаления записей данных (кнопка "строка" /кнопка "пакетная операция"), и появляется второе всплывающее окно подтверждения + +![](https://static-docs.nocobase.com/96272ba867a128004738fce9f5d6d63f.png) diff --git a/docs/ru-RU/manual/ui/actions/duplicate.md b/docs/ru-RU/manual/ui/actions/duplicate.md new file mode 100644 index 0000000000..59fb3da5a3 --- /dev/null +++ b/docs/ru-RU/manual/ui/actions/duplicate.md @@ -0,0 +1,74 @@ +# Копирование + +Операция копирования позволяет пользователю скопировать строку данных для создания новой записи данных, поддерживая два способа: прямое копирование и копирование в форму с последующим заполнением. + +#### Прямое копирование + +![](https://static-docs.nocobase.com/2c0ac5d1a539de4b72b49b7d966d8c09.png) + +- По умолчанию данные копируются напрямую. +- Целевая таблица: таблица, в которую добавляются скопированные данные (в случае наследования можно копировать в дочернюю таблицу, при прямом копировании — только в текущую таблицу). +- Шаблонные поля: используются для указания полей, которые нужно скопировать, можно выбрать все, обязательны для заполнения. + +После завершения настройки нажмите кнопку, чтобы скопировать данные. + +#### Копирование в форму с последующим заполнением + +Шаблонные поля заполняются в форму как значения по умолчанию, которые можно изменить перед отправкой. + +Можно настроить текущую таблицу или дочернюю таблицу как целевую для добавления скопированных данных. + +![](https://static-docs.nocobase.com/a072aa572fd0a0fe643eadf95471da2a.png) + +Настройка шаблонных полей: шаблонные поля будут заполнены в форму как значения по умолчанию, копируются только выбранные поля. + +![](https://static-docs.nocobase.com/8032fa2025180ade275da55b97774b4d.png) + +«Транспортная накладная» (o2m) — это отношение копирования, поле которого можно настроить как субформу, где также можно настроить поля субформы. + +![](https://static-docs.nocobase.com/b13c9287bae8601646727a2e78b81be7.png) + +Синхронизация полей формы: после завершения настройки формы можно нажать кнопку синхронизации полей формы, которая автоматически выберет все уже настроенные поля формы (при каждом изменении конфигурации полей формы требуется повторная ручная синхронизация). После синхронизации можно дополнительно настроить шаблонные поля вручную. + +![](https://static-docs.nocobase.com/156b6d8d741521e63d12e49092414d58.png) + +При нажатии на операцию копирования открывается всплывающее окно, в котором данные шаблона, соответствующие шаблонным полям, заполняются в форму как значения по умолчанию. Данные можно изменить и отправить для завершения копирования. + +![](https://static-docs.nocobase.com/1c0a0ae0c59971f48b2282a68831d44b.png) + +Пример полной настройки операции копирования для списка заказов показан на следующем изображении: + +![](https://static-docs.nocobase.com/fa8a89abf0ba136df04b6d0d838eae4e.gif) + +#### Пояснение о копировании, ссылке и предварительной загрузке + +Для разных полей (разных типов отношений) применяются различные логики обработки (копирование, ссылка, предварительная загрузка). Изменение компонента поля для отношений также влияет на логику обработки (Select и Record picker используются для обработки ссылок, а Sub-form и Sub-table — для копирования). + +- **Копирование** + - Обычные поля копируются. + - Поля отношений hasOne и hasMany могут быть только скопированы (такие поля не могут использовать компоненты Select или Record picker, а должны использовать Sub-form, Sub-table и т.д.). + - Изменение компонента для полей hasOne и hasMany не меняет логику обработки (копирование). + - Для скопированных полей отношений все дочерние поля могут быть выбраны. + +- **Ссылка** + - Поля belongsTo и belongsToMany являются ссылками. + - **Ссылка может стать копированием, например, если компонент поля изменяется с Select на Sub-form, отношение становится копированием (после этого все дочерние поля становятся доступными для выбора).** + +- **Предварительная загрузка**: поля отношений внутри ссылочных полей. + - Поля отношений внутри ссылочных полей предварительно загружаются. + - Предварительно загруженные поля могут стать ссылками или копированием при изменении компонента поля. + +#### О выборе всех полей +- Все поля для копирования выбираются. +- Все поля для ссылок выбираются. + +#### Логика обработки данных шаблона +- Все внешние ключи (fk) отношений фильтруются. +- Для копируемых данных отношений первичные ключи (pk) также фильтруются. +- Для ссылок и предварительной загрузки первичные ключи (pk) сохраняются. + +#### Как работает синхронизация полей формы + +В большинстве случаев конфигурация формы включает множество полей, и ручная настройка шаблонных полей может быть очень трудоемкой. Для упрощения этой задачи добавлена кнопка синхронизации полей формы. Эта функция автоматически анализирует конфигурацию полей формы и определяет логику копирования полей (копирование, ссылка или предварительная загрузка) на основе типов полей и настроек компонентов отношений. Все уже настроенные поля автоматически выбираются. + +После изменения конфигурации полей формы система не синхронизирует изменения автоматически. Пользователю необходимо вручную нажать кнопку синхронизации полей формы, чтобы применить последние изменения к конфигурации шаблона. diff --git a/docs/ru-RU/manual/ui/actions/edit.md b/docs/ru-RU/manual/ui/actions/edit.md new file mode 100644 index 0000000000..ef2f5078bf --- /dev/null +++ b/docs/ru-RU/manual/ui/actions/edit.md @@ -0,0 +1,5 @@ +# Редактор + +Операция редактирования позволяет пользователю изменять данные, обычно настраивая блок формы + +![](https://static-docs.nocobase.com/9b412840521b7ae6d5c5f0372df2f349.png) diff --git a/docs/ru-RU/manual/ui/actions/export.md b/docs/ru-RU/manual/ui/actions/export.md new file mode 100644 index 0000000000..9243c5f1d0 --- /dev/null +++ b/docs/ru-RU/manual/ui/actions/export.md @@ -0,0 +1,9 @@ +# Экспорт + +Операция экспорта выполняется с помощью подключаемого модуля extension. Все данные таблицы данных, привязанные к блоку, экспортируются пакетами, и поддерживается настройка заголовка поля экспорта. + +![](https://static-docs.nocobase.com/c074c4eb9d67a8408d98ff6299715157.png) + +- Настройка экспортируемых полей + +![](https://static-docs.nocobase.com/903b4c12bcd1b8e59e133d2f9822eb56.png) diff --git a/docs/ru-RU/manual/ui/actions/filter.md b/docs/ru-RU/manual/ui/actions/filter.md new file mode 100644 index 0000000000..61742d1c11 --- /dev/null +++ b/docs/ru-RU/manual/ui/actions/filter.md @@ -0,0 +1,13 @@ +# Фильтр + +Операции фильтрации обычно отображаются в блоках данных. Для фильтрации данных можно настроить различные условия. Следует отметить, что если для блока был настроен диапазон данных, операция фильтрации будет объединена с условиями диапазона данных в качестве окончательного условия фильтрации. + +![](https://static-docs.nocobase.com/da548ad1c170bef3d2359ac82764b534.png) + +Поддержка настройки фильтруемых полей + +![](https://static-docs.nocobase.com/85815dc40157571ba072cc392fbe43d4.png) + +Настройте операцию фильтрации в списке накладных, как показано ниже: настройте данные фильтрации, изменив условия + +![](https://static-docs.nocobase.com/02cabf6201fdf4165747c9fcde687a5e.gif) diff --git a/docs/ru-RU/manual/ui/actions/import.md b/docs/ru-RU/manual/ui/actions/import.md new file mode 100644 index 0000000000..7e6738eeb8 --- /dev/null +++ b/docs/ru-RU/manual/ui/actions/import.md @@ -0,0 +1,17 @@ +# Импорт + +Операция импорта осуществляется с помощью подключаемых расширений и в настоящее время поддерживает пакетный импорт данных путем импорта файлов формата xlsx. + +1. Настройка импортируемых полей + +![](https://static-docs.nocobase.com/967a130c06237e0724e5815fc3b16903.png) + +![](https://static-docs.nocobase.com/0046c530677bff984db4d560956da35a.png) + +2. Загрузите импортированный шаблон, добавьте в него данные и импортируйте их + +![](https://static-docs.nocobase.com/1038ab1b1fcdc7ad6e5346cde27eed49.png) + +Более подробную информацию смотрите в инструкциях по импорту + +[https://github.com/nocobase/nocobase/tree/main/packages/plugins/%40nocobase/plugin-import#%E5%AF%BC%E5%85%A5%E8%AF%B4%E6%98%8E](https://github.com/nocobase/nocobase/tree/main/packages/plugins/%40nocobase/plugin-import#%E5%AF%BC%E5%85%A5%E8%AF%B4%E6%98%8E) diff --git a/docs/ru-RU/manual/ui/actions/index.md b/docs/ru-RU/manual/ui/actions/index.md new file mode 100644 index 0000000000..6ac2febb67 --- /dev/null +++ b/docs/ru-RU/manual/ui/actions/index.md @@ -0,0 +1,50 @@ +# Действия (Actions) + +В пользовательском интерфейсе действия - это кнопки, которые запускают определенные команды. Их можно размещать: + +- На страницах +- В диалоговых окнах +- В боковых панелях +- В комбинации с блоками + +В настоящее время динамически настраиваемые действия в основном используются в сочетании с блоками. + +## Действия внутри блоков + +![](https://static-docs.nocobase.com/3e69f1f2991842ecad640705bc9feda4.png) + +## Конструктор действий (панель инструментов) + +В отличие от блоков и полей, конструктор действий имеет только две иконки: + +1. Перетаскивание +2. Настройка параметров + +![](https://static-docs.nocobase.com/007422d42678c54f79668dfafe69b60e.png) + +## Сортировка действий перетаскиванием + +Удерживая иконку "Перетаскивание" в конструкторе кнопок, можно изменять порядок действий + +## Общие параметры настройки + +- Редактирование кнопки +- Способ открытия: боковая панель, диалоговое окно +- Размер всплывающего окна: большой, средний, маленький +- Удаление + +![](https://static-docs.nocobase.com/e99916932f6c4d58bcad4d892b5daf15.png) + +## Правила взаимодействия действий + +Для действий с контекстными данными можно настроить "Правила взаимодействия" + +![](https://static-docs.nocobase.com/c431434a285278ea00bedf9e4dac4d45.png) + +Настройка правил взаимодействия: + +![](https://static-docs.nocobase.com/149c049bb0c0ce931c6c0333e12b0610.png) + +Можно добавить несколько условий. Логика условий аналогична фильтрации, позволяя управлять: +- Отображением/скрытием кнопки +- Активацией/деактивацией кнопки diff --git a/docs/ru-RU/manual/ui/actions/open-popup.md b/docs/ru-RU/manual/ui/actions/open-popup.md new file mode 100644 index 0000000000..cdbd30ea4c --- /dev/null +++ b/docs/ru-RU/manual/ui/actions/open-popup.md @@ -0,0 +1,9 @@ +# Открыть всплывающее окно + +Операция открытия всплывающего окна представляет данные в виде всплывающего окна, а блок сведений о конфигурации или блок формы могут быть настроены индивидуально, что подходит для различных сценариев. Например, если в таблице данных много полей, вы можете разделить их на различные операционные блоки, сосредоточиться на просмотре или изменении определенных полей и создать несколько настраиваемых операций отображения данных или редактирования интерфейса в соответствии с потребностями бизнеса. + +![](https://static-docs.nocobase.com/c859041afb43752431e78c6e81c44c43.png) + +Как показано на рисунке, в форме заказа настроены три операции во всплывающем окне для просмотра основного заказа (основная информация о заказе), просмотра продукта (информация о продукте, связанная с заказом) и просмотра клиента (информация о клиенте, связанная с заказом). + +![](https://static-docs.nocobase.com/110e2eed418c755ef40b7259e5816c73.png) diff --git a/docs/ru-RU/manual/ui/actions/print.md b/docs/ru-RU/manual/ui/actions/print.md new file mode 100644 index 0000000000..e70de2ff0e --- /dev/null +++ b/docs/ru-RU/manual/ui/actions/print.md @@ -0,0 +1,3 @@ +# Печать + +![](https://static-docs.nocobase.com/ce71d14cb7889b1e2291fbdb104b00e5.png) diff --git a/docs/ru-RU/manual/ui/actions/refresh.md b/docs/ru-RU/manual/ui/actions/refresh.md new file mode 100644 index 0000000000..9ec38c6515 --- /dev/null +++ b/docs/ru-RU/manual/ui/actions/refresh.md @@ -0,0 +1,5 @@ +# Обновление + +Операция обновления используется для перезагрузки данных в блоке данных и поддерживает обновление вручную + +![](https://static-docs.nocobase.com/3488c8c8296e9048f815d89198a51c5a.png) diff --git a/docs/ru-RU/manual/ui/actions/save-record.md b/docs/ru-RU/manual/ui/actions/save-record.md new file mode 100644 index 0000000000..29c14d6e29 --- /dev/null +++ b/docs/ru-RU/manual/ui/actions/save-record.md @@ -0,0 +1,14 @@ +# Сохранить данные + +Пользовательская операция сохранения данных - это уникальная операция блока формы, которая поддерживает поведение пользовательских операций.: + +- Кнопка редактирования +- Назначение поля: При нажатии на текущую кнопку настройки сохраняется ситуация с текущим назначением поля данных. +- Пропустить необходимую проверку +- Действия после успешной отправки + +![](https://static-docs.nocobase.com/2d35b787114dede3a0f08d7431edb37a.png) + +- Обязательный рабочий процесс + +![](https://static-docs.nocobase.com/6d93cd53d45c8408ed78b0289f0f5dae.png) diff --git a/docs/ru-RU/manual/ui/actions/static/ApcrbSF87oD3roxGW80cFkAxn2c.png b/docs/ru-RU/manual/ui/actions/static/ApcrbSF87oD3roxGW80cFkAxn2c.png new file mode 100644 index 0000000000..291a8c545d Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/ApcrbSF87oD3roxGW80cFkAxn2c.png differ diff --git a/docs/ru-RU/manual/ui/actions/static/BoEEbVUptoQCXOxvFJTc0p8Vnlb.png b/docs/ru-RU/manual/ui/actions/static/BoEEbVUptoQCXOxvFJTc0p8Vnlb.png new file mode 100644 index 0000000000..dcad0c6206 Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/BoEEbVUptoQCXOxvFJTc0p8Vnlb.png differ diff --git a/docs/ru-RU/manual/ui/actions/static/C8RzbI7v5opcUNx7OWzcz1l6nxc.png b/docs/ru-RU/manual/ui/actions/static/C8RzbI7v5opcUNx7OWzcz1l6nxc.png new file mode 100644 index 0000000000..bc2264211a Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/C8RzbI7v5opcUNx7OWzcz1l6nxc.png differ diff --git a/docs/ru-RU/manual/ui/actions/static/CzfCbLjC3oPItSxoeGAcDh0Rnte.png b/docs/ru-RU/manual/ui/actions/static/CzfCbLjC3oPItSxoeGAcDh0Rnte.png new file mode 100644 index 0000000000..b811482e46 Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/CzfCbLjC3oPItSxoeGAcDh0Rnte.png differ diff --git a/docs/ru-RU/manual/ui/actions/static/DKwnbW8MfohvHjxplG4cVkcnn8d.png b/docs/ru-RU/manual/ui/actions/static/DKwnbW8MfohvHjxplG4cVkcnn8d.png new file mode 100644 index 0000000000..714ab3654c Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/DKwnbW8MfohvHjxplG4cVkcnn8d.png differ diff --git a/docs/ru-RU/manual/ui/actions/static/DTzUb0LcPoimfBxvHoHcDD5znAf.png b/docs/ru-RU/manual/ui/actions/static/DTzUb0LcPoimfBxvHoHcDD5znAf.png new file mode 100644 index 0000000000..d3520984c2 Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/DTzUb0LcPoimfBxvHoHcDD5znAf.png differ diff --git a/docs/ru-RU/manual/ui/actions/static/G1bpbybaVoAWKlx4mCmc6HvQn0b.gif b/docs/ru-RU/manual/ui/actions/static/G1bpbybaVoAWKlx4mCmc6HvQn0b.gif new file mode 100644 index 0000000000..a304e56a17 Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/G1bpbybaVoAWKlx4mCmc6HvQn0b.gif differ diff --git a/docs/ru-RU/manual/ui/actions/static/H1hPbS7CWooWjpxAUfActBgbnsW.png b/docs/ru-RU/manual/ui/actions/static/H1hPbS7CWooWjpxAUfActBgbnsW.png new file mode 100644 index 0000000000..8669eaf5a7 Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/H1hPbS7CWooWjpxAUfActBgbnsW.png differ diff --git a/docs/ru-RU/manual/ui/actions/static/J0udbzu0AoU7sVxJ9xtcvQdLnNc.png b/docs/ru-RU/manual/ui/actions/static/J0udbzu0AoU7sVxJ9xtcvQdLnNc.png new file mode 100644 index 0000000000..86939b8ed2 Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/J0udbzu0AoU7sVxJ9xtcvQdLnNc.png differ diff --git a/docs/ru-RU/manual/ui/actions/static/JzDSbax1BoXxy2xrD6CcYuEKnRp.png b/docs/ru-RU/manual/ui/actions/static/JzDSbax1BoXxy2xrD6CcYuEKnRp.png new file mode 100644 index 0000000000..d588f826ff Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/JzDSbax1BoXxy2xrD6CcYuEKnRp.png differ diff --git a/docs/ru-RU/manual/ui/actions/static/KR15bOuXoo0u5QxZXmjcNbUJnoe.png b/docs/ru-RU/manual/ui/actions/static/KR15bOuXoo0u5QxZXmjcNbUJnoe.png new file mode 100644 index 0000000000..e8f44ef8a0 Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/KR15bOuXoo0u5QxZXmjcNbUJnoe.png differ diff --git a/docs/ru-RU/manual/ui/actions/static/KsK1b5DOwoKI1qx4Qhscahrrneb.png b/docs/ru-RU/manual/ui/actions/static/KsK1b5DOwoKI1qx4Qhscahrrneb.png new file mode 100644 index 0000000000..b7d94bc38a Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/KsK1b5DOwoKI1qx4Qhscahrrneb.png differ diff --git a/docs/ru-RU/manual/ui/actions/static/MDtybwjRsoC8qfxrFAecdJpkngc.png b/docs/ru-RU/manual/ui/actions/static/MDtybwjRsoC8qfxrFAecdJpkngc.png new file mode 100644 index 0000000000..50d884b2c6 Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/MDtybwjRsoC8qfxrFAecdJpkngc.png differ diff --git a/docs/ru-RU/manual/ui/actions/static/NRH9bnRw8ogxRkxZ7i3clbW1nRv.png b/docs/ru-RU/manual/ui/actions/static/NRH9bnRw8ogxRkxZ7i3clbW1nRv.png new file mode 100644 index 0000000000..7c39abb132 Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/NRH9bnRw8ogxRkxZ7i3clbW1nRv.png differ diff --git a/docs/ru-RU/manual/ui/actions/static/Ox76b54eho4fTUxdk67cjcjenCc.png b/docs/ru-RU/manual/ui/actions/static/Ox76b54eho4fTUxdk67cjcjenCc.png new file mode 100644 index 0000000000..f8b3c89509 Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/Ox76b54eho4fTUxdk67cjcjenCc.png differ diff --git a/docs/ru-RU/manual/ui/actions/static/PAgIbrq5xoMKKfxoG8mcOIOynpf.png b/docs/ru-RU/manual/ui/actions/static/PAgIbrq5xoMKKfxoG8mcOIOynpf.png new file mode 100644 index 0000000000..e561088757 Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/PAgIbrq5xoMKKfxoG8mcOIOynpf.png differ diff --git a/docs/ru-RU/manual/ui/actions/static/Pkf4bvn30oWEIjxrFmPc3d0lnPd.png b/docs/ru-RU/manual/ui/actions/static/Pkf4bvn30oWEIjxrFmPc3d0lnPd.png new file mode 100644 index 0000000000..c237b712b2 Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/Pkf4bvn30oWEIjxrFmPc3d0lnPd.png differ diff --git a/docs/ru-RU/manual/ui/actions/static/QBHTb3fVBot2lqxdGnhcf29tnrb.png b/docs/ru-RU/manual/ui/actions/static/QBHTb3fVBot2lqxdGnhcf29tnrb.png new file mode 100644 index 0000000000..ab9a8a54ec Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/QBHTb3fVBot2lqxdGnhcf29tnrb.png differ diff --git a/docs/ru-RU/manual/ui/actions/static/QPq9bd2xaoB6unxVvEPccbJsnRg.png b/docs/ru-RU/manual/ui/actions/static/QPq9bd2xaoB6unxVvEPccbJsnRg.png new file mode 100644 index 0000000000..d8a0e40cf2 Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/QPq9bd2xaoB6unxVvEPccbJsnRg.png differ diff --git a/docs/ru-RU/manual/ui/actions/static/QqICbfLMMozpgBxYBpMcKuOKnmg.png b/docs/ru-RU/manual/ui/actions/static/QqICbfLMMozpgBxYBpMcKuOKnmg.png new file mode 100644 index 0000000000..8038a1a90e Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/QqICbfLMMozpgBxYBpMcKuOKnmg.png differ diff --git a/docs/ru-RU/manual/ui/actions/static/R3f2biRIdoEm7DxUO6Ec1abXnKc.gif b/docs/ru-RU/manual/ui/actions/static/R3f2biRIdoEm7DxUO6Ec1abXnKc.gif new file mode 100644 index 0000000000..c31a4b0508 Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/R3f2biRIdoEm7DxUO6Ec1abXnKc.gif differ diff --git a/docs/ru-RU/manual/ui/actions/static/R5eGbDbcEoLPrexCEzAcgnWfnjT.png b/docs/ru-RU/manual/ui/actions/static/R5eGbDbcEoLPrexCEzAcgnWfnjT.png new file mode 100644 index 0000000000..05ccd6fb29 Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/R5eGbDbcEoLPrexCEzAcgnWfnjT.png differ diff --git a/docs/ru-RU/manual/ui/actions/static/RDaibir7Jo6NHzx4IuGcYiKLnGb.gif b/docs/ru-RU/manual/ui/actions/static/RDaibir7Jo6NHzx4IuGcYiKLnGb.gif new file mode 100644 index 0000000000..6fe21f650b Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/RDaibir7Jo6NHzx4IuGcYiKLnGb.gif differ diff --git a/docs/ru-RU/manual/ui/actions/static/RUsJb4OBFow7zcxSgKocJN6Fnah.png b/docs/ru-RU/manual/ui/actions/static/RUsJb4OBFow7zcxSgKocJN6Fnah.png new file mode 100644 index 0000000000..4dbda73930 Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/RUsJb4OBFow7zcxSgKocJN6Fnah.png differ diff --git a/docs/ru-RU/manual/ui/actions/static/RZhIbo49lo2vV5xV5hZc0jkfn1d.png b/docs/ru-RU/manual/ui/actions/static/RZhIbo49lo2vV5xV5hZc0jkfn1d.png new file mode 100644 index 0000000000..aef3d62f68 Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/RZhIbo49lo2vV5xV5hZc0jkfn1d.png differ diff --git a/docs/ru-RU/manual/ui/actions/static/SGMubg0mCoVcbSxmOficmvisnHd.png b/docs/ru-RU/manual/ui/actions/static/SGMubg0mCoVcbSxmOficmvisnHd.png new file mode 100644 index 0000000000..7bdf8111c5 Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/SGMubg0mCoVcbSxmOficmvisnHd.png differ diff --git a/docs/ru-RU/manual/ui/actions/static/SHP3b6s7YoabQ2xFO5pc8ZwDnNg.png b/docs/ru-RU/manual/ui/actions/static/SHP3b6s7YoabQ2xFO5pc8ZwDnNg.png new file mode 100644 index 0000000000..7256e94fcb Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/SHP3b6s7YoabQ2xFO5pc8ZwDnNg.png differ diff --git a/docs/ru-RU/manual/ui/actions/static/SU3PbOHyDoPT13xt4n2c785Engd.png b/docs/ru-RU/manual/ui/actions/static/SU3PbOHyDoPT13xt4n2c785Engd.png new file mode 100644 index 0000000000..701372956a Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/SU3PbOHyDoPT13xt4n2c785Engd.png differ diff --git a/docs/ru-RU/manual/ui/actions/static/U9AwbR4ehodjDyxFgdFcjZssn1e.png b/docs/ru-RU/manual/ui/actions/static/U9AwbR4ehodjDyxFgdFcjZssn1e.png new file mode 100644 index 0000000000..0c3e802e20 Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/U9AwbR4ehodjDyxFgdFcjZssn1e.png differ diff --git a/docs/ru-RU/manual/ui/actions/static/U9VCbG9I6ohTzQxzvPIc6oR3nid.png b/docs/ru-RU/manual/ui/actions/static/U9VCbG9I6ohTzQxzvPIc6oR3nid.png new file mode 100644 index 0000000000..889475c16a Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/U9VCbG9I6ohTzQxzvPIc6oR3nid.png differ diff --git a/docs/ru-RU/manual/ui/actions/static/Vz3kbrsk4oikc0xdbt6czL0Tn4b.png b/docs/ru-RU/manual/ui/actions/static/Vz3kbrsk4oikc0xdbt6czL0Tn4b.png new file mode 100644 index 0000000000..6d31a67d2d Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/Vz3kbrsk4oikc0xdbt6czL0Tn4b.png differ diff --git a/docs/ru-RU/manual/ui/actions/static/W7uJbyoy3oyeM1xQKZrc0GxMnhd.png b/docs/ru-RU/manual/ui/actions/static/W7uJbyoy3oyeM1xQKZrc0GxMnhd.png new file mode 100644 index 0000000000..c7922508b7 Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/W7uJbyoy3oyeM1xQKZrc0GxMnhd.png differ diff --git a/docs/ru-RU/manual/ui/actions/static/WQAObL0sUocLRIx1dydcmaOEnQf.png b/docs/ru-RU/manual/ui/actions/static/WQAObL0sUocLRIx1dydcmaOEnQf.png new file mode 100644 index 0000000000..5fb62ae25d Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/WQAObL0sUocLRIx1dydcmaOEnQf.png differ diff --git a/docs/ru-RU/manual/ui/actions/static/WnChbrBPNoBvbFxZcVVccn5wnlg.png b/docs/ru-RU/manual/ui/actions/static/WnChbrBPNoBvbFxZcVVccn5wnlg.png new file mode 100644 index 0000000000..a8e7a0f730 Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/WnChbrBPNoBvbFxZcVVccn5wnlg.png differ diff --git a/docs/ru-RU/manual/ui/actions/static/WqjNbus2yozg3LxpRecccPA5nIb.png b/docs/ru-RU/manual/ui/actions/static/WqjNbus2yozg3LxpRecccPA5nIb.png new file mode 100644 index 0000000000..db5b0718ad Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/WqjNbus2yozg3LxpRecccPA5nIb.png differ diff --git a/docs/ru-RU/manual/ui/actions/static/XbxybS8u3od6TfxiQDYcTMq4n7g.png b/docs/ru-RU/manual/ui/actions/static/XbxybS8u3od6TfxiQDYcTMq4n7g.png new file mode 100644 index 0000000000..a5de56bc5e Binary files /dev/null and b/docs/ru-RU/manual/ui/actions/static/XbxybS8u3od6TfxiQDYcTMq4n7g.png differ diff --git a/docs/ru-RU/manual/ui/actions/submit-to-workflow.md b/docs/ru-RU/manual/ui/actions/submit-to-workflow.md new file mode 100644 index 0000000000..f998b3e13c --- /dev/null +++ b/docs/ru-RU/manual/ui/actions/submit-to-workflow.md @@ -0,0 +1,9 @@ +# Отправить в рабочий процесс + +Действия "Отправить в рабочий процесс" расширяются с помощью подключаемых модулей + +1. Настройка и запуск отправки в рабочий процесс поддерживаются в новых и обновленных формах. +2. При нажатии кнопки может быть запущено несколько рабочих процессов, каждый из которых выбирает свой рабочий процесс и контекст данных (количество данных не ограничено, пользователь гарантирует это). +3. Запуск кнопки формы поддерживает только новый тип рабочего процесса "Событие формы". + +Для получения более подробной информации, пожалуйста, ознакомьтесь с документацией по подключаемому модулю diff --git a/docs/ru-RU/manual/ui/actions/submit.md b/docs/ru-RU/manual/ui/actions/submit.md new file mode 100644 index 0000000000..4e78de1dd8 --- /dev/null +++ b/docs/ru-RU/manual/ui/actions/submit.md @@ -0,0 +1,17 @@ +# Передать данные + +Операция отправки используется для сохранения данных формы (уникальных для данного блока формы). + +![](https://static-docs.nocobase.com/a8dd8cb5a0110c35a1197eb5800a099f.png) + +#### Настройка параметров + +-Метод сохранения: поддерживается только метод сохранения конфигурации для отправки блоков формы в операции <strong> new </strong>. + +![](https://static-docs.nocobase.com/25fc9b88760248e7015673b29b9487f4.png) + +-Рабочий процесс привязки: поддерживает настройку привязки с помощью рабочего процесса, автоматически запускает рабочий процесс после отправки, определяя контекст запускаемых данных, реализует расширенные задачи автоматизации, повышает эффективность обработки данных и управления бизнес-процессами. + +![](https://static-docs.nocobase.com/a77bdff33353fb155b0c919db76e0474.png) + +Для получения более подробной информации, пожалуйста, ознакомьтесь с документацией по использованию рабочего процесса diff --git a/docs/ru-RU/manual/ui/actions/update-record.md b/docs/ru-RU/manual/ui/actions/update-record.md new file mode 100644 index 0000000000..eb89a726b6 --- /dev/null +++ b/docs/ru-RU/manual/ui/actions/update-record.md @@ -0,0 +1,9 @@ +# Обновление данных + +Настройте операцию со строкой для обновления данных и определите содержимое, которое необходимо изменить, присвоив значение полю конфигурации + +![](https://static-docs.nocobase.com/03af47524a4b41742cdeb298b02500eb.png) + +Как показано на рисунке, настройте операцию обновления данных в блоке формы накладной для подтверждения доставки + +![](https://static-docs.nocobase.com/3057b0c6cd176342a15a3892488019fa.gif) diff --git a/docs/ru-RU/manual/ui/actions/view.md b/docs/ru-RU/manual/ui/actions/view.md new file mode 100644 index 0000000000..6384746e3a --- /dev/null +++ b/docs/ru-RU/manual/ui/actions/view.md @@ -0,0 +1,5 @@ +# Проверка + +Операция детализации используется для просмотра подробных сведений о данных, обычно настраивается блок детализации, блок детализации + +![](https://static-docs.nocobase.com/7252f4916033d26551d22ab3e6b95112.png) diff --git a/docs/ru-RU/manual/ui/blocks/index.md b/docs/ru-RU/manual/ui/blocks/index.md new file mode 100644 index 0000000000..4a80cd35d9 --- /dev/null +++ b/docs/ru-RU/manual/ui/blocks/index.md @@ -0,0 +1,88 @@ +# Блоки + +Блоки являются контейнерами для контента, которые могут размещаться на страницах (Page), в диалоговых окнах (Modal) или боковых панелях (Drawer). Несколько блоков можно свободно перетаскивать и упорядочивать. + +## Добавление блоков + +Блоки могут размещаться: +- На страницах (Page) +- В диалоговых окнах (Modal) +- В боковых панелях (Drawer) + +### Блоки на страницах + +Доступные типы блоков на страницах: +1. Блоки данных +2. Блоки фильтрации +3. Другие блоки + +![](https://static-docs.nocobase.com/dad0a394d33dd26f31c3202a76bb0153.png) + +### Блоки во всплывающих окнах (диалогах или боковых панелях) + +Всплывающие окна бывают двух типов: +1. Диалоговые окна (Modal) +2. Боковые панели (Drawer) + +Как и на страницах, в них можно добавлять блоки, но обычно они используются для: +- Добавления одной записи +- Редактирования +- Просмотра + +Типы блоков во всплывающих окнах: +1. Блоки текущих данных +2. Блоки связей +3. Другие блоки + +#### Пример боковой панели (Drawer) +![](https://static-docs.nocobase.com/e18726fb0b52ddab89b9b1a44788f361.png) + +#### Пример диалогового окна (Modal) +![](https://static-docs.nocobase.com/4763fc5fc008bdf3915f84a7e433c0f8.png) + +## Конструктор блоков + +Каждый блок имеет три значка в правом верхнем углу (слева направо): +1. Перетаскивание для изменения расположения +2. Быстрое добавление нового блока +3. Настройка параметров блока + +![](https://static-docs.nocobase.com/b488f3013532a246df59b89c0688a58f.png) + +### Простые блоки +Все настройки сосредоточены в разделе "Параметры блока" (например, Markdown-блоки) + +![](https://static-docs.nocobase.com/f37e277863068b2661f66d4020af806a.png) + +### Сложные блоки данных +Имеют дополнительные встроенные настройки: +- Настройка полей +- Настройка действий + +![](https://static-docs.nocobase.com/71b550da637d23145a5f62d48ee8521b.png) + +Также поддерживают вложенные возможности (например, блоки диаграмм) + +![](https://static-docs.nocobase.com/07588190b3f41ae3060e71d8b76b4447.png) + +## Расположение блоков + +Несколько блоков можно перетаскивать для изменения макета + +![](https://static-docs.nocobase.com/f6692295ac0917f3babce9a60ce80879.gif) + +## Шаблоны блоков + +Блоки данных можно сохранять как шаблоны для последующего использования. Например, форму таблицы данных можно использовать как для добавления, так и для редактирования записей. + +### Как добавлять и использовать шаблоны? +См. [Шаблоны блоков](/handbook/block-template) + +## Типы блоков + +В NocoBase блоки делятся на 4 типа: +1. **Блоки данных** - отображают данные из Collection +2. **Блоки фильтрации** - доступны только на страницах, фильтруют данные в блоках данных +3. **Блоки связей** - доступны только во всплывающих окнах, для операций CRUD со связанными данными +4. **Другие блоки** - независимые блоки (Markdown, журналы аудита, задачи workflow и др.) + diff --git a/docs/ru-RU/manual/ui/blocks/static/BEmxbD2SgoUTDexnYjzcmh7Knhg.png b/docs/ru-RU/manual/ui/blocks/static/BEmxbD2SgoUTDexnYjzcmh7Knhg.png new file mode 100644 index 0000000000..a2479759d1 Binary files /dev/null and b/docs/ru-RU/manual/ui/blocks/static/BEmxbD2SgoUTDexnYjzcmh7Knhg.png differ diff --git a/docs/ru-RU/manual/ui/blocks/static/EicAbMa7Jo2MD9x8FSfcpgTGnHc.png b/docs/ru-RU/manual/ui/blocks/static/EicAbMa7Jo2MD9x8FSfcpgTGnHc.png new file mode 100644 index 0000000000..45698aa228 Binary files /dev/null and b/docs/ru-RU/manual/ui/blocks/static/EicAbMa7Jo2MD9x8FSfcpgTGnHc.png differ diff --git a/docs/ru-RU/manual/ui/blocks/static/ImutbF0YDoWldOxrPilcwQFHnSe.png b/docs/ru-RU/manual/ui/blocks/static/ImutbF0YDoWldOxrPilcwQFHnSe.png new file mode 100644 index 0000000000..32ab59bd33 Binary files /dev/null and b/docs/ru-RU/manual/ui/blocks/static/ImutbF0YDoWldOxrPilcwQFHnSe.png differ diff --git a/docs/ru-RU/manual/ui/blocks/static/JNiLb7rksoY07ox092ycaarenGd.png b/docs/ru-RU/manual/ui/blocks/static/JNiLb7rksoY07ox092ycaarenGd.png new file mode 100644 index 0000000000..d5b5018b25 Binary files /dev/null and b/docs/ru-RU/manual/ui/blocks/static/JNiLb7rksoY07ox092ycaarenGd.png differ diff --git a/docs/ru-RU/manual/ui/blocks/static/L0aJb1V9DoETnNxrr1gcz0g0nDb.png b/docs/ru-RU/manual/ui/blocks/static/L0aJb1V9DoETnNxrr1gcz0g0nDb.png new file mode 100644 index 0000000000..cc7603c71d Binary files /dev/null and b/docs/ru-RU/manual/ui/blocks/static/L0aJb1V9DoETnNxrr1gcz0g0nDb.png differ diff --git a/docs/ru-RU/manual/ui/blocks/static/OpBcbf9UlooZ5UxZDwwcHZi8nWf.png b/docs/ru-RU/manual/ui/blocks/static/OpBcbf9UlooZ5UxZDwwcHZi8nWf.png new file mode 100644 index 0000000000..717d3ea48e Binary files /dev/null and b/docs/ru-RU/manual/ui/blocks/static/OpBcbf9UlooZ5UxZDwwcHZi8nWf.png differ diff --git a/docs/ru-RU/manual/ui/blocks/static/PSD8bf1fzoZkIUxJW7lc4XuGnee.png b/docs/ru-RU/manual/ui/blocks/static/PSD8bf1fzoZkIUxJW7lc4XuGnee.png new file mode 100644 index 0000000000..b8aeaf4f3a Binary files /dev/null and b/docs/ru-RU/manual/ui/blocks/static/PSD8bf1fzoZkIUxJW7lc4XuGnee.png differ diff --git a/docs/ru-RU/manual/ui/blocks/static/Tvjfb4qr4osyzxxPKdRcfn1knsd.png b/docs/ru-RU/manual/ui/blocks/static/Tvjfb4qr4osyzxxPKdRcfn1knsd.png new file mode 100644 index 0000000000..77c986e9d2 Binary files /dev/null and b/docs/ru-RU/manual/ui/blocks/static/Tvjfb4qr4osyzxxPKdRcfn1knsd.png differ diff --git a/docs/ru-RU/manual/ui/blocks/static/Uo6ubaMwFo5bi1xVMU5cshlTn1g.png b/docs/ru-RU/manual/ui/blocks/static/Uo6ubaMwFo5bi1xVMU5cshlTn1g.png new file mode 100644 index 0000000000..4abc2a9a88 Binary files /dev/null and b/docs/ru-RU/manual/ui/blocks/static/Uo6ubaMwFo5bi1xVMU5cshlTn1g.png differ diff --git a/docs/ru-RU/manual/ui/blocks/static/XjdHbvC9ZotdQAx8GJoczwoancc.gif b/docs/ru-RU/manual/ui/blocks/static/XjdHbvC9ZotdQAx8GJoczwoancc.gif new file mode 100644 index 0000000000..a43b0c6712 Binary files /dev/null and b/docs/ru-RU/manual/ui/blocks/static/XjdHbvC9ZotdQAx8GJoczwoancc.gif differ diff --git a/docs/ru-RU/manual/ui/fields/association-components/cascade-select/index.md b/docs/ru-RU/manual/ui/fields/association-components/cascade-select/index.md new file mode 100644 index 0000000000..aa7de97b1f --- /dev/null +++ b/docs/ru-RU/manual/ui/fields/association-components/cascade-select/index.md @@ -0,0 +1,15 @@ +# Каскадный переключатель + +Каскадный селектор используется для обеспечения удобного метода выбора данных, когда целевой таблицей реляционного поля является древовидная таблица.Выберите соответствующие элементы данных в соответствии с иерархической структурой данных древовидной таблицы.Поддержка поиска и фильтрации вспомогательных данных + +Например, в модели приложения для управления задачами в таблице задач есть связанные поля "отдел" (соотношение "многие ко многим") и "проект" (соотношение "многие к одному"). Таблица отдела и таблица проекта являются древовидными таблицами. + +- Связь является взаимно однозначной, а каскад - это единственный выбор + +![](https://static-docs.nocobase.com/3f8ad42c318ebf6b6c1367da33f4e235.png) + +-Связь "многие ко многим", каскадный выбор с несколькими параметрами и поддерживается сортировка перетаскиванием + +![](https://static-docs.nocobase.com/2a4f58986712b073d69a33f17f1d44fc.png) + +![](https://static-docs.nocobase.com/02fec13f436d55108a7328a0716cdfde.png) diff --git a/docs/ru-RU/manual/ui/fields/association-components/cascade-select/static/GjqEbeQ8IoFUFtxeS8cc16Fjnac.png b/docs/ru-RU/manual/ui/fields/association-components/cascade-select/static/GjqEbeQ8IoFUFtxeS8cc16Fjnac.png new file mode 100644 index 0000000000..73cce55c6f Binary files /dev/null and b/docs/ru-RU/manual/ui/fields/association-components/cascade-select/static/GjqEbeQ8IoFUFtxeS8cc16Fjnac.png differ diff --git a/docs/ru-RU/manual/ui/fields/association-components/cascade-select/static/OHftb05waogIjzxjUgNcfUIan8f.png b/docs/ru-RU/manual/ui/fields/association-components/cascade-select/static/OHftb05waogIjzxjUgNcfUIan8f.png new file mode 100644 index 0000000000..118bff0fc4 Binary files /dev/null and b/docs/ru-RU/manual/ui/fields/association-components/cascade-select/static/OHftb05waogIjzxjUgNcfUIan8f.png differ diff --git a/docs/ru-RU/manual/ui/fields/association-components/cascade-select/static/ZOtzbc1BOoailOxdK41cnJvvnjd.png b/docs/ru-RU/manual/ui/fields/association-components/cascade-select/static/ZOtzbc1BOoailOxdK41cnJvvnjd.png new file mode 100644 index 0000000000..7a435aa0ff Binary files /dev/null and b/docs/ru-RU/manual/ui/fields/association-components/cascade-select/static/ZOtzbc1BOoailOxdK41cnJvvnjd.png differ diff --git a/docs/ru-RU/manual/ui/fields/association-components/file-manager/index.md b/docs/ru-RU/manual/ui/fields/association-components/file-manager/index.md new file mode 100644 index 0000000000..fdaec1d942 --- /dev/null +++ b/docs/ru-RU/manual/ui/fields/association-components/file-manager/index.md @@ -0,0 +1,12 @@ +# Файловый менеджер + +Файловый менеджер - это компонент реляционного поля, который специально используется для обработки реляционной целевой таблицы в виде файловой таблицы. + +Например, в модели приложения для управления задачами в таблице задач есть поле взаимосвязи "вложение" (взаимно однозначное). Когда целевой таблицей поля взаимосвязи является таблица файлов, компонентом поля по умолчанию является файловый менеджер. + +![](https://static-docs.nocobase.com/96c15ff2a8b13797a6c7b675f2a5ad7a.png) + +Файлами вложений, связанными с текущей задачей, можно управлять с помощью компонента файлового менеджера. + +-Загрузите новый файл с помощью кнопки загрузить и свяжите его после добавления (быстрая загрузка). +-Нажмите кнопку Выбрать, чтобы выбрать вложение, которое вы хотите связать, из списка существующих вложений (выберите файл). diff --git a/docs/ru-RU/manual/ui/fields/association-components/file-manager/static/PmuLburnvoPOwfxXOcNcFYxdnId.png b/docs/ru-RU/manual/ui/fields/association-components/file-manager/static/PmuLburnvoPOwfxXOcNcFYxdnId.png new file mode 100644 index 0000000000..263ba31899 Binary files /dev/null and b/docs/ru-RU/manual/ui/fields/association-components/file-manager/static/PmuLburnvoPOwfxXOcNcFYxdnId.png differ diff --git a/docs/ru-RU/manual/ui/fields/association-components/index.md b/docs/ru-RU/manual/ui/fields/association-components/index.md new file mode 100644 index 0000000000..7af82738f8 --- /dev/null +++ b/docs/ru-RU/manual/ui/fields/association-components/index.md @@ -0,0 +1,45 @@ +# Компоненты полей отношений + +Компоненты полей отношений в NocoBase предназначены для удобного отображения и обработки связанных данных. Независимо от типа связи, эти компоненты обладают гибкостью и универсальностью, позволяя пользователям выбирать и настраивать их в соответствии с конкретными потребностями. + +### Краткое описание использования + +1. **Выпадающий список (Dropdown)** + - Позволяет **выбрать или создать** один или несколько вариантов из выпадающего списка. + - **Подходит для всех типов отношений**, поддерживает настройку поля заголовка в списке. + +2. **Селектор данных (Data Picker)** + - Позволяет **выбрать или создать** один или несколько вариантов из связанных данных. + - **Подходит для всех типов отношений**, можно настроить отображение информации в списке выбора. + +3. **Каскадный выбор (Cascader)** + - Используется для данных, связанных с **древовидной структурой (tree table)**, позволяя выбирать данные по уровням иерархии. + +4. **Подформа / Подробности (Subform / Sub-details)** + - Отображает данные связанных записей в текущей форме или на странице деталей. + - Позволяет просматривать и редактировать связанные данные без перехода на другие страницы, улучшая UX. + - **Подходит для всех типов отношений**, включая вложенные структуры данных (настройте расположение для удобства). + +5. **Подтаблица (Sub-table)** + - В режиме редактирования позволяет **создавать / изменять** связанные данные напрямую. + - **Подходит для отношений «один ко многим» и «многие ко многим»**, но не поддерживает выбор существующих связей. + +6. **Подформа в модальном окне (Subform in Modal)** + - Позволяет вынести дополнительные или сложные поля в модальное окно, упрощая основную форму. + - Решает проблему перегруженности форм при сложных иерархиях данных. + - Подходит для сценариев с большим количеством полей или многоуровневыми связями. + +7. **Теги (Tags)** + - Позволяет категоризировать и маркировать данные, визуально выделяя связи. + - Подходит для группировки данных по категориям. + +8. **Файловый менеджер (File Manager)** + - Позволяет **загружать или выбирать** файлы, связанные с текущей записью. + - **Подходит только для отношений с таблицей файлов**. + +9. **Заголовок (Title)** + - Отображает связанную запись в режиме просмотра (по умолчанию для всех полей отношений). + - **Подходит для всех типов отношений**, стандартное поле заголовка — `id`, но можно настроить свое. + +### Заключение +Эти компоненты позволяют адаптировать интерфейс для отображения и работы с данными, улучшая пользовательский опыт. Выбор компонента зависит от бизнес-задач и типа связи. Дополнительные функции полей отношений можно изучить в системе и оставить обратную связь. diff --git a/docs/ru-RU/manual/ui/fields/association-components/record-picker/index.md b/docs/ru-RU/manual/ui/fields/association-components/record-picker/index.md new file mode 100644 index 0000000000..eb58d6b9e3 --- /dev/null +++ b/docs/ru-RU/manual/ui/fields/association-components/record-picker/index.md @@ -0,0 +1,15 @@ +# Селектор данных + +Селектор данных используется для выбора одного или нескольких параметров из связанных данных.Он похож на выпадающий селектор, но обеспечивает большую гибкость и функциональность, позволяя пользователям более точно выбирать связанные данные, а в селекторе данных можно настроить больше связанных информационных полей (реляционные данные), чтобы облегчить пользователям точный выбор данных. + +-Выберите соответствующие данные с помощью селектора данных + +![](https://static-docs.nocobase.com/4e21501fb12e3a44405988d2d33e7bd4.png) + +Селектор данных отображает реляционные данные в виде всплывающих окон, а в блоке таблицы можно настроить дополнительные поля целевой таблицы. + +![](https://static-docs.nocobase.com/c4724501b0ad2d5d683782236de13b9d.png) + +-С помощью селектора данных вы можете не только выбирать связанные данные, но и дополнительно управлять целевой таблицей (добавлять, удалять, импортировать и экспортировать и т.д.). + +![](https://static-docs.nocobase.com/ca460a7aa9f0c7ca3bca28cc287979a3.png) diff --git a/docs/ru-RU/manual/ui/fields/association-components/record-picker/static/DVSobGGxuoBncUxwz7Oc6MJfn5C.png b/docs/ru-RU/manual/ui/fields/association-components/record-picker/static/DVSobGGxuoBncUxwz7Oc6MJfn5C.png new file mode 100644 index 0000000000..6b7ec4a332 Binary files /dev/null and b/docs/ru-RU/manual/ui/fields/association-components/record-picker/static/DVSobGGxuoBncUxwz7Oc6MJfn5C.png differ diff --git a/docs/ru-RU/manual/ui/fields/association-components/record-picker/static/UyHLbOe4YoH5sBxTPFJcBhrxnme.png b/docs/ru-RU/manual/ui/fields/association-components/record-picker/static/UyHLbOe4YoH5sBxTPFJcBhrxnme.png new file mode 100644 index 0000000000..b977b80841 Binary files /dev/null and b/docs/ru-RU/manual/ui/fields/association-components/record-picker/static/UyHLbOe4YoH5sBxTPFJcBhrxnme.png differ diff --git a/docs/ru-RU/manual/ui/fields/association-components/record-picker/static/VEhzbnCSfooc1jxDr7EcGV4enaf.png b/docs/ru-RU/manual/ui/fields/association-components/record-picker/static/VEhzbnCSfooc1jxDr7EcGV4enaf.png new file mode 100644 index 0000000000..4fe56c3419 Binary files /dev/null and b/docs/ru-RU/manual/ui/fields/association-components/record-picker/static/VEhzbnCSfooc1jxDr7EcGV4enaf.png differ diff --git a/docs/ru-RU/manual/ui/fields/association-components/select/index.md b/docs/ru-RU/manual/ui/fields/association-components/select/index.md new file mode 100644 index 0000000000..6d50380165 --- /dev/null +++ b/docs/ru-RU/manual/ui/fields/association-components/select/index.md @@ -0,0 +1,29 @@ +# Выпадающий селектор (Dropdown Selector) + +Выпадающий селектор является стандартным компонентом для полей связей. Для всех типов связей (кроме связей с таблицей файлов) это компонент по умолчанию в режиме редактирования. Позволяет выбирать существующие записи из связанной таблицы или создавать новые записи с автоматической привязкой. + +Например, в приложении управления задачами, в таблице "Задачи" есть поле связи "Ответственный" (многие к одному): + +### 1. Выбор существующей записи +Возможность выбрать связанную запись из существующих данных целевой таблицы. + +![](https://static-docs.nocobase.com/3b6cca8f0ffefbae76cab9260e3cf991.png) + +### 2. Создание новой записи с привязкой +Прямое создание новой записи в целевой таблице с автоматической привязкой. Доступно два способа создания: + +**a) Создание через выпадающее меню** +После успешного создания запись автоматически выбирается. Требуется настройка поля заголовка. + +![](https://static-docs.nocobase.com/67de33d271534826d756593d03d30d7b.png) + +Пример: +![](https://static-docs.nocobase.com/697202774f114f60888ed56ba97ae04a.gif) + +**b) Создание через модальное окно** +После успешного создания запись автоматически выбирается. + +![](https://static-docs.nocobase.com/af5c283ae21e794bf310e9851fef6211.gif) + +### Ограничения +Во многих сценариях требуется отображать данные из связанных таблиц, но выпадающий селектор может отображать только простые поля целевой таблицы. Для отображения данных из связей второго уровня требуется настройка компонента "Селектор данных". diff --git a/docs/ru-RU/manual/ui/fields/association-components/select/static/AWz1bGNV3oTl8UxyXbNcFRXsnDe.png b/docs/ru-RU/manual/ui/fields/association-components/select/static/AWz1bGNV3oTl8UxyXbNcFRXsnDe.png new file mode 100644 index 0000000000..d29c261ff3 Binary files /dev/null and b/docs/ru-RU/manual/ui/fields/association-components/select/static/AWz1bGNV3oTl8UxyXbNcFRXsnDe.png differ diff --git a/docs/ru-RU/manual/ui/fields/association-components/select/static/CZYAbOp1Ho6HxYxwxuyclVDxnBf.gif b/docs/ru-RU/manual/ui/fields/association-components/select/static/CZYAbOp1Ho6HxYxwxuyclVDxnBf.gif new file mode 100644 index 0000000000..0839047835 Binary files /dev/null and b/docs/ru-RU/manual/ui/fields/association-components/select/static/CZYAbOp1Ho6HxYxwxuyclVDxnBf.gif differ diff --git a/docs/ru-RU/manual/ui/fields/association-components/select/static/DbUxbR6jFoJ1jWx2BVYc2WkFnQh.gif b/docs/ru-RU/manual/ui/fields/association-components/select/static/DbUxbR6jFoJ1jWx2BVYc2WkFnQh.gif new file mode 100644 index 0000000000..601b792dc5 Binary files /dev/null and b/docs/ru-RU/manual/ui/fields/association-components/select/static/DbUxbR6jFoJ1jWx2BVYc2WkFnQh.gif differ diff --git a/docs/ru-RU/manual/ui/fields/association-components/select/static/ZIOdbT8nGoNAqZxqsmAcbAITnAg.png b/docs/ru-RU/manual/ui/fields/association-components/select/static/ZIOdbT8nGoNAqZxqsmAcbAITnAg.png new file mode 100644 index 0000000000..7e71a0482d Binary files /dev/null and b/docs/ru-RU/manual/ui/fields/association-components/select/static/ZIOdbT8nGoNAqZxqsmAcbAITnAg.png differ diff --git a/docs/ru-RU/manual/ui/fields/association-components/sub-detail/index.md b/docs/ru-RU/manual/ui/fields/association-components/sub-detail/index.md new file mode 100644 index 0000000000..7751b7f608 --- /dev/null +++ b/docs/ru-RU/manual/ui/fields/association-components/sub-detail/index.md @@ -0,0 +1,5 @@ +# Дочерние сведения + +Подчиненная форма является соответствующим компонентом подчиненной формы в режиме чтения и поддерживает вложенное отображение многоуровневых реляционных данных. + +![](https://static-docs.nocobase.com/0e7b58c1eebb646530d77d9700b28dcf.png) diff --git a/docs/ru-RU/manual/ui/fields/association-components/sub-detail/static/TI2Mbl7dDotd9BxJt6ucXr2OnPc.png b/docs/ru-RU/manual/ui/fields/association-components/sub-detail/static/TI2Mbl7dDotd9BxJt6ucXr2OnPc.png new file mode 100644 index 0000000000..555e707db3 Binary files /dev/null and b/docs/ru-RU/manual/ui/fields/association-components/sub-detail/static/TI2Mbl7dDotd9BxJt6ucXr2OnPc.png differ diff --git a/docs/ru-RU/manual/ui/fields/association-components/sub-form(popover)/index.md b/docs/ru-RU/manual/ui/fields/association-components/sub-form(popover)/index.md new file mode 100644 index 0000000000..8dfee2011f --- /dev/null +++ b/docs/ru-RU/manual/ui/fields/association-components/sub-form(popover)/index.md @@ -0,0 +1,17 @@ +# Вспомогательная форма (всплывающее окно) + +Вспомогательная форма (всплывающее окно) - это компонент реляционного поля, используемый для оптимизации сложных сценариев ввода данных.Из-за сложных уровней взаимосвязи и большого количества полей данных структура вложенной формы может показаться длинной и запутанной, что затрудняет эффективное представление первичной и вторичной взаимосвязи данных.Переместите некоторые некритичные или менее часто используемые поля данных из основной формы в отдельное всплывающее окно для заполнения. Основная форма может быть больше ориентирована на отображение наиболее важной информации, в то время как вспомогательная форма используется для хранения второстепенной информации или данных, требующих сложных ассоциаций.Пользователи могут вводить соответствующую информацию более целенаправленно, не беспокоясь о многословии основной формы. + +Вспомогательная форма (всплывающее окно) не только упрощает оформление формы, но и эффективно решает проблему, связанную с тем, что реляционные поля во вспомогательной форме не могут напрямую заполнять данные. + +![](https://static-docs.nocobase.com/a386b9333964279e1234e05e53df57ed.gif) + +-Настройте поле заголовка для управления внешним отображаемым полем + +![](https://static-docs.nocobase.com/e899ff37d80f70c254052441bf7446df.png) + +-Поля взаимосвязи во вложенной форме также могут быть заполнены данными взаимосвязи с помощью вложенной формы (всплывающее окно). + +![](https://static-docs.nocobase.com/531504bdf10c107cdbc9def08cdccf0c.gif) + +Конфигурация многоуровневых реляционных полей также поддерживается внутри вспомогательной формы (всплывающего окна), которая может быть настроена в соответствии с реальной ситуацией. diff --git a/docs/ru-RU/manual/ui/fields/association-components/sub-form(popover)/static/NEQRbYpxSoy3AyxgiC5cWOSRnFd.png b/docs/ru-RU/manual/ui/fields/association-components/sub-form(popover)/static/NEQRbYpxSoy3AyxgiC5cWOSRnFd.png new file mode 100644 index 0000000000..42199cafdb Binary files /dev/null and b/docs/ru-RU/manual/ui/fields/association-components/sub-form(popover)/static/NEQRbYpxSoy3AyxgiC5cWOSRnFd.png differ diff --git a/docs/ru-RU/manual/ui/fields/association-components/sub-form(popover)/static/UTzwbpNczoCK0kxtFPhcGYoKneb.gif b/docs/ru-RU/manual/ui/fields/association-components/sub-form(popover)/static/UTzwbpNczoCK0kxtFPhcGYoKneb.gif new file mode 100644 index 0000000000..05b4dc0153 Binary files /dev/null and b/docs/ru-RU/manual/ui/fields/association-components/sub-form(popover)/static/UTzwbpNczoCK0kxtFPhcGYoKneb.gif differ diff --git a/docs/ru-RU/manual/ui/fields/association-components/sub-form(popover)/static/ZHqsbWKTYoMjZ4xX0rKc5ff2ndk.gif b/docs/ru-RU/manual/ui/fields/association-components/sub-form(popover)/static/ZHqsbWKTYoMjZ4xX0rKc5ff2ndk.gif new file mode 100644 index 0000000000..f0b28ba90d Binary files /dev/null and b/docs/ru-RU/manual/ui/fields/association-components/sub-form(popover)/static/ZHqsbWKTYoMjZ4xX0rKc5ff2ndk.gif differ diff --git a/docs/ru-RU/manual/ui/fields/association-components/sub-form/index.md b/docs/ru-RU/manual/ui/fields/association-components/sub-form/index.md new file mode 100644 index 0000000000..496b61c06a --- /dev/null +++ b/docs/ru-RU/manual/ui/fields/association-components/sub-form/index.md @@ -0,0 +1,11 @@ +# Подчиненная форма + +Если вы хотите обрабатывать реляционные данные глубокого уровня, использовать select и data selector неудобно. Для работы вам нужно открыть всплывающее окно. Слишком много кликов, что очень громоздко; и вспомогательная форма предназначена для оптимизации этого сценария, чтобы пользователи могли можно напрямую поддерживать связанную информацию на текущей странице, а многослойная взаимосвязь отображается в виде вложенных форм. + +Поддержка вложенного отображения многослойных реляционных полей + +![](https://static-docs.nocobase.com/966964d3f3ade50d9af03baed79247cf.png) + +Вы можете настроить, следует ли отображать заголовок, и настроить макет + +![](https://static-docs.nocobase.com/6b375a39b4b1cba4033f92736c3676f3.png) diff --git a/docs/ru-RU/manual/ui/fields/association-components/sub-form/static/U7DXb1zmYo7MOLxASIaciyk6nUc.png b/docs/ru-RU/manual/ui/fields/association-components/sub-form/static/U7DXb1zmYo7MOLxASIaciyk6nUc.png new file mode 100644 index 0000000000..08ff68697c Binary files /dev/null and b/docs/ru-RU/manual/ui/fields/association-components/sub-form/static/U7DXb1zmYo7MOLxASIaciyk6nUc.png differ diff --git a/docs/ru-RU/manual/ui/fields/association-components/sub-form/static/W0KVbjO2Qo7vDwxHlwpcj6ionhf.png b/docs/ru-RU/manual/ui/fields/association-components/sub-form/static/W0KVbjO2Qo7vDwxHlwpcj6ionhf.png new file mode 100644 index 0000000000..b2cfe4b5f0 Binary files /dev/null and b/docs/ru-RU/manual/ui/fields/association-components/sub-form/static/W0KVbjO2Qo7vDwxHlwpcj6ionhf.png differ diff --git a/docs/ru-RU/manual/ui/fields/association-components/sub-table/index.md b/docs/ru-RU/manual/ui/fields/association-components/sub-table/index.md new file mode 100644 index 0000000000..940f911f8e --- /dev/null +++ b/docs/ru-RU/manual/ui/fields/association-components/sub-table/index.md @@ -0,0 +1,33 @@ +# Подтаблица (Sub-table) + +Подтаблица отображает записи отношений **«один ко многим» или «многие ко многим»** в табличном формате. Она предоставляет четкий и структурированный способ просмотра и управления связанными данными: каждая строка представляет связанную запись, а каждый столбец — отдельное поле записи. + +![](https://static-docs.nocobase.com/b727c98fea5ca42b2e040aca2ab835f7.png) + +### Пример использования +В модели приложения для управления задачами в таблице «Задачи» есть поле связи **«История согласований»** (один ко многим). + +--- + +### 1. Подтаблица в режиме редактирования + +![](https://static-docs.nocobase.com/e8bb178a3e6f284823638b6aa150ea0a.png) + +- Поля в подтаблице отображаются с разными компонентами в зависимости от их типа. +- Большие поля (например, Rich Text, JSON, многострочный текст) редактируются во всплывающем окне. + +![](https://static-docs.nocobase.com/64abfb139e4f00d4bd093f33d57a6849.png) + +- Поля связей по умолчанию используют **выпадающий список**, но можно изменить на: + - Селектор данных + - Подформу в модальном окне + +![](https://static-docs.nocobase.com/6a6094b3b66cc87f1efc65266fbbb176.png) + +--- + +### 2. Подтаблица в режиме просмотра + +![](https://static-docs.nocobase.com/9ca7b2a0e2e9d919db668cbf3224eb41.png) + +В этом режиме данные отображаются только для чтения, сохраняя табличную структуру для удобного просмотра. diff --git a/docs/ru-RU/manual/ui/fields/association-components/sub-table/static/AwLMboMECoBBmIxBHcmcuT9xnAe.png b/docs/ru-RU/manual/ui/fields/association-components/sub-table/static/AwLMboMECoBBmIxBHcmcuT9xnAe.png new file mode 100644 index 0000000000..31bc5d4587 Binary files /dev/null and b/docs/ru-RU/manual/ui/fields/association-components/sub-table/static/AwLMboMECoBBmIxBHcmcuT9xnAe.png differ diff --git a/docs/ru-RU/manual/ui/fields/association-components/sub-table/static/GgBUbe5ZIoT7ojxqV4Pcwz8gn5g.png b/docs/ru-RU/manual/ui/fields/association-components/sub-table/static/GgBUbe5ZIoT7ojxqV4Pcwz8gn5g.png new file mode 100644 index 0000000000..79c039e56d Binary files /dev/null and b/docs/ru-RU/manual/ui/fields/association-components/sub-table/static/GgBUbe5ZIoT7ojxqV4Pcwz8gn5g.png differ diff --git a/docs/ru-RU/manual/ui/fields/association-components/sub-table/static/QDq8b1umdokplcxVwjFcmvecntb.png b/docs/ru-RU/manual/ui/fields/association-components/sub-table/static/QDq8b1umdokplcxVwjFcmvecntb.png new file mode 100644 index 0000000000..ca86bddccc Binary files /dev/null and b/docs/ru-RU/manual/ui/fields/association-components/sub-table/static/QDq8b1umdokplcxVwjFcmvecntb.png differ diff --git a/docs/ru-RU/manual/ui/fields/association-components/sub-table/static/WJ45buLjoohisGx7uX2cBOJpnrg.png b/docs/ru-RU/manual/ui/fields/association-components/sub-table/static/WJ45buLjoohisGx7uX2cBOJpnrg.png new file mode 100644 index 0000000000..d5fd2d7d73 Binary files /dev/null and b/docs/ru-RU/manual/ui/fields/association-components/sub-table/static/WJ45buLjoohisGx7uX2cBOJpnrg.png differ diff --git a/docs/ru-RU/manual/ui/fields/association-components/sub-table/static/YGLGbcWiJo6tHcxY7jrcfKumnSh.png b/docs/ru-RU/manual/ui/fields/association-components/sub-table/static/YGLGbcWiJo6tHcxY7jrcfKumnSh.png new file mode 100644 index 0000000000..1ba6bc59e7 Binary files /dev/null and b/docs/ru-RU/manual/ui/fields/association-components/sub-table/static/YGLGbcWiJo6tHcxY7jrcfKumnSh.png differ diff --git a/docs/ru-RU/manual/ui/fields/association-components/summary/index.md b/docs/ru-RU/manual/ui/fields/association-components/summary/index.md new file mode 100644 index 0000000000..5d3eafa67f --- /dev/null +++ b/docs/ru-RU/manual/ui/fields/association-components/summary/index.md @@ -0,0 +1,17 @@ +# Компонент реляционного поля + +Компонент реляционных полей NocoBase предназначен для того, чтобы помочь пользователям лучше отображать и обрабатывать связанные данные.Независимо от типа взаимосвязи, эти компоненты являются гибкими и универсальными, и пользователи могут выбирать и настраивать их в соответствии с конкретными потребностями. + +#### Краткое описание использования + +1. Выпадающий селектор: Используется для выбора или создания одного или нескольких параметров из выпадающего списка. **Применимо ко всем типам отношений** , поддерживает настройку поля заголовка выпадающего списка. +2. Селектор данных: используется для выбора или создания одного или нескольких параметров из связанных данных. **Применимо ко всем типам отношений**. При настройке и использовании вы можете настроить отображение информации в списке выбора +3. Каскадный селектор: используется для реляционных данных, целевой таблицей которых является древовидная таблица, и позволяет выбирать данные слой за слоем в соответствии с древовидной структурой. +4. Вспомогательная форма/дополнительные сведения: используется для отображения данных связанной записи в текущей форме или на странице сведений. Это обеспечивает удобный вложенный способ просмотра и редактирования подробной информации о связанных данных без перехода на другие страницы, обеспечивая более плавный и эффективный пользовательский интерфейс. **Подходит для всех типов отношений.** Многослойные реляционные данные могут отображаться во вложенном виде, обратите внимание на настройки макета при настройке и использовании. +5. Вложенная таблица: В состоянии редактирования вложенная таблица поддерживает прямое **создание/редактирование** реляционных данных, **Подходит для типов отношений "один ко многим" или "многие ко многим"**, а выбор ассоциаций в настоящее время не поддерживается. +6. Вспомогательная форма (всплывающее окно): За счет размещения дополнительных или сложных полей данных во всплывающем окне оптимизируется расположение основной формы, что делает интерфейс более лаконичным и интуитивно понятным. Это решает проблему многословия форм на уровне сложных взаимосвязей и улучшает взаимодействие с пользователем. Она подходит для сценариев с большим количеством полей данных и сложными уровнями взаимосвязи. Заполняйте дополнительную информацию отдельно от основной, чтобы повысить доступность формы. +7. Метка: Благодаря настройке компонента метки для поля взаимосвязи осуществляется классификация и идентификация данных, а взаимосвязь данных может отображаться более интуитивно. Это подходит для сценариев, когда данные необходимо сгруппировать по категориям. +8. Файловый менеджер: Используется для прямой загрузки или выбора файлов, связанных с текущей записью. **Применимо к типам связей, где целевой таблицей является файловая таблица**. +9. Название: Используется для отображения связанных записей в режиме чтения и является компонентом поля по умолчанию в состоянии чтения всех реляционных полей. **Применимо ко всем типам отношений**.При настройке и использовании полем заголовка по умолчанию является id, и поддерживается пользовательская настройка поля заголовка. + +Используя эти полевые компоненты, можно настроить и оптимизировать интерфейс для отображения данных и работы с ними, чтобы обеспечить лучший пользовательский опыт.В соответствии с конкретными потребностями бизнеса и типами взаимоотношений выберите соответствующие компоненты поля.В системе можно ознакомиться с функциями большего количества связанных полей и обеспечить обратную связь. diff --git a/docs/ru-RU/manual/ui/fields/association-components/tag/index.md b/docs/ru-RU/manual/ui/fields/association-components/tag/index.md new file mode 100644 index 0000000000..8b2753da72 --- /dev/null +++ b/docs/ru-RU/manual/ui/fields/association-components/tag/index.md @@ -0,0 +1,9 @@ +# Метка + +Метки - это компоненты, используемые для лучшей классификации и идентификации реляционной информации при отображении данных.Упростите пользователям идентификацию различных категорий данных, повысьте эффективность просмотра и понимание данных. В модели приложения для управления задачами в таблице задач есть поле взаимосвязи "Ход выполнения задачи" (отношение "один ко многим") + +-Необходимо настроить цветовое поле этикетки (выбрать из целевой таблицы) + +![](https://static-docs.nocobase.com/7f436d6de401aaa13f1d8a876aedac07.png) + +![](https://static-docs.nocobase.com/3f62febe926d5650a587b979a5db8f8f.png) diff --git a/docs/ru-RU/manual/ui/fields/association-components/tag/static/HC7jbnrqNo9vXexyLXecSA30nqd.png b/docs/ru-RU/manual/ui/fields/association-components/tag/static/HC7jbnrqNo9vXexyLXecSA30nqd.png new file mode 100644 index 0000000000..b9e8236718 Binary files /dev/null and b/docs/ru-RU/manual/ui/fields/association-components/tag/static/HC7jbnrqNo9vXexyLXecSA30nqd.png differ diff --git a/docs/ru-RU/manual/ui/fields/association-components/tag/static/HPzlbp2WooC0gix1FUWcmZVfnBf.png b/docs/ru-RU/manual/ui/fields/association-components/tag/static/HPzlbp2WooC0gix1FUWcmZVfnBf.png new file mode 100644 index 0000000000..6233b6f63f Binary files /dev/null and b/docs/ru-RU/manual/ui/fields/association-components/tag/static/HPzlbp2WooC0gix1FUWcmZVfnBf.png differ diff --git a/docs/ru-RU/manual/ui/fields/association-components/title/index.md b/docs/ru-RU/manual/ui/fields/association-components/title/index.md new file mode 100644 index 0000000000..99a81dde6c --- /dev/null +++ b/docs/ru-RU/manual/ui/fields/association-components/title/index.md @@ -0,0 +1,5 @@ +# Заголовок + +Компонент заголовка обеспечивает понятный и лаконичный способ отображения ключевой информации, относящейся к текущей записи, в режиме чтения. В подробном режиме компонентом по умолчанию для полей связи является заголовок. Поле заголовка по умолчанию — идентификатор, также поддерживаются настраиваемые поля заголовка. + +![](https://static-docs.nocobase.com/f669435871fe9465680a9200d81d925f.png) diff --git a/docs/ru-RU/manual/ui/fields/association-components/title/static/H97TbGjbwonXIPxctydchPdSnud.png b/docs/ru-RU/manual/ui/fields/association-components/title/static/H97TbGjbwonXIPxctydchPdSnud.png new file mode 100644 index 0000000000..cbcb8e240b Binary files /dev/null and b/docs/ru-RU/manual/ui/fields/association-components/title/static/H97TbGjbwonXIPxctydchPdSnud.png differ diff --git a/docs/ru-RU/manual/ui/fields/index.md b/docs/ru-RU/manual/ui/fields/index.md new file mode 100644 index 0000000000..1d97b369b4 --- /dev/null +++ b/docs/ru-RU/manual/ui/fields/index.md @@ -0,0 +1,67 @@ +# Обзор + +В пользовательском интерфейсе (UI) поля являются компонентами полей и представляют собой носители единичных данных. Данные разных типов отображаются с помощью различных компонентов полей. Поля могут существовать только в составе блоков и не могут использоваться отдельно. + +## Поля в блоках + +Поля обычно не используются самостоятельно, а являются дочерними элементами блоков данных. Блоки данных обычно имеют функцию «Конфигурация полей», а список полей предоставляется текущей таблицей данных. + +![Изображение](https://static-docs.nocobase.com/c5ea18ad1847332fe78075413f23de46.png) + +## Дизайнер полей (панель инструментов) + +Как и у блоков, в правом верхнем углу компонента поля расположены три иконки: + +- Перетаскивание для изменения макета +- Быстрое добавление поля +- Настройка параметров поля + +![Изображение](https://static-docs.nocobase.com/30cc5fcaeeb171862f79449a72a7fcf9.png) + +## Макет полей + +С помощью перетаскивания можно настраивать расположение полей в блоке. + +![GIF](https://static-docs.nocobase.com/0825ea8c014c9073f505e74f707ded66.gif) + +## Общие параметры конфигурации + +- Редактирование заголовка поля +- Отображение заголовка +- Редактирование описания +- Обязательное поле +- Правила валидации +- Значение по умолчанию +- Режим отображения + +![Изображение](https://static-docs.nocobase.com/cbb838c9e167f51636d6a0ad3b287b59.png) + +Описание важных параметров конфигурации: + +### Правила валидации + +(Ожидается дополнение) + +### Значение по умолчанию + +(Ожидается дополнение) + +### Режим отображения + +В отличие от блоков, компоненты полей имеют три режима отображения: + +- **Редактируемый** (editable) +- **Только для чтения** (не редактируемый, readonly) +- **Только для чтения (удобный для чтения)** (read friendly) + +### Компоненты полей + +Некоторые поля поддерживают переключение на другие компоненты, например, компонент `URL` можно переключить на компонент `Preview`. + +![20240806164801](https://static-docs.nocobase.com/20240806164801.png) + +Если вам нужно расширить функциональность компонентов, обратитесь к [Расширение компонентов полей с значениями](/plugin-samples/field/value). + +## Типы полей + +Поля блока предоставляются таблицей данных. Подробности о настройке различных типов полей см. в [Типы полей таблицы данных](https://nocobase.feishu.cn/wiki/BJKYw1xpHiVxFHkmgT3cKrKznkd). diff --git a/docs/ru-RU/manual/ui/fields/static/BpmibJbEgoijTgxHkqdcjodanVc.gif b/docs/ru-RU/manual/ui/fields/static/BpmibJbEgoijTgxHkqdcjodanVc.gif new file mode 100644 index 0000000000..3205df33b7 Binary files /dev/null and b/docs/ru-RU/manual/ui/fields/static/BpmibJbEgoijTgxHkqdcjodanVc.gif differ diff --git a/docs/ru-RU/manual/ui/fields/static/MIcrb5RbUoGYoZxWazPcGMWInjc.png b/docs/ru-RU/manual/ui/fields/static/MIcrb5RbUoGYoZxWazPcGMWInjc.png new file mode 100644 index 0000000000..2706575780 Binary files /dev/null and b/docs/ru-RU/manual/ui/fields/static/MIcrb5RbUoGYoZxWazPcGMWInjc.png differ diff --git a/docs/ru-RU/manual/ui/fields/static/P82Kbwh5moSEL5x5UeYcn6kIn3Y.png b/docs/ru-RU/manual/ui/fields/static/P82Kbwh5moSEL5x5UeYcn6kIn3Y.png new file mode 100644 index 0000000000..2f16eb6e62 Binary files /dev/null and b/docs/ru-RU/manual/ui/fields/static/P82Kbwh5moSEL5x5UeYcn6kIn3Y.png differ diff --git a/docs/ru-RU/manual/ui/fields/static/WBkubBX4QoUQ3HxPUHPcht2VnnK.png b/docs/ru-RU/manual/ui/fields/static/WBkubBX4QoUQ3HxPUHPcht2VnnK.png new file mode 100644 index 0000000000..abb66a1a37 Binary files /dev/null and b/docs/ru-RU/manual/ui/fields/static/WBkubBX4QoUQ3HxPUHPcht2VnnK.png differ diff --git a/docs/ru-RU/manual/ui/index.md b/docs/ru-RU/manual/ui/index.md new file mode 100644 index 0000000000..f7ae818c25 --- /dev/null +++ b/docs/ru-RU/manual/ui/index.md @@ -0,0 +1,43 @@ +# Редактор пользовательского интерфейса + +## Что видишь, то и получаешь + +NocoBase использует режим конфигурации интерфейса по принципу WYSIWYG (What You See Is What You Get — «что видишь, то и получаешь»). Вы можете переключаться между режимом конфигурации и режимом использования, нажимая на кнопку «Редактор UI». + +Режим использования: + +![2024-01-20_11-28-46](https://static-docs.nocobase.com/2024-01-20_11-28-46.jpg) + +Режим конфигурации: + +![2024-01-20_11-29-50](https://static-docs.nocobase.com/2024-01-20_11-29-50.jpg) + +## Шаблоны макетов + +NocoBase имеет встроенный шаблон макета, в котором область навигации расположена вверху и слева, а область содержимого — справа. + +![2024-01-20_11-36-38](https://static-docs.nocobase.com/2024-01-20_11-36-38.jpg) + +## Элементы конфигурации + +После входа в режим редактора UI в интерфейсе появляются оранжевые элементы, доступные для настройки. Как правило, вход в настройки каждого конфигурируемого элемента находится в правом верхнем углу этого элемента. Практически все элементы можно настроить, а изменения сразу отображаются в интерфейсе в реальном времени. Вот несколько примеров: + +Конфигурируемые элементы для пунктов меню: + +![2024-01-20_11-30-29](https://static-docs.nocobase.com/2024-01-20_11-30-29.jpg) + +Элемент конфигурации для страниц: + +![2024-01-20_11-30-52](https://static-docs.nocobase.com/2024-01-20_11-30-52.jpg) + +Конфигурируемые элементы для блоков: + +![2024-01-20_11-31-20](https://static-docs.nocobase.com/2024-01-20_11-31-20.jpg) + +Элемент конфигурации для действий: + +![2024-01-20_11-31-50](https://static-docs.nocobase.com/2024-01-20_11-31-50.jpg) + +Конфигурируемые элементы для столбцов таблицы: + +![2024-01-20_11-32-08](https://static-docs.nocobase.com/2024-01-20_11-32-08.jpg) diff --git a/docs/ru-RU/manual/ui/inherit.md b/docs/ru-RU/manual/ui/inherit.md new file mode 100644 index 0000000000..783733d866 --- /dev/null +++ b/docs/ru-RU/manual/ui/inherit.md @@ -0,0 +1,47 @@ +# Наследование + +## Конфигурация полей, включая унаследованные поля родительской таблицы + +При использовании дочерней таблицы в блоках доступны для конфигурации не только её собственные поля, но и все поля родительских таблиц. + +![](https://static-docs.nocobase.com/33921f1e2367b3b4edac9450d2c1fef2.png) + +## Добавление операций с поддержкой дочерних таблиц + +В родительской таблице можно настроить поле `TableOID` (идентификатор таблицы, указывающий, из какой таблицы создана запись). + +![](https://static-docs.nocobase.com/9bfaa4d261fd482e2473469a2f4c3250.png) + +![](https://static-docs.nocobase.com/ce4d4ca099600e4a38058369a6dc38c7.gif) + +Данные дочерних таблиц агрегируются в родительской таблице. + +![](https://static-docs.nocobase.com/fc4b50175aa9b7b7404895f636db8d8f.gif) + +В родительской таблице можно настроить операции добавления для дочерних таблиц. + +![](https://static-docs.nocobase.com/81ab8e1d14a0d84620e4a0b214edef5a.gif) + +Варианты выбора включают все дочерние таблицы текущей таблицы. + +![](https://static-docs.nocobase.com/c5944d8b2ac4dd5b938bf31667d34516.png) + +## Просмотр и редактирование данных унаследованных таблиц (по `__collection`) + +В режиме конфигурации пользовательского интерфейса (UI) можно настроить блоки для дочерних таблиц (блоки формы или деталей). + +![](https://static-docs.nocobase.com/fbadc32ae1931c711707ad5bd9a6c603.png) + +Вне режима конфигурации UI, по значению `__collection` отображаются только блоки, соответствующие записям определённой таблицы данных. + +![](https://static-docs.nocobase.com/07dc8529f7b33deb0e4aaf1a004be213.gif) + +## Всплывающее окно для данных отношений (по `__collection`) + +Вне режима конфигурации UI, детали данных отношений отображаются по значению `__collection` только для блоков, соответствующих данным конкретной таблицы. + +![](https://static-docs.nocobase.com/101753398b9fd5a1013fcee833cbeec0.gif) + +## Связь фильтров при наследовании + +Таблица `B` может быть связана с таблицей `A`, а дочерняя таблица `B1` таблицы `B` также может быть связана с таблицей `A`. diff --git a/docs/ru-RU/manual/ui/linkage.md b/docs/ru-RU/manual/ui/linkage.md new file mode 100644 index 0000000000..6829d5e293 --- /dev/null +++ b/docs/ru-RU/manual/ui/linkage.md @@ -0,0 +1 @@ +# Правила установления связей diff --git a/docs/ru-RU/manual/ui/menus/index.md b/docs/ru-RU/manual/ui/menus/index.md new file mode 100644 index 0000000000..7606ae4c0d --- /dev/null +++ b/docs/ru-RU/manual/ui/menus/index.md @@ -0,0 +1,51 @@ +# Меню + +Меню используются для организации страниц и внешних ссылок. В стандартном шаблоне макета страницы NocoBase меню располагаются вверху и слева. При этом верхняя часть представляет собой меню первого уровня, а левая часть — подменю второго и последующих уровней (с бесконечной вложенностью). + +## Типы элементов меню + +NocoBase поддерживает три встроенных типа элементов меню: + +- Группа +- Страница +- Ссылка + +![Изображение](https://static-docs.nocobase.com/ccf6f42d3cc2677d440f9e33b9488d1c.png) + +### Группа + +Тип «Группа» используется для группировки элементов меню и может располагаться как вверху, так и слева. Внутри группы можно создавать другие группы, то есть меню поддерживает бесконечную иерархию. + +![Изображение](https://static-docs.nocobase.com/e59b2088fd68666cd240a26566616a3e.png) + +### Страница + +Страница может служить контейнером для блоков, вмещая различные типы блоков (см. [Страницы и всплывающие окна](. /pages/index.md)). + +![Изображение](https://static-docs.nocobase.com/4cd259f6b79f6792df72ccc291da2af9.png) + +### Ссылка + +Используется для перехода по сторонним URL-адресам. + +![Изображение](https://static-docs.nocobase.com/80a6e6a875c565425224d9325332a1ad.png) + +## Настройка меню + +После переключения в режим редактора пользовательского интерфейса (UI Editor) в правом верхнем углу каждого элемента меню появляются две иконки: + +- Перетаскивание для перемещения +- Настройка элемента меню + +![Изображение](https://static-docs.nocobase.com/963ba10e36d04fd258fea0e996231f68.png) + +### Настройка элемента меню + +![Изображение](https://static-docs.nocobase.com/0a9a05bd88d8bad9d711102a730f351d.png) + +- **Редактировать**: включает изменение заголовка элемента меню, иконки и т.д. +- **Переместить в**: помимо перетаскивания, вы можете быстро переместить элемент меню с помощью функции «Переместить в», позволяющей разместить элемент перед, после или внутри других элементов меню. +- **Вставить перед** +- **Вставить после** +- **Вставить внутрь** (только для типа «Группа») +- **Удалить** diff --git a/docs/ru-RU/manual/ui/menus/static/Jp3NbdeVBojspWxvcWhcuDTlnOe.png b/docs/ru-RU/manual/ui/menus/static/Jp3NbdeVBojspWxvcWhcuDTlnOe.png new file mode 100644 index 0000000000..a2751410cc Binary files /dev/null and b/docs/ru-RU/manual/ui/menus/static/Jp3NbdeVBojspWxvcWhcuDTlnOe.png differ diff --git a/docs/ru-RU/manual/ui/menus/static/LTdGbCxxHopt9ix1Nuncj73VnQb.png b/docs/ru-RU/manual/ui/menus/static/LTdGbCxxHopt9ix1Nuncj73VnQb.png new file mode 100644 index 0000000000..f686eb3de7 Binary files /dev/null and b/docs/ru-RU/manual/ui/menus/static/LTdGbCxxHopt9ix1Nuncj73VnQb.png differ diff --git a/docs/ru-RU/manual/ui/menus/static/OpdHbIbJ8oZX75x777ycylHxn1Q.png b/docs/ru-RU/manual/ui/menus/static/OpdHbIbJ8oZX75x777ycylHxn1Q.png new file mode 100644 index 0000000000..4a609a506b Binary files /dev/null and b/docs/ru-RU/manual/ui/menus/static/OpdHbIbJ8oZX75x777ycylHxn1Q.png differ diff --git a/docs/ru-RU/manual/ui/menus/static/SYzbbocHfoNFtsxomWJcUno7nog.png b/docs/ru-RU/manual/ui/menus/static/SYzbbocHfoNFtsxomWJcUno7nog.png new file mode 100644 index 0000000000..dc01db58ab Binary files /dev/null and b/docs/ru-RU/manual/ui/menus/static/SYzbbocHfoNFtsxomWJcUno7nog.png differ diff --git a/docs/ru-RU/manual/ui/menus/static/T0LTbjTBEo24UaxU9Btc6xgbnMf.png b/docs/ru-RU/manual/ui/menus/static/T0LTbjTBEo24UaxU9Btc6xgbnMf.png new file mode 100644 index 0000000000..197266e57c Binary files /dev/null and b/docs/ru-RU/manual/ui/menus/static/T0LTbjTBEo24UaxU9Btc6xgbnMf.png differ diff --git a/docs/ru-RU/manual/ui/menus/static/ZLYibDXwToMdqRxMTy4cyTion1f.png b/docs/ru-RU/manual/ui/menus/static/ZLYibDXwToMdqRxMTy4cyTion1f.png new file mode 100644 index 0000000000..a89a582a69 Binary files /dev/null and b/docs/ru-RU/manual/ui/menus/static/ZLYibDXwToMdqRxMTy4cyTion1f.png differ diff --git a/docs/ru-RU/manual/ui/pages/index.md b/docs/ru-RU/manual/ui/pages/index.md new file mode 100644 index 0000000000..e58e7939db --- /dev/null +++ b/docs/ru-RU/manual/ui/pages/index.md @@ -0,0 +1,59 @@ +# Страницы и всплывающие окна + +Страницы и всплывающие окна (диалоговые окна, выдвижные панели) в NocoBase могут использоваться как контейнеры для блоков; они подобны холсту, на котором можно свободно размещать различные блоки. + +## Страницы + +После создания страницы через [меню](. /menus/index.md) видно, что пустая страница состоит из следующих двух частей: +1. **Заголовок** + 1. Заголовок страницы + 2. Вкладки +2. **Контейнер блоков** + +![2024-01-20_08-23-10](https://static-docs.nocobase.com/2024-01-20_08-23-10.jpg) + +Наведите курсор на значок конфигурации в правом верхнем углу страницы, чтобы увидеть элементы конфигурации страницы: + +![2024-01-20_08-24-27](https://static-docs.nocobase.com/2024-01-20_08-24-27.jpg) + +Конфигурируемые элементы включают: +- **Включить заголовок страницы**: управляет отображением заголовка; +- **Показывать заголовок страницы**: определяет, отображать ли заголовок страницы в заголовочной области; +- **Редактировать заголовок страницы**: по умолчанию заголовок страницы совпадает с названием пункта меню, но его можно изменить; +- **Включить вкладки страницы**: по умолчанию выключено, при включении можно добавить несколько вкладок. + +### Заголовок + +Обычно заголовочная область включается для отображения заголовка страницы и вкладок. Однако в некоторых случаях заголовок можно отключить, например, при создании страницы дашборда, когда пункт меню первого уровня достаточно хорошо отражает содержимое страницы. В таком случае можно отключить заголовок и отображать только блоки на странице. + +![20240120084618](https://static-docs.nocobase.com/20240120084618.png) + +#### Заголовок страницы + +По умолчанию заголовок страницы совпадает с названием пункта меню, но его можно изменить, нажав «Редактировать заголовок страницы». Как и в случае с заголовком, иногда заголовок страницы не нужен, если используются только вкладки — в этом случае его можно отключить. + +![2024-01-20_08-28-43](https://static-docs.nocobase.com/2024-01-20_08-28-43.jpg) + +#### Вкладки + +Когда содержимого на странице слишком много или его удобно разделить на несколько частей, можно включить вкладки. Каждая вкладка представляет собой отдельный контейнер для блоков. На изображении ниже на странице заказов добавлены три вкладки для отображения всех заказов, завершённых заказов и возвращённых заказов. Наведите курсор на заголовки вкладок, чтобы увидеть кнопки для перетаскивания и конфигурации в правом верхнем углу. + +![2024-01-20_08-47-15](https://static-docs.nocobase.com/2024-01-20_08-47-15.jpg) + +### Контейнер блоков + +На страницу можно добавить неограниченное количество блоков, нажав кнопку «Добавить блок» (см. [Блоки](. /blocks/index.md)). + +![2024-01-20_08-48-36](https://static-docs.nocobase.com/2024-01-20_08-48-36.jpg) + +После добавления нескольких блоков можно перетаскивать их, используя кнопку перетаскивания в правом верхнем углу блока, чтобы настроить макет для достижения наиболее подходящего результата. + +![page-block](https://static-docs.nocobase.com/page-block.gif) + +## Всплывающие окна + +В NocoBase существуют два типа всплывающих окон: диалоговые окна и выдвижные панели. Как и страницы, они могут служить контейнерами для блоков, и в них можно добавлять несколько вкладок. Всплывающие окна открываются действиями, такими как «Добавить», «Редактировать», «Просмотреть» и т.д. + +![2024-01-20_08-52-00](https://static-docs.nocobase.com/2024-01-20_08-52-00.jpg) + +![2024-01-20_08-52-24](https://static-docs.nocobase.com/2024-01-20_08-52-24.jpg) diff --git a/docs/ru-RU/manual/ui/pages/static/C3xvb09t4oGOlhxxI5jcy2B7ncc.png b/docs/ru-RU/manual/ui/pages/static/C3xvb09t4oGOlhxxI5jcy2B7ncc.png new file mode 100644 index 0000000000..ff6e6bf2cb Binary files /dev/null and b/docs/ru-RU/manual/ui/pages/static/C3xvb09t4oGOlhxxI5jcy2B7ncc.png differ diff --git a/docs/ru-RU/manual/ui/pages/static/U0kXblh2Yo5S5hx91c2cYggrnYf.gif b/docs/ru-RU/manual/ui/pages/static/U0kXblh2Yo5S5hx91c2cYggrnYf.gif new file mode 100644 index 0000000000..a43b0c6712 Binary files /dev/null and b/docs/ru-RU/manual/ui/pages/static/U0kXblh2Yo5S5hx91c2cYggrnYf.gif differ diff --git a/docs/ru-RU/manual/ui/pages/static/VpP2bTwhooaxrqxy5gYc4KJFnUc.png b/docs/ru-RU/manual/ui/pages/static/VpP2bTwhooaxrqxy5gYc4KJFnUc.png new file mode 100644 index 0000000000..3a1725bca0 Binary files /dev/null and b/docs/ru-RU/manual/ui/pages/static/VpP2bTwhooaxrqxy5gYc4KJFnUc.png differ diff --git a/docs/ru-RU/manual/ui/pages/static/YPqEb1UEMoNzszxAHeDcNrsjnie.png b/docs/ru-RU/manual/ui/pages/static/YPqEb1UEMoNzszxAHeDcNrsjnie.png new file mode 100644 index 0000000000..933e11052e Binary files /dev/null and b/docs/ru-RU/manual/ui/pages/static/YPqEb1UEMoNzszxAHeDcNrsjnie.png differ diff --git a/docs/ru-RU/manual/ui/static/A8yMbUDaSo9zWpxs2Dncrqwjn9e.png b/docs/ru-RU/manual/ui/static/A8yMbUDaSo9zWpxs2Dncrqwjn9e.png new file mode 100644 index 0000000000..3d9ba1a44f Binary files /dev/null and b/docs/ru-RU/manual/ui/static/A8yMbUDaSo9zWpxs2Dncrqwjn9e.png differ diff --git a/docs/ru-RU/manual/ui/static/BBPvbjjv0or01vx1SzBcXtN9n9f.png b/docs/ru-RU/manual/ui/static/BBPvbjjv0or01vx1SzBcXtN9n9f.png new file mode 100644 index 0000000000..c8a34c5cab Binary files /dev/null and b/docs/ru-RU/manual/ui/static/BBPvbjjv0or01vx1SzBcXtN9n9f.png differ diff --git a/docs/ru-RU/manual/ui/static/Dpmeb5HinokF1Pxfu0BcAmgOnfd.gif b/docs/ru-RU/manual/ui/static/Dpmeb5HinokF1Pxfu0BcAmgOnfd.gif new file mode 100644 index 0000000000..f4eab4cfc7 Binary files /dev/null and b/docs/ru-RU/manual/ui/static/Dpmeb5HinokF1Pxfu0BcAmgOnfd.gif differ diff --git a/docs/ru-RU/manual/ui/static/EUynbO9QPo1iHpxQxwXcYyTLnMf.gif b/docs/ru-RU/manual/ui/static/EUynbO9QPo1iHpxQxwXcYyTLnMf.gif new file mode 100644 index 0000000000..01b2c88079 Binary files /dev/null and b/docs/ru-RU/manual/ui/static/EUynbO9QPo1iHpxQxwXcYyTLnMf.gif differ diff --git a/docs/ru-RU/manual/ui/static/HjXmbyAndo07izxp9AQcA5YSnyd.gif b/docs/ru-RU/manual/ui/static/HjXmbyAndo07izxp9AQcA5YSnyd.gif new file mode 100644 index 0000000000..0f82a879c6 Binary files /dev/null and b/docs/ru-RU/manual/ui/static/HjXmbyAndo07izxp9AQcA5YSnyd.gif differ diff --git a/docs/ru-RU/manual/ui/static/JgMZbj7izo2Ugex8vKmc6fTzntb.gif b/docs/ru-RU/manual/ui/static/JgMZbj7izo2Ugex8vKmc6fTzntb.gif new file mode 100644 index 0000000000..3393f06c36 Binary files /dev/null and b/docs/ru-RU/manual/ui/static/JgMZbj7izo2Ugex8vKmc6fTzntb.gif differ diff --git a/docs/ru-RU/manual/ui/static/L6vtbzAUAoxNn6xNwDkcveQenPg.gif b/docs/ru-RU/manual/ui/static/L6vtbzAUAoxNn6xNwDkcveQenPg.gif new file mode 100644 index 0000000000..6585f48d56 Binary files /dev/null and b/docs/ru-RU/manual/ui/static/L6vtbzAUAoxNn6xNwDkcveQenPg.gif differ diff --git a/docs/ru-RU/manual/ui/static/OYC6b09tEor0E6x5WTXc5FjvnIc.gif b/docs/ru-RU/manual/ui/static/OYC6b09tEor0E6x5WTXc5FjvnIc.gif new file mode 100644 index 0000000000..e4747a90c6 Binary files /dev/null and b/docs/ru-RU/manual/ui/static/OYC6b09tEor0E6x5WTXc5FjvnIc.gif differ diff --git a/docs/ru-RU/manual/ui/static/PM70bxBbDo14KcxYke1cl6GQn9S.gif b/docs/ru-RU/manual/ui/static/PM70bxBbDo14KcxYke1cl6GQn9S.gif new file mode 100644 index 0000000000..34cec4d684 Binary files /dev/null and b/docs/ru-RU/manual/ui/static/PM70bxBbDo14KcxYke1cl6GQn9S.gif differ diff --git a/docs/ru-RU/manual/ui/static/PQKrbFbmUoYcX6xS6d7c8Enun4a.gif b/docs/ru-RU/manual/ui/static/PQKrbFbmUoYcX6xS6d7c8Enun4a.gif new file mode 100644 index 0000000000..6341cafa38 Binary files /dev/null and b/docs/ru-RU/manual/ui/static/PQKrbFbmUoYcX6xS6d7c8Enun4a.gif differ diff --git a/docs/ru-RU/manual/ui/static/R35gbnMFjolgS9xfO9wczmXmnG0.gif b/docs/ru-RU/manual/ui/static/R35gbnMFjolgS9xfO9wczmXmnG0.gif new file mode 100644 index 0000000000..697001106e Binary files /dev/null and b/docs/ru-RU/manual/ui/static/R35gbnMFjolgS9xfO9wczmXmnG0.gif differ diff --git a/docs/ru-RU/manual/ui/static/TkNGb5tLRoY7JVxjlIrc9Ol3njd.png b/docs/ru-RU/manual/ui/static/TkNGb5tLRoY7JVxjlIrc9Ol3njd.png new file mode 100644 index 0000000000..b5d957beca Binary files /dev/null and b/docs/ru-RU/manual/ui/static/TkNGb5tLRoY7JVxjlIrc9Ol3njd.png differ diff --git a/docs/ru-RU/manual/ui/static/UPPCbpZb5oU9Frxyc0JcIzbhn1b.gif b/docs/ru-RU/manual/ui/static/UPPCbpZb5oU9Frxyc0JcIzbhn1b.gif new file mode 100644 index 0000000000..36fa7f9a82 Binary files /dev/null and b/docs/ru-RU/manual/ui/static/UPPCbpZb5oU9Frxyc0JcIzbhn1b.gif differ diff --git a/docs/ru-RU/manual/ui/static/WNA9beotVoYfLqxfBsVcchhvn9y.gif b/docs/ru-RU/manual/ui/static/WNA9beotVoYfLqxfBsVcchhvn9y.gif new file mode 100644 index 0000000000..ad2e4159d2 Binary files /dev/null and b/docs/ru-RU/manual/ui/static/WNA9beotVoYfLqxfBsVcchhvn9y.gif differ diff --git a/docs/ru-RU/manual/ui/static/WPoJbqedXozxb0xAQP3cKghzn8d.gif b/docs/ru-RU/manual/ui/static/WPoJbqedXozxb0xAQP3cKghzn8d.gif new file mode 100644 index 0000000000..15d164275b Binary files /dev/null and b/docs/ru-RU/manual/ui/static/WPoJbqedXozxb0xAQP3cKghzn8d.gif differ diff --git a/docs/ru-RU/manual/ui/static/X8RTbD6FPodn1dxk3OscieZrnie.png b/docs/ru-RU/manual/ui/static/X8RTbD6FPodn1dxk3OscieZrnie.png new file mode 100644 index 0000000000..72c863300d Binary files /dev/null and b/docs/ru-RU/manual/ui/static/X8RTbD6FPodn1dxk3OscieZrnie.png differ diff --git a/docs/ru-RU/manual/ui/static/X8u0b5QJFomar7xbFTKceqIPngb.jpg b/docs/ru-RU/manual/ui/static/X8u0b5QJFomar7xbFTKceqIPngb.jpg new file mode 100644 index 0000000000..23e19ebe17 Binary files /dev/null and b/docs/ru-RU/manual/ui/static/X8u0b5QJFomar7xbFTKceqIPngb.jpg differ diff --git a/docs/ru-RU/manual/user/user-center/index.md b/docs/ru-RU/manual/user/user-center/index.md new file mode 100644 index 0000000000..19e14ea4ee --- /dev/null +++ b/docs/ru-RU/manual/user/user-center/index.md @@ -0,0 +1,15 @@ +# Личный кабинет + +Личный кабинет предоставляет пользователям набор функций для управления профилем и обслуживания системы, включая просмотр версии системы, редактирование личных данных и другие быстрые операции. При наличии соответствующих разрешений в системе, в личном кабинете также доступны кнопки для очистки кеша и перезапуска приложения. Функционал личного кабинета может быть расширен с помощью плагинов. + +На данный момент личный кабинет предлагает следующие быстрые действия: + +- Edit profile:Редактирование личных данных пользователя (предоставляется плагином аутентификации) + - Change password: Смена пароля (реализовано в плагине аутентификации) + - Switch role:Переключение между ролями (реализовано в плагине аутентификации) + - Sign out:Выход из системы (реализовано в плагине аутентификации) + - Theme :Переключение темы оформления (реализовано в плагине тем) + - Clear cache: Очистка кеша (реализовано в плагине аутентификации, требует соответствующих прав) + - Restart application:Перезапуск приложения (реализовано в плагине аутентификации, требует соответствующих прав) + +![](https://static-docs.nocobase.com/9db96c7432f9c1cfbc0429589f58674f.png) diff --git a/docs/ru-RU/manual/user/user-center/static/FNtmbksNrorQ4xxbXEMcRHx7ndb.png b/docs/ru-RU/manual/user/user-center/static/FNtmbksNrorQ4xxbXEMcRHx7ndb.png new file mode 100644 index 0000000000..69e0178af6 Binary files /dev/null and b/docs/ru-RU/manual/user/user-center/static/FNtmbksNrorQ4xxbXEMcRHx7ndb.png differ diff --git a/docs/ru-RU/plugin-samples/block/block-carousel.md b/docs/ru-RU/plugin-samples/block/block-carousel.md new file mode 100644 index 0000000000..fa62939da1 --- /dev/null +++ b/docs/ru-RU/plugin-samples/block/block-carousel.md @@ -0,0 +1,1125 @@ +# Блок `Carousel` + +## Описание сценария + +В NocoBase есть множество кнопок `Add block`, которые используются для добавления блоков в интерфейс, но существующие типы блоков не всегда удовлетворяют потребности. В таких случаях необходимо разрабатывать пользовательские блоки в соответствии с требованиями. + +Блоки, связанные с таблицами данных, называются **данными блоками** (`Data Block`), а блоки, не связанные с таблицами данных, называются **простыми блоками** (`Simple Block`). Данная статья посвящена примеру создания простого блока `Simple Block`. + +## Описание примера + +В этом примере мы создадим блок `Carousel` на основе компонента [Carousel](https://ant.design/components/carousel) из Ant Design и добавим его в меню `Add block` на страницах `Page`, `Table` и в мобильной версии. + +Полный код примера можно найти в репозитории [plugin-samples](https://github.com/nocobase/plugin-samples/tree/main/packages/plugins/%40nocobase-sample/plugin-block-carousel). + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240603155655_rec_.mp4" type="video/mp4" /> +</video> + +## Инициализация плагина + +Следуя инструкциям из документа [Создание вашего первого плагина](/development/your-fisrt-plugin), если у вас нет проекта, создайте его. Если проект уже существует или вы клонировали исходный код, пропустите этот шаг. + +```bash +yarn create nocobase-app my-nocobase-app -d sqlite +cd my-nocobase-app +yarn install +yarn nocobase install +``` + +Затем инициализируйте плагин и добавьте его в систему: + +```bash +yarn pm create @nocobase-sample/plugin-block-carousel +yarn pm enable @nocobase-sample/plugin-block-carousel +``` + +Запустите проект: + +```bash +yarn dev +``` + +После входа в систему перейдите по адресу [http://localhost:13000/admin/pm/list/locale/](http://localhost:13000/admin/pm/list/locale/), чтобы убедиться, что плагин установлен и активирован. + +## Реализация функционала + +Перед реализацией примера необходимо ознакомиться с основными понятиями: + +- [Carousel от Ant Design](https://ant.design/components/carousel) +- [Руководство по SchemaInitializer](/development/client/ui-schema/initializer): для добавления блоков, полей и операций в интерфейс. +- [API SchemaInitializer](https://client.docs.nocobase.com/core/ui-schema/schema-initializer): для добавления элементов в интерфейс. +- [Протокол UI Schema](/development/client/ui-schema/what-is-ui-schema): подробное описание структуры Schema и роли каждого атрибута. +- [Дизайнер Designable](/development/client/ui-schema/designable): для изменения Schema. + +Структура проекта: + +```bash +. +├── client # Клиентская часть плагина +│ ├── initializer # Инициализатор +│ ├── component # Компонент блока +│ ├── index.tsx # Точка входа клиентской части +│ ├── locale.ts # Утилиты для мультиязычности +│ ├── constants.ts # Константы +│ ├── schema # Schema +│ └── settings # Настройки Schema +├── locale # Файлы мультиязычности +│ ├── en-US.json # Английский +│ └── zh-CN.json # Китайский +├── index.ts # Точка входа серверной части +└── server # Серверная часть плагина +``` + +### 1. Определение имени + +Сначала нужно определить имя блока, которое будет использоваться в различных местах. + +Создайте файл `packages/plugins/@nocobase-sample/plugin-block-carousel/src/client/constants.ts`: + +```ts +export const BlockName = 'Carousel'; +export const BlockNameLowercase = BlockName.toLowerCase(); +``` + +### 2. Реализация компонента блока + +#### 2.1 Определение компонента блока + +Создайте файл `packages/plugins/@nocobase-sample/plugin-block-carousel/src/client/component/Carousel.tsx` со следующим содержимым: + +```tsx | pure +import React, { FC } from 'react'; +import { Carousel as AntdCarousel, Result, CarouselProps as AntdCarouselProps } from 'antd'; +import { withDynamicSchemaProps } from '@nocobase/client'; +import { BlockName } from './constants'; + +export interface CarouselProps extends AntdCarouselProps { + images?: { url: string; title?: string }[]; + /** + * @default 300 + */ + height?: number; + /** + * @default 'cover' + */ + objectFit?: 'fill' | 'contain' | 'cover' | 'none' | 'scale-down'; +} + +export const Carousel: FC<CarouselProps> = withDynamicSchemaProps((props) => { + const { images, height = 300, objectFit = 'cover', ...carouselProps } = props; + return (images && images.length) ? ( + <AntdCarousel {...carouselProps}> + {images.map((image) => ( + <div key={image.url}> + <img key={image.title} src={image.url} alt={image.title} style={{ height, width: '100%', objectFit }} /> + </div> + ))} + </AntdCarousel> + ) : <Result status='404' /> +}, { displayName: BlockName }) +``` + +Компонент `Carousel` — это функциональный компонент, обёрнутый в `withDynamicSchemaProps`, который используется для обработки динамических свойств из Schema ([подробности](/development/client/ui-schema/what-is-ui-schema#x-component-props-и-x-use-component-props)). + +Без учёта `withDynamicSchemaProps`, `Carousel` — это простой функциональный компонент. + +Экспортируйте компонент в `packages/plugins/@nocobase-sample/plugin-block-carousel/src/client/component/index.ts`: + +```tsx | pure +export * from './Carousel'; +``` + +#### 2.2 Регистрация компонента блока + +Зарегистрируйте компонент `Carousel` в системе через плагин. + +```tsx | pure +import { Plugin } from '@nocobase/client'; +import { Carousel } from './component'; + +export class PluginBlockCarouselClient extends Plugin { + async load() { + this.app.addComponents({ Carousel }) + } +} + +export default PluginBlockCarouselClient; +``` + +#### 2.3 Проверка компонента блока + +Компонент можно проверить двумя способами: + +- **Проверка на временной странице**: Создайте временную страницу, отрендерьте компонент `Carousel` и проверьте, соответствует ли он требованиям. +- **Проверка через примеры документации**: Запустите документацию с помощью команды `yarn doc plugins/@nocobase-sample/plugin-block-carousel` и проверьте через примеры документации (TODO). + +Рассмотрим пример с **временной страницей**. Создайте страницу, добавьте один или несколько компонентов `Carousel` с разными параметрами и проверьте их работу. + +```tsx | pure +import React from 'react'; +import { Plugin } from '@nocobase/client'; +import { Carousel } from './component'; + +export class PluginBlockCarouselClient extends Plugin { + async load() { + this.app.addComponents({ Carousel }) + + this.app.router.add('admin.carousel-component', { + path: '/admin/carousel-component', + Component: () => { + const images = [{ url: 'https://picsum.photos/id/1/1200/300' }, { url: 'https://picsum.photos/id/2/1200/300' }]; + return <> + <div style={{ marginTop: 20, marginBottom: 20 }}> + <Carousel /> + </div> + + <div style={{ marginTop: 20, marginBottom: 20 }}> + <Carousel images={images} /> + </div> + + <div style={{ marginTop: 20, marginBottom: 20 }}> + <Carousel images={images} height={100} /> + </div> + + <div style={{ marginTop: 20, marginBottom: 20 }}> + <Carousel images={images} objectFit='contain' /> + </div> + + <div style={{ marginTop: 20, marginBottom: 20 }}> + <Carousel images={images} autoplay /> + </div> + </> + } + }); + } +} + +export default PluginBlockCarouselClient; +``` + +Перейдите по адресу `http://localhost:13000/admin/carousel-component`, чтобы увидеть содержимое тестовой страницы. + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240603155918_rec_.mp4" type="video/mp4" /> +</video> + +После проверки удалите тестовую страницу. + +### 3. Определение схемы блока + +#### 3.1 Определение схемы блока + +Динамические страницы NocoBase рендерятся с использованием Schema, поэтому необходимо определить Schema для добавления блока `Carousel` в интерфейс. Перед этим ознакомьтесь с: + +- [Протокол UI Schema](/development/client/ui-schema/what-is-ui-schema): подробное описание структуры Schema и роли каждого атрибута. + +Создайте файл `packages/plugins/@nocobase-sample/plugin-block-carousel/src/client/schema/index.ts`: + +```tsx | pure +import { ISchema } from '@nocobase/client'; +import { useFieldSchema } from '@formily/react' + +import { BlockName, BlockNameLowercase } from '../constants'; + +export function useCarouselBlockProps() { + const fieldSchema = useFieldSchema(); + return fieldSchema.parent?.['x-decorator-props']?.[BlockNameLowercase] +} + +export const carouselSchema: ISchema = { + type: 'void', + 'x-component': 'CardItem', + 'x-decorator-props': { + [BlockNameLowercase]: {}, + }, + properties: { + carousel: { + type: 'void', + 'x-component': BlockName, + 'x-use-component-props': 'useCarouselBlockProps' + } + } +}; +``` + +`carouselSchema`: + +- `type`: Тип, здесь `void`, указывает на чистый UI-узел без данных. +- `'x-component': 'CardItem'`: Компонент [CardItem](https://client.docs.nocobase.com/components/card-item), используется для стилизации, компоновки и поддержки перетаскивания блоков. +- `x-decorator-props`: Хранит свойства компонента `Carousel`. +- `properties`: Дочерние узлы. + - `carousel`: + - `'x-component': BlockName`: Компонент `Carousel`. + - `'x-use-component-props': 'useCarouselBlockProps'`: Для динамического получения свойств компонента `Carousel`. + +Этот Schema эквивалентен следующему React-компоненту: + +```tsx | pure +<CardItem> + <Carousel {...useCarouselBlockProps()} /> +</CardItem> +``` + +#### 3.2 Регистрация области видимости + +Зарегистрируйте `useCarouselBlockProps` в системе, чтобы [x-use-component-props](/development/client/ui-schema/what-is-ui-schema#x-component-props-и-x-use-component-props) мог найти соответствующую область видимости. + +```tsx | pure +import { Plugin } from '@nocobase/client'; +import { Carousel } from './component'; +import { useCarouselBlockProps } from './schema'; + +export class PluginBlockCarouselClient extends Plugin { + async load() { + this.app.addComponents({ Carousel }) + this.app.addScopes({ useCarouselBlockProps }); + } +} + +export default PluginBlockCarouselClient; +``` + +Подробности о регистрации областей видимости см. в [Глобальная регистрация компонента и области видимости](/plugin-samples/component-and-scope/global). + +#### 3.3 Проверка схемы блока + +Как и с компонентом, схему можно проверить через временную страницу или примеры документации. Рассмотрим проверку на временной странице: + +```tsx | pure +import React from 'react'; +import { Plugin, SchemaComponent } from '@nocobase/client'; +import { Carousel } from './component'; +import { carouselSchema } from './schema'; + +export class PluginBlockCarouselClient extends Plugin { + async load() { + this.app.addComponents({ Carousel }) + this.app.addScopes({ useCarouselBlockProps }); + + this.app.router.add('admin.carousel-schema', { + path: '/admin/carousel-schema', + Component: () => { + const images = [{ url: 'https://picsum.photos/id/1/1200/300' }, { url: 'https://picsum.photos/id/2/1200/300' }]; + return <> + <div style={{ marginTop: 20, marginBottom: 20 }}> + <SchemaComponent schema={{ properties: { test1: carouselSchema } }} /> + </div> + <div style={{ marginTop: 20, marginBottom: 20 }}> + <SchemaComponent schema={{ properties: { test2: { ...carouselSchema, 'x-decorator-props': { carousel: { images, height: 100 } } } } }} /> + </div> + <div style={{ marginTop: 20, marginBottom: 20 }}> + <SchemaComponent schema={{ properties: { test3: { ...carouselSchema, 'x-decorator-props': { carousel: { images, objectFit: 'contain' } } } } }} /> + </div> + <div style={{ marginTop: 20, marginBottom: 20 }}> + <SchemaComponent schema={{ properties: { test4: { ...carouselSchema, 'x-decorator-props': { carousel: { images, autoplay: true } } } } }} /> + </div> + </> + } + }); + } +} + +export default PluginBlockCarouselClient; +``` + +Подробности о `SchemaComponent` см. в документации [SchemaComponent](https://client.docs.nocobase.com/core/ui-schema/schema-component#schemacomponent-1). + +Перейдите по адресу [http://localhost:13000/admin/carousel-schema](http://localhost:13000/admin/carousel-schema), чтобы увидеть содержимое тестовой страницы. + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240603155918_rec_.mp4" type="video/mp4" /> +</video> + +После проверки удалите тестовую страницу. + +### 4. Определение элемента инициализатора Schema + +Создайте файл `packages/plugins/@nocobase-sample/plugin-block-carousel/src/client/initializer/index.ts`: + +```ts +import { SchemaInitializerItemType, useSchemaInitializer } from '@nocobase/client'; + +import { carouselSchema } from '../schema'; +import { BlockName, BlockNameLowercase } from '../constants'; +import { useT } from '../locale'; + +export const carouselInitializerItem: SchemaInitializerItemType = { + type: 'item', + name: BlockNameLowercase, + icon: 'PlayCircleOutlined', + useComponentProps() { + const { insert } = useSchemaInitializer(); + const t = useT(); + return { + title: t(BlockName), + onClick: () => { + insert(carouselSchema); + }, + }; + }, +} +``` + +- `type`: Тип, здесь `item`, указывает на текстовый элемент с событием клика, которое вставляет новый Schema. +- `name`: Уникальный идентификатор для различия элементов Schema и операций CRUD. +- `icon`: Иконка, см. [Ant Design Icons](https://ant.design/components/icon). +- `useComponentProps`: Возвращает объект с свойствами `title` (текст для отображения) и `onClick` (обработчик клика). +- [useSchemaInitializer()](https://client.docs.nocobase.com/core/ui-schema/schema-initializer#useschemainitializer): Получает контекст `SchemaInitializerContext`. + - `insert`: Вставляет новый Schema. +- `useT()`: Утилита для мультиязычности. + +Подробности о Schema Initializer Item см. в [Schema Initializer Item](https://client.docs.nocobase.com/core/ui-schema/schema-initializer#built-in-components-and-types). + +### 5. Добавление в меню `Add block` + +В системе есть множество кнопок `Add block`, но их **имена различаются**. + +![img_v3_02b4_049b0a62-8e3b-420f-adaf-a6350d84840g](https://static-docs.nocobase.com/img_v3_02b4_049b0a62-8e3b-420f-adaf-a6350d84840g.jpg) + +#### 5.1 Добавление в `Add block` на уровне страницы + +Чтобы добавить блок в меню `Add block` на уровне страницы, нужно знать соответствующее имя (`name`). Способ получения имени будет описан позже (TODO). + +По предоставленному изображению видно, что имя `Add block` на уровне страницы — `page:addBlock`, а имя раздела `Other Blocks` — `otherBlocks`. + +Обновите файл `packages/plugins/@nocobase-sample/plugin-block-carousel/src/client/index.tsx`: + +```tsx | pure +import { Plugin } from '@nocobase/client'; + +import { Carousel } from './component'; +import { carouselSchema, useCarouselBlockProps } from './schema'; +import { carouselSettings } from './settings'; +import { carouselInitializerItem } from './initializer'; + +export class PluginBlockCarouselClient extends Plugin { + async load() { + this.app.addComponents({ Carousel }) + this.app.schemaSettingsManager.add(carouselSettings); + this.app.addScopes({ useCarouselBlockProps }); + + this.app.schemaInitializerManager.addItem('page:addBlock', `otherBlocks.${carouselInitializerItem.name}`, carouselInitializerItem) + } +} + +export default PluginBlockCarouselClient; +``` + +Код сначала регистрирует компонент `Carousel` в системе, чтобы `x-component: 'Carousel'` в `carouselSchema` мог найти соответствующий компонент. Подробности см. в [Глобальная регистрация компонента и области видимости](/plugin-samples/component-and-scope/global). + +Затем `carouselSettings` добавляется в систему с помощью [app.schemaSettingsManager.add](https://client.docs.nocobase.com/core/ui-schema/schema-settings-manager#schemasettingsmanageradd). + +Элемент `carouselInitializerItem` добавляется в соответствующий инициализатор с помощью [app.schemaInitializerManager.addItem](https://client.docs.nocobase.com/core/ui-schema/schema-initializer-manager#schemainitializermanageradditem), где `page:addBlock` — имя `Add block` на уровне страницы, а `otherBlocks` — имя родительского раздела. + +Наведите курсор на кнопку `Add block`, и вы увидите новый тип блока `Image`. Нажмите на `Image`, чтобы добавить новый блок `Carousel`. + +![20240603161730](https://static-docs.nocobase.com/20240603161730.png) + +#### 5.2 Добавление в `Add block` во всплывающем окне + +Необходимо добавить блок в меню `Add block` во всплывающем окне `Add new` блока `Table`. + +![img_v3_02b4_fc47fe3a-35a1-4186-999c-0b48e6e001dg](https://static-docs.nocobase.com/img_v3_02b4_fc47fe3a-35a1-4186-999c-0b48e6e001dg.jpg) + +Имя `Add block` для блока `Table` — `popup:addNew:addBlock`, а имя раздела `Other Blocks` — `otherBlocks`. + +Обновите файл `packages/plugins/@nocobase-sample/plugin-block-carousel/src/client/index.tsx`: + +```diff +export class PluginBlockCarouselClient extends Plugin { + async load() { + // ... ++ this.app.schemaInitializerManager.addItem('popup:addNew:addBlock', `otherBlocks.${carouselInitializerItem.name}`, carouselInitializerItem) + } +} +``` + +![20240603161814](https://static-docs.nocobase.com/20240603161814.png) + +#### 5.3 Добавление в `Add block` на мобильной версии + +> Сначала активируйте плагин для мобильной версии, см. [Активация плагина](/welcome/getting-started/plugin#3-activate-the-plugin). + +Добавьте блок в меню `Add block` мобильной версии. Способ получения имени здесь не описывается. + +Обновите файл `packages/plugins/@nocobase-sample/plugin-block-carousel/src/client/index.tsx`: + +```diff +export class PluginBlockCarouselClient extends Plugin { + async load() { + // ... ++ this.app.schemaInitializerManager.addItem('mobilePage:addBlock', `otherBlocks.${carouselInitializerItem.name}`, carouselInitializerItem) + } +} +``` + +![20240603161913](https://static-docs.nocobase.com/20240603161913.png) + +Для добавления в другие меню `Add block` достаточно знать их имена. + +### 6. Реализация настроек Schema + +#### 6.1 Определение настроек Schema + +Для полноценного блока нужны настройки Schema для конфигурации свойств и операций. + +Создайте файл `packages/plugins/@nocobase-sample/plugin-block-carousel/src/client/settings/index.ts`: + +```ts | pure +import { SchemaSettings } from "@nocobase/client"; +import { BlockNameLowercase } from '../constants'; + +export const carouselSettings = new SchemaSettings({ + name: `blockSettings:${BlockNameLowercase}`, + items: [ + // TODO + ] +}); +``` + +#### 6.2 Регистрация настроек Schema + +```ts +import { Plugin } from '@nocobase/client'; +import { carouselSettings } from './settings'; + +export class PluginBlockCarouselClient extends Plugin { + async load() { + // ... + this.app.schemaSettingsManager.add(carouselSettings) + } +} + +export default PluginBlockCarouselClient; +``` + +#### 6.3 Использование настроек Schema + +Обновите `carouselSchema` в `packages/plugins/@nocobase-sample/plugin-block-carousel/src/client/schema/index.ts`: + +```diff ++ import { carouselSettings } from "../settings"; + +const carouselSchema: ISchema = { + type: 'void', + 'x-decorator': 'CardItem', ++ 'x-settings': carouselSettings.name, + // ... +}; +``` + +![20240603162037](https://static-docs.nocobase.com/20240603162037.png) + +### 7. Реализация элементов настроек Schema + +Мы определили `Schema Settings`, но не реализовали операции. Реализуем их в соответствии с требованиями. + +Поддерживаемые типы операций см. в [Schema Settings - Built-in Components and Types](https://client.docs.nocobase.com/core/ui-schema/schema-settings#built-in-components-and-types). + +#### 7.1 Реализация операции `remove` + +Блоки, добавленные через инициализаторы, нельзя удалить, поэтому реализуем операцию `remove`. + +NocoBase предоставляет встроенный тип [remove](https://client.docs.nocobase.com/core/ui-schema/schema-settings#schemasettingsremove-1). Обновите `packages/plugins/@nocobase-sample/plugin-block-carousel/src/client/settings/index.ts`: + +```diff +import { SchemaSettings } from '@nocobase/client'; +import { BlockNameLowercase } from '../constants'; + +export const carouselSettings = new SchemaSettings({ + name: `blockSettings:${BlockNameLowercase}`, + items: [ ++ { ++ type: 'remove', ++ name: 'remove', ++ componentProps: { ++ removeParentsIfNoChildren: true, ++ breakRemoveOn: { ++ 'x-component': 'Grid', ++ }, ++ } ++ } + ] +}); +``` + +- `componentProps`: + - `removeParentsIfNoChildren`: Удалять родительский узел, если у него нет дочерних узлов. + - `breakRemoveOn`: Условие остановки удаления. Поскольку `Add Block` автоматически оборачивает элементы в `Grid`, устанавливаем `breakRemoveOn: { 'x-component': 'Grid' }`, чтобы не удалять выше `Grid`. + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240603162229_rec_.mp4" type="video/mp4" /> +</video> + +#### 7.2 Реализация операции `Edit Block title` + +Реализуем операцию `Edit Block title` для изменения заголовка блока. + +NocoBase предоставляет компонент `SchemaSettingsBlockTitleItem` (документация TODO), который можно использовать. + +Обновите `packages/plugins/@nocobase-sample/plugin-block-carousel/src/client/settings/index.ts`: + +```diff +- import { SchemaSettingsBlockTitleItem } from "@nocobase/client"; ++ import { SchemaSettings, SchemaSettingsBlockTitleItem } from "@nocobase/client"; + +import { SchemaSettings, SchemaSettingsBlockTitleItem } from '@nocobase/client'; +import { BlockNameLowercase } from '../constants'; +import { heightSchemaSettingsItem } from './items/height'; +import { objectFitSchemaSettingsItem } from './items/objectFit'; +import { imagesSchemaSettingsItem } from './items/images'; +import { autoplaySchemaSettingsItem } from './items/autoplay'; + +export const carouselSettings = new SchemaSettings({ + name: `blockSettings:${BlockNameLowercase}`, + items: [ ++ { ++ name: 'editBlockTitle', ++ Component: SchemaSettingsBlockTitleItem, ++ }, + { + type: 'remove', + name: 'remove', + componentProps: { + removeParentsIfNoChildren: true, + breakRemoveOn: { + 'x-component': 'Grid', + }, + } + } + ] +}); +``` + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240603162340_rec_.mp4" type="video/mp4" /> +</video> + +Другие переиспользуемые элементы SchemaSettings см. в документации (TODO). + +#### 7.3 Реализация операции `Edit Images` + +Реализуем операцию `Edit Images` для редактирования изображений в карусели. + +##### 7.3.1 Определение элемента SchemaSettings + +Создайте файл `packages/plugins/@nocobase-sample/plugin-block-carousel/src/client/settings/items/images.ts`: + +```ts +import { SchemaSettingsItemType, useDesignable, } from "@nocobase/client"; +import { useFieldSchema } from '@formily/react'; + +import { BlockNameLowercase } from "../../constants"; +import { useT } from "../../locale"; + +export const imagesSchemaSettingsItem: SchemaSettingsItemType = { + name: 'images', + type: 'actionModal', + useComponentProps() { + const filedSchema = useFieldSchema(); + const { deepMerge } = useDesignable(); + const t = useT(); + + return { + title: t('Edit Images'), + schema: { + type: 'object', + title: t('Edit Images'), + properties: { + src: { + title: t('Images'), + type: 'string', + default: filedSchema['x-decorator-props'][BlockNameLowercase]?.images ?? [], + 'x-decorator': 'FormItem', + 'x-component': 'Upload.Attachment', + 'x-component-props': { + action: 'attachments:create', + multiple: true + }, + }, + }, + }, + onSubmit({ src: images }: any) { + deepMerge({ + 'x-uid': filedSchema['x-uid'], + 'x-decorator-props': { + ...filedSchema['x-decorator-props'], + [BlockNameLowercase]: { + ...filedSchema['x-decorator-props']?.[BlockNameLowercase], + images, + }, + }, + }) + } + }; + }, +}; +``` + +Подробности о SchemaSettings Item см. в [SchemaSettingsItem](https://client.docs.nocobase.com/core/ui-schema/schema-settings#optionsitems). + +- `type`: Встроенный тип [actionModal](https://client.docs.nocobase.com/core/ui-schema/schema-settings#schemasettingsactionmodalitem) — всплывающее окно. +- `name`: Уникальный идентификатор для операций CRUD. +- `useComponentProps`: Возвращает свойства компонента `SchemaSettingsActionModalItem` для `actionModal`. + +`useComponentProps`: + +- Хуки: + - `useFieldSchema`: Получение текущей схемы узла. + - `useDesignable`: Получение экземпляра Designable, метод `deepMerge` для слияния схемы. + - `x-uid`: Уникальный идентификатор узла. + - `x-decorator-props`: Свойства узла, содержащие свойства `carousel`. + +- Свойства: + - `title`: Заголовок всплывающего окна. + - `schema`: Схема формы всплывающего окна. + - [Upload.Attachment](https://client.docs.nocobase.com/components/upload): Компонент загрузки. + - [FormItem](https://client.docs.nocobase.com/components/form-item): Элемент формы. + - `onSubmit`: Событие отправки формы. + +##### 7.3.2 Использование SchemaSettings Item + +Обновите `packages/plugins/@nocobase-sample/plugin-block-carousel/src/client/settings/index.ts`: + +```diff +// ... ++ import { imagesSchemaSettingsItem } from "./items/images"; + +export const carouselSettings = new SchemaSettings({ + name: `blockSettings:${BlockNameLowercase}`, + items: [ + { + name: 'editBlockTitle', + Component: SchemaSettingsBlockTitleItem, + }, ++ imagesSchemaSettingsItem, + { + type: 'remove', + name: 'remove', + componentProps: { + removeParentsIfNoChildren: true, + breakRemoveOn: { + 'x-component': 'Grid', + }, + } + } + ] +}); +``` + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240603162436_rec_.mp4" type="video/mp4" /> +</video> + +#### 7.4 Реализация `Edit Height` + +##### 7.4.1 Определение SchemaSettings Item + +Создайте файл `packages/plugins/@nocobase-sample/plugin-block-carousel/src/client/settings/items/height.ts`: + +```ts +import { SchemaSettingsItemType, useDesignable, } from "@nocobase/client"; +import { useFieldSchema } from '@formily/react'; + +import { BlockNameLowercase } from "../../constants"; +import { useT } from "../../locale"; + +export const heightSchemaSettingsItem: SchemaSettingsItemType = { + name: 'height', + type: 'actionModal', + useComponentProps() { + const filedSchema = useFieldSchema(); + const { deepMerge } = useDesignable(); + const t = useT(); + + return { + title: t('Edit Height'), + schema: { + type: 'object', + title: t('Edit Height'), + properties: { + height: { + title: t('Height'), + type: 'number', + default: filedSchema['x-decorator-props']?.[BlockNameLowercase]?.height, + 'x-decorator': 'FormItem', + 'x-component': 'InputNumber', + }, + }, + }, + onSubmit({ height }: any) { + deepMerge({ + 'x-uid': filedSchema['x-uid'], + 'x-decorator-props': { + ...filedSchema['x-decorator-props'], + [BlockNameLowercase]: { + ...filedSchema['x-decorator-props']?.[BlockNameLowercase], + height, + }, + }, + }) + } + }; + }, +}; +``` + +Подробности о SchemaSettings Item см. в [SchemaSettingsItem](https://client.docs.nocobase.com/core/ui-schema/schema-settings#optionsitems). + +- `type`: Встроенный тип [actionModal](https://client.docs.nocobase.com/core/ui-schema/schema-settings#schemasettingsactionmodalitem) — всплывающее окно. +- `name`: Уникальный идентификатор для операций CRUD. +- `useComponentProps`: Возвращает свойства компонента `SchemaSettingsActionModalItem` для `actionModal`. + +`useComponentProps`: + +- Хуки: + - `useFieldSchema`: Получение текущей схемы узла. + - `useDesignable`: Получение экземпляра Designable, метод `deepMerge` для слияния схемы. + - `x-uid`: Уникальный идентификатор узла. + - `x-decorator-props`: Свойства узла, содержащие свойства `carousel`. + +- Свойства: + - `title`: Заголовок всплывающего окна. + - `schema`: Схема формы всплывающего окна. + - [InputNumber](https://client.docs.nocobase.com/components/input-number): Поле ввода числа. + - [FormItem](https://client.docs.nocobase.com/components/form-item): Элемент формы. + - `onSubmit`: Событие отправки формы. + +##### 7.4.2 Использование SchemaSettings Item + +Обновите `packages/plugins/@nocobase-sample/plugin-block-carousel/src/client/settings/index.ts`: + +```diff +// ... ++ import { heightSchemaSettingsItem } from "./items/height"; + +export const carouselSettings = new SchemaSettings({ + name: `blockSettings:${BlockNameLowercase}`, + items: [ + { + name: 'editBlockTitle', + Component: SchemaSettingsBlockTitleItem, + }, + imagesSchemaSettingsItem, ++ heightSchemaSettingsItem, + { + type: 'remove', + name: 'remove', + componentProps: { + removeParentsIfNoChildren: true, + breakRemoveOn: { + 'x-component': 'Grid', + }, + } + } + ] +}); +``` + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240603162555_rec_.mp4" type="video/mp4" /> +</video> + +#### 7.5 Реализация `ObjectFit` + +##### 7.5.1 Определение SchemaSettings Item + +Создайте файл `packages/plugins/@nocobase-sample/plugin-block-carousel/src/client/settings/items/objectFit.ts`: + +```ts +import { SchemaSettingsItemType, useDesignable, } from "@nocobase/client"; +import { useFieldSchema } from '@formily/react'; +import { BlockNameLowercase } from "../../constants"; +import { useT } from "../../locale"; + +export const objectFitSchemaSettingsItem: SchemaSettingsItemType = { + name: 'objectFit', + type: 'select', + useComponentProps() { + const filedSchema = useFieldSchema(); + const { deepMerge } = useDesignable(); + const t = useT(); + + return { + title: t('Object Fit'), + options: [ + { label: 'Cover', value: 'cover' }, + { label: 'Contain', value: 'contain' }, + { label: 'Fill', value: 'fill' }, + { label: 'None', value: 'none' }, + { label: 'Scale Down', value: 'scale-down' }, + ], + value: filedSchema['x-decorator-props']?.[BlockNameLowercase]?.objectFit || 'cover', + onChange(v) { + deepMerge({ + 'x-uid': filedSchema['x-uid'], + 'x-decorator-props': { + ...filedSchema['x-decorator-props'], + [BlockNameLowercase]: { + ...filedSchema['x-decorator-props']?.[BlockNameLowercase], + objectFit: v, + }, + }, + }) + }, + }; + }, +}; +``` + +Подробности о SchemaSettings Item см. в [SchemaSettingsItem](https://client.docs.nocobase.com/core/ui-schema/schema-settings#optionsitems). + +- `type`: Встроенный тип [select](https://client.docs.nocobase.com/core/ui-schema/schema-settings#schemasettingsselectitem) — выпадающий список. +- `name`: Уникальный идентификатор для операций CRUD. +- `useComponentProps`: Возвращает свойства компонента `SchemaSettingsSelectItem` для `select`. + +`useComponentProps`: + +- Хуки: + - `useFieldSchema`: Получение текущей схемы узла. + - `useDesignable`: Получение экземпляра Designable, метод `deepMerge` для слияния схемы. + - `x-uid`: Уникальный идентификатор узла. + - `x-decorator-props`: Свойства узла, содержащие свойства `carousel`. + +- Свойства: + - `title`: Заголовок. + - `options`: Опции выбора. + - `value`: Значение по умолчанию. + - `onChange`: Событие изменения. + +##### 7.5.2 Использование SchemaSettings Item + +Обновите `packages/plugins/@nocobase-sample/plugin-block-carousel/src/client/settings/index.ts`: + +```diff +// ... ++ import { objectFitSchemaSettingsItem } from "./items/objectFit"; + +export const carouselSettings = new SchemaSettings({ + name: `blockSettings:${BlockNameLowercase}`, + items: [ + { + name: 'editBlockTitle', + Component: SchemaSettingsBlockTitleItem, + }, + imagesSchemaSettingsItem, + heightSchemaSettingsItem, ++ objectFitSchemaSettingsItem, + { + type: 'remove', + name: 'remove', + componentProps: { + removeParentsIfNoChildren: true, + breakRemoveOn: { + 'x-component': 'Grid', + }, + } + } + ] +}); +``` + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240603162655_rec_.mp4" type="video/mp4" /> +</video> + +#### 7.6 Реализация `Autoplay` + +##### 7.6.1 Определение SchemaSettings Item + +Создайте файл `packages/plugins/@nocobase-sample/plugin-block-carousel/src/client/settings/items/autoplay.ts`: + +```ts +import { SchemaSettingsItemType, useDesignable, } from "@nocobase/client"; +import { useFieldSchema } from '@formily/react'; + +import { BlockNameLowercase } from "../../constants"; +import { useT } from "../../locale"; + +export const autoplaySchemaSettingsItem: SchemaSettingsItemType = { + name: 'autoplay', + type: 'switch', + useComponentProps() { + const filedSchema = useFieldSchema(); + const { deepMerge } = useDesignable(); + const t = useT(); + + return { + title: t('Autoplay'), + checked: !!filedSchema['x-decorator-props']?.[BlockNameLowercase]?.autoplay, + onChange(v) { + deepMerge({ + 'x-uid': filedSchema['x-uid'], + 'x-decorator-props': { + ...filedSchema['x-decorator-props'], + [BlockNameLowercase]: { + ...filedSchema['x-decorator-props']?.[BlockNameLowercase], + autoplay: v, + }, + }, + }) + }, + }; + }, +}; +``` + +Подробности о SchemaSettings Item см. в [SchemaSettingsItem](https://client.docs.nocobase.com/core/ui-schema/schema-settings#optionsitems). + +- `type`: Встроенный тип [switch](https://client.docs.nocobase.com/core/ui-schema/schema-settings#schemasettingsswitchitem) — переключатель. +- `name`: Уникальный идентификатор для операций CRUD. +- `useComponentProps`: Возвращает свойства компонента `SchemaSettingsSwitchItem` для `switch`. + +`useComponentProps`: + +- Хуки: + - `useFieldSchema`: Получение текущей схемы узла. + - `useDesignable`: Получение экземпляра Designable, метод `deepMerge` для слияния схемы. + - `x-uid`: Уникальный идентификатор узла. + - `x-decorator-props`: Свойства узла, содержащие свойства `carousel`. + +- Свойства: + - `title`: Заголовок. + - `checked`: Значение по умолчанию. + - `onChange`: Событие изменения. + +##### 7.6.2 Использование SchemaSettings Item + +Обновите `packages/plugins/@nocobase-sample/plugin-block-carousel/src/client/settings/index.ts`: + +```diff +// ... ++ import { autoplaySchemaSettingsItem } from "./items/autoplay"; + +export const carouselSettings = new SchemaSettings({ + name: `blockSettings:${BlockNameLowercase}`, + items: [ + { + name: 'editBlockTitle', + Component: SchemaSettingsBlockTitleItem, + }, + imagesSchemaSettingsItem, + heightSchemaSettingsItem, + objectFitSchemaSettingsItem, ++ autoplaySchemaSettingsItem, + { + type: 'remove', + name: 'remove', + componentProps: { + removeParentsIfNoChildren: true, + breakRemoveOn: { + 'x-component': 'Grid', + }, + } + } + ] +}); +``` + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240603162803_rec_.mp4" type="video/mp4" /> +</video> + +#### 7.7 Добавление разделителя + +Операции `editBlockTitle` и `remove` являются универсальными, тогда как `src`, `height`, `objectFit` и `autoplay` относятся к конфигурации `Image`. Их можно разделить с помощью `divider`. + +Обновите `packages/plugins/@nocobase-sample/plugin-block-carousel/src/client/settings/index.ts`: + +```diff +// ... +export const carouselSettings = new SchemaSettings({ + name: `blockSettings:${BlockNameLowercase}`, + items: [ + { + name: 'editBlockTitle', + Component: SchemaSettingsBlockTitleItem, + }, ++ { ++ name: 'divider1', ++ type: 'divider' ++ }, + imagesSchemaSettingsItem, + heightSchemaSettingsItem, + objectFitSchemaSettingsItem, + autoplaySchemaSettingsItem, ++ { ++ name: 'divider2', ++ type: 'divider' ++ }, + { + type: 'remove', + name: 'remove', + componentProps: { + removeParentsIfNoChildren: true, + breakRemoveOn: { + 'x-component': 'Grid', + }, + } + } + ] +}); +``` + +![20240603162933](https://static-docs.nocobase.com/20240603162933.png) + +### 8. Права доступа + +TODO + +### 9. Мультиязычность + +#### 9.1 Английский язык + +Обновите файл `packages/plugins/@nocobase-sample/plugin-block-carousel/src/locale/en-US.json`: + +```json +{ + "Carousel": "Carousel", + "Edit Images": "Edit Images", + "Images": "Images", + "Autoplay": "Autoplay", + "Edit Height": "Edit Height", + "Height": "Height" +} +``` + +#### 9.2 Китайский язык + +Обновите файл `packages/plugins/@nocobase-sample/plugin-block-carousel/src/locale/zh-CN.json`: + +```json +{ + "Carousel": "走马灯", + "Edit Images": "编辑图片", + "Images": "图片", + "Autoplay": "自动播放", + "Edit Height": "编辑高度", + "Height": "高度" +} +``` + +Добавьте несколько языков через [http://localhost:13000/admin/settings/system-settings](http://localhost:13000/admin/settings/system-settings) и переключайте их в правом верхнем углу. + +![20240611113758](https://static-docs.nocobase.com/20240611113758.png) + +![20240611114018](https://static-docs.nocobase.com/20240611114018.png) + +## Сборка и загрузка в продакшен + +Следуя инструкциям из документа [Сборка и упаковка плагина](/development/your-fisrt-plugin#构建并打包插件), упакуйте плагин для продакшена. + +Если вы используете клонированный исходный код, сначала выполните полную сборку, чтобы включить зависимости плагина: + +```bash +yarn build +``` + +Если проект создан с помощью `create-nocobase-app`, выполните: + +```bash +yarn build @nocobase-sample/plugin-block-carousel --tar +``` + +В результате будет создан файл `storage/tar/@nocobase-sample/plugin-block-carousel.tar.gz`, который можно установить с помощью [метода загрузки](/welcome/getting-started/plugin). diff --git a/docs/ru-RU/plugin-samples/block/block-form.md b/docs/ru-RU/plugin-samples/block/block-form.md new file mode 100644 index 0000000000..21fa734ec4 --- /dev/null +++ b/docs/ru-RU/plugin-samples/block/block-form.md @@ -0,0 +1,1173 @@ +# Блок `Form` + +## Описание сценария + +Блок `Form` является одним из самых важных блоков в NocoBase и используется для отображения и редактирования данных из таблиц данных. В этом тексте подробно описывается реализация блока`Form`. + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/2024-07-19-18-07-25.mov" type="video/mp4" /> +</video> + +## Инициализация плагина + +Мы следуем документации по [созданию первого плагина](/development/your-fisrt-plugin). Если у вас еще нет проекта, вы можете начать с его создания; если проект уже существует или вы клонировали исходный код, пропустите этот шаг. + +```bash +yarn create nocobase-app my-nocobase-app -d sqlite +cd my-nocobase-app +yarn install +yarn nocobase install +``` + +Затем инициализируйте плагин и добавьте его в систему: + +```bash +yarn pm create @nocobase-sample/plugin-block-form +yarn pm enable @nocobase-sample/plugin-block-form +``` + +Затем запустите проект: + +```bash +yarn dev +``` + +После входа в систему перейдите по адресу [http://localhost:13000/admin/pm/list/locale/](http://localhost:13000/admin/pm/list/locale/), чтобы увидеть, что плагин установлен и активирован. + +## Реализация функционала + +Перед реализацией данного примера рекомендуется ознакомиться с базовыми концепциями: + +- [Форма ant-design ](https://ant.design/components/form) +- [Форма @formily/antd-v5 ](https://antd5.formilyjs.org/components/form) +- [Руководсвто по SchemaInitializer ](/development/client/ui-schema/initializer):используется для добавления различных блоков, полей, операций и т.д. в интерфейс +- [SchemaInitializer API](https://client.docs.nocobase.com/core/ui-schema/schema-initializer):используется для добавления различных блоков, полей, операций и т.д. в интерфейс +- [Проктокол UI Schema](/development/client/ui-schema/what-is-ui-schema):подробное объяснение структуры схем и роли каждого свойства +- [Дизайнер Designable](/development/client/ui-schema/designable):используется для изменения схем + +```bash +. +├── client # Клиентская часть плагина +│ ├── FormV3.configActions # Инициализатор конфигурации +│ ├── index.ts +│ └── items +│ └── submit # Действие отправки +│ ├── index.ts +│ ├── initializer.tsx +│ ├── schema.ts +│ └── settings.ts +│ ├── FormV3.configFields # Инициализатор полей +│ ├── FormV3.settings # Настройки +│ ├── FormV3.initializer.ts # Инициализатор +│ ├── FormV3.schema.ts # Schema +│ ├── FormV3.tsx # Component +│ ├── index.tsx # Точка входа клиентского плагина +│ └── locale.ts # Функции локализации +├── locale # Файлы локализации +│ ├── en-US.json # Английский язык +│ └── zh-CN.json # Китайский язык +├── index.ts # Точка входа серверной части плагина +└── server # Серверная часть плагина +``` + +### 1. Определение названия + +Сначала необходимо задать название блока, которое будет использоваться в различных местах. + +Создаем файл `packages/plugins/@nocobase-sample/plugin-block-form/src/client/constants.ts`: + +```ts +export const FormV3BlockName = 'FormV3'; +export const FormV3BlockNameLowercase = 'form-v3'; +``` + +> Чтобы избежать конфликта с существующим компонентом `Form`, мы назвали его `FormV3` + +### 2. Реализация компонента блока + +#### 2.1 Определение компонента блока + +Создадим файл `packages/plugins/@nocobase-sample/plugin-block-form/src/client/FormV3.tsx` со следующим содержимым: + +```tsx | pure +import React, { FC } from 'react'; +import { Form, FormProps } from '@formily/antd-v5'; +import { withDynamicSchemaProps } from '@nocobase/client'; +import { FormV3BlockName } from './constants' + +export interface FormV3Props extends FormProps { + children?: React.ReactNode; +} + +export const FormV3: FC<FormV3Props> = withDynamicSchemaProps((props) => { + return <Form {...props} layout={props.layout || 'vertical'} /> +}, { displayName: FormV3BlockName }); +``` + +Компонент `Form` по сути является функциональным компонентом, обернутым в `withDynamicSchemaProps`. [withDynamicSchemaProps](/development/client/ui-schema/what-is-ui-schema#x-component-props-和-x-use-component-props) — это компонент высшего порядка (HOC), который обрабатывает динамические свойства в Schema. + +Если не учитывать `withDynamicSchemaProps`, то компонент`Form` представляет собой простой функциональный компонент. + +#### 2.2 Регистрация компонента блока + +Необходимо зарегистрировать компонент `FormV3` в системе через плагин. + +```tsx | pure +import { Plugin } from '@nocobase/client'; +import { FormV3 } from './FormV3'; + +export class PluginBlockFormClient extends Plugin { + async load() { + this.app.addComponents({ FormV3 }) + } +} + +export default PluginBlockFormClient; +``` + +#### 2.3 Проверка компонента блока + +Существует 2 способа проверки компонента: + +- Временная страница для проверки: можно временно создать страницу и отрендерить компонент `Form`, чтобы убедиться, что он соответствует требованиям. +- Проверка через примеры в документации: можно запустить документацию `yarn doc plugins/@nocobase-sample/plugin-block-form` и проверить компонент, написав примеры в документации (TODO). + +Рассмотрим пример`временной страницы для проверки`. Создадим новую страницу, добавим один или несколько компонентов `Form` с различными параметрами и проверим, соответствует ли результат требованиям. + +```tsx | pure +import React from 'react'; +import { Plugin, SchemaComponent } from '@nocobase/client'; +import { FormV3 } from './FormV3'; + +export class PluginBlockFormClient extends Plugin { + async load() { + this.app.addComponents({ FormV3 }) + + this.app.router.add('admin.block-form-component', { + path: '/admin/block-form-component', + Component: () => { + return <FormV3> + <SchemaComponent schema={{ + type: 'void', + properties: { + username: { + type: 'string', + 'x-decorator': 'FormItem', + 'x-component': 'Input', + title: 'Username', + required: true, + }, + nickname: { + type: 'string', + 'x-decorator': 'FormItem', + 'x-component': 'Input', + title: 'Nickname', + }, + password: { + type: 'string', + 'x-decorator': 'FormItem', + 'x-component': 'Input', + title: 'Password', + }, + button: { + type: 'void', + 'x-component': 'Action', + title: 'Submit', + 'x-use-component-props': useSubmitActionProps, + }, + } + }} /> + </FormV3> + } + }); + } +} + +export default PluginBlockFormClient; +``` + +Затем перейдите по адресу `http://localhost:13000/admin/form-component` чтобы увидеть содержимое тестовой страницы. + +![20240718175735](https://static-docs.nocobase.com/20240718175735.png) + +После завершения проверки необходимо удалить тестовую страницу. + +### 3. Определение блок-схемы + +#### 3.1 Определение блок-схемы + +Динамические страницы в NocoBase рендерятся через Schema, поэтому нам нужно определить Schema, которое будет использоваться для добавления блока `Form` в интерфейсе. Перед реализацией этого раздела рекомендуется ознакомиться с базовыми концепциями: + +- [Протокол UI Schema](/development/client/ui-schema/what-is-ui-schema):подробное описание структуры Schema и назначения каждого атрибута + +Создаем файл `packages/plugins/@nocobase-sample/plugin-block-form/src/client/FormV3.schema.ts`: + +```tsx | pure +import { ISchema, useDataBlockProps } from "@nocobase/client"; + +import { FormV3BlockName, FormV3BlockNameLowercase } from "./constants"; +import { FormV3Props } from "./FormV3"; + +export function useFormV3Props(): FormV3Props { + const blockProps = useDataBlockProps(); + return blockProps[FormV3BlockNameLowercase]; +} + +interface GetFormV3SchemaOptions { + dataSource?: string; + collection: string; + properties?: ISchema['properties']; +} + +export function getFormV3Schema(options: GetFormV3SchemaOptions): ISchema { + const { dataSource, collection, properties = {} } = options; + return { + type: 'void', + 'x-component': 'CardItem', + 'x-decorator': 'DataBlockProvider', + 'x-decorator-props': { + dataSource, + collection, + [FormV3BlockNameLowercase]: {}, + }, + properties: { + [FormV3BlockNameLowercase]: { + type: 'void', + 'x-component': FormV3BlockName, + 'x-use-component-props': 'useFormV3Props', + properties: { + ...properties, + } + }, + } + } +} +``` + +`getFormV3Schema`: + - `type`:Тип, здесь `void`,что указывает на чистый UI-узел без данных. + - `'x-component': 'CardItem'`:[CardItem 组件](https://client.docs.nocobase.com/components/card-item), все блоки оборачиваются в карточки для стилей, макета и drag-and-drop функционала + - `x-decorator: 'DataBlockProvider'`:провайдер данных блока, подробнее в [DataBlockProvider](https://client.docs.nocobase.com/core/data-block/data-block-provider) + - `x-decorator-props`:`DataBlockProvider` свойства DataBlockProvider + - `dataSource`:источник данных + - `collection`:таблица данных + - `[FormV3BlockNameLowercase]: {}`:`FormV3` свойства компонента FormV3 + - `properties: { [FormV3BlockNameLowercase]: { ... } }`:Подузлы + - `[FormV3BlockNameLowercase]`:`FormV3` свойства компонента FormV3 + - `'x-component': FormV3BlockName`:`FormV3` компонент FormV3 + - `'x-use-component-props': 'useFormV3Props'`:использует [x-use-component-props](/development/client/ui-schema/what-is-ui-schema#x-component-props-和-x-use-component-props) для получения свойств компонента + - `"x-toolbar": "BlockSchemaToolbar"`:`BlockSchemaToolbar` BlockSchemaToolbar отображает текущую таблицу данных в верхнем левом углу, обычно используется с `DataBlockProvider` + +`useFormV3Props`:Hooks,для получения свойств компонента `FormV3` + - [useDataBlockProps](https://client.docs.nocobase.com/core/data-block/data-block-provider#usedatablockprops):Получает свойства [DataBlockProvider](https://client.docs.nocobase.com/core/data-block/data-block-provider) , то есть значение `x-decorator-props` + - `blockProps[FormV3BlockNameLowercase]`:свойства компонента`FormV3` + +Эквивалент этого Schema в React-компонентах: + +```tsx | pure +<CardItem> + <DataBlockProvider dataSource={dataSource} collection={collection} formV3={{}}> + <FormV3 {...useFormV3Props()}> + {children} + </FormV3> + </DataBlockProvider> +</CardItem> +``` + +#### 3.2 Регистрация scope + +Необходимо зарегистрировать `useFormV3Props` в системе, чтобы [x-use-component-props](/development/client/ui-schema/what-is-ui-schema#x-component-props-和-x-use-component-props) мог найти соответствующий scope. + +```tsx | pure +import { Plugin } from '@nocobase/client'; +import { FormV3 } from './FormV3'; +import { useFormV3Props } from './FormV3.schema'; + +export class PluginBlockFormClient extends Plugin { + async load() { + this.app.addComponents({ FormV3 }) + this.app.addScopes({ useFormV3Props }); + } +} + +export default PluginBlockFormClient; +``` + + +Больше информации о scope можно найти в документации: [全局注册 Component 和 Scope](/plugin-samples/component-and-scope/global) + +#### 3.3 Проверка Schema блока + +Как и при проверке компонентов, мы можем использовать временные страницы или примеры в документации для проверки схемы. Здесь мы рассмотрим пример с временной страницей: + +```tsx | pure +import React from 'react'; +import { Plugin, SchemaComponent } from '@nocobase/client'; +import { FormV3 } from './FormV3'; +import { useFormV3Props, getFormV3Schema } from './FormV3.schema'; + +import { useForm } from '@formily/react'; +function useSubmitActionProps(): ActionProps { + const form = useForm(); + + return { + type: 'primary', + htmlType: 'submit', + async onClick() { + await form.submit(); + const values = form.values; + + console.log('values', values); + }, + }; +} + +export class PluginBlockFormClient extends Plugin { + async load() { + this.app.addComponents({ FormV3 }) + this.app.addScopes({ useFormV3Props }); + + this.app.router.add('admin.block-form-schema', { + path: '/admin/block-form-schema', + Component: () => { + return <> + <div style={{ marginTop: 20, marginBottom: 20 }}> + <SchemaComponent schema={{ + properties: { + test: getFormV3Schema({ + collection: 'users', + properties: { + username: { + type: 'string', + 'x-decorator': 'FormItem', + 'x-component': 'CollectionField', + }, + nickname: { + type: 'string', + 'x-decorator': 'FormItem', + 'x-component': 'CollectionField', + }, + submit: { + type: 'void', + 'x-component': 'Action', + title: 'Submit', + 'x-use-component-props': useSubmitActionProps, + }, + } + }) + } + }} /> + </div> + </> + } + }) + } +} + +export default PluginBlockFormClient; +``` + +Больше информации о `SchemaComponent` можно найти в документации [SchemaComponent](https://client.docs.nocobase.com/core/ui-schema/schema-component#schemacomponent-1). + +Перейдите по адресу [http://localhost:13000/admin/block-form-schema](http://localhost:13000/admin/block-form-schema), чтобы увидеть содержимое тестовой страницы. + +![20240718180826](https://static-docs.nocobase.com/20240718180826.png) + +После завершения проверки необходимо удалить тестовую страницу. + +### 4. Определение элемента Schema Initializer + +Создадим файл `packages/plugins/@nocobase-sample/plugin-block-form/src/client/FormV3.initializer.tsx`: + +```ts +import React from 'react'; +import { SchemaInitializerItemType, useSchemaInitializer } from '@nocobase/client' +import { FormOutlined } from '@ant-design/icons'; + +import { getFormV3Schema } from './FormV3.schema' +import { FormV3BlockName } from './constants'; +import { useT } from './locale'; + +export const formV3InitializerItem: SchemaInitializerItemType = { + name: FormV3BlockName, + Component: 'DataBlockInitializer', + useComponentProps() { + const { insert } = useSchemaInitializer(); + const t = useT(); + + return { + title: t(FormV3BlockName), + icon: <FormOutlined />, + componentType: FormV3BlockName, + onCreateBlockSchema({ item }) { + insert(getFormV3Schema({ dataSource: item.dataSource, collection: item.name })) + }, + }; + }, +} +``` + +`formV3InitializerItem`: + +- `Component`:В отличие от [ добавления простого блока Simple Block](/plugin-samples/schema-initializer/block-simple), где используется `type`,здесь используется `Component`,[Оба способа определения](https://client.docs.nocobase.com/core/ui-schema/schema-initializer#two-ways-to-define-component-and-type) допустимы +- `useComponentProps`: Свойства компонента `DataBlockInitializer` + - `title`:Заголовок + - `icon`:Иконка (доступные иконки: [Ant Design Icons](https://ant.design/components/icon/)) + - `componentType`:Тип компонента (в данном случае`Info`) + - `onCreateBlockSchema`:Callback при выборе таблицы данных + - `item`:Информация о выбранной таблице + - `item.name`: Название таблицы данных + - `item.dataSource`: Источник данных таблицы + - [useSchemaInitializer](https://client.docs.nocobase.com/core/ui-schema/schema-initializer#useschemainitializer):Предоставляет методы для вставки Schema + +Больше информации о определении Schema Initializer можно найти в документации [Schema Initializer](https://client.docs.nocobase.com/core/ui-schema/schema-initializer). + +### 5. Добавление в Add block + +В системе есть несколько кнопок `Add block`, но у них **разные имена name** + +![img_v3_02b4_049b0a62-8e3b-420f-adaf-a6350d84840g](https://static-docs.nocobase.com/img_v3_02b4_049b0a62-8e3b-420f-adaf-a6350d84840g.jpg) + +Если мы хотим добавить наш блок в `Add block` на уровне страницы, нам нужно знать соответствующее имя `name`,Мы можем определить его через TODO (способ определения будет добавлен позже). + +TODO + +На приведенной выше схеме видно, что `Add block` на уровне страницы имеет name `page:addBlock`,а `Data Blocks` имеет name`dataBlocks`。 + +Теперь мы модифицируем файл `packages/plugins/@nocobase-sample/plugin-block-form/src/client/index.tsx`: + +```tsx | pure +import { Plugin } from '@nocobase/client'; + +import { FormV3 } from './FormV3'; +import { useFormV3Props } from './FormV3.schema'; +import { formV3InitializerItem } from './FormV3.initializer'; + +export class PluginBlockFormClient extends Plugin { + async load() { + this.app.addComponents({ FormV3 }) + this.app.addScopes({ useFormV3Props }); + + this.app.schemaInitializerManager.addItem('page:addBlock', `dataBlocks.${formV3InitializerItem.name}`, formV3InitializerItem); + } +} + +export default PluginBlockFormClient; +``` + +Здесь мы используем [app.schemaInitializerManager.addItem](https://client.docs.nocobase.com/core/ui-schema/schema-initializer-manager#schemainitializermanageradditem) для добавления `formV3InitializerItem` в соответствующий подэлемент Initializer. В данном случае `page:addBlock` — это name кнопки `Add block` на странице, а `dataBlocks` — это name родительского элемента. + +Теперь при наведении на кнопку `Add block` мы увидим новый тип блока `FormV3`. + +![20240719112105](https://static-docs.nocobase.com/20240719112105.png) + +При клике на таблицу `Users`, можно добавить новый блок `FormV3`, но в данный момент подэлементы пусты. + +![20240719112149](https://static-docs.nocobase.com/20240719112149.png) + +### 6. Реализация Schema Settings + +В настоящее время блок можно только добавить, но нельзя удалить. Нам нужно реализовать `Schema Settings`,чтобы настроить некоторые свойства и операции. + +#### 6.1 Определение Schema Settings + +Для полноценного блока также необходимы Schema Settings, которые используются для настройки некоторых свойств и операций. + +Создадим файл `packages/plugins/@nocobase-sample/plugin-block-form/src/client/FormV3.settings/index.ts` : + +```ts | pure +import { SchemaSettings } from "@nocobase/client"; +import { FormV3BlockNameLowercase } from "../constants"; + +export const formV3Settings = new SchemaSettings({ + name: `blockSettings:${FormV3BlockNameLowercase}`, + items: [ + // TODO + ] +}) +``` + +#### 6.2 Регистрация Schema Settings + +```ts +import { Plugin } from '@nocobase/client'; +import { formV3Settings } from './FormV3.settings'; + +export class PluginBlockFormClient extends Plugin { + async load() { + // ... + this.app.schemaSettingsManager.add(formV3Settings) + } +} + +export default PluginBlockFormClient; +``` + +#### 6.3 使用 Schema Settings + +Модифицируем функцию `getFormV3Schema` в файле `packages/plugins/@nocobase-sample/plugin-block-form/src/client/schema/index.ts`: + +```diff ++ import { formV3Settings } from "./FormV3.settings"; + +export function getFormV3Schema(options: GetFormV3SchemaOptions): ISchema { + const { dataSource, collection, properties = {} } = options; + return { + type: 'void', + 'x-decorator': 'CardItem', ++ 'x-settings': formV3Settings.name, + // ... + } +}; +``` + + +### 7. Реализация Schema Settings items + +В настоящее время мы только реализовали `Schema Settings`, но не добавили никаких операций. Нам нужно реализовать различные операции в соответствии с требованиями. + +Поддерживаемые встроенные типы операций Schema Settings описаны в документации [Schema Settings - Built-in Components and Types](https://client.docs.nocobase.com/core/ui-schema/schema-settings#built-in-components-and-types) . + +#### 7.1 Реализация `remove` операции + +В настоящее время блоки, добавленные через initializers, нельзя удалить. Нам нужно реализовать операцию `remove`. + +[NocoBase] предоставляет встроенный тип операции [remove](https://client.docs.nocobase.com/core/ui-schema/schema-settings#schemasettingsremove-1). Модифицируем файл`packages/plugins/@nocobase-sample/plugin-block-form/src/client/settings/index.ts`: + +```diff +import { SchemaSettings } from '@nocobase/client'; +import { BlockNameLowercase } from '../constants'; + +export const formV3Settings = new SchemaSettings({ + name: `blockSettings:${FormV3BlockNameLowercase}`, + items: [ ++ { ++ type: 'remove', ++ name: 'remove', ++ componentProps: { ++ removeParentsIfNoChildren: true, ++ breakRemoveOn: { ++ 'x-component': 'Grid', ++ }, ++ } ++ } + ] +}); +``` + +- componentProps + - `removeParentsIfNoChildren`:Если нет подузлов, удалить родительский узел. + - `breakRemoveOn`:Условие прерывания удаления. Поскольку `Add Block` автоматически оборачивает дочерние элементы в `Grid`, здесь мы устанавливаем `breakRemoveOn: { 'x-component': 'Grid' }`, чтобы при удалении `Grid` прекратить удаление вверх по иерархии. + + +Изменения schema не затрагивают уже добавленные блоки - только новые блоки будут использовать обновленную схему. Для проверки нужно добавить новый блок.。 + +![20240719145202](https://static-docs.nocobase.com/20240719145202.png) + +#### 7.2 Реализация операции `Редактировать заголовок блока` + +Функция ` редактирования заголовка блока` - часто используемая операция. `@nocobase/client` предоставляет готовый компонент `SchemaSettingsBlockTitleItem`. + +```diff +- import { SchemaSettings } from "@nocobase/client"; ++ import { SchemaSettings, SchemaSettingsBlockTitleItem } from "@nocobase/client"; + +export const formV3Settings = new SchemaSettings({ + name: `blockSettings:${FormV3BlockNameLowercase}`, + items: [ ++ { ++ name: 'blockTitle', ++ Component: SchemaSettingsBlockTitleItem, ++ }, + { + type: 'remove', + name: 'remove', + componentProps: { + removeParentsIfNoChildren: true, + breakRemoveOn: { + 'x-component': 'Grid', + }, + } + }, + ] +}) +``` + +![20240719145326](https://static-docs.nocobase.com/20240719145326.png) + + +### 8. Реализация`Configure actions` + +Функционал `Configure actions` позволяет добавлять различные действия, такие как `Submit`、`Custom request` и другие. + +Подробнее о `Configure actions` можно узнать в [документации Initializer](/plugin-samples/schema-initializer/configure-actions). + +#### 8.1 Определение initializer + +Создадим файл `packages/plugins/@nocobase-sample/plugin-block-form/src/client/FormV3.configFields/index.ts`: + +```ts +import { SchemaInitializer } from "@nocobase/client"; +import { FormV3BlockNameLowercase } from "../constants"; + +export const formV3ConfigureActionsInitializer = new SchemaInitializer({ + name: `${FormV3BlockNameLowercase}:configureActions`, + icon: 'SettingOutlined', + title: tStr('Configure actions'), + style: { + marginLeft: 8, + }, + items: [ + // TODO + ] +}); +``` + +Мы определили новый `SchemaInitializer`,его подэлементы пока пусты. + +- [SchemaInitializer](https://client.docs.nocobase.com/core/ui-schema/schema-initializer): Используется для создания экземпляра Schema Initializer. +- `icon`:Иконка (доступные варианты в Ant Design [Icons](https://ant.design/components/icon/)) +- `title`:Заголовок кнопки +- [items](https://client.docs.nocobase.com/core/ui-schema/schema-initializer#built-in-components-and-types):Подэлементы кнопки. + +#### 8.2 Регистрация initializer + +Модифицируем файл `packages/plugins/@nocobase-sample/plugin-block-form/src/client/index.tsx`, импортируем и зарегистрируем этот initializer:r: + +```tsx | pure +// ... +import { formV3ConfigureActionsInitializer } from './FormV3.configActions'; + +export class PluginBlockFormClient extends Plugin { + async load() { + this.app.schemaInitializerManager.add(formV3ConfigureActionsInitializer); + + // ... + } +} +``` + +#### 8.3 使用 initializer + +Модифицируем файл `packages/plugins/@nocobase-sample/plugin-block-form/src/client/FormV3.schema.ts`, добавим подэлемент `actionBar`: + +```diff +// ... ++ import { formV3ConfigureActionsInitializer } from "./FormV3.configActions"; + +export function getFormV3Schema(options: GetFormV3SchemaOptions): ISchema { + const { dataSource, collection, properties = {} } = options; + return { + type: 'void', + 'x-component': 'CardItem', + 'x-decorator': 'DataBlockProvider', + 'x-decorator-props': { + dataSource, + collection, + action, + params, + [FormV3BlockNameLowercase]: {}, + }, + 'x-settings': formV3Settings.name, + "x-toolbar": "BlockSchemaToolbar", + properties: { + [FormV3BlockNameLowercase]: { + type: 'void', + 'x-component': FormV3BlockName, + 'x-use-component-props': 'useFormV3Props', + properties: { + ...properties as any, ++ actionBar: { ++ type: 'void', ++ "x-initializer": formV3ConfigureActionsInitializer.name, ++ "x-component": "ActionBar", ++ "x-component-props": { ++ "layout": "one-column", ++ "style": { ++ "marginTop": 24 ++ } ++ }, ++ }, + } + } + } + } +} +``` + +`configure actions` обычно используется вместе с компонентом [ActionBar](https://client.docs.nocobase.com/components/action#actionbar). + +Мы добавили подэлемент `actionBar` в `FormV3`: + +- `type: 'void'`:Тип `void`, что означает, что это контейнер. + - `x-component: 'ActionBar'`:Используется компонент [ActionBar](https://client.docs.nocobase.com/components/action#actionbar) для отображения кнопок. +- `x-initializer: formV3ConfigureActionsInitializer.name`:Используется созданный нами Initializer +- `x-component-props.layout: 'one-column'`:Однострочный макет, подробнее смотрите в [ActionBar one-column](https://client.docs.nocobase.com/components/action#one-column) + +![20240719152528](https://static-docs.nocobase.com/20240719152528.png) + +### 9. Реализация `Configure actions` items + +```bash +. +├── FormV3.configActions +├── index.ts +└── items + └── submit # 提交操作 + ├── index.ts + ├── initializer.tsx + ├── schema.ts + └── settings.ts +``` + +#### 9.1 Реализация операции `Submit` + +##### 9.1.1 Определение Schema + +Создаем файл`packages/plugins/@nocobase-sample/plugin-block-form/src/client/FormV3.configActions/items/submit/schema.ts`: + +```ts +import { useForm } from '@formily/react'; +import { App } from 'antd'; +import { ActionProps, useDataBlockResource } from "@nocobase/client"; +import { tStr } from '../../../locale' + +export const useFormV3SubmitActionProps = (): ActionProps => { + const resource = useDataBlockResource(); + const form = useForm(); + const { message } = App.useApp(); + return { + type: 'primary', + htmlType: 'submit', + async onClick() { + await form.submit(); + const values = form.values; + await resource.create({ values }) + await form.reset(); + message.success('Created successfully'); + }, + } +} + +export const submitActionSchema = { + type: 'void', + title: tStr('Submit'), + 'x-component': 'Action', + 'x-use-component-props': 'useFormV3SubmitActionProps', + 'x-toolbar': 'ActionSchemaToolbar' +}; +``` + +`submitActionSchema`: + - `type: 'void'`:Указывает, что это UI-элемент без привязки к данным + - `x-component: 'Action'`: Используется компонент [Action](https://client.docs.nocobase.com/components/action) для отображения кнопки. + - `title: 'Submit'`:Заголовок кнопки. + - `x-use-component-props: 'useFormV3SubmitActionProps'`:Связывает свойства компонента с хуком `useFormV3SubmitActionProps`Используется строковая ссылка, так как Schema сохраняется на сервере. + - `'x-toolbar': 'ActionSchemaToolbar'`: Обычно используется вместе с компонентом `Action`. Отличается от стандартного ToolBar тем, что скрывает `Initializer` в правом верхнем углу, оставляя только Drag и Settings. + + - `useFormV3SubmitActionProps`:Это React Hook, который возвращает свойства компонента Action. + - [useDataBlockResource()](https://client.docs.nocobase.com/core/data-block/data-block-request-provider):Объект запроса данных блока, предоставляемый `DataBlockProvider`, используется для автоматического получения данных блока. + - `resource.create`: Используется для создания данных. + - `useForm`:Получает объект формы Formily. + - `form.submit()`: Отправляет форму и запускает валидацию. + - `form.values`:Текущие значения формы. + - `form.reset()`:Сброс значений формы. + - `type: 'primary'`:Стиль кнопки `primary` + - `onClick`:Обработчик клика по кнопке. + + +Затем экспортируем его в файле `packages/plugins/@nocobase-sample/plugin-block-form/src/client/FormV3.configActions/items/submit/index.ts`: + +```ts +export * from './schema'; +``` + +##### 9.1.2 Регистрация Scope + +Нам также нужно зарегистрировать `useFormV3SubmitActionProps` в контексте. Модифицируем файл `packages/plugins/@nocobase-sample/plugin-block-form/src/client/index.tsx`: + +```diff +// ... ++ import { useFormV3SubmitActionProps } from './FormV3.configActions/items/submit'; + +export class PluginBlockFormClient extends Plugin { + async load() { + // ... +- this.app.addScopes({ useFormV3Props }); ++ this.app.addScopes({ useFormV3Props, useFormV3SubmitActionProps }); + } +} +``` + +Больше информации о `SchemaComponentOptions` можно найти в документации [SchemaComponentOptions](https://client.docs.nocobase.com/core/ui-schema/schema-component#schemacomponentoptions) и [全局注册 Component 和 Scope](/plugin-samples/component-and-scope/global). + +##### 9.1.3 Определение SchemaInitializer item + +Создадим файл `packages/plugins/@nocobase-sample/plugin-block-form/src/client/FormV3.configActions/items/submit/initializer.tsx`: + +```tsx | pure +import { SchemaInitializerItemType, useSchemaInitializer } from "@nocobase/client"; +import { submitActionSchema } from "./schema"; +import { tStr } from '../../../locale'; + +export const submitActionInitializerItem: SchemaInitializerItemType = { + type: 'item', + name: 'submit', + title: tStr('Submit'), + useComponentProps() { + const { insert } = useSchemaInitializer(); + return { + onClick() { + insert(submitActionSchema) + }, + }; + }, +}; +``` + +- `type: 'item'`: - тип элемента, указывает что это текстовый элемент, при клике на который срабатывает событие `onClick`. +- `name: 'submit'`:- уникальный идентификатор, используется для различения разных элементов Schema и операций CRUD (создание, чтение, обновление, удаление). +- `title: 'Submit'`:Заголовок кнопки. + +Больше информации о определении Schema Item можно найти в документации [Schema Initializer Item](https://client.docs.nocobase.com/core/ui-schema/schema-initializer#built-in-components-and-types). + + +Затем модифицируем файл `packages/plugins/@nocobase-sample/plugin-block-form/src/client/FormV3.configActions/items/submit/index.ts` для экспорта: + +```tsx | pure +export * from './initializer'; +``` + +###### 9.1.4 Использование SchemaInitializer item + +Затем модифицируем файл `packages/plugins/@nocobase-sample/plugin-block-form/src/client/FormV3.configActions/index.ts`, добавляя `submitActionInitializerItem` в `items`: + +```diff +// ... ++ import { submitActionInitializerItem } from "./items/submit"; + +export const formV3ConfigureActionsInitializer = new SchemaInitializer({ + name: `${FormV3BlockNameLowercase}:configureActions`, + icon: 'SettingOutlined', + title: 'Configure actions', + style: { + marginLeft: 8, + }, + items: [ ++ submitActionInitializerItem, + ] +}); +``` + +##### 9.1.5 Определение settings + +Создадим файл `packages/plugins/@nocobase-sample/plugin-block-form/src/client/FormV3.configActions/items/submit/settings.ts` + +```tsx | pure +import { ButtonEditor, SchemaSettings, useSchemaToolbar } from "@nocobase/client"; + +export const formV3SubmitActionSettings = new SchemaSettings({ + name: `actionSettings:formV3Submit`, + items: [ + { + name: 'editButton', + Component: ButtonEditor, + useComponentProps() { + const { buttonEditorProps } = useSchemaToolbar(); + return buttonEditorProps; + }, + }, + { + name: 'remove', + type: 'remove', + } + ] +}) +``` + +`formV3SubmitActionSettings`: + - `editButton`:Используется для редактирования стиля кнопки. + - `remove`: Добавляет возможность удаления элемента. + +Больше информации о определении Schema Settings можно найти в документации [Schema Settings](https://client.docs.nocobase.com/core/ui-schema/schema-settings). + +Модифицируем файл `packages/plugins/@nocobase-sample/plugin-block-form/src/client/FormV3.configActions/items/submit/index.ts` для экспорта: + +```tsx | pure +export * from './settings'; +``` + +##### 9.1.6 Регистрация settings + +Затем зарегистрируем `formV3SubmitActionSettings` в системе. Модифицируем файл `packages/plugins/@nocobase-sample/plugin-block-form/src/client/index.tsx`: + +```diff +- import { useFormV3SubmitActionProps } from './FormV3.configActions/items/submit'; ++ import { formV3SubmitActionSettings, useFormV3SubmitActionProps } from './FormV3.configActions/items/submit'; + +export class PluginBlockFormClient extends Plugin { + async load() { ++ this.app.schemaSettingsManager.add(formV3SubmitActionSettings); + } +} +``` + +##### 9.1.7 Использование settings + +Мы модифицируем метод `submitActionSchema` в файле `packages/plugins/@nocobase-sample/plugin-block-form/src/client/FormV3.configActions/items/submit/schema.ts`, добавляя свойство `x-settings` со значением `formV3SubmitActionSettings.name`。 + +```diff ++ import { formV3SubmitActionSettings } from './settings'; + +export const submitActionSchema = { + type: 'void', + title: tStr('Submit'), + 'x-component': 'Action', ++ 'x-settings': formV3SubmitActionSettings.name, + 'x-use-component-props': 'useFormV3SubmitActionProps', + 'x-toolbar': 'ActionSchemaToolbar' +}; +``` + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240719160328.mov" type="video/mp4" /> +</video> + +#### 9.2 Реализация `Custom request` + +Операция `Custom request` (Пользовательский запрос) является стандартным функционалом в NocoBase. Платформа предоставляет встроенный компонент `CustomRequest` который мы можем использовать напрямую. + + +Модифицируем файл `packages/plugins/@nocobase-sample/plugin-block-form/src/client/FormV3.configActions/index.ts`: + +```diff + +import { SchemaInitializer } from "@nocobase/client"; +import { FormV3BlockNameLowercase } from "../constants"; +import { submitActionInitializerItem } from "./items/submit"; ++ import { tStr } from '../locale' + +export const formV3ConfigureActionsInitializer = new SchemaInitializer({ + name: `${FormV3BlockNameLowercase}:configureActions`, + icon: 'SettingOutlined', + title: 'Configure actions', + style: { + marginLeft: 8, + }, + items: [ + submitActionInitializerItem, ++ { ++ name: 'customRequest', ++ title: tStr('Custom request'), ++ Component: 'CustomRequestInitializer', ++ }, + ] +}); +``` + +![20240719165222](https://static-docs.nocobase.com/20240719165222.png) + +### 10. Реализация `Configure fields` + +Функционал `Configure fields` позволяет добавлять поля данных в блок FormV3. + +#### 10.1 Определение initializer + +Создаем файл `packages/plugins/@nocobase-sample/plugin-block-form/src/client/FormV3.configFields/index.ts`: + +```ts +import { gridRowColWrap, SchemaInitializer } from "@nocobase/client"; +import { FormV3BlockNameLowercase } from '../constants'; + +export const formV3ConfigureFieldsInitializer = new SchemaInitializer({ + name: `${FormV3BlockNameLowercase}:configureFields`, + icon: 'SettingOutlined', + wrap: gridRowColWrap, + title: tStr('Configure fields'), + items: [ + // TODO + ] +}); +``` + +`formV3ConfigureFieldsInitializer`: + - `name`: Уникальный идентификатор + - `icon`:иконка компонента + - `wrap`:оборачивает каждое поле в `Grid` для удобного расположения и перетаскивания + - `title`:заголовок меню + - `items`:Подэлементы + +Больше информации о определении Schema Item можно найти в документации [Schema Initializer Item](https://client.docs.nocobase.com/core/ui-schema/schema-initializer#built-in-components-and-types). + +#### 10.2 Регистрация initializer + +Модифицируем файл `packages/plugins/@nocobase-sample/plugin-block-form/src/client/index.tsx`, импортируем и зарегистрируем этот initializer: + +```diff ++ import { formV3ConfigureFieldsInitializer } from './FormV3.configFields'; + +export class PluginBlockFormClient extends Plugin { + async load() { +- this.app.schemaInitializerManager.add(formV3ConfigureActionsInitializer); ++ this.app.schemaInitializerManager.add(formV3ConfigureActionsInitializer, formV3ConfigureFieldsInitializer); + // ... + } +} +``` + +#### 10.3 Использование initializer + +Модифицируем файл `packages/plugins/@nocobase-sample/plugin-block-form/src/client/FormV3.schema.ts`, добавив подэлемент `fields`: + +```diff +// ... ++ import { formV3ConfigureFieldsInitializer } from "./FormV3.configFields"; + +export function getFormV3Schema(options: GetFormV3SchemaOptions): ISchema { + const { dataSource, collection, properties = {} } = options; + return { + type: 'void', + 'x-component': 'CardItem', + 'x-decorator': 'DataBlockProvider', + 'x-decorator-props': { + dataSource, + collection, + [FormV3BlockNameLowercase]: {}, + }, + 'x-settings': formV3Settings.name, + "x-toolbar": "BlockSchemaToolbar", + properties: { + [FormV3BlockNameLowercase]: { + type: 'void', + 'x-component': FormV3BlockName, + 'x-use-component-props': 'useFormV3Props', + properties: { + ...properties as any, ++ fields: { ++ "type": "void", ++ "x-component": "Grid", ++ "x-initializer": formV3ConfigureFieldsInitializer.name ++ }, + actionBar: { + type: 'void', + "x-initializer": formV3ConfigureActionsInitializer.name, + "x-component": "ActionBar", + "x-component-props": { + "layout": "one-column", + "style": { + "marginTop": 24 + } + }, + }, + } + } + } + } +} +``` + +Для удобства макета мы обернули поля в `Grid` , что позволяет удобно управлять макетом и перетаскивать элементы. + +![20240719171211](https://static-docs.nocobase.com/20240719171211.png) + +### 11. Реализация `Configure fields` items + +#### 11.1 Реализация `Collection Fields` + +Функционал `Configure fields` основан на [CollectionFieldsToInitializerItems](https://client.docs-en.nocobase.com/core/data-source/collection-fields-to-initializer-items#collectionfieldstoinitializeritems). + +Мы можем использовать встроенный компонент `CollectionFieldsToFormInitializerItems`, который преобразует поля коллекции в элементы `Initializer`. + +Модифицируем файл `packages/plugins/@nocobase-sample/plugin-block-form/src/client/FormV3.configFields/index.ts`: + +```diff +- import { gridRowColWrap, SchemaInitializer } from "@nocobase/client"; ++ import { gridRowColWrap, SchemaInitializer, CollectionFieldsToFormInitializerItems } from "@nocobase/client"; + +export const formV3ConfigureFieldsInitializer = new SchemaInitializer({ + name: `${FormV3BlockNameLowercase}:configureFields`, + icon: 'SettingOutlined', + wrap: gridRowColWrap, + title: 'Configure fields', + items: [ ++ { ++ name: 'collectionFields', ++ Component: CollectionFieldsToFormInitializerItems, ++ }, + ] +}); +``` + +- `name: 'collectionFields'`:Уникальный идентификатор +- `Component: CollectionFieldsToFormInitializerItems`:Встроенный компонент, преобразующий поля таблицы данных в подэлементы FormItem типа Initializer. + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/2024-07-19-17-17-38.mov" type="video/mp4" /> +</video> + +#### 11.2 Реализация `Add text` + +Добавление текста в интерфейс — это распространенная потребность. Поэтому NocoBase предоставляет в `@nocobase/client` компонент `MarkdownFormItemInitializer` для реализации этой функции. + +Модифицируем файл `packages/plugins/@nocobase-sample/plugin-block-form/src/client/FormV3.configFields/index.ts`: + +```diff +// ... ++ import { tStr } from '../locale' + +export const formV3ConfigureFieldsInitializer = new SchemaInitializer({ + name: `${FormV3BlockNameLowercase}:configureFields`, + icon: 'SettingOutlined', + wrap: gridRowColWrap, + title: 'Configure fields', + items: [ + { + name: 'collectionFields', + Component: CollectionFieldsToFormInitializerItems, + }, ++ { ++ name: 'divider', ++ type: 'divider', ++ }, ++ { ++ name: 'addText', ++ title: tStr('Add text'), ++ Component: 'MarkdownFormItemInitializer', ++ }, + ] +}); +``` + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/2024-07-19-17-27-21.mov" type="video/mp4" /> +</video> + +### 12. 权限 + +TODO + +### 13. Локализация (Мультиязычность) + +В NocoBase поддерживается мультиязычность через интерфейс администратора: [http://localhost:13000/admin/settings/system-settings](http://localhost:13000/admin/settings/system-settings) где можно добавить новые языки и переключаться между ними в правом верхнем углу. + +![20240611113758](https://static-docs.nocobase.com/20240611113758.png) + +Поскольку блок FormV3 использует те же строки, что и FormV2, и уже настроен для многоязычности, здесь нет необходимости вносить какие-либо изменения. + +## Упаковка и загрузка в производственную среду + +Согласно документации [构建并打包插件](/development/your-fisrt-plugin#构建并打包插件) , вы можете собрать и упаковать плагин для загрузки в производственную среду. + +Если вы работаете с клонированным исходным кодом NocoBase, перед сборкой конкретного плагина необходимо выполнить полную сборку всего проекта, чтобы все зависимости были правильно построены. + +```bash +yarn build +``` + +Если вы создали проект с помощью `create-nocobase-app`, вы можете выполнить следующую команду напрямую: + +```bash +yarn build @nocobase-sample/plugin-block-form --tar +``` + +Таким образом, будет создан файл `storage/tar/@nocobase-sample/plugin-block-form.tar.gz`. Затем вы можете загрузить этот файл через[上传的方式](/welcome/getting-started/plugin)для установки. diff --git a/docs/ru-RU/plugin-samples/block/block-table.md b/docs/ru-RU/plugin-samples/block/block-table.md new file mode 100644 index 0000000000..d7bf7c05ee --- /dev/null +++ b/docs/ru-RU/plugin-samples/block/block-table.md @@ -0,0 +1,3 @@ +# `Table` Блок + +TODO diff --git a/docs/ru-RU/plugin-samples/block/index.md b/docs/ru-RU/plugin-samples/block/index.md new file mode 100644 index 0000000000..638abee132 --- /dev/null +++ b/docs/ru-RU/plugin-samples/block/index.md @@ -0,0 +1,13 @@ +# Блоки + +NocoBase поддерживает различные типы блоков. + +![20240603155329](https://static-docs.nocobase.com/20240603155329.png) + +NocoBase поддерживает различные типы блоков. + +В зависимости от типа блока и его сложности, мы предоставляем следующие примеры: + +- [ Блок `Carousel`](/plugin-samples/block/block-carousel) +- [Блок `Form`](/plugin-samples/block/block-form) +- [Блок `Table` ](/plugin-samples/block/block-table) diff --git a/docs/ru-RU/plugin-samples/component-and-scope/global.md b/docs/ru-RU/plugin-samples/component-and-scope/global.md new file mode 100644 index 0000000000..c6c8369b5b --- /dev/null +++ b/docs/ru-RU/plugin-samples/component-and-scope/global.md @@ -0,0 +1,176 @@ +# Глобальная регистрация компонента и области видимости + +## Описание примера + +Создайте новую страницу и используйте [SchemaComponent](https://client.docs.nocobase.com/core/ui-schema/schema-component#schemacomponent-1) для рендеринга содержимого. Компонент маршрута и компоненты внутри `SchemaComponent` регистрируются глобально. + +Полный код примера можно найти в репозитории [plugin-samples](https://github.com/nocobase/plugin-samples/tree/main/packages/plugins/%40nocobase-sample/plugin-component-and-scope-global). + +## Инициализация плагина + +Следуя инструкциям из документа [Создание вашего первого плагина](/development/your-first-plugin), если у вас нет проекта, создайте его. Если проект уже существует или вы клонировали исходный код, пропустите этот шаг. + +```bash +yarn create nocobase-app my-nocobase-app -d sqlite +cd my-nocobase-app +yarn install +yarn nocobase install +``` + +Затем инициализируйте плагин и добавьте его в систему: + +```bash +yarn pm create @nocobase-sample/plugin-component-and-scope-global +yarn pm enable @nocobase-sample/plugin-component-and-scope-global +``` + +Запустите проект: + +```bash +yarn dev +``` + +После входа в систему перейдите по адресу [http://localhost:13000/admin/pm/list/local/](http://localhost:13000/admin/pm/list/local/), чтобы убедиться, что плагин установлен и активирован. + +## Реализация функционала + +### 1. Создание пользовательской страницы + +Создайте файл `packages/plugins/@nocobase-sample/plugin-component-and-scope-global/src/client/CustomPage.tsx` со следующим содержимым: + +```tsx | pure +import React from "react" + +export const SamplesCustomPage = () => { + return <div>TODO</div> +} +``` + +### 2. Глобальная регистрация компонентов и маршрутов + +Подробные инструкции по созданию пользовательской страницы см. в документации [Добавление страницы](/plugin-samples/router/add-page). + +Измените файл `packages/plugins/@nocobase-sample/plugin-component-and-scope-global/src/index.ts` следующим образом: + +```tsx | pure +import { Plugin } from '@nocobase/client'; +import { SamplesCustomPage } from './CustomPage' + +export class PluginComponentAndScopeGlobalClient extends Plugin { + async load() { + this.app.router.add('admin.custom-page1', { + path: '/admin/custom-page1', + Component: 'SamplesCustomPage', + }) + + this.app.addComponents({ SamplesCustomPage }) + } +} + +export default PluginComponentAndScopeGlobalClient; +``` + +Мы регистрируем компонент `SamplesCustomPage` глобально с помощью метода `app.addComponents()`, затем регистрируем маршрут с помощью метода `app.router.add()`. Поле `Component`, будучи строкового типа, автоматически ищет глобально зарегистрированный компонент. + +Перейдите по адресу [http://localhost:13000/admin/custom-page1](http://localhost:13000/admin/custom-page1), чтобы увидеть содержимое компонента `SamplesCustomPage`. + +![Скриншот](https://static-docs.nocobase.com/img_v3_02av_55c3115b-f4b6-4c24-8ea2-914869d498bg.jpg) + +### 3. Использование `SchemaComponent` для рендеринга схемы + +Сначала необходимо ознакомиться с следующими концепциями: + +- [Протокол Schema](/development/client/ui-schema/what-is-ui-schema) +- [SchemaComponent](https://client.docs.nocobase.com/core/ui-schema/schema-component#schemacomponent-1) +- [withDynamicSchemaProps](/development/client/ui-schema/what-is-ui-schema#x-component-props-and-x-use-component-props) +- [useFieldSchema()](https://client.docs.nocobase.com/core/ui-schema/designable#usefieldschema) + +Измените файл `packages/plugins/@nocobase-sample/plugin-component-and-scope-global/src/client/CustomPage.tsx` следующим образом: + +```tsx | pure +import { ISchema, SchemaComponent, withDynamicSchemaProps } from "@nocobase/client" +import { uid } from '@formily/shared' +import { useFieldSchema } from '@formily/react' +import React, { FC } from "react" + +export const SamplesHello: FC<{ name: string }> = withDynamicSchemaProps(({ name }) => { + return <div>hello {name}</div> +}) + +export const useSamplesHelloProps = () => { + const schema = useFieldSchema(); + return { name: schema.name } +} + +const schema: ISchema = { + type: 'void', + name: uid(), + properties: { + demo1: { + type: 'void', + 'x-component': 'SamplesHello', + 'x-component-props': { + name: 'demo1', + }, + }, + demo2: { + type: 'void', + 'x-component': 'SamplesHello', + 'x-use-component-props': 'useSamplesHelloProps', + }, + } +} + +export const SamplesCustomPage = () => { + return <SchemaComponent schema={schema}></SchemaComponent> +} +``` + +- Определены и экспортированы компонент `SamplesHello` и функция `useSamplesHelloProps`. +- Определён объект `schema`, содержащий `'x-component': 'SamplesHello'` и `'x-use-component-props': 'useSamplesHelloProps'`, оба строкового типа. +- Использован компонент [SchemaComponent](https://client.docs.nocobase.com/core/ui-schema/schema-component#schemacomponent-1) для рендеринга объекта `schema`. + +Далее необходимо глобально зарегистрировать `SamplesHello` и `useSamplesHelloProps`. Измените файл `packages/plugins/@nocobase-sample/plugin-component-and-scope-global/src/index.ts` следующим образом: + +```diff +import { Plugin } from '@nocobase/client'; +- import { SamplesCustomPage } from './CustomPage' ++ import { SamplesCustomPage, SamplesHello, useSamplesHelloProps } from './CustomPage' + +export class PluginComponentAndScopeGlobalClient extends Plugin { + async load() { + this.app.router.add('admin.custom-page1', { + path: '/admin/custom-page1', + Component: 'SamplesCustomPage', + }) + +- this.app.addComponents({ SamplesCustomPage }) ++ this.app.addComponents({ SamplesCustomPage, SamplesHello }) ++ this.app.addScopes({ useSamplesHelloProps }) + } +} + +export default PluginComponentAndScopeGlobalClient; +``` + +Перейдите по адресу [http://localhost:13000/admin/custom-page1](http://localhost:13000/admin/custom-page1), чтобы увидеть содержимое компонента `CustomPage`. + +![Скриншот](https://static-docs.nocobase.com/img_v3_02av_79e76ad8-d697-4e3b-aaa9-46ed90e2bb9g.jpg) + +## Сборка и загрузка в продакшен + +Следуя инструкциям из документа [Сборка и упаковка плагина](/development/your-first-plugin#building-and-packaging-the-plugin), упакуйте плагин для продакшена. + +Если вы используете клонированный исходный код, сначала выполните полную сборку, чтобы включить зависимости плагина: + +```bash +yarn build +``` + +Если проект создан с помощью `create-nocobase-app`, выполните: + +```bash +yarn build @nocobase-sample/plugin-component-and-scope-global --tar +``` + +После этого в папке `storage/tar/@nocobase-sample/plugin-component-and-scope-global.tar.gz` появится файл, который можно установить с помощью [метода загрузки](/welcome/getting-started/plugin). diff --git a/docs/ru-RU/plugin-samples/component-and-scope/index.md b/docs/ru-RU/plugin-samples/component-and-scope/index.md new file mode 100644 index 0000000000..0a4194460e --- /dev/null +++ b/docs/ru-RU/plugin-samples/component-and-scope/index.md @@ -0,0 +1,99 @@ +# Регистрация и использование компонентов и областей видимости + +## Описание сценария + +Существует две основные причины, по которым необходимо регистрировать компоненты и области видимости: + +### Причина 1: UI Schema должен храниться на сервере + +Страницы фронтенда NocoBase рендерятся на основе [UI Schema](/development/client/ui-schema/what-is-ui-schema), который должен сохраняться в базе данных. Поскольку UI Schema не может содержать свойства ссылочного типа, такие свойства, как `x-component`, `x-decorator`, `x-use-component-props` и `x-use-decorator-props`, могут храниться только в виде строк. Затем соответствующие компоненты и области видимости регистрируются в NocoBase, чтобы при рендеринге страницы система могла сопоставить сохранённые строки с соответствующими компонентами и областями видимости. + +В отличие от этого, для UI Schema, которые не нужно сохранять в базе данных, можно напрямую использовать свойства ссылочного типа. Например, на локально разработанной [странице настроек плагина](/plugin-samples/plugin-settings/form) свойства, такие как `x-component` и `x-use-component-props`, могут напрямую использовать значения ссылочного типа. + +```ts +const schema: ISchema = { + type: 'void', + name: uid(), + 'x-component': MyComponent, + 'x-use-component-props': useMyComponentProps, +} +``` + +### Причина 2: Потребности в расширяемости + +Компоненты могут использоваться как в UI Schema, так и в маршрутизации. В обоих случаях может потребоваться переопределение определённых компонентов для достижения кастомизации. Например: + +```ts +class AuthPlugin extends Plugin { + async load() { + this.app.addComponents({ LoginPage }) + this.app.router.add('auth.signin', { + path: '/signin', + Component: 'SignInPage', + }) + } +} +``` + +Если кому-то нужно заменить страницу входа, доступны два варианта: + +#### Вариант 1: Замена маршрута + +```ts +class CustomPlugin extends Plugin { + async load() { + this.app.router.add('auth.login', { + path: '/login', + Component: CustomLoginPage, + }) + } +} +``` + +#### Вариант 2: Прямая замена компонента + +```ts +class CustomPlugin extends Plugin { + async load() { + this.app.addComponent({ LoginPage: CustomLoginPage }) + } +} +``` + +В итоге, если речь не идёт об одном из этих двух сценариев, нет необходимости регистрировать компоненты и области видимости, и вместо этого можно напрямую использовать свойства ссылочного типа. + +## Глобальная и локальная регистрация + +Компоненты и области видимости могут быть зарегистрированы глобально или локально. + +### Глобальная регистрация + +Для глобальной регистрации используются методы [app.addComponents()](https://client.docs.nocobase.com/core/application/application#appaddcomponents) и [app.addScopes()](https://client.docs.nocobase.com/core/application/application#appaddscopes). Например: + +```ts +class MyPlugin extends Plugin { + async load() { + this.app.addComponents({ MyComponent }) + this.app.addScopes({ MyScope }) + } +} +``` + +### Локальная регистрация + +Для локальной регистрации используются свойства `components` и `scope` компонентов [SchemaComponent](https://client.docs.nocobase.com/core/ui-schema/schema-component#schemacomponent-1) и [SchemaComponentOptions](https://client.docs.nocobase.com/core/ui-schema/schema-component#schemacomponentoptions). Например: + +```tsx | pure +<SchemaComponentProvider components={{ Hello }} scope={{ useDeleteProps }}> + <SchemaComponent schema={schema} components={{ World }} scope={{ useSubmitProps }} /> +</SchemaComponentProvider> +``` + +`SchemaComponentProvider` может быть вложен на несколько уровней, и внутренние элементы `SchemaComponent` наследуют `components` и `scope` из внешних уровней. + +Для описанных сценариев мы предоставляем следующие примеры: + +- [Глобальная регистрация компонента и области видимости](/plugin-samples/component-and-scope/global) +- [Локальная регистрация компонента и области видимости](/plugin-samples/component-and-scope/local) + +Для сценария кастомизации обратитесь к примеру маршрутизации [Замена страницы](/plugin-samples/router/replace-page). diff --git a/docs/ru-RU/plugin-samples/component-and-scope/local.md b/docs/ru-RU/plugin-samples/component-and-scope/local.md new file mode 100644 index 0000000000..b4179766b0 --- /dev/null +++ b/docs/ru-RU/plugin-samples/component-and-scope/local.md @@ -0,0 +1,163 @@ +# Локальная регистрация компонента и области видимости + +## Описание примера + +Функциональность, реализуемая в данном примере, идентична примеру из [Глобальная регистрация компонента и области видимости](/plugin-samples/component-and-scope/global), за исключением того, что компоненты и области видимости будут зарегистрированы локально внутри плагина, а не глобально. + +Полный код примера можно найти в репозитории [plugin-samples](https://github.com/nocobase/plugin-samples/tree/main/packages/plugins/%40nocobase-sample/plugin-component-and-scope-local). + +## Инициализация плагина + +Следуя инструкциям из документа [Создание вашего первого плагина](/development/your-first-plugin), если у вас нет проекта, сначала создайте его. Если проект уже существует или вы клонировали исходный код, пропустите этот шаг. + +```bash +yarn create nocobase-app my-nocobase-app -d sqlite +cd my-nocobase-app +yarn install +yarn nocobase install +``` + +Затем инициализируйте плагин и добавьте его в систему: + +```bash +yarn pm create @nocobase-sample/plugin-component-and-scope-local +yarn pm enable @nocobase-sample/plugin-component-and-scope-local +``` + +Запустите проект: + +```bash +yarn dev +``` + +После входа в систему перейдите по адресу [http://localhost:13000/admin/pm/list/local/](http://localhost:13000/admin/pm/list/local/), чтобы убедиться, что плагин успешно установлен и активирован. + +## Реализация функционала + +### 1. Создание пользовательской страницы + +Создайте новый файл `packages/plugins/@nocobase-sample/plugin-component-and-scope-local/src/client/CustomPage.tsx` со следующим содержимым: + +```tsx | pure +import React from "react"; + +export const SamplesCustomPage = () => { + return <div>TODO</div>; +}; +``` + +### 2. Прямой рендеринг содержимого с использованием `Component` + +Подробности о создании пользовательских страниц см. в [Добавление новой страницы](/plugin-samples/router/add-page). + +Измените файл `packages/plugins/@nocobase-sample/plugin-component-and-scope-local/src/index.ts` следующим образом: + +```tsx | pure +import { Plugin } from '@nocobase/client'; +import { SamplesCustomPage } from './CustomPage'; + +export class PluginComponentAndScopeLocalClient extends Plugin { + async load() { + this.app.router.add('admin.custom-page2', { + path: '/admin/custom-page2', + Component: SamplesCustomPage, + }); + } +} + +export default PluginComponentAndScopeLocalClient; +``` + +В отличие от глобальной регистрации, здесь мы используем `Component: SamplesCustomPage` напрямую, а не строковое значение. + +Перейдите по адресу [http://localhost:13000/admin/custom-page2](http://localhost:13000/admin/custom-page2), чтобы просмотреть содержимое компонента `SamplesCustomPage`. + +![Скриншот пользовательской страницы](https://static-docs.nocobase.com/img_v3_02av_46e020ae-41d2-4bc3-a047-e28d97c20bdg.jpg) + +### 3. Рендеринг содержимого с использованием `SchemaComponent` + +Необходимые предварительные знания: + +- [Протокол Schema](/development/client/ui-schema/what-is-ui-schema) +- [SchemaComponent](https://client.docs.nocobase.com/core/ui-schema/schema-component#schemacomponent-1) +- [withDynamicSchemaProps](/development/client/ui-schema/what-is-ui-schema#x-component-props-and-x-use-component-props) +- [useFieldSchema()](https://client.docs.nocobase.com/core/ui-schema/designable#usefieldschema) + +Измените файл `packages/plugins/@nocobase-sample/plugin-component-and-scope-local/src/client/CustomPage.tsx` следующим образом: + +```tsx | pure +import { ISchema, SchemaComponent, withDynamicSchemaProps } from "@nocobase/client" +import { uid } from '@formily/shared' +import { useFieldSchema } from '@formily/react' +import React, { FC } from "react" + +const SamplesHello: FC<{ name: string }> = withDynamicSchemaProps(({ name }) => { + return <div>hello {name}</div> +}) + +const useSamplesHelloProps = () => { + const schema = useFieldSchema(); + return { name: schema.name } +} + +const schema: ISchema = { + type: 'void', + name: uid(), + properties: { + demo1: { + type: 'void', + 'x-component': SamplesHello, + 'x-component-props': { + name: 'demo1', + }, + }, + demo2: { + type: 'void', + 'x-component': SamplesHello, + 'x-use-component-props': useSamplesHelloProps, + }, + demo3: { + type: 'void', + 'x-component': 'SamplesHello', + 'x-component-props': { + name: 'demo3', + }, + }, + demo4: { + type: 'void', + 'x-component': 'SamplesHello', + 'x-use-component-props': 'useSamplesHelloProps', + }, + } +} + +export const SamplesCustomPage = () => { + return <SchemaComponent schema={schema} components={{ SamplesHello }} scope={{ useSamplesHelloProps }}></SchemaComponent> +} +``` + +- Определены компонент `SamplesHello` и функция `useSamplesHelloProps`. +- Создан объект `schema`, где `demo1` и `demo2` напрямую используют соответствующие компоненты и области видимости, а `demo3` и `demo4` используют строковые определения. +- `SchemaComponent` регистрирует `SamplesHello` и `useSamplesHelloProps` локально с помощью свойств `components` и `scope`. + +Перейдите по адресу [http://localhost:13000/admin/custom-page2](http://localhost:13000/admin/custom-page2), чтобы просмотреть компонент `CustomPage`. + +![Скриншот SchemaComponent](https://static-docs.nocobase.com/img_v3_02av_e8d4d0c7-7a59-4f9e-a120-a2551e719ebg.jpg) + +## Сборка и загрузка в продакшен + +Следуйте инструкциям из документа [Сборка и упаковка плагина](/development/your-first-plugin#build-and-package-plugin), чтобы упаковать плагин для продакшена. + +Если вы используете клонированный исходный код, сначала выполните полную сборку, чтобы собрать все зависимости плагина: + +```bash +yarn build +``` + +Если проект создан с помощью `create-nocobase-app`, выполните: + +```bash +yarn build @nocobase-sample/plugin-component-and-scope-local --tar +``` + +В результате будет создан файл `storage/tar/@nocobase-sample/plugin-component-and-scope-local.tar.gz`. Установите его через процесс [загрузки плагина](/welcome/getting-started/plugin). diff --git a/docs/ru-RU/plugin-samples/field/index.md b/docs/ru-RU/plugin-samples/field/index.md new file mode 100644 index 0000000000..b9eb931c2d --- /dev/null +++ b/docs/ru-RU/plugin-samples/field/index.md @@ -0,0 +1,5 @@ +# Поля + +- [Компоненты полей без значения](/plugin-samples/field/without-value) +- [Компоненты полей с значением](/plugin-samples/field/value) +- [Интерфейс поля](/plugin-samples/field/interface) diff --git a/docs/ru-RU/plugin-samples/field/interface.md b/docs/ru-RU/plugin-samples/field/interface.md new file mode 100644 index 0000000000..ba61ff343f --- /dev/null +++ b/docs/ru-RU/plugin-samples/field/interface.md @@ -0,0 +1,431 @@ +# Интерфейс поля + +Ранее мы рассмотрели, как заменять компоненты полей на основе существующего `Field interface`. Однако в некоторых случаях новые компоненты не относятся к уже существующим интерфейсам полей. В таких ситуациях необходимо создать пользовательский `Field interface`. + +## Описание примера + +В этом документе мы добавим новый тип интерфейса поля — `Encryption`, предназначенный для шифрования и дешифрования данных. Требования следующие: + +- Использование симметричного алгоритма шифрования для шифрования и дешифрования поля. +- Зашифрованные данные хранятся в базе данных в виде шифрованного текста, а при просмотре данных отображаются в расшифрованном виде. +- Зашифрованные поля не поддерживают нечеткий поиск, только операции "равно", "не равно", "существует" и "не существует". + +Для реализации этой функциональности требуется совместная работа клиентской и серверной частей. На стороне клиента необходимо реализовать интерфейс поля для шифрования и дешифрования, а на серверной стороне — логику шифрования и дешифрования. + +Полный код примера доступен в репозитории [plugin-samples](https://github.com/nocobase/plugin-samples/tree/main/packages/plugins/%40nocobase-sample/plugin-field-interface). + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/1721993076851.mov" type="video/mp4" /> +</video> + +## Инициализация плагина + +Следуя инструкциям из документа [Создание первого плагина](/development/your-fisrt-plugin), если у вас нет проекта, создайте его. Если проект уже существует или вы клонировали исходный код, пропустите этот шаг. + +```bash +yarn create nocobase-app my-nocobase-app -d sqlite +cd my-nocobase-app +yarn install +yarn nocobase install +``` + +Инициализируйте плагин и добавьте его в систему: + +```bash +yarn pm create @nocobase-sample/plugin-field-interface +yarn pm enable @nocobase-sample/plugin-field-interface +``` + +Запустите проект: + +```bash +yarn dev +``` + +После входа в систему перейдите по адресу [http://localhost:13000/admin/pm/list/locale/](http://localhost:13000/admin/pm/list/locale/), чтобы убедиться, что плагин установлен и активирован. + +## Документация и структура каталогов + +Перед реализацией примера необходимо ознакомиться с основными понятиями: + +- [Модуль crypto в Node.js](https://nodejs.org/api/crypto.html) +- [Database](/api/database): Для управления данными, полями, моделями и операциями. +- [CollectionFieldInterface](https://client.docs.nocobase.com/core/data-source/collection-field-interface): Класс для полей данных на клиентской стороне. +- [CollectionFieldInterfaceManager](https://client.docs.nocobase.com/core/data-source/collection-field-interface-manager): Класс для управления `CollectionFieldInterface` на клиентской стороне. + +Структура проекта: + +```bash +. +├── client # Клиентская часть плагина +│ ├── EncryptionFieldInterface.tsx # Интерфейс поля на клиентской стороне +│ ├── locale.ts # Утилиты для мультиязычности +│ └── index.ts # Точка входа на клиентской стороне +├── locale +│ ├── en-US.json # Английский +│ └── zh-CN.json # Китайский +├── index.ts # Точка входа серверной части плагина +└── server + ├── encryption-field.ts # Поле для шифрования + ├── index.ts # Точка входа серверной части + ├── operators # Операторы запросов + │ ├── eq.ts # Равно + │ ├── ne.ts # Не равно + │ └── utils.ts # Утилиты + ├── plugin.ts # Серверный плагин + └── utils.ts # Утилиты +``` + +## Реализация на клиентской стороне + +### 1. Компонент + +Поскольку шифрование и дешифрование работают со строками, мы можем использовать стандартный компонент `Input`, и нет необходимости создавать пользовательский компонент. + +Если требуется пользовательский компонент, обратитесь к документации [Компоненты с полем значения](/plugin-samples/field/value). + +### 2. Интерфейс поля + +#### 2.1 Определение + +Создайте файл `packages/plugins/@nocobase-sample/plugin-field-interface/src/client/EncryptionFieldInterface.tsx`: + +```tsx | pure +import { CollectionFieldInterface, defaultProps } from '@nocobase/client'; +import { uid } from '@nocobase/utils/client'; +import { tStr } from './locale'; + +export class EncryptionFieldInterface extends CollectionFieldInterface { + name = 'encryption'; + type = 'object'; + group = 'advanced'; + order = 10; + title = tStr('Encryption'); + default = { + type: 'encryption', + iv: uid(16), + uiSchema: { + type: 'string', + 'x-component': 'Input', + }, + }; + availableTypes = ['string']; + hasDefaultValue = true; + properties = { + ...defaultProps, + }; + filterable = { + operators: [ + { label: '{{t("is")}}', value: '$encryptionEq', selected: true }, + { label: '{{t("is not")}}', value: '$encryptionNe' }, + { label: '{{t("exists")}}', value: '$exists', noValue: true }, + { label: '{{t("not exists")}}', value: '$notExists', noValue: true }, + ], + }; +} +``` + +Все интерфейсы полей должны наследовать класс `CollectionFieldInterface` и реализовывать свойства `name`, `type`, `group`, `order`, `title`, `default`, `availableTypes`, `hasDefaultValue`, `properties` и `filterable`. Описание каждого свойства: + +- `tStr`: Генерация строковых шаблонов для мультиязычности. +- `name`: Уникальный идентификатор интерфейса поля. +- `type`: Тип интерфейса (в данном случае `object`). +- `group`: Группа для отображения в настройках полей (здесь `advanced`). +- `order`: Порядок сортировки в настройках полей. +- `title`: Заголовок, отображаемый в настройках. +- `default`: Конфигурация поля по умолчанию, сохраняемая в базе данных. + - `iv`: Инициализационный вектор, случайная строка для шифрования. + - `uiSchema`: Конфигурация UI поля, здесь используется компонент `Input`. +- `availableTypes`: Доступные типы данных для поля. +- `hasDefaultValue`: Указывает, есть ли у поля значение по умолчанию. +- `properties`: Конфигурация свойств, включает `defaultProps`: + - `name`: Имя поля. + - `displayName`: Отображаемое имя поля. +- `filterable`: Операторы для фильтрации. + +Особенности `filterable`: + +- Поскольку данные хранятся в зашифрованном виде, поддерживаются только операторы "равно", "не равно", "существует" и "не существует". +- Для поиска строки её нужно сначала расшифровать, поэтому вместо стандартных операторов `$eq` и `$ne` используются пользовательские `$encryptionEq` и `$encryptionNe`. + +Подробности о `CollectionFieldInterface` см. в [документации](https://client.docs.nocobase.com/core/data-source/collection-field-interface). + +#### 2.2 Регистрация + +Обновите файл `packages/plugins/@nocobase-sample/plugin-field-interface/src/client/index.ts`: + +```ts +import { Plugin } from '@nocobase/client'; +import { EncryptionFieldInterface } from './EncryptionFieldInterface'; + +export class PluginFieldInterfaceClient extends Plugin { + async load() { + this.app.dataSourceManager.collectionFieldInterfaceManager.addFieldInterfaces([EncryptionFieldInterface]); + } +} + +export default PluginFieldInterfaceClient; +``` + +Регистрация `EncryptionFieldInterface` выполняется через метод `collectionFieldInterfaceManager.addFieldInterfaces()`. + +Подробности о `CollectionFieldInterfaceManager` см. в [документации](https://client.docs.nocobase.com/core/data-source/collection-field-interface-manager). + +![20240726193638](https://static-docs.nocobase.com/20240726193638.png) + +Теперь в интерфейсе отображается поле `Encryption`, но серверная часть для шифрования ещё не реализована, поэтому поле **нельзя создать**. + +## Реализация на серверной стороне + +### 1. Реализация шифрования и дешифрования + +Создайте файл `packages/plugins/@nocobase-sample/plugin-field-interface/src/server/utils.ts`: + +```ts +import crypto from 'crypto'; +const algorithm = 'aes-256-cbc'; + +const keyString = process.env.ENCRYPTION_KEY || '12345678901234567890123456789012'; + +const key = Buffer.from(keyString, 'utf8'); + +export function encryptSync(text: string, ivString: string) { + const iv = Buffer.from(ivString, 'utf8'); + const cipher = crypto.createCipheriv(algorithm, key, iv); + let encrypted = cipher.update(text, 'utf8', 'hex'); + encrypted += cipher.final('hex'); + return encrypted; +} + +export function decryptSync(encrypted: string, ivString: string) { + const iv = Buffer.from(ivString, 'utf8'); + const decipher = crypto.createDecipheriv(algorithm, key, iv); + let decrypted = decipher.update(encrypted, 'hex', 'utf8'); + decrypted += decipher.final('utf8'); + return decrypted; +} +``` + +Мы используем модуль `crypto` для реализации шифрования и дешифрования. Метод `encryptSync` шифрует данные, а `decryptSync` — расшифровывает. Используется алгоритм `aes-256-cbc`, ключ берётся из переменной окружения `ENCRYPTION_KEY` или используется значение по умолчанию `12345678901234567890123456789012`. + +Подробности о модуле `crypto` см. в [документации Node.js](https://nodejs.org/api/crypto.html). + +### 2. Реализация поля + +#### 2.1 Определение + +Создайте файл `packages/plugins/@nocobase-sample/plugin-field-interface/src/server/encryption-field.ts`: + +```ts +import { BaseColumnFieldOptions, Field, FieldContext } from '@nocobase/database'; +import { DataTypes } from 'sequelize'; +import { decryptSync, encryptSync } from './utils'; + +export interface EncryptionFieldOptions extends BaseColumnFieldOptions { + type: 'encryption'; +} + +export class EncryptionField extends Field { + get dataType() { + return DataTypes.STRING; + } + + constructor(options?: any, context?: FieldContext) { + const { name, iv } = options; + super( + { + get() { + const value = this.getDataValue(name); + if (!value) return null; + return decryptSync(value, iv); + }, + set(value) { + if (!value?.length) value = null; + else { + value = encryptSync(value, iv); + } + this.setDataValue(name, value); + }, + ...options, + }, + context, + ); + } +} +``` + +- `dataType`: В базе данных зашифрованные данные хранятся как строки, поэтому используется `DataTypes.STRING`. +- `get`: При получении значения поле расшифровывается. +- `set`: При установке значения поле шифруется. + +#### 2.2 Регистрация + +Создайте файл `packages/plugins/@nocobase-sample/plugin-field-interface/src/server/plugin.ts`: + +```ts +import { Plugin } from '@nocobase/server'; +import { EncryptionField } from './encryption-field'; +import { $encryptionEq } from './operators/eq'; +import { $encryptionNe } from './operators/ne'; + +export class PluginFieldInterfaceServer extends Plugin { + async load() { + this.db.registerFieldTypes({ + encryption: EncryptionField, + }); + } +} + +export default PluginFieldInterfaceServer; +``` + +Регистрация `EncryptionField` выполняется через метод `db.registerFieldTypes()`. Подробности см. в [документации](/api/database#registerfieldtypes). + +![20240726192559](https://static-docs.nocobase.com/20240726192559.png) + +Теперь реализация клиентской и серверной частей завершена, и поле можно создать, но необходимо ещё реализовать операторы запросов. + +### 3. Реализация операторов + +#### 3.1 Определение + +Операторы должны шифровать строку перед выполнением запроса. + +##### 3.1.1 Общие методы + +Поскольку операторы `$encryptionEq` и `$encryptionNe` требуют шифрования перед запросом, мы выносим общую логику в утилиты. Создайте файл `packages/plugins/@nocobase-sample/plugin-field-interface/src/server/operators/utils.ts`: + +```ts +import { encryptSync } from '../utils'; + +export function getFieldOptions(ctx: any) { + const fieldPathArr = ctx.fieldPath.split('.'); + const collectionName = fieldPathArr[fieldPathArr.length - 2]; + const fieldName = ctx.fieldName; + + return ctx.db.collections.get(collectionName).fields.get(fieldName).options; +} + +export function encryptSearchValueSync(str: any, ctx: any) { + const { iv } = getFieldOptions(ctx); + let encrypted; + if (Array.isArray(str)) { + encrypted = str.map((item) => encryptSync(item, iv)); + } else { + encrypted = encryptSync(str, iv); + } + return encrypted; +} +``` + +Определены два метода: + +- `getFieldOptions`: Получение конфигурации поля. +- `encryptSearchValueSync`: Шифрование значения для поиска. + +##### 3.1.2 Реализация `$encryptionEq` + +Создайте файл `packages/plugins/@nocobase-sample/plugin-field-interface/src/server/operators/eq.ts`: + +```ts +import { encryptSearchValueSync } from './utils'; + +export const $encryptionEq = (str, ctx) => { + const eq = ctx.db.operators.get('$eq'); + if (!str) return eq(str, ctx); + const encrypted = encryptSearchValueSync(str, ctx); + return eq(encrypted, ctx); +}; +``` + +Оператор `$encryptionEq` шифрует значение перед выполнением запроса. + +##### 3.1.3 Реализация `$encryptionNe` + +Создайте файл `packages/plugins/@nocobase-sample/plugin-field-interface/src/server/operators/ne.ts`: + +```ts +import { encryptSearchValueSync } from './utils'; + +export const $encryptionNe = (str, ctx) => { + const eq = ctx.db.operators.get('$ne'); + if (!str) return eq(str, ctx); + const encrypted = encryptSearchValueSync(str, ctx); + return eq(encrypted, ctx); +}; +``` + +Оператор `$encryptionNe` также шифрует значение перед выполнением запроса. + +#### 3.2 Регистрация операторов + +Обновите файл `packages/plugins/@nocobase-sample/plugin-field-interface/src/server/plugin.ts`: + +```ts +import { Plugin } from '@nocobase/server'; +import { EncryptionField } from './encryption-field'; +import { $encryptionEq } from './operators/eq'; +import { $encryptionNe } from './operators/ne'; + +export class PluginFieldInterfaceServer extends Plugin { + async load() { + this.db.registerFieldTypes({ + encryption: EncryptionField, + }); + this.db.registerOperators({ + $encryptionEq, + $encryptionNe, + }); + } +} + +export default PluginFieldInterfaceServer; +``` + +![20240726192832](https://static-docs.nocobase.com/20240726192832.png) + +## Мультиязычность + +Можно добавить несколько языков через [http://localhost:13000/admin/settings/system-settings](http://localhost:13000/admin/settings/system-settings) и переключать их в правом верхнем углу. + +![20240611113758](https://static-docs.nocobase.com/20240611113758.png) + +### Английский язык + +Отредактируйте файл `packages/plugins/@nocobase-sample/plugin-field-interface/src/locale/en-US.json`: + +```json +{ + "Encryption": "Encryption" +} +``` + +### Китайский язык + +Отредактируйте файл `packages/plugins/@nocobase-sample/plugin-field-interface/src/locale/zh-CN.json`: + +```json +{ + "Encryption": "加密" +} +``` + +![20240726193259](https://static-docs.nocobase.com/20240726193259.png) + +## Сборка и загрузка в продакшен + +Следуя инструкциям [Сборка и упаковка плагина](/development/your-fisrt-plugin#构建并打包插件), упакуйте плагин и загрузите его в продакшен. + +Если вы используете клонированный исходный код, сначала выполните полную сборку, чтобы собрать зависимости плагина: + +```bash +yarn build +``` + +Если вы используете проект, созданный через `create-nocobase-app`, выполните: + +```bash +yarn build @nocobase-sample/plugin-field-interface --tar +``` + +В результате в папке `storage/tar/@nocobase-sample/plugin-field-interface.tar.gz` появится архив плагина. Установите его через интерфейс загрузки, описанный в [документации](/welcome/getting-started/plugin). diff --git a/docs/ru-RU/plugin-samples/field/sub-field.md b/docs/ru-RU/plugin-samples/field/sub-field.md new file mode 100644 index 0000000000..269870b07b --- /dev/null +++ b/docs/ru-RU/plugin-samples/field/sub-field.md @@ -0,0 +1 @@ +# Дочерний компонент узла diff --git a/docs/ru-RU/plugin-samples/field/value.md b/docs/ru-RU/plugin-samples/field/value.md new file mode 100644 index 0000000000..d4252bc408 --- /dev/null +++ b/docs/ru-RU/plugin-samples/field/value.md @@ -0,0 +1,461 @@ +# Компоненты с полем значения + +Компоненты с полем значения — это компоненты, которые имеют атрибут `value` и используются для отображения значений полей. Например, компоненты `Input`, `Select`, `Checkbox`, `Radio`, `Switch` и т.д. являются компонентами с полем значения. + +## Описание примера + +В данном примере мы добавим компонент `QRCode`, предназначенный для отображения значения поля URL с поддержкой настройки `размера`, `цвета` и `границы`. + +Полный код примера можно найти в репозитории [plugin-samples](https://github.com/nocobase/plugin-samples/tree/main/packages/plugins/%40nocobase-sample/plugin-field-value). + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/1721790389902.mov" type="video/mp4" /> +</video> + +## Инициализация плагина + +Следуя инструкциям из документа [Создание первого плагина](/development/your-fisrt-plugin), если у вас нет проекта, создайте его. Если проект уже существует или вы клонировали исходный код, пропустите этот шаг. + +```bash +yarn create nocobase-app my-nocobase-app -d sqlite +cd my-nocobase-app +yarn install +yarn nocobase install +``` + +Затем инициализируйте плагин и добавьте его в систему: + +```bash +yarn pm create @nocobase-sample/plugin-field-value +yarn pm enable @nocobase-sample/plugin-field-value +``` + +Запустите проект: + +```bash +yarn dev +``` + +После входа в систему перейдите по адресу [http://localhost:13000/admin/pm/list/locale/](http://localhost:13000/admin/pm/list/locale/), чтобы убедиться, что плагин установлен и активирован. + +## Реализация функционала + +Перед реализацией примера необходимо ознакомиться с основными понятиями: + +- [QRCode от Ant Design](https://ant.design/components/qr-code) +- [Руководство по SchemaInitializer](/development/client/ui-schema/initializer): для добавления блоков, полей и операций в интерфейс. +- [API SchemaInitializer](https://client.docs.nocobase.com/core/ui-schema/schema-initializer): для добавления элементов в интерфейс. +- [Протокол UI Schema](/development/client/ui-schema/what-is-ui-schema): подробное описание структуры Schema и роли каждого атрибута. +- [Designable дизайнер](/development/client/ui-schema/designable): для изменения Schema. + +Структура проекта: + +```bash +. +├── client # Клиентская часть плагина +│ ├── QRCode.tsx # Компонент +│ ├── settings.tsx # Настройки Schema +│ ├── locale.ts # Утилиты для мультиязычности +│ └── index.ts # Точка входа на клиентской стороне +├── locale # Файлы мультиязычности +│ ├── en-US.json # Английский +│ └── zh-CN.json # Китайский +├── index.ts # Точка входа серверной части плагина +└── server # Серверная часть плагина +``` + +### 1. Компонент + +![20240723211323](https://static-docs.nocobase.com/20240723211323.png) + +Компонент должен поддерживать три режима: + +- **Editable**: Режим редактирования. +- **ReadOnly**: Режим только для чтения (редактирование запрещено). +- **Easy-reading**: Режим просмотра. + +Режим `ReadOnly` реализуется через атрибут `disabled` в режиме редактирования, поэтому достаточно адаптировать `Editable` и `Easy-reading`. + +#### 1.1 Компонент в режиме редактирования + +В режиме редактирования компоненту автоматически передаются свойства `onChange`, `value`, `disabled` и свойства из [x-component-props](/development/client/ui-schema/what-is-ui-schema#x-component-props-and-x-use-component-props) в Schema. + +Создайте файл `packages/plugins/@nocobase-sample/plugin-field-value/src/client/QRCode.tsx`: + +```tsx | pure +import React, { FC } from 'react'; +import { Input } from '@nocobase/client'; +import { QRCode as AntdQRCode, Space, QRCodeProps as AntdQRCodeProps } from 'antd'; + +interface QRCodeProps extends AntdQRCodeProps { + onChange: (value: string) => void; + disabled?: boolean; +} + +const QRCodeEditable: FC<QRCodeProps> = ({ value, disabled, onChange, ...otherProps }) => { + return ( + <Space direction="vertical" align="center"> + <AntdQRCode value={value || '-'} {...otherProps} /> + <Input.URL + maxLength={60} + value={value} + disabled={disabled} + onChange={(e) => onChange(e.target.value)} + /> + </Space> + ); +}; +``` + +В режиме редактирования мы используем компонент `Space` для размещения `QRCode` и `Input.URL`. `QRCode` отображает значение URL, а `Input.URL` позволяет его редактировать. + +Свойства `value`, `disabled`, `onChange` автоматически передаются в режиме `Editable`. + +#### 1.2 Компонент в режиме просмотра + +В режиме просмотра компоненту передаются `value` и свойства из [x-component-props](/development/client/ui-schema/what-is-ui-schema#x-component-props-and-x-use-component-props). + +Добавьте в `packages/plugins/@nocobase-sample/plugin-field-value/src/client/QRCode.tsx`: + +```tsx | pure +const QRCodeReadPretty: FC<QRCodeProps> = ({ value, ...otherProps }) => { + if (!value) return null; + return <AntdQRCode value={value} {...otherProps} />; +}; +``` + +#### 1.3 Соединение компонентов + +Необходимо соединить `QRCodeEditable` и `QRCodeReadPretty`, чтобы в Schema можно было автоматически переключать компоненты через [x-pattern](https://docs.nocobase.com/development/client/ui-schema/what-is-ui-schema#x-pattern). + +Добавьте в `packages/plugins/@nocobase-sample/plugin-field-value/src/client/QRCode.tsx`: + +```tsx | pure +import { connect, mapReadPretty } from '@formily/react'; + +export const QRCode: FC<QRCodeProps> = connect(QRCodeEditable, mapReadPretty(QRCodeReadPretty)); + +QRCode.displayName = 'QRCode'; +``` + +Функция [connect](https://react.formilyjs.org/api/shared/connect) объединяет компоненты `QRCodeEditable` и `QRCodeReadPretty`. + +#### 1.4 Регистрация компонента + +Зарегистрируйте компонент `QRCode` в системе через плагин. + +```ts +import { Plugin } from '@nocobase/client'; +import { QRCode } from './QRCode'; + +export class PluginFieldComponentValueClient extends Plugin { + async load() { + this.app.addComponents({ QRCode }); + } +} + +export default PluginFieldComponentValueClient; +``` + +Теперь компонент `QRCode` можно использовать в Schema как строку: + +```json +{ + "type": "string", + "x-component": "QRCode" +} +``` + +#### 1.5 Добавление в `componentOptions` интерфейса поля + +Добавьте `QRCode` в `componentOptions` интерфейса поля `url`, чтобы пользователи могли переключать компоненты через интерфейс. + +```ts +import { Plugin } from '@nocobase/client'; +import { QRCode } from './QRCode'; +import { qrCodeComponentFieldSettings } from './settings'; +import { tStr } from './locale'; + +export class PluginFieldComponentValueClient extends Plugin { + async load() { + this.app.addComponents({ QRCode }); + this.schemaSettingsManager.add(qrCodeComponentFieldSettings); + this.app.addFieldInterfaceComponentOption('url', { + label: tStr('QRCode'), + value: 'QRCode', + }); + } +} + +export default PluginFieldComponentValueClient; +``` + +Подробности об использовании `app.addFieldInterfaceComponentOption` см. в [документации](https://client.docs.nocobase.com/core/data-source/collection-field-interface-manager#addfieldinterfacecomponentoption). + +![Режим редактирования](https://static-docs.nocobase.com/20240724111012.png) + +![Режим ReadOnly](https://static-docs.nocobase.com/20240724111116.png) + +![Режим просмотра](https://static-docs.nocobase.com/20240724111231.png) + +### 2. Реализация настроек Schema + +Для настройки свойств компонента `QRCode` используем Schema Settings. + +#### 2.1 Определение настроек Schema + +Создайте файл `packages/plugins/@nocobase-sample/plugin-field-value/src/client/settings.tsx`: + +```ts +import { createModalSettingsItem, createSelectSchemaSettingsItem, createSwitchSettingsItem, SchemaSettings } from '@nocobase/client'; +import { tStr, useT } from './locale'; + +export const qrCodeComponentFieldSettings = new SchemaSettings({ + name: 'fieldSettings:component:QRCode', + items: [ + // TODO + ], +}); +``` + +Имя `name` следует правилу `fieldSettings:component:${componentName}`, где `componentName` — имя компонента. + +#### 2.2 Регистрация настроек Schema + +Зарегистрируйте `qrCodeComponentFieldSettings` в системе. + +Обновите `packages/plugins/@nocobase-sample/plugin-field-component-value/src/client/index.tsx`: + +```ts +import { Plugin } from '@nocobase/client'; +import { QRCode } from './QRCode'; +import { qrCodeComponentFieldSettings } from './settings'; +import { tStr } from './locale'; + +export class PluginFieldComponentValueClient extends Plugin { + async load() { + this.app.addComponents({ QRCode }); + this.schemaSettingsManager.add(qrCodeComponentFieldSettings); + this.app.addFieldInterfaceComponentOption('url', { + label: tStr('QRCode'), + value: 'QRCode', + }); + } +} + +export default PluginFieldComponentValueClient; +``` + +### 3. Реализация элементов настроек Schema + +#### 3.1 Реализация настройки `Size` + +Для настройки размера используем выпадающий список `select` с вариантами `small`, `middle`, `large`. + +Обновите `packages/plugins/@nocobase-sample/plugin-field-component-value/src/client/settings.ts`: + +```ts +export const qrCodeComponentFieldSettings = new SchemaSettings({ + name: 'fieldSettings:component:QRCode', + items: [ + createSelectSchemaSettingsItem({ + name: 'size', + title: tStr('Size'), + schemaKey: 'x-component-props.size', + defaultValue: 160, + useOptions() { + const t = useT(); + return [ + { + label: t('Small'), + value: 100, + }, + { + label: t('Middle'), + value: 160, + }, + { + label: t('Large'), + value: 200, + }, + ]; + }, + }), + ], +}); +``` + +- `name`: Уникальный идентификатор. +- `title`: Заголовок. +- `schemaKey`: Ключ Schema, в данном случае `x-component-props.size`. +- `defaultValue`: Значение по умолчанию. +- `useOptions`: Опции для выпадающего списка. + +![20240724111505](https://static-docs.nocobase.com/20240724111505.png) + +#### 3.2 Реализация настройки `Bordered` + +Для настройки границы используем переключатель `switch`. + +```ts +export const qrCodeComponentFieldSettings = new SchemaSettings({ + name: 'fieldSettings:component:QRCode', + items: [ + createSelectSchemaSettingsItem({ + name: 'size', + title: tStr('Size'), + schemaKey: 'x-component-props.size', + defaultValue: 160, + useOptions() { + const t = useT(); + return [ + { + label: t('Small'), + value: 100, + }, + { + label: t('Middle'), + value: 160, + }, + { + label: t('Large'), + value: 200, + }, + ]; + }, + }), + createSwitchSettingsItem({ + name: 'bordered', + schemaKey: 'x-component-props.bordered', + title: tStr('Bordered'), + defaultValue: true, + }), + ], +}); +``` + +- `name`: Уникальный идентификатор. +- `schemaKey`: Ключ Schema, в данном случае `x-component-props.bordered`. +- `defaultValue`: Значение по умолчанию. + +![20240724111935](https://static-docs.nocobase.com/20240724111935.png) + +#### 3.3 Реализация настройки `Color` + +Для настройки цвета используем модальное окно с выбором цвета. + +```ts +export const qrCodeComponentFieldSettings = new SchemaSettings({ + name: 'fieldSettings:component:QRCode', + items: [ + createSelectSchemaSettingsItem({ + name: 'size', + title: tStr('Size'), + schemaKey: 'x-component-props.size', + defaultValue: 160, + useOptions() { + const t = useT(); + return [ + { + label: t('Small'), + value: 100, + }, + { + label: t('Middle'), + value: 160, + }, + { + label: t('Large'), + value: 200, + }, + ]; + }, + }), + createSwitchSettingsItem({ + name: 'bordered', + schemaKey: 'x-component-props.bordered', + title: tStr('Bordered'), + defaultValue: true, + }), + createModalSettingsItem({ + name: 'color', + title: tStr('Color'), + parentSchemaKey: 'x-component-props', + schema({ color }) { + return { + type: 'object', + title: tStr('Color'), + properties: { + color: { + type: 'string', + title: tStr('Color'), + default: color, + 'x-component': 'ColorPicker', + }, + }, + }; + }, + }), + ], +}); +``` + +![20240724112041](https://static-docs.nocobase.com/20240724112041.png) + +### 4. Мультиязычность + +Можно добавить несколько языков через [http://localhost:13000/admin/settings/system-settings](http://localhost:13000/admin/settings/system-settings) и переключать их в правом верхнем углу. + +![20240611113758](https://static-docs.nocobase.com/20240611113758.png) + +#### 4.1 Английский язык + +Отредактируйте `packages/plugins/@nocobase-sample/plugin-field-value/src/locale/en-US.json`: + +```json +{ + "QRCode": "QRCode", + "Size": "Size", + "Bordered": "Bordered", + "Color": "Color", + "Small": "Small", + "Middle": "Middle", + "Large": "Large" +} +``` + +#### 4.2 Китайский язык + +Отредактируйте `packages/plugins/@nocobase-sample/plugin-field-value/src/locale/zh-CN.json`: + +```json +{ + "QRCode": "二维码", + "Size": "尺寸", + "Bordered": "边框", + "Color": "颜色", + "Small": "小", + "Middle": "中", + "Large": "大" +} +``` + +![TODO: Скриншот](https://static-docs.nocobase.com/TODO:截图.png) + +## Сборка и загрузка в продакшен + +Следуя инструкциям [Сборка и упаковка плагина](/development/your-fisrt-plugin#构建并打包插件), упакуйте плагин и загрузите его в продакшен. + +Если вы используете клонированный исходный код, сначала выполните полную сборку, чтобы собрать зависимости плагина: + +```bash +yarn build +``` + +Если вы используете проект, созданный через `create-nocobase-app`, выполните: + +```bash +yarn build @nocobase-sample/plugin-field-value --tar +``` + +В результате в папке `storage/tar/@nocobase-sample/plugin-field-value.tar.gz` появится архив плагина. Установите его через интерфейс загрузки, описанный в [документации](/welcome/getting-started/plugin). diff --git a/docs/ru-RU/plugin-samples/field/without-value.md b/docs/ru-RU/plugin-samples/field/without-value.md new file mode 100644 index 0000000000..28f7e3290a --- /dev/null +++ b/docs/ru-RU/plugin-samples/field/without-value.md @@ -0,0 +1,620 @@ +# Компонент поля без значения + +## Описание сценария + +Некоторые поля формы, в силу особых требований, не связаны напрямую с данными поля. Это может быть независимое поле или поле, которое читает значения других полей, выполняет специальную обработку и отображает результат на интерфейсе. + +## Описание примера + +В данном примере демонстрируется сценарий, в котором отслеживаются изменения поля с номером заказа в реальном времени, запрашиваются детали заказа и отображаются на интерфейсе. + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/1721721250.mov" type="video/mp4" /> +</video> + +Полный код примера доступен в репозитории [plugin-samples](https://github.com/nocobase/plugin-samples/tree/main/packages/plugins/%40nocobase-sample/plugin-field-component-without-value). + +## Инициализация плагина + +Следуя инструкциям из документа [Создание первого плагина](/development/your-fisrt-plugin), если у вас ещё нет проекта, создайте его. Если проект уже существует или вы клонировали исходный код, этот шаг можно пропустить. + +```bash +yarn create nocobase-app my-nocobase-app -d sqlite +cd my-nocobase-app +yarn install +yarn nocobase install +``` + +Затем инициализируйте плагин и добавьте его в систему: + +```bash +yarn pm create @nocobase-sample/plugin-field-component-without-value +yarn pm enable @nocobase-sample/plugin-field-component-without-value +``` + +Запустите проект: + +```bash +yarn dev +``` + +После входа в систему перейдите по адресу [http://localhost:13000/admin/pm/list/locale/](http://localhost:13000/admin/pm/list/locale/), чтобы убедиться, что плагин установлен и активирован. + +## Реализация функционала + +Перед реализацией этого примера необходимо ознакомиться с основными концепциями: + +- [Руководство по SchemaInitializer](/development/client/ui-schema/initializer): Используется для добавления различных блоков, полей и операций в интерфейс. +- [API SchemaInitializer](https://client.docs.nocobase.com/core/ui-schema/schema-initializer): Используется для добавления блоков, полей и операций в интерфейс. +- [Протокол UI Schema](/development/client/ui-schema/what-is-ui-schema): Подробное описание структуры Schema и роли каждого атрибута. +- [Designable Designer](/development/client/ui-schema/designable): Используется для изменения Schema. +- [FormV2](https://client.docs.nocobase.com/components/form-v2): Компонент формы. +- [FormItem](https://client.docs.nocobase.com/components/form-item): Компонент элемента формы. + +Структура проекта: + +```bash +. +├── client # Клиентская часть плагина +│ ├── initializer # Инициализатор +│ ├── component # Компонент поля +│ ├── index.tsx # Входной файл клиентской части плагина +│ ├── locale.ts # Утилиты для многоязычности +│ ├── constants.ts # Константы +│ ├── schema # Schema +│ └── settings # Настройки Schema +├── locale # Файлы локализации +│ ├── en-US.json # Английский +│ └── zh-CN.json # Китайский +├── index.ts # Входной файл серверной части плагина +└── server # Серверная часть плагина +``` + +### 1. Определение названия + +Сначала необходимо определить название поля, которое будет использоваться в различных местах. + +Создайте файл `packages/plugins/@nocobase-sample/plugin-field-component-without-value/src/client/constants.ts`: + +```ts +export const FiledComponentName = 'OrderDetails'; +export const FieldTitle = 'Order Details'; +export const FieldNameLowercase = 'orderDetails'; +``` + +### 2. Реализация компонента поля + +#### 2.1 Определение компонента поля + +Создайте файл `packages/plugins/@nocobase-sample/plugin-field-component-without-value/src/client/component/OrderDetails.tsx` со следующим содержимым: + +```tsx | pure +import { observer } from '@formily/react' +import { Spin, Empty } from 'antd'; +import React, { FC } from 'react'; +import { useForm } from '@formily/react'; +import { FiledComponentName } from '../constants'; +import { useRequest } from '@nocobase/client'; + +export interface OrderDetailsProps { + orderField?: string; +} + +export const OrderDetails: FC<OrderDetailsProps> = observer(({ orderField }) => { + const form = useForm(); + const value = orderField ? form.values[orderField] : undefined; + + const { data, loading } = useRequest<{ data: any[] }>({ url: `https://jsonplaceholder.typicode.com/todos/${value}` }, { + ready: !!value, + refreshDeps: [orderField, value], + }) + + if (!orderField) return <div style={{ padding: 20 }}>Пожалуйста, выберите поле заказа</div> + + if (loading) { + return <div style={{ textAlign: 'center', height: 200 }}><Spin /></div> + } + + if (!data?.data) return <Empty />; + + return <pre>{JSON.stringify(data?.data, null, 2)}</pre>; +}, { displayName: FiledComponentName }); +``` + +- [observer](https://react.formilyjs.org/api/shared/observer): Преобразует функциональный компонент в реактивный, автоматически обновляя компонент при изменении данных формы. +- [useForm()](https://react.formilyjs.org/api/hooks/use-form): Получает текущий экземпляр формы. + - `values`: Данные формы. +- [useRequest()](https://client.docs.nocobase.com/core/request): Используется для запроса данных. + +По умолчанию система содержит только таблицы `users` и `roles`. Для простоты в этом примере мы используем переданное поле `orderField` для получения данных из таблицы `users` и отображения их на интерфейсе. + +Экспортируйте компонент в файле `packages/plugins/@nocobase-sample/plugin-field-component-without-value/src/client/component/index.ts`: + +```tsx | pure +export * from './OrderDetails' +``` + +#### 2.2 Регистрация компонента поля + +Необходимо зарегистрировать компонент `OrderDetails` в системе через плагин. + +```tsx | pure +import { Plugin } from '@nocobase/client'; +import { OrderDetails } from './component'; +import { FieldComponentName } from './constants'; + +export class PluginFieldComponentWithoutValueClient extends Plugin { + async load() { + this.app.addComponents({ [FieldComponentName]: OrderDetails }) + } +} + +export default PluginFieldComponentWithoutValueClient; +``` + +#### 2.3 Проверка компонента поля + +Существует два способа проверки компонента: + +- Проверка через временную страницу: Создайте временную страницу, отрендерите компонент `OrderDetails` и проверьте, соответствует ли он требованиям. +- Проверка через примеры в документации: Запустите документацию с помощью команды `yarn doc plugins/@nocobase-sample/plugin-field-component-without-value` и проверьте соответствие через примеры (TODO). + +В данном случае мы используем проверку через временную страницу. Создайте страницу, добавьте один или несколько компонентов `OrderDetails` с параметрами и проверьте их работу. + +```tsx | pure +import React from 'react'; +import { Plugin, SchemaComponent } from '@nocobase/client'; + +import { OrderDetails } from './component'; +import { FieldComponentName } from './constants'; + +export class PluginFieldOrderDetailsClient extends Plugin { + async load() { + this.app.addComponents({ [FieldComponentName]: OrderDetails }) + + function Demo() { + const schema = { + type: 'void', + name: 'root', + properties: { + test: { + type: 'void', + 'x-component': 'FormV2', + properties: { + username: { + type: 'string', + 'x-decorator': 'FormItem', + 'x-component': 'Input', + title: 'Имя пользователя', + required: true, + }, + orderDetails: { + type: 'string', + 'x-decorator': 'FormItem', + 'x-component': OrderDetails, + title: 'Детали заказа', + 'x-component-props': { + orderField: 'username', + }, + } + }, + }, + }, + }; + + return <SchemaComponent schema={schema} />; + } + + this.app.router.add('admin.order-details-component', { + path: '/admin/order-details-component', + Component: Demo + }) + } +} + +export default PluginFieldOrderDetailsClient; +``` + +Мы ссылаемся на пример [Компонент формы](https://client.docs.nocobase.com/components/form-v2#basic-usage), создаём компонент `Demo`, добавляем компонент `OrderDetails` в поле `orderDetails` и устанавливаем `orderField` как `username`. Это позволяет получать данные из таблицы `users` на основе значения поля `username`. + +Подробное описание `SchemaComponent` можно найти в документации [SchemaComponent](https://client.docs.nocobase.com/core/ui-schema/schema-component#schemacomponent-1). + +Перейдите по адресу `http://localhost:13000/admin/order-details-component`, чтобы увидеть содержимое тестовой страницы. + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/1721721815326.mov" type="video/mp4" /> +</video> + +После проверки удалите тестовую страницу. + +### 3. Определение схемы поля + +Динамические страницы в NocoBase рендерятся с помощью Schema, поэтому нам нужно определить Schema для добавления блока `OrderDetails` в интерфейс. Перед этим изучите следующие концепции: + +- [Протокол UI Schema](/development/client/ui-schema/what-is-ui-schema): Подробное описание структуры Schema и роли каждого атрибута. + +#### 3.1 Определение схемы поля + +Создайте файл `packages/plugins/@nocobase-sample/plugin-field-component-without-value/src/client/schema/index.ts`: + +```tsx | pure +import { ISchema } from "@nocobase/client" +import { FieldComponentName } from '../constants'; + +export const getOrderDetailsSchema = (orderField: string): ISchema => ({ + type: 'void', + 'x-decorator': 'FormItem', + 'x-toolbar': 'FormItemSchemaToolbar', + 'x-component': FieldComponentName, + 'x-component-props': { + 'orderField': orderField, + } +}) +``` + +`getOrderDetailsSchema`: + +- `type`: Тип, здесь `void`, указывает на чистый UI-узел. +- `'x-decorator': 'FormItem'`: [Компонент FormItem](https://client.docs.nocobase.com/components/form-item), используется для обёртывания компонента поля. +- `'x-toolbar': 'FormItemSchemaToolbar'`: Совместно с `x-decorator` отображает операции и настройки в правом верхнем углу. +- `'x-component': FieldComponentName'`: Компонент `OrderDetails`, определённый ранее. +- `x-component-props`: Свойства компонента `OrderDetails`, автоматически передаются в компонент. + - `orderField`: Поле заказа. + +Эта схема эквивалентна следующему React-компоненту: + +```tsx | pure +<FormItem> + <OrderDetails orderField /> +</FormItem> +``` + +#### 3.2 Проверка схемы поля + +Как и при проверке компонента, мы можем использовать временную страницу или примеры в документации для проверки соответствия схемы требованиям. Здесь мы используем проверку через временную страницу: + +```tsx | pure +import { Plugin, SchemaComponent } from '@nocobase/client'; +import { OrderDetails } from './component'; +import { FieldComponentName } from './constants'; + +import React from 'react'; + +export class PluginFieldOrderDetailsClient extends Plugin { + async load() { + this.app.addComponents({ [FieldComponentName]: OrderDetails }) + + function Demo() { + const schema = { + type: 'void', + name: 'root', + properties: { + test: { + type: 'void', + 'x-component': 'FormV2', + properties: { + username: { + type: 'string', + 'x-decorator': 'FormItem', + 'x-component': 'Input', + title: 'Имя пользователя', + required: true, + }, + orderDetails: getOrderDetailsSchema('username') + }, + }, + }, + }; + + return <SchemaComponent schema={schema} />; + } + + this.app.router.add('admin.order-details-schema', { + path: '/admin/order-details-schema', + Component: Demo + }) + } +} + +export default PluginFieldOrderDetailsClient; +``` + +Перейдите по адресу [http://localhost:13000/admin/order-details-schema](http://localhost:13000/admin/order-details-schema), чтобы увидеть содержимое тестовой страницы. + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/1721721815326.mov" type="video/mp4" /> +</video> + +### 4. Определение элемента Schema Initializer + +Создайте файл `packages/plugins/@nocobase-sample/plugin-field-component-without-value/src/client/initializer/index.tsx`: + +```ts +import React from "react"; +import { SchemaInitializerActionModal, SchemaInitializerItemType, SelectProps, useCollection, useCompile, useSchemaInitializer } from "@nocobase/client" +import { MenuOutlined } from "@ant-design/icons"; + +import { FieldNameLowercase } from "../constants"; +import { useT } from "../locale"; +import { getOrderDetailsSchema } from '../schema' + +export function useFieldOptions(): SelectProps['options'] { + const collection = useCollection(); + + const compile = useCompile(); + return collection + .getFields() + .map(field => ({ label: field.uiSchema?.title ? compile(field.uiSchema.title) : field.name, value: field.name })); +} + +const OrderDetailsSchemaInitializer = () => { + const t = useT(); + const { insert } = useSchemaInitializer(); + const options = useFieldOptions(); + return <SchemaInitializerActionModal + buttonText={t("Детали заказа")} + title={t("Выберите поле заказа")} + icon={<MenuOutlined />} + isItem + onSubmit={({ orderField }) => { + insert(getOrderDetailsSchema(orderField)); + }} + schema={{ + orderField: { + type: 'string', + title: 'Поле заказа', + required: true, + 'x-component': 'Select', + 'x-decorator': 'FormItem', + enum: options + }, + }} + ></SchemaInitializerActionModal> +} + +export const orderDetailsInitializerItem: SchemaInitializerItemType = { + name: FieldNameLowercase, + Component: OrderDetailsSchemaInitializer +}; +``` + +`orderDetailsInitializerItem`: +- `name`: Уникальный идентификатор для различения элементов Schema и операций CRUD. +- `Component`: Компонент, соответствующий элементу Schema Initializer. + +`OrderDetailsSchemaInitializer`: +- [SchemaInitializerActionModal](https://client.docs.nocobase.com/core/ui-schema/schema-initializer#type-actionmodal---schemainitializeractionmodal): Элемент Schema Initializer с модальным окном. + - `buttonText`: Текст кнопки. + - `title`: Заголовок модального окна. + - `isItem`: Указывает, является ли элемент Item (здесь должно быть `true`). + - `schema`: Схема формы внутри модального окна. + - `onSubmit`: Событие отправки формы. +- `useFieldOptions`: Получение опций полей. +- `useT`: Получение функции для работы с многоязычностью. +- [useSchemaInitializer()](https://client.docs.nocobase.com/core/ui-schema/schema-initializer#useschemainitializer): Получение контекста Schema Initializer. + - `insert`: Вставка элемента Schema. + +`useFieldOptions`: +- [useCollection](https://client.docs.nocobase.com/core/data-source/collection-provider#usecollection): Получение коллекции текущей таблицы. +- `useCompile`: Функция компиляции. + +Подробности об определении элементов Schema можно найти в документации [Schema Initializer Item](https://client.docs.nocobase.com/core/ui-schema/schema-initializer#built-in-components-and-types). + +### 5. Добавление в `Configure fields` блока формы + +`Configure fields` блока формы соответствует имени `form:configureFields`. + +Измените файл `packages/plugins/@nocobase-sample/plugin-field-component-without-value/src/client/index.tsx`: + +```diff +// ... ++ import { orderDetailsInitializerItem } from './initializer'; + +export class PluginFieldComponentWithoutValueClient extends Plugin { + async load() { + // ... ++ this.app.schemaInitializerManager.addItem('form:configureFields', orderDetailsInitializerItem.name, orderDetailsInitializerItem); + } +} + +export default PluginFieldComponentWithoutValueClient; +``` + +Мы используем [app.schemaInitializerManager.addItem](https://client.docs.nocobase.com/core/ui-schema/schema-initializer-manager#schemainitializermanageradditem) для добавления `orderDetailsInitializerItem` в соответствующий инициализатор. + +![20240723161400](https://static-docs.nocobase.com/20240723161400.png) + +### 6. Реализация настроек Schema + +#### 6.1 Определение настроек Schema + +Для полноценного блока необходимы настройки Schema для конфигурации атрибутов и операций. + +Создайте файл `packages/plugins/@nocobase-sample/plugin-field-component-without-value/src/client/settings/index.ts`: + +```ts | pure +import { SchemaSettings } from "@nocobase/client"; +import { FieldNameLowercase } from '../constants'; +import { orderFieldSchemaSettingsItem } from "./items/orderField"; + +export const orderDetailsSettings = new SchemaSettings({ + name: `blockSettings:${FieldNameLowercase}`, + items: [ + // TODO + ] +}); +``` + +#### 6.2 Регистрация настроек Schema + +```ts +import { Plugin } from '@nocobase/client'; +import { orderDetailsSettings } from './settings'; + +export class PluginFieldComponentWithoutValueClient extends Plugin { + async load() { + // ... + this.app.schemaSettingsManager.add(orderDetailsSettings) + } +} + +export default PluginFieldComponentWithoutValueClient; +``` + +#### 6.3 Использование настроек Schema + +Измените `carouselSchema` в файле `packages/plugins/@nocobase-sample/plugin-field-component-without-value/src/client/schema/index.ts`: + +```diff ++ import { orderDetailsSettings } from "../settings"; + +export const getOrderDetailsSchema = (orderField: string): ISchema => ({ + type: 'void', + 'x-decorator': 'FormItem', ++ 'x-settings': orderDetailsSettings.name, + // ... +}); +``` + +### 7. Реализация элементов настроек Schema + +На данный момент мы реализовали только `Schema Settings`, но не добавили никаких операций. Нам нужно реализовать операции в соответствии с требованиями. + +Список встроенных типов операций для Schema Settings можно найти в документации [Schema Settings - Built-in Components and Types](https://client.docs.nocobase.com/core/ui-schema/schema-settings#built-in-components-and-types). + +#### 7.1 Реализация операции `remove` + +Поля, добавленные через инициализаторы, сейчас нельзя удалить. Нам нужно реализовать операцию `remove`. + +NocoBase предоставляет встроенный тип операции [remove](https://client.docs.nocobase.com/core/ui-schema/schema-settings#schemasettingsremove-1). Измените файл `packages/plugins/@nocobase-sample/plugin-field-component-without-value/src/client/settings/index.ts`: + +```diff +export const orderDetailsSettings = new SchemaSettings({ + name: `blockSettings:${FieldNameLowercase}`, + items: [ ++ { ++ type: 'remove', ++ name: 'remove', ++ componentProps: { ++ removeParentsIfNoChildren: true, ++ breakRemoveOn: { ++ 'x-component': 'Grid', ++ }, ++ } ++ } + ] +}); +``` + +- `componentProps`: + - `removeParentsIfNoChildren`: Удалять родительский узел, если у него нет дочерних узлов. + - `breakRemoveOn`: Условие прерывания удаления. Поскольку `Configure fields` автоматически оборачивает элементы в `Grid`, мы устанавливаем `breakRemoveOn: { 'x-component': 'Grid' }`, чтобы предотвратить удаление `Grid`. + +![20240613183852](https://static-docs.nocobase.com/20240613183852.png) + +#### 7.2 Реализация выбора `Order field` + +Помимо выбора `Order field` при добавлении поля, мы можем также выбирать `Order field` в настройках Schema. + +##### 7.2.1 Определение элемента настроек Schema + +Создайте файл `packages/plugins/@nocobase-sample/plugin-field-component-without-value/src/client/settings/items/orderField.ts`: + +```ts +import { createSelectSchemaSettingsItem } from "@nocobase/client"; +import { generateNTemplate } from "../../locale"; +import { useFieldOptions } from '../../initializer' + +export const orderFieldSchemaSettingsItem = createSelectSchemaSettingsItem({ + name: 'orderField', + title: generateNTemplate('Поле заказа'), + useOptions: useFieldOptions, + schemaKey: `x-component-props.orderField`, +}); +``` + +Подробности об определении элементов SchemaSettings можно найти в документации [SchemaSettingsItem](https://client.docs.nocobase.com/core/ui-schema/schema-settings#optionsitems). + +`createSelectSchemaSettingsItem`: Используется для быстрого создания элемента SchemaSettings типа "выбор". + +- `name`: Уникальный идентификатор для операций CRUD. +- `title`: Заголовок. +- `useOptions`: Получение опций. +- `schemaKey`: Соответствующий ключ схемы. + +##### 7.2.2 Использование элемента SchemaSettings + +Измените файл `packages/plugins/@nocobase-sample/plugin-field-component-without-value/src/client/settings/index.ts`: + +```diff +import { SchemaSettings } from "@nocobase/client"; +import { FieldNameLowercase } from '../constants'; ++ import { orderFieldSchemaSettingsItem } from "./items/orderField"; + +export const orderDetailsSettings = new SchemaSettings({ + name: `blockSettings:${FieldNameLowercase}`, + items: [ ++ orderFieldSchemaSettingsItem, + { + name: 'remove', + type: 'remove', + componentProps: { + removeParentsIfNoChildren: true, + breakRemoveOn: { + 'x-component': 'Grid', + }, + } + }, + ] +}); +``` + +![20240723161525](https://static-docs.nocobase.com/20240723161525.png) + +Вы можете реализовать дополнительные настройки Schema в соответствии с вашими потребностями. + +### 8. Многоязычность + +#### 8.1 Английский + +Отредактируйте файл `packages/plugins/@nocobase-sample/plugin-field-component-without-value/src/locale/en-US.json`: + +```ts +{ + "Order Details": "Order Details", + "Order field": "Order field" +} +``` + +#### 8.2 Китайский + +Отредактируйте файл `packages/plugins/@nocobase-sample/plugin-field-component-without-value/src/locale/zh-CN.json`: + +```ts +{ + "Order Details": "订单详情", + "Order field": "订单字段" +} +``` + +Вы можете добавить несколько языков через [http://localhost:13000/admin/settings/system-settings](http://localhost:13000/admin/settings/system-settings) и переключать их в правом верхнем углу. + +![20240611113758](https://static-docs.nocobase.com/20240611113758.png) + +## Упаковка и загрузка в продакшен + +Следуя документации [Сборка и упаковка плагина](/development/your-fisrt-plugin#构建并打包插件), вы можете упаковать плагин и загрузить его в продакшен. + +Если вы клонировали исходный код, сначала выполните полную сборку, чтобы собрать зависимости плагина: + +```bash +yarn build +``` + +Если проект создан с помощью `create-nocobase-app`, выполните: + +```bash +yarn build @nocobase-sample/plugin-field-component-without-value --tar +``` + +После этого появится файл `storage/tar/@nocobase-sample/plugin-field-component-without-value.tar.gz`, который можно установить через [метод загрузки](/welcome/getting-started/plugin). diff --git a/docs/ru-RU/plugin-samples/index.md b/docs/ru-RU/plugin-samples/index.md new file mode 100644 index 0000000000..45b74bbfa2 --- /dev/null +++ b/docs/ru-RU/plugin-samples/index.md @@ -0,0 +1,82 @@ +# Обзор + +- **Создание первого плагина** + - @my-project/plugin-hello +- **Таблицы и поля** + - Определение коллекции (sample-collection-define) + - Расширение коллекции (sample-collection-extend) + - Модель коллекции (sample-collection-model) + - Репозиторий коллекции (sample-collection-repository) + - Шаблон коллекции (sample-collection-template) + - Тип поля коллекции (sample-collection-field-type) + - Интерфейс поля коллекции (sample-collection-field-interface) +- **Ресурсы и действия** + - Регистрация обработчиков действий для менеджера ресурсов (sample-resource-manager-register-action-handlers) + - Определение менеджера ресурсов (sample-resource-manager-define) + - Действия менеджера ресурсов (sample-resource-manager-actions) +- **Использование базы данных** + - Регистрация типов полей для базы данных (sample-db-registerFieldTypes) + - Регистрация моделей для базы данных (sample-db-registerModels) + - Регистрация репозиториев для базы данных (sample-db-registerRepositories) + - Регистрация операторов для базы данных (sample-db-registerOperators) + - Репозиторий базы данных (sample-db-repository) +- **Пользовательская командная строка** + - Создание команды (sample-cli-create-command) +- **Скрипты миграции** + - Создание миграции (sample-migration-create-migration) +- **Кэширование** + - Регистрация хранилища кэша (sample-cache-register-store) + - Создание кэша (sample-cache-create-cache) +- **Промежуточное ПО сервера** + - Ограничение скорости (sample-middleware-ratelimit) +- **Расширения источников данных** + - API NocoBase для источника данных (sample-data-source-nocobase-api) +- **Расширения для графиков** + - ECharts для визуализации данных (sample-dv-echarts) +- **Интернационализация** + - Поддержка китайского языка (sample-i18n-zh-cn) +- **Расширения маршрутизации фронтенда** + - Добавление новой страницы + - Замена существующей страницы + - Страница конфигурации плагина (одиночный маршрут) + - Страница конфигурации плагина (вкладочный макет) + - Страница конфигурации плагина (различные макеты) +- **Страницы конфигурации плагина** + - Страница конфигурации формы + - Страница конфигурации таблицы + - Страница конфигурации полиморфной таблицы +- **Компоненты-провайдеры** + - Глобальная панель объявлений +- **Расширения компонентов** +- **Инициализатор схемы** + - Добавление элементов инициализации в существующие блоки добавления + - Добавление элементов инициализации в существующие действия настройки + - Добавление элементов инициализации в существующие поля настройки + - Повторное использование существующего элемента SchemaInitializerItem + - Прямое добавление блока + - Добавление после настройки всплывающего окна (например, календаря) + - Создание новых инициализаторов + - Простая кнопка и выпадающее меню +- **Настройки схемы** + - Добавление элементов инициализации в существующие настройки + - Повторное использование существующего элемента SchemaSettingsItem + - Создание новых настроек +- **Расширения блоков** + - Пример простого блока — блок карусели изображений галереи + - Разработка компонента блока + - Элемент инициализатора + - Настройки блока + - Встроенный инициализатор блока + - Настройка операций + - Настройка полей + - Пользовательский инициализатор +- **Расширения операций** + - Операции на основе команд + - Операции на основе всплывающих окон +- **Расширения полей** + - Пользовательский тип интерфейса поля + - Пользовательский тип данных поля + - Разработка компонента поля + - connect + mapReadPretty + - observer + mapReadPretty + - Предоставление установщиков для полей diff --git a/docs/ru-RU/plugin-samples/plugin-settings/form.md b/docs/ru-RU/plugin-samples/plugin-settings/form.md new file mode 100644 index 0000000000..ba566cc9a3 --- /dev/null +++ b/docs/ru-RU/plugin-samples/plugin-settings/form.md @@ -0,0 +1,453 @@ +# Страница конфигурации формы + +## Описание сценария + +Интерфейс конфигурации состоит из формы. + +## Описание примера + +Предположим, нам нужно подключиться к стороннему картографическому сервису и настроить `key` и `secret` для карты. Мы можем добавить страницу конфигурации через плагин для ввода этой информации. + +Полный код примера доступен в репозитории [plugin-samples](https://github.com/nocobase/plugin-samples/tree/main/packages/plugins/%40nocobase-sample/plugin-settings-form). + +## Инициализация плагина + +Следуя руководству [Создание первого плагина](/development/your-fisrt-plugin), создайте проект, если у вас его ещё нет. Если проект уже создан или вы клонировали исходный код, этот шаг можно пропустить. + +```bash +yarn create nocobase-app my-nocobase-app -d sqlite +cd my-nocobase-app +yarn install +yarn nocobase install +``` + +Затем инициализируйте плагин и добавьте его в систему: + +```bash +yarn pm create @nocobase-sample/plugin-settings-form +yarn pm enable @nocobase-sample/plugin-settings-form +``` + +Запустите проект: + +```bash +yarn dev +``` + +После входа в систему перейдите по адресу [http://localhost:13000/admin/pm/list/local/](http://localhost:13000/admin/pm/list/local/), чтобы убедиться, что плагин установлен и активирован. + +## Реализация серверной части + +### 1. Создание таблицы базы данных + +На серверной части основная задача — создание таблицы базы данных для хранения конфигурационной информации. Для создания таблиц нужно ознакомиться со следующими концепциями: + +- [Таблицы и поля](/development/server/collections) +- [Создание таблиц](/development/server/collections/configure#в-плагин-коде) +- [Типы полей](/development/server/collections/options#field-type) +- [API defineCollection()](/api/database#definecollection) +- [API коллекций](/api/database/collection) + +В этом примере создайте файл `packages/plugins/@nocobase-sample/plugin-settings-form/src/server/collections/map-configuration.ts` со следующим содержимым: + +```ts +import { defineCollection } from '@nocobase/database'; + +export default defineCollection({ + name: 'SamplesMapConfiguration', + fields: [ + { + type: 'string', + name: 'key', + }, + { + type: 'string', + name: 'secret', + }, + ], +}); +``` + +Мы создали таблицу базы данных `SamplesMapConfiguration`, содержащую два поля: `key` и `secret`, оба типа `string`. + +### 2. Выполнение обновления + +Необходимо обновить базу данных с определённой таблицей, что можно сделать следующей командой: + +```bash +yarn nocobase upgrade +``` + +![img_v3_02av_db5e9985-eb20-4420-a0b2-8a809ff05a5g](https://static-docs.nocobase.com/img_v3_02av_db5e9985-eb20-4420-a0b2-8a809ff05a5g.jpg) + +## Реализация клиентской части + +### 1. Создание страницы конфигурации плагина + +Мы уже описали подробные шаги для [Добавления страницы конфигурации плагина (один маршрут)](/plugin-samples/router/add-setting-page-single-route), поэтому здесь не будем их повторять. + +Измените файл `packages/plugins/@nocobase-sample/plugin-settings-form/src/client/index.tsx` следующим образом: + +```tsx | pure +import { Plugin } from '@nocobase/client'; +// @ts-ignore +import { name } from '../../package.json'; + +export class PluginSettingsFormClient extends Plugin { + async load() { + this.app.pluginSettingsManager.add(name, { + title: 'Форма настроек плагина', + icon: 'FormOutlined', + Component: () => 'TODO', + }); + } +} + +export default PluginSettingsFormClient; +``` + +Затем перейдите по адресу [http://localhost:13000/admin/settings/@nocobase-sample/plugin-settings-form](http://localhost:13000/admin/settings/@nocobase-sample/plugin-settings-form), чтобы увидеть страницу конфигурации. + +![img_v3_02av_c90b5767-97dd-4fef-8dd0-c7ff9a136a9g](https://static-docs.nocobase.com/img_v3_02av_c90b5767-97dd-4fef-8dd0-c7ff9a136a9g.jpg) + +### 2. Определение структуры таблицы данных + +На основе метода определения схемы сначала необходимо определить структуру таблицы данных. Для этого на клиентской стороне нужно понимать следующие концепции: + +- [Таблицы и поля](/development/server/collections#field-component) +- [Типы полей](/development/server/collections/options#field-type) +- [Интерфейс поля](/development/server/collections/options#field-interface) +- [Протокол UI Schema](/development/client/ui-schema/what-is-ui-schema) +- [Компоненты полей](https://client.docs.nocobase.com/components) + +Создайте файл `packages/plugins/@nocobase-sample/plugin-settings-form/src/client/PluginSettingsForm.tsx` со следующим содержимым: + +```ts +const mapConfigurationCollection = { + name: 'SamplesMapConfiguration', + filterTargetKey: 'id', + fields: [ + { + type: 'string', + name: 'key', + interface: 'input', + uiSchema: { + title: 'Ключ', + required: true, + 'x-component': 'Input', + }, + }, + { + type: 'string', + name: 'secret', + interface: 'input', + uiSchema: { + title: 'Секрет', + required: true, + 'x-component': 'Input', + }, + }, + ], +}; +``` + +Мы определили таблицу данных `SamplesMapConfiguration` с двумя полями: `key` и `secret`. Поля описаны следующим образом: + +- `type`: Поскольку значения строковые, установлено значение `string`, которое должно соответствовать типу поля на серверной стороне. +- `name`: Имя поля, должно совпадать с именем поля на серверной стороне. +- `interface`: Для строкового значения выбрано значение `input`. +- `uiSchema`: Определяет рендеринг компонентов формы на клиентской стороне. + - `title`: Заголовок поля формы. + - `required`: Поскольку поле обязательно, установлено значение `true`. + - `x-component`: Выбран компонент [Input](https://client.docs.nocobase.com/components/input) для ввода однострочного текста. + +### 3. Создание схемы формы + +Для создания схем форм важны следующие концепции: + +- [Компонент формы](https://client.docs.nocobase.com/components/form-v2) +- [Компонент CollectionField](https://client.docs.nocobase.com/core/data-source/collection-field) +- [Компонент CardItem](https://client.docs.nocobase.com/components/card-item) +- [Протокол схемы](/development/client/ui-schema/what-is-ui-schema) +- [Компонент DataBlockProvider](https://client.docs.nocobase.com/core/data-block/data-block-provider) +- [Компонент Action](https://client.docs.nocobase.com/components/action) + +Продолжите добавлять в файл `packages/plugins/@nocobase-sample/plugin-settings-form/src/client/PluginSettingsForm.tsx`: + +```ts +import { useMemo } from 'react'; +import { App as AntdApp } from 'antd'; +import { createForm } from '@formily/core'; +import { useForm } from '@formily/react'; +import { uid } from '@formily/shared'; +import { ActionProps, ISchema, useCollection, useCollectionRecordData, useDataBlockResource } from '@nocobase/client'; + +const schema: ISchema = { + type: 'void', + name: uid(), + 'x-component': 'CardItem', + 'x-decorator': 'DataBlockProvider', + 'x-decorator-props': { + collection: mapConfigurationCollection.name, + action: 'get', + }, + properties: { + form: { + type: 'void', + 'x-component': 'FormV2', + 'x-use-component-props': 'useFormBlockProps', + properties: { + key: { + title: 'Ключ', + 'x-decorator': 'FormItem', + 'x-component': 'CollectionField', + }, + secret: { + title: 'Секрет', + 'x-decorator': 'FormItem', + 'x-component': 'CollectionField', + }, + footer: { + type: 'void', + 'x-component': 'Action', + title: 'Отправить', + 'x-use-component-props': 'useSubmitActionProps', + }, + }, + }, + }, +}; + +const useFormBlockProps = () => { + const recordData = useCollectionRecordData(); + const form = useMemo( + () => createForm({ + initialValues: recordData, + }), + [recordData], + ); + return { + form, + }; +}; + +const useSubmitActionProps = (): ActionProps => { + const form = useForm(); + const { message } = AntdApp.useApp(); + const collection = useCollection(); + const resource = useDataBlockResource(); + return { + type: 'primary', + htmlType: 'submit', + async onClick() { + await form.submit(); + const values = form.values; + await resource.updateOrCreate({ + values, + filterKeys: [collection.filterTargetKey], + }); + message.success('Успешно сохранено!'); + }, + }; +}; +``` + +- [CardItem](https://client.docs.nocobase.com/components/card-item): Компонент карты, обеспечивающий компоновку в стиле карточки. +- [DataBlockProvider](https://client.docs.nocobase.com/core/data-block/data-block-provider): Компонент, предоставляющий данные дочерним узлам, с атрибутами `collection` и `action`, так как форма запрашивает данные одной строки. +- [FormV2](https://client.docs.nocobase.com/components/form-v2): Компонент формы для её рендеринга. +- `useFormBlockProps`: Используется для получения атрибутов блока данных и передачи их компоненту FormV2. Подробные примеры см. в разделе [Значения по умолчанию](https://client.docs.nocobase.com/components/form-v2#default-values). +- [CollectionField](https://client.docs.nocobase.com/core/data-source/collection-field): Компонент поля таблицы данных, используемый для чтения UI Schema коллекции и её рендеринга. +- [Action](https://client.docs.nocobase.com/components/action): Компонент кнопки действия, используемый для отправки формы. +- `useSubmitActionProps`: Используется для получения атрибутов кнопки отправки. + - [useCollection](/core/data-source/collection-provider): Используется для получения информации о таблице данных. + - [useDataBlockResource](/core/data-block/data-block-resource-provider): Хук, предоставляемый DataBlockProvider для доступа к ресурсам блока данных для операций CRUD. + +### 4. Создание компонента формы + +Для рендеринга схемы в компонент нужно понимать следующие концепции: + +- Компонент [ExtendCollectionsProvider](https://client.docs.nocobase.com/core/data-source/extend-collections-provider) для расширения таблиц данных. +- Компонент [SchemaComponent](https://client.docs.nocobase.com/core/ui-schema/schema-component) для рендеринга форм. + +Продолжите добавлять в файл `packages/plugins/@nocobase-sample/plugin-settings-form/src/client/PluginSettingsForm.tsx`: + +```tsx | pure +import React from 'react'; +import { ExtendCollectionsProvider, SchemaComponent } from '@nocobase/client'; +export const PluginSettingsForm = () => { + return ( + <ExtendCollectionsProvider collections={[mapConfigurationCollection]}> + <SchemaComponent schema={schema} scope={{ useFormBlockProps, useSubmitActionProps }} /> + </ExtendCollectionsProvider> + ); +}; +``` + +### 5. Регистрация страницы конфигурации плагина + +Измените файл `packages/plugins/@nocobase-sample/plugin-settings-form/src/client/index.tsx` следующим образом: + +```diff +import { Plugin } from '@nocobase/client'; +// @ts-ignore +import { name } from '../../package.json'; ++ import { PluginSettingsForm } from './PluginSettingsForm' + +export class PluginSettingFormClient extends Plugin { + async load() { + this.app.pluginSettingsManager.add(name, { + title: 'Форма настроек плагина', + icon: 'FormOutlined', +- Component: () => 'TODO', ++ Component: PluginSettingsForm, + }); + } +} + +export default PluginSettingFormClient; +``` + +Теперь перейдите по адресу [http://localhost:13000/admin/settings/@nocobase-sample/plugin-settings-form](http://localhost:13000/admin/settings/@nocobase-sample/plugin-settings-form), чтобы увидеть страницу конфигурации. + +<video width="100%" controls> + <source src="https://static-docs.nocobase.com/20240517-182716.mp4" type="video/mp4"> +</video> + +### 6. Использование данных конфигурации на странице + +При использовании данных формы есть два сценария: использование данных внутри страницы и глобальное использование. Разница в следующем: + +- Глобальное использование: После обновления данных формы их нужно синхронизировать с глобальным состоянием для обновления в реальном времени. +- Использование внутри страницы: Поскольку страница автоматически уничтожается и создаётся при переключении, синхронизация данных не требуется. + +На этом этапе мы продемонстрируем использование данных формы внутри страницы. + +Создайте файл `packages/plugins/@nocobase-sample/plugin-settings-form/src/client/PluginSettingsFormPage.tsx` со следующим содержимым: + +```tsx | pure +import { useRequest } from '@nocobase/client'; +import React from 'react'; + +export const PluginSettingsFormPage = () => { + const { data, loading } = useRequest<{ data?: { key: string; secret: string } }>({ + url: 'SamplesMapConfiguration:get', + }); + + if (loading) return null; + + return <pre>{JSON.stringify(data?.data, null, 2)}</pre> +} +``` + +Затем добавьте компонент `PluginSettingsFormPage` в компонент `PluginSettingsForm`: + +```tsx | pure +import { PluginSettingsFormPage } from './PluginSettingsFormPage' +// ... + +export class PluginSettingFormClient extends Plugin { + async load() { + // ... + + this.app.router.add(`admin.${name}-page`, { + path: '/admin/plugin-settings-form-page', + Component: PluginSettingsFormPage, + }) + } +} +``` + +Теперь перейдите по адресу [http://localhost:13000/admin/plugin-settings-form-page](http://localhost:13000/admin/plugin-settings-form-page), чтобы увидеть данные формы. + +![img_v3_02av_70ade722-7069-4fc7-a2c3-c080f85ff30g](https://static-docs.nocobase.com/img_v3_02av_70ade722-7069-4fc7-a2c3-c080f85ff30g.jpg) + +### 7. Глобальное использование данных конфигурации + +Для глобального использования данных с обеспечением обновления в реальном времени необходимо использовать `Context` и возможности [Provider](/development/client/providers) NocoBase. + +Создайте файл `packages/plugins/@nocobase-sample/plugin-settings-form/src/client/PluginSettingsFormProvider.tsx` со следующим содержимым: + +```tsx | pure +import React, { createContext, FC } from 'react'; +import { useRequest, UseRequestResult } from '@nocobase/client'; + +const PluginSettingsFormContext = createContext<UseRequestResult<{ data?: { key: string; secret: string } }>>(null as any); + +export const PluginSettingsFormProvider: FC<{ children: React.ReactNode }> = ({children}) => { + const request = useRequest<{ data?: { key: string; secret: string } }>({ + url: 'SamplesMapConfiguration:get', + }); + + console.log('PluginSettingsFormProvider', request.data?.data); + + return <PluginSettingsFormContext.Provider value={request}>{children}</PluginSettingsFormContext.Provider>; +} + +export const usePluginSettingsFormRequest = () => { + return React.useContext(PluginSettingsFormContext); +}; +``` + +Затем измените файл `packages/plugins/@nocobase-sample/plugin-settings-form/src/client/index.tsx`, чтобы зарегистрировать его глобально: + +```ts +import { PluginSettingsFormProvider } from './PluginSettingsFormProvider' +// ... + +export class PluginSettingFormClient extends Plugin { + async load() { + // ... + this.app.addProvider(PluginSettingsFormProvider) + } +} +``` + +После обновления формы нужно повторно загрузить глобальные данные. Измените файл `packages/plugins/@nocobase-sample/plugin-settings-form/src/client/PluginSettingsForm.tsx`: + +```diff ++ import { usePluginSettingsFormRequest } from './PluginSettingsFormProvider'; + +const useSubmitActionProps = (): ActionProps => { + const form = useForm(); + const { message } = AntdApp.useApp(); + const collection = useCollection(); + const resource = useDataBlockResource(); ++ const globalSettingsFormRequest = usePluginSettingsFormRequest(); + return { + type: 'primary', + htmlType: 'submit', + async onClick() { + await form.submit(); + const values = form.values; + await resource.updateOrCreate({ + values, + filterKeys: [collection.filterTargetKey], + }); ++ await globalSettingsFormRequest.runAsync(); + message.success('Успешно сохранено!'); + }, + }; +}; +``` + +<video width="100%" controls> + <source src="https://static-docs.nocobase.com/20240517-182717.mp4" type="video/mp4"> +</video> + +## Упаковка и загрузка в продакшен + +Следуя руководству [Сборка и упаковка плагина](/development/your-fisrt-plugin#构建并打包插件), вы можете упаковать плагин и загрузить его в продакшен. + +Если вы клонировали исходный код, сначала выполните полную сборку, чтобы упаковать зависимости плагина: + +```bash +yarn build +``` + +Если вы использовали `create-nocobase-app` для создания проекта, выполните: + +```bash +yarn build @nocobase-sample/plugin-settings-form --tar +``` + +После этого появится файл `storage/tar/@nocobase-sample/plugin-settings-form.tar.gz`, который можно установить, следуя инструкциям по [загрузке плагина](/welcome/getting-started/plugin). diff --git a/docs/ru-RU/plugin-samples/plugin-settings/index.md b/docs/ru-RU/plugin-samples/plugin-settings/index.md new file mode 100644 index 0000000000..a48d475043 --- /dev/null +++ b/docs/ru-RU/plugin-samples/plugin-settings/index.md @@ -0,0 +1,59 @@ +# Обзор страницы конфигурации плагина + +## Введение в сценарий + +При разработке плагинов часто требуется предоставить страницу конфигурации, где пользователи могут задавать различные параметры для плагина. + +Существует четыре распространённых типа страниц конфигурации плагинов: + +### Страница конфигурации формы + +Пользователи могут заполнить определённые параметры в форме и сохранить их. Эти параметры будут храниться в базе данных и использоваться плагином во время работы. Например, см. [Плагин кастомизации бренда](/handbook/custom-brand#user-guide). + +![img_v3_02av_cc1d4351-3a24-4cd9-b5a6-98fb3b8dae6g](https://static-docs.nocobase.com/img_v3_02av_cc1d4351-3a24-4cd9-b5a6-98fb3b8dae6g.jpg) + +Как показано выше, эта страница конфигурации представляет собой форму, в которой пользователи могут ввести параметры, такие как `Brand` и `About`, а затем нажать кнопку `Отправить` для их сохранения. + +### Страница конфигурации таблицы + +Конфигурация плагина состоит из набора данных, которые пользователи могут добавлять, удалять или изменять в таблице. Например, см. [Плагин пользователей и прав доступа](/handbook/users). + +![img_v3_02av_11e5f726-f716-4c0f-a244-2b6543b1b5dg](https://static-docs.nocobase.com/img_v3_02av_11e5f726-f716-4c0f-a244-2b6543b1b5dg.jpg) + +Как видно выше, эта страница конфигурации представляет собой таблицу, в которой пользователи могут добавлять, удалять и изменять информацию о пользователях. + +### Страница конфигурации таблицы (несколько форм для добавления записей) + +Конфигурация плагина состоит из набора данных, но для добавления новых записей доступно несколько форм. Например, см. [Плагин менеджера файлов](/handbook/file-manager). + +![img_v3_02av_1d023074-402a-4586-848a-b4abd0ee5d4g](https://static-docs.nocobase.com/img_v3_02av_1d023074-402a-4586-848a-b4abd0ee5d4g.jpg) + +Как показано выше, для добавления новых записей доступно несколько форм, что позволяет пользователям выбирать разные формы для ввода данных. + +### Другие случаи + +Также существуют другие специальные случаи, например, [Плагин редактора тем](/handbook/theme-editor#navigate-to-theme-configuration-page). + +![img_v3_02av_ec2fa97f-2d1a-415c-8106-e3d979740fcg](https://static-docs.nocobase.com/img_v3_02av_ec2fa97f-2d1a-415c-8106-e3d979740fcg.jpg) + +Как видно выше, это изображение показывает интерфейс редактора тем. + +## Примеры + +Для описанных выше сценариев предоставлены следующие примеры: + +- [Страница конфигурации формы](/plugin-samples/plugin-settings/form) +- [Страница конфигурации таблицы](/plugin-samples/plugin-settings/table) +- [Страница конфигурации таблицы (несколько форм для добавления записей)](/plugin-samples/plugin-settings/table-multiple-forms.md) + +Для специальных случаев разработка может быть выполнена в соответствии с конкретными потребностями. + +## Маршруты страниц конфигурации + +Для маршрутизации плагинов обратитесь к: + +- [Страница конфигурации плагина (один маршрут)](/plugin-samples/router/add-setting-page-single-route) +- [Страница конфигурации плагина (вкладки)](/plugin-samples/router/add-setting-page-tabs-routes) +- [Страница конфигурации плагина (разные макеты)](/plugin-samples/router/add-setting-page-layout-routes) + +Этот набор примеров плагинов не углубляется в детали маршрутизации. Заинтересованные могут ознакомиться с соответствующей документацией. diff --git a/docs/ru-RU/plugin-samples/plugin-settings/table-multiple-add-forms.md b/docs/ru-RU/plugin-samples/plugin-settings/table-multiple-add-forms.md new file mode 100644 index 0000000000..ce17f85f68 --- /dev/null +++ b/docs/ru-RU/plugin-samples/plugin-settings/table-multiple-add-forms.md @@ -0,0 +1,4 @@ +# Страница конфигурации таблицы (несколько форм для добавления записей) + +TODO + diff --git a/docs/ru-RU/plugin-samples/plugin-settings/table.md b/docs/ru-RU/plugin-samples/plugin-settings/table.md new file mode 100644 index 0000000000..e1433e4809 --- /dev/null +++ b/docs/ru-RU/plugin-samples/plugin-settings/table.md @@ -0,0 +1,801 @@ +# Страница конфигурации таблицы + +## Описание сценария + +Интерфейс конфигурации состоит из таблицы, которая позволяет добавлять, редактировать и удалять данные. + +## Описание примера + +Предположим, нам нужно создать плагин для уведомлений по электронной почте. Этот плагин может содержать несколько шаблонов, каждый из которых включает информацию, такую как тема письма и его содержимое. Нам нужен интерфейс конфигурации для управления этими шаблонами. + +Полный код примера для этой документации можно найти в репозитории [plugin-samples](https://github.com/nocobase/plugin-samples/tree/main/packages/plugins/%40nocobase-sample/plugin-settings-table). + +## Инициализация плагина + +Следуя инструкциям из [Создание первого плагина](/development/your-first-plugin), если у вас ещё нет проекта, создайте его. Если проект уже существует или вы клонировали исходный код, этот шаг можно пропустить. + +```bash +yarn create nocobase-app my-nocobase-app -d sqlite +cd my-nocobase-app +yarn install +yarn nocobase install +``` + +Далее инициализируйте плагин и добавьте его в систему: + +```bash +yarn pm create @nocobase-sample/plugin-settings-table +yarn pm enable @nocobase-sample/plugin-settings-table +``` + +Затем запустите проект: + +```bash +yarn dev +``` + +После входа в систему перейдите по адресу [http://localhost:13000/admin/pm/list/local/](http://localhost:13000/admin/pm/list/local/), чтобы убедиться, что плагин установлен и активирован. + +## Реализация серверной части + +### 1. Создание таблицы данных + +На серверной стороне основная задача — создание таблицы данных для хранения конфигурационной информации. Для создания таблицы необходимо ознакомиться со следующими концепциями: + +- [Таблицы и поля](/development/server/collections) +- [Создание таблиц](/development/server/collections/configure#defining-tables-in-plugin-code) +- [Типы полей](/development/server/collections/options#field-type) +- [API defineCollection()](/api/database#definecollection) +- [API коллекций](/api/database/collection) + +Для этого примера создайте файл `packages/plugins/@nocobase-sample/plugin-settings-table/src/server/collections/email-templates.ts` со следующим содержимым: + +```ts +import { defineCollection } from '@nocobase/database'; + +export default defineCollection({ + name: 'samplesEmailTemplates', + fields: [ + { + type: 'string', + name: 'subject', + }, + { + type: 'text', + name: 'content', + }, + ], +}); +``` + +Мы создали таблицу данных `samplesEmailTemplates` с двумя полями: `subject` и `content`. В соответствии с потребностями, для `subject` используется поле однострочного текста, а для `content` — поле форматированного текста. + +- Поле `subject` является однострочным текстом, поэтому его тип установлен как `string`. +- Поле `content` является длинным текстом, поэтому его тип установлен как `text`. + +### 2. Применение обновления + +Необходимо обновить базу данных с новой структурой таблицы. Для этого выполните следующую команду: + +```bash +yarn nocobase upgrade +``` + +![img_v3_02av_eb156d0e-9f25-4702-a5de-2bfa5cde84bg](https://static-docs.nocobase.com/img_v3_02av_eb156d0e-9f25-4702-a5de-2bfa5cde84bg.jpg) + +## Реализация клиентской части + +### 1. Создание страницы конфигурации плагина + +В разделе [Добавление страницы конфигурации плагина (один маршрут)](/plugin-samples/router/add-setting-page-single-route) мы подробно описали этот процесс, поэтому здесь не будем его повторять. + +Измените файл `packages/plugins/@nocobase-sample/plugin-settings-table/src/client/index.tsx` следующим образом: + +```tsx | pure +import { Plugin } from '@nocobase/client'; +// @ts-ignore +import { name } from '../../package.json'; + +export class PluginSettingsTableClient extends Plugin { + async load() { + this.app.pluginSettingsManager.add(name, { + title: 'Таблица настроек плагина', + icon: 'TableOutlined', + Component: () => 'TODO', + }); + } +} + +export default PluginSettingsTableClient; +``` + +Затем перейдите по адресу [http://localhost:13000/admin/settings/@nocobase-sample/plugin-settings-table](http://localhost:13000/admin/settings/@nocobase-sample/plugin-settings-table), чтобы увидеть страницу конфигурации. + +![img_v3_02av_c610403d-95d8-466a-a3d1-cfcab232057g](https://static-docs.nocobase.com/img_v3_02av_c610403d-95d8-466a-a3d1-cfcab232057g.jpg) + +### 2. Определение структуры таблицы данных + +Используя подход на основе схемы, сначала нужно определить структуру таблицы данных. Для определения структуры таблицы на клиентской стороне необходимо изучить следующие концепции: + +- [Таблицы и поля](/development/server/collections#field-component) +- [Типы полей](/development/server/collections/options#field-type) +- [Интерфейс поля](/development/server/collections/options#field-interface) +- [Протокол UI Schema](/development/client/ui-schema/what-is-ui-schema) +- [Компоненты полей](https://client.docs.nocobase.com/components) + +Создайте файл `packages/plugins/@nocobase-sample/plugin-settings-table/src/client/PluginSettingsTable.tsx` со следующим содержимым: + +```ts +const emailTemplatesCollection = { + name: 'samplesEmailTemplates', + filterTargetKey: 'id', + fields: [ + { + type: 'string', + name: 'subject', + interface: 'input', + uiSchema: { + title: 'Тема', + required: true, + 'x-component': 'Input', + }, + }, + { + type: 'text', + name: 'content', + interface: 'richText', + uiSchema: { + title: 'Содержимое', + required: true, + 'x-component': 'RichText', + }, + }, + ], +}; +``` + +Мы определили таблицу данных `samplesEmailTemplates` с двумя полями: `subject` и `content`. Поля описаны следующим образом: + +- `type`: Значение должно соответствовать типу поля таблицы данных на серверной стороне. +- `name`: Имя поля, должно совпадать с именем поля на серверной стороне. +- `interface`: + - Поле `subject`: Однострочный текст, поэтому значение `input`. + - Поле `content`: Форматированный текст, поэтому значение `richText`. +- `uiSchema`: Определяет рендеринг элементов формы на клиентской стороне. + - `type`: Для однострочного и форматированного текста используется тип `string`. + - `title`: Заголовок элемента формы. + - `required`: Обязательное поле, поэтому значение `true`. + - `x-component`: + - Поле `subject`: Используется компонент [Input](https://client.docs.nocobase.com/components/input). + - Поле `content`: Используется компонент [RichText](https://client.docs.nocobase.com/components/rich-text). + +### 3. Создание схемы таблицы + +Для создания схемы формы необходимы следующие знания: + +- [Компонент таблицы](https://client.docs.nocobase.com/components/table-v2) +- [Компонент CollectionField](https://client.docs.nocobase.com/core/data-source/collection-field) +- [Компонент CardItem](https://client.docs.nocobase.com/components/card-item) +- [Протокол схемы](/development/client/ui-schema/what-is-ui-schema) +- [Компонент DataBlockProvider](https://client.docs.nocobase.com/core/data-block/data-block-provider) + +Мы ссылаемся на пример [Расширение таблицы коллекции](https://client.docs.nocobase.com/components/table-v2#extends-collection) и продолжаем изменять файл `packages/plugins/@nocobase-sample/plugin-settings-table/src/client/PluginSettingsTable.tsx`: + +```tsx | pure +import { ISchema } from '@nocobase/client'; +import { uid } from '@formily/shared' + +const schema: ISchema = { + type: 'void', + name: uid(), + 'x-component': 'CardItem', + 'x-decorator': 'TableBlockProvider', + 'x-decorator-props': { + collection: emailTemplatesCollection.name, + action: 'list', + showIndex: true, + dragSort: false, + }, + properties: { + table: { + type: 'array', + 'x-component': 'TableV2', + 'x-use-component-props': 'useTableBlockProps', + 'x-component-props': { + rowKey: 'id', + rowSelection: { + type: 'checkbox', + }, + }, + properties: { + subject: { + type: 'void', + title: 'Тема', + 'x-component': 'TableV2.Column', + properties: { + subject: { + type: 'string', + 'x-component': 'CollectionField', + 'x-pattern': 'readPretty', + }, + }, + }, + content: { + type: 'void', + title: 'Содержимое', + 'x-component': 'TableV2.Column', + properties: { + content: { + type: 'string', + 'x-component': 'CollectionField', + 'x-pattern': 'readPretty', + }, + }, + }, + }, + }, + }, +} +``` + +- [CardItem](https://client.docs.nocobase.com/components/card-item): Компонент карты, обеспечивающий отображение в стиле карточки. +- [DataBlockProvider](https://client.docs.nocobase.com/core/data-block/data-block-provider): Компонент блока данных, предоставляющий данные дочерним узлам. Поскольку это форма, запрашивающая данные одной строки, мы указываем свойства `collection` и `action`. +- [TableV2](https://client.docs.nocobase.com/components/table-v2): Компонент таблицы для рендеринга форм. +- `useTableBlockProps`: Используется для получения свойств блока данных и передачи их компоненту TableV2, обычно без изменений. +- `TableV2.Column`: Компонент столбца таблицы для рендеринга столбцов. +- [CollectionField](https://client.docs.nocobase.com/core/data-source/collection-field): Компонент поля таблицы данных, используемый для чтения `UI Schema` из коллекции и её рендеринга. + +### 4. Создание компонента таблицы + +Для рендеринга схемы в компонент необходимо понимать следующее: + +- Компонент [ExtendCollectionsProvider](https://client.docs.nocobase.com/core/data-source/extend-collections-provider) для расширения таблиц данных. +- Компонент [SchemaComponent](https://client.docs.nocobase.com/core/ui-schema/schema-component) для рендеринга форм. + +Продолжите добавлять в файл `packages/plugins/@nocobase-sample/plugin-settings-table/src/client/PluginSettingsTable.tsx`: + +```tsx | pure +import React from 'react'; +import { ExtendCollectionsProvider, SchemaComponent } from '@nocobase/client'; +export const PluginSettingsTable = () => { + return ( + <ExtendCollectionsProvider collections={[emailTemplatesCollection]}> + <SchemaComponent schema={schema} scope={{ useFormBlockProps, useSubmitActionProps }} /> + </ExtendCollectionsProvider> + ); +}; +``` + +### 5. Регистрация страницы конфигурации плагина + +Измените файл `packages/plugins/@nocobase-sample/plugin-settings-table/src/client/index.tsx` следующим образом: + +```diff +import { Plugin } from '@nocobase/client'; +// @ts-ignore +import { name } from '../../package.json'; ++ import { PluginSettingsTable } from './PluginSettingsTable' + +export class PluginSettingsTableClient extends Plugin { + async load() { + this.app.pluginSettingsManager.add(name, { + title: 'Таблица настроек плагина', + icon: 'TableOutlined', +- Component: () => 'TODO', ++ Component: PluginSettingsTable, + }); + } +} + +export default PluginSettingsTableClient; +``` + +Затем перейдите по адресу [http://localhost:13000/admin/settings/@nocobase-sample/plugin-settings-table](http://localhost:13000/admin/settings/@nocobase-sample/plugin-settings-table), чтобы увидеть страницу конфигурации. + +![img_v3_02av_97fd272d-1333-4faf-9ce1-6363c6a049dg](https://static-docs.nocobase.com/img_v3_02av_97fd272d-1333-4faf-9ce1-6363c6a049dg.jpg) + +### 6. Реализация функции «Добавить новую запись» + +На данный момент наша таблица не содержит данных, поэтому нужно добавить функцию «Добавить новую запись». Для этого обратитесь к следующей документации: + +- Компонент таблицы [Пример с ActionToolbar](https://client.docs.nocobase.com/components/table-v2) +- [Компонент формы](https://client.docs.nocobase.com/components/form-v2) +- [Компонент действия](https://client.docs.nocobase.com/components/action) + +Продолжите редактировать файл `packages/plugins/@nocobase-sample/plugin-settings-table/src/client/PluginSettingsTable.tsx`: + +```tsx | pure +import React from 'react'; +import { ISchema, useActionContext, useDataBlockRequest, useDataBlockResource } from '@nocobase/client'; +import { App as AntdApp } from 'antd'; +import { useForm } from '@formily/react'; + +const schema: ISchema = { + // ... + properties: { + actions: { + type: 'void', + 'x-component': 'ActionBar', + 'x-component-props': { + style: { + marginBottom: 20, + }, + }, + properties: { + add: { + type: 'void', + 'x-component': 'Action', + title: 'Добавить новую', + 'x-align': 'right', + 'x-component-props': { + type: 'primary', + }, + properties: { + drawer: { + type: 'void', + 'x-component': 'Action.Drawer', + title: 'Добавить новую', + properties: { + form: { + type: 'void', + 'x-component': 'FormV2', + properties: { + subject: { + 'x-decorator': 'FormItem', + 'x-component': 'CollectionField', + }, + content: { + 'x-decorator': 'FormItem', + 'x-component': 'CollectionField', + }, + footer: { + type: 'void', + 'x-component': 'Action.Drawer.Footer', + properties: { + submit: { + title: 'Отправить', + 'x-component': 'Action', + 'x-use-component-props': 'useSubmitActionProps', + }, + } + } + }, + }, + }, + }, + }, + }, + } + }, + + table: { + // ... + } + } +} + +const useSubmitActionProps = () => { + const { setVisible } = useActionContext(); + const { message } = AntdApp.useApp(); + const form = useForm(); + const resource = useDataBlockResource(); + const { runAsync } = useDataBlockRequest(); + + return { + type: 'primary', + async onClick() { + await form.submit(); + const values = form.values; + await resource.create({ values }) + await runAsync() + message.success('Успешно сохранено'); + setVisible(false); + }, + }; +}; +``` + +В данном контексте: + +- [ActionBar](https://client.docs.nocobase.com/components/action#actionbar): Обеспечивает компоновку для кнопок действий. +- [Action](https://client.docs.nocobase.com/components/action): Кнопка «Добавить новую». +- [Action.Drawer](https://client.docs.nocobase.com/components/action#actiondrawer): Открывает модальное окно при нажатии. +- [FormV2](https://client.docs.nocobase.com/components/form-v2): Компонент формы. +- [FormItem](https://client.docs.nocobase.com/components/form-v2#formitem): Компонент элемента формы. +- [Action.Drawer.Footer](https://client.docs.nocobase.com/components/action#actiondrawerfooter): Нижняя часть модального окна. +- [useSubmitActionProps](https://client.docs.nocobase.com/core/data-block/use-data-block-request#use-submit-action-props): Используется для отправки формы. + - `useActionContext()`: Получает контекст действия. + - [useDataBlockResource()](https://client.docs.nocobase.com/core/data-block/data-block-resource-provider): Получает `resource`, предоставляемый `TableBlockProvider`, для операций CRUD. + - [useDataBlockRequest()](https://client.docs.nocobase.com/core/data-block/data-block-request-provider): Объект запроса для блока таблицы; вызов `runAsync` обновляет данные таблицы. + +Далее добавьте `useSubmitActionProps` в контекст: + +```diff +export const PluginSettingsTable = () => { + return ( + <ExtendCollectionsProvider collections={[emailTemplatesCollection]}> +- <SchemaComponent schema={schema} /> ++ <SchemaComponent schema={schema} scope={{ useSubmitActionProps }} /> + </ExtendCollectionsProvider> + ); +}; +``` + +<video width="100%" controls> + <source src="https://static-docs.nocobase.com/20240517-190400.mp4" type="video/mp4"> +</video> + +### 7. Реализация функции редактирования + +Функция редактирования похожа на функцию «Добавить новую», но нужно добавить кнопку редактирования в таблице и изменять данные через модальное окно. Для реализации функции редактирования обратитесь к следующей документации: + +- Компонент таблицы [Просмотр или редактирование записи](https://client.docs.nocobase.com/components/table-v2#view-or-edit-record) +- Компонент формы [Значения по умолчанию](https://client.docs.nocobase.com/components/form-v2#default-values) +- [useCollectionRecord()](https://client.docs.nocobase.com/core/data-block/collection-record-provider): Используется для получения данных текущей строки. + +Продолжите редактировать файл `packages/plugins/@nocobase-sample/plugin-settings-table/src/client/PluginSettingsTable.tsx`: + +```tsx | pure +import { useCollectionRecordData } from '@nocobase/client'; +import { useMemo } from 'react'; + +const useEditFormProps = () => { + const recordData = useCollectionRecordData(); + const form = useMemo( + () => + createForm({ + values: recordData, + }), + [], + ); + + return { + form, + }; +} + +const schema: ISchema = { + // ... + properties: { + // ... + table: { + // ... + properties: { + // ... + actions: { + type: 'void', + title: 'Действия', + 'x-component': 'TableV2.Column', + properties: { + actions: { + type: 'void', + 'x-component': 'Space', + 'x-component-props': { + split: '|', + }, + properties: { + edit: { + type: 'void', + title: 'Редактировать', + 'x-component': 'Action.Link', + 'x-component-props': { + openMode: 'drawer', + icon: 'EditOutlined', + }, + properties: { + drawer: { + type: 'void', + title: 'Редактировать', + 'x-component': 'Action.Drawer', + properties: { + form: { + type: 'void', + 'x-component': 'FormV2', + 'x-use-component-props': 'useEditFormProps', + properties: { + subject: { + 'x-decorator': 'FormItem', + 'x-component': 'CollectionField', + }, + content: { + 'x-decorator': 'FormItem', + 'x-component': 'CollectionField', + }, + footer: { + type: 'void', + 'x-component': 'Action.Drawer.Footer', + properties: { + submit: { + title: 'Отправить', + 'x-component': 'Action', + 'x-use-component-props': 'useSubmitActionProps', + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + } + }, + } + } + } + } +} +``` + +`Table` передаёт данные каждой строки дочерним узлам через [CollectionRecordProvider](https://client.docs.nocobase.com/core/data-block/collection-record-provider). + +В `useEditFormProps` мы используем `useCollectionRecordData()` для получения данных текущей строки, затем создаём форму с помощью `createForm`, передавая данные текущей строки в качестве значений по умолчанию. + +Далее измените логику `useSubmitActionProps()` для поддержки как создания, так и редактирования: + +```diff +const useSubmitActionProps = () => { + // ... ++ const collection = useCollection(); + return { + type: 'primary', + async onClick() { + await form.submit(); + const values = form.values; +- await resource.create({ values }) ++ if (values[collection.filterTargetKey]) { ++ await resource.update({ ++ values, ++ filterByTk: values[collection.filterTargetKey], ++ }); ++ } else { ++ await resource.create({ ++ values, ++ }); ++ } + // ... + }, + }; +}; +``` + +- [useCollection](https://client.docs.nocobase.com/core/data-source/collection-provider#usecollection): Объект таблицы данных, предоставляемый DataBlockProvider. + +Наконец, зарегистрируйте `useEditFormProps` в контексте: + +```diff +export const PluginSettingsTable = () => { + return ( + <ExtendCollectionsProvider collections={[emailTemplatesCollection]}> +- <SchemaComponent schema={schema} scope={{ useSubmitActionProps }} /> ++ <SchemaComponent schema={schema} scope={{ useSubmitActionProps, useEditFormProps }} /> + </ExtendCollectionsProvider> + ); +}; +``` + +<video width="100%" controls> + <source src="https://static-docs.nocobase.com/20240517-190849.mp4" type="video/mp4"> +</video> + +### 8. Реализация функции удаления + +Функция удаления относительно проста. Нужно добавить кнопку «Удалить» в столбец действий, и при её нажатии вызвать `resource.destroy()`, а затем обновить данные таблицы. + +- Действие [Confirm](https://client.docs.nocobase.com/components/action#confirm) + +Продолжите добавлять в файл `packages/plugins/@nocobase-sample/plugin-settings-table/src/client/PluginSettingsTable.tsx`: + +```ts +import { ActionProps } from '@nocobase/client'; + +function useDeleteActionProps(): ActionProps { + const { message } = AntdApp.useApp(); + const record = useCollectionRecordData(); + const resource = useDataBlockResource(); + const collection = useCollection(); + const { runAsync } = useDataBlockRequest(); + return { + confirm: { + title: 'Удалить', + content: 'Вы уверены, что хотите удалить?', + }, + async onClick() { + await resource.destroy({ + filterByTk: record[collection.filterTargetKey] + }); + await runAsync(); + message.success('Удалено!'); + }, + }; +} + +const schema: ISchema = { + // ... + properties: { + // ... + table: { + // ... + properties: { + // ... + actions: { + // ... + properties: { + // ... + delete: { + type: 'void', + title: 'Удалить', + 'x-component': 'Action.Link', + 'x-use-component-props': 'useDeleteActionProps', + } + } + } + } + } + } +} +``` + +Затем зарегистрируйте `useDeleteActionProps` в контексте: + +```diff +export const PluginSettingsTable = () => { + return ( + <ExtendCollectionsProvider collections={[emailTemplatesCollection]}> +- <SchemaComponent schema={schema} scope={{ useSubmitActionProps, useEditFormProps }} /> ++ <SchemaComponent schema={schema} scope={{ useSubmitActionProps, useEditFormProps, useDeleteActionProps }} /> + </ExtendCollectionsProvider> + ); +}; +``` + +<video width="100%" controls> + <source src="https://static-docs.nocobase.com/20240517-191110.mp4" type="video/mp4"> +</video> + +### 9. Использование данных конфигурации на странице + +Существует два сценария использования данных формы: использование внутри страницы и глобальное использование. Разница между ними: + +- **Глобальное использование**: При обновлении данных формы их нужно синхронизировать с глобальным состоянием для обновления в реальном времени. +- **Использование внутри страницы**: Поскольку страница автоматически уничтожается и создаётся при навигации, синхронизация данных не требуется. + +На этом этапе мы рассмотрим использование данных формы внутри страницы. + +Создайте файл `packages/plugins/@nocobase-sample/plugin-settings-table/src/client/PluginSettingsTablePage.tsx` со следующим содержимым: + +```tsx | pure +import { useRequest } from '@nocobase/client'; +import React from 'react'; + +export const PluginSettingsTablePage = () => { + const { data, loading } = useRequest<{ data?: any[] }>({ + url: 'samplesEmailTemplates:list', + }); + + if (loading) return null; + + return <pre>{JSON.stringify(data?.data, null, 2)}</pre> +} +``` + +Затем импортируйте компонент `PluginSettingsTablePage` в компонент `PluginSettingsTable`: + +```tsx | pure +import { PluginSettingsTablePage } from './PluginSettingsTablePage' +// ... + +export class PluginSettingsTableClient extends Plugin { + async load() { + // ... + + this.app.router.add(`admin.${name}-page`, { + path: '/admin/plugin-settings-table-page', + Component: PluginSettingsTablePage, + }) + } +} +``` + +После этого перейдите по адресу [http://localhost:13000/admin/plugin-settings-table-page](http://localhost:13000/admin/plugin-settings-table-page), чтобы увидеть данные формы. + +![img_v3_02av_753dd9f1-9e8c-43c5-a1c6-1fb217844cag](https://static-docs.nocobase.com/img_v3_02av_753dd9f1-9e8c-43c5-a1c6-1fb217844cag.jpg) + +### 10. Глобальное использование данных конфигурации + +Для глобального использования и обновления в реальном времени необходимо использовать `Context` вместе с возможностями [Provider](/development/client/providers) NocoBase. + +Создайте файл `packages/plugins/@nocobase-sample/plugin-settings-table/src/client/PluginSettingsTableProvider.tsx` со следующим содержимым: + +```tsx | pure +import React, { createContext, FC } from 'react'; +import { useRequest, UseRequestResult } from '@nocobase/client'; + +const PluginSettingsTableContext = createContext<UseRequestResult<{ data?: any[] }>>(null as any); + +export const PluginSettingsTableProvider: FC<{ children: React.ReactNode }> = ({children}) => { + const request = useRequest<{ data?: any[] }>({ + url: 'samplesEmailTemplates:list', + }); + + console.log('PluginSettingsTableProvider', request.data?.data); + + return <PluginSettingsTableContext.Provider value={request}>{children}</PluginSettingsTableContext.Provider>; +} + +export const usePluginSettingsTableRequest = () => { + return React.useContext(PluginSettingsTableContext); +}; +``` + +Затем измените файл `packages/plugins/@nocobase-sample/plugin-settings-table/src/client/index.tsx`, чтобы зарегистрировать его глобально: + +```ts +import { PluginSettingsTableProvider } from './PluginSettingsTableProvider' +// ... + +export class PluginSettingsTableClient extends Plugin { + async load() { + // ... + this.app.addProvider(PluginSettingsTableProvider) + } +} +``` + +После обновления формы необходимо повторно загрузить глобальные данные. Измените файл `packages/plugins/@nocobase-sample/plugin-settings-table/src/client/PluginSettingsTable.tsx`: + +```diff +import { usePluginSettingsTableRequest } from './PluginSettingsTableProvider'; + +// ... + +const useSubmitActionProps = (): ActionProps => { + // ... ++ const globalSettingsTableRequest = usePluginSettingsTableRequest(); + return { + type: 'primary', + htmlType: 'submit', + async onClick() { + // ... ++ await globalSettingsTableRequest.runAsync(); + message.success('Успешно сохранено!'); + }, + }; +}; + +function useDeleteActionProps(): ActionProps { ++ const globalSettingsTableRequest = usePluginSettingsTableRequest(); + + return { + // ... + async onClick() { + // ... ++ await globalSettingsTableRequest.runAsync(); + message.success('Удалено!'); + } + } +} +``` + +<video width="100%" controls> + <source src="https://static-docs.nocobase.com/20240517-191452.mp4" type="video/mp4"> +</video> + +### Упаковка и загрузка в продакшен + +Следуя документации [Сборка и упаковка плагина](/development/your-fisrt-plugin#build-and-package-plugin), вы можете упаковать плагин и загрузить его в продакшен. + +Если вы клонировали исходный код, сначала выполните полную сборку, чтобы убедиться, что зависимости плагина собраны правильно: + +```bash +yarn build +``` + +Если проект был создан с помощью `create-nocobase-app`, выполните: + +```bash +yarn build @nocobase-sample/plugin-settings-table --tar +``` + +Это создаст файл `storage/tar/@nocobase-sample/plugin-settings-table.tar.gz`, который можно установить через [метод загрузки](/welcome/getting-started/plugin). diff --git a/docs/ru-RU/plugin-samples/provider/content.md b/docs/ru-RU/plugin-samples/provider/content.md new file mode 100644 index 0000000000..ad1cac253b --- /dev/null +++ b/docs/ru-RU/plugin-samples/provider/content.md @@ -0,0 +1,125 @@ +# Отображение глобального контента + +Мы можем отображать глобальный контент с помощью компонента `Provider`. + +## Описание примера + +Требуется реализовать функцию отображения объявлений. Если сервер возвращает информацию об объявлении, оно будет отображаться в верхней части страницы. + +Полный код примера доступен в репозитории [plugin-samples](https://github.com/nocobase/plugin-samples/tree/main/packages/plugins/%40nocobase-sample/plugin-provider-content). + +![img_v3_02av_cd3c7f37-0c5b-4c9c-b10e-e413af409ccg](https://static-docs.nocobase.com/img_v3_02av_cd3c7f37-0c5b-4c9c-b10e-e413af409ccg.jpg) + +## Инициализация плагина + +Следуйте инструкциям из руководства [Создание первого плагина](/development/your-fisrt-plugin). Если у вас ещё нет проекта, создайте его. Если проект уже создан или вы клонировали исходный код, этот шаг можно пропустить. + +```bash +yarn create nocobase-app my-nocobase-app -d sqlite +cd my-nocobase-app +yarn install +yarn nocobase install +``` + +Далее инициализируйте плагин и добавьте его в систему: + +```bash +yarn pm create @nocobase-sample/plugin-provider-content +yarn pm enable @nocobase-sample/plugin-provider-content +``` + +Запустите проект: + +```bash +yarn dev +``` + +После входа в систему перейдите по адресу [http://localhost:13000/admin/pm/list/local/](http://localhost:13000/admin/pm/list/local/), чтобы убедиться, что плагин установлен и активирован. + +## Реализация функционала + +### 1. Добавление компонента `Provider` + +Компонент `Provider` — это обычный React-компонент, но важно не забыть отобразить `children` внутри него. + +Создайте новый файл по пути `packages/plugins/@nocobase-sample/plugin-provider-content/src/client/TopAnnouncement.tsx`: + +```tsx | pure +import React, { FC, ReactNode } from 'react'; +import { Alert, Affix, AlertProps } from 'antd'; +import { useRequest } from '@nocobase/client'; + +const mockRequest = () => new Promise((resolve) => { + Math.random() > 0.5 ? + resolve({ data: { message: 'Это важное сообщение.', type: 'info' } }) : + resolve({ data: undefined }) +}) + +export const TopAnnouncement: FC<{ children: ReactNode }> = ({ children }) => { + const { data, loading } = useRequest<{ data: { message: string; type: AlertProps['type'] } }>(mockRequest) + + const onClose = () => { + console.log('onClose') + } + + return ( + <> + { + !loading && !!data.data && <Affix offsetTop={0} style={{ zIndex: 1010 }}> + <Alert + message={data.data.message} + type={data.data.type} + style={{ borderRadius: 0, borderLeft: 'none', borderRight: 'none' }} + closable + onClose={onClose} + /> + </Affix> + } + {children} + </> + ); +}; +``` + +Для конфигурации и данных объявлений обратитесь к странице [Конфигурация формы плагина](/plugin-samples/plugin-settings/form). В данном примере используются моковые (тестовые) данные. + +Не забудьте отобразить `children` внутри компонента. + +### 2. Регистрация в системе + +Измените файл `packages/plugins/@nocobase-sample/plugin-provider-content/src/index.ts`, чтобы зарегистрировать компонент `TopAnnouncement` в системе. + +```tsx | pure +import { Plugin } from '@nocobase/client'; +import { TopAnnouncement } from './TopAnnouncement'; + +export class PluginProviderContentClient extends Plugin { + async load() { + this.app.addProvider(TopAnnouncement) + } +} + +export default PluginProviderContentClient; +``` + +Теперь перейдите по адресу [http://localhost:13000](http://localhost:13000), и вы увидите объявление, отображаемое в верхней части страницы. + +![img_v3_02av_cd3c7f37-0c5b-4c9c-b10e-e413af409ccg](https://static-docs.nocobase.com/img_v3_02av_cd3c7f37-0c5b-4c9c-b10e-e413af409ccg.jpg) + +## Сборка и развертывание в продакшен + +Следуйте инструкциям из документа [Сборка и упаковка плагина](/development/your-fisrt-plugin#构建并打包插件), чтобы упаковать плагин и загрузить его в продакшен. + +Если вы клонировали исходный код, сначала выполните полную сборку, чтобы упаковать зависимости плагина: + +```bash +yarn build +``` + +Если вы создали проект с помощью `create-nocobase-app`, выполните: + +```bash +yarn build @nocobase-sample/plugin-provider-content --tar +``` + +После этого появится файл `storage/tar/@nocobase-sample/plugin-provider-content.tar.gz`, который можно установить, следуя процессу [загрузки плагина](/welcome/getting-started/plugin). diff --git a/docs/ru-RU/plugin-samples/provider/context.md b/docs/ru-RU/plugin-samples/provider/context.md new file mode 100644 index 0000000000..cb3528be6d --- /dev/null +++ b/docs/ru-RU/plugin-samples/provider/context.md @@ -0,0 +1,171 @@ +# Глобальный контекст + +Во многих случаях требуется хранить данные в глобальном контексте, чтобы к ним можно было получить доступ из любого места, например, для управления темами, правами доступа и другими функциями. + +## Обзор примера + +Необходимо реализовать плагин для управления переключением функций (feature toggle), чтобы включать или отключать определённые возможности. + +Полный пример кода для этой документации доступен в репозитории [plugin-samples](https://github.com/nocobase/plugin-samples/tree/main/packages/plugins/%40nocobase-sample/plugin-provider-context). + +## Инициализация плагина + +Следуя инструкциям из раздела [Создание первого плагина](/development/your-first-plugin), создайте новый проект, если у вас его ещё нет. Если проект уже создан или вы клонировали исходный код, этот шаг можно пропустить. + +```bash +yarn create nocobase-app my-nocobase-app -d sqlite +cd my-nocobase-app +yarn install +yarn nocobase install +``` + +Далее инициализируйте плагин и добавьте его в систему: + +```bash +yarn pm create @nocobase-sample/plugin-provider-context +yarn pm enable @nocobase-sample/plugin-provider-context +``` + +Запустите проект: + +```bash +yarn dev +``` + +После входа в систему вы можете перейти по адресу [http://localhost:13000/admin/pm/list/local/](http://localhost:13000/admin/pm/list/local/), чтобы убедиться, что плагин установлен и активирован. + +## Реализация функционала + +Для реализации глобального контекста используется API контекста React (`Context`). + +### 1. Создание контекста + +```tsx | pure +import { useRequest } from '@nocobase/client'; +import { Spin } from 'antd'; +import React, { FC, createContext, ReactNode } from 'react'; + +const FeaturesContext = createContext<Record<string, boolean>>({}); + +const mockRequest = () => new Promise((resolve) => { + resolve({ data: { feature1: true, feature2: false } }) +}) + +export const FeaturesProvider: FC<{ children: ReactNode }> = ({ children }) => { + const { loading, data } = useRequest<{ data: Record<string, boolean> }>(mockRequest); + + if (loading) return <Spin />; + + return <FeaturesContext.Provider value={data.data}>{children}</FeaturesContext.Provider>; +}; + +export const useFeatures = () => React.useContext(FeaturesContext); + +export const useFeature = (feature: string) => { + const features = useFeatures(); + return features[feature]; +} +``` + +Не забудьте отобразить компонент `children`. + +Для конфигурации и данных, связанных с `features`, обратитесь к примеру использования на странице [Конфигурация формы плагина](/plugin-samples/plugin-settings/form). В данном случае используются моковые (тестовые) данные. + +### 2. Регистрация плагина в системе + +Измените файл `packages/plugins/@nocobase-sample/plugin-provider-context/src/index.ts`, чтобы зарегистрировать компонент `FeaturesProvider` в системе. + +```tsx | pure +import { Plugin } from '@nocobase/client'; +import { FeaturesProvider } from './FeaturesProvider'; + +export class PluginProviderContextClient extends Plugin { + async load() { + this.app.addProvider(FeaturesProvider) + } +} + +export default PluginProviderContextClient; +``` + +### 3. Доступ к данным контекста + +Для доступа к данным контекста используйте методы `useFeatures` и `useFeature`. + +Существует два сценария: использование внутри текущего плагина и в других плагинах. + +#### 3.1 Использование внутри текущего плагина + +Измените файл `packages/plugins/@nocobase-sample/plugin-provider-context/src/index.ts`, чтобы добавить тестовую страницу для проверки данных контекста. + +```tsx | pure +import React from 'react'; +import { Plugin } from '@nocobase/client'; + +import { FeaturesProvider, useFeature } from './FeaturesProvider'; + +const TestPage = () => { + const feature1 = useFeature('feature1'); + const feature2 = useFeature('feature2'); + + return ( + <div> + <h1>Функция 1: {feature1 ? 'Включена' : 'Отключена'}</h1> + <h1>Функция 2: {feature2 ? 'Включена' : 'Отключена'}</h1> + </div> + ); +}; + +export class PluginProviderContextClient extends Plugin { + async load() { + this.app.addProvider(FeaturesProvider) + + this.app.router.add(`admin.features-test`, { + path: '/admin/features-test', + Component: TestPage, + }) + } +} + +export default PluginProviderContextClient; +``` + +Теперь перейдите по адресу [http://localhost:13000/admin/features-test](http://localhost:13000/admin/features-test), чтобы увидеть данные контекста. + +![img_v3_02av_51b7cb08-1b42-42f4-b553-49b4e3f217bg](https://static-docs.nocobase.com/img_v3_02av_51b7cb08-1b42-42f4-b553-49b4e3f217bg.jpg) + +#### 3.2 Использование в других плагинах + +Если контекст нужно использовать в других плагинах, экспортируйте методы `useFeatures` и `useFeature`. + +Измените файл `packages/plugins/@nocobase-sample/plugin-provider-context/src/index.ts`: + +```tsx | pure +export { useFeatures, useFeature } from './FeaturesProvider'; +``` + +Затем вы можете использовать методы `useFeatures` и `useFeature` следующим образом: + +```tsx | pure +import { useFeature } from '@nocobase-sample/plugin-provider-context/client'; +``` + +Обратите внимание, что путь импорта должен быть `'@nocobase-sample/plugin-provider-context/client'`, а не `'@nocobase-sample/plugin-provider-context'`. + +## Сборка и развертывание в продакшен + +Следуя руководству [Сборка и упаковка плагина](/development/your-first-plugin#build-and-package-plugin), вы можете упаковать плагин и загрузить его в продакшен. + +Если вы клонировали исходный код, потребуется выполнить полную сборку, чтобы включить зависимости плагина. + +```bash +yarn build +``` + +Если проект был создан с помощью `create-nocobase-app`, просто выполните: + +```bash +yarn build @nocobase-sample/plugin-provider-context --tar +``` + +Это создаст файл `storage/tar/@nocobase-sample/plugin-provider-context.tar.gz`, который затем можно установить, следуя процессу [загрузки плагина](/welcome/getting-started/plugin). diff --git a/docs/ru-RU/plugin-samples/provider/index.md b/docs/ru-RU/plugin-samples/provider/index.md new file mode 100644 index 0000000000..2f94677e72 --- /dev/null +++ b/docs/ru-RU/plugin-samples/provider/index.md @@ -0,0 +1,12 @@ +## Провайдер + +Согласно [Руководству по провайдеру](/development/client/providers), у Провайдера есть три основные функции: + +- Обеспечение глобального общего контекста +- Отображение глобального контента +- Перехват и рендеринг на основе условий + +Для этих функций мы предлагаем следующие примеры: + +- [Отображение глобального контента](/plugin-samples/provider/content) +- [Глобальный контекст](/plugin-samples/provider/context) diff --git a/docs/ru-RU/plugin-samples/router/add-page/index.md b/docs/ru-RU/plugin-samples/router/add-page/index.md new file mode 100644 index 0000000000..5346de1f80 --- /dev/null +++ b/docs/ru-RU/plugin-samples/router/add-page/index.md @@ -0,0 +1,222 @@ +# Добавление страницы + +## Описание + +Добавление страниц для персонализированного отображения. + +## Описание примера + +В этом примере будут добавлены 4 страницы: + +- `/about`: Страница "О нас", предназначенная для отображения информации о системе, доступна без входа в систему. +- `/admin/data-view`: Страница дашборда данных, требует входа в систему. +- `/admin/material-manage`: Центр управления материалами, включающий управление изображениями и видео, является родительской страницей маршрута. + - `/admin/material-manage/image`: Управление изображениями. + - `/admin/material-manage/video`: Управление видео. + +Однако разработка содержимого страниц будет минимальной и предназначена только для демонстрации. + +Полный код примера доступен в репозитории [plugin-samples](https://github.com/nocobase/plugin-samples/tree/main/packages/plugins/%40nocobase-sample/plugin-add-page). + +## Инициализация плагина + +Следуйте инструкциям из документации [Создание первого плагина](/development/your-fisrt-plugin). Если у вас нет проекта, создайте его. Если проект уже существует или вы клонировали исходный код, пропустите этот шаг. + +```bash +yarn create nocobase-app my-nocobase-app -d sqlite +cd my-nocobase-app +yarn install +yarn nocobase install +``` + +Инициализируйте плагин и добавьте его в систему: + +```bash +yarn pm create @nocobase-sample/plugin-add-page +yarn pm enable @nocobase-sample/plugin-add-page +``` + +Запустите проект: + +```bash +yarn dev +``` + +После входа в систему перейдите по адресу [http://localhost:13000/admin/pm/list/local/](http://localhost:13000/admin/pm/list/local/), чтобы убедиться, что плагин установлен и активирован. + +## Реализация функциональности + +### 1. Добавление страницы `/about` + +Согласно документации [Маршрутизация и расширение страниц](/development/client/router), необходимо обновить файл `packages/plugins/@nocobase-sample/plugin-add-page/src/client/index.tsx`: + +```ts +import React, { useEffect } from 'react'; +import { Plugin, useDocumentTitle } from '@nocobase/client'; + +const AboutPage = () => { + const { setTitle } = useDocumentTitle(); + + useEffect(() => { + setTitle('About'); + }, []) + + return <div>About Page</div>; +} + +export class PluginAddPageClient extends Plugin { + async load() { + this.app.router.add('about', { + path: '/about', + Component: AboutPage, + }) + } +} + +export default PluginAddPageClient; +``` + +Функция `router.add()` принимает два параметра. Первый параметр — это имя страницы, используемое для операций CRUD и иерархического вложения. Второй параметр — конфигурация страницы, где `path` — это путь страницы, а `Component` — компонент страницы. + +`useDocumentTitle()` используется для изменения заголовка страницы. + +При посещении [http://localhost:13000/about](http://localhost:13000/about) отобразится страница с текстом "About Page". + +![20240512200508](https://static-docs.nocobase.com/20240512200508.png) + +### 2. Добавление страницы `/admin/data-view` + +Согласно документации [Существующие маршруты страниц](/development/client/router#existing-page-routes), известно, что `/admin/*` соответствует имени `admin`. Чтобы добавить новую страницу под этим маршрутом, можно использовать префикс `admin.`, например `admin.dataView`. + +```tsx | pure +// ... +const DataViewPage = () => { + const { setTitle } = useDocumentTitle(); + + useEffect(() => { + setTitle('DataView'); + }, []) + + return <div>DataView</div> +}; + +export class PluginAddPageClient extends Plugin { + async load() { + // ... + this.app.router.add('admin.dataView', { + path: '/admin/data-view', + Component: DataViewPage, + }) + } +} + +export default PluginAddPageClient; +``` + +При посещении [http://localhost:13000/admin/data-view](http://localhost:13000/admin/data-view) отобразится страница с текстом "DataView". Если попытаться зайти на эту страницу после выхода из системы, произойдет перенаправление на страницу входа. + +![20240512200555](https://static-docs.nocobase.com/20240512200555.png) + +### 3. Добавление страницы `/admin/material-manage` и её подстраниц + +Создайте файл `packages/plugins/@nocobase-sample/plugin-add-page/src/client/MaterialPage.tsx` со следующим содержимым: + +```tsx | pure +import React, { useEffect } from 'react'; +import { Outlet, Link } from 'react-router-dom'; +import { useDocumentTitle } from '@nocobase/client'; + +export const MaterialPage = () => { + return <div> + <h1>Material Page</h1> + <ul> + <li> + <Link to="video">Video</Link> + </li> + <li> + <Link to="img">Img</Link> + </li> + </ul> + <Outlet /> + </div> +} + +export const MaterialVideo = () => { + const { setTitle } = useDocumentTitle(); + + useEffect(() => { + setTitle('Material Video'); + }, []) + + return <div>Material Video</div> +} +export const MaterialImg = () => { + const { setTitle } = useDocumentTitle(); + + useEffect(() => { + setTitle('Material Img'); + }, []) + + return <div>Material Img</div>; +} +``` + +Затем в файле `packages/plugins/@nocobase-sample/plugin-add-page/src/client/index.tsx` импортируйте и используйте: + +```ts +// ... +import { MaterialImg, MaterialPage, MaterialVideo } from './MaterialPage'; + +export class PluginAddPageClient extends Plugin { + async load() { + // ... + + this.app.router.add('admin.material', { + path: '/admin/material', + Component: MaterialPage, + }) + + this.app.router.add('admin.material.video', { + path: '/admin/material/video', + Component: MaterialVideo, + }) + + this.app.router.add('admin.material.img', { + path: '/admin/material/img', + Component: MaterialImg, + }) + } +} +``` + +Если `MaterialPage` используется как родительская страница и не требует пользовательского макета, свойство `Component` можно опустить: + +```ts +this.app.router.add('admin.material', { + path: '/admin/material', +}) +``` + +При посещении [http://localhost:13000/admin/material](http://localhost:13000/admin/material) отобразится страница `Material Page`, а при клике на ссылки `Video` и `Img` можно переключиться на соответствующие подстраницы. + +<video width="100%" controls> + <source src="https://static-docs.nocobase.com/3.mp4" type="video/mp4"> +</video> + +## Сборка и развертывание в продакшен + +Согласно документации [Сборка и упаковка плагинов](/development/your-fisrt-plugin#building-and-packaging-plugins), можно упаковать плагин и загрузить его в продакшен. + +Для клонированного исходного кода выполните полную сборку, чтобы собрать зависимости плагина: + +```bash +yarn build +``` + +Для проекта, созданного с помощью `create-nocobase-app`, выполните: + +```bash +yarn build @nocobase-sample/plugin-add-page --tar +``` + +В результате будет создан файл `storage/tar/@nocobase-sample/plugin-add-page.tar.gz`, который можно установить с помощью [метода загрузки](/welcome/getting-started/plugin). diff --git a/docs/ru-RU/plugin-samples/router/add-setting-page-layout-routes/index.md b/docs/ru-RU/plugin-samples/router/add-setting-page-layout-routes/index.md new file mode 100644 index 0000000000..36db96d8a3 --- /dev/null +++ b/docs/ru-RU/plugin-samples/router/add-setting-page-layout-routes/index.md @@ -0,0 +1,130 @@ +# Добавление страницы настроек плагина (разные макеты) + +## Описание + +Плагину требуется несколько страниц настроек, некоторые из которых не используют макет [AdminSettingsLayout](/development/client/router#existing-page-routes), обычно для страниц с деталями, например, в плагинах `@nocobase/plugin-mobile-client` или `@nocobase/plugin-workflow`. + +## Описание примера + +В этом примере будет создана страница настроек, внутри которой будет ссылка на страницу с деталями, переход на которую осуществляется при клике. + +Этот документ не углубляется в детали разработки содержимого. Он предназначен только для демонстрации добавления страницы настроек плагина. Для конкретного содержимого и логики страницы настроек обратитесь к документации [Пример плагина настроек](/plugin-samples/plugin-settings). + +Полный код примера доступен в репозитории [plugin-samples](https://github.com/nocobase/plugin-samples/tree/main/packages/plugins/%40nocobase-sample/plugin-add-setting-page-layout-routes). + +<video width="100%" controls> + <source src="https://static-docs.nocobase.com/10.mp4" type="video/mp4"> +</video> + +## Инициализация плагина + +Следуйте инструкциям из документации [Создание первого плагина](/development/your-fisrt-plugin). Если у вас нет проекта, создайте его. Если проект уже существует или вы клонировали исходный код, пропустите этот шаг. + +```bash +yarn create nocobase-app my-nocobase-app -d sqlite +cd my-nocobase-app +yarn install +yarn nocobase install +``` + +Инициализируйте плагин и добавьте его в систему: + +```bash +yarn pm create @nocobase-sample/plugin-add-setting-page-layout-routes +yarn pm enable @nocobase-sample/plugin-add-setting-page-layout-routes +``` + +Запустите проект: + +```bash +yarn dev +``` + +После входа в систему перейдите по адресу [http://localhost:13000/admin/pm/list/local/](http://localhost:13000/admin/pm/list/local/), чтобы убедиться, что плагин установлен и активирован. + +## Реализация функциональности + +### 1. Регистрация страницы настроек плагина + +Согласно руководству по разработке плагинов [Расширение страницы настроек плагина](/development/client/router#plugin-setting-page-extension), необходимо обновить файл `packages/plugins/@nocobase-sample/plugin-add-setting-page-layout-routes/src/client/index.tsx`: + +```tsx | pure +import React from 'react'; +import { Plugin } from '@nocobase/client'; + +// @ts-ignore +import { name } from '../../package.json'; + +const PluginSettingPage = () => <div> + details +</div> + +export class PluginAddSettingPageLayoutRoutesClient extends Plugin { + async load() { + this.app.pluginSettingsManager.add(name, { + title: 'Different Layout', + icon: 'ApiOutlined', + Component: PluginSettingPage, + }); + } +} + +export default PluginAddSettingPageLayoutRoutesClient; +``` + +Перейдите по адресу [http://localhost:13000/admin/settings/@nocobase-sample/plugin-add-setting-page-layout-routes](http://localhost:13000/admin/settings/@nocobase-sample/plugin-add-setting-page-layout-routes), чтобы просмотреть страницу настроек плагина. + +### 2. Добавление страницы с деталями + +Мы добавим страницу с деталями под `AdminLayout`. Обновите файл `packages/plugins/@nocobase-sample/plugin-add-setting-page-layout-routes/src/client/index.tsx`: + +```diff ++ import { Link } from 'react-router-dom' + +const PluginSettingPage = () => <div> +- details ++ <Link to={`/admin/${name}-detail`}>details</Link> +</div> + +export class PluginAddSettingPageLayoutRoutesClient extends Plugin { + async load() { + // ... ++ this.app.router.add(`admin.${name}-details`, { ++ path: `/admin/${name}-detail`, ++ Component: () => <div>detail</div>, ++ }); + } +} +``` + +При клике на ссылку `details` произойдет переход на страницу `/admin/@nocobase-sample/plugin-add-setting-page-layout-routes-detail`. + +<video width="100%" controls> + <source src="https://static-docs.nocobase.com/10.mp4" type="video/mp4"> +</video> + +## Настройка прав доступа + +По умолчанию страница настроек плагина не имеет ограничений по доступу, и любой пользователь может получить к ней доступ и изменять настройки. Чтобы настроить права доступа, необходимо задать их в настройках плагина. + +Перейдите по адресу [http://localhost:13000/admin/settings/users-permissions/roles](http://localhost:13000/admin/settings/users-permissions/roles), чтобы просмотреть все роли и настроить права доступа в настройках плагина. + +![20240512201624](https://static-docs.nocobase.com/20240512201624.png) + +## Сборка и развертывание в продакшен + +Следуйте инструкциям из документации [Сборка и упаковка плагинов](/development/your-fisrt-plugin#building-and-packaging-plugins), чтобы упаковать плагин и загрузить его в продакшен. + +Для клонированного исходного кода выполните полную сборку, чтобы собрать зависимости плагина: + +```bash +yarn build +``` + +Для проекта, созданного с помощью `create-nocobase-app`, выполните: + +```bash +yarn build @nocobase-sample/plugin-add-setting-page-layout-routes --tar +``` + +В результате будет создан файл `storage/tar/@nocobase-sample/plugin-add-setting-page-layout-routes.tar.gz`, который можно установить с помощью [метода загрузки](/welcome/getting-started/plugin). diff --git a/docs/ru-RU/plugin-samples/router/add-setting-page-single-route/index.md b/docs/ru-RU/plugin-samples/router/add-setting-page-single-route/index.md new file mode 100644 index 0000000000..48ee70bfbe --- /dev/null +++ b/docs/ru-RU/plugin-samples/router/add-setting-page-single-route/index.md @@ -0,0 +1,102 @@ +# Добавление страницы настроек плагина (один маршрут) + +## Описание + +Плагину требуется простая страница настроек с одним маршрутом. + +## Описание примера + +Предположим, мы интегрируемся с сторонним почтовым сервисом и нам нужно настроить токен этого сервиса. Для этого требуется страница настроек. + +Этот документ не углубляется в детали разработки, а лишь демонстрирует, как добавить страницу настроек плагина. Для конкретного содержимого и логики страницы настроек обратитесь к документации [Пример плагина настроек](/plugin-samples/plugin-settings). + +Полный код примера доступен в репозитории [plugin-samples](https://github.com/nocobase/plugin-samples/tree/main/packages/plugins/%40nocobase-sample/plugin-add-setting-page-single-route). + +![20240512201126](https://static-docs.nocobase.com/20240512201126.png) + +## Инициализация плагина + +Следуйте инструкциям из документации [Создание первого плагина](/development/your-fisrt-plugin). Если у вас нет проекта, создайте его. Если проект уже существует или вы клонировали исходный код, пропустите этот шаг. + +```bash +yarn create nocobase-app my-nocobase-app -d sqlite +cd my-nocobase-app +yarn install +yarn nocobase install +``` + +Инициализируйте плагин и добавьте его в систему: + +```bash +yarn pm create @nocobase-sample/plugin-add-setting-page-single-route +yarn pm enable @nocobase-sample/plugin-add-setting-page-single-route +``` + +Запустите проект: + +```bash +yarn dev +``` + +После входа в систему перейдите по адресу [http://localhost:13000/admin/pm/list/local/](http://localhost:13000/admin/pm/list/local/), чтобы убедиться, что плагин установлен и активирован. + +## Реализация функциональности + +Согласно руководству по разработке плагинов [Расширение страницы настроек плагина](/development/client/router#extending-plugin-settings-page), необходимо обновить файл `packages/plugins/@nocobase-sample/plugin-add-setting-page-single-route/src/client/index.tsx`: + +```ts +import React from 'react'; +import { Plugin } from '@nocobase/client'; + +// @ts-ignore +import { name } from '../../package.json'; + +const MySettingPage = () => <div>Hello Setting page</div>; + +export class PluginAddSettingPageSingleRouteClient extends Plugin { + async load() { + this.app.pluginSettingsManager.add(name, { + title: 'Single Route', + icon: 'ApiOutlined', + Component: MySettingPage, + }); + } +} + +export default PluginAddSettingPageSingleRouteClient; +``` + +- `name`: Имя плагина, используемое для уникальной идентификации плагина. +- `title`: Заголовок меню страницы настроек плагина. +- `icon`: Иконка меню страницы настроек плагина. Дополнительные иконки можно найти в [Ant Design Icons](https://ant.design/components/icon/). +- `Component`: Содержимое страницы настроек. + +Перейдите по адресу [http://localhost:13000/admin/settings/@nocobase-sample/plugin-add-setting-page-single-route](http://localhost:13000/admin/settings/@nocobase-sample/plugin-add-setting-page-single-route), чтобы просмотреть страницу настроек плагина. + +![20240512201126](https://static-docs.nocobase.com/20240512201126.png) + +## Настройка прав доступа + +По умолчанию страница настроек плагина не имеет ограничений по доступу, и любой пользователь может получить к ней доступ и изменять настройки. Чтобы настроить права доступа, необходимо задать их в настройках плагина. + +Перейдите по адресу [http://localhost:13000/admin/settings/users-permissions/roles](http://localhost:13000/admin/settings/users-permissions/roles), чтобы просмотреть все роли и настроить права доступа в настройках плагина. + +![20240512201234](https://static-docs.nocobase.com/20240512201234.png) + +## Сборка и развертывание в продакшен + +Следуйте инструкциям из документации [Сборка и упаковка плагинов](/development/your-fisrt-plugin#building-and-packaging-plugins), чтобы упаковать плагин и загрузить его в продакшен. + +Для клонированного исходного кода выполните полную сборку, чтобы собрать зависимости плагина: + +```bash +yarn build +``` + +Для проекта, созданного с помощью `create-nocobase-app`, выполните: + +```bash +yarn build @nocobase-sample/plugin-add-setting-page-single-route --tar +``` + +В результате будет создан файл `storage/tar/@nocobase-sample/plugin-add-setting-page-single-route.tar.gz`, который можно установить с помощью [метода загрузки](/welcome/getting-started/plugin). diff --git a/docs/ru-RU/plugin-samples/router/add-setting-page-tabs-routes/index.md b/docs/ru-RU/plugin-samples/router/add-setting-page-tabs-routes/index.md new file mode 100644 index 0000000000..1b399c23a4 --- /dev/null +++ b/docs/ru-RU/plugin-samples/router/add-setting-page-tabs-routes/index.md @@ -0,0 +1,134 @@ +# Добавление страниц настроек плагина (несколько вкладок) + +## Описание + +Плагину требуется несколько страниц настроек, каждая из которых соответствует отдельной вкладке. + +## Описание примера + +Предположим, мы интегрируемся с сторонним почтовым сервисом и нам нужно настроить токен для этого сервиса. Также требуется страница для настройки шаблонов писем. В этом случае нам нужна страница настроек с двумя вкладками. + +Этот документ не углубляется в детали разработки содержимого страниц. Он предназначен только для демонстрации добавления страницы настроек плагина. Для конкретного содержимого и логики страниц настроек обратитесь к документации [Пример плагина настроек](/plugin-samples/plugin-settings). + +Полный код примера доступен в репозитории [plugin-samples](https://github.com/nocobase/plugin-samples/tree/main/packages/plugins/%40nocobase-sample/plugin-add-setting-page-tabs-routes). + +<video width="100%" controls> + <source src="https://static-docs.nocobase.com/7.mp4" type="video/mp4"> +</video> + +## Инициализация плагина + +Следуйте инструкциям из документации [Создание первого плагина](/development/your-fisrt-plugin). Если у вас нет проекта, создайте его. Если проект уже существует или вы клонировали исходный код, пропустите этот шаг. + +```bash +yarn create nocobase-app my-nocobase-app -d sqlite +cd my-nocobase-app +yarn install +yarn nocobase install +``` + +Инициализируйте плагин и добавьте его в систему: + +```bash +yarn pm create @nocobase-sample/plugin-add-setting-page-tabs-routes +yarn pm enable @nocobase-sample/plugin-add-setting-page-tabs-routes +``` + +Запустите проект: + +```bash +yarn dev +``` + +После входа в систему перейдите по адресу [http://localhost:13000/admin/pm/list/local/](http://localhost:13000/admin/pm/list/local/), чтобы убедиться, что плагин установлен и активирован. + +## Реализация функциональности + +Согласно руководству по разработке плагинов [Расширение страницы настроек плагина](/development/client/router#extending-plugin-settings-page), необходимо обновить файл `packages/plugins/@nocobase-sample/plugin-add-setting-page-tabs-routes/src/client/index.tsx`: + +```tsx | pure +import React from 'react'; +import { Outlet } from 'react-router-dom'; +import { Plugin } from '@nocobase/client'; + +// @ts-ignore +import { name } from '../../package.json'; + +const TokenPage = () => <div>Token Page</div> + +const TemplatePage = () => <div>Template Page</div> + +export class PluginAddSettingPageTabsRoutesClient extends Plugin { + async load() { + this.app.pluginSettingsManager.add(name, { + title: 'Tabs Routes', + icon: 'ApiOutlined', + Component: Outlet, // Может быть опущено или использован пользовательский компонент + }); + + this.app.pluginSettingsManager.add(`${name}.token`, { + title: 'Token Page', + Component: TokenPage, + sort: 1, + }); + + this.app.pluginSettingsManager.add(`${name}.template`, { + title: 'Template Page', + Component: TemplatePage, + sort: 2, + }); + + this.app.pluginSettingsManager.add(`${name}.nestedRoute`, { + title: 'Test', + Component: Outlet, // Может быть опущено или использован пользовательский компонент + sort: 3, + }); + + this.app.pluginSettingsManager.add(`${name}.nestedRoute.a`, { + title: 'Test A', + Component: () => <div>Test A page</div> + }); + + this.app.pluginSettingsManager.add(`${name}.nestedRoute.b`, { + title: 'Test B', + Component: () => <div>Test B page</div> + }); + } +} + +export default PluginAddSettingPageTabsRoutesClient; +``` + +В сценариях с несколькими страницами настроек атрибут `name` метода `pluginSettingsManager.add()` должен разделяться точкой (`.`). Например, `pluginName.pageName` позволяет реализовать несколько страниц настроек в виде вкладок. + +Перейдите по адресу [http://localhost:13000/admin/settings/@nocobase-sample/plugin-add-setting-page-tabs-routes](http://localhost:13000/admin/settings/@nocobase-sample/plugin-add-setting-page-tabs-routes), чтобы просмотреть страницу настроек плагина. + +<video width="100%" controls> + <source src="https://static-docs.nocobase.com/7.mp4" type="video/mp4"> +</video> + +## Настройка прав доступа + +По умолчанию страница настроек плагина не имеет ограничений по доступу, и любой пользователь может получить к ней доступ и изменять настройки. Чтобы настроить права доступа, необходимо задать их в настройках плагина. + +Перейдите по адресу [http://localhost:13000/admin/settings/users-permissions/roles](http://localhost:13000/admin/settings/users-permissions/roles), чтобы просмотреть все роли и настроить права доступа в настройках плагина. + +![20240512201446](https://static-docs.nocobase.com/20240512201446.png) + +## Сборка и развертывание в продакшен + +Следуйте инструкциям из документации [Сборка и упаковка плагинов](/development/your-fisrt-plugin#building-and-packaging-plugins), чтобы упаковать плагин и загрузить его в продакшен. + +Для клонированного исходного кода выполните полную сборку, чтобы собрать зависимости плагина: + +```bash +yarn build +``` + +Для проекта, созданного с помощью `create-nocobase-app`, выполните: + +```bash +yarn build @nocobase-sample/plugin-add-setting-page-tabs-routes --tar +``` + +В результате будет создан файл `storage/tar/@nocobase-sample/plugin-add-setting-page-tabs-routes.tar.gz`, который можно установить с помощью [метода загрузки](/welcome/getting-started/plugin). diff --git a/docs/ru-RU/plugin-samples/router/index.md b/docs/ru-RU/plugin-samples/router/index.md new file mode 100644 index 0000000000..00a5dc258b --- /dev/null +++ b/docs/ru-RU/plugin-samples/router/index.md @@ -0,0 +1,35 @@ +# Объяснение + +Текущие маршруты страниц фронтенда NocoBase включают следующие [маршруты страниц](/development/client/router#existing-page-routes): + +| Имя | Путь | Компонент | Описание | +| -------------- | ------------------ | ------------------- |-------------| +| admin | /admin/* | AdminLayout | Страница управления в админ-панели | +| admin.page | /admin/:name | AdminDynamicPage | Динамически созданная страница | +| admin.settings | /admin/settings/* | AdminSettingsLayout | Страница настроек плагинов | +| admin.pm.list | /admin/pm/list/* | PluginManager | Страница управления плагинами | + +Однако эти страницы могут не удовлетворять всем требованиям, например: + +**Добавление** + +- Добавить новую страницу только для отображения на фронтенде, например `/about`, для показа информации о сайте. +- Расширить новую страницу под `/admin/*`, для доступа к которой требуется авторизация. +- Добавить страницу настроек для нового плагина. + +**Изменение** + +- Полностью заменить существующую страницу, например, настроить страницу входа вместо стандартной. +- Изменить макет существующей страницы, например, изменить макет `/admin/*`, убрав верхнюю панель меню. + +**Удаление** + +- Например, если зарегистрированная страница больше не нужна, её можно удалить. + +Для реализации вышеуказанных сценариев можно использовать возможности расширения маршрутизатора фронтенда NocoBase. Мы предоставляем следующие примеры: + +- [Добавление страницы](/plugin-samples/router/add-page) (Добавление новой страницы) +- [Замена страницы](/plugin-samples/router/replace-page) (Изменение страницы) +- [Добавление страницы настроек плагина (один маршрут)](/plugin-samples/router/add-setting-page-single-route) (Страница настроек плагина — один маршрут) +- [Добавление страницы настроек плагина (вкладки)](/plugin-samples/router/add-setting-page-tabs-routes) (Страница настроек плагина — маршруты с вкладками) +- [Добавление страницы настроек плагина (разные маршруты)](/plugin-samples/router/add-setting-page-layout-routes) (Страница настроек плагина — разные макеты) diff --git a/docs/ru-RU/plugin-samples/router/replace-page/index.md b/docs/ru-RU/plugin-samples/router/replace-page/index.md new file mode 100644 index 0000000000..4a0fbfd721 --- /dev/null +++ b/docs/ru-RU/plugin-samples/router/replace-page/index.md @@ -0,0 +1,239 @@ +# Замена страницы + +## Описание + +Сценарий, при котором необходимо изменить макет существующей страницы или полностью заменить её содержимое. + +## Описание примера + +Нам нужно настроить макет страниц входа и регистрации. В настоящее время эти страницы содержат только форму, но мы хотим изменить их на макет с двумя колонками: слева — изображение, справа — форма. + +Полный код примера доступен в репозитории [plugin-samples](https://github.com/nocobase/plugin-samples/tree/main/packages/plugins/%40nocobase-sample/plugin-replace-page). + +![20240512200917](https://static-docs.nocobase.com/20240512200917.png) + +## Инициализация плагина + +Следуйте инструкциям из документации [Создание первого плагина](/development/your-fisrt-plugin). Если у вас нет проекта, создайте его. Если проект уже существует или вы клонировали исходный код, пропустите этот шаг. + +```bash +yarn create nocobase-app my-nocobase-app -d sqlite +cd my-nocobase-app +yarn install +yarn nocobase install +``` + +Инициализируйте плагин и добавьте его в систему: + +```bash +yarn pm create @nocobase-sample/plugin-replace-page +yarn pm enable @nocobase-sample/plugin-replace-page +``` + +Запустите проект: + +```bash +yarn dev +``` + +После входа в систему перейдите по адресу [http://localhost:13000/admin/pm/list/local/](http://localhost:13000/admin/pm/list/local/), чтобы убедиться, что плагин установлен и активирован. + +## Реализация функциональности + +### 1. Анализ требований и исходного кода + +Страницы входа и регистрации регистрируются плагином [Auth plugin](/handbook/auth/dev/api#route), который определяет следующие маршруты: + +- Макет авторизации + - имя: `auth` + - путь: `-` + - компонент: `AuthLayout` + +- Страница входа + - имя: `auth.signin` + - путь: `/signin` + - компонент: `SignInPage` + +- Страница регистрации + - имя: `auth.signup` + - путь: `/signup` + - компонент: `SignUpPage` + +`AuthLayout` — это макет для страниц входа и регистрации. Мы можем настроить макет, заменив `AuthLayout`. + +Для реализации необходимо изучить исходный код оригинального [AuthLayout](https://github.com/nocobase/nocobase/blob/main/packages/plugins/%40nocobase/plugin-auth/src/client/pages/AuthLayout.tsx): + +```tsx | pure +export function AuthLayout() { + const { data } = useSystemSettings(); + + return ( + <div + style={{ + maxWidth: 320, + margin: '0 auto', + paddingTop: '20vh', + }} + > + <h1>{data?.data?.title}</h1> + <AuthenticatorsContextProvider> + <Outlet /> + </AuthenticatorsContextProvider> + <div + className={css` + position: absolute; + bottom: 24px; + width: 100%; + left: 0; + text-align: center; + `} + > + <PoweredBy /> + </div> + </div> + ); +} +``` + +Исходный код относительно прост. Нам нужно реализовать макет с двумя сторонами: слева — изображение, справа — формы входа и регистрации. Мы можем либо скопировать существующий `AuthLayout` и разместить его справа, либо импортировать оригинальный `AuthLayout` и добавить изображение слева. + +### 2. Реализация пользовательского компонента AuthLayout + +Создайте файл `packages/plugins/@nocobase-sample/plugin-replace-page/src/client/AuthLayout.tsx` со следующим содержимым: + +```tsx | pure +import React from 'react'; +import { Col, Row } from 'antd'; +import { Outlet } from 'react-router-dom'; +import { PoweredBy, css, useSystemSettings } from '@nocobase/client'; +import { AuthenticatorsContextProvider } from '@nocobase/plugin-auth/client' + +import authImg from './auth-image.jpg' + +export function CustomAuthLayout() { + const { data } = useSystemSettings(); + + return <Row style={{ height: '100%' }}> + <Col xs={{ span: 0 }} md={{ span: 12 }}> + <img src={authImg} style={{ + objectFit: 'cover', + objectPosition: 'center', + width: '100%', + height: '100%', + maxWidth: '100%', + display: 'block', + verticalAlign: 'middle' + }} /> + </Col> + <Col xs={{ span: 24 }} md={{ span: 12 }}> + <div + style={{ + maxWidth: 320, + margin: '0 auto', + paddingTop: '20vh', + }} + > + <h1>{data?.data?.title}</h1> + <AuthenticatorsContextProvider> + <Outlet /> + </AuthenticatorsContextProvider> + <div + className={css` + position: absolute; + bottom: 24px; + width: 100%; + left: 0; + text-align: center; + `} + > + <PoweredBy /> + </div> + </div> + </Col> + </Row> +} +``` + +Поместите изображение для левой части [auth-image.jpg](https://github.com/nocobase/plugin-samples/tree/main/packages/plugins/%40nocobase-sample/plugin-replace-page/src/client/auth-image.jpg) в директорию `packages/plugins/@nocobase-sample/plugin-replace-page/src/client`. + +Это завершает реализацию страницы входа с двухколоночным макетом. + +### 3. Замена `AuthLayout` на `CustomAuthLayout` + +Далее необходимо импортировать и использовать `CustomAuthLayout` в файле `packages/plugins/@nocobase-sample/plugin-replace-page/src/client/index.tsx`. + +Существует два способа замены `AuthLayout`: через переопределение маршрута и через переопределение компонента. + +#### Переопределение маршрута + +Как упомянуто ранее, имя маршрута для `AuthLayout` — `auth`. Мы можем переопределить его с помощью маршрутов: + +```ts +import { Plugin } from '@nocobase/client'; +import { CustomAuthLayout } from './AuthLayout'; + +export class PluginReplacePageClient extends Plugin { + async load() { + this.app.router.add('auth', { + Component: CustomAuthLayout, + }) + } +} + +export default PluginReplacePageClient; +``` + +Первый параметр метода `router.add()` — это имя маршрута. Если маршрут добавляется повторно, он перезапишет существующий маршрут. + +#### Переопределение компонента + +```ts +import { Plugin } from '@nocobase/client'; +import { CustomAuthLayout } from './AuthLayout'; + +export class PluginChangePageClient extends Plugin { + async load() { + this.app.addComponents({ AuthLayout: CustomAuthLayout }) + } +} +``` + +Важно отметить, что этот метод переопределения работает только при использовании *строкового компонента* для регистрации маршрута. Например, исходный код [плагина auth](https://github.com/nocobase/nocobase/blob/cff530acac45cc615291c344b4a26c7bc7f410dc/packages/plugins/%40nocobase/plugin-auth/src/client/index.tsx#L47) выглядит следующим образом: + +```ts +this.app.router.add('auth', { + Component: 'AuthLayout', +}) + +this.app.addComponents({ AuthLayout }) +``` + +Если исходный код плагина `auth` зарегистрирован следующим образом, переопределение не сработает: + +```ts +this.app.router.add('auth', { + Component: AuthLayout, +}) +``` + +Выйдите из системы и перейдите по адресу [http://localhost:13000/signin](http://localhost:13000/signin), чтобы увидеть измененный макет страницы входа. + +![20240512200917](https://static-docs.nocobase.com/20240512200917.png) + +## Сборка и развертывание в продакшен + +Следуйте инструкциям из документации [Сборка и упаковка плагинов](/development/your-fisrt-plugin#building-and-packaging-plugins), чтобы упаковать плагин и загрузить его в продакшен. + +Для клонированного исходного кода выполните полную сборку, чтобы собрать зависимости плагина: + +```bash +yarn build +``` + +Для проекта, созданного с помощью `create-nocobase-app`, выполните: + +```bash +yarn build @nocobase-sample/plugin-replace-page --tar +``` + +В результате будет создан файл `storage/tar/@nocobase-sample/plugin-replace-page.tar.gz`, который можно установить с помощью [метода загрузки](/welcome/getting-started/plugin). diff --git a/docs/ru-RU/plugin-samples/schema-initailizer/add-item-to-block.md b/docs/ru-RU/plugin-samples/schema-initailizer/add-item-to-block.md new file mode 100644 index 0000000000..5f20d5f3c9 --- /dev/null +++ b/docs/ru-RU/plugin-samples/schema-initailizer/add-item-to-block.md @@ -0,0 +1,167 @@ +# Локальная регистрация компонента и области видимости + +## Описание примера + +Функциональность, реализуемая в этом примере, аналогична примеру [Глобальная регистрация компонента и области видимости](/plugin-samples/component-and-scope/global), но в данном случае компонент и область видимости будут зарегистрированы внутри самого плагина, а не глобально. + +Полный код примера доступен в [plugin-samples](https://github.com/nocobase/plugin-samples/tree/main/packages/plugins/%40nocobase-sample/plugin-component-and-scope-local). + +## Инициализация плагина + +Следуйте инструкциям из документации [Создание первого плагина](/development/your-first-plugin). Если у вас нет проекта, создайте его. Если проект уже есть или вы клонировали исходный код, пропустите этот шаг. + +```bash +yarn create nocobase-app my-nocobase-app -d sqlite +cd my-nocobase-app +yarn install +yarn nocobase install +``` + +Инициализируйте плагин и добавьте его в систему: + +```bash +yarn pm create @nocobase-sample/plugin-component-and-scope-local +yarn pm enable @nocobase-sample/plugin-component-and-scope-local +``` + +Запустите проект: + +```bash +yarn dev +``` + +После входа в систему перейдите по адресу [http://localhost:13000/admin/pm/list/local/](http://localhost:13000/admin/pm/list/local/), чтобы убедиться, что плагин установлен и активирован. + +--- + +# Реализация функциональности + +## 1. Создание пользовательской страницы + +Создайте файл `packages/plugins/@nocobase-sample/plugin-component-and-scope-local/src/client/CustomPage.tsx` со следующим содержимым: + +```tsx | pure +import React from "react" + +export const SamplesCustomPage = () => { + return <div>TODO</div> +} +``` + +## 2. Рендеринг содержимого напрямую с помощью `Component` + +Для получения дополнительной информации о создании пользовательских страниц см. руководство [Добавление новой страницы](/plugin-samples/router/add-page). + +Далее, обновите файл `packages/plugins/@nocobase-sample/plugin-component-and-scope-local/src/index.ts`: + +```tsx | pure +import { Plugin } from '@nocobase/client'; +import { SamplesCustomPage } from './CustomPage' + +export class PluginComponentAndScopeLocalClient extends Plugin { + async load() { + this.app.router.add('admin.custom-page2', { + path: '/admin/custom-page2', + Component: SamplesCustomPage, + }) + } +} + +export default PluginComponentAndScopeLocalClient; +``` + +В отличие от глобальной регистрации, здесь мы напрямую используем `Component: SamplesCustomPage`, вместо передачи строки с типом компонента. + +Перейдите по адресу [http://localhost:13000/admin/custom-page2](http://localhost:13000/admin/custom-page2), чтобы увидеть содержимое компонента `SamplesCustomPage`. + +![img_v3_02av_46e020ae-41d2-4bc3-a047-e28d97c20bdg](https://static-docs.nocobase.com/img_v3_02av_46e020ae-41d2-4bc3-a047-e28d97c20bdg.jpg) + +## 3. Рендеринг содержимого с помощью `SchemaComponent` + +Необходимо ознакомиться с следующими концепциями: + +- [Протокол схемы](/development/client/ui-schema/what-is-ui-schema) +- [SchemaComponent](https://client.docs.nocobase.com/core/ui-schema/schema-component#schemacomponent-1) +- [withDynamicSchemaProps](/development/client/ui-schema/what-is-ui-schema#x-component-props-and-x-use-component-props) +- [useFieldSchema()](https://client.docs.nocobase.com/core/ui-schema/designable#usefieldschema) + +Обновите файл `packages/plugins/@nocobase-sample/plugin-component-and-scope-local/src/client/CustomPage.tsx`: + +```tsx | pure +import { ISchema, SchemaComponent, withDynamicSchemaProps } from "@nocobase/client" +import { uid } from '@formily/shared' +import { useFieldSchema } from '@formily/react' +import React, { FC } from "react" + +const SamplesHello: FC<{ name: string }> = withDynamicSchemaProps(({ name }) => { + return <div>hello {name}</div> +}) + +const useSamplesHelloProps = () => { + const schema = useFieldSchema(); + return { name: schema.name } +} + +const schema: ISchema = { + type: 'void', + name: uid(), + properties: { + demo1: { + type: 'void', + 'x-component': SamplesHello, + 'x-component-props': { + name: 'demo1', + }, + }, + demo2: { + type: 'void', + 'x-component': SamplesHello, + 'x-use-component-props': useSamplesHelloProps, + }, + demo3: { + type: 'void', + 'x-component': 'SamplesHello', + 'x-component-props': { + name: 'demo3', + }, + }, + demo4: { + type: 'void', + 'x-component': 'SamplesHello', + 'x-use-component-props': 'useSamplesHelloProps', + }, + } +} + +export const SamplesCustomPage = () => { + return <SchemaComponent schema={schema} components={{ SamplesHello }} scope={{ useSamplesHelloProps }}></SchemaComponent> +} +``` + +- Определены компонент `SamplesHello` и область видимости `useSamplesHelloProps`. +- Создан объект `schema`, в котором поля `demo1` и `demo2` используют соответствующие компоненты и области видимости напрямую, а поля `demo3` и `demo4` используют строковые типы компонентов и областей видимости. +- Использованы атрибуты `components` и `scope` компонента `SchemaComponent` для локальной регистрации `SamplesHello` и `useSamplesHelloProps`. + +Перейдите по адресу [http://localhost:13000/admin/custom-page2](http://localhost:13000/admin/custom-page2), чтобы увидеть содержимое компонента `CustomPage`. + +![img_v3_02av_e8d4d0c7-7a59-4f9e-a120-a2551e719ebg](https://static-docs.nocobase.com/img_v3_02av_e8d4d0c7-7a59-4f9e-a120-a2551e719ebg.jpg) + +--- + +# Сборка и развертывание в продакшен + +Следуйте инструкциям из руководства [Сборка и упаковка плагинов](/development/your-first-plugin#building-and-packaging-plugins), чтобы упаковать плагин и загрузить его в продакшен. + +Для клонированного исходного кода выполните полную сборку для упаковки зависимостей плагина: + +```bash +yarn build +``` + +Для проекта, созданного с помощью `create-nocobase-app`, выполните: + +```bash +yarn build @nocobase-sample/plugin-component-and-scope-local --tar +``` + +В результате будет создан файл `storage/tar/@nocobase-sample/plugin-component-and-scope-local.tar.gz`, который можно загрузить с помощью [метода загрузки плагина](/welcome/getting-started/plugin). diff --git a/docs/ru-RU/plugin-samples/schema-initailizer/index.md b/docs/ru-RU/plugin-samples/schema-initailizer/index.md new file mode 100644 index 0000000000..84c9d0ca3a --- /dev/null +++ b/docs/ru-RU/plugin-samples/schema-initailizer/index.md @@ -0,0 +1,15 @@ +# SchemaInitializer + +[SchemaInitializer](/development/client/ui-schema/initializer) 用于向界面内添加各种区块、字段、操作等。 + +根据需求不同可能有以下扩展场景: + +- 向已有的 Initializer 中添加子项 +- 创建新的 Initializer + +根据以上场景,我们提供了如下示例: + +- [向已有的 Add block 里添加新子项](/plugin-samples/schema-initializer/add-item-to-block) +- [向已有的 Configure actions 里添加新子项](/plugin-samples/schema-initializer/add-item-to-actions) +- [复用已有的 Initializer 子项](/plugin-samples/schema-initializer/reuse-existing-item) +- [创建并使用新的 Initializer](/plugin-samples/schema-initializer/create-new) diff --git a/docs/ru-RU/plugin-samples/schema-initializer/action-modal.md b/docs/ru-RU/plugin-samples/schema-initializer/action-modal.md new file mode 100644 index 0000000000..f29599589c --- /dev/null +++ b/docs/ru-RU/plugin-samples/schema-initializer/action-modal.md @@ -0,0 +1,361 @@ +# Добавление действия с модальным окном + +## Описание сценария + +В NocoBase существует множество кнопок `Configure actions`, используемых для добавления операционных кнопок в интерфейс. + +![img_v3_02b4_51f4918f-d344-43b2-b19e-48dca709467g](https://static-docs.nocobase.com/img_v3_02b4_51f4918f-d344-43b2-b19e-48dca709467g.jpg) + +Если существующие кнопки действий не полностью удовлетворяют потребности, можно добавить новые кнопки, создав подэлементы в `Configure actions`. + +## Описание примера + +В этом примере создается кнопка, которая при нажатии открывает модальное окно. В окне отображается документ, встроенный через iframe. Кнопка будет добавлена в блоки `Table`, `Details` и `Form` в разделе `Configure actions`. + +Полный код примера доступен в [plugin-samples](https://github.com/nocobase/plugin-samples/tree/main/packages/plugins/%40nocobase-sample/plugin-initializer-action-modal). + +<video controls width='100%' src="https://static-docs.nocobase.com/20240526172851_rec_.mp4"></video> + +## Инициализация плагина + +Следуйте инструкциям из документации [Создание первого плагина](/development/your-fisrt-plugin). Если у вас нет проекта, создайте его. Если проект уже есть или вы клонировали исходный код, пропустите этот шаг. + +```bash +yarn create nocobase-app my-nocobase-app -d sqlite +cd my-nocobase-app +yarn install +yarn nocobase install +``` + +Инициализируйте плагин и добавьте его в систему: + +```bash +yarn pm create @nocobase-sample/plugin-initializer-action-modal +yarn pm enable @nocobase-sample/plugin-initializer-action-modal +``` + +Запустите проект: + +```bash +yarn dev +``` + +После входа в систему перейдите по адресу [http://localhost:13000/admin/pm/list/local/](http://localhost:13000/admin/pm/list/local/), чтобы убедиться, что плагин установлен и активирован. + +## Реализация функциональности + +Перед началом работы с этим примером ознакомьтесь с основными концепциями: + +- [Компонент Action](https://client.docs.nocobase.com/components/action) +- [Руководство по SchemaInitializer](/development/client/ui-schema/initializer): Используется для добавления блоков, полей, действий и других элементов в интерфейс. +- [API SchemaInitializer](https://client.docs.nocobase.com/core/ui-schema/schema-initializer): Описание API для добавления элементов в интерфейс. +- [UI Schema](/development/client/ui-schema/what-is-ui-schema): Определяет структуру и стиль интерфейса. +- [Дизайнер Designable](/development/client/ui-schema/designable): Используется для изменения схемы. + +Структура проекта: + +```bash +. +├── client # Клиентская часть плагина +│ ├── initializer # Инициализатор +│ ├── index.tsx # Входной файл клиентского плагина +│ ├── locale.ts # Утилиты для мультиязычности +│ ├── constants.ts # Константы +│ ├── schema # Схемы +│ └── settings # Schema Settings +├── locale # Файлы локализации +│ ├── en-US.json # Английский +│ └── zh-CN.json # Китайский +├── index.ts # Входной файл серверного плагина +└── server # Серверная часть плагина +``` + +## 1. Определение имени + +Сначала определите имя действия, которое будет использоваться в различных местах. + +Создайте файл `packages/plugins/@nocobase-sample/plugin-initializer-action-modal/src/client/constants.ts`: + +```ts +export const ActionName = 'Open Document'; +export const ActionNameLowercase = 'open-document'; +``` + +## 2. Определение схемы + +### 2.1 Определение схемы + +Динамические страницы в NocoBase рендерятся через схемы, поэтому необходимо определить схему для добавления элементов в интерфейс. Ознакомьтесь с: + +- [Компонент Action](https://client.docs.nocobase.com/components/action) +- [Компонент Action.Drawer](https://client.docs.nocobase.com/components/action#actiondrawer) +- [Протокол UI Schema](/development/client/ui-schema/what-is-ui-schema): Подробное описание структуры схемы и назначения атрибутов. + +Создайте файл `packages/plugins/@nocobase-sample/plugin-initializer-action-modal/src/client/schema/index.ts`: + +```ts +import { ISchema } from "@nocobase/client" +import { tStr } from "../locale"; +import { ActionName } from "../constants"; + +export const createDocumentActionModalSchema = (blockComponent: string): ISchema => { + return { + type: 'void', + 'x-component': 'Action', + title: tStr(ActionName), + 'x-component-props': { + type: 'primary' + }, + properties: { + drawer: { + type: 'void', + 'x-component': 'Action.Drawer', + 'x-component-props': { + size: 'large' + }, + properties: { + iframe: { + type: 'void', + 'x-component': 'iframe', + 'x-component-props': { + src: `https://client.docs.nocobase.com/components/${blockComponent}`, + style: { + border: 'none', + width: '100%', + height: '100%' + } + }, + } + } + }, + }, + } +} +``` + +Функция `createDocumentActionModalSchema` принимает параметр `blockComponent` и возвращает схему, которая добавляет кнопку в интерфейс. При нажатии кнопка открывает модальное окно, содержащее iframe с документацией блока. + +`createDocumentActionModalSchema`: +- `type: 'void'`: Указывает на чистый UI-компонент. +- `x-component: 'Action'`: [Компонент Action](https://client.docs.nocobase.com/components/action) для создания кнопки. +- `title`: Заголовок кнопки, переведенный через `tStr`. +- `x-component-props`: Свойства компонента `Action` (например, `type: 'primary'`). +- `properties`: Дочерние узлы: + - `x-component: 'Action.Drawer'`: [Компонент Action.Drawer](https://client.docs.nocobase.com/components/action#actiondrawer) для модального окна. + - `iframe`: Компонент iframe, отображающий документацию по указанному URL. + +Подробности о схемах см. в [UI Schema](/development/client/ui-schema/what-is-ui-schema). + +### 2.2 Проверка схемы + +Существует два способа проверки схемы: + +- Проверка через временную страницу: Создайте временную страницу, отрендерите схему и проверьте соответствие требованиям. +- Проверка через документацию: Запустите документацию с помощью `yarn doc plugins/@nocobase-sample/plugin-initializer-action-modal` и проверьте через примеры в документации (TODO). + +Рассмотрим проверку через временную страницу. Создайте страницу, добавьте одну или несколько схем и проверьте их работу. + +```tsx | pure +import React from 'react'; +import { Plugin, SchemaComponent } from '@nocobase/client'; +import { createDocumentActionModalSchema } from './schema'; + +export class PluginInitializerActionModalClient extends Plugin { + async load() { + this.app.router.add('admin.open-document-schema', { + path: '/admin/open-document-schema', + Component: () => { + return <> + <div style={{ marginTop: 20, marginBottom: 20 }}> + <SchemaComponent schema={{ properties: { test1: createDocumentActionModalSchema('table-v2') } }} /> + </div> + <div style={{ marginTop: 20, marginBottom: 20 }}> + <SchemaComponent schema={{ properties: { test2: createDocumentActionModalSchema('details') } }} /> + </div> + </> + } + }) + } +} + +export default PluginInitializerActionModalClient; +``` + +Перейдите по адресу [http://localhost:13000/admin/open-document-schema](http://localhost:13000/admin/open-document-schema), чтобы увидеть содержимое тестовой страницы. + +Подробности о `SchemaComponent` см. в [SchemaComponent](https://client.docs.nocobase.com/core/ui-schema/schema-component#schemacomponent-1). + +<video controls width='100%' src="https://static-docs.nocobase.com/20240526171945_rec_.mp4"></video> + +После проверки удалите тестовую страницу. + +## 3. Определение элемента SchemaInitializer + +Создайте файл `packages/plugins/@nocobase-sample/plugin-initializer-action-modal/src/client/initializer/index.ts`: + +```ts +import { SchemaInitializerItemType, useSchemaInitializer } from "@nocobase/client" + +import { useT } from "../locale"; +import { createDocumentActionModalSchema } from '../schema'; +import { ActionName, ActionNameLowercase } from "../constants"; + +export const createDocumentActionModalInitializerItem = (blockComponent: string): SchemaInitializerItemType => ({ + type: 'item', + title: ActionName, + name: ActionNameLowercase, + useComponentProps() { + const { insert } = useSchemaInitializer(); + const t = useT(); + return { + title: t(ActionName), + onClick: () => { + insert(createDocumentActionModalSchema(blockComponent)); + }, + }; + }, +}) +``` + +`createDocumentActionModalInitializerItem` создает экземпляры `DocumentActionModal` для разных значений `blockComponent`. + +- `type: 'item'`: Текстовый элемент с событием клика, вставляющий новую схему. +- `name`: Уникальный идентификатор для операций (создание, чтение, обновление, удаление). +- `useComponentProps`: Возвращает объект с `title` (заголовок) и `onClick` (обработчик клика). +- [useSchemaInitializer](https://client.docs.nocobase.com/core/ui-schema/schema-initializer#useschemainitializer): Предоставляет методы для операций с схемой. + +Подробности о создании SchemaInitializer см. в [Schema Initializer Item](https://client.docs.nocobase.com/core/ui-schema/schema-initializer#built-in-components-and-types). + +## 4. Реализация SchemaSettings + +### 4.1 Определение SchemaSettings + +Добавленные через `createDocumentActionInitializerItem` элементы нельзя удалить. Для этого используйте [Schema Settings](https://client.docs.nocobase.com/core/ui-schema/schema-settings). + +Создайте файл `packages/plugins/@nocobase-sample/plugin-initializer-action-modal/src/client/settings/index.ts`: + +```ts +import { SchemaSettings } from "@nocobase/client"; +import { ActionNameLowercase } from "../constants"; + +export const documentActionModalSettings = new SchemaSettings({ + name: `actionSettings:${ActionNameLowercase}`, + items: [ + { + name: 'remove', + type: 'remove', + } + ] +}); +``` + +### 4.2 Регистрация SchemaSettings + +Обновите `index.tsx`: + +```ts +import { Plugin } from '@nocobase/client'; +import { documentActionModalSettings } from './settings'; + +export class PluginInitializerActionModalClient extends Plugin { + async load() { + this.app.schemaSettingsManager.add(documentActionModalSettings); + } +} + +export default PluginInitializerActionModalClient; +``` + +### 4.3 Использование SchemaSettings + +Обновите `createDocumentActionModalSchema` в `schema/index.ts`, добавив `x-settings`: + +```diff ++ import { documentActionModalSettings } from '../settings'; + +export const createDocumentActionModalSchema = (blockComponent: string): ISchema => { + return { + type: 'void', + 'x-component': 'Action', ++ 'x-settings': documentActionModalSettings.name, + // ... + } +} +``` + +## 5. Добавление в Configure Actions на странице + +Кнопки `Configure actions` имеют разные имена (`name`). Необходимо добавить действие в блоки `Table`, `Details` и `Form`. + +Определите соответствующие имена (см. документацию TODO). + +Обновите `index.tsx`: + +```diff +import { Plugin } from '@nocobase/client'; +import { documentActionModalSettings } from './settings'; ++ import { createDocumentActionModalInitializerItem } from './initializer'; + +export class PluginInitializerActionModalClient extends Plugin { + async load() { + this.app.schemaSettingsManager.add(documentActionModalSettings); ++ this.app.schemaInitializerManager.addItem('table:configureActions', 'open-document', createDocumentActionModalInitializerItem('table-v2')); ++ this.app.schemaInitializerManager.addItem('details:configureActions', 'open-document', createDocumentActionModalInitializerItem('details')); ++ this.app.schemaInitializerManager.addItem('createForm:configureActions', 'open-document', createDocumentActionModalInitializerItem('form-v2')); + } +} + +export default PluginInitializerActionModalClient; +``` + +<video controls width='100%' src="https://static-docs.nocobase.com/20240526172851_rec_.mp4"></video> + +## 6. Мультиязычность + +:::warning +Изменения в файлах локализации вступают в силу только после перезапуска сервиса. +::: + +### 6.1 Английский + +Обновите `en-US.json`: + +```json +{ + "Open Document": "Open Document" +} +``` + +### 6.2 Китайский + +Обновите `zh-CN.json`: + +```json +{ + "Open Document": "打开文档" +} +``` + +Для поддержки других языков добавьте соответствующие файлы. + +Управляйте языками через [http://localhost:13000/admin/settings/system-settings](http://localhost:13000/admin/settings/system-settings) и переключайте их в правом верхнем углу. + +![20240611113758](https://static-docs.nocobase.com/20240611113758.png) + +## 7. Сборка и развертывание в продакшен + +Следуйте инструкциям из [Сборка и упаковка плагина](/development/your-fisrt-plugin#build-and-package-plugins). + +Для клонированного исходного кода выполните полную сборку: + +```bash +yarn build +``` + +Для проекта, созданного с помощью `create-nocobase-app`: + +```bash +yarn build @nocobase-sample/plugin-initializer-action-modal --tar +``` + +Архив плагина появится в `storage/tar/@nocobase-sample/plugin-initializer-action-modal.tar.gz`. Установите его через [загрузку](/welcome/getting-started/plugin). diff --git a/docs/ru-RU/plugin-samples/schema-initializer/action-simple.md b/docs/ru-RU/plugin-samples/schema-initializer/action-simple.md new file mode 100644 index 0000000000..c1edfe49df --- /dev/null +++ b/docs/ru-RU/plugin-samples/schema-initializer/action-simple.md @@ -0,0 +1,314 @@ +# Добавление простого действия + +## Описание сценария + +NocoBase предоставляет различные кнопки `Configure actions` для добавления действий в интерфейс. + +![img_v3_02b4_51f4918f-d344-43b2-b19e-48dca709467g](https://static-docs.nocobase.com/img_v3_02b4_51f4918f-d344-43b2-b19e-48dca709467g.jpg) + +Если существующие кнопки действий не полностью удовлетворяют потребности, можно добавить новые кнопки, создав подэлементы в `Configure actions`. + +Термин "простое действие" в заголовке означает действия, не требующие всплывающего окна. Подробности о добавлении действий с модальным окном см. в [Добавление действия с модальным окном](/plugin-samples/schema-initializer/action-modal). + +## Описание примера + +В этом примере создается кнопка, которая при нажатии открывает документацию соответствующего блока. Кнопка будет добавлена в блоки `Table`, `Details` и `Form` в разделе `Configure actions`. + +Полный код примера доступен в [plugin-samples](https://github.com/nocobase/plugin-samples/tree/main/packages/plugins/%40nocobase-sample/plugin-initializer-action-simple). + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240522-185359.mp4" type="video/mp4" /> +</video> + +## Инициализация плагина + +Следуйте инструкциям из документации [Создание первого плагина](/development/your-first-plugin). Если у вас нет проекта, создайте его. Если проект уже есть или вы клонировали исходный код, пропустите этот шаг. + +```bash +yarn create nocobase-app my-nocobase-app -d sqlite +cd my-nocobase-app +yarn install +yarn nocobase install +``` + +Инициализируйте плагин и добавьте его в систему: + +```bash +yarn pm create @nocobase-sample/plugin-initializer-action-simple +yarn pm enable @nocobase-sample/plugin-initializer-action-simple +``` + +Запустите проект: + +```bash +yarn dev +``` + +После входа в систему перейдите по адресу [http://localhost:13000/admin/pm/list/local/](http://localhost:13000/admin/pm/list/local/), чтобы убедиться, что плагин установлен и активирован. + +## Реализация функциональности + +Перед началом работы с этим примером ознакомьтесь с основными концепциями: + +- [Компонент Action](https://client.docs.nocobase.com/components/action) +- [Руководство по SchemaInitializer](/development/client/ui-schema/initializer): Используется для добавления блоков, полей и действий в интерфейс. +- [API SchemaInitializer](https://client.docs.nocobase.com/core/ui-schema/schema-initializer): Описание API для добавления элементов в интерфейс. +- [UI Schema](/development/client/ui-schema/what-is-ui-schema): Определяет структуру и стиль интерфейса. +- [Дизайнер Designable](/development/client/ui-schema/designable): Используется для изменения схемы. + +Структура проекта: + +```bash +. +├── client # Клиентская часть плагина +│ ├── initializer # Инициализатор +│ ├── index.tsx # Входной файл клиентского плагина +│ ├── locale.ts # Утилиты для мультиязычности +│ ├── constants.ts # Константы +│ ├── schema # Схемы +│ └── settings # Schema Settings +├── locale # Файлы локализации +│ ├── en-US.json # Английский +│ └── zh-CN.json # Китайский +├── index.ts # Входной файл серверного плагина +└── server # Серверная часть плагина +``` + +### 1. Определение имени + +Сначала определите имя действия, которое будет использоваться в различных местах. + +Создайте файл `packages/plugins/@nocobase-sample/plugin-initializer-action-simple/src/client/constants.ts`: + +```ts +export const ActionName = 'Document'; +export const ActionNameLowercase = ActionName.toLowerCase(); +``` + +### 2. Определение схемы + +#### 2.1 Определение схемы + +Динамические страницы в NocoBase рендерятся через схемы, поэтому необходимо определить схему для добавления кнопки в интерфейс. Ознакомьтесь с: + +- [Компонент Action](https://client.docs.nocobase.com/components/action) +- [Протокол UI Schema](/development/client/ui-schema/what-is-ui-schema): Подробное описание структуры и функций атрибутов схемы. + +Создайте файл `packages/plugins/@nocobase-sample/plugin-initializer-action-simple/src/client/schema/index.ts`: + +```ts +import { useFieldSchema } from '@formily/react'; +import { ISchema } from "@nocobase/client" +import { useT } from '../locale'; +import { ActionName } from '../constants'; + +export function useDocumentActionProps() { + const fieldSchema = useFieldSchema(); + const t = useT(); + return { + title: t(ActionName), + type: 'primary', + onClick() { + window.open(fieldSchema['x-doc-url']) + } + } +} + +export const createDocumentActionSchema = (blockComponent: string): ISchema & { 'x-doc-url': string } => { + return { + type: 'void', + 'x-component': 'Action', + 'x-doc-url': `https://client.docs.nocobase.com/components/${blockComponent}`, + 'x-use-component-props': 'useDocumentActionProps', + } +} +``` + +Функция `createDocumentActionSchema` принимает параметр `blockComponent` и возвращает схему, которая добавляет кнопку в интерфейс. При нажатии кнопка открывает документацию соответствующего блока. + +`createDocumentActionSchema`: +- `type: 'void'`: Указывает на чистый UI-компонент. +- `x-component: 'Action'`: [Компонент Action](https://client.docs.nocobase.com/components/action) для создания кнопки. +- `x-doc-url`: Пользовательское свойство схемы, указывающее URL документации. +- `x-use-component-props: 'useDocumentActionProps'`: Динамические свойства, подробности см. в [документации](/development/client/ui-schema/what-is-ui-schema#x-component-props-и-x-use-component-props). + +`useDocumentActionProps()`: +- [useFieldSchema()](https://client.docs.nocobase.com/core/ui-schema/designable#usefieldschema): Получает схему текущего узла. +- `type: 'primary'`: Тип кнопки. +- `onClick`: Событие клика, открывает документацию блока. + +Подробности о схемах см. в [UI Schema](/development/client/ui-schema/what-is-ui-schema). + +### 3. Определение элемента SchemaInitializer + +Создайте файл `packages/plugins/@nocobase-sample/plugin-initializer-action-simple/src/client/initializer/index.ts`: + +```ts +import { SchemaInitializerItemType, useSchemaInitializer } from '@nocobase/client'; +import { createDocumentActionSchema } from '../schema'; +import { useT } from '../locale'; +import { ActionNameLowercase } from '../constants'; + +export const createDocumentActionInitializerItem = (blockComponent: string): SchemaInitializerItemType => { + return { + name: ActionNameLowercase, + type: 'item', + useComponentProps() { + const { insert } = useSchemaInitializer(); + const t = useT(); + return { + title: t('Document'), + onClick: () => { + insert(createDocumentActionSchema(blockComponent)); + }, + }; + }, + }; +}; +``` + +`createDocumentActionInitializerItem`: +- `name`: Уникальный идентификатор для операций. +- `type: 'item'`: Текстовый элемент с событием клика. +- `useComponentProps`: Возвращает свойства для элемента: + - `title`: Заголовок кнопки, переведенный через `useT`. + - `onClick`: Вставляет схему через `insert` из [useSchemaInitializer](https://client.docs.nocobase.com/core/ui-schema/schema-initializer#useschemainitializer). + +### 4. Реализация SchemaSettings + +#### 4.1 Определение SchemaSettings + +Добавленные через `createDocumentActionInitializerItem` элементы нельзя удалить. Для этого используйте [Schema Settings](https://client.docs.nocobase.com/core/ui-schema/schema-settings). + +Создайте файл `packages/plugins/@nocobase-sample/plugin-initializer-action-simple/src/client/settings/index.ts`: + +```ts +import { SchemaSettings } from "@nocobase/client"; + +import { ActionNameLowercase } from "../constants"; + +export const documentActionSettings = new SchemaSettings({ + name: `actionSettings:${ActionNameLowercase}`, + items: [ + { + name: 'remove', + type: 'remove', + } + ] +}); +``` + +#### 4.2 Регистрация SchemaSettings + +Обновите `index.tsx`: + +```diff +import { Plugin } from '@nocobase/client'; +import { useDocumentActionProps } from './schema'; ++ import { documentActionSettings } from './settings'; + +export class PluginInitializerActionSimpleClient extends Plugin { + async load() { + this.app.addScopes({ useDocumentActionProps }); ++ this.app.schemaSettingsManager.add(documentActionSettings); + } +} + +export default PluginInitializerActionSimpleClient; +``` + +#### 4.3 Использование SchemaSettings + +Обновите `createDocumentActionSchema` в `schema/index.ts`: + +```diff ++ import { documentActionSettings } from '../settings'; + +export const createDocumentActionSchema = (blockComponent: string): ISchema & { 'x-doc-url': string } => { + return { + type: 'void', + 'x-component': 'Action', ++ 'x-settings': documentActionSettings.name, + // ... + } +} +``` + +### 5. Добавление в Configure Actions + +Кнопки `Configure actions` имеют разные имена (`name`). Необходимо добавить действие в блоки `Table`, `Details` и `Form`. + +Определите соответствующие имена (см. документацию TODO). + +Обновите `index.tsx`: + +```diff +import { Plugin } from '@nocobase/client'; +import { useDocumentActionProps } from './schema'; +import { documentActionSettings } from './settings'; ++ import { createDocumentActionInitializerItem } from './initializer'; + +export class PluginInitializerActionSimpleClient extends Plugin { + async load() { + this.app.addScopes({ useDocumentActionProps }); + this.app.schemaSettingsManager.add(documentActionSettings); ++ this.app.schemaInitializerManager.addItem('table:configureActions', 'document', createDocumentActionInitializerItem('table-v2')); ++ this.app.schemaInitializerManager.addItem('details:configureActions', 'document', createDocumentActionInitializerItem('details')); ++ this.app.schemaInitializerManager.addItem('createForm:configureActions', 'document', createDocumentActionInitializerItem('form-v2')); + } +} + +export default PluginInitializerActionSimpleClient; +``` + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240522-185359.mp4" type="video/mp4" /> +</video> + +### 6. Мультиязычность + +После изменения файлов мультиязычности необходимо перезапустить сервис, чтобы изменения вступили в силу. + +#### 6.1 Английский + +Обновите `en-US.json`: + +```json +{ + "Document": "Document" +} +``` + +#### 6.2 Китайский + +Обновите `zh-CN.json`: + +```json +{ + "Document": "文档" +} +``` + +Для поддержки других языков добавьте соответствующие файлы. + +Добавьте языки через [http://localhost:13000/admin/settings/system-settings](http://localhost:13000/admin/settings/system-settings) и переключайте их в правом верхнем углу. + +![20240611113758](https://static-docs.nocobase.com/20240611113758.png) + +### 7. Сборка и развертывание в продакшен + +Следуйте инструкциям из [Сборка и упаковка плагина](/development/your-fisrt-plugin#сборка-и-упаковка-плагина). + +Для клонированного исходного кода выполните полную сборку: + +```bash +yarn build +``` + +Для проекта, созданного с помощью `create-nocobase-app`: + +```bash +yarn build @nocobase-sample/plugin-initializer-action-simple --tar +``` + +Архив плагина появится в `storage/tar/@nocobase-sample/plugin-initializer-action-simple.tar.gz`. Установите его через [загрузку](/welcome/getting-started/plugin). diff --git a/docs/ru-RU/plugin-samples/schema-initializer/block-data-modal.md b/docs/ru-RU/plugin-samples/schema-initializer/block-data-modal.md new file mode 100644 index 0000000000..3ef73a85d1 --- /dev/null +++ b/docs/ru-RU/plugin-samples/schema-initializer/block-data-modal.md @@ -0,0 +1,821 @@ +# Добавление блока данных с модальным окном (Data Block Modal) + +## Описание сценария + +В некоторых случаях перед созданием блока необходимо выбрать конфигурационные параметры. Например: +- Для блока `Kanban` нужно выбрать `Grouping field` и `Sorting field`. +- Для блока `Calendar` требуется указать `Title field`, `Start date field` и `End date field`. +- Для блока `Chart` необходимо настроить параметры диаграммы. + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240529223753_rec_.mp4" type="video/mp4" /> +</video> + +## Описание примера + +В этом примере создается блок `Timeline` на основе компонента [Timeline](https://ant.design/components/timeline) от Ant Design. Перед созданием блока пользователь должен выбрать поля `Time Field` и `Title Field`. + +Пример демонстрирует использование Initializer. Подробности о расширении блоков см. в документации [Расширения блоков](/plugin-samples/block). + +Полный код примера доступен в [plugin-samples](https://github.com/nocobase/plugin-samples/tree/main/packages/plugins/%40nocobase-sample/plugin-initializer-block-data-modal). + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240529223457_rec_.mp4" type="video/mp4" /> +</video> + +## Инициализация плагина + +Следуйте инструкциям из документации [Создание первого плагина](/development/your-fisrt-plugin). Если у вас нет проекта, создайте его. Если проект уже есть или вы клонировали исходный код, пропустите этот шаг. + +```bash +yarn create nocobase-app my-nocobase-app -d sqlite +cd my-nocobase-app +yarn install +yarn nocobase install +``` + +Инициализируйте плагин и добавьте его в систему: + +```bash +yarn pm create @nocobase-sample/plugin-initializer-block-data-modal +yarn pm enable @nocobase-sample/plugin-initializer-block-data-modal +``` + +Запустите проект: + +```bash +yarn dev +``` + +После входа в систему перейдите по адресу [http://localhost:13000/admin/pm/list/local/](http://localhost:13000/admin/pm/list/local/), чтобы убедиться, что плагин установлен и активирован. + +## Реализация функциональности + +Перед началом работы с этим примером ознакомьтесь с основными концепциями: + +- [Компонент Timeline от Ant Design](https://ant.design/components/timeline) +- [Руководство по SchemaInitializer](/development/client/ui-schema/initializer): Используется для добавления блоков, полей, операций и других элементов в интерфейс. +- [API SchemaInitializer](https://client.docs.nocobase.com/core/ui-schema/schema-initializer): Описание API для добавления элементов в интерфейс. +- [UI Schema](/development/client/ui-schema/what-is-ui-schema): Используется для определения структуры и стилей интерфейса. +- [Дизайнер Designable](/development/client/ui-schema/designable): Используется для изменения схемы. + +Структура проекта: + +```bash +. +├── client # Клиентская часть плагина +│ ├── initializer # Инициализатор +│ ├── component # Компоненты блока +│ ├── index.tsx # Входной файл клиентского плагина +│ ├── locale.ts # Утилиты для мультиязычности +│ ├── constants.ts # Константы +│ ├── schema # Схемы +│ └── settings # Schema Settings +├── locale # Файлы локализации +│ ├── en-US.json # Английский +│ └── zh-CN.json # Китайский +├── index.ts # Входной файл серверного плагина +└── server # Серверная часть плагина +``` + +### 1. Определение имени + +Сначала определите имя блока, которое будет использоваться в различных местах. + +Создайте файл `packages/plugins/@nocobase-sample/plugin-initializer-block-data-modal/src/client/constants.ts`: + +```ts +export const BlockName = 'Timeline'; +export const BlockNameLowercase = BlockName.toLowerCase(); +``` + +### 2. Реализация компонента блока + +#### 2.1 Определение компонента блока + +В этом примере создается компонент блока `Timeline` с требованиями: +- Отображение временной шкалы на основе данных из выбранных полей. + +Создайте файл `packages/plugins/@nocobase-sample/plugin-initializer-block-data-modal/src/client/component/Timeline.tsx`: + +```tsx | pure +import React, { FC } from 'react'; +import { Timeline as AntdTimeline, TimelineProps as AntdTimelineProps, Spin } from 'antd'; +import { withDynamicSchemaProps } from "@nocobase/client"; +import { BlockName } from '../constants'; + +export interface TimelineProps { + data?: AntdTimelineProps['items']; + loading?: boolean; +} + +export const Timeline: FC<TimelineProps> = withDynamicSchemaProps((props) => { + const { data, loading } = props; + if (loading) return <div style={{ height: 100, textAlign: 'center' }}><Spin /></div> + return <AntdTimeline mode='left' items={data}></AntdTimeline> +}, { displayName: BlockName }); +``` + +Компонент `Timeline` — это функциональный компонент, обернутый в [withDynamicSchemaProps](/development/client/ui-schema/what-is-ui-schema#x-component-props-и-x-use-component-props), который принимает два параметра: +- `loading`: Статус загрузки данных. +- `data`: Свойство `items` компонента `Timeline`. + +#### 2.2 Регистрация компонента блока + +Зарегистрируйте компонент `Timeline` в системе через плагин. + +```tsx | pure +import { Plugin } from '@nocobase/client'; +import { Timeline } from './component'; + +export class PluginInitializerBlockDataModalClient extends Plugin { + async load() { + this.app.addComponents({ Timeline }) + } +} + +export default PluginInitializerBlockDataModalClient; +``` + +#### 2.3 Проверка компонента блока + +Существует два способа проверки компонента: +- Проверка через временную страницу: Создайте временную страницу, отрендерите компонент `Timeline` и проверьте, соответствует ли он требованиям. +- Проверка через документацию: Запустите документацию с помощью `yarn doc plugins/@nocobase-sample/plugin-initializer-block-data-modal` и проверьте через примеры в документации (TODO). + +Рассмотрим проверку через временную страницу. Создайте страницу, добавьте один или несколько компонентов `Timeline` с параметрами и проверьте их работу. + +```tsx | pure +import { Plugin } from '@nocobase/client'; +import { Timeline } from './component'; +import React from 'react'; + +export class PluginInitializerBlockDataModalClient extends Plugin { + async load() { + this.app.addComponents({ Timeline }) + + this.app.router.add('admin.timeline-block-component', { + path: '/admin/timeline-block-component', + Component: () => { + return <> + <div style={{ marginTop: 20, marginBottom: 20 }}> + <Timeline + data={[ + { + label: '2015-09-01', + children: 'user1', + }, + { + label: '2015-09-02', + children: 'user2', + }, + { + label: '2015-09-03', + children: 'user3', + }, + ]} /> + </div> + <div style={{ marginTop: 20, marginBottom: 20 }}> + <Timeline loading={true} /> + </div> + </> + } + }) + } +} + +export default PluginInitializerBlockDataModalClient; +``` + +Перейдите по адресу `http://localhost:13000/admin/timeline-block-component`, чтобы увидеть содержимое тестовой страницы. + +![20240529210122](https://static-docs.nocobase.com/20240529210122.png) + +После проверки удалите тестовую страницу. + +### 3. Определение формы конфигурации + +По требованиям, после выбора таблицы данных необходимо настроить поля `Time Field` и `Title Field`. Для этого создается форма конфигурации с именем `TimelineInitializerConfigForm`. + +#### 3.1 Определение компонента формы конфигурации + +Ознакомьтесь с основными концепциями: +- [Action](https://client.docs.nocobase.com/components/action) +- [Action.Modal](https://client.docs.nocobase.com/components/action#actionmodal): Модальное окно. +- [ActionContextProvider](https://client.docs.nocobase.com/components/action#actioncontext): Контекст действия. +- [SchemaComponent](https://client.docs.nocobase.com/core/ui-schema/schema-component#schemacomponent-1): Для рендеринга схемы. + +Создайте файл `packages/plugins/@nocobase-sample/plugin-initializer-block-data-modal/src/client/initializer/ConfigForm.tsx`: + +```tsx | pure +import React, { FC, useMemo } from "react"; +import { ISchema } from '@formily/react'; +import { ActionContextProvider, SchemaComponent, useApp, CollectionFieldOptions } from '@nocobase/client'; +import { useT } from "../locale"; + +const createSchema = (fields: CollectionFieldOptions, t: ReturnType<typeof useT>): ISchema => { + // TODO +} + +interface TimelineConfigFormValues { + timeField: string; + titleField: string; +} + +export interface TimelineConfigFormProps { + collection: string; + dataSource?: string; + onSubmit: (values: TimelineConfigFormValues) => void; + visible: boolean; + setVisible: (visible: boolean) => void; +} + +export const TimelineInitializerConfigForm: FC<TimelineConfigFormProps> = ({ visible, setVisible, collection, dataSource, onSubmit }) => { + const app = useApp(); + const fields = useMemo(() => app.getCollectionManager(dataSource).getCollection(collection).getFields(), [collection, dataSource]) + const t = useT(); + const schema = useMemo(() => createSchema(fields, t), [fields]); + + return <ActionContextProvider value={{ visible, setVisible }}> + <SchemaComponent schema={schema} /> + </ActionContextProvider> +} +``` + +Компонент `TimelineInitializerConfigForm` принимает следующие параметры: +- `visible`: Отображение формы. +- `setVisible`: Управление видимостью формы. +- `collection`: Имя таблицы данных. +- `dataSource`: Имя источника данных. +- `onSubmit`: Обработчик отправки формы. + +`collection` и `dataSource` определяются динамически при выборе таблицы данных. + +- [app](https://client.docs.nocobase.com/core/application/application): Получение экземпляра приложения через [useApp()](https://client.docs.nocobase.com/core/application/application#useapp). +- [app.getCollectionManager](https://client.docs.nocobase.com/core/application/application##appgetcollectionmanager): Получение экземпляра [CollectionManager](https://client.docs.nocobase.com/core/data-source/collection-manager). +- [getCollection](https://client.docs.nocobase.com/core/data-source/collection-manager#getcollectionpath): Получение таблицы данных. +- [getFields](https://client.docs.nocobase.com/core/data-source/collection#collectiongetfieldspredicate): Получение полей таблицы данных. + +[ActionContextProvider](https://client.docs.nocobase.com/components/action#actioncontext) передает `visible` и `setVisible` дочерним компонентам, а `SchemaComponent` рендерит схему. + +#### 3.2 Реализация схемы формы конфигурации + +Ознакомьтесь с: +- [FormV2](https://client.docs.nocobase.com/components/form-v2): Компонент формы. +- [Select](https://client.docs.nocobase.com/components/action#select): Компонент выбора. + +Добавьте в `ConfigForm.tsx` схему формы: + +```tsx | pure +const useCloseActionProps = () => { + const { setVisible } = useActionContext(); + return { + type: 'default', + onClick() { + setVisible(false); + }, + }; +}; + +const useSubmitActionProps = (onSubmit: (values: TimelineConfigFormValues) => void) => { + const { setVisible } = useActionContext(); + const form = useForm<TimelineConfigFormValues>(); + + return { + type: 'primary', + async onClick() { + await form.submit(); + const values = form.values; + onSubmit(values); + setVisible(false); + }, + }; +}; + +const createSchema = (fields: CollectionFieldOptions[]): ISchema => { + return { + type: 'void', + name: uid(), + 'x-component': 'Action.Modal', + 'x-component-props': { + width: 600, + }, + 'x-decorator': 'FormV2', + properties: { + titleField: { + type: 'string', + title: 'Title Field', + required: true, + enum: fields.map(item => ({ label: item.uiSchema?.title || item.name, value: item.name })), + 'x-decorator': 'FormItem', + 'x-component': 'Select', + }, + timeField: { + type: 'string', + title: 'Time Field', + required: true, + enum: fields.filter(item => item.type === 'date').map(item => ({ label: item.uiSchema?.title || item.name, value: item.name })), + 'x-decorator': 'FormItem', + 'x-component': 'Select', + }, + footer: { + type: 'void', + 'x-component': 'Action.Modal.Footer', + properties: { + close: { + title: 'Close', + 'x-component': 'Action', + 'x-component-props': { + type: 'default', + }, + 'x-use-component-props': 'useCloseActionProps', + }, + submit: { + title: 'Submit', + 'x-component': 'Action', + 'x-use-component-props': 'useSubmitActionProps', + }, + }, + }, + } + }; +} +``` + +Функция `createSchema` генерирует схему формы, принимая параметр `fields` (поля таблицы данных). Форма отображается в модальном окне и содержит два селектора: `Title Field` и `Time Field`, а также кнопки `Close` и `Submit`. + +- Кнопки `Close` и `Submit` используют хуки через [x-use-component-props](/development/client/ui-schema/what-is-ui-schema#x-component-props-и-x-use-component-props). +- `Title Field`: Можно выбрать любое поле. +- `Time Field`: Доступны только поля типа `date`. + +Обновите `TimelineInitializerConfigForm`, зарегистрировав `useSubmitActionProps` и `useCloseActionProps` в области видимости ([scope](/plugin-samples/component-and-scope/local)): + +```diff +- <SchemaComponent schema={schema}/> ++ <SchemaComponent schema={schema} scope={{ useSubmitActionProps: useSubmitActionProps.bind(null, onSubmit), useCloseActionProps }} /> +``` + +#### 3.3 Проверка формы конфигурации + +Добавьте проверку в `index.tsx`: + +```tsx | pure +import { Plugin } from '@nocobase/client'; +import { Timeline } from './component'; +import React, { useState } from 'react'; +import { TimelineInitializerConfigForm } from './initializer/ConfigForm'; + +export class PluginInitializerBlockDataModalClient extends Plugin { + async load() { + this.app.addComponents({ Timeline }) + + this.app.router.add('admin.timeline-config-form', { + path: '/admin/timeline-config-form', + Component: () => { + const [visible, setVisible] = useState(true); + function onSubmit(values) { + console.log(values); + } + return <> + <div style={{ marginTop: 20, marginBottom: 20 }}> + <TimelineInitializerConfigForm visible={visible} onSubmit={onSubmit} setVisible={setVisible} collection='users' /> + </div> + </> + } + }) + } +} + +export default PluginInitializerBlockDataModalClient; +``` + +Перейдите по адресу `http://localhost:13000/admin/timeline-config-form`, чтобы увидеть содержимое тестовой страницы. + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240529215127_rec_.mp4" type="video/mp4" /> +</video> + +После проверки удалите тестовую страницу. + +### 4. Определение схемы блока + +#### 4.1 Определение схемы блока + +Динамические страницы в NocoBase рендерятся через схемы, поэтому необходимо определить схему для добавления блока `Timeline`. Ознакомьтесь с: +- [Протокол UI Schema](/development/client/ui-schema/what-is-ui-schema): Подробное описание структуры схемы. +- [DataBlockProvider](https://client.docs.nocobase.com/core/data-block/data-block-provider): Провайдер данных блока. + +Создайте файл `packages/plugins/@nocobase-sample/plugin-initializer-block-data-modal/src/client/schema/index.tsx`: + +```ts +import { useDataBlockProps, useDataBlockRequest } from "@nocobase/client"; +import { TimelineProps } from '../component'; +import { BlockName, BlockNameLowercase } from "../constants"; + +interface GetTimelineSchemaOptions { + dataSource?: string; + collection: string; + titleField: string; + timeField: string; +} + +export function getTimelineSchema(options: GetTimelineSchemaOptions) { + return { + type: 'void', + "x-toolbar": "BlockSchemaToolbar", + 'x-decorator': 'DataBlockProvider', + 'x-decorator-props': { + dataSource, + collection, + action: 'list', + params: { + sort: `-${timeField}` + }, + [BlockNameLowercase]: { + titleField, + timeField, + } + }, + 'x-component': 'CardItem', + properties: { + [BlockNameLowercase]: { + type: 'void', + 'x-component': BlockName, + 'x-use-component-props': 'useTimelineProps', + } + } + } +} + +export function useTimelineProps(): TimelineProps { + const dataProps = useDataBlockProps(); + const props = dataProps[BlockNameLowercase]; + const { loading, data } = useDataBlockRequest<any[]>(); + return { + loading, + data: data?.data?.map((item) => ({ + label: item[props.timeField], + children: item[props.titleField], + })) + } +} +``` + +Ключевые моменты: +- `getTimelineSchema()`: Принимает `dataSource`, `collection`, `titleField`, `timeField` и возвращает схему для рендеринга блока `Timeline`. + - `type: 'void'`: Указывает, что узел не содержит данных. + - `x-decorator: 'DataBlockProvider'`: Провайдер данных блока, см. [DataBlockProvider](https://client.docs.nocobase.com/core/data-block/data-block-provider). + - `x-decorator-props`: Свойства `DataBlockProvider`: + - `dataSource`: Источник данных. + - `collection`: Таблица данных. + - `action: 'list'`: Операция получения списка данных. + - `params: { sort }`: Параметры запроса, сортировка по `timeField` в обратном порядке, см. [useRequest](https://client.docs.nocobase.com/core/request#userequest). + - `[BlockNameLowercase]`: Дополнительные свойства (`titleField`, `timeField`). + - `x-component: 'CardItem'`: Компонент [CardItem](https://client.docs.nocobase.com/components/card-item) для стилей и перетаскивания. + - `'x-component': 'Timeline'`: Компонент `Timeline`. + - `'x-use-component-props': 'useTimelineProps'`: Динамические свойства компонента, строковый тип для хранения в базе данных. +- `useTimelineProps()`: + - [useDataBlockProps](https://client.docs.nocobase.com/core/data-block/data-block-provider#usedatablockprops): Получает свойства `x-decorator-props`. + - [useDataBlockRequest](https://client.docs.nocobase.com/core/data-block/data-block-request-provider#usedatablockrequest): Получает данные запроса. + +Схема эквивалентна React-компоненту: + +```tsx | pure +<DataBlockProvider collection={collection} dataSource={dataSource} action='list' params={{ sort: `-${timeField}` }} timeline={{ titleField, timeField }}> + <CardItem> + <Timeline {...useTimelineProps()} /> + </CardItem> +</DataBlockProvider> +``` + +#### 4.2 Регистрация области видимости + +Обновите `index.tsx`, зарегистрировав `useTimelineProps`: + +```tsx | pure +import { Plugin } from '@nocobase/client'; +import { Timeline } from './component'; +import { useTimelineProps } from './schema'; + +export class PluginInitializerBlockDataModalClient extends Plugin { + async load() { + this.app.addComponents({ Timeline }) + this.app.addScopes({ useTimelineProps }); + } +} + +export default PluginInitializerBlockDataModalClient; +``` + +Подробности см. в [Глобальная регистрация Component и Scope](/plugin-samples/component-and-scope/global). + +#### 4.3 Проверка схемы блока + +Проверьте схему через временную страницу: + +```tsx | pure +import { Plugin, SchemaComponent } from '@nocobase/client'; +import { Timeline, getTimelineSchema, useTimelineProps } from './component'; +import React from 'react'; + +export class PluginInitializerBlockDataModalClient extends Plugin { + async load() { + // ... + + this.app.router.add('admin.timeline-schema', { + path: '/admin/timeline-schema', + Component: () => { + return <> + <div style={{ marginTop: 20, marginBottom: 20 }}> + <SchemaComponent schema={{ properties: { test1: getTimelineSchema({ collection: 'users', timeField: 'createdAt', titleField: 'nickname' }) } }} /> + </div> + </> + } + }) + } +} + +export default PluginInitializerBlockDataModalClient; +``` + +Перейдите по адресу `http://localhost:13000/admin/timeline-schema`. + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240529220626_rec_.mp4" type="video/mp4" /> +</video> + +После проверки удалите тестовую страницу. + +### 5. Определение элемента SchemaInitializer + +Создайте файл `packages/plugins/@nocobase-sample/plugin-initializer-block-data-modal/src/client/initializer/index.tsx`: + +```tsx | pure +import React, { useCallback, useState } from 'react'; +import { FieldTimeOutlined } from '@ant-design/icons'; +import { DataBlockInitializer, SchemaInitializerItemType, useSchemaInitializer } from "@nocobase/client"; + +import { getTimelineSchema } from '../schema'; +import { useT } from '../locale'; +import { TimelineConfigFormProps, TimelineInitializerConfigForm } from './ConfigForm'; +import { BlockName, BlockNameLowercase } from '../constants'; + +export const TimelineInitializerComponent = () => { + const { insert } = useSchemaInitializer(); + const [collection, setCollection] = useState<string>(); + const [dataSource, setDataSource] = useState<string>(); + const [showConfigForm, setShowConfigForm] = useState(false); + const t = useT() + + const onSubmit: TimelineConfigFormProps['onSubmit'] = useCallback((values) => { + const schema = getTimelineSchema({ collection, dataSource, timeField: values.timeField, titleField: values.titleField }); + insert(schema); + }, [collection, dataSource]) + + return <> + {showConfigForm && <TimelineInitializerConfigForm + visible={showConfigForm} + setVisible={setShowConfigForm} + onSubmit={onSubmit} + collection={collection} + dataSource={dataSource} + />} + <DataBlockInitializer + name={BlockNameLowercase} + title={t(BlockName)} + icon={<FieldTimeOutlined />} + componentType={BlockName} + onCreateBlockSchema={({ item }) => { + const { name: collection, dataSource } = item; + setCollection(collection); + setDataSource(dataSource); + setShowConfigForm(true); + }}> + + </DataBlockInitializer> + </> +} + +export const timelineInitializerItem: SchemaInitializerItemType = { + name: 'Timeline', + Component: TimelineInitializerComponent, +} +``` + +Процесс: +1. Пользователь выбирает таблицу данных, получая `collection` и `dataSource`. +2. Открывается форма `TimelineInitializerConfigForm` для выбора `timeField` и `titleField`. +3. После отправки формы создается схема и вставляется в страницу. + +Ключ — использование `DataBlockInitializer` (документация TODO). + +`timelineInitializerItem`: +- `name`: Уникальный идентификатор для операций. +- `Component`: В отличие от [Добавления простого блока Simple Block](/plugin-samples/schema-initializer/block-simple), где использовался `type`, здесь используется `Component`. См. [Два способа определения](https://client.docs.nocobase.com/core/ui-schema/schema-initializer#two-ways-to-define-component-and-type). + +`TimelineInitializerComponent`: +- `DataBlockInitializer`: + - `title`: Заголовок. + - `icon`: Иконка, см. [Ant Design Icons](https://ant.design/components/icon/). + - `componentType`: Тип компонента (`Timeline`). + - `onCreateBlockSchema`: Обработчик клика по таблице данных. + - [useSchemaInitializer](https://client.docs.nocobase.com/core/ui-schema/schema-initializer#useschemainitializer): Предоставляет методы вставки схемы. + +Подробности см. в [Schema Initializer](https://client.docs.nocobase.com/core/ui-schema/schema-initializer). + +### 6. Реализация SchemaSettings + +#### 6.1 Определение SchemaSettings + +Создайте файл `packages/plugins/@nocobase-sample/plugin-initializer-block-data-modal/src/client/settings/index.ts`: + +```ts +import { SchemaSettings } from "@nocobase/client"; + +export const timelineSettings = new SchemaSettings({ + name: 'blockSettings:info', + items: [ + { + type: 'remove', + name: 'remove', + componentProps: { + removeParentsIfNoChildren: true, + breakRemoveOn: { + 'x-component': 'Grid', + }, + } + } + ] +}) +``` + +- `componentProps`: + - `removeParentsIfNoChildren`: Удалять родительский узел, если нет дочерних. + - `breakRemoveOn`: Условие остановки удаления, предотвращает удаление `Grid`. + +#### 6.2 Регистрация SchemaSettings + +```ts +import { Plugin } from '@nocobase/client'; +import { timelineSettings } from './settings'; + +export class PluginInitializerBlockDataModalClient extends Plugin { + async load() { + // ... + this.app.schemaSettingsManager.add(timelineSettings) + } +} + +export default PluginInitializerBlockDataModalClient; +``` + +#### 6.3 Использование SchemaSettings + +Обновите `getTimelineSchema` в `schema/index.tsx`: + +```diff ++ import { timelineSettings } from '../settings'; + +export function getTimelineSchema(options: GetTimelineSchemaOptions) { + const { dataSource, collection, titleField, timeField } = options; + return { + type: 'void', + 'x-decorator': 'DataBlockProvider', ++ 'x-settings': timelineSettings.name, + // ... + } +} +``` + +### 7. Добавление в `Add block` + +Кнопки `Add block` имеют разные имена (`name`). + +![img_v3_02b4_049b0a62-8e3b-420f-adaf-a6350d84840g](https://static-docs.nocobase.com/img_v3_02b4_049b0a62-8e3b-420f-adaf-a6350d84840g.jpg) + +#### 7.1 Добавление в `Add block` на уровне страницы + +`name` для `Add block` на уровне страницы — `page:addBlock`, для группы `Data Blocks` — `dataBlocks` (см. документацию TODO). + +Обновите `index.tsx`: + +```tsx | pure +import { Plugin } from '@nocobase/client'; +import { Timeline } from './component'; +import { useTimelineProps } from './schema'; +import { timelineSettings } from './settings'; +import { timelineInitializerItem } from './timelineInitializerItem'; + +export class PluginInitializerBlockDataModalClient extends Plugin { + async load() { + this.app.addComponents({ Timeline }) + this.app.addScopes({ useTimelineProps }); + this.app.schemaSettingsManager.add(timelineSettings) + + this.app.schemaInitializerManager.addItem('page:addBlock', `dataBlocks.${timelineInitializerItem.name}`, timelineInitializerItem) + } +} + +export default PluginInitializerBlockDataModalClient; +``` + +<video controls width='100%' src="https://static-docs.nocobase.com/20240529222118_rec_.mp4"></video> + +#### 7.2 Добавление в `Add block` во всплывающем окне + +Для блока `Table` во всплывающем окне `Add new` `name` — `popup:addNew:addBlock`, для `Data Blocks` — `dataBlocks`. + +Обновите `index.tsx`: + +```diff +import { Plugin } from '@nocobase/client'; +import { Timeline } from './component'; +import { useTimelineProps } from './schema'; +import { timelineSettings } from './settings'; +import { timelineInitializerItem } from './timelineInitializerItem'; + +export class PluginInitializerBlockDataModalClient extends Plugin { + async load() { + this.app.addComponents({ Timeline }) + this.app.addScopes({ useTimelineProps }); + this.app.schemaSettingsManager.add(timelineSettings) + this.app.schemaInitializerManager.addItem('page:addBlock', `dataBlocks.${timelineInitializerItem.name}`, timelineInitializerItem) ++ this.app.schemaInitializerManager.addItem('popup:addNew:addBlock', `dataBlocks.${timelineInitializerItem.name}`, timelineInitializerItem); + } +} + +export default PluginInitializerBlockDataModalClient; +``` + +![20240529223046](https://static-docs.nocobase.com/20240529223046.png) + +#### 7.3 Добавление в `Add block` мобильной версии + +Активируйте плагин мобильной версии (см. [Активация плагина](/welcome/getting-started/plugin#3-activate-the-plugin)). + +Обновите `index.tsx`: + +```ts +// ... + +export class PluginInitializerBlockDataModalClient extends Plugin { + async load() { + // ... + this.app.schemaInitializerManager.addItem('mobilePage:addBlock', `dataBlocks.${timelineInitializerItem.name}`, timelineInitializerItem); + } +} + +export default PluginInitializerBlockDataModalClient; +``` + +![20240529223307](https://static-docs.nocobase.com/20240529223307.png) + +Для других `Add block` достаточно знать их `name`. + +### 8. Мультиязычность + +#### 8.1 Английский + +Обновите `en-US.json`: + +```diff +{ + "Timeline": "Timeline", + "Title Field": "Title Field", + "Time Field": "Time Field" +} +``` + +#### 8.2 Китайский + +Обновите `zh-CN.json`: + +```diff +{ + "Timeline": "时间线", + "Title Field": "标题字段", + "Time Field": "时间字段" +} +``` + +Добавьте языки через [http://localhost:13000/admin/settings/system-settings](http://localhost:13000/admin/settings/system-settings) и переключайте их в правом верхнем углу. + +![20240611113758](https://static-docs.nocobase.com/20240611113758.png) + +## Сборка и развертывание в продакшен + +Следуйте инструкциям из документации [Сборка и упаковка плагина](/development/your-fisrt-plugin#сборка-и-упаковка-плагина). + +Для клонированного исходного кода выполните полную сборку: + +```bash +yarn build +``` + +Для проекта, созданного с помощью `create-nocobase-app`: + +```bash +yarn build @nocobase-sample/plugin-initializer-block-data-modal --tar +``` + +Архив плагина появится в `storage/tar/@nocobase-sample/plugin-initializer-block-data-modal.tar.gz`. Установите его через [загрузку](/welcome/getting-started/plugin). diff --git a/docs/ru-RU/plugin-samples/schema-initializer/block-data.md b/docs/ru-RU/plugin-samples/schema-initializer/block-data.md new file mode 100644 index 0000000000..553d19aec2 --- /dev/null +++ b/docs/ru-RU/plugin-samples/schema-initializer/block-data.md @@ -0,0 +1,559 @@ +# Добавление блоков данных + +## Описание сценария + +В NocoBase есть множество кнопок `Add block`, которые используются для добавления блоков в интерфейс. Некоторые из них связаны с таблицами данных и называются блоками данных (`Data Block`), а другие, не связанные с данными, называются простыми блоками (`Simple Block`). + +![img_v3_02b4_170eddb5-d3b4-461e-b74b-f83250941e5g](https://static-docs.nocobase.com/img_v3_02b4_170eddb5-d3b4-461e-b74b-f83250941e5g.jpg) + +Однако существующие типы блоков не всегда удовлетворяют потребности, поэтому может потребоваться создание пользовательских блоков. Данная статья посвящена созданию блоков данных (`Data Block`). + +## Описание примера + +В этом примере будет создан блок `Info`, который будет добавлен в меню `Add block` на страницах (`Page`), в таблицах (`Table`) и в мобильной версии. + +Этот пример демонстрирует использование Initializer. Подробности о расширении блоков см. в документации [Расширения блоков](/plugin-samples/block). + +Полный код примера доступен в [plugin-samples](https://github.com/nocobase/plugin-samples/tree/main/packages/plugins/%40nocobase-sample/plugin-initializer-block-data). + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240522-182547.mp4" type="video/mp4" /> +</video> + +## Инициализация плагина + +Следуйте инструкциям из документации [Создание первого плагина](/development/your-fisrt-plugin). Если у вас нет проекта, создайте его. Если проект уже есть или вы клонировали исходный код, пропустите этот шаг. + +```bash +yarn create nocobase-app my-nocobase-app -d sqlite +cd my-nocobase-app +yarn install +yarn nocobase install +``` + +Затем инициализируйте плагин и добавьте его в систему: + +```bash +yarn pm create @nocobase-sample/plugin-initializer-block-data +yarn pm enable @nocobase-sample/plugin-initializer-block-data +``` + +Запустите проект: + +```bash +yarn dev +``` + +После входа в систему перейдите по адресу [http://localhost:13000/admin/pm/list/local/](http://localhost:13000/admin/pm/list/local/), чтобы убедиться, что плагин установлен и активирован. + +## Реализация функциональности + +Перед началом работы с этим примером необходимо ознакомиться с основными концепциями: + +- [Руководство по SchemaInitializer](/development/client/ui-schema/initializer): Используется для добавления блоков, полей, операций и других элементов в интерфейс. +- [API SchemaInitializer](https://client.docs.nocobase.com/core/ui-schema/schema-initializer): Описание API для добавления элементов в интерфейс. +- [UI Schema](/development/client/ui-schema/what-is-ui-schema): Используется для определения структуры и стилей интерфейса. +- [Дизайнер Designable](/development/client/ui-schema/designable): Используется для изменения схемы. + +Структура проекта: + +```bash +. +├── client # Клиентская часть плагина +│ ├── initializer # Инициализатор +│ ├── component # Компоненты блока +│ ├── index.tsx # Входной файл клиентского плагина +│ ├── locale.ts # Утилиты для мультиязычности +│ ├── constants.ts # Константы +│ ├── schema # Схемы +│ └── settings # Schema Settings +├── locale # Файлы локализации +│ ├── en-US.json # Английский +│ └── zh-CN.json # Китайский +├── index.ts # Входной файл серверного плагина +└── server # Серверная часть плагина +``` + +### 1. Определение имен + +Сначала необходимо определить имя блока, которое будет использоваться в различных местах. + +Создайте файл `packages/plugins/@nocobase-sample/plugin-initializer-block-data/src/client/constants.ts`: + +```ts +export const BlockName = 'Info'; +export const BlockNameLowercase = BlockName.toLowerCase(); +``` + +### 2. Реализация компонентов блока + +#### 2.1 Определение компонента блока + +В этом примере создается компонент блока `Info` с следующими требованиями: + +- Отображение имени текущей таблицы данных блока. +- Отображение списка данных текущего блока. + +Создайте файл `packages/plugins/@nocobase-sample/plugin-initializer-block-data/src/client/component/Info.tsx`: + +```tsx | pure +import React, { FC } from 'react'; +import { withDynamicSchemaProps } from '@nocobase/client' +import { BlockName } from '../constants'; + +export interface InfoProps { + collectionName: string; + data?: any[]; + loading?: boolean; +} + +export const Info: FC<InfoProps> = withDynamicSchemaProps(({ collectionName, data }) => { + return <div> + <div>Collection: {collectionName}</div> + <div>Data list: <pre>{JSON.stringify(data, null, 2)}</pre></div> + </div> +}, { displayName: BlockName }) +``` + +Компонент `Info` — это функциональный компонент, обернутый в [withDynamicSchemaProps](/development/client/ui-schema/what-is-ui-schema#x-component-props-и-x-use-component-props), который обрабатывает динамические свойства из схемы. + +Без учета `withDynamicSchemaProps` компонент `Info` является простым функциональным компонентом. + +Экспортируйте компонент в `packages/plugins/@nocobase-sample/plugin-initializer-block-data/src/client/component/index.ts`: + +```tsx | pure +export * from './Info'; +``` + +#### 2.2 Регистрация компонента блока + +Зарегистрируйте компонент `Info` в системе через плагин. + +```tsx | pure +import { Plugin } from '@nocobase/client'; +import { Info } from './component'; + +export class PluginInitializerBlockDataClient extends Plugin { + async load() { + this.app.addComponents({ Info }) + } +} + +export default PluginInitializerBlockDataClient; +``` + +#### 2.3 Проверка компонента блока + +Существует два способа проверки компонента: + +- Проверка через временную страницу: Создайте временную страницу, отрендерите компонент `Info` и проверьте, соответствует ли он требованиям. +- Проверка через документацию: Запустите документацию с помощью `yarn doc plugins/@nocobase-sample/plugin-initializer-block-data` и проверьте через примеры в документации (TODO). + +Рассмотрим проверку через временную страницу. Создайте страницу, добавьте компонент `Info` с параметрами и проверьте его работу. + +```tsx | pure +import React from 'react'; +import { Plugin } from '@nocobase/client'; +import { Info } from './component'; + +export class PluginInitializerBlockDataClient extends Plugin { + async load() { + this.app.addComponents({ Info }) + + this.app.router.add('admin.info-component', { + path: '/admin/info-component', + Component: () => { + return <> + <div style={{ marginTop: 20, marginBottom: 20 }}> + <Info collectionName='test' data={[{ id: 1 }, { id: 2 }]} /> + </div> + </> + } + }) + } +} + +export default PluginInitializerBlockDataClient; +``` + +Перейдите по адресу `http://localhost:13000/admin/info-component`, чтобы увидеть содержимое тестовой страницы. + +![20240526165834](https://static-docs.nocobase.com/20240526165834.png) + +После проверки удалите тестовую страницу. + +### 3. Определение схемы блока + +#### 3.1 Определение схемы блока + +Динамические страницы в NocoBase рендерятся через схемы, поэтому необходимо определить схему для добавления блока `Info` в интерфейс. Перед этим ознакомьтесь с: + +- [Протокол UI Schema](/development/client/ui-schema/what-is-ui-schema): Подробное описание структуры схемы и роли каждого свойства. +- [DataBlockProvider](https://client.docs.nocobase.com/core/data-block/data-block-provider): Провайдер данных блока. + +Создайте файл `packages/plugins/@nocobase-sample/plugin-initializer-block-data/src/client/schema/index.ts`: + +```ts +import { useCollection, useDataBlockRequest } from "@nocobase/client"; + +import { InfoProps } from "../component"; +import { BlockName, BlockNameLowercase } from "../constants"; + +export function useInfoProps(): InfoProps { + const collection = useCollection(); + const { data, loading } = useDataBlockRequest<any[]>(); + + return { + collectionName: collection.name, + data: data?.data, + loading: loading + } +} + +export function getInfoSchema({ dataSource = 'main', collection }) { + return { + type: 'void', + 'x-decorator': 'DataBlockProvider', + 'x-decorator-props': { + dataSource, + collection, + action: 'list', + }, + 'x-component': 'CardItem', + "x-toolbar": "BlockSchemaToolbar", + properties: { + [BlockNameLowercase]: { + type: 'void', + 'x-component': BlockName, + 'x-use-component-props': 'useInfoProps', + } + } + } +} +``` + +Два ключевых момента: + +- `getInfoSchema()`: Определена как функция, поскольку `dataSource` и `collection` динамически определяются при выборе таблицы данных. +- `useInfoProps()`: Используется для обработки динамических свойств компонента `Info`. Поскольку схема сохраняется в базе данных, значение должно быть строкового типа. + +`getInfoSchema()`: +- `type: 'void'`: Указывает, что узел не содержит данных. +- `x-decorator: 'DataBlockProvider'`: Провайдер данных блока, предоставляет данные. Подробности см. в [DataBlockProvider](https://client.docs.nocobase.com/core/data-block/data-block-provider). +- `x-decorator-props`: Свойства `DataBlockProvider`: + - `dataSource`: Источник данных. + - `collection`: Таблица данных. + - `action: 'list'`: Тип операции, здесь получение списка данных. +- `x-component: 'CardItem'`: Компонент [CardItem](https://client.docs.nocobase.com/components/card-item), оборачивает блоки для стилей, компоновки и функциональности перетаскивания. +- `"x-toolbar": "BlockSchemaToolbar"`: Используется для отображения имени текущей таблицы в левом верхнем углу, обычно применяется с `DataBlockProvider`. +- `properties`: Подузлы, здесь `info` — информационный блок. + +`useInfoProps()`: +- [useCollection](https://client.docs.nocobase.com/core/data-source/collection-provider#usecollection): Получает текущую таблицу данных, предоставляемую [DataBlockProvider](https://client.docs.nocobase.com/core/data-block/data-block-provider). +- [useDataBlockRequest](https://client.docs.nocobase.com/core/data-block/data-block-request-provider#usedatablockrequest): Получает запрос данных блока, предоставляемый [DataBlockProvider](https://client.docs.nocobase.com/core/data-block/data-block-provider). + +Эта схема эквивалентна следующему React-компоненту: + +```tsx | pure +<DataBlockProvider collection={collection} dataSource={dataSource} action='list'> + <CardItem> + <Info {...useInfoProps()} /> + </CardItem> +</DataBlockProvider> +``` + +#### 3.2 Регистрация области видимости (scope) + +Зарегистрируйте `useInfoProps` в системе, чтобы [x-use-component-props](/development/client/ui-schema/what-is-ui-schema#x-component-props-и-x-use-component-props) мог найти соответствующую область видимости. + +```tsx | pure +import { Plugin } from '@nocobase/client'; +import { Info } from './component'; +import { useInfoProps } from './schema'; + +export class PluginInitializerBlockDataClient extends Plugin { + async load() { + this.app.addComponents({ Info }) + this.app.addScopes({ useInfoProps }); + } +} + +export default PluginInitializerBlockDataClient; +``` + +Подробности об области видимости см. в [Глобальная регистрация Component и Scope](/plugin-samples/component-and-scope/global). + +#### 3.3 Проверка схемы блока + +Аналогично проверке компонента, схему можно проверить через временную страницу или примеры в документации. Рассмотрим проверку через временную страницу: + +```tsx | pure +import React from 'react'; +import { Plugin, SchemaComponent, SchemaComponentOptions } from '@nocobase/client'; +import { Info } from './component'; +import { getInfoSchema, useInfoProps } from './schema'; + +export class PluginInitializerBlockDataClient extends Plugin { + async load() { + // ... + this.app.router.add('admin.info-schema', { + path: '/admin/info-schema', + Component: () => { + return <> + <div style={{ marginTop: 20, marginBottom: 20 }}> + <SchemaComponent schema={{ properties: { test1: getInfoSchema({ collection: 'users' }) } }} /> + </div> + + <div style={{ marginTop: 20, marginBottom: 20 }}> + <SchemaComponent schema={{ properties: { test2: getInfoSchema({ collection: 'roles' }) } }} /> + </div> + </> + } + }) + } +} + +export default PluginInitializerBlockDataClient; +``` + +- [SchemaComponentOptions](https://client.docs.nocobase.com/core/ui-schema/schema-component#schemacomponentoptions): Используется для передачи компонентов и области видимости, необходимых в схеме. Подробности см. в [Локальная регистрация Component и Scope](/plugin-samples/component-and-scope/local). +- [SchemaComponent](https://client.docs.nocobase.com/core/ui-schema/schema-component#schemacomponent-1): Используется для рендеринга схемы. + +Перейдите по адресу [http://localhost:13000/admin/info-schema](http://localhost:13000/admin/info-schema), чтобы увидеть содержимое тестовой страницы. + +![20240526170053](https://static-docs.nocobase.com/20240526170053.png) + +После проверки удалите тестовую страницу. + +### 4. Определение элемента SchemaInitializer + +Создайте файл `packages/plugins/@nocobase-sample/plugin-initializer-block-data/src/client/initializer/index.tsx`: + +```tsx | pure +import React from 'react'; +import { SchemaInitializerItemType, useSchemaInitializer } from '@nocobase/client' +import { CodeOutlined } from '@ant-design/icons'; + +import { getInfoSchema } from '../schema' +import { useT } from '../locale'; +import { BlockName, BlockNameLowercase } from '../constants'; + +export const infoInitializerItem: SchemaInitializerItemType = { + name: BlockNameLowercase, + Component: 'DataBlockInitializer', + useComponentProps() { + const { insert } = useSchemaInitializer(); + const t = useT(); + return { + title: t(BlockName), + icon: <CodeOutlined />, + componentType: BlockName, + useTranslationHooks: useT, + onCreateBlockSchema({ item }) { + insert(getInfoSchema({ dataSource: item.dataSource, collection: item.name })) + }, + }; + }, +} +``` + +Ключ к реализации блока данных — использование `DataBlockInitializer` (документация TODO). + +`infoInitializerItem`: +- `Component`: В отличие от [Добавления простого блока Simple Block](/plugin-samples/schema-initializer/block-simple), где использовался `type`, здесь используется `Component`. Оба способа допустимы, см. [Два способа определения компонента и типа](https://client.docs.nocobase.com/core/ui-schema/schema-initializer#two-ways-to-define-component-and-type). +- `useComponentProps`: Свойства компонента `DataBlockInitializer`: + - `title`: Заголовок. + - `icon`: Иконка, список доступных иконок см. в [Ant Design Icons](https://ant.design/components/icon/). + - `componentType`: Тип компонента, здесь `Info`. + - `onCreateBlockSchema`: Обработчик клика по таблице данных: + - `item`: Информация о выбранной таблице: + - `item.name`: Имя таблицы. + - `item.dataSource`: Источник данных таблицы. + - [useSchemaInitializer](https://client.docs.nocobase.com/core/ui-schema/schema-initializer#useschemainitializer): Предоставляет методы для вставки схемы. +- `"x-toolbar": "BlockSchemaToolbar"`: Используется для отображения имени текущей таблицы в левом верхнем углу, обычно применяется с `DataBlockProvider`. + +Подробности о создании SchemaInitializer см. в [Schema Initializer](https://client.docs.nocobase.com/core/ui-schema/schema-initializer). + +### 5. Реализация SchemaSettings + +#### 5.1 Определение SchemaSettings + +Для полноценного блока требуется SchemaSettings для настройки свойств и операций. В этом примере реализована только операция `remove`, так как SchemaSettings не является основным фокусом. + +Создайте файл `packages/plugins/@nocobase-sample/plugin-initializer-block-data/src/client/settings/index.ts`: + +```ts +import { SchemaSettings } from "@nocobase/client"; +import { BlockNameLowercase } from "../constants"; + +export const infoSettings = new SchemaSettings({ + name: `blockSettings:${BlockNameLowercase}`, + items: [ + { + type: 'remove', + name: 'remove', + componentProps: { + removeParentsIfNoChildren: true, + breakRemoveOn: { + 'x-component': 'Grid', + }, + } + } + ] +}) +``` + +#### 5.2 Регистрация SchemaSettings + +```ts +import { Plugin } from '@nocobase/client'; +import { infoSettings } from './settings'; + +export class PluginInitializerBlockDataClient extends Plugin { + async load() { + // ... + this.app.schemaSettingsManager.add(infoSettings) + } +} + +export default PluginInitializerBlockDataClient; +``` + +#### 5.3 Использование SchemaSettings + +Обновите метод `getInfoSchema` в `packages/plugins/@nocobase-sample/plugin-initializer-block-data/src/client/schema/index.ts`, добавив `x-settings`: + +```diff ++ import { infoSettings } from "../settings"; + +export function getInfoSchema({ dataSource = 'main', collection }) { + return { + type: 'void', + 'x-decorator': 'DataBlockProvider', ++ 'x-settings': infoSettings.name, + // ... + } +} +``` + +### 6. Добавление в `Add block` + +В системе есть множество кнопок `Add block`, но их имена (`name`) различны. + +![img_v3_02b4_049b0a62-8e3b-420f-adaf-a6350d84840g](https://static-docs.nocobase.com/img_v3_02b4_049b0a62-8e3b-420f-adaf-a6350d84840g.jpg) + +#### 6.1 Добавление в `Add block` на уровне страницы + +Чтобы добавить блок в `Add block` на уровне страницы, необходимо знать соответствующий `name`. Способ получения `name` описан в документации (TODO). + +Из изображения видно, что `Add block` на уровне страницы имеет `name` `page:addBlock`, а группа `Data Blocks` — `name` `dataBlocks`. + +Обновите файл `packages/plugins/@nocobase-sample/plugin-initializer-block-data/src/client/index.tsx`: + +```tsx | pure +import { Plugin } from '@nocobase/client'; +import { Info } from './component'; +import { useInfoProps } from './schema'; +import { infoSettings } from './settings'; +import { infoInitializerItem } from './initializer'; + +export class PluginDataBlockInitializerClient extends Plugin { + async load() { + this.app.addComponents({ Info }); + this.app.addScopes({ useInfoProps }); + + this.app.schemaSettingsManager.add(infoSettings); + + this.app.schemaInitializerManager.addItem('page:addBlock', `dataBlocks.${infoInitializerItem.name}`, infoInitializerItem) + } +} + +export default PluginDataBlockInitializerClient; +``` + +<video controls width='100%' src="https://static-docs.nocobase.com/20240526170424_rec_.mp4"></video> + +#### 6.2 Добавление в `Add block` во всплывающем окне + +Необходимо добавить блок в `Add block` во всплывающем окне `Add new` блока `Table`. + +![img_v3_02b4_fc47fe3a-35a1-4186-999c-0b48e6e001dg](https://static-docs.nocobase.com/img_v3_02b4_fc47fe3a-35a1-4186-999c-0b48e6e001dg.jpg) + +Аналогично, определите `name` для `Add block` блока `Table`, который равен `popup:addNew:addBlock`, а для группы `Data Blocks` — `dataBlocks`. + +Обновите файл `packages/plugins/@nocobase-sample/plugin-initializer-block-data/src/client/index.tsx`: + +```diff +import { Plugin } from '@nocobase/client'; +import { Info } from './component'; +import { useInfoProps } from './schema'; +import { infoSettings } from './settings'; +import { infoInitializerItem } from './initializer'; + +export class PluginDataBlockInitializerClient extends Plugin { + async load() { + this.app.addComponents({ Info }); + this.app.addScopes({ useInfoProps }); + + this.app.schemaSettingsManager.add(infoSettings); + + this.app.schemaInitializerManager.addItem('page:addBlock', `dataBlocks.${infoInitializerItem.name}`, infoInitializerItem) ++ this.app.schemaInitializerManager.addItem('popup:addNew:addBlock', `dataBlocks.${infoInitializerItem.name}`, infoInitializerItem) + } +} + +export default PluginDataBlockInitializerClient; +``` + +![img_v3_02b4_7062bfab-5a7b-439c-b385-92c5704b6b3g](https://static-docs.nocobase.com/img_v3_02b4_7062bfab-5a7b-439c-b385-92c5704b6b3g.jpg) + +#### 6.3 Добавление в `Add block` мобильной версии + +> Сначала активируйте плагин для мобильной версии, см. [Активация плагина](/welcome/getting-started/plugin#3-activate-the-plugin). + +Добавьте блок в `Add block` мобильной версии. Способ получения `name` здесь не описывается. + +Обновите файл `packages/plugins/@nocobase-sample/plugin-initializer-block-data/src/client/index.tsx`: + +```diff +import { Plugin } from '@nocobase/client'; +import { Info } from './component'; +import { useInfoProps } from './schema'; +import { infoSettings } from './settings'; +import { infoInitializerItem } from './initializer'; + +export class PluginDataBlockInitializerClient extends Plugin { + async load() { + this.app.addComponents({ Info }); + this.app.addScopes({ useInfoProps }); + + this.app.schemaSettingsManager.add(infoSettings); + + this.app.schemaInitializerManager.addItem('page:addBlock', `dataBlocks.${infoInitializerItem.name}`, infoInitializerItem) + this.app.schemaInitializerManager.addItem('popup:addNew:addBlock', `dataBlocks.${infoInitializerItem.name}`, infoInitializerItem) ++ this.app.schemaInitializerManager.addItem('mobilePage:addBlock', `dataBlocks.${infoInitializerItem.name}`, infoInitializerItem) + } +} + +export default PluginDataBlockInitializerClient; +``` + +Для добавления в другие `Add block` достаточно знать соответствующий `name`. + +## Сборка и развертывание в продакшен + +Следуйте инструкциям из документации [Сборка и упаковка плагина](/development/your-fisrt-plugin#сборка-и-упаковка-плагина) для сборки и развертывания плагина. + +Если вы используете клонированный исходный код, выполните полную сборку, чтобы собрать зависимости плагина: + +```bash +yarn build +``` + +Если проект создан с помощью `create-nocobase-app`, выполните: + +```bash +yarn build @nocobase-sample/plugin-initializer-block-data --tar +``` + +После этого в папке `storage/tar/@nocobase-sample/plugin-initializer-block-data.tar.gz` появится архив плагина. Установите его через [загрузку](/welcome/getting-started/plugin). diff --git a/docs/ru-RU/plugin-samples/schema-initializer/block-simple.md b/docs/ru-RU/plugin-samples/schema-initializer/block-simple.md new file mode 100644 index 0000000000..2b78b9fe40 --- /dev/null +++ b/docs/ru-RU/plugin-samples/schema-initializer/block-simple.md @@ -0,0 +1,467 @@ +# Добавление нового простого блока Simple Block + +## Описание сценария + +В NocoBase существует множество кнопок `Add block`, которые используются для добавления блоков в интерфейс. Некоторые из них связаны с таблицами данных и называются блоками данных (`Data Block`), а другие, не связанные с данными, называются простыми блоками (`Simple Block`). + +![img_v3_02b4_a4529308-62e3-4fa7-be4d-5dcae332c49g](https://static-docs.nocobase.com/img_v3_02b4_a4529308-62e3-4fa7-be4d-5dcae332c49g.jpg) + +Однако существующие типы блоков не всегда удовлетворяют потребности, поэтому может потребоваться создание пользовательских блоков. Данная статья посвящена созданию простого блока `Simple Block`. + +## Описание примера + +В этом примере будет создан блок для отображения изображений, который будет добавлен в меню `Add block` на страницах (`Page`), в таблицах (`Table`) и в мобильной версии. + +Этот пример демонстрирует использование Initializer. Подробности о расширении блоков см. в документации [Расширения блоков](/plugin-samples/block). + +Полный код примера доступен в [plugin-samples](https://github.com/nocobase/plugin-samples/tree/main/packages/plugins/%40nocobase-sample/plugin-initializer-block-simple). + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240522-181816.mp4" type="video/mp4" /> +</video> + +## Инициализация плагина + +Следуйте инструкциям из документации [Создание первого плагина](/development/your-fisrt-plugin). Если у вас нет проекта, создайте его. Если проект уже есть или вы клонировали исходный код, пропустите этот шаг. + +```bash +yarn create nocobase-app my-nocobase-app -d sqlite +cd my-nocobase-app +yarn install +yarn nocobase install +``` + +Затем инициализируйте плагин и добавьте его в систему: + +```bash +yarn pm create @nocobase-sample/plugin-initializer-block-simple +yarn pm enable @nocobase-sample/plugin-initializer-block-simple +``` + +Запустите проект: + +```bash +yarn dev +``` + +После входа в систему перейдите по адресу [http://localhost:13000/admin/pm/list/local/](http://localhost:13000/admin/pm/list/local/), чтобы убедиться, что плагин установлен и активирован. + +## Реализация функциональности + +Перед началом работы с этим примером необходимо ознакомиться с основными концепциями: + +- [Руководство по SchemaInitializer](/development/client/ui-schema/initializer): Используется для добавления блоков, полей, операций и других элементов в интерфейс. +- [API SchemaInitializer](https://client.docs.nocobase.com/core/ui-schema/schema-initializer): Описание API для добавления элементов в интерфейс. +- [Протокол UI Schema](/development/client/ui-schema/what-is-ui-schema): Подробное описание структуры схемы и роли каждого свойства. +- [Дизайнер Designable](/development/client/ui-schema/designable): Используется для изменения схемы. + +Структура проекта: + +```bash +. +├── client # Клиентская часть плагина +│ ├── initializer # Инициализатор +│ ├── component # Компоненты блока +│ ├── index.tsx # Входной файл клиентского плагина +│ ├── locale.ts # Утилиты для мультиязычности +│ ├── constants.ts # Константы +│ ├── schema # Схемы +│ └── settings # Schema Settings +├── locale # Файлы локализации +│ ├── en-US.json # Английский +│ └── zh-CN.json # Китайский +├── index.ts # Входной файл серверного плагина +└── server # Серверная часть плагина +``` + +### 1. Определение имени + +Сначала необходимо определить имя блока, которое будет использоваться в различных местах. + +Создайте файл `packages/plugins/@nocobase-sample/plugin-initializer-block-simple/src/client/constants.ts`: + +```ts +export const BlockName = 'Image'; +export const BlockNameLowercase = BlockName.toLowerCase(); +``` + +### 2. Реализация компонента блока + +#### 2.1 Определение компонента блока + +В этом примере создается компонент блока для отображения изображений, названный `Image`. + +Создайте файл `packages/plugins/@nocobase-sample/plugin-initializer-block-simple/src/client/component/Image.tsx`: + +```tsx | pure +import React, { FC } from 'react'; +import { withDynamicSchemaProps } from '@nocobase/client'; +import { BlockName } from '../constants'; + +export const Image: FC<{ height?: number }> = withDynamicSchemaProps(({ height = 500 }) => { + return <div style={{ height }}> + <img + style={{ width: '100%', height: '100%', objectFit: 'cover' }} + src="https://picsum.photos/2000/500" + /> + </div> +}, { displayName: BlockName }) +``` + +Компонент `Image` — это функциональный компонент, обернутый в [withDynamicSchemaProps](/development/client/ui-schema/what-is-ui-schema#x-component-props-и-x-use-component-props), который обрабатывает динамические свойства из схемы. + +Без учета `withDynamicSchemaProps` компонент `Image` является простым функциональным компонентом. + +Экспортируйте компонент в `packages/plugins/@nocobase-sample/plugin-initializer-block-simple/src/client/component/index.ts`: + +```tsx | pure +export * from './Image'; +``` + +#### 2.2 Регистрация компонента блока + +Зарегистрируйте компонент `Image` в системе через плагин. + +```tsx | pure +import { Plugin } from '@nocobase/client'; +import { Image } from './component' + +export class PluginInitializerBlockSimpleClient extends Plugin { + async load() { + this.app.addComponents({ Image }) + } +} + +export default PluginInitializerBlockSimpleClient; +``` + +#### 2.3 Проверка компонента блока + +Существует два способа проверки компонента: + +- Проверка через временную страницу: Создайте временную страницу, отрендерите компонент `Image` и проверьте, соответствует ли он требованиям. +- Проверка через документацию: Запустите документацию с помощью `yarn doc plugins/@nocobase-sample/plugin-initializer-block-simple` и проверьте с помощью примеров в документации (TODO). + +Рассмотрим проверку через временную страницу. Создайте страницу, добавьте один или несколько компонентов `Image` с различными параметрами и проверьте их работу. + +```tsx | pure +import React from 'react'; +import { Plugin } from '@nocobase/client'; +import { Image } from './component' + +export class PluginInitializerBlockSimpleClient extends Plugin { + async load() { + this.app.addComponents({ Image }) + + this.app.router.add('admin.image-component', { + path: '/admin/image-component', + Component: () => { + return <> + <div style={{ marginTop: 20, marginBottom: 20 }}> + <Image /> + </div> + + <div style={{ marginTop: 20, marginBottom: 20 }}> + <Image height={400} /> + </div> + </> + } + }) + } +} + +export default PluginInitializerBlockSimpleClient; +``` + +Перейдите по адресу `http://localhost:13000/admin/image-component`, чтобы увидеть содержимое тестовой страницы. + +![20240526165057](https://static-docs.nocobase.com/20240526165057.png) + +После проверки удалите тестовую страницу. + +### 3. Определение схемы блока + +#### 3.1 Определение схемы блока + +Динамические страницы в NocoBase рендерятся через схемы, поэтому необходимо определить схему для добавления блока `Image` в интерфейс. Перед этим ознакомьтесь с: + +- [Протокол UI Schema](/development/client/ui-schema/what-is-ui-schema): Подробное описание структуры схемы и роли каждого свойства. + +Создайте файл `packages/plugins/@nocobase-sample/plugin-initializer-block-simple/src/client/schema/index.ts`: + +```tsx | pure +import { ISchema } from "@nocobase/client"; +import { BlockName, BlockNameLowercase } from "../constants"; + +export const imageSchema: ISchema = { + type: 'void', + 'x-component': 'CardItem', + properties: { + [BlockNameLowercase]: { + 'x-component': BlockName, + } + } +}; +``` + +Описание `imageSchema`: + +- `type`: Тип, здесь `void`, указывающий на чистый UI-узел без данных. +- `x-decorator`: Декоратор, здесь используется компонент [CardItem](https://client.docs.nocobase.com/components/card-item), который оборачивает блоки для обеспечения стилей, компоновки и функциональности перетаскивания. +- `x-component`: Компонент, здесь `Image`, ранее определенный компонент. + +Эта схема эквивалентна следующему React-компоненту: + +```tsx | pure +<CardItem> + <Image /> +</CardItem> +``` + +#### 3.2 Проверка схемы блока + +Аналогично проверке компонента, схему можно проверить через временную страницу или примеры в документации. Рассмотрим проверку через временную страницу: + +```tsx | pure +import React from 'react'; +import { Plugin, SchemaComponent } from '@nocobase/client'; +import { Image } from './component' +import { imageSchema } from './schema' + +export class PluginInitializerBlockSimpleClient extends Plugin { + async load() { + this.app.addComponents({ Image }) + + this.app.router.add('admin.image-schema', { + path: '/admin/image-schema', + Component: () => { + return <div style={{ marginTop: 20, marginBottom: 20 }}> + <SchemaComponent schema={{ properties: { test: imageSchema } }} /> + </div> + } + }) + } +} + +export default PluginInitializerBlockSimpleClient; +``` + +Подробности о `SchemaComponent` см. в [SchemaComponent](https://client.docs.nocobase.com/core/ui-schema/schema-component#schemacomponent-1). + +Перейдите по адресу [http://localhost:13000/admin/image-schema](http://localhost:13000/admin/image-schema), чтобы увидеть содержимое тестовой страницы. + +![20240526165408](https://static-docs.nocobase.com/20240526165408.png) + +После проверки удалите тестовую страницу. + +### 4. Определение элемента SchemaInitializer + +Создайте файл `packages/plugins/@nocobase-sample/plugin-initializer-block-simple/src/client/initializer/index.ts`: + +```ts +import { SchemaInitializerItemType, useSchemaInitializer } from '@nocobase/client'; + +import { useT } from '../locale'; +import { imageSchema } from '../schema'; +import { BlockName, BlockNameLowercase } from '../constants'; + +export const imageInitializerItem: SchemaInitializerItemType = { + type: 'item', + name: BlockNameLowercase, + icon: 'FileImageOutlined', + useComponentProps() { + const { insert } = useSchemaInitializer(); + const t = useT() + return { + title: t(BlockName), + onClick: () => { + insert(imageSchema); + }, + }; + }, +} +``` + +- `type`: Тип, здесь `item`, указывающий на текстовый элемент с событием клика, которое вставляет новую схему. +- `name`: Уникальный идентификатор для различения элементов SchemaInitializer и операций с ними. +- `icon`: Иконка, список доступных иконок см. в [Ant Design Icons](https://ant.design/components/icon). +- `useComponentProps`: Возвращает объект с полями `title` (отображаемый текст) и `onClick` (обработчик клика). +- [useSchemaInitializer()](https://client.docs.nocobase.com/core/ui-schema/schema-initializer#useschemainitializer): Получает контекст `SchemaInitializerContext`. + - `insert`: Вставляет новую схему. + +Подробности о создании элементов SchemaInitializer см. в [Schema Initializer Item](https://client.docs.nocobase.com/core/ui-schema/schema-initializer#built-in-components-and-types). + +### 5. Реализация SchemaSettings + +#### 5.1 Определение SchemaSettings + +Для полноценного блока требуется SchemaSettings для настройки свойств и операций. В этом примере реализована только операция `remove`, так как SchemaSettings не является основным фокусом. + +Создайте файл `packages/plugins/@nocobase-sample/plugin-initializer-block-simple/src/client/settings/index.ts`: + +```ts | pure +import { SchemaSettings } from "@nocobase/client"; +import { BlockNameLowercase } from "../constants"; + +export const imageSettings = new SchemaSettings({ + name: `blockSettings:${BlockNameLowercase}`, + items: [ + { + type: 'remove', + name: 'remove', + componentProps: { + removeParentsIfNoChildren: true, + breakRemoveOn: { + 'x-component': 'Grid', + }, + } + } + ] +}); +``` + +- `componentProps`: + - `removeParentsIfNoChildren`: Указывает, удалять ли родительский узел, если у него нет дочерних. + - `breakRemoveOn`: Условие остановки удаления. Поскольку `Add Block` автоматически оборачивает элементы в `Grid`, здесь задано `breakRemoveOn: { 'x-component': 'Grid' }`, чтобы предотвратить удаление `Grid`. + +#### 5.2 Регистрация SchemaSettings + +```ts +import { Plugin } from '@nocobase/client'; +import { imageSettings } from './settings'; + +export class PluginInitializerBlockSimpleClient extends Plugin { + async load() { + // ... + this.app.schemaSettingsManager.add(imageSettings) + } +} + +export default PluginInitializerBlockSimpleClient; +``` + +#### 5.3 Использование SchemaSettings + +Обновите `imageSchema` в `packages/plugins/@nocobase-sample/plugin-initializer-block-simple/src/client/schema/index.ts`: + +```diff ++ import { imageSettings } from "../settings"; + +const imageSchema: ISchema = { + type: 'void', + 'x-decorator': 'CardItem', ++ 'x-settings': imageSettings.name, + // ... +}; +``` + +### 6. Добавление в `Add block` + +В системе есть множество кнопок `Add block`, но их имена (`name`) различны. + +![img_v3_02b4_049b0a62-8e3b-420f-adaf-a6350d84840g](https://static-docs.nocobase.com/img_v3_02b4_049b0a62-8e3b-420f-adaf-a6350d84840g.jpg) + +#### 6.1 Добавление в `Add block` на уровне страницы + +Чтобы добавить блок в `Add block` на уровне страницы, необходимо знать соответствующий `name`. Способ получения `name` описан в документации (TODO). + +Из изображения видно, что `Add block` на уровне страницы имеет `name` `page:addBlock`, а группа `Other Blocks` — `name` `otherBlocks`. + +Обновите файл `packages/plugins/@nocobase-sample/plugin-initializer-block-simple/src/client/index.tsx`: + +```tsx | pure +import { Plugin } from '@nocobase/client'; + +import { Image } from './component' +import { imageSettings } from './settings'; +import { imageInitializerItem } from './initializer'; + +export class PluginInitializerBlockSimpleClient extends Plugin { + async load() { + this.app.addComponents({ Image }) + this.app.schemaSettingsManager.add(imageSettings) + this.app.schemaInitializerManager.addItem('page:addBlock', `otherBlocks.${imageInitializerItem.name}`, imageInitializerItem) + } +} + +export default PluginInitializerBlockSimpleClient; +``` + +Код регистрирует компонент `Image` в системе, чтобы `x-component: 'Image'` в `imageSchema` мог найти соответствующий компонент. Подробности см. в [Глобальная регистрация Component и Scope](/plugin-samples/component-and-scope/global). + +Затем `imageSettings` добавляется в систему через [app.schemaSettingsManager.add](https://client.docs.nocobase.com/core/ui-schema/schema-settings-manager#schemasettingsmanageradd). + +Элемент `imageInitializerItem` добавляется в подэлементы Initializer через [app.schemaInitializerManager.addItem](https://client.docs.nocobase.com/core/ui-schema/schema-initializer-manager#schemainitializermanageradditem), где `page:addBlock` — это `name` кнопки `Add block` на странице, а `otherBlocks` — `name` родительской группы. + +При наведении на кнопку `Add block` появится новый тип блока `Image`. При клике на `Image` будет добавлен новый блок `Image`. + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240522-175523.mp4" type="video/mp4" /> +</video> + +#### 6.2 Добавление в `Add block` во всплывающем окне + +Необходимо добавить блок в `Add block` во всплывающем окне `Add new` блока `Table`. + +![img_v3_02b4_fc47fe3a-35a1-4186-999c-0b48e6e001dg](https://static-docs.nocobase.com/img_v3_02b4_fc47fe3a-35a1-4186-999c-0b48e6e001dg.jpg) + +Аналогично, определите `name` для `Add block` блока `Table`, который равен `popup:addNew:addBlock`, а для группы `Other Blocks` — `otherBlocks`. + +Обновите файл `packages/plugins/@nocobase-sample/plugin-initializer-block-simple/src/client/index.tsx`: + +```diff +export class PluginInitializerBlockSimpleClient extends Plugin { + async load() { + this.app.addComponents({ Image }) + this.app.schemaSettingsManager.add(imageSettings) + + this.app.schemaInitializerManager.addItem('page:addBlock', `otherBlocks.${imageInitializerItem.name}`, imageInitializerItem) ++ this.app.schemaInitializerManager.addItem('popup:addNew:addBlock', `otherBlocks.${imageInitializerItem.name}`, imageInitializerItem) + } +} +``` + +![img_v3_02b4_7062bfab-5a7b-439c-b385-92c5704b6b3g](https://static-docs.nocobase.com/img_v3_02b4_7062bfab-5a7b-439c-b385-92c5704b6b3g.jpg) + +#### 6.3 Добавление в `Add block` мобильной версии + +> Сначала активируйте плагин для мобильной версии, см. [Активация плагина](/welcome/getting-started/plugin#3-activate-the-plugin). + +Добавьте блок в `Add block` мобильной версии. Способ получения `name` здесь не описывается. + +Обновите файл `packages/plugins/@nocobase-sample/plugin-initializer-block-simple/src/client/index.tsx`: + +```diff +export class PluginInitializerBlockSimpleClient extends Plugin { + async load() { + this.app.addComponents({ Image }) + this.app.schemaSettingsManager.add(imageSettings) + + this.app.schemaInitializerManager.addItem('page:addBlock', `otherBlocks.${imageInitializerItem.name}`, imageInitializerItem) + this.app.schemaInitializerManager.addItem('popup:addNew:addBlock', `otherBlocks.${imageInitializerItem.name}`, imageInitializerItem) ++ this.app.schemaInitializerManager.addItem('mobilePage:addBlock', `otherBlocks.${imageInitializerItem.name}`, imageInitializerItem) + } +} +``` + +![img_v3_02b4_ec873b25-5a09-4f3a-883f-1d722035799g](https://static-docs.nocobase.com/img_v3_02b4_ec873b25-5a09-4f3a-883f-1d722035799g.jpg) + +Для добавления в другие `Add block` достаточно знать соответствующий `name`. + +## Сборка и развертывание в продакшен + +Следуйте инструкциям из документации [Сборка и упаковка плагина](/development/your-fisrt-plugin#сборка-и-упаковка-плагина) для сборки и развертывания плагина. + +Если вы используете клонированный исходный код, выполните полную сборку, чтобы собрать зависимости плагина: + +```bash +yarn build +``` + +Если проект создан с помощью `create-nocobase-app`, выполните: + +```bash +yarn build @nocobase-sample/plugin-initializer-block-simple --tar +``` + +После этого в папке `storage/tar/@nocobase-sample/plugin-initializer-block-simple.tar.gz` появится архив плагина. Установите его через [загрузку](/welcome/getting-started/plugin). diff --git a/docs/ru-RU/plugin-samples/schema-initializer/configure-actions.md b/docs/ru-RU/plugin-samples/schema-initializer/configure-actions.md new file mode 100644 index 0000000000..a3c51980e2 --- /dev/null +++ b/docs/ru-RU/plugin-samples/schema-initializer/configure-actions.md @@ -0,0 +1,483 @@ +# Встроенный Initializer в блоке — настройка операций + +## Описание сценария + +Если создается сложный блок данных, он может включать несколько динамически добавляемых частей, одной из которых является настройка операций через соответствующий Initializer `Configure actions`. Этот Initializer отвечает за динамическое добавление кнопок для выполнения различных операций. Например, в блоке `Details` с помощью `Configure actions` можно добавить кнопки `Edit`, `Print` и другие. + +![img_v3_02b4_9b80a4a0-6d9b-4e53-a544-f92c17d81d2g](https://static-docs.nocobase.com/img_v3_02b4_9b80a4a0-6d9b-4e53-a544-f92c17d81d2g.jpg) + +## Описание примера + +Этот пример основан на [Добавлении блока данных Data Block](/plugin-samples/schema-initializer/data-block) и реализует функциональность, аналогичную блоку `Details`, позволяя настраивать кнопки через `Configure actions`. + +Полный код примера доступен в [plugin-samples](https://github.com/nocobase/plugin-samples/tree/main/packages/plugins/%40nocobase-sample/plugin-initializer-configure-actions). + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240522-191602.mp4" type="video/mp4" /> +</video> + +## Инициализация плагина + +Следуйте инструкциям из документации [Создание первого плагина](/development/your-fisrt-plugin). Если у вас нет проекта, создайте его. Если проект уже есть или вы клонировали исходный код, пропустите этот шаг. + +```bash +yarn create nocobase-app my-nocobase-app -d sqlite +cd my-nocobase-app +yarn install +yarn nocobase install +``` + +Затем инициализируйте плагин и добавьте его в систему: + +```bash +yarn pm create @nocobase-sample/plugin-initializer-configure-actions +yarn pm enable @nocobase-sample/plugin-initializer-configure-actions +``` + +Запустите проект: + +```bash +yarn dev +``` + +После входа в систему перейдите по адресу [http://localhost:13000/admin/pm/list/local/](http://localhost:13000/admin/pm/list/local/), чтобы убедиться, что плагин установлен и активирован. + +## Реализация функциональности + +Перед началом работы с этим примером необходимо ознакомиться с основными концепциями: + +- [Руководство по SchemaInitializer](/development/client/ui-schema/initializer): Используется для добавления блоков, полей, операций и других элементов в интерфейс. +- [API SchemaInitializer](https://client.docs.nocobase.com/core/ui-schema/schema-initializer): Описание API для добавления элементов в интерфейс. +- [UI Schema](/development/client/ui-schema/what-is-ui-schema): Используется для определения структуры и стилей интерфейса. +- [Дизайнер Designable](/development/client/ui-schema/designable): Используется для изменения схемы. + +### 1. Создание блока + +Этот пример основан на [Добавлении блока данных Data Block](/plugin-samples/schema-initializer/data-block), поэтому скопируйте каталог `packages/plugins/@nocobase-sample/plugin-initializer-block-data/src/client` в `packages/plugins/@nocobase-sample/plugin-initializer-configure-actions/src/client`. + +Затем измените файл `packages/plugins/@nocobase-sample/plugin-initializer-configure-actions/src/client/index.tsx`: + +```diff +import { Plugin } from '@nocobase/client'; +- import { Info } from './component'; ++ import { InfoV2 } from './component'; + +- export class PluginInitializerBlockDataClient extends Plugin { ++ export class PluginInitializerConfigureActionsClient extends Plugin { + async load() { +- this.app.addComponents({ Info }) ++ this.app.addComponents({ InfoV2 }) + // ... + } +} + +- export default PluginInitializerBlockDataClient; ++ export default PluginInitializerConfigureActionsClient; +``` + +Обновите файл `packages/plugins/@nocobase-sample/plugin-initializer-configure-actions/src/client/constants.ts`: + +```ts +export const BlockName = 'InfoV2'; +export const BlockNameLowercase = 'info-v2'; +``` + +### 2. Реализация Initializer + +#### 2.1 Определение Initializer + +Создайте файл `packages/plugins/@nocobase-sample/plugin-initializer-configure-actions/src/client/initializer/configureActions/configureActionsInitializer.ts`: + +```tsx | pure +import { SchemaInitializer } from "@nocobase/client"; +import { BlockNameLowercase } from "../../constants"; + +export const configureActionsInitializer = new SchemaInitializer({ + name: `${BlockNameLowercase}:configureActions`, + icon: 'SettingOutlined', + title: 'Configure actions', + style: { + marginLeft: 8, + }, + items: [] +}); +``` + +Мы определили новый `SchemaInitializer` с пустым списком подэлементов. + +- [SchemaInitializer](https://client.docs.nocobase.com/core/ui-schema/schema-initializer): Используется для создания экземпляра SchemaInitializer. +- `icon`: Иконка, список доступных иконок см. в [Ant Design Icons](https://ant.design/components/icon/). +- `title`: Заголовок кнопки. +- [items](https://client.docs.nocobase.com/core/ui-schema/schema-initializer#built-in-components-and-types): Подэлементы кнопки. + +Экспортируйте его в `packages/plugins/@nocobase-sample/plugin-initializer-configure-actions/src/client/initializer/configureActions/index.ts`: + +```tsx | pure +export * from './configureActionsInitializer'; +``` + +И обновите `packages/plugins/@nocobase-sample/plugin-initializer-configure-actions/src/client/initializer/index.tsx`, чтобы экспортировать `configureActions`: + +```diff +import React from 'react'; +import { SchemaInitializerItemType, useSchemaInitializer } from '@nocobase/client' +import { CodeOutlined } from '@ant-design/icons'; + ++ export * from './configureActions' +// ... +``` + +#### 2.2 Регистрация Initializer + +Обновите файл `packages/plugins/@nocobase-sample/plugin-initializer-configure-actions/src/client/index.tsx`, чтобы импортировать и зарегистрировать Initializer: + +```tsx | pure +// ... +import { infoInitializerItem, configureActionsInitializer } from './initializer'; + +export class PluginInitializerConfigureActionsClient extends Plugin { + async load() { + this.app.schemaInitializerManager.add(configureActionsInitializer) + // ... + } +} +``` + +#### 2.3 Использование Initializer + +Обновите файл `packages/plugins/@nocobase-sample/plugin-initializer-configure-actions/src/client/schema/index.ts`, добавив подузел `actions`: + +```diff +// ... ++ import { configureActionsInitializer } from "../initializer"; + +function getInfoBlockSchema({ dataSource, collection }) { + return { + // ... + properties: { + info: { + 'x-component': BlockName, + 'x-use-component-props': 'useInfoProps', ++ properties: { ++ actions: { ++ type: 'void', ++ 'x-component': 'ActionBar', ++ 'x-component-props': { ++ layout: 'two-column', ++ style: { marginBottom: 20 } ++ }, ++ 'x-initializer': configureActionsInitializer.name, ++ } ++ } + } + } + } +} +``` + +`Configure actions` обычно используется в паре с компонентом [ActionBar](https://client.docs.nocobase.com/components/action#actionbar). + +В подузлы `Info` добавлено поле `actions`: + +- `type: 'void'`: Тип контейнера. +- `x-component: 'ActionBar'`: Используется компонент [ActionBar](https://client.docs.nocobase.com/components/action#actionbar) для отображения кнопок. +- `x-initializer: configureActionsInitializer.name`: Используется созданный SchemaInitializer. +- `x-component-props.layout: 'two-column'`: Двухколоночный макет, см. пример [ActionBar two-column](https://client.docs.nocobase.com/components/action#two-column). + +#### 2.4 Рендеринг подузлов блока + +Обновите файл `packages/plugins/@nocobase-sample/plugin-initializer-configure-actions/src/client/component/Info.tsx`, изменив компонент `Info`: + +```diff +import React, { FC } from 'react'; +import { withDynamicSchemaProps } from '@nocobase/client' + +export interface InfoV2Props { + collectionName: string; + data?: any[]; + loading?: boolean; ++ children?: React.ReactNode; +} + +export const InfoV2: FC<InfoV2Props> = withDynamicSchemaProps(({ children, collectionName, data }) => { + return <div> ++ {children} +- <div>collection: {collectionName}</div> +- <div>data list: <pre>{JSON.stringify(data, null, 2)}</pre></div> ++ <div>data length: {data?.length}</div> + </div> +}, { displayName: BlockName }) +``` + +- `children`: Содержимое `properties` передается в `children` компонента `InfoV2`, поэтому достаточно отобразить `children`. + +![img_v3_02b4_4c6cb675-789e-48d5-99ce-072984dcfc9g](https://static-docs.nocobase.com/img_v3_02b4_4c6cb675-789e-48d5-99ce-072984dcfc9g.jpg) + +### 3. Реализация элементов Initializer + +#### 3.1 Повторное использование: `Custom request` Action + +Обновите файл `packages/plugins/@nocobase-sample/plugin-initializer-configure-actions/src/client/initializer/configureActions/configureActionsInitializer.ts`: + +```diff +export const configureActionsInitializer = new SchemaInitializer({ + name: 'info:configureActions', + title: 'Configure actions', + icon: 'SettingOutlined', + items: [ ++ { ++ name: 'customRequest', ++ title: '{{t("Custom request")}}', ++ Component: 'CustomRequestInitializer', ++ }, + ] +}); +``` + +Для `Custom request` используется существующий компонент `CustomRequestInitializer`. Список других переиспользуемых элементов Initializer см. в документации (TODO). + +![img_v3_02b4_0d439087-cfe1-4681-bfab-4e4bc3e34cbg](https://static-docs.nocobase.com/img_v3_02b4_0d439087-cfe1-4681-bfab-4e4bc3e34cbg.jpg) + +#### 3.2 Пользовательский: `Custom Refresh` Action + +Помимо использования существующих элементов Initializer, можно создать пользовательский Action. Подробные шаги по созданию пользовательских действий см. в [Добавление простого Action](/plugin-samples/schema-initializer/action-simple) и [Добавление Action с всплывающим окном](/plugin-samples/schema-initializer/action-modal). + +Здесь мы реализуем Action `Custom Refresh`. + +#### 3.2.1 Определение имени + +Создайте файл `packages/plugins/@nocobase-sample/plugin-initializer-configure-actions/src/client/initializer/configureActions/items/customRefresh/constants.ts`: + +```ts +export const ActionName = 'Custom Request'; +export const ActionNameLowercase = 'customRequest'; +``` + +#### 3.2.2 Определение схемы + +##### 3.2.2.1 Определение схемы + +Создайте файл `packages/plugins/@nocobase-sample/plugin-initializer-configure-actions/src/client/initializer/configureActions/items/customRefresh/schema.ts`: + +```ts +import { ActionProps, useDataBlockRequest, ISchema } from "@nocobase/client"; +import { useT } from "../../../../locale"; + +export const useCustomRefreshActionProps = (): ActionProps => { + const { runAsync } = useDataBlockRequest(); + const t = useT(); + return { + type: 'primary', + title: t('Custom Refresh'), + async onClick() { + await runAsync(); + }, + } +} + +export const customRefreshActionSchema: ISchema = { + type: 'void', + 'x-component': 'Action', + 'x-toolbar': 'ActionSchemaToolbar', + 'x-use-component-props': 'useCustomRefreshActionProps' +} +``` + +Мы определили `customRefreshActionSchema` и динамические свойства `useCustomRefreshActionProps`. + +`customRefreshActionSchema`: +- `type: 'void'`: Тип, не содержащий данных. +- `x-component: 'Action'`: Используется компонент [Action](https://client.docs.nocobase.com/components/action) для отображения кнопки. +- `title: 'Custom Refresh'`: Заголовок кнопки. +- `x-use-component-props: 'useCustomRefreshActionProps'`: Использует свойства, возвращаемые хуком `useCustomRefreshActionProps`. Поскольку схема сохраняется на сервере, используется строковое имя. +- `'x-toolbar': 'ActionSchemaToolbar'`: Используется с компонентом `Action`, скрывает `Initializer` в правом верхнем углу, оставляя только Drag и Settings. + +`useCustomRefreshActionProps`: +- [useDataBlockRequest()](https://client.docs.nocobase.com/core/data-block/data-block-request-provider): Объект запроса блока данных, предоставляемый `DataBlockProvider`, используется для получения данных. + - `runAsync`: Асинхронный метод для обновления данных блока. +- `type: 'primary'`: Тип кнопки — `primary`. +- `onClick`: Событие клика. + +Экспортируйте схему в `packages/plugins/@nocobase-sample/plugin-initializer-configure-actions/src/client/initializer/configureActions/items/customRefresh/index.ts`: + +```ts +export * from './schema'; +``` + +Обновите `packages/plugins/@nocobase-sample/plugin-initializer-configure-actions/src/client/initializer/configureActions/index.ts`, чтобы экспортировать `customRefresh`: + +```diff +export * from './configureActionsInitializer'; ++ export * from './items/customRefresh'; +``` + +##### 3.2.2.2 Регистрация контекста + +Зарегистрируйте `useCustomRefreshActionProps` в контексте. Обновите файл `packages/plugins/@nocobase-sample/plugin-initializer-configure-actions/src/client/index.tsx`: + +```diff +// ... +- import { infoInitializerItem } from './initializer'; ++ import { infoInitializerItem, useCustomRefreshActionProps } from './initializer'; + +export class PluginInitializerConfigureActionsClient extends Plugin { + async load() { + // ... +- this.app.addScopes({ useInfoProps }); ++ this.app.addScopes({ useInfoProps, useCustomRefreshActionProps }); + } +} +``` + +Подробности об использовании `SchemaComponentOptions` см. в [SchemaComponentOptions](https://client.docs.nocobase.com/core/ui-schema/schema-component#schemacomponentoptions) и [Глобальная регистрация Component и Scope](/plugin-samples/component-and-scope/global). + +#### 3.2.3 Реализация настроек + +##### 3.2.3.1 Определение настроек + +Создайте файл `packages/plugins/@nocobase-sample/plugin-initializer-configure-actions/src/client/initializer/configureActions/items/customRefresh/settings.ts`: + +```tsx | pure +import { SchemaSettings } from "@nocobase/client"; +import { ActionNameLowercase } from "./constants"; + +export const customRefreshActionSettings = new SchemaSettings({ + name: `actionSettings:${ActionNameLowercase}`, + items: [ + { + name: 'remove', + type: 'remove', + } + ] +}) +``` + +`customRefreshActionSettings`: Определена простая операция `remove`. Подробности о настройке SchemaSettings см. в [Schema Settings](https://client.docs.nocobase.com/core/ui-schema/schema-settings). + +Экспортируйте настройки в `packages/plugins/@nocobase-sample/plugin-initializer-configure-actions/src/client/initializer/configureActions/items/customRefresh/index.ts`: + +```tsx | pure +export * from './settings'; +``` + +##### 3.2.3.2 Регистрация настроек + +Зарегистрируйте `customRefreshActionSettings` в системе. Обновите файл `packages/plugins/@nocobase-sample/plugin-initializer-configure-actions/src/client/index.tsx`: + +```diff +- import { infoInitializerItem, useCustomRefreshActionProps } from './initializer'; ++ import { infoInitializerItem, useCustomRefreshActionProps, customRefreshActionSettings } from './initializer'; + +export class PluginInitializerConfigureActionsClient extends Plugin { + async load() { ++ this.app.schemaSettingsManager.add(customRefreshActionSettings); + } +} +``` + +##### 3.2.3.3 Использование настроек + +Обновите файл `packages/plugins/@nocobase-sample/plugin-initializer-configure-actions/src/client/initializer/configureActions/items/customRefresh/schema.ts`, добавив `x-settings` в `customRefreshActionSchema`: + +```diff ++ import { customRefreshActionSettings } from "./settings"; + +export const customRefreshActionSchema: ISchema = { + type: 'void', + 'x-component': 'Action', ++ 'x-settings': customRefreshActionSettings.name, + title: 'Custom Refresh', + 'x-use-component-props': 'useCustomRefreshActionProps' +} +``` + +#### 3.2.4 Определение элемента SchemaInitializer + +##### 3.2.4.1 Определение элемента SchemaInitializer + +Обновите файл `packages/plugins/@nocobase-sample/plugin-initializer-configure-actions/src/client/initializer/configureActions/items/customRefresh/initializer.ts`: + +```tsx | pure +import { SchemaInitializerItemType, useSchemaInitializer } from "@nocobase/client"; +import { customRefreshActionSchema } from "./schema"; +import { ActionName } from "./constants"; +import { useT } from "../../../../locale"; + +export const customRefreshActionInitializerItem: SchemaInitializerItemType = { + type: 'item', + name: ActionName, + useComponentProps() { + const { insert } = useSchemaInitializer(); + const t = useT(); + return { + title: t(ActionName), + onClick() { + insert(customRefreshActionSchema) + }, + }; + }, +}; +``` + +- `type: 'item'`: Тип элемента — текст, при клике вызывает событие `onClick`. +- `name: 'custom refresh'`: Уникальный идентификатор для различения элементов SchemaInitializer и операций с ними. +- `title: 'Custom Refresh'`: Заголовок кнопки. + +Подробности о создании элементов SchemaInitializer см. в [Schema Initializer Item](https://client.docs.nocobase.com/core/ui-schema/schema-initializer#built-in-components-and-types). + +Экспортируйте элемент в `packages/plugins/@nocobase-sample/plugin-initializer-configure-actions/src/client/initializer/configureActions/index.ts`: + +```tsx | pure +export * from './initializer'; +``` + +##### 3.2.4.2 Использование элемента SchemaInitializer + +Обновите файл `packages/plugins/@nocobase-sample/plugin-initializer-configure-actions/src/client/initializer/configureActions/configureActionsInitializer.ts`, добавив `customRefreshActionInitializerItem` в `items`: + +```diff +import { SchemaInitializer } from "@nocobase/client"; ++ import { customRefreshActionInitializerItem } from "./items/customRefresh"; + +export const configureActionsInitializer = new SchemaInitializer({ + name: 'info:configureActions', + title: 'Configure actions', + icon: 'SettingOutlined', + style: { + marginLeft: 8, + }, + items: [ + { + name: 'customRequest', + title: '{{t("Custom request")}}', + Component: 'CustomRequestInitializer', + 'x-align': 'right', + }, ++ customRefreshActionInitializerItem + ] +}); +``` + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240522-191602.mp4" type="video/mp4" /> +</video> + +Вы можете реализовать дополнительные действия `Action` по необходимости. + +## Сборка и развертывание в продакшен + +Следуйте инструкциям из документации [Сборка и упаковка плагина](/development/your-fisrt-plugin#сборка-и-упаковка-плагина) для сборки и развертывания плагина. + +Если вы используете клонированный исходный код, выполните полную сборку, чтобы собрать зависимости плагина: + +```bash +yarn build +``` + +Если проект создан с помощью `create-nocobase-app`, выполните: + +```bash +yarn build @nocobase-sample/plugin-initializer-configure-actions --tar +``` + +После этого в папке `storage/tar/@nocobase-sample/plugin-initializer-configure-actions.tar.gz` появится архив плагина. Установите его через [загрузку](/welcome/getting-started/plugin). diff --git a/docs/ru-RU/plugin-samples/schema-initializer/configure-fields-bk.md b/docs/ru-RU/plugin-samples/schema-initializer/configure-fields-bk.md new file mode 100644 index 0000000000..d31c1a67f0 --- /dev/null +++ b/docs/ru-RU/plugin-samples/schema-initializer/configure-fields-bk.md @@ -0,0 +1,395 @@ +# Реализация Инициализатор для полей данных + +## Описание сценария + +Если создается сложный блок данных, он может включать несколько динамически добавляемых частей, ключевой из которых является настройка полей через соответствующий Initializer `Configure fields`. Например, в блоке `Form` можно настроить отображаемые поля с помощью `Configure fields`. + +![img_v3_02b4_111734a2-755f-4100-949d-96803ad1912g](https://static-docs.nocobase.com/img_v3_02b4_111734a2-755f-4100-949d-96803ad1912g.jpg) + +## Описание примера + +Этот пример основан на [Добавлении блока данных Data Block](/plugin-samples/schema-initializer/data-block) и реализует функциональность, аналогичную блоку `Form`, позволяя настраивать отображаемые поля через `Configure fields`. + +Полный код примера доступен в [plugin-samples](https://github.com/nocobase/plugin-samples/tree/main/packages/plugins/%40nocobase-sample/plugin-initializer-configure-fields). + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240522-190508.mp4" type="video/mp4" /> +</video> + +## Инициализация плагина + +Следуйте инструкциям из документации [Создание первого плагина](/development/your-fisrt-plugin). Если у вас нет проекта, создайте его. Если проект уже есть или вы клонировали исходный код, пропустите этот шаг. + +```bash +yarn create nocobase-app my-nocobase-app -d sqlite +cd my-nocobase-app +yarn install +yarn nocobase install +``` + +Затем инициализируйте плагин и добавьте его в систему: + +```bash +yarn pm create @nocobase-sample/plugin-initializer-configure-fields +yarn pm enable @nocobase-sample/plugin-initializer-configure-fields +``` + +Запустите проект: + +```bash +yarn dev +``` + +После входа в систему перейдите по адресу [http://localhost:13000/admin/pm/list/local/](http://localhost:13000/admin/pm/list/local/), чтобы убедиться, что плагин установлен и активирован. + +## Реализация функциональности + +Перед началом работы с этим примером необходимо ознакомиться с основными концепциями: + +- [Руководство по SchemaInitializer](/development/client/ui-schema/initializer): Используется для добавления блоков, полей, операций и других элементов в интерфейс. +- [API SchemaInitializer](https://client.docs.nocobase.com/core/ui-schema/schema-initializer): Описание API для добавления элементов в интерфейс. +- [UI Schema](/development/client/ui-schema/what-is-ui-schema): Используется для определения структуры и стилей интерфейса. +- [Дизайнер Designable](/development/client/ui-schema/designable): Используется для изменения схемы. + +### 1. Копирование кода и изменение имени плагина + +Этот пример основан на [Добавлении блока данных Data Block](/plugin-samples/schema-initializer/data-block), поэтому скопируйте каталог `packages/plugins/@nocobase-sample/plugin-initializer-block-data/src/client` в `packages/plugins/@nocobase-sample/plugin-initializer-configure-fields/src/client`. + +Затем измените файл `packages/plugins/@nocobase-sample/plugin-initializer-configure-fields/src/client/index.tsx`: + +```diff +import { Plugin } from '@nocobase/client'; +import { InfoBlock, infoBlockSettings, infoBlockInitializerItem } from './InfoBlock'; + +- export class PluginInitializerBlockDataClient extends Plugin { ++ export class PluginInitializerConfigureFieldsClient extends Plugin { + async load() { + // ... + } +} + +- export default PluginInitializerBlockDataClient; ++ export default PluginInitializerConfigureFieldsClient; +``` + +Чтобы избежать конфликтов с другими примерами, все упоминания `InfoBlock` заменены на `InfoBlock2`, но в документации пример будет описываться как `InfoBlock`. + +### 2. Создание Initializer для `Configure fields` + +Создайте файл `packages/plugins/@nocobase-sample/plugin-initializer-configure-fields/src/client/configureFields.tsx`: + +```tsx | pure +import { Grid, SchemaInitializer, useSchemaInitializer } from "@nocobase/client"; + +export const configureFields = new SchemaInitializer({ + name: 'info:configureFields', + icon: 'SettingOutlined', + title: 'Configure fields', + items: [ + { + type: 'itemGroup', + name: 'fields', + title: 'Display fields', + useChildren() { + const { insert } = useSchemaInitializer(); + + return [] + }, + } + ] +}); +``` + +- [SchemaInitializer](https://client.docs.nocobase.com/core/ui-schema/schema-initializer): Используется для создания экземпляра SchemaInitializer. +- `icon`: Иконка, список доступных иконок см. в [Ant Design Icons](https://ant.design/components/icon/). +- `title`: Заголовок кнопки. +- [items](https://client.docs.nocobase.com/core/ui-schema/schema-initializer#built-in-components-and-types): Подэлементы кнопки. + - `type: 'itemGroup'`: Тип подэлемента, используется для группировки нескольких элементов. + - `name: 'fields'`: Имя подэлемента. + - `title: 'Display fields'`: Заголовок подэлемента. + - `useChildren`: Подэлементы группы, возвращает массив подэлементов. + +### 3. Регистрация Initializer для `Configure fields` + +Обновите файл `packages/plugins/@nocobase-sample/plugin-initializer-configure-fields/src/client/index.tsx`, импортируйте и зарегистрируйте Initializer: + +```tsx | pure +import { configureFields } from './configureFields' + +export class PluginInitializerConfigureFieldsClient extends Plugin { + async load() { + this.app.schemaInitializerManager.add(configureFields) + } +} +``` + +### 4. Изменение блока `getInfoBlockSchema()` + +Обновите файл `packages/plugins/@nocobase-sample/plugin-initializer-configure-fields/src/client/InfoBlock.tsx`, изменив блок `getInfoBlockSchema()`: + +```diff +function getInfoBlockSchema({ dataSource, collection }) { + return { + // ... + properties: { + info: { + type: 'void', + 'x-component': 'InfoBlock', ++ properties: { ++ fields: { ++ type: 'void', ++ 'x-component': 'Grid', ++ 'x-initializer': 'info:configureFields', ++ } ++ } + } + } + } +} +``` + +В подузлы `InfoBlock` добавлено поле `fields`. Для улучшения компоновки используется компонент `Grid`, а в качестве `x-initializer` указано `info:configureFields`. Компонент `Grid` встроенно поддерживает [useSchemaInitializerRender()](https://client.docs.nocobase.com/core/ui-schema/schema-initializer#useschemainitializerrender), поэтому его можно использовать напрямую. Для пользовательских компонентов потребуется реализовать логику рендеринга через `useSchemaInitializerRender()`. + +### 5. Изменение компонента `InfoBlock` + +Обновите файл `packages/plugins/@nocobase-sample/plugin-initializer-configure-fields/src/client/InfoBlock.tsx`, изменив компонент `InfoBlock`: + +```tsx | pure +export const InfoBlock = ({ children }) => { + return <div>{children}</div> +} +``` + +Содержимое `properties` передается в `children` компонента `InfoBlock`, поэтому достаточно просто отобразить `children`. + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240522-190759.mp4" type="video/mp4" /> +</video> + +### 6. Чтение полей данных для подэлементов `Configure fields` + +Обновите файл `packages/plugins/@nocobase-sample/plugin-initializer-configure-fields/src/client/configureFields.tsx`: + +```tsx | pure +interface GetFieldInitializerItemOptions { + collectionField: CollectionFieldOptions; +} + +function getFieldInitializerItem(options: GetFieldInitializerItemOptions) { + const { collectionField } = options; + const title = collectionField.uiSchema?.title || collectionField.name; + const name = collectionField.name; + return { + name: collectionField.name, + title: collectionField.uiSchema?.title || collectionField.name, + type: 'switch', + onClick() { + // TODO + } + } as SchemaInitializerItemType; +} + +export const configureFields = new SchemaInitializer({ + name: 'info:configureFields', + icon: 'SettingOutlined', + title: 'Configure fields', + items: [ + { + type: 'itemGroup', + name: 'fields', + title: 'Display fields', + useChildren() { + const collection = useCollection(); + + const schemaItems = collection + .getFields() + .map<SchemaInitializerItemType>(getFieldInitializerItem({ + collectionField, + })) + + return schemaItems; + }, + } + ] +}); +``` + +- [useCollection()](https://client.docs.nocobase.com/core/data-source/collection-provider#usecollection): Используется для получения экземпляра текущей коллекции данных. В `getInfoBlockSchema()` используется [DataBlockProvider](https://client.docs.nocobase.com/core/data-block/data-block-provider), который включает [CollectionProvider](https://client.docs.nocobase.com/core/data-source/collection-provider), поэтому можно использовать его напрямую. + - `collection.getFields()`: Получает поля коллекции данных. + +- `getFieldInitializerItem`: Функция для создания элемента SchemaInitializer для поля. + - `name`: Имя подэлемента, используется как уникальный идентификатор. + - `title`: Заголовок подэлемента, отображается в интерфейсе. Используется `uiSchema.title`, если он есть, иначе — имя поля. Подробности о структуре `field.uiSchema` см. в [CollectionField](https://client.docs.nocobase.com/core/data-source/collection-field). + - `type: 'switch'`: Тип подэлемента, [Switch](https://client.docs.nocobase.com/core/ui-schema/schema-initializer#type-switch--schemainitializerswitch). Основная задача — реализовать метод `onClick`, который добавляет или удаляет поле при клике. + - `onClick`: Событие клика, реализация будет добавлена позже. + +![img_v3_02b4_7d5c145e-cb15-4d93-9004-bde406e42a5g](https://static-docs.nocobase.com/img_v3_02b4_7d5c145e-cb15-4d93-9004-bde406e42a5g.jpg) + +### 7. Реализация добавления и удаления для `switch` + +Обновите файл `packages/plugins/@nocobase-sample/plugin-initializer-configure-fields/src/client/configureFields.tsx`: + +```diff ++ import { CollectionFieldOptions, ISchema, SchemaInitializer, SchemaInitializerItemType, SchemaSettings, useCollection, useDesignable, useSchemaInitializer } from "@nocobase/client"; + +export const configureFields = new SchemaInitializer({ + name: 'info:configureFields', + icon: 'SettingOutlined', + title: 'Configure fields', + items: [ + { + type: 'itemGroup', + name: 'fields', + title: 'Display fields', + useChildren() { ++ const { insert } = useSchemaInitializer(); ++ const { remove } = useDesignable(); ++ const schema = useFieldSchema(); + const collection = useCollection(); + + const schemaItems = collection + .getFields() + .map<SchemaInitializerItemType>((collectionField) => getFieldInitializerItem({ + collectionField, ++ schema, ++ remove, ++ insert ++ })) + + return schemaItems; + }, + } + ] +}); +``` + +- [useDesignable()](https://client.docs.nocobase.com/core/ui-schema/designable#usedesignable): Предоставляет методы для добавления, удаления и изменения схемы. +- [useSchemaInitializer()](https://client.docs.nocobase.com/core/ui-schema/schema-initializer#useschemainitializer): Предоставляет контекст SchemaInitializer. + - `insert`: Используется для вставки схемы. Используется метод `insert` из `useSchemaInitializer()`, а не из `useDesignable()`, так как схемы имеют иерархическую структуру. `useSchemaInitializer()` работает на уровне SchemaInitializer, а `useDesignable()` — на уровне текущей схемы. Для вставки на уровень, связанный с SchemaInitializer, используется `insert` из `useSchemaInitializer()`. + +```tsx | pure +function getInfoItemSchema(collectionFieldName: string) { + return { + type: 'void', + 'x-collection-field': collectionFieldName, + // TODO + } +} + +interface GetFieldInitializerItemOptions { + collectionField: CollectionFieldOptions; + schema: ISchema; + remove: (schema: ISchema) => void; + insert: (schema: ISchema) => void; +} + +function getFieldInitializerItem(options: GetFieldInitializerItemOptions) { + const { collectionField, schema, remove, insert } = options; + const title = collectionField.uiSchema?.title || collectionField.name; + const name = collectionField.name; + const collectionFieldSchema = Object.values(schema.properties || {}).find((item) => item['x-collection-field'] === name); + return { + name, + type: 'switch', + title, + checked: !!collectionFieldSchema, + onClick() { + if (collectionFieldSchema) { + remove(collectionFieldSchema) + return; + } + insert(getInfoItemSchema(name)) + } + } as SchemaInitializerItemType; +} +``` + +Функция `getInfoItemSchema` возвращает схему для поля, где ключевым является поле `x-collection-field`, которое указывает, к какому полю относится данная схема. + +Схема поля ищется в `schema.properties`. Если поле существует, оно удаляется; если не существует, оно добавляется. + +### 8. Завершение схемы и компонента подузлов + +```ts +export const infoItemSettings = new SchemaSettings({ + name: 'fieldSettings:info', + items: [ + { + name: 'remove', + type: 'remove', + componentProps: { + removeParentsIfNoChildren: true, + breakRemoveOn(s) { + return s['x-component'] === 'Grid'; + }, + }, + } + ] +}) + +export const InfoItem = () => { + const fieldSchema = useFieldSchema(); + const collection = useCollection(); + const collectionFieldName = fieldSchema.name; + return <pre>{JSON.stringify(collection.getField(collectionFieldName), null, 2)}</pre> +} + +function getInfoItemSchema(collectionFieldName: string) { + return { + type: 'void', + 'x-collection-field': collectionFieldName, + 'x-component': 'Grid.Row', + properties: { + [uid()]: { + type: 'void', + 'x-component': 'Grid.Col', + properties: { + [collectionFieldName]: { + type: 'void', + 'x-component': 'InfoItem', + 'x-decorator': 'CardItem', + 'x-settings': infoItemSettings.name, + }, + }, + }, + }, + } as ISchema; +} +``` + +В `getInfoBlockSchema()` используется компонент `Grid` как родительский, поэтому подузлы должны использовать компоненты `Grid.Row` и `Grid.Col`, а в `Grid.Col` размещается компонент `InfoItem`. + +Компонент `InfoItem` отображает информацию о поле. Он получает схему текущего поля через `schema.name`, соответствующую `collectionFieldName`, затем использует [collection.getField(collectionFieldName)](https://client.docs.nocobase.com/core/data-source/collection#collectiongetfieldname) для получения подробной информации о поле и отображает её. + +Затем зарегистрируйте компоненты `InfoItem` и `infoItemSettings` в системе: + +```ts +export class PluginInitializerComplexDataBlockClient extends Plugin { + async load() { + this.app.addComponents({ InfoBlock, InfoItem }); + this.app.schemaSettingsManager.add(infoBlockSettings, infoItemSettings); + } +} +``` + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240522-190508.mp4" type="video/mp4" /> +</video> + +## Сборка и развертывание в продакшен + +Следуйте инструкциям из документации [Сборка и упаковка плагина](/development/your-fisrt-plugin#сборка-и-упаковка-плагина) для сборки и развертывания плагина. + +Если вы используете клонированный исходный код, выполните полную сборку, чтобы собрать зависимости плагина: + +```bash +yarn build +``` + +Если проект создан с помощью `create-nocobase-app`, выполните: + +```bash +yarn build @nocobase-sample/plugin-initializer-configure-fields --tar +``` + +После этого в папке `storage/tar/@nocobase-sample/plugin-initializer-configure-fields.tar.gz` появится архив плагина. Установите его через [загрузку](/welcome/getting-started/plugin). diff --git a/docs/ru-RU/plugin-samples/schema-initializer/configure-fields.md b/docs/ru-RU/plugin-samples/schema-initializer/configure-fields.md new file mode 100644 index 0000000000..74d73f394a --- /dev/null +++ b/docs/ru-RU/plugin-samples/schema-initializer/configure-fields.md @@ -0,0 +1,3 @@ +# Встроенный Инициализатор в блоке — настройка полей + +ЗАДАЧА diff --git a/docs/ru-RU/plugin-samples/schema-initializer/index.md b/docs/ru-RU/plugin-samples/schema-initializer/index.md new file mode 100644 index 0000000000..c95902a4b4 --- /dev/null +++ b/docs/ru-RU/plugin-samples/schema-initializer/index.md @@ -0,0 +1,24 @@ +# SchemaInitializer + +[SchemaInitializer](/development/client/ui-schema/initializer) используется для добавления различных блоков, полей, операций и других элементов в интерфейс. + +В зависимости от потребностей могут быть следующие сценарии расширения: + +- Добавление элементов в существующие Initializer +- Создание новых Initializer + +Для этих сценариев предоставлены следующие примеры: + +**Добавление элементов в существующие Initializer** + +- [Добавление простого блока Simple Block](/plugin-samples/schema-initializer/block-simple) +- [Добавление блока данных Data Block](/plugin-samples/schema-initializer/data-block) +- [Добавление блока данных с всплывающим окном Data Block Modal](/plugin-samples/schema-initializer/data-block-modal) +- [Добавление простого действия Action](/plugin-samples/schema-initializer/action-simple) +- [Добавление действия с всплывающим окном Action Modal](/plugin-samples/schema-initializer/action-modal) + +**Создание новых Initializer** + +- [Встроенный Initializer в блоке — настройка полей](/plugin-samples/schema-initializer/configure-fields) +- [Встроенный Initializer в блоке — настройка операций](/plugin-samples/schema-initializer/configure-actions) +<!-- - [Встроенный Initializer в блоке — другие пользовательские настройки](/plugin-samples/schema-initializer/configure-custom) --> diff --git a/docs/ru-RU/plugin-samples/schema-settings/add-item.md b/docs/ru-RU/plugin-samples/schema-settings/add-item.md new file mode 100644 index 0000000000..568d263bdf --- /dev/null +++ b/docs/ru-RU/plugin-samples/schema-settings/add-item.md @@ -0,0 +1,176 @@ +# Добавление элементов в существующие SchemaSettings + +## Описание сценария + +В процессе разработки блоков, операций или полей может потребоваться настройка их свойств. Однако существующие конфигурации не всегда удовлетворяют требованиям, поэтому возникает необходимость добавления новых элементов конфигурации в соответствии с потребностями. + +## Описание примера + +На данный момент в конфигурации блока Table отсутствует свойство `showIndex`. В этом примере мы добавим свойство `showIndex`, которое будет управлять отображением порядкового номера. + +Этот пример демонстрирует использование `SchemaSettings`. Подробности о расширении блоков см. в документации [Расширения блоков](/plugin-samples/block). + +Полный код примера доступен в [plugin-samples](https://github.com/nocobase/plugin-samples/tree/main/packages/plugins/%40nocobase-sample/plugin-schema-settings-add-item). + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240601161535_rec_.mp4" type="video/mp4" /> +</video> + +## Инициализация плагина + +Следуйте инструкциям из документации [Создание первого плагина](/development/your-fisrt-plugin). Если у вас нет проекта, создайте его. Если проект уже есть или вы клонировали исходный код, пропустите этот шаг. + +```bash +yarn create nocobase-app my-nocobase-app -d sqlite +cd my-nocobase-app +yarn install +yarn nocobase install +``` + +Затем инициализируйте плагин и добавьте его в систему: + +```bash +yarn pm create @nocobase-sample/plugin-schema-settings-add-item +yarn pm enable @nocobase-sample/plugin-schema-settings-add-item +``` + +Запустите проект: + +```bash +yarn dev +``` + +После входа в систему перейдите по адресу [http://localhost:13000/admin/pm/list/local/](http://localhost:13000/admin/pm/list/local/), чтобы убедиться, что плагин установлен и активирован. + +## Реализация функциональности + +Перед началом работы с этим примером необходимо ознакомиться с основными концепциями: + +- [Руководство по SchemaSettings](/development/client/ui-schema/settings): Используется для настройки свойств блоков, полей и операций. +- [API SchemaSettings](https://client.docs.nocobase.com/core/ui-schema/schema-settings): Описание API для настройки свойств. +- [Протокол UI Schema](/development/client/ui-schema/what-is-ui-schema): Подробное описание структуры схемы и роли каждого свойства. +- [Дизайнер Designable](/development/client/ui-schema/designable): Используется для изменения схемы. +- [TableV2](https://client.docs.nocobase.com/components/table-v2): Документация по блоку Table. + +Для добавления новых элементов конфигурации в существующие блоки, поля или операции необходимо выполнение трех условий: + +- Компонент должен поддерживать новое свойство. +- Схема должна быть правильно настроена. +- Свойства схемы должны корректно передаваться в компонент. + +В данном примере мы добавим свойство `showIndex` в блок Table для управления отображением порядкового номера. + +- **Проверка поддержки свойства `showIndex` блоком TableV2**: Согласно [документации](https://client.docs.nocobase.com/components/table-v2), блок Table поддерживает свойство `showIndex`. +- **Проверка места хранения свойств компонента `TableV2` в схеме**: Согласно [документации](https://client.docs.nocobase.com/ui-schema/blocks/data/table), свойства хранятся в `x-decorator-props`. +- **Проверка передачи свойства `showIndex` в компонент `TableV2`**: Согласно [документации](https://client.docs.nocobase.com/ui-schema/blocks/data/table), свойство `showIndex` передается в компонент через `useTableBlockProps`. + +### 1. Определение SchemaSettingsItem + +Создайте файл `packages/plugins/@nocobase-sample/plugin-schema-settings-add-item/src/client/tableShowIndexSettingsItem.tsx`: + +```ts +import { SchemaSettingsItemType, useDesignable } from '@nocobase/client'; +import { useFieldSchema } from '@formily/react'; + +export const tableShowIndexSettingsItem: SchemaSettingsItemType = { + name: 'showIndex', + type: 'switch', + useComponentProps() { + return {}; + }, +}; +``` + +Мы определили элемент конфигурации `showIndex` с типом `switch`. + +- `name`: Имя элемента конфигурации, используемое для операций добавления, удаления и изменения. +- `type`: Тип элемента конфигурации, определяющий, какой компонент будет использоваться для рендеринга. Дополнительные типы см. в [API SchemaSettings](https://client.docs.nocobase.com/core/ui-schema/schema-settings#built-in-components-and-types). +- `useComponentProps`: Используется для настройки свойств компонента. + +### 2. Изменение схемы + +Обновите файл `tableShowIndexSettingsItem.tsx`: + +```diff +import { SchemaSettingsItemType, useDesignable } from '@nocobase/client'; +import { useFieldSchema } from '@formily/react'; + +export const tableShowIndexSettingsItem: SchemaSettingsItemType = { + name: 'showIndex', + type: 'switch', + useComponentProps() { ++ const fieldSchema = useFieldSchema(); ++ const dn = useDesignable(); ++ return { ++ title: 'Show Index', ++ checked: !!fieldSchema['x-decorator-props'].showIndex, ++ onChange(v: boolean) { ++ dn.deepMerge({ ++ 'x-uid': fieldSchema['x-uid'], ++ 'x-decorator-props': { ++ ...fieldSchema['x-decorator-props'], ++ showIndex: v, ++ }, ++ }); ++ }, ++ }; + }, +}; +``` + +**Хуки:** + +- [useFieldSchema](https://client.docs.nocobase.com/core/ui-schema/designable#usefieldschema): Используется для получения схемы текущего поля. +- [useDesignable](https://client.docs.nocobase.com/core/ui-schema/designable#usedesignable): Используется для изменения схемы. + +**Свойства:** + +- `title`: Заголовок компонента Switch. +- `checked`: Состояние переключателя, определяется через `fieldSchema['x-decorator-props'].showIndex`. Подробности см. в [Table Block Schema](https://client.docs.nocobase.com/ui-schema/blocks/data/table). +- `onChange`: Событие изменения значения переключателя, использует `dn.deepMerge` для обновления схемы. + +**`dn.deepMerge`:** Используется для изменения схемы. + +- `x-uid`: Уникальный идентификатор поля, используемый для запросов и изменений на сервере. +- `x-decorator-props`: Свойства поля, используемые для настройки компонента. + +### 3. Регистрация SchemaSettingsItem + +Обновите файл `packages/plugins/@nocobase-sample/plugin-schema-settings-add-item/src/client/index.ts`: + +```ts +import { Plugin } from '@nocobase/client'; +import { tableShowIndexSettingsItem } from './tableShowIndexSettingsItem' + +export class PluginSchemaSettingsAddItemClient extends Plugin { + async load() { + this.schemaSettingsManager.addItem('blockSettings:table', tableShowIndexSettingsItem.name, tableShowIndexSettingsItem) + } +} + +export default PluginSchemaSettingsAddItemClient; +``` + +После этого в конфигурации блока Table появится новый элемент `Show Index`. + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240601161535_rec_.mp4" type="video/mp4" /> +</video> + +## Сборка и развертывание в продакшен + +Следуйте инструкциям из документации [Сборка и упаковка плагина](/development/your-fisrt-plugin#сборка-и-упаковка-плагина) для сборки и развертывания плагина. + +Если вы используете клонированный исходный код, выполните полную сборку, чтобы собрать зависимости плагина: + +```bash +yarn build +``` + +Если проект создан с помощью `create-nocobase-app`, выполните: + +```bash +yarn build @nocobase-sample/plugin-schema-settings-add-item --tar +``` + +После этого в папке `storage/tar/@nocobase-sample/plugin-schema-settings-add-item.tar.gz` появится архив плагина. Установите его через [загрузку](/welcome/getting-started/plugin). diff --git a/docs/ru-RU/plugin-samples/schema-settings/index.md b/docs/ru-RU/plugin-samples/schema-settings/index.md new file mode 100644 index 0000000000..894237db4f --- /dev/null +++ b/docs/ru-RU/plugin-samples/schema-settings/index.md @@ -0,0 +1,13 @@ +# SchemaSettings + +[SchemaSettings](/development/client/ui-schema/settings) позволяет динамически настраивать свойства блоков, полей и операций путем изменения схемы. + +В зависимости от потребностей могут быть следующие сценарии расширения: + +- Добавление элементов в существующие SchemaSettings +- Создание новых SchemaSettings + +Для этих сценариев предоставлены следующие примеры: + +- [Создание новых SchemaSettings](/plugin-samples/schema-settings/new) +- [Добавление элементов в существующие SchemaSettings](/plugin-samples/schema-settings/add-item) diff --git a/docs/ru-RU/plugin-samples/schema-settings/new.md b/docs/ru-RU/plugin-samples/schema-settings/new.md new file mode 100644 index 0000000000..cf58158852 --- /dev/null +++ b/docs/ru-RU/plugin-samples/schema-settings/new.md @@ -0,0 +1,850 @@ +# Создание новых SchemaSettings + +## Описание сценария + +При добавлении нового блока, поля или операции может потребоваться создание дополнительных элементов конфигурации для управления отображением, поведением и т. д. В таких случаях необходимо создать новый `SchemaSettings`. + +## Описание примера + +Этот пример основан на [простом блоке](/plugin-samples/schema-initializer/block-simple) и дополняет его. В исходном примере был создан `SchemaSettings` только с элементом `remove`. В данном примере будут добавлены следующие элементы конфигурации: + +- `Edit block title`: Редактирование заголовка блока +- `Edit Image`: Редактирование изображения +- `Edit height`: Редактирование высоты изображения +- `objectFit`: Выбор свойства `object-fit` для изображения +- `Lazy`: Включение/выключение ленивой загрузки + +<br /> + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240602112410_rec_.mp4" type="video/mp4" /> +</video> + +Этот пример демонстрирует использование инициализатора. Подробности о расширении блоков см. в документации [Расширения блоков](/plugin-samples/block). + +Полный код примера доступен в [plugin-samples](https://github.com/nocobase/plugin-samples/tree/main/packages/plugins/%40nocobase-sample/plugin-schema-settings-new). + +## Инициализация плагина + +Следуйте инструкциям из документации [Создание первого плагина](/development/your-fisrt-plugin). Если у вас нет проекта, создайте его. Если проект уже есть или вы клонировали исходный код, пропустите этот шаг. + +```bash +yarn create nocobase-app my-nocobase-app -d sqlite +cd my-nocobase-app +yarn install +yarn nocobase install +``` + +Затем инициализируйте плагин и добавьте его в систему: + +```bash +yarn pm create @nocobase-sample/plugin-schema-settings-new +yarn pm enable @nocobase-sample/plugin-schema-settings-new +``` + +Запустите проект: + +```bash +yarn dev +``` + +После входа в систему перейдите по адресу [http://localhost:13000/admin/pm/list/local/](http://localhost:13000/admin/pm/list/local/), чтобы убедиться, что плагин установлен и активирован. + +## Реализация функциональности + +### 1. Создание блока/поля/операции + +Этот пример основан на [простом блоке](/plugin-samples/schema-initializer/simple-block), поэтому скопируйте каталог `packages/plugins/@nocobase-sample/plugin-initializer-block-simple/src/client` в `packages/plugins/@nocobase-sample/plugin-schema-settings-new/src/client`. + +Затем измените файл `packages/plugins/@nocobase-sample/plugin-schema-settings-new/src/client/index.tsx`: + +```diff +// ... +- import { Image } from './component'; ++ import { ImageV2 } from './component'; + +- export class PluginInitializerBlockSimpleClient extends Plugin { ++ export class PluginSchemaSettingsNewClient extends Plugin { + async load() { +- this.app.addComponents({ Image }) ++ this.app.addComponents({ ImageV2 }) + // ... + } +} + +- export default PluginInitializerBlockSimpleClient; ++ export default PluginSchemaSettingsNewClient; +``` + +Измените компонент `Image` в файле `packages/plugins/@nocobase-sample/plugin-schema-settings-new/src/client/component/Image.tsx`: + +```diff +- export const Image: FC<{ height?: number }> = withDynamicSchemaProps(({ height = 500 }) => { ++ export const ImageV2: FC<{ height?: number }> = withDynamicSchemaProps(({ height = 500 }) => { +``` + +Обновите файл `packages/plugins/@nocobase-sample/plugin-schema-settings-new/src/client/constants.ts`: + +```ts +export const BlockName = 'ImageV2'; +export const BlockNameLowercase = 'image-v2'; +``` + +### 2. Свойства компонента + +#### 2.1 Реализация компонента + +Сначала необходимо добавить поддержку требуемых свойств в компонент. + +Измените файл `packages/plugins/@nocobase-sample/plugin-schema-settings-new/src/client/component/Image.tsx`: + +```tsx | pure +import React, { FC } from 'react'; +import { withDynamicSchemaProps } from '@nocobase/client'; +import { BlockName } from '../constants'; + +export interface ImageV2Props { + src?: { url: string; title?: string }; + /** + * @default 500 + */ + height?: number; + /** + * @default 'cover' + */ + objectFit?: 'cover' | 'contain' | 'fill' | 'none' | 'scale-down'; + /** + * @default false + */ + lazy?: boolean; +} + +export const ImageV2: FC<ImageV2Props> = withDynamicSchemaProps((props) => { + const { src, height = 500, objectFit = 'cover', lazy = false } = props; + return <div style={{ height }}> + { + src ? <img + loading={lazy ? 'lazy' : 'eager'} + style={{ width: '100%', height: '100%', objectFit }} + src={src.url} + alt={src.title} + /> : null + } + </div> +}, { displayName: BlockName }) +``` + +#### 2.2 Проверка компонента + +Существует два способа проверки компонента: + +- Временная страница: Создайте временную страницу, отрендерите компонент `ImageV2` и проверьте, соответствует ли он требованиям. +- Проверка через документацию: Запустите документацию с помощью `yarn doc plugins/@nocobase-sample/plugin-schema-settings-new` и проверьте с помощью примеров в документации (TODO). + +Рассмотрим проверку через временную страницу. Создайте страницу, добавьте один или несколько компонентов `ImageV2` с различными параметрами и проверьте их работу. + +```tsx | pure +// ... +export class PluginSchemaSettingsNewClient extends Plugin { + async load() { + // ... + this.app.router.add('admin.image-component', { + path: '/admin/image-component', + Component: () => { + return <> + <div style={{ marginTop: 20, marginBottom: 20 }}> + <ImageV2 /> + </div> + + <div style={{ marginTop: 20, marginBottom: 20 }}> + <ImageV2 src={{ url: 'https://picsum.photos/1200/500' }} height={200} /> + </div> + + <div style={{ marginTop: 20, marginBottom: 20 }}> + <ImageV2 src={{ url: 'https://picsum.photos/1200/500' }} objectFit='contain' /> + </div> + + <div style={{ marginTop: 20, marginBottom: 20 }}> + <ImageV2 src={{ url: 'https://picsum.photos/1200/500' }} lazy /> + </div> + </> + } + }) + } +} +``` + +Перейдите по адресу [http://localhost:3000/admin/image-component](http://localhost:3000/admin/image-component) и проверьте, соответствует ли компонент требованиям. + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240601171433_rec_.mp4" type="video/mp4" /> +</video> + +После проверки удалите тестовую страницу. + +### 3. Реализация схемы + +#### 3.1 Определение схемы + +Измените файл `packages/plugins/@nocobase-sample/plugin-schema-settings-new/src/client/schema/index.ts`: + +```diff +import { ISchema } from "@nocobase/client"; +import { useFieldSchema } from '@formily/react'; +import { imageSettings } from "../settings"; +import { BlockName, BlockNameLowercase } from "../constants"; + ++ import { ImageV2Props } from "../component"; + ++ export function useImageV2Props(): ImageV2Props { ++ const fieldSchema = useFieldSchema(); ++ return fieldSchema.parent?.['x-decorator-props']?.[BlockNameLowercase]; ++ } + +export const imageSchema: ISchema = { + type: 'void', + 'x-component': 'CardItem', ++ 'x-decorator-props': { ++ [BlockNameLowercase]: {} ++ }, + properties: { + [BlockNameLowercase]: { + 'x-component': BlockName, ++ 'x-use-component-props': 'useImageV2Props' + } + }, + 'x-settings': imageSettings.name +}; +``` + +Свойства компонента `ImageV2` сохраняются в `x-decorator-props` под ключом `image-v2`, а доступ к ним осуществляется через `x-use-component-props`. + +`useImageV2Props()`: Возвращает свойства компонента `ImageV2`. + +- `useFieldSchema()`: Получает схему текущего поля, а через `parent` — схему родительского элемента. Для блока данных можно использовать [useDataBlockProps](https://client.docs.nocobase.com/core/data-block/data-block-provider#usedatablockprops) для получения свойств. + +#### 3.2 Проверка схемы + +```tsx | pure +// ... +export class PluginSchemaSettingsNewClient extends Plugin { + async load() { + // ... + this.app.router.add('admin.image-schema', { + path: '/admin/image-schema', + Component: () => { + return <> + <div style={{ marginTop: 20, marginBottom: 20 }}> + <SchemaComponent schema={{ + properties: { + test1: { + ...imageSchema, + 'x-decorator-props': { [BlockNameLowercase]: {} } + } + } + }} /> + </div> + <div style={{ marginTop: 20, marginBottom: 20 }}> + <SchemaComponent schema={{ + properties: { + test1: { + ...imageSchema, + 'x-decorator-props': { [BlockNameLowercase]: { src: { url: 'https://picsum.photos/1200/500' }, height: 200 } } + } + } + }} /> + </div> + <div style={{ marginTop: 20, marginBottom: 20 }}> + <SchemaComponent schema={{ + properties: { + test1: { + ...imageSchema, + 'x-decorator-props': { [BlockNameLowercase]: { src: { url: 'https://picsum.photos/1200/500' }, objectFit: 'contain' } } + } + } + }} /> + </div> + <div style={{ marginTop: 20, marginBottom: 20 }}> + <SchemaComponent schema={{ + properties: { + test1: { + ...imageSchema, + 'x-decorator-props': { [BlockNameLowercase]: { src: { url: 'https://picsum.photos/1200/500' }, lazy: true } } + } + } + }} /> + </div> + </> + } + }) + } +} +``` + +Перейдите по адресу [http://localhost:3000/admin/image-schema](http://localhost:3000/admin/image-schema) и проверьте, соответствует ли схема требованиям. + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240601171433_rec_.mp4" type="video/mp4" /> +</video> + +После проверки удалите тестовую страницу. + +### 4. Реализация SchemaSettings + +Создание `SchemaSettings` описано в документации [простого блока](/plugin-samples/schema-initializer/block-simple#4-реализация-schema-settings). + +### 5. Реализация элементов SchemaSettings + +#### 5.1 Реализация Edit block title + +Редактирование заголовка блока — это общая логика, для которой NocoBase предоставляет компонент `SchemaSettingsBlockTitleItem` (документация TODO). Его можно использовать напрямую. + +Измените файл `packages/plugins/@nocobase-sample/plugin-schema-settings-new/src/client/InfoBlock.tsx`: + +```diff +- import { SchemaSettingsBlockTitleItem } from "@nocobase/client"; ++ import { SchemaSettings, SchemaSettingsBlockTitleItem } from "@nocobase/client"; + +export const imageSettings = new SchemaSettings({ + name: 'blockSettings:image', + items: [ ++ { ++ name: 'editBlockTitle', ++ Component: SchemaSettingsBlockTitleItem, ++ }, + { + type: 'remove', + name: 'remove', + componentProps: { + removeParentsIfNoChildren: true, + breakRemoveOn: { + 'x-component': 'Grid', + }, + } + } + ] +}); +``` + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240602105024_rec_.mp4" type="video/mp4" /> +</video> + +Список других переиспользуемых элементов `SchemaSettings` см. в документации (TODO). + +#### 5.2 Реализация Edit Image + +##### 5.2.1 Реализация элемента SchemaSettings + +Создайте файл `packages/plugins/@nocobase-sample/plugin-schema-settings-new/src/client/settings/items/image.ts`: + +```ts +import { SchemaSettingsItemType, useDesignable, } from "@nocobase/client"; +import { useFieldSchema } from '@formily/react'; +import { useT } from "../../locale"; +import { BlockNameLowercase } from "../../constants"; + +export const imageSchemaSettingsItem: SchemaSettingsItemType = { + name: 'src', + type: 'actionModal', + useComponentProps() { + const filedSchema = useFieldSchema(); + const { deepMerge } = useDesignable(); + const t = useT(); + + return { + title: t('Edit Image'), + schema: { + type: 'object', + title: t('Edit Image'), + properties: { + src: { + title: t('Image'), + type: 'string', + default: filedSchema['x-decorator-props']?.[BlockNameLowercase]?.src, + 'x-decorator': 'FormItem', + 'x-component': 'Upload.Attachment', + 'x-component-props': { + action: 'attachments:create', + }, + }, + }, + }, + onSubmit(image: any) { + deepMerge({ + 'x-uid': filedSchema['x-uid'], + 'x-decorator-props': { + ...filedSchema['x-decorator-props'], + [BlockNameLowercase]: { + ...filedSchema['x-decorator-props']?.[BlockNameLowercase], + src: image.src, + }, + }, + }) + } + }; + }, +}; +``` + +Подробности о создании элементов `SchemaSettings` см. в [SchemaSettingsItem](https://client.docs.nocobase.com/core/ui-schema/schema-settings#optionsitems). + +- `type`: Встроенный тип. [actionModal](https://client.docs.nocobase.com/core/ui-schema/schema-settings#schemasettingsactionmodalitem) — это модальное окно. +- `name`: Уникальный идентификатор для операций добавления, удаления и изменения. +- `useComponentProps`: Возвращает свойства компонента `SchemaSettingsActionModalItem` для `actionModal`. + +`useComponentProps`: + +- Хуки: + - `useFieldSchema`: Получает схему текущего узла. + - `useDesignable`: Получает экземпляр `Designable`, метод `deepMerge` используется для объединения схемы. + - `x-uid`: Уникальный идентификатор текущего узла. + - `x-decorator-props`: Свойства текущего узла, содержащие свойства `image`. + +- Свойства: + - `title`: Заголовок модального окна. + - `schema`: Схема формы модального окна. + - [Upload.Attachment](https://client.docs.nocobase.com/components/upload): Компонент загрузки. + - [FormItem](https://client.docs.nocobase.com/components/form-item): Элемент формы. + - `onSubmit`: Событие отправки формы. + +##### 5.2.2 Использование элемента SchemaSettings + +Измените файл `packages/plugins/@nocobase-sample/plugin-schema-settings-new/src/client/settings/index.ts`: + +```diff +// ... ++ import { imageSchemaSettingsItem } from "./items/image"; + +export const imageSettings = new SchemaSettings({ + name: 'blockSettings:image', + items: [ + { + name: 'editBlockTitle', + Component: SchemaSettingsBlockTitleItem, + }, ++ imageSchemaSettingsItem, + { + type: 'remove', + name: 'remove', + componentProps: { + removeParentsIfNoChildren: true, + breakRemoveOn: { + 'x-component': 'Grid', + }, + } + } + ] +}); +``` + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240611173015_rec_.mp4" type="video/mp4" /> +</video> + +#### 5.3 Реализация Edit Height + +##### 5.3.1 Реализация элемента SchemaSettings + +Создайте файл `packages/plugins/@nocobase-sample/plugin-schema-settings-new/src/client/settings/items/height.ts`: + +```ts +import { SchemaSettingsItemType, useDesignable, } from "@nocobase/client"; +import { useFieldSchema } from '@formily/react'; +import { useT } from '../../locale' +import { BlockNameLowercase } from "../../constants"; + +export const heightSchemaSettingsItem: SchemaSettingsItemType = { + name: 'height', + type: 'actionModal', + useComponentProps() { + const filedSchema = useFieldSchema(); + const { deepMerge } = useDesignable(); + const t = useT(); + + return { + title: t('Edit height'), + schema: { + type: 'object', + title: t('Edit height'), + properties: { + height: { + title: t('Height'), + type: 'number', + default: filedSchema['x-decorator-props']?.[BlockNameLowercase]?.height, + 'x-decorator': 'FormItem', + 'x-component': 'InputNumber', + }, + }, + }, + onSubmit({ height }: any) { + deepMerge({ + 'x-uid': filedSchema['x-uid'], + 'x-decorator-props': { + ...filedSchema['x-decorator-props'], + [BlockNameLowercase]: { + ...filedSchema['x-decorator-props']?.[BlockNameLowercase], + height, + }, + }, + }) + } + }; + }, +}; +``` + +Подробности о создании элементов `SchemaSettings` см. в [SchemaSettingsItem](https://client.docs.nocobase.com/core/ui-schema/schema-settings#optionsitems). + +- `type`: Встроенный тип. [actionModal](https://client.docs.nocobase.com/core/ui-schema/schema-settings#schemasettingsactionmodalitem) — это модальное окно. +- `name`: Уникальный идентификатор для операций добавления, удаления и изменения. +- `useComponentProps`: Возвращает свойства компонента `SchemaSettingsActionModalItem` для `actionModal`. + +`useComponentProps`: + +- Хуки: + - `useFieldSchema`: Получает схему текущего узла. + - `useDesignable`: Получает экземпляр `Designable`, метод `deepMerge` используется для объединения схемы. + - `x-uid`: Уникальный идентификатор текущего узла. + - `x-decorator-props`: Свойства текущего узла, содержащие свойства `image`. + +- Свойства: + - `title`: Заголовок модального окна. + - `schema`: Схема формы модального окна. + - [InputNumber](https://client.docs.nocobase.com/components/input-number): Поле ввода чисел. + - [FormItem](https://client.docs.nocobase.com/components/form-item): Элемент формы. + - `onSubmit`: Событие отправки формы. + +##### 5.3.2 Использование элемента SchemaSettings + +Измените файл `packages/plugins/@nocobase-sample/plugin-schema-settings-new/src/client/settings/index.ts`: + +```diff +// ... ++ import { heightSchemaSettingsItem } from "./items/height"; + +export const imageSettings = new SchemaSettings({ + name: 'blockSettings:image', + items: [ + { + name: 'editBlockTitle', + Component: SchemaSettingsBlockTitleItem, + }, + imageSchemaSettingsItem, ++ heightSchemaSettingsItem, + { + type: 'remove', + name: 'remove', + componentProps: { + removeParentsIfNoChildren: true, + breakRemoveOn: { + 'x-component': 'Grid', + }, + } + } + ] +}); +``` + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240602110936_rec_.mp4" type="video/mp4" /> +</video> + +#### 5.4 Реализация ObjectFit + +##### 5.4.1 Реализация элемента SchemaSettings + +Создайте файл `packages/plugins/@nocobase-sample/plugin-schema-settings-new/src/client/items/objectFit.ts`: + +```ts +import { SchemaSettingsItemType, useDesignable, } from "@nocobase/client"; +import { useFieldSchema } from '@formily/react'; +import { useT } from "../../locale"; +import { BlockNameLowercase } from "../../constants"; + +export const objectFitSchemaSettingsItem: SchemaSettingsItemType = { + name: 'objectFit', + type: 'select', + useComponentProps() { + const filedSchema = useFieldSchema(); + const { deepMerge } = useDesignable(); + const t = useT(); + + return { + title: t('Object Fit'), + options: [ + { label: 'Cover', value: 'cover' }, + { label: 'Contain', value: 'contain' }, + { label: 'Fill', value: 'fill' }, + { label: 'None', value: 'none' }, + { label: 'Scale Down', value: 'scale-down' }, + ], + value: filedSchema['x-decorator-props']?.[BlockNameLowercase]?.objectFit || 'cover', + onChange(v) { + deepMerge({ + 'x-uid': filedSchema['x-uid'], + 'x-decorator-props': { + ...filedSchema['x-decorator-props'], + [BlockNameLowercase]: { + ...filedSchema['x-decorator-props']?.[BlockNameLowercase], + objectFit: v, + }, + }, + }) + }, + }; + }, +}; +``` + +Подробности о создании элементов `SchemaSettings` см. в [SchemaSettingsItem](https://client.docs.nocobase.com/core/ui-schema/schema-settings#optionsitems). + +- `type`: Встроенный тип. [select](https://client.docs.nocobase.com/core/ui-schema/schema-settings#schemasettingsselectitem) — это выпадающий список. +- `name`: Уникальный идентификатор для операций добавления, удаления и изменения. +- `useComponentProps`: Возвращает свойства компонента `SchemaSettingsSelectItem` для `select`. + +`useComponentProps`: + +- Хуки: + - `useFieldSchema`: Получает схему текущего узла. + - `useDesignable`: Получает экземпляр `Designable`, метод `deepMerge` используется для объединения схемы. + - `x-uid`: Уникальный идентификатор текущего узла. + - `x-decorator-props`: Свойства текущего узла, содержащие свойства `image`. + +- Свойства: + - `title`: Заголовок выпадающего списка. + - `options`: Варианты выбора. + - `value`: Значение по умолчанию. + - `onChange`: Событие изменения значения. + +##### 5.4.2 Использование элемента SchemaSettings + +Измените файл `packages/plugins/@nocobase-sample/plugin-schema-settings-new/src/client/settings/index.ts`: + +```diff +// ... ++ import { objectFitSchemaSettingsItem } from "./items/objectFit"; + +export const imageSettings = new SchemaSettings({ + name: 'blockSettings:image', + items: [ + { + name: 'editBlockTitle', + Component: SchemaSettingsBlockTitleItem, + }, + imageSchemaSettingsItem, + heightSchemaSettingsItem, ++ objectFitSchemaSettingsItem, + { + type: 'remove', + name: 'remove', + componentProps: { + removeParentsIfNoChildren: true, + breakRemoveOn: { + 'x-component': 'Grid', + }, + } + } + ] +}); +``` + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240602111256_rec_.mp4" type="video/mp4" /> +</video> + +#### 5.5 Реализация Lazy + +##### 5.5.1 Реализация элемента SchemaSettings + +Создайте файл `packages/plugins/@nocobase-sample/plugin-schema-settings-new/src/client/items/lazy.ts`: + +```ts +import { SchemaSettingsItemType, useDesignable, } from "@nocobase/client"; +import { useFieldSchema } from '@formily/react'; +import { useT } from "../../locale"; +import { BlockNameLowercase } from "../../constants"; + +export const lazySchemaSettingsItem: SchemaSettingsItemType = { + name: 'lazy', + type: 'switch', + useComponentProps() { + const filedSchema = useFieldSchema(); + const { deepMerge } = useDesignable(); + const t = useT(); + + return { + title: t('Lazy'), + checked: !!filedSchema['x-decorator-props']?.[BlockNameLowercase]?.lazy, + onChange(v) { + deepMerge({ + 'x-uid': filedSchema['x-uid'], + 'x-decorator-props': { + ...filedSchema['x-decorator-props'], + [BlockNameLowercase]: { + ...filedSchema['x-decorator-props']?.[BlockNameLowercase], + lazy: v, + }, + }, + }) + }, + }; + }, +}; +``` + +Подробности о создании элементов `SchemaSettings` см. в [SchemaSettingsItem](https://client.docs.nocobase.com/core/ui-schema/schema-settings#optionsitems). + +- `type`: Встроенный тип. [switch](https://client.docs.nocobase.com/core/ui-schema/schema-settings#schemasettingsswitchitem) — это переключатель. +- `name`: Уникальный идентификатор для операций добавления, удаления и изменения. +- `useComponentProps`: Возвращает свойства компонента `SchemaSettingsSwitchItem` для `switch`. + +`useComponentProps`: + +- Хуки: + - `useFieldSchema`: Получает схему текущего узла. + - `useDesignable`: Получает экземпляр `Designable`, метод `deepMerge` используется для объединения схемы. + - `x-uid`: Уникальный идентификатор текущего узла. + - `x-decorator-props`: Свойства текущего узла, содержащие свойства `image`. + +- Свойства: + - `title`: Заголовок переключателя. + - `checked`: Значение по умолчанию. + - `onChange`: Событие изменения переключателя. + +##### 5.5.2 Использование элемента SchemaSettings + +Измените файл `packages/plugins/@nocobase-sample/plugin-schema-settings-new/src/client/settings/index.ts`: + +```diff +// ... ++ import { lazySchemaSettingsItem } from "./items/lazy"; + +export const imageSettings = new SchemaSettings({ + name: 'blockSettings:image', + items: [ + { + name: 'editBlockTitle', + Component: SchemaSettingsBlockTitleItem, + }, + imageSchemaSettingsItem, + heightSchemaSettingsItem, + objectFitSchemaSettingsItem, ++ lazySchemaSettingsItem, + { + type: 'remove', + name: 'remove', + componentProps: { + removeParentsIfNoChildren: true, + breakRemoveOn: { + 'x-component': 'Grid', + }, + } + } + ] +}); +``` + +<video width="100%" controls=""> + <source src="https://static-docs.nocobase.com/20240602111748_rec_.mp4" type="video/mp4" /> +</video> + +#### 5.6 Добавление разделителей + +Элементы `editBlockTitle` и `remove` являются общими, тогда как `src`, `height`, `objectFit` и `lazy` специфичны для компонента `Image`. Для их разделения можно использовать `divider`. + +Измените файл `packages/plugins/@nocobase-sample/plugin-schema-settings-new/src/client/settings/index.ts`: + +```diff +// ... +export const imageSettings = new SchemaSettings({ + name: 'blockSettings:image', + items: [ + { + name: 'editBlockTitle', + Component: SchemaSettingsBlockTitleItem, + }, ++ { ++ name: 'divider1', ++ type: 'divider' ++ }, + imageSchemaSettingsItem, + heightSchemaSettingsItem, + objectFitSchemaSettingsItem, + lazySchemaSettingsItem, ++ { ++ name: 'divider2', ++ type: 'divider' ++ }, + { + type: 'remove', + name: 'remove', + componentProps: { + removeParentsIfNoChildren: true, + breakRemoveOn: { + 'x-component': 'Grid', + }, + } + } + ] +}); +``` + +![20240602112229](https://static-docs.nocobase.com/20240602112229.png) + +### 6. Мультиязычность + +:::warning +После изменения файлов локализации требуется перезапустить сервис, чтобы изменения вступили в силу. +::: + +#### 6.1 Английский язык + +Отредактируйте файл `packages/plugins/@nocobase-sample/plugin-schema-settings-new/src/locale/en-US.json`: + +```json +{ + "Image": "Image", + "Edit Image": "Edit Image", + "Images": "Images", + "Autoplay": "Autoplay", + "Edit height": "Edit Height", + "Height": "Height", + "Lazy": "Lazy" +} +``` + +#### 6.2 Китайский язык + +Отредактируйте файл `packages/plugins/@nocobase-sample/plugin-schema-settings-new/src/locale/zh-CN.json`: + +```json +{ + "Image": "图片", + "Edit Image": "编辑图片", + "Images": "图片", + "Edit height": "编辑高度", + "Height": "高度", + "Lazy": "懒加载" +} +``` + +Для поддержки других языков добавьте соответствующие файлы локализации. + +## Сборка и развертывание в продакшен + +Следуйте инструкциям из документации [Сборка и упаковка плагина](/development/your-fisrt-plugin#сборка-и-упаковка-плагина) для сборки и развертывания плагина. + +Если вы используете клонированный исходный код, выполните полную сборку, чтобы собрать зависимости плагина: + +```bash +yarn build +``` + +Если проект создан с помощью `create-nocobase-app`, выполните: + +```bash +yarn build @nocobase-sample/plugin-schema-settings-new --tar +``` + +После этого в папке `storage/tar/@nocobase-sample/plugin-schema-settings-new.tar.gz` появится архив плагина. Установите его через [загрузку](/welcome/getting-started/plugin). diff --git a/docs/ru-RU/welcome/changelog/0-template.md b/docs/ru-RU/welcome/changelog/0-template.md new file mode 100644 index 0000000000..d16266c6c2 --- /dev/null +++ b/docs/ru-RU/welcome/changelog/0-template.md @@ -0,0 +1,183 @@ +# Версия 1.0.0 - альфа +# 15:2024.05.19 + +## Новые возможности + +### Исправлены столбцы таблицы + +См. [Исправлены столбцы таблицы](https://docs-cn.nocobase.com/handbook/ui/fields/generic/table-column#%E5%9B%BA%E5%AE%9A%E5%88%97) + +<img src="https://static-docs.nocobase.com/202405191512587.png"/> + +### Поддержка добавления блоков Ганта, Канбана в модулях / выдвижных ящиках + +См. [Adding Blocks in Modals](https://docs-cn.nocobase.com/handbook/ui/pop-up) + +<img src="https://static-docs.nocobase.com/202405191512280.png"/> + +### Поддержка добавления правил привязки в подробные блоки + +Правила привязки в подробных блоках теперь поддерживают динамическую настройку отображения/скрытия полей. См. [Правила привязки в подробных блоках](https://docs-cn.nocobase.com/handbook/ui/blocks/data-blocks/details#%E8%81%94%E5%8A%A8%E8%A7%84%E5%88%99) + +<img src="https://static-docs.nocobase.com/202405191513781.png"/> + +### Авторизация: LDAP + +Добавлен плагин "Auth: LDAP" (компьютерный плагин), который позволяет пользователю войти в NocoBase, используя учетную запись сервера LDAP. Обратитесь к [Руководителю пользователя](https://docs-cn.nocobase.com/handbook/auth-ldap) + +<img src="https://static-docs.nocobase.com/202405191513995.png"/> + +### Узел HTTP-запроса рабочего процесса + +#### Поддержка формата данных `application/www-x-form-urlencoded` + +Ранее request node поддерживал только формат JSON (`application/json`) для основной части Content-Type. После обновления он также поддерживает настройку данных формата формы в парах ключ-значение. + +<img src="https://static-docs.nocobase.com/202405191514472.png"/> + +#### Поддержка шаблонов строк для полей ввода значений + +Ранее поля ввода значений в разделах `Заголовки` и `Параметры` узла запроса поддерживали только чистый ввод или выбор переменных. После обновления вы можете напрямую вводить строку со встроенными переменными. Оно будет автоматически проанализировано как конечное строковое значение перед отправкой запроса. + +<img src="https://static-docs.nocobase.com/202405191514748.png"/> + +### Событие пользовательского действия рабочего процесса + +Кнопка действия `Отправить в рабочий процесс`, изначально привязанная к типу прямого запуска `Событий после выполнения действия`, была разделена и независимо создана как кнопка действия `Запустить рабочий процесс` для `Пользовательских событий действия` (коммерческий плагин). Ранее добавленные кнопки действий в версии с открытым исходным кодом по-прежнему можно использовать, но они больше не поддерживаются для новых дополнений. Пожалуйста, используйте вместо них новое `Пользовательское событие действия`. Дополнительную информацию смотрите в [Руководстве по использованию](https://docs-cn.nocobase.com/handbook/workflow-custom-action-trigger). + +<img src="https://static-docs.nocobase.com/202405191515770.png"/> + +## Улучшения + +### Корректировки настроек действий + +#### Корректировки пользовательского интерфейса + +1. Сглажена иерархия меню и удалены некоторые операции переключения, поддерживающие повторные добавления. + +До: + +<img src="https://static-docs.nocobase.com/202405191516585.png"/> + +После: + +<img src="https://static-docs.nocobase.com/202405191516026.png"/> + +2. Объединены аналогичные действия + +2.1. Объединены опции `Добавить новое` и `Добавить запись` + +До: + +<img src="https://static-docs.nocobase.com/202405191516874.png"/> + +После: + +<img src="https://static-docs.nocobase.com/202405191516737.png"/> + +2.2 Объединены опции `Отправить` и `Сохранить запись`. + +До: + +<img src="https://static-docs.nocobase.com/202405191517966.png"/> + +После: + +<img src="https://static-docs.nocobase.com/202405191517078.png"/> + +#### Влияние на разработчиков + +Смотрите PR:<a href="https://github.com/nocobase/nocobase/pull/4336" target="_blank">рефакторинг: сглаживание и объединение действий #4336</a> + +### Журналы + +#### Список файлов плагина журнала + +До: В среде с несколькими приложениями подключаемый модуль log отображает списки файлов журнала всех приложений. + +После: В среде с несколькими приложениями подключаемый модуль log отображает только список файлов журнала текущего приложения. + +#### Пути к папкам рабочего процесса и пользовательских запросов + +До: Путь к папке для файлов журнала рабочего процесса и пользовательских запросов находится на том же уровне, что и папка журнала приложения. + +После: Путь к папке для файлов журнала рабочего процесса и пользовательских запросов относится к соответствующей папке журнала приложения. + +### Рабочий процесс + +#### Данные о результатах узла HTTP-запроса + +Ранее структура данных результата после успешного или неудачного HTTP-запроса узла была несогласованной. + +```js +// Only the response data part is returned when successful +{ + // Any JSON content +} + +// The failure returns the result of Axios's error.toJSON() function. +{ + config: {}, + headers: {}, + status: 500, + statusText: 'xxx', +} +``` + +Теперь ответ как на успешный, так и на неудачный результат будет последовательно сохранен в node result. + +```js +// Success +{ + config: {}, + headers: {}, + status: 200, + statusText: 'ok', + data: {} +} + +// Fail +{ + config: {}, + headers: {}, + status: 500, + statusText: 'xxx', + data: {} +} +``` + +Другие исключения, такие как отсутствие ответа от сервера (`статус` равен `null`) или неудачная инициализация, могут быть обнаружены в журналах обработки ошибок сервера. Смотрите более подробную информацию в <a href="https://github.com/nocobase/nocobase/issues/4373" target="_blank">[Рабочий процесс: узел HTTP-запроса] Тип результата узла не исправлен #4373</a> + +## Исправлена ошибка + +- Поля даты в графиках не были преобразованы в соответствии с часовым поясом клиента при объединении данных с измерением поля даты. <a href="https://github.com/nocobase/nocobase/pull/4366" target="_blank">исправление(data-vi): при форматировании даты #4366 следует использовать местный часовой пояс</a> + +- Плохое обновление представления; для обновления необходимо выйти из представлений базы данных и повторно войти в них. <a href="https://github.com/nocobase/nocobase/pull/4224" target="_blank">исправлено: поля коллекции должны обновляться после редактирования синхронизации из базы данных #4224</a> + +- Блоки древовидной таблицы не сворачивали все узлы при добавлении дочернего узла. <a href="https://github.com/nocobase/nocobase/pull/4289" target="_blank">исправлено: не сворачивать все узлы при добавлении дочернего узла в блок древовидной таблицы #4289</a> + +- Неверная настройка поля "Название коллекции". <a href="https://github.com/nocobase/nocobase/pull/4358" target="_blank">исправление: неверная настройка поля "название коллекции" #4358</a> + +- поле bigint потеряло точность в режиме read pretty. <a href="https://github.com/nocobase/nocobase/pull/4360" target="_blank">исправлено: поле bigint потеряло точность в режиме read pretty #4360</a> + +- Файлы журнала оставались открытыми после остановки вспомогательных приложений. <a href="https://github.com/nocobase/nocobase/pull/4380" target="_blank">исправлено (логгер): должен закрывать поток журналов после удаления приложения #4380</a> + +- Ошибка выбора поля ассоциации агрегатных узлов рабочего процесса. <a href="https://github.com/nocobase/nocobase/pull/4315" target="_blank">исправление(plugin-workflow-aggregate): исправлена связь в поле выбора #4315</a> + +- Параметр игнорировать ошибку был недопустим в режиме синхронизации узла HTTP-запроса. <a href="https://github.com/nocobase/nocobase/pull/4334" target="_blank">исправление (плагин-рабочий процесс-запрос): исправлена ошибка игнорирования в режиме синхронизации #4334</a> + +- Поля ввода значений в узле HTTP-запроса workflow переполнены. <ahref="https://github.com/nocobase/nocobase/pull/4353" target="_blank">исправлено(плагин-workflow-запрос): исправлено переполнение полей значений #4354</a> + +- Специальные символы вызывали зависание узла HTTP-запроса workflow. <ahref="https://github.com/nocobase/nocobase/pull/4376" target="_blank">исправление(plugin-workflow-request): исправлено зависание запроса при неверном значении заголовка #4376</a> + +- Установка marginBlock в редакторе тем повлияла на интервал между полями формы. <a href="https://github.com/nocobase/nocobase/pull/4374" target="_blank">исправление (редактор тем): маркер не должен влиять на интервал между полями формы.marginBlock #4374</a> + +- Исправлена ошибка, из-за которой нажатие на опцию "Лицензия" в правом верхнем углу страницы приводило к неправильному перенаправлению. [PR #4415](https://github.com/nocobase/nocobase/pull/4415) + +- Исправлена ошибка, из-за которой оператор поля становился недействительным после сохранения формы фильтра в виде шаблона блока. [PR #4390](https://github.com/nocobase/nocobase/pull/4390) + +## Документация + +- Добавлен пример документации по плагину: https://docs-cn.nocobase.com/plugin-samples + +- Обновлена структура документации для руководства по использованию рабочего процесса: https://docs-cn.nocobase.com/handbook/workflow diff --git a/docs/ru-RU/welcome/changelog/20240519.md b/docs/ru-RU/welcome/changelog/20240519.md new file mode 100644 index 0000000000..d34ccaace3 --- /dev/null +++ b/docs/ru-RU/welcome/changelog/20240519.md @@ -0,0 +1,100 @@ +# v1.0.0-alpha.15: 2024-05-19 + +## New features + +### Auth plugin: LDAP authentication + +Supports users logging in to NocoBase using their LDAP server credentials. For more information, refer to the [Authentication: LDAP](/handbook/auth-ldap) documentation. + +![](https://static-docs.nocobase.com/202405191513995.png) + +### Workflow plugin: custom action trigger + +When CRUD actions cannot satisfy your needs, you can use the custom action trigger of the workflow to orchestrate your own data processing logic. For more information, refer to the [Workflow / Custom action trigger](/handbook/workflow-custom-action-trigger) documentation. + +![](https://static-docs.nocobase.com/202405191515770.png) + +### Table block supports fixed columns + +![](https://static-docs.nocobase.com/202405191512587.png) + +### Supports adding Gantt and Kanban in pop-up windows + +![](https://static-docs.nocobase.com/202405191512280.png) + +### The details block supports linkage rules + +Allows configuring the visible and hidden properties of fields. + +![](https://static-docs.nocobase.com/202405191513781.png) + +### Workflow HTTP request node supports `application/www-x-form-urlencoded` format data + +![](https://static-docs.nocobase.com/202405191514472.png) + +### Workflow HTTP request node input boxes supports string templates + +![](https://static-docs.nocobase.com/202405191514748.png) + +### Plugin samples for development + +View the documentation for [plugin examples](/plugin-samples). + +![20240521105056](https://static-docs.nocobase.com/20240521105056.png) + +## Improvements + +### Improved "Configure actions" interaction + +All actions are displayed in a single list in the dropdown menu, no longer distinguishing between "Enable actions" and "Customize". + +- Actions that can only be added once: These actions retain the switch effect. +- Actions that can be added repeatedly: These actions no longer use the switch interaction and can be added multiple times. +- Merged similar actions + - “Add new” and “Add record” + - “Submit” and “Save record” + +![20240520153033](https://static-docs.nocobase.com/20240520153033.png) + +### Unified data format for workflow HTTP request node result: + +```js +{ + config: {}, + headers: {}, + status: 500, + statusText: 'xxx', + data: {} +} +``` + +### Reorganize workflow handbook + +![20240521104934](https://static-docs.nocobase.com/20240521104934.png) + +## Fixes + +### Log plugin now only shows logs of the current application + +When there are multiple applications: + +- The log plugin only displays the log file list for the current application. +- Workflow and custom request folders are placed within the application folder. + +![20240520152448](https://static-docs.nocobase.com/20240520152448.png) + +Other major fixes include: + +- Charts did not convert date fields to client time zone when querying aggregated data by date field. <a href="https://github.com/nocobase/nocobase/pull/4366" target="_blank">fix(data-vi): should use local timezone when formatting date #4366</a> +- View refresh issue, where the view needed to be exited and re-entered after syncing with the database. <a href="https://github.com/nocobase/nocobase/pull/4224" target="_blank">fix: collection fields should be refreshed after editing sync from database #4224</a> +- Tree table block did not collapse all nodes when adding a child node. <a href="https://github.com/nocobase/nocobase/pull/4289" target="_blank">fix: do not collapse all nodes when adding a child node in the tree table block #4289</a> +- Data table title field settings were invalid. <a href="https://github.com/nocobase/nocobase/pull/4358" target="_blank">fix: collection title field setting is invalid #4358</a> +- Bigint field lost precision in read-only mode. <a href="https://github.com/nocobase/nocobase/pull/4360" target="_blank">fix: bigint field loses precision in read pretty mode #4360</a> +- Open log files were not closed after stopping a sub-application. <a href="https://github.com/nocobase/nocobase/pull/4380" target="_blank">fix(logger): should close log stream after destroying app #4380</a> +- Workflow aggregate node relationship data model selection bug. <a href="https://github.com/nocobase/nocobase/pull/4315" target="_blank">fix(plugin-workflow-aggregate): fix association field select #4315</a> +- Ignoring errors option was ineffective in synchronous mode for workflow HTTP request node. <a href="https://github.com/nocobase/nocobase/pull/4334" target="_blank">fix(plugin-workflow-request): fix ignoreFail in sync mode #4334</a> +- Workflow HTTP request node value input box overflowed. <a href="https://github.com/nocobase/nocobase/pull/4353" target="_blank">fix(plugin-workflow-request): fix value fields overflowing #4354</a> +- Special characters caused workflow HTTP request node to hang. <a href="https://github.com/nocobase/nocobase/pull/4376" target="_blank">fix(plugin-workflow-request): fix request hanging when invalid header value #4376</a> +- Fixed issue where setting marginBlock in the theme editor affected form field spacing. <a href="https://github.com/nocobase/nocobase/pull/4374" target="_blank">fix(theme-editor): form field spacing should not be affected by token.marginBlock #4374</a> +- Fixed issue where clicking the "License" option in the top right corner of the page redirected incorrectly. [PR #4415](https://github.com/nocobase/nocobase/pull/4415) +- Fixed issue where the field operator was invalid when saving a filter form as a block template. [PR #4390](https://github.com/nocobase/nocobase/pull/4390) diff --git a/docs/ru-RU/welcome/changelog/20240607.md b/docs/ru-RU/welcome/changelog/20240607.md new file mode 100644 index 0000000000..4e3f358ae7 --- /dev/null +++ b/docs/ru-RU/welcome/changelog/20240607.md @@ -0,0 +1,144 @@ +# v1.0.1-alpha.1: 2024-06-07 + +## Новые функции + +### Блоки поддерживают настройку высоты (<a href="https://github.com/nocobase/nocobase/pull/4441" target="_blank">#4441</a>) + +![20240603115253](https://static-docs.nocobase.com/20240603115253.gif) + +Документация: + +- [Настройка высоты блока](/handbook/ui/blocks/block-settings/block-height) + +### Действие "Ссылка": переход по указанному URL (<a href="https://github.com/nocobase/nocobase/pull/4506" target="_blank">#4506</a>) + +Поддержка переменных в URL и параметрах запроса. + +<video width="100%" height="440" controls> + + <source src="https://static-docs.nocobase.com/20240603224044.mp4" type="video/mp4"> + +</video> + +Документация: + +- [Действие "Ссылка"](/handbook/ui/actions/types/link) + +### Add a new variable called "URL search params" (<a href="https://github.com/nocobase/nocobase/pull/4506" target="_blank">#4506</a>) + +Доступна только при наличии строки запроса в URL страницы, что упрощает использование вместе с[действием "Ссылка"](/handbook/ui/actions/types/link). + +![20240603170651](https://static-docs.nocobase.com/20240603170651.png) + +Документация: + +- [Параметры URL-запроса](/handbook/ui/variables#url-search-params) +- [Действие "Ссылка"](/handbook/ui/actions/types/link) + +### Поддержка переменных в iframe (<a href="https://github.com/nocobase/nocobase/pull/4512" target="_blank">#4512</a>) + +![20240603114711](https://static-docs.nocobase.com/20240603114711.png) + +![20240603114750](https://static-docs.nocobase.com/20240603114750.png) + +Документация: + +- [Блок iframe](/handbook/block-iframe) + +### Настройка размера и типа файлов в хранилищах (<a href="https://github.com/nocobase/nocobase/pull/4118" target="_blank">#4118</a>) + +![20240603115303](https://static-docs.nocobase.com/20240603115303.png) + +Документация: + +- [Файловые хранилища](/handbook/file-manager/storage) + +### Рабочие процессы: поддержка выбора части пути объектов данных как значения переменных + +![20240531211727](https://static-docs.nocobase.com/20240531211727.png) + +### Поддержка предпросмотра URL-полей (<a href="https://github.com/nocobase/nocobase/pull/4559" target="_blank">#4559</a>) + +В текущей версии поддерживается только предпросмотр изображений. + +![337101796-916a6c97-bc08-4560-9526-53e482e2ac6c](https://static-docs.nocobase.com/337101796-916a6c97-bc08-4560-9526-53e482e2ac6c.gif) + +### Визуализация данных: поддержка переменных "Параметры URL-запроса" и "Текущая роль" (<a href="https://github.com/nocobase/nocobase/pull/4586" target="_blank">#4586</a>) + +![data-visualization-filter-block](https://static-docs.nocobase.com/202406071148997.png) + +![data-visualization-filter](https://static-docs.nocobase.com/202406071149567.png) + +## Улучшения + +### Оптимизация импорта и экспорта (<a href="https://github.com/nocobase/nocobase/pull/4468" target="_blank">#4468</a>) + +Улучшена стабильность функции импорта и экспорта, увеличен лимит импорта и экспорта до 2000 записей. Поддержка расширенной логики импорта и экспорта пользовательских типов полей. + +![20240611112948](https://static-docs.nocobase.com/20240611112948.png) + +### Избегание ошибочных действий путем отключения опции переменной даты (<a href="https://github.com/nocobase/nocobase/pull/4452" target="_blank">#4452</a>) + +За исключением "текущего времени", переменные, представляющие даты, являются интервалами (массивами), а не моментами (строками). Они могут использоваться для фильтрации, но не могут напрямую использоваться как значения по умолчанию. + +![20240527150429](https://static-docs.nocobase.com/20240527150429.png) + +### Оптимизация взаимодействия правила связи (<a href="https://github.com/nocobase/nocobase/pull/4492" target="_blank">#4492</a>) + +Поля с множественным выбором не показывают опции назначения. Если выбрано поле с одиночным выбором и выполнено назначение, затем переключение на поле с множественным выбором очистит конфигурацию. + +![20240603143309](https://static-docs.nocobase.com/20240603143309.png) + +### Корректировка иконки в правом верхнем углу столбца действий в блоке таблицы (<a href="https://github.com/nocobase/nocobase/pull/4538" target="_blank">#4538</a>) + +![20240603115131](https://static-docs.nocobase.com/20240603115131.png) + +### Обработка ошибок (<a href="https://github.com/nocobase/nocobase/pull/4459" target="_blank">#4459</a>) + +Уточнение обработки ошибок для различных компонентов на стороне клиента, чтобы предотвратить выход из строя всей страницы из-за ошибки на стороне клиента. + +![error-fallback](https://static-docs.nocobase.com/20240604122043_rec_.gif) + +### Сбор информации для отладки и быстрая загрузка логов при ошибке на стороне клиента (<a href="https://github.com/nocobase/nocobase/pull/4524" target="_blank">#4524</a>) + +![error-fallback-log](https://static-docs.nocobase.com/202406041224009.png) + +### Другие улучшения + +- Изменение ограничения длины имени пользователя на 1-50 символов (<a href="https://github.com/nocobase/nocobase/pull/4502" target="_blank">#4502</a>) +- Не скрывать поля внешнего ключа(<a href="https://github.com/nocobase/nocobase/pull/4499" target="_blank">#4499</a>) + +## Исправления ошибок + +### Область данных в диалоговом окне настройки разрешений не должна поддерживать переменные "Текущая форма" и "Текущая всплывающая запись". (<a href="https://github.com/nocobase/nocobase/pull/4484" target="_blank">#4484</a>) + +![20240527145519](https://static-docs.nocobase.com/20240527145519.png) + +### Поддержка прямого выбора значения переменной в качестве значения по умолчанию для поля связи (<a href="https://github.com/nocobase/nocobase/pull/4439" target="_blank">#4439</a>) + +![20240603121447](https://static-docs.nocobase.com/20240603121447.png) + +### Исправлена ошибка при многократном добавлении действия "Пользовательский запрос". (<a href="https://github.com/nocobase/nocobase/pull/4458" target="_blank">#4458</a>) + +![20240603115234](https://static-docs.nocobase.com/20240603115234.png) + +### Другие + +- Исправлена проблема, из-за которой содержимое вложенной таблицы не очищалось после отправки формы. (<a href="https://github.com/nocobase/nocobase/pull/4475" target="_blank">#4475</a>) +- Исправлена проблема с неправильным использованием переменной "Текущий объект" во вложенной таблице. (<a href="https://github.com/nocobase/nocobase/pull/4521" target="_blank">#4521</a>) +- добавлена опция "Устанавливать уровень масштабирования по умолчанию" для полей карты. (<a href="https://github.com/nocobase/nocobase/pull/4527" target="_blank">#4527</a>) +- Исправлена проблема, из-за которой блок не отображался при добавлении блока с использованием шаблонов блоков во всплывающем окне. (<a href="https://github.com/nocobase/nocobase/pull/4531" target="_blank">#4531</a>) +- Исправлена проблема со стилем шаблонов данных формы. (<a href="https://github.com/nocobase/nocobase/pull/4536" target="_blank">#4536</a>) +- Рабочий процесс: стиль поля выражений исчез в узле вычислений. (<a href="https://github.com/nocobase/nocobase/pull/4513" target="_blank">#4513</a>) +- Рабочий процесс: неверный тип поля при создании в пользовательской форме узла вручную. (<a href="https://github.com/nocobase/nocobase/pull/4519" target="_blank">#4519</a>) +- Рабочий процесс: проблема с разрешением на запуск пользовательского события действия. (<a href="https://github.com/nocobase/nocobase/pull/4522" target="_blank">#4522</a>) +- Рабочий процесс: неправильная настройка глубины предварительной загрузки для нескольких источников данных. (<a href="https://github.com/nocobase/nocobase/pull/4526" target="_blank">#4526</a>) +- ошибка в библиотеке json-шаблонов. (<a href="https://github.com/nocobase/nocobase/pull/4525" target="_blank">#4525</a>) +- Файловый менеджер: ошибка при загрузке или удалении файла на COS. (<a href="https://github.com/nocobase/nocobase/pull/4529" target="_blank">#4529</a>, <a href="https://github.com/nocobase/nocobase/pull/4537" target="_blank">#4537</a>) +- Правило привязки формы отображает [object Объект] при присвоении числовому полю значения 0,00. (<a href="https://github.com/nocobase/nocobase/pull/4482" target="_blank">#4482</a>) +- В подтаблице отсутствует элемент настройки элемента управления для кнопки "Добавить новую". (<a href="https://github.com/nocobase/nocobase/pull/4498" target="_blank">#4498</a>) +- В кнопке "Отправить" в форме редактирования таблицы отсутствует элемент настройки правила привязки. (<a href="https://github.com/nocobase/nocobase/pull/4515" target="_blank">#4515</a>) +- Визуализация данных: устранена проблема с невидимостью компонентов полей при установке значений по умолчанию для полей фильтра диаграммы (<a href="https://github.com/nocobase/nocobase/pull/4509" target="_blank">#4509</a>) +- Проверка подлинности: устранена проблема, из-за которой страница регистрации не была найдена для недавно созданного базового средства проверки подлинности. (<a href="https://github.com/nocobase/nocobase/pull/4556" target="_blank">#4556</a>) +- Локализация: исправлена ошибка, из-за которой заголовки страниц не переводились при переводе текстов меню. (<a href="https://github.com/nocobase/nocobase/pull/4557" target="_blank">#4557</a>) +- Map: исправлена ошибка, из-за которой AMap отображал ошибку ключа, несмотря на правильную настройку. (<a href="https://github.com/nocobase/nocobase/pull/4574" target="_blank">#4574</a>) diff --git a/docs/ru-RU/welcome/community/contributing.md b/docs/ru-RU/welcome/community/contributing.md new file mode 100644 index 0000000000..788842c08c --- /dev/null +++ b/docs/ru-RU/welcome/community/contributing.md @@ -0,0 +1,50 @@ +# Участие в разработке + +- Сделайте форк исходного кода в свой репозиторий +- Внесите изменения в исходный код +- Отправьте pull request +- Подпишите лицензионное соглашение участника (CLA) + +## Скачать + +```bash +# Замените следующий адрес git на свой собственный репозиторий +git clone https://github.com/nocobase/nocobase.git +cd nocobase +yarn install +``` + +## Разработка и тестирование + +```bash +# Установить зависимости и запустить приложение +yarn dev +# Запустить все тесты +yarn test +# Запустить все тесты в папке +yarn test <dir> +# Запустить один тестовый файл +yarn test <file> +``` + +## Просмотр документации + +```bash +# Запустить локальный просмотр документации +yarn doc --lang=zh-CN +yarn doc --lang=en-US +yarn doc --lang=ru-RU +``` + +Документация находится в каталоге `docs` и оформлена в формате Markdown: + +```bash +|- /docs/ + |- en-US + |- zh-CN + |- ru-RU +``` + +## Прочее + +Для получения дополнительных CLI-команд см. [refer to the NocoBase CLI chapter](https://docs-cn.nocobase.com/api/cli). diff --git a/docs/ru-RU/welcome/community/faq.md b/docs/ru-RU/welcome/community/faq.md new file mode 100644 index 0000000000..4514b4c106 --- /dev/null +++ b/docs/ru-RU/welcome/community/faq.md @@ -0,0 +1 @@ +# FAQ diff --git a/docs/ru-RU/welcome/community/thanks.md b/docs/ru-RU/welcome/community/thanks.md new file mode 100644 index 0000000000..8f19b4789f --- /dev/null +++ b/docs/ru-RU/welcome/community/thanks.md @@ -0,0 +1,12 @@ +# Acknowledgements + +NocoBase использует отличные и проверенные open source-продукты, за что выражает им искреннюю благодарность. + +- [Ant Design](https://ant.design/) +- [Dnd Kit](https://dndkit.com/) +- [Formily](https://github.com/alibaba/formily) +- [I18next](https://www.i18next.com/) +- [Koa](https://koajs.com/) +- [React](https://reactjs.org/) +- [Sequelize](https://sequelize.org/) +- [UmiJS](https://umijs.org/) diff --git a/docs/ru-RU/welcome/community/translations.md b/docs/ru-RU/welcome/community/translations.md new file mode 100644 index 0000000000..ff3b896e74 --- /dev/null +++ b/docs/ru-RU/welcome/community/translations.md @@ -0,0 +1,369 @@ +# Перевод + +Языком по умолчанию в NocoBase является английский. В настоящее время основное приложение поддерживает Английский, Итальянский, Нидерландский, Упрощённый китайский, Японский языки и Русский язык. Мы искренне приглашаем вас внести вклад в перевод на другие языки, чтобы пользователи по всему миру могли получать ещё больше удовольствия и удобства от использования NocoBase. + +--- + +## I. Локализация системы + +### 1. Перевод интерфейса системы и плагинов + +#### 1.1 Область перевода +Это относится только к переводу интерфейса системы NocoBase и встроенных плагинов, и **не распространяется** на другие пользовательские материалы (например, таблицы данных или Markdown-блоки). +![bbb6e0b44aeg](https://static-docs.nocobase.com/img_v3_02kh_8d429938-3aca-44b6-a437-bbb6e0b44aeg.jpg) + +![20250319220127](https://static-docs.nocobase.com/20250319220127.png) + + +#### 1.2 Обзор локализуемого контента +NocoBase использует Git для управления файлами локализации. Основной репозиторий находится по адресу: +https://github.com/nocobase/locales + +Каждый язык представлен отдельным JSON-файлом, название которого соответствует языковому коду (например, `de-DE.json`, `fr-FR.json`). +Структура файла организована по модулям плагинов и использует пары ключ-значение для хранения переводов. +Пример: + +```json +{ + // Client plugin + "@nocobase/client": { + "(Fields only)": "(Fields only)", + "12 hour": "12 hour", + "24 hour": "24 hour" + // ...other key-value pairs + }, + "@nocobase/plugin-acl": { + // Key-value pairs for this plugin + } + // ...other plugin modules +} +``` + +При переводе, пожалуйста, постепенно приводите структуру к следующему формату: + +```json +{ + // Клиентский JSON + "@nocobase/client": { + "(Fields only)": "(Только поля)", + "12 hour": "12 часов", + "24 hour": "24 часа" + // ... другие ключ-значения + }, + "@nocobase/plugin-acl": { + // Ключ-значение для плагина + } + // ...другие плагины +} +} +``` + +#### 1.3 Тестирование и синхронизация перевода +- После завершения перевода обязательно протестируйте отображение всех текстов в интерфейсе. + Мы также выпустили плагин для проверки перевода — найдите его в маркетплейсе плагинов под названием `Locale tester`. +![20250422233152](https://static-docs.nocobase.com/20250422233152.png) +После установки плагина скопируйте содержимое соответствующего JSON-файла локализации из репозитория Git, вставьте его в поле ввода и нажмите OK — так вы сможете проверить, корректно ли работает ваш перевод. +![20250422233950](https://static-docs.nocobase.com/20250422233950.png) + +- После отправки переводов системные скрипты автоматически синхронизируют локализованный контент с исходным кодом в репозитории. + +## II. Локализация документации и пользовательского руководства + +Контент для локализации документации и руководства пользователя хранится в следующем разделе: +https://github.com/nocobase/docs + +Локализация реализуется путём добавления отдельных директорий для каждого языка, например: +https://github.com/nocobase/docs/blob/main/docs/en-US/ + +![Documentation Localization Diagram](https://static-docs.nocobase.com/20250319121816.png) + +Примечания: +- Для изменений в текстах директории, пожалуйста, обратитесь к: + https://github.com/nocobase/docs/blob/main/docs/config/ + + ![Directory Text Diagram](https://static-docs.nocobase.com/20250319121853.png) + +- Изменения текстов глобальных компонентов находятся по адресу: + https://github.com/nocobase/docs/blob/main/.dumi/theme/builtins/ + + Например, текстовая информация о плагинах: + https://github.com/nocobase/docs/blob/main/.dumi/theme/builtins/PluginInfo.tsx + + ![Plugin Information Diagram](https://static-docs.nocobase.com/20250319122109.png) + +## III. Локализация сайта (Подробное руководство) + +Страницы сайта и весь контент расположен по адресу: +https://github.com/nocobase/website + +### 3.0 Начало работы и справочные ресурсы + +При добавлении нового языка, пожалуйста, ориентируйтесь на уже существующие страницы: +- English: https://github.com/nocobase/website/blob/main/src/en/ +- Chinese: https://github.com/nocobase/website/blob/main/src/cn/ +- Japanese: https://github.com/nocobase/website/blob/main/src/ja/ +- Русский: https://github.com/nocobase/website/blob/main/src/ru/ + +![Website Localization Diagram](https://static-docs.nocobase.com/20250319121600.png) + +Изменения глобальных стилей размещаются по адресам: +- English: https://github.com/nocobase/website/blob/main/src/layouts/BaseEN.astro +- Chinese: https://github.com/nocobase/website/blob/main/src/layouts/BaseCN.astro +- Japanese: https://github.com/nocobase/website/blob/main/src/layouts/BaseJA.astro +- Русский: https://github.com/nocobase/website/blob/main/src/layouts/BaseRU.astro + +![Global Style Diagram](https://static-docs.nocobase.com/20250319121501.png) + +Глобальная локализация компонентов сайта доступна по ссылке: +https://github.com/nocobase/website/tree/main/src/components + +![Website Components Diagram](https://static-docs.nocobase.com/20250319122940.png) + +### 3.1 Структура контента и метод локализации + +Мы используем смешанный подход к управлению контентом. Контент на Английском, Китайском, Японском и Русском языке регулярно синхронизируется с CMS и перезаписывается, а другие языки можно редактировать напрямую в локальных файлах. Локальный контент хранится в директории content, структура следующая: +``` +/content + /articles # Статьи блога + /article-slug + index.md # Английский контент (по умолчанию) + index.cn.md # Китайский контент + index.ja.md # Японский контент + metadata.json # Метаданные и параметры локализации + /tutorials # Обучающие материалы + /releases # Информация о релизах + /pages # Статические страницы + /categories # Информация о категориях + /article-categories.json # Список категорий статей + /category-slug # Данные отдельной категории + /category.json + /tags # Информация о тегах + /article-tags.json # Теги статей + /release-tags.json # Теги релизов + /tag-slug # Данные отдельного тега + /tag.json + /help-center # Контент Центра помощи + /help-center-tree.json # Структура навигации по помощи + .... +``` + +### 3.2 Рекомендации по переводу контента + +- Перевод Markdown-файлов + +1. Создайте новый файл для нужного языка на основе стандартного (например, `index.md` → `index.fr.md`) +2. Добавьте локализованные значения в соответствующие поля JSON-файла +3. Соблюдайте структуру файлов, ссылки и изображения + +- Перевод JSON-контента +Многие метаданные хранятся в JSON-файлах, в которых используются многоязычные поля: + +```json +{ + "id": 123, + "title": "English Title", // Английский заголовок (по умолчанию) + "title_cn": "中文标题", // Китайский заголовок + "title_ja": "日本語タイトル", // Японский заголовок + "title_ru": "Русский заголовок",// Русский заголовок + "description": "English description", + "description_cn": "中文描述", + "description_ja": "日本語の説明", + "description_ru": "Русское описание", + "slug": "article-slug", // URL (обычно не переводится) + "status": "published", + "publishedAt": "2025-03-19T12:00:00Z" +} +``` + +**Примечания по переводу:** + +1. **Именование полей:**: Используйте формат `{original_field}_{language_code}` + - Например: title_fr (французский заголовок), description_de (описание на немецком) + +2. **При добавлении нового языка:**: + - Создайте версии всех необходимых полей с соответствующим суффиксом языка + - Не изменяйте оригинальные значения (например, title, description), они используются как контент по умолчанию + +3. **Механизм синхронизации CMS:**: + - CMS периодически обновляет данные на Английском, Китайском, Японском и Русском языках + - При этом **не удаляются поля** других языков, добавленные вручную + - Например, поле `title_fr` с французским переводом останется без изменений после синхронизации + + +### 3.3 Настройка поддержки нового языка + +Чтобы добавить поддержку нового языка, измените объект `SUPPORTED_LANGUAGES` в файле `src/utils/index.ts`: + +```typescript +export const SUPPORTED_LANGUAGES = { + en: { + code: 'en', + locale: 'en-US', + name: 'English', + default: true + }, + cn: { + code: 'cn', + locale: 'zh-CN', + name: 'Chinese' + }, + ja: { + code: 'ja', + locale: 'ja-JP', + name: 'Japanese' + }, + // Пример добавления нового языка: + ru: { + code: 'ru', + locale: 'ru-RU', + name: 'Russian' + } +}; +``` + +### 3.4 Файлы шаблонов и стили + +Каждому языку должен соответствовать свой layout-файл: + +1. Создайте новый файл шаблона, например, `src/layouts/BaseRU.astro` +2. Скопируйте существующий (например, `BaseEN.astro`) и переведите его +3. В шаблоне локализуются глобальные элементы — меню, футеры и пр. +4. Обязательно обновите конфигурацию переключателя языков + +### 3.5 Создание директорий для страниц на новом языке + +Создайте независимые каталоги страниц для нового языка: + +1. В каталоге `src` создайте новую папку с кодом языка (например, `src/ru/`) +2. Скопируйте структуру из существующего языка (например, `src/en/`) +3. Переведите содержимое страниц: заголовки, описания, текст +4. Убедитесь, что используется правильный layout-файл (`.layout: '@/layouts/BaseFR.astro'`) + +### 3.6 Локализация компонентов + +Часто используемые компоненты тоже требуют перевода: + +1. Проверьте содержимое `src/components/` +2. Особое внимание уделите элементам с фиксированным текстом (меню, футер и пр.) +3. В компонентах может использоваться условный рендеринг: + +```astro +{Astro.url.pathname.startsWith('/en') && <p>English content</p>} +{Astro.url.pathname.startsWith('/cn') && <p>中文内容</p>} +{Astro.url.pathname.startsWith('/fr') && <p>Contenu français</p>}\ +{Astro.url.pathname.startsWith('/ru') && <p>Контент на Русском</p>} +``` + +### 3.7 Тестирование и проверка + +После завершения перевода убедитесь в корректной работе: + +1. Запустите сайт локально (`yarn dev`) +2. Проверьте отображение всех страниц на новом языке +3. Убедитесь, что переключение языков работает корректно +4. Проверьте правильность всех ссылок +5. Убедитесь, что вёрстка не ломается из-за длины переведённого текста + +## IV. Как начать перевод + +Если вы хотите внести перевод на новый язык в NocoBase, следуйте инструкции: + +1. Для интерфейса системы — клонируйте репозиторий: https://github.com/nocobase/locales +Создайте JSON-файл для нового языка на основе существующего. +2. Для документации — клонируйте: https://github.com/nocobase/docs + Создайте папку с кодом языка и начните перевод. +3. Для сайта — клонируйте: https://github.com/nocobase/website + Создайте страницы нового языка, ориентируясь на текущие. + +После завершения перевода создайте Pull Request. Новый язык появится в конфигурации системы и станет доступен для отображения. +![Enabled Languages Diagram](https://static-docs.nocobase.com/20250319123452.png) + +## Устаревшая информация + +The NocoBase language files are located at the following locations: + +```shell +packages/core/**/src/locale +packages/plugins/**/src/locale +``` + +Файлы локализации NocoBase находятся в следующих директориях: + +https://github.com/nocobase/nocobase/tree/main/packages/core/client/src/locale + +Скопируйте файл `en_US.ts`, переименуйте в соответствие с новым языковым кодом и переведите его строки. После завершения отправьте `Pull Request` — язык будет добавлен в конфигурацию. + +<img src="./translations/enabled-languages.jpg" style="max-width: 800px;"/> + +## Поддерживаемые языки и прогресс локализации + +В таблице ниже указаны доступные языки и прогресс их локализации (см. оригинальный документ). + +| Language Culture Name | Display Name | Progress | Contributors | +| ---------------------------------------------------------------------------------------------------------------------------- | -------------------- | --- | --- | +| ar-EG | العربية | | | +| az-AZ | Azərbaycan dili | | | +| bg-BG | Български | | | +| bn-BD | Bengali | | | +| by-BY | Беларускі | | | +| ca-ES | Сatalà/Espanya | | | +| cs-CZ | Česky | | | +| da-DK | Dansk | | | +| [de-DE](https://github.com/nocobase/locales/blob/main/de-DE.json "https://github.com/nocobase/locales/blob/main/de-DE.json") | Deutsch | | | +| el-GR | Ελληνικά | | | +| en-GB | English(GB) | | | +| [en-US](https://github.com/nocobase/locales/blob/main/en-US.json "https://github.com/nocobase/locales/blob/main/en-US.json") | English | | | +| [es-ES](https://github.com/nocobase/locales/blob/main/es-ES.json "https://github.com/nocobase/locales/blob/main/es-ES.json") | Español | | | +| et-EE | Estonian (Eesti) | | | +| fa-IR | فارسی | | | +| fi-FI | Suomi | | | +| fr-BE | Français(BE) | | | +| fr-CA | Français(CA) | | | +| [fr-FR](https://github.com/nocobase/locales/blob/main/fr-FR.json "https://github.com/nocobase/locales/blob/main/fr-FR.json") | Français | | | +| ga-IE | Gaeilge | | | +| gl-ES | Galego | | | +| he-IL | עברית | | | +| hi-IN | हिन्दी | | | +| hr-HR | Hrvatski jezik | | | +| hu-HU | Magyar | | | +| hy-AM | Հայերեն | | | +| id-ID | Bahasa Indonesia | | | +| is-IS | Íslenska | | | +| [it-IT](https://github.com/nocobase/locales/blob/main/it-IT.json "https://github.com/nocobase/locales/blob/main/it-IT.json") | Italiano | | [@N3tN00b3r](https://github.com/N3tN00b3r) | +| [ja-JP](https://github.com/nocobase/locales/blob/main/ja-JP.json "https://github.com/nocobase/locales/blob/main/ja-JP.json") | 日本語 | | | +| ka-GE | ქართული | | | +| kk-KZ | Қазақ тілі | | | +| km-KH | ភាសាខ្មែរ | | | +| kn-IN | ಕನ್ನಡ | | | +| [ko-KR](https://github.com/nocobase/locales/blob/main/ko-KR.json "https://github.com/nocobase/locales/blob/main/ko-KR.json") | 한국어 | | | +| ku-IQ | کوردی | | | +| lt-LT | lietuvių | | | +| lv-LV | Latviešu valoda | | | +| mk-MK | македонски јазик | | | +| ml-IN | മലയാളം | | | +| mn-MN | Монгол хэл | | | +| ms-MY | بهاس ملايو | | | +| nb-NO | Norsk bokmål | | | +| ne-NP | नेपाली | | | +| nl-BE | Vlaams | | | +| nl-NL | Nederlands | | [@mathyvds](https://github.com/mathyvds) | +| pl-PL | Polski | | | +| [pt-BR](https://github.com/nocobase/locales/blob/main/pt-BR.json "https://github.com/nocobase/locales/blob/main/pt-BR.json") | Português brasileiro | | | +| pt-PT | Português | | | +| ro-RO | România | | | +| [ru-RU](https://github.com/nocobase/locales/blob/main/ru-RU.json "https://github.com/nocobase/locales/blob/main/ru-RU.json") | Русский | | | +| si-LK | සිංහල | | | +| sk-SK | Slovenčina | | | +| sl-SI | Slovenščina | | | +| sr-RS | српски језик | | | +| sv-SE | Svenska | | | +| ta-IN | Tamil | | | +| th-TH | ภาษาไทย | | | +| tk-TK | Turkmen | | | +| [tr-TR](https://github.com/nocobase/locales/blob/main/tr-TR.json "https://github.com/nocobase/locales/blob/main/tr-TR.json") | Türkçe | | | +| [uk-UA](https://github.com/nocobase/locales/blob/main/uk-UA.json "https://github.com/nocobase/locales/blob/main/uk-UA.json") | Українська | | | +| ur-PK | Oʻzbekcha | | | +| vi-VN | Tiếng Việt | | | +| [zh-CN](https://github.com/nocobase/locales/blob/main/zh-CN.json "https://github.com/nocobase/locales/blob/main/zh-CN.json") | 简体中文 | | | +| zh-HK | 繁體中文(香港) | | | +| [zh-TW](https://github.com/nocobase/locales/blob/main/zh-TW.json "https://github.com/nocobase/locales/blob/main/zh-TW.json") | 繁體中文(台湾) | | | diff --git a/docs/ru-RU/welcome/community/translations/enabled-languages.jpg b/docs/ru-RU/welcome/community/translations/enabled-languages.jpg new file mode 100644 index 0000000000..fcf326305e Binary files /dev/null and b/docs/ru-RU/welcome/community/translations/enabled-languages.jpg differ diff --git a/docs/ru-RU/welcome/community/translations/language-settings-1.jpg b/docs/ru-RU/welcome/community/translations/language-settings-1.jpg new file mode 100644 index 0000000000..eb352a0f84 Binary files /dev/null and b/docs/ru-RU/welcome/community/translations/language-settings-1.jpg differ diff --git a/docs/ru-RU/welcome/community/translations/language-settings-2.jpg b/docs/ru-RU/welcome/community/translations/language-settings-2.jpg new file mode 100644 index 0000000000..3e9f7b08e9 Binary files /dev/null and b/docs/ru-RU/welcome/community/translations/language-settings-2.jpg differ diff --git a/docs/ru-RU/welcome/getting-started/deployment/cluster-mode.md b/docs/ru-RU/welcome/getting-started/deployment/cluster-mode.md new file mode 100644 index 0000000000..3baea6f3d5 --- /dev/null +++ b/docs/ru-RU/welcome/getting-started/deployment/cluster-mode.md @@ -0,0 +1,185 @@ +# Кластерный режим + +<PluginInfo licenseBundled="enterprise" plugins="pubsub-adapter-redis,lock-adapter-redis"></PluginInfo> + +Начиная с версии v1.6.0, NocoBase поддерживает запуск приложений в режиме кластера. Когда приложение работает в режиме кластера, его производительность в обработке параллельных запросов может быть улучшена за счет использования нескольких экземпляров и многопоточного режима. + +## Архитектура системы + +![20241231010814](https://static-docs.nocobase.com/20241231010814.png) + +### Компоненты архитектуры + +Текущий режим кластера направлен только на экземпляры приложения, исключая внешние сервисы такие как База данных, Redis итд. Если у Вас есть необходимость развернуть дополнительные компоненты в режиме кластера, Вам нужно решить это самостоятельно. + +#### Кластер приложения + +Поскольку текущий режим кластера направлен только на экземпляры приложения, база данных в настоящее время поддерживает только один узел. Для конфигураций, таких как мастер-слейв базы данных, это должно быть реализовано через промежуточное ПО, обеспечивая прозрачность для приложения NocoBase. + +#### База Данных + +Кластер приложения представляет собой набор экземпляров приложений NocoBase, где каждый экземпляр может быть независимым узлом или несколькими процессами приложения, работающими на одной машине в многопоточном режиме, или комбинацией обоих вариантов. + +#### Кэширование, Синхронизация Сообщений и Распределенные Замки + +Режим кластера NocoBase зависит от промежуточного ПО, таких как кэширование, синхронизация сообщений и распределенные замки, для обеспечения связи и координации между кластерами. В настоящее время предварительно поддерживается Redis в качестве промежуточного ПО для этих функций. + +#### Нагрузочное Балансирование + +Режим кластера NocoBase требует наличия балансировщика для распределения запросов и выполнения проверок состояния и перенаправления при отказе для экземпляров приложения. Эту часть следует выбрать и настроить в соответствии с архитектурой вашего кластера. + +## Шаги Развертывания + +### Подготовка Инфраструктуры + +#### Нагрузочный Балансировщик + +На примере использования Nginx как балансировщика, добавьте следующее содержимое в файл конфигурации: +``` +upstream myapp { + # ip_hash; # Can be used for session persistence, once enabled, requests from the same client will always be sent to the same backend server. + server 172.31.0.1:13000; # Internal node 1 + server 172.31.0.2:13000; # Internal node 2 + server 172.31.0.3:13000; # Internal node 3 +} + +server { + listen 80; + + location / { + # Use the defined upstream for load balancing + proxy_pass http://myapp; + # ... other configurations + } +} +``` + +Это означает, что запросы проксируются в обратном направлении и распределяются между различными серверными узлами для обработки. +Конфигурации балансировщиков нагрузки, предоставляемые другими облачными провайдерами, можно найти в их соответствующей технической документации. + +#### Служба Redis + +Запустите службу Redis во внутренней сети кластера (или в Kubernetes). +Также возможно раздельное включение нескольких экземпляров Redis в зависимости от задач: для кэширования, передачи синхронизирующих сообщений и реализации распределённых блокировок. + +#### Локальное хранилище (необязательно) + +Если используется локальное хранилище, при работе в многосерверном режиме необходимо примонтировать его как общую директорию, доступную для всех узлов. +В противном случае локальное хранилище не будет синхронизироваться автоматически и не сможет использоваться корректно. + +Если локальное хранилище не используется, то после запуска приложения необходимо настроить облачное файловое хранилище как хранилище по умолчанию, а логотип приложения (и другие загружаемые файлы) перенести в это облачное хранилище. + +### Подготовка связанных плагинов + +| Функция | Плагин | +|--------------------------|---------------------------------------| +| Caching | Built-in | +| Synchronization Messages | @nocobase/plugin-pubsub-adapter-redis | +| Distributed Lock | @nocobase/plugin-lock-adapter-redis | + +:::info{title=Tip} +Так же, как и в односерверном режиме, при корректно настроенных переменных окружения коммерческой платформы плагинов, необходимые плагины будут автоматически загружены при запуске приложения. +::: + +### Настройка переменных окружения + +Помимо основных переменных окружения, следующие переменные должны быть **одинаково настроены на всех узлах**. + +#### Ключ приложения + +Ключ, используемый для генерации JWT-токенов при входе пользователя. Рекомендуется использовать случайную строку. + +```ini +APP_KEY= + + +#### Многоядерный режим + +```ini +# Enable PM2 multi-core mode +# CLUSTER_MODE=max # По умолчанию отключено — необходимо настроить вручную. +``` + +#### Кэширование + +```ini +# Адаптер кэша; в кластерном режиме обязательно указывается значение redis (по умолчанию используется memory) +CACHE_DEFAULT_STORE=redis + +# Адрес подключения к Redis для кэширования; необходимо задать вручную +CACHE_REDIS_URL= + +``` + +#### Синхронизация сообщений + +```ini +# Адрес подключения к Redis для адаптера синхронизации; по умолчанию — redis://localhost:6379/0, если не указано +PUBSUB_ADAPTER_REDIS_URL= + +``` + +#### Распределённая блокировка + +```ini +# Адаптер блокировок; в кластерном режиме обязательно указывается значение redis (по умолчанию используется локальная блокировка в памяти) +LOCK_ADAPTER_DEFAULT=redis + +# Адрес подключения к Redis для блокировок; по умолчанию — redis://localhost:6379/0, если не указано +LOCK_ADAPTER_REDIS_URL= +``` + +:::info{title=Tip} +Как правило, все связанные адаптеры могут использовать один и тот же экземпляр Redis, +однако **рекомендуется использовать разные базы данных**, чтобы избежать возможных конфликтов ключей. + +```ini +CACHE_REDIS_URL=redis://localhost:6379/0 +PUBSUB_ADAPTER_REDIS_URL=redis://localhost:6379/1 +LOCK_ADAPTER_REDIS_URL=redis://localhost:6379/2 +``` +::: + +#### Включение встроенных плагинов + +```ini +# Встроенные плагины, которые необходимо включить +APPEND_PRESET_BUILT_IN_PLUGINS=lock-adapter-redis,pubsub-adapter-redis +``` + +### Запуск приложения + +При первом запуске приложения необходимо **сначала запустить один из узлов** +и дождаться установки и активации всех плагинов, прежде чем запускать остальные. + +## Обновление или обслуживание + +Если необходимо обновить версию NocoBase или включить/отключить плагины, следуйте следующей инструкции. + +:::warning{title=Внимание} +В кластерной среде, особенно в продакшене, следует **с осторожностью (а при возможности — избегать)** использовать функции управления плагинами и обновления версий. + +На данный момент **NocoBase не поддерживает онлайн-обновление в кластерном режиме**. +Для обеспечения целостности данных во время обновления необходимо приостановить работу всех сервисов. +::: + +### Остановить текущие сервисы + +Остановите все экземпляры приложения NocoBase, службы Redis и **перенаправьте весь трафик от балансировщика нагрузки на страницу с кодом 503**. + +### Создать резервную копию + +Перед обновлением настоятельно рекомендуется **сделать резервную копию базы данных**, чтобы избежать потери данных в случае ошибок. + +### Обновить версию + +См. инструкцию [по обновлению через Docker](../upgrading/docker-compose.md), чтобы обновить образ NocoBase. + +### Запустить сервисы + +1. Перезапустите все зависимости (например, Redis) +2. Запустите **один узел** кластера и дождитесь успешного завершения обновления +3. Проверьте работоспособность; при возникновении критических ошибок — выполните откат до предыдущей версии +4. Запустите остальные узлы +5. Перенаправьте трафик от балансировщика нагрузки обратно на кластер + diff --git a/docs/ru-RU/welcome/getting-started/deployment/create-nocobase-app.md b/docs/ru-RU/welcome/getting-started/deployment/create-nocobase-app.md new file mode 100644 index 0000000000..a41ffb5f00 --- /dev/null +++ b/docs/ru-RU/welcome/getting-started/deployment/create-nocobase-app.md @@ -0,0 +1,65 @@ +# create-nocobase-app + +Остальные шаги не отличаются от [create-nocobase-app](/welcome/getting-started/installation/create-nocobase-app). + +<embed src="./env-note.md"></embed> +- При развёртывании в продакшн-среде, чтобы уменьшить размер проекта, можно установить только необходимые зависимости командой: `yarn install --production` +<br /> + +[>>> Для получения дополнительной информации смотрите полный список 'Переменные окружения' <<<](/welcome/getting-started/env) + +## Управление процессами приложения + +В NocoBase уже встроен менеджер процессов [PM2](https://pm2.keymetrics.io/) для управления приложением. +В продакшн-среде вы можете просто использовать команду: + +```bash +yarn start +``` +Если требуется запустить процесс в фоновом режиме, добавьте флаг -d, например: +```bash +# Запустить в фоновом режиме +yarn start -d +``` + +Перезапустить + +```bash +yarn nocobase pm2-restart +``` + +Остановить + +```bash +yarn nocobase pm2-stop +``` + +Посмотреть другие команды PM2 + +```bash +yarn nocobase pm2 -h +``` + +## Настройка Nginx + +В продакшн-среде вы можете настроить проксирование статических файлов через Nginx. +NocoBase предоставляет команду `create-nginx-conf` для генерации конфигурационных файлов Nginx. + +```bash +yarn nocobase create-nginx-conf +``` + +Файл конфигурации будет сохранён по пути `./storage/nocobase.conf`. При необходимости отредактируйте его под вашу инфраструктуру, а затем добавьте в каталог `/etc/nginx/sites-enabled`, например: + +```bash +ln -s /app/nocobase/storage/nocobase.conf /etc/nginx/sites-enabled/nocobase.conf +``` + +**Примечания** + +- При развёртывании в подкаталоге необходимо задать переменную окружения `APP_PUBLIC_PATH`. После этого **необходимо заново выполнить** команду `create-nginx-conf`; +- Отредактируйте сгенерированный файл `nocobase.conf` в соответствии с вашими требованиями, например, укажите нужное доменное имя; +- Путь `/app/nocobase/` — это пример расположения приложения, его нужно изменить в соответствии с вашей структурой проекта; +- Каталог `/etc/nginx/sites-enabled` — это путь по умолчанию для конфигураций Nginx. В вашем окружении он может отличаться — проверьте командой `nginx -V`; +- Если вы не используете Nginx, вы всё равно можете взять данную конфигурацию за основу и адаптировать её под используемый веб-сервер. + diff --git a/docs/ru-RU/welcome/getting-started/deployment/docker-compose.md b/docs/ru-RU/welcome/getting-started/deployment/docker-compose.md new file mode 100644 index 0000000000..630b4b9dca --- /dev/null +++ b/docs/ru-RU/welcome/getting-started/deployment/docker-compose.md @@ -0,0 +1,61 @@ +# Docker + +The other processes are no different from the [Docker installation](/welcome/getting-started/installation/docker-compose). + +<embed src="./env-note.md"></embed> + +<br /> + +[>>> Для получения дополнительной информации смотрите полный список 'Переменные окружения' <<<](/welcome/getting-started/env) + +## Привязка домена + +На примере **nginx**: настройка проксирования через nginx http://127.0.0.1:13000/ +Откройте или создайте файл конфигурации Nginx и добавьте туда конфигурацию прокси +```bash +server { + listen 80; + server_name your_domain.com; # Замените на ваше доменное имя или суб домен + + location / { + proxy_pass http://127.0.0.1:13000/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + proxy_set_header Host $host; + proxy_buffering off; + } +} +``` + +## Развёртывание в подкаталог + +Для развёртывания приложения в подкаталоге необходимо указать переменную окружения `APP_PUBLIC_PATH`. + +```diff +services: + app: + image: nocobase/nocobase:latest + environment: ++ - APP_PUBLIC_PATH=/nocobase/ +``` + +URL приложения: http://127.0.0.1:13000/nocobase/ +Пример конфигурации Nginx: + +```bash +server { + listen 80; + server_name your_domain.com; # Замените на ваше доменное имя или суб домен + + location /nocobase/ { + proxy_pass http://127.0.0.1:13000/nocobase/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + proxy_set_header Host $host; + } +} +``` + +В итоге доступ к приложению будет по адресу: http://your_domain.com/nocobase/ diff --git a/docs/ru-RU/welcome/getting-started/deployment/env-note.md b/docs/ru-RU/welcome/getting-started/deployment/env-note.md new file mode 100644 index 0000000000..1e1403dfdb --- /dev/null +++ b/docs/ru-RU/welcome/getting-started/deployment/env-note.md @@ -0,0 +1,7 @@ +**Важные моменты:** + +- `TZ` используется для установки часового пояса приложения, по умолчанию используется часовой пояс системы; +- `APP_KEY` — это секретный ключ приложения, используемый для генерации токенов пользователей и т.д. (если `APP_KEY` изменяется, старые токены также становятся недействительными). Это может быть любая случайная строка. Пожалуйста, измените его на свой собственный секретный ключ и убедитесь, что он не раскрывается публично. +- `DB_*` относится к базе данных. Если это не служба базы данных по умолчанию как из примера, пожалуйста, измените параметры в соответствии с реальными значениями; +- При развертывании в производстве, установите `APP_ENV=production`; +- При развертывании в пути отличном от корня, необходимо настроить `APP_PUBLIC_PATH`, например, `APP_PUBLIC_PATH=/nocobase/`. diff --git a/docs/ru-RU/welcome/getting-started/deployment/git-clone.md b/docs/ru-RU/welcome/getting-started/deployment/git-clone.md new file mode 100644 index 0000000000..32d5059d51 --- /dev/null +++ b/docs/ru-RU/welcome/getting-started/deployment/git-clone.md @@ -0,0 +1,6 @@ +# Установка из (Git) + +Остальные этапы не отличаются от стандартной процедуры установки. +[Git source code](/welcome/getting-started/installation/git-clone). + +<embed src="./create-nocobase-app.md#L4-L1000"></embed> diff --git a/docs/ru-RU/welcome/getting-started/deployment/index.md b/docs/ru-RU/welcome/getting-started/deployment/index.md new file mode 100644 index 0000000000..03456e867d --- /dev/null +++ b/docs/ru-RU/welcome/getting-started/deployment/index.md @@ -0,0 +1,13 @@ +# Обзор + +## Режим одного узла + +NocoBase поддерживает три различных способа установки, каждый из которых имеет свои особенности в процессе развёртывания. + +- [Docker](./docker-compose.md) +- [create-nocobase-app](./create-nocobase-app.md) +- [Git source code](./git-clone.md) + +## Кластерный режим + +- [Развёртывание в кластерном режиме](./cluster-mode.md) diff --git a/docs/ru-RU/welcome/getting-started/env.md b/docs/ru-RU/welcome/getting-started/env.md new file mode 100644 index 0000000000..f36d8e307f --- /dev/null +++ b/docs/ru-RU/welcome/getting-started/env.md @@ -0,0 +1,437 @@ +# Переменные окружения + +## Как задать переменные окружения? + +### Установка из исходного кода или с помощью `create-nocobase-app` + +Задайте переменные окружения в файле .env в корневой директории проекта. После изменения переменных необходимо перезапустить процесс приложения. + +### Установка через Docker + +Измените файл `docker-compose.yml`, добавив переменные окружения в параметр `environment`. Пример: + +```yml +services: + app: + image: nocobase/nocobase:latest + environment: + - APP_ENV=production +``` + +Можно также использовать параметр `env_file`, чтобы задать переменные в отдельном `.env` файле. Пример: + +```yml +services: + app: + image: nocobase/nocobase:latest + env_file: .env +``` + +После изменения переменных окружения перезапустите контейнер: + +```yml +docker compose up -d app +``` + +## Глобальные переменные окружения + +Хранятся в файле `.env` + +### TZ + +Устанавливает часовой пояс приложения. По умолчанию используется системный часовой пояс. + +https://en.wikipedia.org/wiki/List_of_tz_database_time_zones + +:::warning +Операции, связанные со временем, будут выполняться в соответствии с этим часовым поясом. Изменение TZ может повлиять на значения даты в базе данных. Более подробную информацию см. в разделе [Обзор даты и времени](/handbook/data-modeling/collection-fields/datetime). +::: + +### APP_ENV + +Среда выполнения приложения, по умолчанию `development`. Возможные значения + +- `production` среда в производстве +- `development` среда разработки + +```bash +APP_ENV=production +``` + +### APP_KEY + +Секретный ключ, используется, например, для генерации JWT. + +```bash +APP_KEY=app-key-test +``` + +### APP_PORT + +Порт, на котором работает приложение. По умолчанию: `13000` + +```bash +APP_PORT=13000 +``` + +### API_BASE_PATH + +Префикс адреса API NocoBase. По умолчанию: `/api/` + +```bash +API_BASE_PATH=/api/ +``` + +### CLUSTER_MODE + +> `v1.6.0+` + +Многопроцессный (кластерный) режим запуска приложения. Если переменная задана, она будет передана в команду запуска pm2 как параметр `-i` <instances>. Поддерживаются те же параметры, что и в: [PM2: Cluster Mode](https://pm2.keymetrics.io/docs/usage/cluster-mode/)), + +- `max`: Использовать максимум доступных ядер CPU +- `-1`: Использовать максимум ядер минус одно +- `<number>`: Указать конкретное количество ядер + +Если переменная не задана — режим кластера отключён. + +:::warning{title="Attention"} +Этот режим требует использования плагинов, связанных с кластерным режимом, таких как `@nocobase/plugin-sync-adapter-redis`. В противном случае функциональность приложения может столкнуться с непредвиденными проблемами. +::: + +Подробнее: [Cluster mode](./deployment/cluster-mode.md). + +### PLUGIN_PACKAGE_PREFIX + +Префикс имён пакетов плагинов. По умолчанию: `@nocobase/plugin-,@nocobase/preset-` + +Пример: при добавлении плагина `hello` в проект `my-nocobase-app`, имя пакета будет `@my-nocobase-app/plugin-hello`. + +PLUGIN_PACKAGE_PREFIX is configured as follows: + +```bash +PLUGIN_PACKAGE_PREFIX=@nocobase/plugin-,@nocobase-preset-,@my-nocobase-app/plugin- +``` + +Соответствие имён плагинов и пакетов: + +- `users` Название пакета плагина `@nocobase/plugin-users` +- `nocobase` Название пакета плагина `@nocobase/preset-nocobase` +- `hello` Название пакета плагина `@my-nocobase-app/plugin-hello` + +### DB_DIALECT + +Тип базы данных, по умолчанию — `sqlite`. Возможные значения: + +- `sqlite` +- `mysql` +- `postgres` + +```bash +DB_DIALECT=mysql +``` + +### DB_STORAGE + +Database file path (required when using a SQLite database) + +```bash +### Relative path +DB_STORAGE=storage/db/nocobase.db +# Absolute path +DB_STORAGE=/your/path/nocobase.db +``` + +### DB_HOST + +Путь к файлу базы данных (обязательно при использовании базы данных SQLite) + +По умолчанию `localhost` + +```bash +DB_HOST=localhost +``` + +### DB_PORT + +Порт базы данных (обязательно при использовании MySQL или PostgreSQL) + +- Default port of MySQL is 3306 +- Default port of PostgreSQL is 5432 + +```bash +DB_PORT=3306 +``` + +### DB_DATABASE + +Database name (required when using MySQL or PostgreSQL databases) + +```bash +DB_DATABASE=nocobase +``` + +### DB_USER + +Database user (required when using MySQL or PostgreSQL databases) + +```bash +DB_USER=nocobase +``` + +### DB_PASSWORD + +Database password (required when using MySQL or PostgreSQL databases) + +```bash +DB_PASSWORD=nocobase +``` + +### DB_TABLE_PREFIX + +Data table prefix + +```bash +DB_TABLE_PREFIX=nocobase_ +``` + +### DB_LOGGING + +Database log switch, default is `off`, options include + +- `on` on +- `off` off + +```bash +DB_LOGGING=on +``` + +### NOCOBASE_PKG_USERNAME + +Service platform username, used for automatically downloading and updating plugins. + +### NOCOBASE_PKG_PASSWORD + +Service platform password, used for automatically downloading and updating plugins. + +### LOGGER_TRANSPORT + +Log output method,separated by `,` 。Default is `console` in development, `console,dailyRotateFile` in production. +Options: + +- `console` - `console.log` +- `file` - `Output to file` +- `dailyRotateFile` - `Output to daily rotating files` + +```bash +LOGGER_TRANSPORT=console,dailyRotateFile +``` + +### LOGGER_BASE_PATH + +File-based log storage path, default is `storage/logs`。 + +```bash +LOGGER_BASE_PATH=storage/logs +``` + +### LOGGER_LEVEL + +Output log level. Default is `debug` in development and `info` in production. Options: + +- `error` +- `warn` +- `info` +- `debug` +- `trace` + +```bash +LOGGER_LEVEL=info +``` + +The database log output level is `debug`, controlled by `DB_LOGGING`, and is unaffected by `LOGGER_LEVEL`. + +### LOGGER_MAX_FILES + +Maximum number of log files to keep. + +- When `LOGGER_TRANSPORT` is `file` : Default is `10`. +- When `LOGGER_TRANSPORT` is `dailyRotateFile`: Use `[n]d` to represent days. Default is `14d`. + +```bash +LOGGER_MAX_FILES=14d +``` + +### LOGGER_MAX_SIZE + +Log rotation by size. + +- When `LOGGER_TRANSPORT` is `file`: Unit is `byte`. Default is `20971520 (20 * 1024 * 1024)`. +- When `LOGGER_TRANSPORT` is `dailyRotateFile`: Use `[n]k`, `[n]m`, `[n]g`. Default is not set. + +```bash +LOGGER_MAX_SIZE=20971520 +``` + +### LOGGER_FORMAT + +Log print format. Default is `console` in development and `json` in production. Options: + +- `console` +- `json` +- `logfmt` +- `delimiter` + +```bash +LOGGER_FORMAT=json +``` + +Reference:[Log Format](../plugins/logger/index.md#logformat) + +### CACHE_DEFAULT_STORE + +Specify the default cache method using the unique name,default is `memory`, options include: + +- `memory` +- `redis` + +```bash +CACHE_DEFAULT_STORE=memory +``` + +### CACHE_MEMORY_MAX + +Max number of items in memory cache,default is `2000`. + +```bash +CACHE_MEMORY_MAX=2000 +``` + +### CACHE_REDIS_URL + +Redis URL, optional. Example:`redis://localhost:6379` + +```bash +CACHE_REDIS_URL=redis://localhost:6379 +``` + +### TELEMETRY_ENABLED + +Enable telemetry data collection,default is `off`. + +```bash +TELEMETRY_ENABLED=on +``` + +### TELEMETRY_METRIC_READER + +Enabled monitoring metric collectors, default is `console`. Other values should refer to the names registered by corresponding collector plugins, such as `prometheus`. Multiple separated by `,` . + +```bash +TELEMETRY_METRIC_READER=console,prometheus +``` + +### TELEMETRY_TRACE_PROCESSOR + +Enabled trace data processors, default is `console`. Other values should refer to the names registered by corresponding processor plugins. Multiple separated by `,`. + +```bash +TELEMETRY_TRACE_PROCESSOR=console +``` + +## Experimental Environment Variables + +### APPEND_PRESET_LOCAL_PLUGINS + +Used to append preset local plugins, with the value being the package name (the `name` parameter in `package.json`), separated by commas for multiple plugins. + +:::info +These will only appear in the plugin manager page after initializing installation with `nocobase install` or upgrading with `nocobase upgrade`. +::: + +```bash +APPEND_PRESET_LOCAL_PLUGINS=@my-project/plugin-foo,@my-project/plugin-bar +``` + +### APPEND_PRESET_BUILT_IN_PLUGINS + +Used to append built-in plugins that are automatically installed by default, with the value being the package name (the `name` parameter in `package.json`), separated by commas for multiple plugins. + +:::info +These plugins will be automatically installed or upgraded during initialization with `nocobase install` or `nocobase upgrade`. +::: + +```bash +APPEND_PRESET_BUILT_IN_PLUGINS=@my-project/plugin-foo,@my-project/plugin-bar +``` + +## Temporary Environment Variables + +The installation of NocoBase can be assisted by setting temporary environment variables, such as: + +```bash +yarn cross-env \ + INIT_APP_LANG=zh-CN \ + INIT_ROOT_EMAIL=demo@nocobase.com \ + INIT_ROOT_PASSWORD=admin123 \ + INIT_ROOT_NICKNAME="Super Admin" \ + nocobase install + +# Equivalent to +yarn nocobase install \ + --lang=zh-CN \ + --root-email=demo@nocobase.com \ + --root-password=admin123 \ + --root-nickname="Super Admin" + +# Equivalent to +yarn nocobase install -l zh-CN -e demo@nocobase.com -p admin123 -n "Super Admin" +``` + +### INIT_APP_LANG + +Language at the time of installation, default is `en-US`, options include + +- `en-US` English +- `zh-CN` Chinese (Simplified) + +```bash +yarn cross-env \ + INIT_APP_LANG=zh-CN \ + nocobase install +``` + +### INIT_ROOT_EMAIL + +Root user email + +```bash +yarn cross-env \ + INIT_APP_LANG=zh-CN \ + INIT_ROOT_EMAIL=demo@nocobase.com \ + nocobase install +``` + +### INIT_ROOT_PASSWORD + +Root user password + +```bash +yarn cross-env \ + INIT_APP_LANG=zh-CN \ + INIT_ROOT_EMAIL=demo@nocobase.com \ + INIT_ROOT_PASSWORD=admin123 \ + nocobase install +``` + +### INIT_ROOT_NICKNAME + +Root user nickname + +```bash +yarn cross-env \ + INIT_APP_LANG=zh-CN \ + INIT_ROOT_EMAIL=demo@nocobase.com \ + INIT_ROOT_PASSWORD=admin123 \ + INIT_ROOT_NICKNAME="Super Admin" \ + nocobase install +``` diff --git a/docs/ru-RU/welcome/getting-started/installation/Timeweb/step1-homepage.png b/docs/ru-RU/welcome/getting-started/installation/Timeweb/step1-homepage.png new file mode 100644 index 0000000000..e75a91df20 Binary files /dev/null and b/docs/ru-RU/welcome/getting-started/installation/Timeweb/step1-homepage.png differ diff --git a/docs/ru-RU/welcome/getting-started/installation/Timeweb/step2-register.png b/docs/ru-RU/welcome/getting-started/installation/Timeweb/step2-register.png new file mode 100644 index 0000000000..8307dc4a2b Binary files /dev/null and b/docs/ru-RU/welcome/getting-started/installation/Timeweb/step2-register.png differ diff --git a/docs/ru-RU/welcome/getting-started/installation/Timeweb/step3-create-project.png b/docs/ru-RU/welcome/getting-started/installation/Timeweb/step3-create-project.png new file mode 100644 index 0000000000..ffa7bf796b Binary files /dev/null and b/docs/ru-RU/welcome/getting-started/installation/Timeweb/step3-create-project.png differ diff --git a/docs/ru-RU/welcome/getting-started/installation/Timeweb/step4-project-settings.png b/docs/ru-RU/welcome/getting-started/installation/Timeweb/step4-project-settings.png new file mode 100644 index 0000000000..c6fe55b84c Binary files /dev/null and b/docs/ru-RU/welcome/getting-started/installation/Timeweb/step4-project-settings.png differ diff --git a/docs/ru-RU/welcome/getting-started/installation/Timeweb/step5-cloud-servers.png b/docs/ru-RU/welcome/getting-started/installation/Timeweb/step5-cloud-servers.png new file mode 100644 index 0000000000..7371590de7 Binary files /dev/null and b/docs/ru-RU/welcome/getting-started/installation/Timeweb/step5-cloud-servers.png differ diff --git a/docs/ru-RU/welcome/getting-started/installation/Timeweb/step6-select-image.png b/docs/ru-RU/welcome/getting-started/installation/Timeweb/step6-select-image.png new file mode 100644 index 0000000000..f5ddd26642 Binary files /dev/null and b/docs/ru-RU/welcome/getting-started/installation/Timeweb/step6-select-image.png differ diff --git a/docs/ru-RU/welcome/getting-started/installation/Timeweb/step7-nocobase.png b/docs/ru-RU/welcome/getting-started/installation/Timeweb/step7-nocobase.png new file mode 100644 index 0000000000..702e8e7247 Binary files /dev/null and b/docs/ru-RU/welcome/getting-started/installation/Timeweb/step7-nocobase.png differ diff --git a/docs/ru-RU/welcome/getting-started/installation/Timeweb/timeweb-logo.png b/docs/ru-RU/welcome/getting-started/installation/Timeweb/timeweb-logo.png new file mode 100644 index 0000000000..79cfd6139b Binary files /dev/null and b/docs/ru-RU/welcome/getting-started/installation/Timeweb/timeweb-logo.png differ diff --git a/docs/ru-RU/welcome/getting-started/installation/create-nocobase-app.md b/docs/ru-RU/welcome/getting-started/installation/create-nocobase-app.md new file mode 100644 index 0000000000..86a163cc51 --- /dev/null +++ b/docs/ru-RU/welcome/getting-started/installation/create-nocobase-app.md @@ -0,0 +1,238 @@ +# create-nocobase-app + +## 0. Предварительные требования + +Убедитесь, что у вас: + +- Установлены Node.js 20+, Yarn 1.22.x +- Настроена и запущена одна из поддерживаемых баз данных: MySQL 8.x, MariaDB 10.9+ или PostgreSQL 10+ + +Рекомендуется установить последнюю LTS-версию Node.js с официального сайта. Для удобства управления версиями Node.js используйте nvm (или nvm-windows для Windows). + +Проверка установленной версии: +```bash +$ node -v + +v20.10.0 +``` + +Установка менеджера пакетов Yarn: + +```bash +$ npm install --global yarn +$ yarn -v + +1.22.21 +``` + +## 1. Создание проекта NocoBase + +### Последняя стабильная версия (Latest) + +Рекомендуется к установке. Надёжная и протестированная версия, обновляется только с исправлениями ошибок. + +<Tabs> +<div label="PostgreSQL" name="postgres"> + +```bash +yarn create nocobase-app my-nocobase-app -d postgres \ + -e DB_HOST=localhost \ + -e DB_PORT=5432 \ + -e DB_DATABASE=nocobase \ + -e DB_USER=nocobase \ + -e DB_PASSWORD=nocobase \ + -e TZ=UTC \ + -e NOCOBASE_PKG_USERNAME= \ + -e NOCOBASE_PKG_PASSWORD= +``` + +</div> + +<div label="MySQL" name="mysql"> + +```bash +yarn create nocobase-app my-nocobase-app -d mysql \ + -e DB_HOST=localhost \ + -e DB_PORT=3306 \ + -e DB_DATABASE=nocobase \ + -e DB_USER=nocobase \ + -e DB_PASSWORD=nocobase \ + -e TZ=UTC \ + -e NOCOBASE_PKG_USERNAME= \ + -e NOCOBASE_PKG_PASSWORD= +``` + +</div> + +<div label="MariaDB" name="mariadb"> + +```bash +yarn create nocobase-app my-nocobase-app -d mariadb \ + -e DB_HOST=localhost \ + -e DB_PORT=3306 \ + -e DB_DATABASE=nocobase \ + -e DB_USER=nocobase \ + -e DB_PASSWORD=nocobase \ + -e TZ=UTC \ + -e NOCOBASE_PKG_USERNAME= \ + -e NOCOBASE_PKG_PASSWORD= +``` + +</div> +</Tabs> + +### Бета-версия (Beta) + +Содержит функции, которые ещё не выпущены, но уже прошли первичное тестирование. Может содержать ошибки. + +<Tabs> +<div label="PostgreSQL" name="postgres"> + +```bash +npx create-nocobase-app@beta my-nocobase-app -d postgres \ + -e DB_HOST=localhost \ + -e DB_PORT=5432 \ + -e DB_DATABASE=nocobase \ + -e DB_USER=nocobase \ + -e DB_PASSWORD=nocobase \ + -e TZ=UTC \ + -e NOCOBASE_PKG_USERNAME= \ + -e NOCOBASE_PKG_PASSWORD= +``` + +</div> + +<div label="MySQL" name="mysql"> + +```bash +npx create-nocobase-app@beta my-nocobase-app -d mysql \ + -e DB_HOST=localhost \ + -e DB_PORT=3306 \ + -e DB_DATABASE=nocobase \ + -e DB_USER=nocobase \ + -e DB_PASSWORD=nocobase \ + -e TZ=UTC \ + -e NOCOBASE_PKG_USERNAME= \ + -e NOCOBASE_PKG_PASSWORD= +``` + +</div> + +<div label="MariaDB" name="mariadb"> + +```bash +npx create-nocobase-app@beta my-nocobase-app -d mariadb \ + -e DB_HOST=localhost \ + -e DB_PORT=3306 \ + -e DB_DATABASE=nocobase \ + -e DB_USER=nocobase \ + -e DB_PASSWORD=nocobase \ + -e TZ=UTC \ + -e NOCOBASE_PKG_USERNAME= \ + -e NOCOBASE_PKG_PASSWORD= +``` + +</div> +</Tabs> + +### Альфа-версия (Alpha) + +Версия в активной разработке. Содержит самые свежие функции, которые могут быть нестабильны или незавершены. + +<Tabs> +<div label="PostgreSQL" name="postgres"> + +```bash +npx create-nocobase-app@alpha my-nocobase-app -d postgres \ + -e DB_HOST=localhost \ + -e DB_PORT=5432 \ + -e DB_DATABASE=nocobase \ + -e DB_USER=nocobase \ + -e DB_PASSWORD=nocobase \ + -e TZ=UTC \ + -e NOCOBASE_PKG_USERNAME= \ + -e NOCOBASE_PKG_PASSWORD= +``` + +</div> + +<div label="MySQL" name="mysql"> + +```bash +npx create-nocobase-app@alpha my-nocobase-app -d mysql \ + -e DB_HOST=localhost \ + -e DB_PORT=3306 \ + -e DB_DATABASE=nocobase \ + -e DB_USER=nocobase \ + -e DB_PASSWORD=nocobase \ + -e TZ=UTC \ + -e NOCOBASE_PKG_USERNAME= \ + -e NOCOBASE_PKG_PASSWORD= +``` + +</div> + +<div label="MariaDB" name="mariadb"> + +```bash +npx create-nocobase-app@alpha my-nocobase-app -d mariadb \ + -e DB_HOST=localhost \ + -e DB_PORT=3306 \ + -e DB_DATABASE=nocobase \ + -e DB_USER=nocobase \ + -e DB_PASSWORD=nocobase \ + -e TZ=UTC \ + -e NOCOBASE_PKG_USERNAME= \ + -e NOCOBASE_PKG_PASSWORD= +``` + +</div> +</Tabs> + +:::warning + +- **Версия 1.4 и выше**: можно указать переменные [`NOCOBASE_PKG_USERNAME`](/welcome/getting-started/env#nocobase_pkg_username) и [`NOCOBASE_PKG_PASSWORD`](/welcome/getting-started/env#nocobase_pkg_password), чтобы автоматически загружать коммерческие плагины во время установки или обновления.; +- `TZ` часовой пояс приложения (по умолчанию — системный).; +- `APP_KEY` секретный ключ приложения для генерации токенов. Обязательно задайте свой собственный ключ и не публикуйте его. +- `DB_*` параметры подключения к базе данных. При использовании внешнего сервера измените значения на собственные. + ::: + +## 2. Переход в директорию проекта + +```bash +cd my-nocobase-app +``` + +## 3. Установка зависимостей + +📢 Установка может занять более 10 минут в зависимости от скорости сети и конфигурации системы. + +```bash +yarn install +``` + +## 4. Установка NocoBase + +```bash +yarn nocobase install --lang=ru-RU +``` + +## 5. Запуск NocoBase + +Режим разработки + +```bash +yarn dev +``` + +Режим продакшн + +```bash +yarn start +``` + +💡 Для продакшн-режима: если вы внесли изменения в код, перед запуском необходимо выполнить yarn build. + +## 6. Вход в систему + +Откройте [http://localhost:13000](http://localhost:13000) в браузере. Стандартные данные для входа: Email: `admin@nocobase.com` и Пароль: `admin123`. diff --git a/docs/ru-RU/welcome/getting-started/installation/docker-compose.md b/docs/ru-RU/welcome/getting-started/installation/docker-compose.md new file mode 100644 index 0000000000..070b878223 --- /dev/null +++ b/docs/ru-RU/welcome/getting-started/installation/docker-compose.md @@ -0,0 +1,256 @@ +# Docker (👍 Рекомендуется) + +## 0. Предварительные требования + +⚡⚡ Убедитесь, что у вас установлен [Docker](https://docs.docker.com/get-docker/) + +## 1. Создание файла `docker-compose.yml` + +```bash +# Создайте папку (например, my-project) для хранения системных файлов NocoBase +mkdir my-project && cd my-project + +# Создайте пустой файл docker-compose.yml +vi docker-compose.yml +``` + +## 2. Настройка `docker-compose.yml` + +Параметры конфигурации немного отличаются в зависимости от используемой базы данных. Выберите нужную конфигурацию и вставьте её в docker-compose.yml. + +<Tabs> + +<div label="PostgreSQL" name="postgres"> + +```yml +version: '3' + +networks: + nocobase: + driver: bridge + +services: + app: + image: nocobase/nocobase:latest + restart: always + networks: + - nocobase + depends_on: + - postgres + environment: + - APP_KEY=your-secret-key # Секретный ключ приложения (используется для токенов и т.д.) + - DB_DIALECT=postgres # Тип базы данных + - DB_HOST=postgres # Имя сервиса БД или IP-адрес внешнего сервера + - DB_PORT=5432 # Порт БД + - DB_DATABASE=nocobase # Название базы + - DB_USER=nocobase # Имя пользователя + - DB_PASSWORD=nocobase # Пароль пользователя + - TZ=UTC # Часовой пояс + - NOCOBASE_PKG_USERNAME= # Учетные данные для скачивания коммерческих плагинов + - NOCOBASE_PKG_PASSWORD= + volumes: + - ./storage:/app/nocobase/storage + ports: + - '13000:80' + # init: true + + # If using an existing database server, postgres service can be omitted + postgres: + image: postgres:16 + restart: always + command: postgres -c wal_level=logical + environment: + POSTGRES_USER: nocobase + POSTGRES_DB: nocobase + POSTGRES_PASSWORD: nocobase + volumes: + - ./storage/db/postgres:/var/lib/postgresql/data + networks: + - nocobase +``` + +</div> + +<div label="MySQL" name="mysql"> + +```yml +version: '3' + +networks: + nocobase: + driver: bridge + +services: + app: + image: nocobase/nocobase:latest + restart: always + networks: + - nocobase + depends_on: + - mysql + environment: + # The application's secret key, used to generate user tokens, etc. + # If APP_KEY is changed, old tokens will also become invalid. + # It can be any random string, and make sure it is not exposed. + - APP_KEY=your-secret-key + # Database type, supports postgres, mysql, mariadb + - DB_DIALECT=mysql + # Database host, can be replaced with the IP of an existing database server + - DB_HOST=mysql + # Database port + - DB_PORT=3306 + # Database name + - DB_DATABASE=nocobase + # Database user + - DB_USER=root + # Database password + - DB_PASSWORD=nocobase + # Whether to convert table and field names to snake case + - DB_UNDERSCORED=true + # Timezone + - TZ=UTC + # Service platform username and password, + # used for automatically downloading and updating plugins. + - NOCOBASE_PKG_USERNAME= + - NOCOBASE_PKG_PASSWORD= + volumes: + - ./storage:/app/nocobase/storage + ports: + - '13000:80' + # init: true + + # If using an existing database server, mysql service can be omitted + mysql: + image: mysql:8 + environment: + MYSQL_DATABASE: nocobase + MYSQL_USER: nocobase + MYSQL_PASSWORD: nocobase + MYSQL_ROOT_PASSWORD: nocobase + restart: always + volumes: + - ./storage/db/mysql:/var/lib/mysql + networks: + - nocobase +``` + +</div> + +<div label="MariaDB" name="mariadb"> + +```yml +version: '3' + +networks: + nocobase: + driver: bridge + +services: + app: + image: nocobase/nocobase:latest + restart: always + networks: + - nocobase + depends_on: + - mariadb + environment: + # The application's secret key, used to generate user tokens, etc. + # If APP_KEY is changed, old tokens will also become invalid. + # It can be any random string, and make sure it is not exposed. + - APP_KEY=your-secret-key + # Database type, supports postgres, mysql, mariadb + - DB_DIALECT=mariadb + # Database host, can be replaced with the IP of an existing database server + - DB_HOST=mariadb + # Database port + - DB_PORT=3306 + # Database name + - DB_DATABASE=nocobase + # Database user + - DB_USER=root + # Database password + - DB_PASSWORD=nocobase + # Whether to convert table and field names to snake case + - DB_UNDERSCORED=true + # Timezone + - TZ=UTC + # Service platform username and password, + # used for automatically downloading and updating plugins. + - NOCOBASE_PKG_USERNAME= + - NOCOBASE_PKG_PASSWORD= + volumes: + - ./storage:/app/nocobase/storage + ports: + - '13000:80' + # init: true + + # If using an existing database server, mariadb service can be omitted + mariadb: + image: mariadb:11 + environment: + MYSQL_DATABASE: nocobase + MYSQL_USER: nocobase + MYSQL_PASSWORD: nocobase + MYSQL_ROOT_PASSWORD: nocobase + restart: always + volumes: + - ./storage/db/mariadb:/var/lib/mysql + networks: + - nocobase +``` + +</div> +</Tabs> + +Выбор версии NocoBase [versions](./index.md#which-version-to-install) + +- `latest`: Стабильная, протестированная версия. Рекомендуется. +- `beta`: Включает новые функции, может содержать ошибки. +- `alpha`: Разработка, нестабильная версия. +- `1.3.51`: Указание конкретной версии. [list of released versions](https://hub.docker.com/r/nocobase/nocobase/tags). + +:::warning +**Для версии 1.4 и выше**: укажите переменные окружения [`NOCOBASE_PKG_USERNAME`](/welcome/getting-started/env#nocobase_pkg_username) и [`NOCOBASE_PKG_PASSWORD`](/welcome/getting-started/env#nocobase_pkg_password), чтобы автоматически загружать коммерческие плагины во время установки или обновления. +::: + +Пример: + +```yml +#... +services: + app: + # Docker Hub image + image: nocobase/nocobase:latest + image: nocobase/nocobase:beta + image: nocobase/nocobase:alpha + image: nocobase/nocobase:1.3.51 +# ... +``` + +## 3. Установка и запуск NocoBase + +Процесс может занять несколько минут: + +```bash +# Загрузка образов +$ docker compose pull +# Запуск в фоновом режиме +$ docker compose up -d +# Просмотр логов +$ docker compose logs app + +app-postgres-app-1 | nginx started +app-postgres-app-1 | yarn run v1.22.15 +app-postgres-app-1 | $ cross-env DOTENV_CONFIG_PATH=.env node -r dotenv/config packages/app/server/lib/index.js install -s +app-postgres-app-1 | Done in 2.72s. +app-postgres-app-1 | yarn run v1.22.15 +app-postgres-app-1 | $ pm2-runtime start --node-args="-r dotenv/config" packages/app/server/lib/index.js -- start +app-postgres-app-1 | 2022-04-28T15:45:38: PM2 log: Launching in no daemon mode +app-postgres-app-1 | 2022-04-28T15:45:38: PM2 log: App [index:0] starting in -fork mode- +app-postgres-app-1 | 2022-04-28T15:45:38: PM2 log: App [index:0] online +app-postgres-app-1 | 🚀 NocoBase server running at: http://localhost:13000/ +``` + +## 4. Вход в систему + +Откройте [http://localhost:13000](http://localhost:13000) в браузере. Стандартный логин: `admin@nocobase.com` , пароль: `admin123` diff --git a/docs/ru-RU/welcome/getting-started/installation/git-clone.md b/docs/ru-RU/welcome/getting-started/installation/git-clone.md new file mode 100644 index 0000000000..fc6afec92e --- /dev/null +++ b/docs/ru-RU/welcome/getting-started/installation/git-clone.md @@ -0,0 +1,97 @@ +# Установка из (Git) + +## 0. Предварительные требования + +Убедитесь, что у вас установлены: + +- Git, Node.js 20+, Yarn 1.22.x +- Настроена и запущена одна из поддерживаемых баз данных: MySQL 8.x, MariaDB 10.9+ или PostgreSQL 10+ + +## 1. Клонирование репозитория через Git + +### Последняя стабильная версия (Latest) (`main`) + +Надёжная, протестированная версия. Обновляется только с исправлениями ошибок. Рекомендуется. + +```bash +git clone https://github.com/nocobase/nocobase.git -b main --depth=1 my-nocobase +``` + +### Бета-версия (Beta) (`next`) + +Содержит новые функции, которые скоро будут выпущены. Уже протестирована, но могут быть ошибки. + +```bash +git clone https://github.com/nocobase/nocobase.git -b next --depth=1 my-nocobase +``` + +### Альфа-версия (Alpha) (`develop`) + +Версия в активной разработке. Содержит новейшие функции, но может быть нестабильной или незавершённой. + +```bash +git clone https://github.com/nocobase/nocobase.git -b develop --depth=1 my-nocobase +``` + +## 2. Переход в директорию проекта + +```bash +cd my-nocobase +``` + +## 3. Установка зависимостей + +```bash +yarn install --frozen-lockfile +``` + +## 4. Настройка переменных окружения + +Переменные среды хранятся в файле `.env` в корне проекта. Измените значения в соответствии с вашей конфигурацией. Если не знаете, что указывать — [click here for environment variables description](../env.md), или оставьте значения по умолчанию: + +```bash +TZ=UTC +APP_KEY=your-secret-key +DB_HOST=localhost +DB_PORT=5432 +DB_DATABASE=postgres +DB_USER=nocobase +DB_PASSWORD=nocobase +NOCOBASE_PKG_USERNAME=your-username +NOCOBASE_PKG_PASSWORD=your-password +``` + +:::warning + +- **Версия 1.4 и выше**: можно указать переменные [`NOCOBASE_PKG_USERNAME`](/welcome/getting-started/env#nocobase_pkg_username) и [`NOCOBASE_PKG_PASSWORD`](/welcome/getting-started/env#nocobase_pkg_password), чтобы автоматически загружать коммерческие плагины во время установки или обновления.; +- `TZ` часовой пояс приложения (по умолчанию — системный).; +- `APP_KEY` секретный ключ приложения для генерации токенов. Обязательно задайте свой собственный ключ и не публикуйте его. +- `DB_*` параметры подключения к базе данных. При использовании внешнего сервера измените значения на собственные. + ::: + +## 5. Установка NocoBase + +```bash +yarn nocobase install --lang=ru-RU +``` + +## 6. Запуск NocoBase + +Режим разработки + +```bash +yarn dev +``` + +Режим продакшн + +```bash +# Сборка проекта (только после установки зависимостей!) +yarn build +# Запуск в продакшене +yarn start +``` + +## 7. Вход в систему + +Откройте [http://localhost:13000](http://localhost:13000) в браузере. Стандартные данные для входа: Email: `admin@nocobase.com` и Пароль: `admin123`. diff --git a/docs/ru-RU/welcome/getting-started/installation/index.md b/docs/ru-RU/welcome/getting-started/installation/index.md new file mode 100644 index 0000000000..21581d136f --- /dev/null +++ b/docs/ru-RU/welcome/getting-started/installation/index.md @@ -0,0 +1,51 @@ +# Обзор + +## Способы установки + +NocoBase поддерживает три способа установки: + +- [Docker (рекомендуется)](./docker-compose.md) +- [create-nocobase-app](./create-nocobase-app.md) +- [Git source code](./git-clone.md) + +## Как выбрать способ установки? + +### Docker (рекомендуется) + +Подходит для no-code сценариев — не требует написания кода. +Для обновления достаточно скачать свежий образ и перезапустить контейнер. + +### create-nocobase-app + +Бизнес-логика проекта полностью отделена и позволяет использовать low-code подход. +Удобно для кастомизации с минимальным уровнем программирования + +### Исходный код из Git + +Рекомендуется, если вы хотите: работать с самой последней (возможно нестабильной) версией, внести вклад в разработку, отлаживать и вносить изменения в кодовую базу. +Требуется опыт разработки. Для обновления достаточно выполнить git pull. + +## Какую версию устанавливать? + +### Последняя стабильная версия (Latest) + +Полностью протестирована, поддерживается и получает только исправления ошибок. +Рекомендуется для всех пользователей. + +### Бета-версия (Beta) + +Содержит новые функции, которые ещё не выпущены. +Предварительно протестирована, но могут быть известные или неизвестные ошибки. +Подходит для тестирования и обратной связи. + +### Альфа-версия (Alpha) + +Версия в разработке, включает самые новые функции, которые могут быть нестабильны или незавершены. +Рекомендуется только для технически подготовленных пользователей. +Не подходит для использования в продакшене. + +| Версия | Ветка кода | Docker images версия | create-nocobase-app версия | Версия | +|----------|------------|----------------------------|------------------------------|----------------------------------------------| +| `Latest` | `main` | `nocobase/nocobase:latest` | `create-nocobase-app@latest` | `1.3.51`<br />`1.3.52`<br />... | +| `Beta` | `next` | `nocobase/nocobase:beta` | `create-nocobase-app@beta` | `1.4.0-beta.1`<br/>`1.4.0-beta.2`<br />... | +| `Alpha` | `develop` | `nocobase/nocobase:alpha` | `create-nocobase-app@alpha` | `1.5.0-alpha.1`<br/>`1.5.0-alpha.2`<br />... | diff --git a/docs/ru-RU/welcome/getting-started/installation/timeweb.md b/docs/ru-RU/welcome/getting-started/installation/timeweb.md new file mode 100644 index 0000000000..577c96bb3f --- /dev/null +++ b/docs/ru-RU/welcome/getting-started/installation/timeweb.md @@ -0,0 +1,103 @@ +# Timeweb + +![timeweb-logo.png](./Timeweb/timeweb-logo.png) + + +## 1. Регистрация в Timeweb.Cloud + +### Шаг 1.1: Переход на сайт +Откройте браузер и перейдите по адресу: https://timeweb.cloud + +![Шаг 1 - Главная страница](./Timeweb/step1-homepage.png) + +### Шаг 1.2: Регистрация +1. Нажмите кнопку «Создать «аккаунт +2. Заполните обязательные поля: + +![Шаг 2 - Форма регистрации](./Timeweb/step2-register.png) + +3. Подтвердите email, перейдя по ссылке в письме + +--- + +## 2. Создание проекта + +### Шаг 2.1: Переход в раздел проектов +После входа в аккаунт: +1. В левом меню выберите "Проекты" +2. Нажмите "Создать проект" + +![Шаг 3 - Создание проекта](./Timeweb/step3-create-project.png) + +### Шаг 2.2: Заполнение информации +Введите данные проекта: +- **Название** +- **Описание** +- **Пользователи** + +![Шаг 4 - Настройки проекта](./Timeweb/step4-project-settings.png) + +3. Нажмите "Создать" + +--- + +## 3. Установка через маркетплейс + +### Шаг 3.1: Сервисы +1. Выберите "Облачный сервер" + +![Шаг 5 - Сервисы](./Timeweb/step5-cloud-servers.png) + +### Шаг 3.2: Настройка сервера +В конструкторе сервера: + +1. В разделе "Образ" выберите "Маркетплейс" +2. В строке поиска введите "NocoBase" + +![Шаг 6 - Выбор образа](./Timeweb/step6-select-image.png) + +3. Выберите NocoBase из списка доступных приложений + +![Шаг 7 - NocoBase](./Timeweb/step7-nocobase.png) + +--- + +## 4. Конфигурация сервера + +### Шаг 4.1: Выбор региона +Прокрутите страницу вниз до раздела "Регион": +- Выберите ближайший к вам регион +- Для России рекомендуем "Москва" + +### Шаг 4.2: Настройка конфигурации +Система автоматически предложит оптимальные параметры: + +### Шаг 4.3: Дополнительные настройки +1. Раздел "Сеть" настройте по своему усмотрению +2. В "Дополнительных услугах" можно включить: + - Автоматические бэкапы + - Защиту от DDoS-атак + +--- + +## 5. Завершение установки + +### Шаг 5.1: Авторизация +Оставьте настройки авторизации по умолчанию: + +### Шаг 5.2: Имя сервера +1. Введите имя сервера: "nocobase-server" +2. Выберите проект, созданный в шаге 2 + +### Шаг 5.3: Запуск +Нажмите кнопку "Заказать" и дождитесь завершения процесса (5-10 минут) + +--- + +## 6. Первый запуск NocoBase + +После успешной установки: +1. Перейдите по ссылке, которая придет на email +2. Используйте стандартные учетные данные: + - Логин: admin@nocobase.com + - Пароль: admin123 diff --git a/docs/ru-RU/welcome/getting-started/plugin.md b/docs/ru-RU/welcome/getting-started/plugin.md new file mode 100644 index 0000000000..291c4e254d --- /dev/null +++ b/docs/ru-RU/welcome/getting-started/plugin.md @@ -0,0 +1,132 @@ +# Установка и обновление плагинов + +## Установка и обновление коммерческих плагинов (версии 1.4 и выше) + +### Настройка переменных среды + +Задайте переменные среды [`NOCOBASE_PKG_USERNAME`](/welcome/getting-started/env#nocobase_pkg_username) и [`NOCOBASE_PKG_PASSWORD`](/welcome/getting-started/env#nocobase_pkg_password) (имя пользователя и пароль сервисной платформы NocoBase) для автоматической загрузки коммерческих плагинов во время установки или обновления приложения. + +```bash +NOCOBASE_PKG_USERNAME=your-username +NOCOBASE_PKG_PASSWORD=your-password +``` + +[Как задать переменные окружения?](/welcome/getting-started/env) + +### Загрузка плагинов + +#### Установка Docker + +Перезапустите контейнер для автоматической загрузки плагинов + +```bash +docker compose restart app +``` + +#### Получите исходный код Git или создайте-nocobase-приложение для установки + +Выполните команду `pkg download-pro`, чтобы загрузить плагины + +```bash +yarn nocobase pkg download-pro +``` + +Внимание ! ! ! + +- Вышеуказанные шаги позволят загрузить только те плагины, которые соответствуют текущей версии приложения, и не приведут к обновлению плагинов. Если вам нужно обновить плагины, пожалуйста, сначала [обновите приложение](/welcome/getting-started/upgrading), авторизованные плагины будут автоматически обновляться. +- Авторизованные плагины также будут автоматически загружены во время [установки](/welcome/getting-started/installation) или [обновления](/welcome/getting-started/upgrading). + +### Активировать плагины + +Выберите плагины, которые вы хотите активировать, в менеджере плагинов. + +![20241204000230](https://static-docs.nocobase.com/20241204000230.png) + +### Обновите плагины + +Сначала [обновите приложение](/welcome/getting-started/upgrading) и авторизованные плагины будут автоматически загружены или обновлены во время обновления приложения. В настоящее время невозможно обновить плагины без обновления приложения. + +## Установка и обновление плагинов через интерфейс + +Добавление или обновление плагинов через интерфейс приведет к перезапуску приложения. Для пакетных операций рассмотрите альтернативные методы. + +### Upload Plugin Packages via Plugin Manager + +Как коммерческие, так и сторонние плагины могут быть загружены непосредственно через интерфейс. + +![20241204000127](https://static-docs.nocobase.com/20241204000127.png) + +Заметки: + +- Для создания пакетов плагинов обратитесь к [Написание вашего первого плагина](/development/your-fisrt-plugin) для обеспечения надлежащего изготовления и упаковки. + +### Активировать плагины + +Выберите плагины, которые вы хотите активировать, в менеджере плагинов. + +![20241204000230](https://static-docs.nocobase.com/20241204000230.png) + +## Установка и обновление плагинов через загрузку каталога плагинов + +Предупреждение: + +- Поддерживает пакетные операции и удобен для миграции. +- Подходит для серверов в среде интрасети. +- Рекомендуется для обновления несовместимых плагинов, вызванных обновлениями приложений. + +### Добавляйте или обновляйте плагины + +Храните коммерческие и сторонние плагины в каталоге `./storage/plugins/`. Вы можете загрузить плагины в среду разработки и загрузить их в каталог `./storage/plugins/` на сервере. В качестве альтернативы, можно напрямую извлечь пакет плагина в каталог. Например: + +```bash +mkdir -p /my-nocobase/storage/plugins/@nocobase/plugin-auth-cas && \ + tar -xvzf /downloads/plugin-auth-cas-1.4.0.tgz \ + -C /my-nocobase/storage/plugins/@nocobase/plugin-auth-cas \ + --strip-components=1 +``` + +Эта команда гарантирует, что плагин будет извлечен в `/my-nocobase/storage/plugins/@nocobase/plugin-auth-cas` без каталога `package`. Правильная структура каталогов выглядит следующим образом: + +```bash +./plugin-auth-cas/dist/server/migrations/20240425200816-change-locale-module.js +./plugin-auth-cas/dist/server/auth.js +./plugin-auth-cas/client.js +./plugin-auth-cas/dist/constants.js +./plugin-auth-cas/dist/externalVersion.js +./plugin-auth-cas/dist/client/index.js +./plugin-auth-cas/dist/index.js +./plugin-auth-cas/dist/server/index.js +./plugin-auth-cas/dist/server/actions/login.js +./plugin-auth-cas/dist/server/plugin.js +./plugin-auth-cas/server.js +./plugin-auth-cas/dist/server/actions/service.js +./plugin-auth-cas/dist/locale/en-US.json +./plugin-auth-cas/dist/locale/ko_KR.json +./plugin-auth-cas/package.json +./plugin-auth-cas/dist/locale/zh-CN.json +./plugin-auth-cas/README.md +./plugin-auth-cas/README.zh-CN.md +./plugin-auth-cas/dist/server/migrations/20240425200816-change-locale-module.d.ts +./plugin-auth-cas/dist/server/auth.d.ts +./plugin-auth-cas/client.d.ts +./plugin-auth-cas/dist/constants.d.ts +./plugin-auth-cas/dist/client/index.d.ts +./plugin-auth-cas/dist/client/locale/index.d.ts +./plugin-auth-cas/dist/index.d.ts +./plugin-auth-cas/dist/server/index.d.ts +./plugin-auth-cas/dist/server/actions/login.d.ts +./plugin-auth-cas/dist/client/Options.d.ts +./plugin-auth-cas/dist/server/plugin.d.ts +./plugin-auth-cas/server.d.ts +./plugin-auth-cas/dist/server/actions/service.d.ts +./plugin-auth-cas/dist/client/SigninPage.d.ts +./plugin-auth-cas/LICENSE.txt +``` + +### Запустите команду Upgrade для обновления плагинов + +После загрузки плагинов в каталог плагинов выполните команду `nocobase upgrade`, чтобы завершить обновление. + +```bash +yarn nocobase upgrade --skip-code-update +``` diff --git a/docs/ru-RU/welcome/getting-started/upgrading/create-nocobase-app.md b/docs/ru-RU/welcome/getting-started/upgrading/create-nocobase-app.md new file mode 100644 index 0000000000..1c6380facf --- /dev/null +++ b/docs/ru-RU/welcome/getting-started/upgrading/create-nocobase-app.md @@ -0,0 +1,30 @@ +# Обновление для `create-nocobase-app` + +## 0. Подготовка к обновлению + +:::warning +- Обязательно сделайте **резервную копию базы данных перед обновлением**! +- **Для версий 1.4 и выше**: при указании переменных [`NOCOBASE_PKG_USERNAME`](/welcome/getting-started/env#nocobase_pkg_username) и [`NOCOBASE_PKG_PASSWORD`](/welcome/getting-started/env#nocobase_pkg_password) коммерческие плагины будут автоматически загружены при установке или обновлении. + ::: + +## 1. Обновление приложения + +Для обновления приложения выполните команду: + +```bash +# Перейдите в директорию проекта +cd my-nocobase-app +# Запустите команду обновления +yarn nocobase upgrade +# Запуск в режиме разработки +yarn dev +``` + +Если возникнут проблемы при обновлении, вы можете создать новое приложение заново, использовав .env из старой версии для переноса переменных окружения. +Важно правильно указать данные подключения к базе данных. +Если вы используете SQLite, скопируйте файлы базы данных в папку ./storage/db/, +после чего снова выполните yarn nocobase upgrade. + +## 2. Обновление отдельных плагинов + +После обновления NocoBase, установленные через интерфейс плагины также могут потребовать обновления. Подробнее читайте в разделе [Установка и обновление плагинов](/welcome/getting-started/plugin) diff --git a/docs/ru-RU/welcome/getting-started/upgrading/docker-compose.md b/docs/ru-RU/welcome/getting-started/upgrading/docker-compose.md new file mode 100644 index 0000000000..f9c83b4cf8 --- /dev/null +++ b/docs/ru-RU/welcome/getting-started/upgrading/docker-compose.md @@ -0,0 +1,55 @@ +# Обновление при через Docker Compose + +## 0. Подготовка к обновлению + +:::warning +- Обязательно сделайте **резервную копию базы данных перед обновлением**! +- **Для версий 1.4 и выше**: при указании переменных [`NOCOBASE_PKG_USERNAME`](/welcome/getting-started/env#nocobase_pkg_username) и [`NOCOBASE_PKG_PASSWORD`](/welcome/getting-started/env#nocobase_pkg_password) плагины будут автоматически загружаться при установке или обновлении приложения. +::: + +## 1. Перейдите в директорию, где находится `docker-compose.yml` + +Пример: + +```bash +# Для macOS или Linux +cd /your/path/my-project/ +# Для Windows +cd C:\your\path\my-project +``` + +## 2. Обновите версию образа + +- 'latest' : стабильная версия с полной проверкой, содержит только исправления ошибок. Рекомендуется к установке. +- 'beta' : включает новые функции, которые скоро будут выпущены. Уже протестирована, но возможны ошибки. +- 'alpha' : версия в разработке, содержит последние изменения, может быть нестабильной. Используется в основном для внутреннего тестирования и быстрой итерации. +- ` 1.3.51 ` : можно указать конкретную версию. Список доступных версий см. на (https://hub.docker.com/r/nocobase/nocobase/tags). + +:::warning +Образы можно только обновлять, откат на предыдущую версию невозможен. Версия next не может быть откатана до latest. +::: + +```yml +# ... +services: + app: + image: nocobase/nocobase:main + image: nocobase/nocobase:latest + image: nocobase/nocobase:1.2.4-alpha +# ... +``` + +## 3. Перезапустите контейнер + +```bash +# Загрузка последней версии образа +docker compose pull +# Запуск контейнера +docker compose up -d app +# Просмотр логов приложения +docker compose logs app +``` + +## 4. Обновление отдельных плагинов + +После обновления NocoBase, отдельные установленные через интерфейс плагины также могут требовать обновления. Подробнее см. в раздел [Установка и обновление плагинов](/welcome/getting-started/plugin) diff --git a/docs/ru-RU/welcome/getting-started/upgrading/git-clone.md b/docs/ru-RU/welcome/getting-started/upgrading/git-clone.md new file mode 100644 index 0000000000..df45ad40a0 --- /dev/null +++ b/docs/ru-RU/welcome/getting-started/upgrading/git-clone.md @@ -0,0 +1,64 @@ +# Обновление при установке из исходного кода (Git) + +## 0. Подготовка к обновлению + +:::warning +- Обязательно сделайте **резервную копию базы данных перед обновлением**! +- **Для версий 1.4 и выше**: при указании переменных [`NOCOBASE_PKG_USERNAME`](/welcome/getting-started/env#nocobase_pkg_username) и [`NOCOBASE_PKG_PASSWORD`](/welcome/getting-started/env#nocobase_pkg_password) коммерческие плагины будут автоматически загружены при установке или обновлении. + ::: + +## 1. Перейдите в директорию проекта NocoBase + +```bash +cd my-nocobase-app +``` + +## 2. Загрузите последнюю версию исходного кода + +```bash +git pull +``` + +## 3. Удалите кэш и зависимости (необязательно) + +Если обновление проходит с ошибками, попробуйте очистить кэш и удалить зависимости: + +```bash +# Очистить кэш NocoBase +yarn nocobase clean +# Удалить зависимости +yarn rimraf -rf node_modules +``` + +## 4. Установите зависимости заново + +```bash +yarn install +``` + +## 5. Выполните команду обновления + +```bash +yarn nocobase upgrade +``` + +## 6. Запустите NocoBase + +В режиме разработки + +```bash +yarn dev +``` + +В режиме Production + +```bash +# Сборка проекта +yarn build +# Запуск +yarn start +``` + +## 7. Обновление отдельных плагинов + +После обновления NocoBase, отдельные установленные через интерфейс плагины также могут потребовать обновления. См. раздел [Установка и обновление плагинов](/welcome/getting-started/plugin) diff --git a/docs/ru-RU/welcome/getting-started/upgrading/index.md b/docs/ru-RU/welcome/getting-started/upgrading/index.md new file mode 100644 index 0000000000..7a8d85035e --- /dev/null +++ b/docs/ru-RU/welcome/getting-started/upgrading/index.md @@ -0,0 +1,7 @@ +# Обзор + +NocoBase поддерживает три типа установки, и каждый из них имеет свои особенности при обновлении. + +- [Обновление при использовании Docker Compose](./docker-compose.md) +- [Обновление для create-nocobase-app](./create-nocobase-app.md) +- [Обновление при установке из исходного кода (Git)](./git-clone.md) diff --git a/docs/ru-RU/welcome/how.md b/docs/ru-RU/welcome/how.md new file mode 100644 index 0000000000..cf849cb177 --- /dev/null +++ b/docs/ru-RU/welcome/how.md @@ -0,0 +1,48 @@ +# Как работает NocoBase + +NocoBase реализует все функции благодаря микроядерной архитектуре и модульной системе плагинов. + +## Микроядерная архитектура (Microkernel) + +Ядро NocoBase похоже на фреймворк разработки, который определяет жизненный цикл приложения и стандартизирует интерфейсы каждого уровня. Базовая структура NocoBase показана на следующей схеме: + +![how-micro-core](https://static-docs.nocobase.com/how-micro-core.png) + +В основе лежит **модель данных** как движок, **интерфейс на основе блоков** как пользовательский уровень, а **уровень бизнес-логики** служит связующим звеном, реализующим бизнес-правила и обеспечивающим циклическое взаимодействие данных через действия пользователя. + +NocoBase определяет стандартные протоколы на следующих трёх уровнях: + +1. **Модель данных** — надстройка над ORM для реляционных БД с унифицированным описанием структуры данных + (см. [Коллекции и поля](/development/server/collections)) + +2. **HTTP-маршрутизация** — интерфейс в стиле REST на основе ресурсов и действий + (см. [Ресурсы и действия](/development/server/resources-actions)) + +3. **Клиентский интерфейс** — описание макетов страниц и блоков через JSON Schema на базе Formily 2.0 + (см. [UI Schema](/development/client/ui-schema/quick-start)) + +На основе этих протоколов разработка дополнительных модулей становится проще и единообразнее. + +### Плагинная архитектура + +NocoBase предоставляет расширяемые интерфейсы на всех этапах жизненного цикла приложения: +типизация полей и коллекций, внешние источники данных, middleware на уровне бизнес-логики, UI-компоненты, блоки и т.д. +Даже сами события запуска, остановки и загрузки плагинов поддерживают расширение. +Кроме того, **многие плагины также предоставляют свои собственные интерфейсы для дальнейшего расширения**. + +Благодаря этому подходу, можно не только настраивать и расширять функциональность под любые задачи, +но и реализовывать весь функционал системы исключительно через плагины — как это сделано во встроенных модулях NocoBase: + +![how-plugins-en](https://static-docs.nocobase.com/how-plugins-en.png) + +**Плагины могут добавлять функциональность на любом этапе жизненного цикла приложения.** +Например, плагин "Разрешения" включает: +- пользовательские таблицы данных, +- бизнес-логику обработки запросов на уровне middleware, +- интерфейсы для панели управления. + +Такой подход обеспечивает как мощные no-code возможности, так и гибкость для разработки и расширения при необходимости. + +### Подробнее + +См. раздел [Разработка плагинов](/development), чтобы начать расширять платформу с помощью собственных модулей. diff --git a/docs/ru-RU/welcome/introduction/features.md b/docs/ru-RU/welcome/introduction/features.md new file mode 100644 index 0000000000..acf89cd8a1 --- /dev/null +++ b/docs/ru-RU/welcome/introduction/features.md @@ -0,0 +1,23 @@ +# Особенности, которые отличают NocoBase + +## 1. Модель-ориентированный подход: разделение интерфейса и структуры данных + +Большинство no-code платформ, основанных на формах, таблицах или процессах (например, Airtable), создают структуру данных напрямую через пользовательский интерфейс — добавляя колонку, вы фактически добавляете новое поле. Такой подход прост в использовании, но ограничивает гибкость и функциональность в более сложных сценариях. + +NocoBase использует архитектуру с разделением интерфейса и структуры данных. Это позволяет создавать любое количество блоков (представлений данных) для одной и той же коллекции — с разным типом, стилем, содержимым и действиями в каждом блоке. Такой подход сохраняет простоту no-code-интерфейса, но при этом обеспечивает гибкость, близкую к традиционной разработке. + +![model](https://nocobase-file.oss-cn-beijing.aliyuncs.com/model-l.png) + +## 2. Что видишь — то и получаешь + +NocoBase позволяет строить сложные и уникальные бизнес-системы, но это не означает сложного управления. +Все действия по настройке выполняются прямо в пользовательском интерфейсе: достаточно одного клика, чтобы открыть параметры конфигурации. Администратор с соответствующими правами может настроить интерфейс в режиме реального времени по принципу WYSIWYG (What You See Is What You Get). + +![wysiwyg](https://nocobase-file.oss-cn-beijing.aliyuncs.com/wysiwyg.gif) + +## 3. Расширение функциональности через плагины + +Архитектура NocoBase построена на плагинах. +Новые функции реализуются путём разработки и установки плагинов. Это делает расширение возможностей платформы таким же простым, как установка приложения на смартфон. + +![plugins](https://nocobase-file.oss-cn-beijing.aliyuncs.com/plugins-l.png) diff --git a/docs/ru-RU/welcome/introduction/features/2.collection-block.png b/docs/ru-RU/welcome/introduction/features/2.collection-block.png new file mode 100755 index 0000000000..7389064cba Binary files /dev/null and b/docs/ru-RU/welcome/introduction/features/2.collection-block.png differ diff --git a/docs/ru-RU/welcome/introduction/features/2.user-root.gif b/docs/ru-RU/welcome/introduction/features/2.user-root.gif new file mode 100755 index 0000000000..92d668c149 Binary files /dev/null and b/docs/ru-RU/welcome/introduction/features/2.user-root.gif differ diff --git a/docs/ru-RU/welcome/introduction/index.md b/docs/ru-RU/welcome/introduction/index.md new file mode 100644 index 0000000000..d8f72a528e --- /dev/null +++ b/docs/ru-RU/welcome/introduction/index.md @@ -0,0 +1,33 @@ +# Начиная + +<video width="100%" controls> + <source src="https://static-docs.nocobase.com/EN-NocoBase-V1203-202501151021.mp4" type="video/mp4"> +</video> + + +## Что такое NocoBase + +NocoBase — это ориентированная на расширяемость, открытая no-code платформа для разработки. +Вместо того чтобы тратить годы и миллионы рублей на разработку с нуля, +вы можете развернуть NocoBase всего за несколько минут — и получить в своё распоряжение частную, +управляемую и легко расширяемую no-code платформу для создания приложений. + +Главная: +https://www.nocobase.com/ru + +Online Demo: +https://demo.nocobase.com/new + +Документация: +https://docs.nocobase.com/ + +Коммерческие лицензии и плагины: +https://nocobase.com/ru/commercial + +Лицензии и документы: +https://www.nocobase.com/ru/agreement + + +## Связатся с нами: +hello@nocobase.com (Весь мир) +hello@nocobase.ru (Для писем и России) diff --git a/docs/ru-RU/welcome/introduction/why.md b/docs/ru-RU/welcome/introduction/why.md new file mode 100644 index 0000000000..3410485bc0 --- /dev/null +++ b/docs/ru-RU/welcome/introduction/why.md @@ -0,0 +1,29 @@ +# Почему выбирают NocoBase + +## Открытый исходный код, автономность и контроль + +NocoBase распространяется с открытым исходным кодом по лицензии AGPL-3.0 — вы можете использовать её бесплатно при соблюдении условий лицензии. Расширенные функции доступны в коммерческой версии, которая также поставляется с полным исходным кодом и разворачивается на ваших серверах — это обеспечивает полный контроль над системой и безопасность данных. + +## Мощные возможности no-code разработки + +В основе NocoBase лежат три ключевые концепции: коллекции, блоки и действия.; Коллекции определяют структуру данных и отражают бизнес-сущности, ;Блоки визуализируют данные, ; Действия отправляют команды пользователя на сервер для изменения или взаимодействия с данными. ; Это позволяет описывать и реализовывать бизнес-логику без программирования. + +## Высокая расширяемость + +На практике около 80% задач удобно решаются с помощью no-code, но оставшиеся 20% требуют расширения. +NocoBase построен по микроядерной архитектуре с развитой системой плагинов. Все дополнительные функции реализуются в виде плагинов. Платформа построена на Node.js с использованием популярных технологий: Koa, Sequelize, React и других. Это делает её особенно удобной для доработки и расширения. + +## Интеграция с существующими системами + +Компании уже используют различные системы и базы данных. NocoBase поддерживает подключение к сторонним базам данных и API в качестве источников данных, а также позволяет встраивать себя в сторонние системы или, наоборот, встраивать внешние сервисы внутрь NocoBase. + +## Простой и лёгкий в использовании + +Технологический стек на JavaScript/TypeScript позволяет одному разработчику заниматься как фронтендом, так и бэкендом. +NocoBase нетребователен к ресурсам и может быть развёрнут на сервере с минимальной конфигурацией. + +## Один раз платишь — используешь навсегда + +Оплата взимается только за коммерческие функции. +Помимо open source-версии, предлагаются коммерческие лицензии, услуги и плагины. +Вы платите один раз — и получаете пожизненную лицензию и исходный код всех коммерческих компонентов. diff --git a/docs/ru-RU/welcome/release/20240519-changelog.md b/docs/ru-RU/welcome/release/20240519-changelog.md new file mode 100644 index 0000000000..d16266c6c2 --- /dev/null +++ b/docs/ru-RU/welcome/release/20240519-changelog.md @@ -0,0 +1,183 @@ +# Версия 1.0.0 - альфа +# 15:2024.05.19 + +## Новые возможности + +### Исправлены столбцы таблицы + +См. [Исправлены столбцы таблицы](https://docs-cn.nocobase.com/handbook/ui/fields/generic/table-column#%E5%9B%BA%E5%AE%9A%E5%88%97) + +<img src="https://static-docs.nocobase.com/202405191512587.png"/> + +### Поддержка добавления блоков Ганта, Канбана в модулях / выдвижных ящиках + +См. [Adding Blocks in Modals](https://docs-cn.nocobase.com/handbook/ui/pop-up) + +<img src="https://static-docs.nocobase.com/202405191512280.png"/> + +### Поддержка добавления правил привязки в подробные блоки + +Правила привязки в подробных блоках теперь поддерживают динамическую настройку отображения/скрытия полей. См. [Правила привязки в подробных блоках](https://docs-cn.nocobase.com/handbook/ui/blocks/data-blocks/details#%E8%81%94%E5%8A%A8%E8%A7%84%E5%88%99) + +<img src="https://static-docs.nocobase.com/202405191513781.png"/> + +### Авторизация: LDAP + +Добавлен плагин "Auth: LDAP" (компьютерный плагин), который позволяет пользователю войти в NocoBase, используя учетную запись сервера LDAP. Обратитесь к [Руководителю пользователя](https://docs-cn.nocobase.com/handbook/auth-ldap) + +<img src="https://static-docs.nocobase.com/202405191513995.png"/> + +### Узел HTTP-запроса рабочего процесса + +#### Поддержка формата данных `application/www-x-form-urlencoded` + +Ранее request node поддерживал только формат JSON (`application/json`) для основной части Content-Type. После обновления он также поддерживает настройку данных формата формы в парах ключ-значение. + +<img src="https://static-docs.nocobase.com/202405191514472.png"/> + +#### Поддержка шаблонов строк для полей ввода значений + +Ранее поля ввода значений в разделах `Заголовки` и `Параметры` узла запроса поддерживали только чистый ввод или выбор переменных. После обновления вы можете напрямую вводить строку со встроенными переменными. Оно будет автоматически проанализировано как конечное строковое значение перед отправкой запроса. + +<img src="https://static-docs.nocobase.com/202405191514748.png"/> + +### Событие пользовательского действия рабочего процесса + +Кнопка действия `Отправить в рабочий процесс`, изначально привязанная к типу прямого запуска `Событий после выполнения действия`, была разделена и независимо создана как кнопка действия `Запустить рабочий процесс` для `Пользовательских событий действия` (коммерческий плагин). Ранее добавленные кнопки действий в версии с открытым исходным кодом по-прежнему можно использовать, но они больше не поддерживаются для новых дополнений. Пожалуйста, используйте вместо них новое `Пользовательское событие действия`. Дополнительную информацию смотрите в [Руководстве по использованию](https://docs-cn.nocobase.com/handbook/workflow-custom-action-trigger). + +<img src="https://static-docs.nocobase.com/202405191515770.png"/> + +## Улучшения + +### Корректировки настроек действий + +#### Корректировки пользовательского интерфейса + +1. Сглажена иерархия меню и удалены некоторые операции переключения, поддерживающие повторные добавления. + +До: + +<img src="https://static-docs.nocobase.com/202405191516585.png"/> + +После: + +<img src="https://static-docs.nocobase.com/202405191516026.png"/> + +2. Объединены аналогичные действия + +2.1. Объединены опции `Добавить новое` и `Добавить запись` + +До: + +<img src="https://static-docs.nocobase.com/202405191516874.png"/> + +После: + +<img src="https://static-docs.nocobase.com/202405191516737.png"/> + +2.2 Объединены опции `Отправить` и `Сохранить запись`. + +До: + +<img src="https://static-docs.nocobase.com/202405191517966.png"/> + +После: + +<img src="https://static-docs.nocobase.com/202405191517078.png"/> + +#### Влияние на разработчиков + +Смотрите PR:<a href="https://github.com/nocobase/nocobase/pull/4336" target="_blank">рефакторинг: сглаживание и объединение действий #4336</a> + +### Журналы + +#### Список файлов плагина журнала + +До: В среде с несколькими приложениями подключаемый модуль log отображает списки файлов журнала всех приложений. + +После: В среде с несколькими приложениями подключаемый модуль log отображает только список файлов журнала текущего приложения. + +#### Пути к папкам рабочего процесса и пользовательских запросов + +До: Путь к папке для файлов журнала рабочего процесса и пользовательских запросов находится на том же уровне, что и папка журнала приложения. + +После: Путь к папке для файлов журнала рабочего процесса и пользовательских запросов относится к соответствующей папке журнала приложения. + +### Рабочий процесс + +#### Данные о результатах узла HTTP-запроса + +Ранее структура данных результата после успешного или неудачного HTTP-запроса узла была несогласованной. + +```js +// Only the response data part is returned when successful +{ + // Any JSON content +} + +// The failure returns the result of Axios's error.toJSON() function. +{ + config: {}, + headers: {}, + status: 500, + statusText: 'xxx', +} +``` + +Теперь ответ как на успешный, так и на неудачный результат будет последовательно сохранен в node result. + +```js +// Success +{ + config: {}, + headers: {}, + status: 200, + statusText: 'ok', + data: {} +} + +// Fail +{ + config: {}, + headers: {}, + status: 500, + statusText: 'xxx', + data: {} +} +``` + +Другие исключения, такие как отсутствие ответа от сервера (`статус` равен `null`) или неудачная инициализация, могут быть обнаружены в журналах обработки ошибок сервера. Смотрите более подробную информацию в <a href="https://github.com/nocobase/nocobase/issues/4373" target="_blank">[Рабочий процесс: узел HTTP-запроса] Тип результата узла не исправлен #4373</a> + +## Исправлена ошибка + +- Поля даты в графиках не были преобразованы в соответствии с часовым поясом клиента при объединении данных с измерением поля даты. <a href="https://github.com/nocobase/nocobase/pull/4366" target="_blank">исправление(data-vi): при форматировании даты #4366 следует использовать местный часовой пояс</a> + +- Плохое обновление представления; для обновления необходимо выйти из представлений базы данных и повторно войти в них. <a href="https://github.com/nocobase/nocobase/pull/4224" target="_blank">исправлено: поля коллекции должны обновляться после редактирования синхронизации из базы данных #4224</a> + +- Блоки древовидной таблицы не сворачивали все узлы при добавлении дочернего узла. <a href="https://github.com/nocobase/nocobase/pull/4289" target="_blank">исправлено: не сворачивать все узлы при добавлении дочернего узла в блок древовидной таблицы #4289</a> + +- Неверная настройка поля "Название коллекции". <a href="https://github.com/nocobase/nocobase/pull/4358" target="_blank">исправление: неверная настройка поля "название коллекции" #4358</a> + +- поле bigint потеряло точность в режиме read pretty. <a href="https://github.com/nocobase/nocobase/pull/4360" target="_blank">исправлено: поле bigint потеряло точность в режиме read pretty #4360</a> + +- Файлы журнала оставались открытыми после остановки вспомогательных приложений. <a href="https://github.com/nocobase/nocobase/pull/4380" target="_blank">исправлено (логгер): должен закрывать поток журналов после удаления приложения #4380</a> + +- Ошибка выбора поля ассоциации агрегатных узлов рабочего процесса. <a href="https://github.com/nocobase/nocobase/pull/4315" target="_blank">исправление(plugin-workflow-aggregate): исправлена связь в поле выбора #4315</a> + +- Параметр игнорировать ошибку был недопустим в режиме синхронизации узла HTTP-запроса. <a href="https://github.com/nocobase/nocobase/pull/4334" target="_blank">исправление (плагин-рабочий процесс-запрос): исправлена ошибка игнорирования в режиме синхронизации #4334</a> + +- Поля ввода значений в узле HTTP-запроса workflow переполнены. <ahref="https://github.com/nocobase/nocobase/pull/4353" target="_blank">исправлено(плагин-workflow-запрос): исправлено переполнение полей значений #4354</a> + +- Специальные символы вызывали зависание узла HTTP-запроса workflow. <ahref="https://github.com/nocobase/nocobase/pull/4376" target="_blank">исправление(plugin-workflow-request): исправлено зависание запроса при неверном значении заголовка #4376</a> + +- Установка marginBlock в редакторе тем повлияла на интервал между полями формы. <a href="https://github.com/nocobase/nocobase/pull/4374" target="_blank">исправление (редактор тем): маркер не должен влиять на интервал между полями формы.marginBlock #4374</a> + +- Исправлена ошибка, из-за которой нажатие на опцию "Лицензия" в правом верхнем углу страницы приводило к неправильному перенаправлению. [PR #4415](https://github.com/nocobase/nocobase/pull/4415) + +- Исправлена ошибка, из-за которой оператор поля становился недействительным после сохранения формы фильтра в виде шаблона блока. [PR #4390](https://github.com/nocobase/nocobase/pull/4390) + +## Документация + +- Добавлен пример документации по плагину: https://docs-cn.nocobase.com/plugin-samples + +- Обновлена структура документации для руководства по использованию рабочего процесса: https://docs-cn.nocobase.com/handbook/workflow diff --git a/docs/ru-RU/welcome/release/6de7c906518b6c6643570292523b06c8.png b/docs/ru-RU/welcome/release/6de7c906518b6c6643570292523b06c8.png new file mode 100644 index 0000000000..b16f60154a Binary files /dev/null and b/docs/ru-RU/welcome/release/6de7c906518b6c6643570292523b06c8.png differ diff --git a/docs/ru-RU/welcome/release/703809b8cd74cc95e1ab2ab766980817.gif b/docs/ru-RU/welcome/release/703809b8cd74cc95e1ab2ab766980817.gif new file mode 100644 index 0000000000..9ae9417be2 Binary files /dev/null and b/docs/ru-RU/welcome/release/703809b8cd74cc95e1ab2ab766980817.gif differ diff --git a/docs/ru-RU/welcome/release/collection-templates.md b/docs/ru-RU/welcome/release/collection-templates.md new file mode 100644 index 0000000000..711d512a1a --- /dev/null +++ b/docs/ru-RU/welcome/release/collection-templates.md @@ -0,0 +1,83 @@ +# Версия 0.9.0 +# Шаблоны коллекций (Collection Templates) + +<img src="./v08-1-collection-templates/v08-1-collection-templates.jpg" alt="Интерфейс шаблонов коллекций"> + +## Зачем нужны шаблоны коллекций? + +*(Раздел будет дополнен)* + +## Описание параметров конфигурации + +```ts +interface ICollectionTemplate { + name: string; // Уникальное имя шаблона + title?: string; // Отображаемое название + /** Порядок сортировки */ + order?: number; + /** Конфигурация по умолчанию */ + default?: CollectionOptions; + /** Настраиваемые параметры CollectionOptions (поля формы для создания/редактирования коллекции) */ + configurableProperties?: Record<string, ISchema>; + /** Доступные типы полей для этого шаблона */ + availableFieldInterfaces?: + | AvailableFieldInterfacesInclude + | AvailableFieldInterfacesExclude; +} + +interface AvailableFieldInterfacesInclude { + include?: any[]; // Явное включение типов полей +} + +interface AvailableFieldInterfacesExclude { + exclude?: any[]; // Исключение типов полей +} + +interface CollectionOptions { + /** + * Автогенерация ID + * @default true + */ + autoGenId?: boolean; + /** Поле "Создано пользователем" */ + createdBy?: boolean; + /** Поле "Обновлено пользователем" */ + updatedBy?: boolean; + /** Поле "Дата создания" */ + createdAt?: boolean; + /** Поле "Дата обновления" */ + updatedAt?: boolean; + /** Поддержка сортировки */ + sortable?: boolean; + /** Древовидная структура */ + tree?: string; + /** Логирование изменений */ + logging?: boolean; + /** Наследование от других коллекций */ + inherits: string | string[]; + /** Список полей */ + fields?: FieldOptions[]; +} +``` + +## Пример использования + +Создание шаблона без автогенерации ID, с настройкой только названия и имени: + +```ts +import { collectionConfigurableProperties } from '@nocobase/client'; + +{ + default: { + autoGenId: false, // Отключение автогенерации ID + fields: [], // Пустой список полей по умолчанию + }, + configurableProperties: { + ...collectionConfigurableProperties('name', 'title'), // Разрешить настройку только name и title + }, +} +``` + +Полный пример плагина с шаблоном коллекции: +[samples/custom-collection-template](https://github.com/nocobase/nocobase/tree/feat/collection-templates/packages/samples/custom-collection-template) + diff --git a/docs/ru-RU/welcome/release/formulas.md b/docs/ru-RU/welcome/release/formulas.md new file mode 100644 index 0000000000..7fc0197d5b --- /dev/null +++ b/docs/ru-RU/welcome/release/formulas.md @@ -0,0 +1,39 @@ +# Версия 0.9.0 +# Плагины формул для полей + +NocoBase предоставляет два плагина для работы с формулами: + +1. `@nocobase/plugin-math-formula-field` - Математические формулы +2. `@nocobase/plugin-excel-formula-field` - Excel-формулы (спасибо [azriel46d](https://github.com/nocobase/nocobase/pull/906) за вклад) + +## Математические формулы + +Реализовано на базе [Math.js](https://mathjs.org/). Основные возможности: +- Гибкий парсер выражений с поддержкой символьных вычислений +- Множество встроенных функций и констант +- Работа с разными типами данных: числа, большие числа, комплексные числа, дроби, единицы измерения, матрицы + +Примеры: +```ts +import { evaluate } from 'mathjs'; +evaluate('1.2 * (2 + 4.5)'); // 7.8 +evaluate('12.7 cm to inch'); // 5 inch +evaluate('sin(45 deg) ^ 2'); // 0.5 +evaluate('9 / 3 + 2i'); // 3 + 2i +evaluate('det([-1, 2; 3, 1])'); // -7 +``` + +<img src="./formulas/math-form.jpg" alt="Пример математической формулы"/> + +## Excel-формулы + +Реализовано на базе [Formula.js](https://formulajs.info/). Подробнее: +[Функции Formula.js](https://formulajs.info/functions/) + +Примеры: +```ts +SUM(-5, 15, 32); // 42 +IF(true, 'Hello!', 'Goodbye!'); // Hello! +``` + +<img src="./formulas/excel-form.jpg" alt="Пример Excel-формулы"/> diff --git a/docs/ru-RU/welcome/release/formulas/excel-form.jpg b/docs/ru-RU/welcome/release/formulas/excel-form.jpg new file mode 100644 index 0000000000..41413a0c40 Binary files /dev/null and b/docs/ru-RU/welcome/release/formulas/excel-form.jpg differ diff --git a/docs/ru-RU/welcome/release/formulas/math-form.jpg b/docs/ru-RU/welcome/release/formulas/math-form.jpg new file mode 100644 index 0000000000..ecf54c476f Binary files /dev/null and b/docs/ru-RU/welcome/release/formulas/math-form.jpg differ diff --git a/docs/ru-RU/welcome/release/gantt/introduction.md b/docs/ru-RU/welcome/release/gantt/introduction.md new file mode 100644 index 0000000000..0c320eda0e --- /dev/null +++ b/docs/ru-RU/welcome/release/gantt/introduction.md @@ -0,0 +1,27 @@ +# Блок Ганта + +## Создать блок Ганта + +![](https://static-docs.nocobase.com/c87178922308143656bc444c57bac45d.png) + +## Блок Ганта (без данных) + +![](https://static-docs.nocobase.com/1b439225f12b7a09aaab9d3a6dc11215.png) + +## Настройки блока + +## Блок Ганта (нет данных) + +![](https://static-docs.nocobase.com/1b439225f12b7a09aaab9d3a6dc11215.png) + +## Заблокировать настройки + +![](https://static-docs.nocobase.com/e3b1950ca356fd58b4e1b644067337e4.png) + +## Общие задачи + +![](https://static-docs.nocobase.com/4bb22d6c98dc5f4e0a27aecd67a0e586.png) + +## Древовидные задачи + +![](https://static-docs.nocobase.com/672625d0238dbd685f3e1c1ef810024f.png) diff --git a/docs/ru-RU/welcome/release/gantt/static/IwJzb9PsFovXwZxNqJnc6HaFnyg.png b/docs/ru-RU/welcome/release/gantt/static/IwJzb9PsFovXwZxNqJnc6HaFnyg.png new file mode 100644 index 0000000000..a8893aa825 Binary files /dev/null and b/docs/ru-RU/welcome/release/gantt/static/IwJzb9PsFovXwZxNqJnc6HaFnyg.png differ diff --git a/docs/ru-RU/welcome/release/gantt/static/UxT7b8mVCo1isIxrsjtcZ8hpnlf.png b/docs/ru-RU/welcome/release/gantt/static/UxT7b8mVCo1isIxrsjtcZ8hpnlf.png new file mode 100644 index 0000000000..2d309ad427 Binary files /dev/null and b/docs/ru-RU/welcome/release/gantt/static/UxT7b8mVCo1isIxrsjtcZ8hpnlf.png differ diff --git a/docs/ru-RU/welcome/release/gantt/static/V9w1b43YsoIRYpxtFdscpf2MnQf.png b/docs/ru-RU/welcome/release/gantt/static/V9w1b43YsoIRYpxtFdscpf2MnQf.png new file mode 100644 index 0000000000..c454d0c438 Binary files /dev/null and b/docs/ru-RU/welcome/release/gantt/static/V9w1b43YsoIRYpxtFdscpf2MnQf.png differ diff --git a/docs/ru-RU/welcome/release/gantt/static/VGTZbOs38obgyqxm5YfcGS1Vnhb.png b/docs/ru-RU/welcome/release/gantt/static/VGTZbOs38obgyqxm5YfcGS1Vnhb.png new file mode 100644 index 0000000000..4e93257fd8 Binary files /dev/null and b/docs/ru-RU/welcome/release/gantt/static/VGTZbOs38obgyqxm5YfcGS1Vnhb.png differ diff --git a/docs/ru-RU/welcome/release/gantt/static/VM3qbBhLeoEcKwxwAZkcRHBynOd.png b/docs/ru-RU/welcome/release/gantt/static/VM3qbBhLeoEcKwxwAZkcRHBynOd.png new file mode 100644 index 0000000000..901010eff6 Binary files /dev/null and b/docs/ru-RU/welcome/release/gantt/static/VM3qbBhLeoEcKwxwAZkcRHBynOd.png differ diff --git a/docs/ru-RU/welcome/release/gantt/static/YJZZb0aO3oG9n6x4aZwcAB07nng.png b/docs/ru-RU/welcome/release/gantt/static/YJZZb0aO3oG9n6x4aZwcAB07nng.png new file mode 100644 index 0000000000..a603d847c4 Binary files /dev/null and b/docs/ru-RU/welcome/release/gantt/static/YJZZb0aO3oG9n6x4aZwcAB07nng.png differ diff --git a/docs/ru-RU/welcome/release/index.md b/docs/ru-RU/welcome/release/index.md new file mode 100644 index 0000000000..28605219e2 --- /dev/null +++ b/docs/ru-RU/welcome/release/index.md @@ -0,0 +1 @@ +<Release></Release> diff --git a/docs/ru-RU/welcome/release/inherits.md b/docs/ru-RU/welcome/release/inherits.md new file mode 100644 index 0000000000..be1a82e887 --- /dev/null +++ b/docs/ru-RU/welcome/release/inherits.md @@ -0,0 +1,81 @@ +# Версия 0.9.0 +# Наследование таблиц + +Наследование таблиц реализовано на основе [синтаксиса INHERITS в PostgreSQL](https://www.postgresql.org/docs/current/tutorial-inheritance.html) и доступно только при установке NocoBase с PostgreSQL. + +## Пример + +Рассмотрим систему обучения с тремя типами пользователей: ученики, родители и учителя. + +Без наследования потребовалось бы создать отдельные таблицы: +- **Ученики**: имя, возраст, пол, ID-номер +- **Родители**: имя, возраст, пол, профессия, образование +- **Учителя**: имя, возраст, пол, стаж, семейное положение + +С наследованием таблиц общие поля можно вынести в родительскую таблицу: +- **Пользователи** (базовая таблица): имя, возраст, пол +- **Ученики**: ID-номер (дополнительно к унаследованным полям) +- **Родители**: профессия, образование +- **Учителя**: стаж, семейное положение + +ER-диаграмма представлена ниже: + +**Ключевые особенности:** +1. Общие атрибуты хранятся один раз (в родительской таблице) +2. Дочерние таблицы автоматически получают все поля родителя +3. Поддержка полиморфных запросов через родительскую таблицу + +<img src="./inherits/er.svg" style="max-width: 700px;" /> + +Примечание: + +ID дочерних таблиц и родительской таблицы используют общую последовательность (shared sequence) + +Настройка наследования таблиц + +В поле Inherits выберите таблицу, от которой нужно унаследовать структуру: + +<img src="./inherits/inherit.jpg" /> + +Настройка с помощью кода осуществляется следующим образом: + +```ts +db.collection({ + name: 'users', +}); + +db.collection({ + name: 'students', + inherits: 'users', +}); +``` + +Внимание: + +-Унаследованные таблицы не могут быть выбраны произвольно. Первичный ключ должен быть уникальной последовательностью, такой как uuid или последовательность самоустанавливающихся идентификаторов, для всех таблиц в унаследованной строке используется один и тот же ключ. +-Параметр Inherits не может быть изменен +-Если существует связь наследования, унаследованная родительская таблица не может быть удалена + +## Список полей спецификации + +Унаследованные поля родительской таблицы отображаются синхронно в списке полей. Поля родительской таблицы нельзя изменить, но их можно переопределить. + +<img src="./inherits/inherit-fields.jpg" /> + +Меры предосторожности при перезаписи полей родительской таблицы: + +-Идентификация поля дочерней таблицы переписывается, если оно совпадает с полем родительской таблицы +-Тип поля для перезаписи должен быть согласованным +-Параметры поля взаимосвязи, отличные от целевой коллекции, должны быть согласованными + +## Дочерний табличный блок родительской таблицы + +Блок дочерней таблицы может быть сконфигурирован в блоке родительской таблицы + +<img src="./inherits/inherited-blocks.jpg" /> + +## Добавьте конфигурацию унаследованного поля родительской таблицы + +При наличии унаследованной родительской таблицы при настройке полей будет предоставлена конфигурация полей, унаследованных от родительской таблицы + +<img src="./inherits/configure-fields.jpg" /> diff --git a/docs/ru-RU/welcome/release/inherits/configure-fields.jpg b/docs/ru-RU/welcome/release/inherits/configure-fields.jpg new file mode 100644 index 0000000000..adf256da3b Binary files /dev/null and b/docs/ru-RU/welcome/release/inherits/configure-fields.jpg differ diff --git a/docs/ru-RU/welcome/release/inherits/er.svg b/docs/ru-RU/welcome/release/inherits/er.svg new file mode 100644 index 0000000000..166f6f7924 --- /dev/null +++ b/docs/ru-RU/welcome/release/inherits/er.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Do not edit this file with editors other than diagrams.net --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="866px" height="541px" viewBox="-0.5 -0.5 866 541" content="<mxfile host="app.diagrams.net" modified="2022-11-16T02:45:35.466Z" agent="5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36" version="20.5.3" etag="r3dIv0wwxGSoXKs5LQh3" type="device"><diagram id="sQ-S40tc_4f1Dr5c1EA7" name="Page-1">7V1db6M4FP01eewIAiTp4yZtd6VtV1UzszP7tHKDm1hDcGScNplfvzbY4cMlAW0SnNhSpOKLuRjfYx98D9CeN1lufidgtXjCIYx6fSfc9Ly7Xr/v+v0B+8Mt28xy4w08YZoTFIpquWGKfkFhdIR1jUKYlCpSjCOKVmXjDMcxnNGSDRCCP8rV3nBUPusKzKFimM5ApFq/o5AuMusocHL7HxDNF/LMriP2LIGsLAzJAoT4o2Dy7nvehGBMs63lZgIj3n2yX7LjHmr27hpGYEybHPD6+HOBh+F7/9/k29P44Wa2Hfx94/qZm3cQrcUVf0sgSUST6Vb2A2v9im9S8MpN44QCQkW4PIcZWAAoQDEkzOCm5SgCqwSl1TPLAkXhI9jiNZWOZGn8hjYwfMmixeuywD0yZ7zInb8x51PRGL4bRGges+0Zu3Z+xjGBCWvLI0jozsE6DmEoSru+586Sn5DOFmIP9/wAlijiCJ3gJZqx656CmPWA8zRlFUT/QELhprbn3V082VCAeAkp2bIq4oC+H2SHiFHg3w4EJj5ySLkjYVsU4SQrAgHj+c757nwvDPYgnrO+yU84dEondG9d9YSfnc+rnA5ErHtjQOGYd2dSxBfbKFxrbkpR1waBgYLA/eB74YEcLzBBvzjkIhnVAiDT8gdaRiBmoxOEFdMYp/NRCiwURRMcYY7aGMdQAS6vFBK8+grIHFJhWGEU07SLgjH7sU6bOF+CXsDaOmFlNy+zH69O6ATHCSVsgHAfkOH0A3KsjileCacRfJP+iYgI337FlOJlU7SWsN0IunumBRXQ2zJMDsG3Cqcieks4ag2agQKa5z9rYcMulyIQ5QMlna04XYA8yJ8g4dPY7OJRDVR1jsKs49+idNZZoDCE8TnjF3wev0LAvJbx+mS2aentHJPJUMEFq98tLiRXZXXHyQrMUDx/zI4cVIATaAqcTf3AD44KpEbuzoGkkaWlRrTknBOd+2mp6V3V6WjptjlozjP5wBBJf51z0shMTpLrvwIoYrCEurOSjlAxjoVkj1kWuhwWuu2ahSRGLAvVjigDWchTQMEzn9dIQsX1lJLvOz5yzCMlNWdsSUlzUnL7nbNSizyveaxUE72rZyU1jzuHcQjJVRLTicFiHhGp2d4pXbNg0MvXL0tYKYuZB3E2JyBEzHNlCEgyfVBHRyMw7r//GUkAnEvkDC5I5OzbbLJ+Imc2fegrcvbVbLIVOZVBZd5NkzylFTmPDBzjbqA8m17WbyV/gJY6Fzk9m14+NKIM5CQ1vYz4QgzR7V/r5asJC/py2vnoCDKPnGya+eLIqXPt07NZ5kMjykByUrPM109Hx4eJeQyk5pctA2nOQN0LnV6LXK95FFQTvaunIO2eDNabgmpgYhwF+WquV8ENDOdQLjyzJfcLjABFOL7P92TL04yD3D5nKbqMRJxgHP7GX5VlxVeQwDuQLHpF0bH99M48cpVRHJu1mDezFgXClOA1mcF9s7+YXKnkvLqKDd6A2r2qWxIjpZGkffhebvIeID1z4s0hunvtV/BS4LoV9GTXKg7LkaN48ivCauAMK56yzlA8HQ2Dapb4OQ2dVdnPrrIHgzIY/OGo4f2OASq73yIzbfT9+jlVdr8G0Lqo7L6aubYquzKozLtj99X0s1XZjwEc8+7h7Rcu9EsjHaClzlV2X7uctUZZJN/Qz1v4akIaz2brVbrY152bdASMeVxkH0Q+IhedjH4619F97fLVx6Cf/xEvQ581ltOWPjg4Dc8cHxnGUUtgHya+BGrpXiAPWqRpTeCWwNBnhgM182q5pREyzOOWBs8C6yiDbxD9IecYtv0P3/4SiNLdprDrThIZazrZ/tg1iRUKR/Fiflhayo87keQuVTXtJfeqNho48tvCrSV3v+LJdSqeTiy5B2rK+CsEs8U1fJn74jX3wLFvtudIbZGnNvqu/5yae1AzE+uiuQdqHttq7sqgMnBFoGanreZ+DOCYt2Bokb82mpbOqbkfoKXONXfZAH0SEhpp7tmIMo+TBmpaewkIQVB7YtIRLcYR0aBFstsSkR5E1Ln6PtAuM64REWUjykAiavE9DMtAtTAxj4Hs48cXx0Ddi/QD+/zxoSFlIAW1+CCGpaBamJhHQQ2eOtZRvj+VpC5FM5MldWd4LEmdFfP/op1Vz/8buXf/Hw==</diagram></mxfile>" style="background-color: rgb(255, 255, 255);"><defs><clipPath id="mx-clip-50-260-30-30-0"><rect x="50" y="260" width="30" height="30"/></clipPath><clipPath id="mx-clip-86-260-144-30-0"><rect x="86" y="260" width="144" height="30"/></clipPath><clipPath id="mx-clip-86-290-144-30-0"><rect x="86" y="290" width="144" height="30"/></clipPath><clipPath id="mx-clip-86-320-144-30-0"><rect x="86" y="320" width="144" height="30"/></clipPath><clipPath id="mx-clip-86-350-144-30-0"><rect x="86" y="350" width="144" height="30"/></clipPath><clipPath id="mx-clip-635-260-30-30-0"><rect x="635" y="260" width="30" height="30"/></clipPath><clipPath id="mx-clip-671-260-144-30-0"><rect x="671" y="260" width="144" height="30"/></clipPath><clipPath id="mx-clip-671-290-144-30-0"><rect x="671" y="290" width="144" height="30"/></clipPath><clipPath id="mx-clip-365-80-30-30-0"><rect x="365" y="80" width="30" height="30"/></clipPath><clipPath id="mx-clip-401-80-144-30-0"><rect x="401" y="80" width="144" height="30"/></clipPath><clipPath id="mx-clip-401-110-144-30-0"><rect x="401" y="110" width="144" height="30"/></clipPath><clipPath id="mx-clip-365-360-30-30-0"><rect x="365" y="360" width="30" height="30"/></clipPath><clipPath id="mx-clip-401-360-144-30-0"><rect x="401" y="360" width="144" height="30"/></clipPath><clipPath id="mx-clip-401-390-144-30-0"><rect x="401" y="390" width="144" height="30"/></clipPath></defs><g><path d="M 230 260 L 230 243.5 Q 230 230 216.5 230 L 63.5 230 Q 50 230 50 243.5 L 50 260" fill="none" stroke="none" pointer-events="all"/><path d="M 228.39 260.64 L 227.53 238.36 L 223.16 231.4 L 217.34 231.16 L 59.74 228.53 L 56.62 230.92 L 49.91 237.56 L 49.97 261.69" fill="rgb(255, 255, 255)" stroke="none" pointer-events="none"/><path d="M 230 260 M 230 260 C 231.43 255.65 230.98 251.52 230 243.5 M 230 260 C 229.56 255.61 229.45 249.91 230 243.5 M 230 243.5 C 228.22 233.07 225.8 230.4 216.5 230 M 230 243.5 C 231.97 232.99 223.85 228.33 216.5 230 M 216.5 230 C 172.04 227.79 128.6 227.66 63.5 230 M 216.5 230 C 168.31 230.62 119.43 230.36 63.5 230 M 63.5 230 C 54 229.15 48.49 234.8 50 243.5 M 63.5 230 C 55.1 231.22 51.95 235.47 50 243.5 M 50 243.5 C 50.04 247.74 48.98 251.54 50 260 M 50 243.5 C 50.04 248.12 50.28 252.03 50 260" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="none"/><path d="M 50 260 M 50 260 C 51.14 283.98 49.88 311.93 50 376.5 M 50 260 C 50.33 301.22 49.19 343.41 50 376.5 M 50 376.5 C 49.97 387.19 52.78 391.74 63.5 390 M 50 376.5 C 50.99 387.7 53.36 391.57 63.5 390 M 63.5 390 C 95.23 389.88 130.18 389.62 216.5 390 M 63.5 390 C 101.69 391.29 140.44 390.43 216.5 390 M 216.5 390 C 224.06 388.55 229.7 384.71 230 376.5 M 216.5 390 C 223.83 389.03 228.74 384.73 230 376.5 M 230 376.5 C 231.45 349.56 228.5 321.25 230 260 M 230 376.5 C 229.53 352.32 230.55 328.38 230 260" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="none"/><path d="M 50 260 M 50 260 C 90.24 259.9 128.45 262.3 230 260 M 50 260 C 115.12 261.02 178.43 261.5 230 260" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="none"/><path d="M 80 260 M 80 260 C 80.86 265.01 79.6 273.99 80 290 M 80 260 C 80.58 270.25 79.44 281.47 80 290 M 80 290 C 82 299.81 82.17 306.91 80 320 M 80 290 C 78.9 300.51 79.04 312.64 80 320 M 80 320 C 78.42 326.79 80.25 334.7 80 350 M 80 320 C 79.64 326.63 79.06 333.63 80 350 M 80 350 C 80.26 357.51 81.56 365.57 80 380 M 80 350 C 79.8 356.63 79.29 364.26 80 380" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Comic Sans MS" font-weight="bold" pointer-events="none" text-anchor="middle" font-size="12px"><text x="139.5" y="249.5">Users</text></g><path d="M 50 260 M 230 260 M 230 290 M 230 290 C 190.15 292.1 152.24 290.7 50 290 M 230 290 C 188.46 289.29 147.49 288.98 50 290" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><path d="M 50 260 M 80 260 M 80 290 M 50 290" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Comic Sans MS" font-weight="bold" pointer-events="none" clip-path="url(#mx-clip-50-260-30-30-0)" text-anchor="middle" font-size="12px"><text x="64.5" y="279.5">PK</text></g><path d="M 80 260 M 230 260 M 230 290 M 80 290" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Comic Sans MS" font-weight="bold" text-decoration="underline" pointer-events="none" clip-path="url(#mx-clip-86-260-144-30-0)" font-size="12px"><text x="87.5" y="279.5">id</text></g><path d="M 50 290 M 80 290 M 80 320 M 50 320" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><path d="M 80 290 M 230 290 M 230 320 M 80 320" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Comic Sans MS" pointer-events="none" clip-path="url(#mx-clip-86-290-144-30-0)" font-size="12px"><text x="87.5" y="309.5">name</text></g><path d="M 50 320 M 80 320 M 80 350 M 50 350" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><path d="M 80 320 M 230 320 M 230 350 M 80 350" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Comic Sans MS" pointer-events="none" clip-path="url(#mx-clip-86-320-144-30-0)" font-size="12px"><text x="87.5" y="339.5">age</text></g><path d="M 50 350 M 80 350 M 80 380 M 50 380" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><path d="M 80 350 M 230 350 M 230 380 M 80 380" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Comic Sans MS" pointer-events="none" clip-path="url(#mx-clip-86-350-144-30-0)" font-size="12px"><text x="87.5" y="369.5">gender</text></g><path d="M 813.39 260.2 L 814.31 239.51 L 808.93 232.53 L 801.89 228.12 L 645.92 229.55 L 638.96 233.44 L 635.39 238.91 L 634.86 259.68" fill="rgb(255, 255, 255)" stroke="none" pointer-events="none"/><path d="M 815 260 M 815 260 C 813.68 254.54 815.37 248.34 815 243.5 M 815 260 C 814.48 254.03 814.91 249.27 815 243.5 M 815 243.5 C 813.44 236.35 809.24 228.91 801.5 230 M 815 243.5 C 813.99 232.78 809.13 230.23 801.5 230 M 801.5 230 C 755.39 229.04 706.55 231.89 648.5 230 M 801.5 230 C 770.84 231.98 739.47 231.58 648.5 230 M 648.5 230 C 637.96 231.59 635.77 234.42 635 243.5 M 648.5 230 C 639.96 230.97 636.77 233.43 635 243.5 M 635 243.5 C 634.44 249.29 636.16 254.08 635 260 M 635 243.5 C 634.37 248.76 635.27 254.25 635 260" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="none"/><path d="M 635 260 M 635 260 C 637.03 284.77 635.75 311.51 635 376.5 M 635 260 C 634.68 284.75 635.11 308.62 635 376.5 M 635 376.5 C 634.86 385.18 639.66 391.08 648.5 390 M 635 376.5 C 633.55 383.78 638.98 390.64 648.5 390 M 648.5 390 C 679.73 387.72 711.04 388.76 801.5 390 M 648.5 390 C 692.61 388.04 737.53 387.84 801.5 390 M 801.5 390 C 809.31 390.2 815.16 386.22 815 376.5 M 801.5 390 C 811.2 391.16 813.36 384.68 815 376.5 M 815 376.5 C 817.55 334.82 817.84 291.73 815 260 M 815 376.5 C 816.28 336.07 816.1 296.14 815 260" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="none"/><path d="M 635 260 M 635 260 C 676.41 259.07 714.63 260.25 815 260 M 635 260 C 671.4 261.37 708.88 261.26 815 260" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="none"/><path d="M 665 260 M 665 260 C 666.95 265.79 665.67 273.55 665 290 M 665 260 C 664.43 266.94 664.86 273.01 665 290 M 665 290 C 666.03 297.52 663.46 307.12 665 320 M 665 290 C 665.64 299.43 664.28 308.89 665 320 M 665 320 C 666.83 327.98 663.89 337.59 665 350 M 665 320 C 664.9 327.11 665.12 334.01 665 350 M 665 350 C 663.01 356.28 666.34 365.32 665 380 M 665 350 C 664.5 362.4 665.65 373.18 665 380" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Comic Sans MS" font-weight="bold" pointer-events="none" text-anchor="middle" font-size="12px"><text x="724.5" y="249.5">Students</text></g><path d="M 635 260 M 815 260 M 815 290 M 815 290 C 776.27 286.87 734.32 288.25 635 290 M 815 290 C 765.53 291.47 715.52 290.58 635 290" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><path d="M 635 260 M 665 260 M 665 290 M 635 290" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Comic Sans MS" font-weight="bold" pointer-events="none" clip-path="url(#mx-clip-635-260-30-30-0)" text-anchor="middle" font-size="12px"><text x="649.5" y="279.5">PK</text></g><path d="M 665 260 M 815 260 M 815 290 M 665 290" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Comic Sans MS" font-weight="bold" text-decoration="underline" pointer-events="none" clip-path="url(#mx-clip-671-260-144-30-0)" font-size="12px"><text x="672.5" y="279.5">id</text></g><path d="M 635 290 M 665 290 M 665 320 M 635 320" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><path d="M 665 290 M 815 290 M 815 320 M 665 320" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Comic Sans MS" pointer-events="none" clip-path="url(#mx-clip-671-290-144-30-0)" font-size="12px"><text x="672.5" y="309.5">identityNumber</text></g><path d="M 635 320 M 665 320 M 665 350 M 635 350" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><path d="M 665 320 M 815 320 M 815 350 M 665 350" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><path d="M 635 350 M 665 350 M 665 380 M 635 380" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><path d="M 665 350 M 815 350 M 815 380 M 665 380" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><path d="M 635 275 M 635 275 C 627.47 273.29 622.87 273.43 605 275 M 635 275 C 623.17 275.77 613.28 274.66 605 275 M 605 275 C 527.68 272.14 449.16 274.42 260 275 M 605 275 C 478.24 275.19 351.17 274.92 260 275 M 260 275 C 248.6 275.66 234.68 274.48 230 275 M 260 275 C 252.14 274.8 244.4 273.75 230 275" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="none"/><path d="M 230 271 M 230 271 C 229.58 272.05 230.38 273.86 230 279 M 230 271 C 229.63 274.13 230.06 276.61 230 279" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="none"/><path d="M 543.39 79.25 L 543.01 59.52 L 540.91 50.63 L 533.02 48.75 L 375.03 49.1 L 370.93 53.35 L 367.82 59.27 L 364.21 81.31" fill="rgb(255, 255, 255)" stroke="none" pointer-events="none"/><path d="M 545 80 M 545 80 C 546.5 72.71 545.7 69.3 545 63.5 M 545 80 C 545.52 74.43 545.49 68.91 545 63.5 M 545 63.5 C 543.55 54.22 538.56 49.51 531.5 50 M 545 63.5 C 543.14 54.87 540.67 48.48 531.5 50 M 531.5 50 C 491.28 48.88 449.65 47.72 378.5 50 M 531.5 50 C 491.33 50.03 449 49.64 378.5 50 M 378.5 50 C 370.71 50.43 363.17 55.44 365 63.5 M 378.5 50 C 371.62 51.92 364.86 53.32 365 63.5 M 365 63.5 C 363.86 68.73 363.55 72.05 365 80 M 365 63.5 C 364.55 67.6 364.7 70.42 365 80" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="none"/><path d="M 365 80 M 365 80 C 366.49 106.78 363.29 132.71 365 196.5 M 365 80 C 365.15 108.39 365.81 136.17 365 196.5 M 365 196.5 C 364.21 206.81 370.88 210.21 378.5 210 M 365 196.5 C 365.47 207.61 367.83 211 378.5 210 M 378.5 210 C 439.34 211.63 497.7 211.53 531.5 210 M 378.5 210 C 424.29 209.97 471.21 210.37 531.5 210 M 531.5 210 C 540.65 208.68 544.27 205.89 545 196.5 M 531.5 210 C 538.6 210.08 545.17 204.05 545 196.5 M 545 196.5 C 545.78 169.12 544.82 137.42 545 80 M 545 196.5 C 543.38 169.87 545.22 143.13 545 80" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="none"/><path d="M 365 80 M 365 80 C 406.47 82.22 442.82 82.56 545 80 M 365 80 C 408.08 81.72 451.49 81.83 545 80" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="none"/><path d="M 395 80 M 395 80 C 396.81 87.78 393.62 94.7 395 110 M 395 80 C 395.28 87.85 395.94 95.09 395 110 M 395 110 C 395.41 118.22 397.03 124.17 395 140 M 395 110 C 394.95 120.93 395.84 130.61 395 140 M 395 140 C 394.74 148.64 394.53 159.53 395 170 M 395 140 C 394.66 149.68 394.2 159 395 170 M 395 170 C 394.17 177.43 395.22 190.07 395 200 M 395 170 C 395.45 178.38 393.93 186.8 395 200" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Comic Sans MS" font-weight="bold" pointer-events="none" text-anchor="middle" font-size="12px"><text x="454.5" y="69.5">Parents</text></g><path d="M 365 80 M 545 80 M 545 110 M 545 110 C 506.24 111.28 466.32 111.82 365 110 M 545 110 C 488.82 111.03 433.34 110.36 365 110" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><path d="M 365 80 M 395 80 M 395 110 M 365 110" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Comic Sans MS" font-weight="bold" pointer-events="none" clip-path="url(#mx-clip-365-80-30-30-0)" text-anchor="middle" font-size="12px"><text x="379.5" y="99.5">PK</text></g><path d="M 395 80 M 545 80 M 545 110 M 395 110" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Comic Sans MS" font-weight="bold" text-decoration="underline" pointer-events="none" clip-path="url(#mx-clip-401-80-144-30-0)" font-size="12px"><text x="402.5" y="99.5">id</text></g><path d="M 365 110 M 395 110 M 395 140 M 365 140" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><path d="M 395 110 M 545 110 M 545 140 M 395 140" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Comic Sans MS" pointer-events="none" clip-path="url(#mx-clip-401-110-144-30-0)" font-size="12px"><text x="402.5" y="129.5">occupation</text></g><path d="M 365 140 M 395 140 M 395 170 M 365 170" fill="none" stroke="rgb(0, 0, 0)" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><path d="M 395 140 M 545 140 M 545 170 M 395 170" fill="none" stroke="rgb(0, 0, 0)" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><path d="M 365 170 M 395 170 M 395 200 M 365 200" fill="none" stroke="rgb(0, 0, 0)" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><path d="M 395 170 M 545 170 M 545 200 M 395 200" fill="none" stroke="rgb(0, 0, 0)" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><path d="M 365 95 M 365 95 C 357.47 97.05 351.67 96.17 335 95 M 365 95 C 357.44 94.97 347.11 94.5 335 95 M 335 95 C 314.8 138.9 294.57 185.57 260 275 M 335 95 C 313.23 150.82 291.88 205.32 260 275 M 260 275 C 251.68 275.32 243.38 274.6 230 275 M 260 275 C 250.65 276 241.79 276.01 230 275" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="none"/><path d="M 230 271 M 230 271 C 229.58 273.54 229.9 274.95 230 279 M 230 271 C 230.43 273.28 229.72 275.37 230 279" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="none"/><path d="M 543.4 359.16 L 543.19 339.52 L 540.65 333.44 L 531.73 331.15 L 376.47 331.33 L 370.66 332.3 L 365.84 339.49 L 364.8 361.83" fill="rgb(255, 255, 255)" stroke="none" pointer-events="none"/><path d="M 545 360 M 545 360 C 545.83 356.51 544.71 351.55 545 343.5 M 545 360 C 545.68 356.53 544.11 353.01 545 343.5 M 545 343.5 C 544.12 332.89 542.13 329.39 531.5 330 M 545 343.5 C 543.18 335.6 539.33 330.84 531.5 330 M 531.5 330 C 499.28 329.34 468.49 332.67 378.5 330 M 531.5 330 C 488.46 330.18 444.35 330.29 378.5 330 M 378.5 330 C 370.93 328.71 363.05 334.58 365 343.5 M 378.5 330 C 368.64 329.63 364.81 333.25 365 343.5 M 365 343.5 C 365.11 348.38 364.36 352.43 365 360 M 365 343.5 C 364.41 347.48 364.71 352.35 365 360" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="none"/><path d="M 365 360 M 365 360 C 366.43 386.53 366.05 411.46 365 476.5 M 365 360 C 365.86 401.82 365.66 444.19 365 476.5 M 365 476.5 C 364.8 487.33 367.64 489.17 378.5 490 M 365 476.5 C 365.53 486.56 369.41 489.5 378.5 490 M 378.5 490 C 410.45 490.89 440.81 487.09 531.5 490 M 378.5 490 C 431.17 490.93 481.41 491.71 531.5 490 M 531.5 490 C 539.48 490.73 543.21 483.68 545 476.5 M 531.5 490 C 541.58 489.98 543.42 487.1 545 476.5 M 545 476.5 C 544.47 430.35 546.72 382.06 545 360 M 545 476.5 C 543.19 431.53 543.79 386.32 545 360" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="none"/><path d="M 365 360 M 365 360 C 406.5 361.79 445.68 361.1 545 360 M 365 360 C 429.51 359.19 493.62 359.94 545 360" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="none"/><path d="M 395 360 M 395 360 C 396.8 367.52 396.41 373.43 395 390 M 395 360 C 395.36 370.92 395.17 382.38 395 390 M 395 390 C 394.44 399.16 396.2 407.32 395 420 M 395 390 C 395.38 398.86 395.66 406.93 395 420 M 395 420 C 393.51 427.8 394.51 430.75 395 450 M 395 420 C 393.95 429.53 395.32 440.86 395 450 M 395 450 C 394.85 458.4 394.47 464.05 395 480 M 395 450 C 395.45 460.62 393.75 472.56 395 480" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Comic Sans MS" font-weight="bold" pointer-events="none" text-anchor="middle" font-size="12px"><text x="454.5" y="349.5">Teachers</text></g><path d="M 365 360 M 545 360 M 545 390 M 545 390 C 506.21 391.18 465.07 390.69 365 390 M 545 390 C 503.12 388.9 463.23 388.87 365 390" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><path d="M 365 360 M 395 360 M 395 390 M 365 390" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Comic Sans MS" font-weight="bold" pointer-events="none" clip-path="url(#mx-clip-365-360-30-30-0)" text-anchor="middle" font-size="12px"><text x="379.5" y="379.5">PK</text></g><path d="M 395 360 M 545 360 M 545 390 M 395 390" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Comic Sans MS" font-weight="bold" text-decoration="underline" pointer-events="none" clip-path="url(#mx-clip-401-360-144-30-0)" font-size="12px"><text x="402.5" y="379.5">id</text></g><path d="M 365 390 M 395 390 M 395 420 M 365 420" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><path d="M 395 390 M 545 390 M 545 420 M 395 420" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Comic Sans MS" pointer-events="none" clip-path="url(#mx-clip-401-390-144-30-0)" font-size="12px"><text x="402.5" y="409.5">married</text></g><path d="M 365 420 M 395 420 M 395 450 M 365 450" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><path d="M 395 420 M 545 420 M 545 450 M 395 450" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><path d="M 365 450 M 395 450 M 395 480 M 365 480" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><path d="M 395 450 M 545 450 M 545 480 M 395 480" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="square" stroke-miterlimit="10" pointer-events="none"/><path d="M 365 375 M 365 375 C 357.47 376.82 350.47 374.9 335 375 M 365 375 C 359.71 374.18 352.93 374.34 335 375 M 335 375 C 312.24 344.89 293.91 318.55 260 275 M 335 375 C 316.6 351.47 297.54 327.94 260 275 M 260 275 C 252.76 274.97 244.08 274.72 230 275 M 260 275 C 249.17 274.6 239.17 275.68 230 275" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="none"/><path d="M 230 271 M 230 271 C 229.58 273.44 229.41 274.43 230 279 M 230 271 C 230.28 272.42 230.03 274.13 230 279" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="none"/></g></svg> diff --git a/docs/ru-RU/welcome/release/inherits/form.jpg b/docs/ru-RU/welcome/release/inherits/form.jpg new file mode 100644 index 0000000000..2de047cd59 Binary files /dev/null and b/docs/ru-RU/welcome/release/inherits/form.jpg differ diff --git a/docs/ru-RU/welcome/release/inherits/inherit-fields.jpg b/docs/ru-RU/welcome/release/inherits/inherit-fields.jpg new file mode 100644 index 0000000000..acdaddda96 Binary files /dev/null and b/docs/ru-RU/welcome/release/inherits/inherit-fields.jpg differ diff --git a/docs/ru-RU/welcome/release/inherits/inherit.jpg b/docs/ru-RU/welcome/release/inherits/inherit.jpg new file mode 100644 index 0000000000..ecc419daa6 Binary files /dev/null and b/docs/ru-RU/welcome/release/inherits/inherit.jpg differ diff --git a/docs/ru-RU/welcome/release/inherits/inherited-blocks.jpg b/docs/ru-RU/welcome/release/inherits/inherited-blocks.jpg new file mode 100644 index 0000000000..e95928c20a Binary files /dev/null and b/docs/ru-RU/welcome/release/inherits/inherited-blocks.jpg differ diff --git a/docs/ru-RU/welcome/release/logger.md b/docs/ru-RU/welcome/release/logger.md new file mode 100644 index 0000000000..2129d80f66 --- /dev/null +++ b/docs/ru-RU/welcome/release/logger.md @@ -0,0 +1,67 @@ +# Версия 0.9.0 +# Cистема ведения журнала NocoBase + +## `@nocobase/регистратор` + +Основанный на реализации Winston, он предоставляет удобный способ создания экземпляра регистратора. + +```ts +const logger = createLogger(); +logger.info('Hello distributed log files!'); + +const { instance, middleware } = createAppLogger(); // 用于 @nocobase/server +app.logger = instance; +app.use(middleware); +``` + +## Новые переменные среды + +связанными с регистратором переменными среды являются: + +- [LOGGER_TRANSPORT](../начало работы/env.md#logger_transport) +- [ПУТЬ к БАЗЕ РЕГИСТРАТОРА](./начало работы/env.md#путь к базе регистратора) + +## Приложение для ведения журнала событий + +```ts +const app = new Application({ + logger: { + async skip(ctx) { + return false; + }, + requestWhitelist: [], + responseWhitelist: [], + transports: ['console', 'dailyRotateFile'], + }, +}); +``` + +Обратитесь к дополнительным элементам конфигурации [Winston 文档](https://github.com/winstonjs/winston#table-of-contents) + +## app.logger & ctx.logger + +В контексте `ctx` логгер `logger` использует уникальный идентификатор запроса (reqId), который остается постоянным на протяжении всего жизненного цикла контекста. + +```ts +ctx.logger = app.logger.child({ reqId: ctx.reqId }); +``` + +`app.logger` и `ctx.logger` являются экземплярами Winston. Подробное использование см. в [документации Winston](https://github.com/winstonjs/winston#table-of-contents). + +## Кастомные Transports + +Помимо стандартного подхода Winston, NocoBase предоставляет более удобный способ настройки. + +```ts +import { Transports } from '@nocobase/logger'; + +Transports['custom'] = () => { + return new winston.transports.Console(); +}; + +const app = new Application({ + logger: { + transports: ['custom'], + }, +}); +``` diff --git a/docs/ru-RU/welcome/release/roadmap.md b/docs/ru-RU/welcome/release/roadmap.md new file mode 100644 index 0000000000..40bba83976 --- /dev/null +++ b/docs/ru-RU/welcome/release/roadmap.md @@ -0,0 +1,48 @@ +# Дорожная карта + +* Обновлено 11 июня 2024 г.* + +Мы разрабатываем или уже запланировали следующие новые функции и плагины, ☑️ - только что завершенные и опубликованные: + +## Функции: + +- Значения полей по умолчанию поддерживают выражения +- Ассоциативные поля поддерживают правила привязки +- Режим открытия записи: Страница (наряду с диалоговым окном, ящиком) +- [x] Связывает действие, поддерживает переменные и выражения +- [x] Область данных и значения полей по умолчанию поддерживают параметры запроса +- [x] Задает высоту блока +- [x] Markdown поддерживает переменные +- [x] Адрес Iframe поддерживает переменные. +- Поддержка связанного обновления между блоками +- Добавлены блоки диаграмм во всплывающие окна +- [x] Изменен модуль импорта и экспорта для одновременной обработки большего количества данных +- Одна запись / всплывающее окно поддерживает независимый URL-адрес +- [x] Улучшен блок древовидной таблицы +- Рефакторинг рабочего процесса + - [x] Создан узел записи + - [x] Узел обновления записей + - Автоматическая обработка ссылок на переменные (предварительная загрузка не рекомендуется) +- Механизм обработки даты и времени +- Распределенная архитектура +- Руководство по подключению + +## Плагины: + +- [x] DingTalk +- WeChat +- [x] Сканировать QR-код +- [x] Блок Workbench +- [x] Блок дерева +- Журналы аудита +- Действие: Импорт записей pro +- Действие: Экспорт записей pro +- Менеджер нескольких приложений +- Общий доступ к страницам +- Источник данных: API +- Рабочий процесс: Узел скрипта +- Рабочий процесс: Триггер Webhook +- Маска ввода +- Внедрение внешних систем +- Новый мобильный клиент +- Уведомление diff --git a/docs/ru-RU/welcome/release/tree-collection.md b/docs/ru-RU/welcome/release/tree-collection.md new file mode 100644 index 0000000000..7770d3c1de --- /dev/null +++ b/docs/ru-RU/welcome/release/tree-collection.md @@ -0,0 +1,44 @@ +# Древовидная коллекция + +## Варианты коллекции + +```ts +{ + name: 'categories', + tree: 'adjacency-list', + fields: [ + { + type: 'belongsTo', + name: 'parent', + treeParent: true, + }, + { + type: 'hasMany', + name: 'children', + treeChildren: true, + }, + ], +} +``` + +## Пользовательский интерфейс + +### Создать древовидную коллекцию + +<img src="./tree-collection/tree-collection.jpg"> + +### Поля по умолчанию + +<img src="./tree-collection/init.jpg"> + +### Табличный блок + +<img src="./tree-collection/tree-table.jpg"> + +### Добавить дочерний элемент + +<img src="./tree-collection/add-child.jpg"> + +### Раскрыть/свернуть + +<img src="./tree-collection/expend-collapse.jpg"> diff --git a/docs/ru-RU/welcome/release/tree-collection/add-child.jpg b/docs/ru-RU/welcome/release/tree-collection/add-child.jpg new file mode 100644 index 0000000000..0c1285d5d7 Binary files /dev/null and b/docs/ru-RU/welcome/release/tree-collection/add-child.jpg differ diff --git a/docs/ru-RU/welcome/release/tree-collection/expend-collapse.jpg b/docs/ru-RU/welcome/release/tree-collection/expend-collapse.jpg new file mode 100644 index 0000000000..de703b86b9 Binary files /dev/null and b/docs/ru-RU/welcome/release/tree-collection/expend-collapse.jpg differ diff --git a/docs/ru-RU/welcome/release/tree-collection/init.jpg b/docs/ru-RU/welcome/release/tree-collection/init.jpg new file mode 100644 index 0000000000..86b4d5b424 Binary files /dev/null and b/docs/ru-RU/welcome/release/tree-collection/init.jpg differ diff --git a/docs/ru-RU/welcome/release/tree-collection/tree-collection.jpg b/docs/ru-RU/welcome/release/tree-collection/tree-collection.jpg new file mode 100644 index 0000000000..1733aca531 Binary files /dev/null and b/docs/ru-RU/welcome/release/tree-collection/tree-collection.jpg differ diff --git a/docs/ru-RU/welcome/release/tree-collection/tree-table.jpg b/docs/ru-RU/welcome/release/tree-collection/tree-table.jpg new file mode 100644 index 0000000000..4eeb1e6f26 Binary files /dev/null and b/docs/ru-RU/welcome/release/tree-collection/tree-table.jpg differ diff --git a/docs/ru-RU/welcome/release/upgrade-to/v017.md b/docs/ru-RU/welcome/release/upgrade-to/v017.md new file mode 100644 index 0000000000..95c5f5697e --- /dev/null +++ b/docs/ru-RU/welcome/release/upgrade-to/v017.md @@ -0,0 +1,468 @@ +# Изменения несовместимости в NocoBase 0.17 + +#### В этой статье рассматриваются только изменения несовместимости, связанные с разработкой плагинов + +## Изменения в SchemaInitializer + +- Добавлен `SchemaInitializerManager` для регистрации `SchemaInitializer` +- Добавлен `useSchemaInitializerRender()`, чтобы заменить исходный `useSchemaInitializer()` на `render()`. +- Добавлен компонент `useSchemaInitializerItem()` для получения контекста текущего элемента инициализации +- Добавлен компонент `SchemaInitializerItemGroup` в качестве компонента по умолчанию для `type: `ItemGroup`. +- Добавлен компонент `SchemaInitializerSubMenu` в качестве компонента по умолчанию для подменю `type:` +- Добавлен компонент `SchemaInitializerDivider` в качестве компонента по умолчанию для разделителя `type:` +- Добавлен компонент `SchemaInitializerChildren` для пользовательского отображения нескольких элементов списка +- Добавлен компонент `Schemainitializerchildren` для пользовательского отображения одного элемента списка +- Изменены обязанности `SchemaInitializerContext` по сохранению контекста текущего инициализатора +- Изменены обязанности `useSchemaInitializer()` по получению контекста текущего инициализатора. +- Изменен `function SchemaInitializer` на `class SchemaInitializer` для определения инициализатора +- Изменены параметры `SchemaInitializer` +- Добавлен обязательный параметр `имя` для значения `x-инициализатор` + - Добавлен параметр `Компонент` для пользовательского отображения кнопки. По умолчанию используется `SchemaInitializerButton`. + - Добавлены `componentProps`, `style` для настройки свойств и стиля `Component` + - Добавлен параметр `ItemsComponent` для пользовательского отображения списка. По умолчанию используется `SchemaInitializerItems`. + - Добавлены `itemsComponentProps`, `itemsComponentStyle` для настройки свойств и стиля `ItemsComponent` + - Добавлен параметр `popover` для настройки отображения эффекта `popover`. + - Добавлен параметр `useInsert` для случаев, когда функция `insert` должна использовать перехватчики + - Изменен параметр `dropdown` на "popoverProps", используя `Popover` вместо `Dropdown` +- Изменены параметры `items` для `SchemaInitializer` + - Добавлена функция `useChildren` для динамического управления дочерними элементами + - Добавлена функция `componentProps` для свойств самого компонента +- Добавлена функция `useComponentProps` для динамической обработки реквизитов компонента + - Изменен параметр `key` на `name` для уникальной идентификации элементов списка + - Изменен параметр `visible` на функцию `useVisible` для динамического управления отображением. + - Изменен параметр `component` на `Component` для отображения элементов списка +- Изменен параметр `SchemaInitializer.Кнопка на `SchemaInitializerButton`, значение по умолчанию для параметра `Component` в `SchemaInitializer` +- Изменен `SchemaInitializer".Item` в `SchemaInitializerItem` с неизмененными параметрами +- Изменен `SchemaInitializer.ActionModal` на `SchemaInitializerActionModal` с неизменными параметрами +- Изменен `SchemaInitializer.SwitchItem` на `SchemaInitializer.Switch` с неизменными параметрами +- Удален `SchemaInitializerProvider`, заменен на "SchemaInitializerManager` +- Удален `SchemaInitializer.itemWrap`, больше не нужно обертывать компонент `item` + +Для получения дополнительной информации обратитесь к следующей документации: + +- [Разработка плагина / инициализатор схемы](/development/client/ui-schema/initializer) +- [Документация по API / SchemaInitializer](https://client.docs.nocobase.com/core/ui-schema/schema-component) + +### Добавление элементов в существующий инициализатор + +Раньше мы получали все `инициализаторы` через `SchemaInitializerContext`, а затем добавляли, удаляли или изменяли их. Например, следующий код добавляет `Hello` к `media` в `BlockInitializers`: + +```tsx | pure +const items = useContext<any>(SchemaInitializerContext); +const mediaItems = items.BlockInitializers.items.find( + (item) => item.key === 'media', +); + +if (process.env.NODE_ENV !== 'production' && !mediaItems) { + throw new Error('media block initializer not found'); +} + +const children = mediaItems.children; +if (!children.find((item) => item.key === 'hello')) { + children.push({ + key: 'hello', + type: 'item', + title: '{{t("Hello block")}}', + component: HelloBlockInitializer, + }); +} +``` + +Новый способ добавления элементов заключается в использовании метода `schemaInitializerManager.addItem()` в методе загрузки плагина. + +```tsx | pure +class MyPlugin extends Plugin { + async load() { + this.schemaInitializerManager.addItem( + 'BlockInitializers', + 'otherBlocks.hello', + { + title: '{{t("Hello block")}}', + Component: HelloBlockInitializer, + }, + ); + } +} +``` + +Подробная ссылка на документацию + +- [Разработка плагина / Инициализатор схемы / Добавление элементов к существующему инициализатору](/development/client/ui-schema/initializer) +- [Документация по API / SchemaInitializer / Встроенные компоненты и типы](https://client.docs.nocobase.com/core/ui-schema/schema-initializer) + +### Добавьте новый инициализатор в приложение + +Добавленный ранее с помощью `SchemaInitializerProvider`, например: + +```tsx | pure +<SchemaInitializerProvider + initializers={{ BlockInitializers }} + components={{ ManualActionDesigner }} +></SchemaInitializerProvider> +``` + +Теперь добавьте его в загрузку плагина, например: + +```tsx | pure +import { Plugin } from '@nocobase/client'; + +class MyPlugin extends Plugin { + async load() { + this.app.schemaInitializerManager.add(blockInitializers); + this.app.addComponents({ ManualActionDesigner }); + } +} +``` + +Для получения подробной документации обратитесь к: + +- [Разработка плагина / Инициализатор схемы / Добавление нового инициализатора](/development/client/ui-schema/initializer) +- [API Documentation / SchemaInitializerManager / schemaInitializerManager.addItem()](https://client.docs.nocobase.com/core/ui-schema/schema-initializer-manager) + +### Добавить новый инициализатор + +Если раньше `SchemaInitializer` поддерживал запись объектов и компонентов в формате JSON, то теперь используется только `new SchemaInitializer()`. + +Пример 1: Старый способ записи JSON изменен на `new SchemaInitializer()`. + +```diff +- export const BlockInitializers = { ++ export const blockInitializers = new SchemaInitializer({ ++ name: 'BlockInitializers', + 'data-testid': 'add-block-button-in-page', + title: '{{t("Add block")}}', + icon: 'PlusOutlined', + wrap: gridRowColWrap, + items: [ + { +- key: 'dataBlocks', ++ name: 'data-blocks', + type: 'itemGroup', + title: '{{t("Data blocks")}}', + children: [ + { +- key: 'table', ++ name: 'table', +- type: 'item', + title: '{{t("Table")}}', +- component: TableBlockInitializer, ++ Component: TableBlockInitializer, + }, + { + key: 'form', + type: 'item', + title: '{{t("Form")}}', + component: FormBlockInitializer, + } + ], + }, + ], +}); +``` + +Пример 2. Измените способ записи компонента на `new SchemaInitializer()`. + +Оказывается, это способ определения компонентов: + +```tsx | pure +export const BulkEditFormItemInitializers = (props: any) => { + const { t } = useTranslation(); + const { insertPosition, component } = props; + const associationFields = useAssociatedFormItemInitializerFields({ + readPretty: true, + block: 'Form', + }); + return ( + <SchemaInitializer.Button + data-testid="configure-fields-button-of-bulk-edit-form-item" + wrap={gridRowColWrap} + icon={'SettingOutlined'} + items={[ + { + type: 'itemGroup', + title: t('Display fields'), + children: useCustomBulkEditFormItemInitializerFields(), + }, + { + type: 'divider', + }, + { + type: 'item', + title: t('Add text'), + component: BlockItemInitializer, + }, + ]} + insertPosition={insertPosition} + component={component} + title={component ? null : t('Configure fields')} + /> + ); +}; +``` + +Теперь его нужно изменить на подход `new SchemaInitializer()`: + +```tsx | pure +const bulkEditFormItemInitializers = new SchemaInitializer({ + name: 'BulkEditFormItemInitializers', + 'data-testid': 'configure-fields-button-of-bulk-edit-form-item', + wrap: gridRowColWrap, + icon: 'SettingOutlined', + // 原 insertPosition 和 component 是透传的,这里不用管,也是透传的 + items: [ + { + type: 'itemGroup', + title: t('Display fields'), + name: 'displayFields', // 记得加上 name + useChildren: useCustomBulkEditFormItemInitializerFields, // 使用到了 useChildren + }, + { + type: 'divider', + }, + { + title: t('Add text'), + name: 'addText', + Component: BlockItemInitializer, // component 替换为 Component + }, + ], +}); +``` + +Для получения подробной документации обратитесь к: + +- [Разработка плагина / Инициализатор схемы / Добавление нового инициализатора](/development/client/ui-schema/initializer) +- [API Documentation / SchemaInitializer / new SchemaInitializer(options)](https://client.docs.nocobase.com/core/ui-schema/schema-initializer) + +### Определение и реализация элемента + +Ранее при настройке элемента реквизиты компонентов размещались в элементе, но теперь рекомендуется использовать `componentProps` и `useComponentProps`. + +```diff +{ + name: 'BlockInitializers', + items: [ + { + name: 'xxx', + Component: XXXSchemaInitializerItem, + title: 'Title 1', + schema: {}, +- foo: 'bar', ++ useComponentProps: () => { ++ return { foo: 'bar' } ++ } + } + ] +} +``` + +В компоненте `Item` конфигурация элемента раньше передавалась напрямую с помощью props, но теперь она получается с помощью `useSchemaInitializerItem()`, и включены соответствующие перехватчики: + +- `useSchemaInitializer()` чтобы получить текущий контекст инициализатора. +- `useSchemaInitializerItem()` возвращает контекст текущего элемента. + +```diff +const XXXSchemaInitializerItem = (props) => { +- const { insert, title, schema, foo } = props; ++ const { foo } = props; ++ const { insert } = useSchemaInitializer(); ++ const { title, schema } = useSchemaInitializerItem(); + // ... +} +``` + +Подробная ссылка на документацию + +- [API Documentation / SchemaInitializer / Built-in Components and Types](https://client.docs.nocobase.com/core/ui-schema/schema-initializer) + +## Изменения в SchemaSettings + +### Новые добавления +- Добавлен `SchemaSettingsManager` для регистрации настроек `SchemaSettings` +- Добавлен хук `useSchemaSettingsItem()` +- Добавлен хук `useSchemaSettingsRender()` +- Добавлен параметр `x-settings` для конфигурации настроек схемы +- Добавлен параметр `x-toolbar` для настройки панели инструментов схемы +- Добавлен компонент `SchemaToolbar` для кастомизации панели инструментов +- Добавлен хук `useSchemaToolbarRender()` для замены оригинального `useDesigner()` + +### Изменения структуры +- Изменена реализация `function SchemaSettings` → `class SchemaSettings` +- Оригинальный `SchemaSettings` переименован в `SchemaSettingsDropdown` + +### Переименованные компоненты +- `SchemaSettings.Item` → `SchemaSettingsItem` +- `SchemaSettings.ItemGroup` → `SchemaSettingsItemGroup` +- `SchemaSettings.SubMenu` → `SchemaSettingsSubMenu` +- `SchemaSettings.Divider` → `SchemaSettingsDivider` +- `SchemaSettings.Remove` → `SchemaSettingsRemove` +- `SchemaSettings.SelectItem` → `SchemaSettingsSelectItem` +- `SchemaSettings.CascaderItem` → `SchemaSettingsCascaderItem` +- `SchemaSettings.SwitchItem` → `SchemaSettingsSwitchItem` +- `SchemaSettings.ModalItem` → `SchemaSettingsModalItem` +- `SchemaSettings.ActionModalItem` → `SchemaSettingsActionModalItem` + +### Удаленные элементы +- Удален параметр `x-designer` (устарел, используйте `x-toolbar`) +- Удален хук `useDesigner()` (устарел, используйте `useSchemaToolbarRender()`) + +Сопутствующая документация: + +- [Разработка плагинов / Настройки схем](/development/client/ui-schema/initializer) +- [Плагины / Панель инструментов SchemaToolbar](/development/client/ui-schema/initializer) +- [Документация по API / Настройки схем](https://client.docs.nocobase.com/core/ui-schema/schema-component) +- [API Documentation / SchemaSettingsManager](https://client.docs.nocobase.com/core/ui-schema/schema-component) +- [API Documentation / SchemaToolbar](https://client.docs.nocobase.com/core/ui-schema/schema-component) + +### Определение и реализация настроек + +Ранее `SchemaSettings` была реализована с помощью `GeneralSchemaDesigner` и использовалась в `x-designer`. + +```tsx | pure +<GeneralSchemaDesigner> + <SchemaSettings.SwitchItem + title={'Enable Header'} + onClick={() => {}} + ></SchemaSettings.SwitchItem> + <SchemaSettings.Divider /> + <SchemaSettings.ModalItem + title={'xxx'} + schema={} + onSubmit={props.onSubmit} + ></SchemaSettings.ModalItem> +</GeneralSchemaDesigner> +``` + +Теперь разделите их на `x-панель инструментов` и `x-настройки`, при этом `x-панель инструментов` отсутствует, а настройки схем используются в `x-настройках`. + +```ts +const mySettings = new SchemaSettings({ + name: 'MySettings', + items: [ + { + name: 'enableHeader', + type: 'switch', + componentProps: { + title: 'Enable Header', + onClick: () => {}, + }, + }, + { + name: 'divider', + type: 'divider', + }, + { + name: 'xxx', + type: 'modal', + useComponentProps() { + // useSchemaDesigner() 会传入 props + const { onSubmit } = useSchemaDesigner(); + return { + title: 'xxx', + schema: {}, + onSubmit, + }; + }, + }, + ], +}); +``` + +Изменения в схеме + +```diff +{ + type: 'void', +- 'x-designer': 'CustomButton.Designer' ++ 'x-toolbar': 'CustomButtonToolbar', // 非必须 ++ 'x-settings': 'CustomButtonSettings', + 'x-component': 'CustomButton', + 'x-content': 'Hello2', +} +``` + +### Реализация элемента для настроек + +Предыдущую версию компонента `Item` было очень сложно реализовать, но теперь мы используем `useSchemaSettings()`, чтобы получить значение `Designable` для текущей схемы, и используем значение `Designable` для изменения текущей схемы. + +```diff +function EditBlockTitle(props) { +- const field = useField(); +- const fieldSchema = useFieldSchema(); +- const { dn } = useDesignable(); ++ const { dn } = useSchemaSettings(); + + return ( + <SchemaSettings.ModalItem + title={'Edit block title'} + schema={ + { + type: 'object', + title: 'Edit block title', + properties: { + title: { + title: 'Block title', + type: 'string', + // 获取 schema 的默认值 +- default: fieldSchema?.['x-decorator-props']?.title, ++ default: dn.getSchemaAttribute('x-decorator-props.title'), + 'x-decorator': 'FormItem', + 'x-component': 'Input', + 'x-compile-omitted': ['default'], + }, + }, + } as ISchema + } + onSubmit={({ title }) => { +- field.decoratorProps.title = title; +- fieldSchema['x-decorator-props'] = fieldSchema['x-decorator-props'] || {}; +- fieldSchema['x-decorator-props'].title = title; +- dn.emit('patch', { +- schema: { +- ['x-uid']: fieldSchema['x-uid'], +- 'x-decorator-props': { +- ...fieldSchema['x-decorator-props'], +- }, +- }, +- }); +- dn.refresh(); ++ dn.deepMerge({ ++ 'x-decorator-props': { ++ title, ++ }, ++ }); + }} + /> + ); +} +``` + +Ссылка на соответствующую документацию: + +- [Разработка плагинов / Настройка параметров схемы / Как реализовать настройки схемы](/development/client/ui-schema/settings) +- [Разработка плагинов / Настраиваемый дизайнер](/development/client/ui-schema/designable) +- [Ссылки на API / Настройки схем / Встроенные компоненты и типы](https://client.docs.nocobase.com/core/ui-schema/schema-settings) +- [Ссылка на API / Возможность разработки](https://client.docs.nocobase.com/core/ui-schema/designable) + +## Другое + +### app.addComponent способ приватизации + +The `app.addComponent` method is privatized and no longer exposed to the public, you need to register the component via the `app.addComponents` method. + +```diff +- app.addComponent(MyComponent, 'MyComponent') ++ app.addComponents({ MyComponent }) +``` + +### Удалите `PluginManagerContext`. + +```diff +const MyProvider = props => { +- const ctx = useContext(PluginManagerContext); +return <div> +- <PluginManagerContext.Provider value={{components: { ...ctx?.components }}}> + {/* ... */} +- </PluginManagerContext.Provider> +</div> +} +``` diff --git a/docs/ru-RU/welcome/release/v0040-changelog.md b/docs/ru-RU/welcome/release/v0040-changelog.md new file mode 100644 index 0000000000..a8d8c9af0f --- /dev/null +++ b/docs/ru-RU/welcome/release/v0040-changelog.md @@ -0,0 +1,73 @@ +# Bерсия 0.4: 2021-04-07 + +## Объединено + +- переработка: использование логического значения вместо null #74 +- переработка: промежуточное программное обеспечение приложения 17362a8 +- основная работа (версии): публикация пакетов 0.4.0-alpha.2 c2f1876 +- исправление: незначительные проблемы [`#72`](https://github.com/nocobase/nocobase/pull/72) +- Разработка [`#68`](https://github.com/nocobase/nocobase/pull/68) +- Функция: плагин-Китай-регион [`#66`](https://github.com/nocobase/nocobase/pull/66) +- Функция: фильтр для поля ссылки [`#64`](https://github.com/nocobase/nocobase/pull/64) +- исправление: сделать так, чтобы просмотр / вкладка по умолчанию не могли быть удалены [`# 63`](https://github.com/nocobase/nocobase/pull/63) +- Автоматизация функций/подключаемых модулей [`#65`](https://github.com/nocobase/nocobase/pull/65) +- Журналы функций/действий [`#62`](https://github.com/nocobase/nocobase/pull/62) +- Журналы функций/действий [`#61`](https://github.com/nocobase/nocobase/pull/61) +- Функция блокировки / уничтожения [`#60`](https://github.com/nocobase/nocobase/pull/60) +- исправление: игнорирование некоторых ошибок typescript [`#59`](https://github.com/nocobase/nocobase/pull/59) +- исправление: разрешения на маршрут [`#58`](https://github.com/nocobase/nocobase/pull/58) +- Функция: добавить api плагина разрешений [`#57`](https://github.com/nocobase/nocobase/pull/57) +- исправлено: обновлено с помощью внешнего ключа [`#56`](https://github.com/nocobase/nocobase/pull/56) +- исправлено: добавлен плагин разрешений [`# 53`](https://github.com/nocobase/nocobase/pull/53) +- исправлено: обновлено поле в сборке обновлений [`#54`](https://github.com/nocobase/nocobase/pull/54) +- тест: пропустить тестовые примеры ошибок для прохождения ci [`#52`](https://github.com/nocobase/nocobase/pull/52) +- исправлено: устранена ошибка при обновлении другого поля [`#51`](https://github.com/nocobase/nocobase/pull/51) +- функция: операторы только для даты [`#50`](https://github.com/nocobase/nocobase/pull/50) +- Функциональное поле для установки по умолчанию [`#49`](https://github.com/nocobase/nocobase/pull/49) +- Функция: пользовательские операторы для запроса [`#48`](https://github.com/nocobase/nocobase/pull/48) +- исправление: включение ошибки с вложенными ассоциациями [`#47`](https://github.com/nocobase/nocobase/pull/47) +- возможность: сделать доступной загрузку одного файла во вложение [`#46`](https://github.com/nocobase/nocobase/pull/46) +- возможность: добавить базовую архитектуру файлового менеджера [`#44`](https://github.com/nocobase/nocobase/pull/44) +- возможность: добавить конфигурацию полей CreatedBy/UpdatedBy для таблицы, управляемой коллекциями [`#43`](https://github.com/nocobase/nocobase/pull/43) +- исправлено: для объединения фильтров следует использовать логику wrapped и logic [`#42`](https://github.com/nocobase/nocobase/pull/42) +- исправлено: filterByFields должны возвращать одинаковое значение при вводе == null (закрыть 0) [`#41`](https://github.com/nocobase/nocobase/pull/41) +- исправлено: не удалось выполнить итерацию свойства Symbol в for-in [`#39`](https://github.com/nocobase/nocobase/pull/39) +- Функция/сортировка [`#38`](https://github.com/nocobase/nocobase/pull/38) +- рефакторинг: измените стратегию сортировки со смещения на TargetID [`#37`](https://github.com/nocobase/nocobase/pull/37) +- Функция/сортировка [`#36`](https://github.com/nocobase/nocobase/pull/36) +- улучшено: добавлены фильтр и транзакция для действия уничтожения [`#35`](https://github.com/nocobase/nocobase/pull/35) +- исправлена логика фильтрации полей для создания / обновления [`# 34`](https://github.com/nocobase/nocobase/pull/34) +- Функция: параметры полей действия для создания / обновления [`#32`](https://github.com/nocobase/nocobase/pull/32) +- Исправлено: изменена стратегия с "добавить" на "установить" для "Обновить ассоциации" [`#33`](https://github.com/nocobase/nocobase/pull/33) +- Тест / ci [`#31`](https://github.com/nocobase/nocobase/pull/31) +- исправление: улучшены функции сбора / поля / действия / представления... [`#30`](https://github.com/nocobase/nocobase/pull/30) +- Исправлены связи с обновлением модели [`#29`](https://github.com/nocobase/nocobase/pull/29) +- исправлены тестовые примеры базы данных и параметры таблиц [`#28`](https://github.com/nocobase/nocobase/pull/28) +- функция: добавлена поддержка получения и настройки виртуальных атрибутов [`#27`](https://github.com/nocobase/nocobase/pull/27) +- функция: параметры сбора и перехваты [`#21`](https://github.com/nocobase/nocobase/pull/21) +- функция (пользователи): добавление пользовательского модуля [`#26`](https://github.com/nocobase/nocobase/pull/26) +- функция: добавление действия сортировки [`#22`](https://github.com/nocobase/nocobase/pull/22) +- Тест/список [`#19`](https://github.com/nocobase/nocobase/pull/19) +- функция: параметры разбивки на страницы [`#20`](https://github.com/nocobase/nocobase/pull/20) +- тест: проведите рефакторинг в базе данных и добавьте больше [`#17`](https://github.com/nocobase/nocobase/pull/17) +- функция: действия и просмотры [`#18`](https://github.com/nocobase/nocobase/pull/18) +- Тестовые примеры для базы данных [`#16`](https://github.com/nocobase/nocobase/pull/16) +- Рефакторинг: изменение глобального внедрения пакета test for actions. [`#15`](https://github.com/nocobase/nocobase/pull/15) +- улучшение плагинов [`#14`](https://github.com/nocobase/nocobase/pull/14) +- Doc: добавить README.md для сервера. [`#12`](https://github.com/nocobase/nocobase/pull/12) +- исправление: parseRequest и registerHandlers [`#10`](https://github.com/nocobase/nocobase/pull/10) +- исправление #9 [`#11`](https://github.com/nocobase/nocobase/pull/11) +- функция: поддержка регистрации и вызова частичных действий [`#7`](https://github.com/nocobase/nocobase/pull/7) +- 发布核心框架 ['#6`](https://github.com/nocobase/nocobase/pull/6) + +## Исправлено + +- исправлено #9 (#11) [`#9`](https://github.com/nocobase/nocobase/issues/9) [`#9`](https://github.com/nocobase/nocobase/issues/9) +- исправлено: улучшен стиль формы входа в систему 5319000 +- исправлено: сообщение об ошибке при входе в систему и регистрации 214b227 + +## Фиксации + +- рутинная работа: настройка параметров [`b95e2da`](https://github.com/nocobase/nocobase/commit/b95e2da129aa49b5d8fb3e31ba8975818f7053cb) +- первая фиксация [`e5d30b3`](https://github.com/nocobase/nocobase/commit/e5d30b30ba4dd38de764b0e5044f836f04a03706) +- стиль: форматирование кода [`ce4a22f`](https://github.com/nocobase/nocobase/commit/ce4a22fbb9b1ba9b88db1dc86609e94944f9d904) diff --git a/docs/ru-RU/welcome/release/v0050-changelog.md b/docs/ru-RU/welcome/release/v0050-changelog.md new file mode 100644 index 0000000000..4658b87bcc --- /dev/null +++ b/docs/ru-RU/welcome/release/v0050-changelog.md @@ -0,0 +1,19 @@ +# Bерсия 0.5: 2021-11-21 + +## Объединено + +- исправлено: обновление формального отображения и бокового меню с помощью createPortal и использование эффекта глубокого сравнения [`#103`](https://github.com/nocobase/nocobase/pull/103) +- исправлено: SchemaRenderer получает значение схемы [`#102`](https://github.com/nocobase/nocobase/pull/102) +- исправлено: формальное обновление и form.setValues использует стратегию перезаписи [`#101`](https://github.com/nocobase/nocobase/pull/101) +- функция: поддержка i18n [`#99`](https://github.com/nocobase/nocobase/pull/99) +- функция: новая версия документации [`#95`](https://github.com/nocobase/nocobase/pull/95) +- опция-стиль тега [`#92`](https://github.com/nocobase/nocobase/pull/92) +- создать-nocobase-app: значок [`#91`](https://github.com/nocobase/nocobase/pull/91) +- возможность: создать приложение nocobase с помощью простого и быстрого запуска [`#87`](https://github.com/nocobase/nocobase/pull/87) +- возможность: экспортировать плагин [`#73`](https://github.com/nocobase/nocobase/pull/73) + +## Коммиты + +- версия 0.5 [`2cbcd08`](https://github.com/nocobase/nocobase/commit/2cbcd087ce6629d8f0df550ee35e02065db41dbc) +- переработка [`75cd158`](https://github.com/nocobase/nocobase/commit/75cd158a270935559a9922d1dd074811253013b9) +- подвиг: улучшить код [`c6b68f2`](https://github.com/nocobase/nocobase/commit/c6b68f2b10e4e8df5257345f5e39408666c5810d) diff --git a/docs/ru-RU/welcome/release/v0060-changelog.md b/docs/ru-RU/welcome/release/v0060-changelog.md new file mode 100644 index 0000000000..8cbed07838 --- /dev/null +++ b/docs/ru-RU/welcome/release/v0060-changelog.md @@ -0,0 +1,129 @@ +# Версия 0.6: 2022-04-05 + +## Объединено + +- Исправление: плагин-рабочий процесс [`#288`](https://github.com/nocobase/nocobase/pull/288) +- исправление: стиль slate [`#289`](https://github.com/nocobase/nocobase/pull/289) +- исправлено: toJSON с ассоциацией belongsTo [`#287`](https://github.com/nocobase/nocobase/pull/287) +- улучшен модуль acl [`#283`](https://github.com/nocobase/nocobase/pull/283) +- исправлено: уничтожались собственные записи [`#285`](https://github.com/nocobase/nocobase/pull/285) +- функция (плагин-workflow): поддержка контекстных переменных из триггера модели [`#284`](https://github.com/nocobase/nocobase/pull/284) +- исправлено: запись acl [`#280`](https://github.com/nocobase/nocobase/pull/280) +- исправлено: вызов перехвата корневого сервера после insertNewSchema [`#282`](https://github.com/nocobase/nocobase/pull/282) +- Функция /рабочий процесс плагина [`#278`](https://github.com/nocobase/nocobase/pull/278) +- функция: поставщик acl [`#279`](https://github.com/nocobase/nocobase/pull/279) +- функция: добавление компонента Slate [`#272`](https://github.com/nocobase/nocobase/pull/272) +- Функция/плагин для пользователей с jwt [`#258`](https://github.com/nocobase/nocobase/pull/258) +- исправлено: изменен стиль antd по умолчанию [`#277`](https://github.com/nocobase/nocobase/pull/277) +- исправление (клиент): ошибка "не определено" после очистки значения каскадера фильтров [`#267`](https://github.com/nocobase/nocobase/pull/267) +- Функция (рабочий процесс плагина): рефакторинг вычисления и добавление фильтра для запроса [`#264`](https://github.com/nocobase/nocobase/pull/264) +- исправлено: провайдер блокировки [`#261`](https://github.com/nocobase/nocobase/pull/261) +- исправлено: toJSON с нулевой ассоциацией [`#260`](https://github.com/nocobase/nocobase/pull/260) +- исправлено: ошибка обработки ошибок [`#259`](https://github.com/nocobase/nocobase/pull/259) +- исправлено: текстовое поле read pretty может поддерживать разделительную строку [`# 255`](https://github.com/nocobase/nocobase/pull/255) +- исправлено: markdown поддерживает многоточие [`# 257`](https://github.com/nocobase/nocobase/pull/257) +- Возможность подключения нескольких приложений [`# 248`](https://github.com/nocobase/nocobase/pull/248) +- добавлен шаблон журнала действий [`#239`](https://github.com/nocobase/nocobase/pull/239) +- исправлены некоторые ошибки [`#252`](https://github.com/nocobase/nocobase/pull/252) +- исправлен (плагин-рабочий процесс): исправлено добавление/ удаление узла в параллельных ветвях [`#253`](https://github.com/nocobase/nocobase/pull/253) +- Исправлено: ввод клиентской базы в рабочий процесс плагина [`# 225`](https://github.com/nocobase/nocobase/pull/225) +- исправлено: обновление при изменении области действия [`# 251`](https://github.com/nocobase/nocobase/pull/251) +- исправление: получение json-схемы с асинхронным узлом [`#246`](https://github.com/nocobase/nocobase/pull/246) +- исправление: вставка новой схемы [`#245`](https://github.com/nocobase/nocobase/pull/245) +- исправление: ошибка транзакции [`#242`](https://github.com/nocobase/nocobase/pull/242) +- умение: блокировать шаблоны [`#240`](https://github.com/nocobase/nocobase/pull/240) +- функция: очиститель uiSchema [`#241`](https://github.com/nocobase/nocobase/pull/241) +- функция: инициализация значений полей сортировки [`#236`](https://github.com/nocobase/nocobase/pull/236) +- исправлено: переместить действие без изменения обновленного статуса [`#235`](https://github.com/nocobase/nocobase/pull/235) +- функция: действие проверки роли [`#234`](https://github.com/nocobase/nocobase/pull/234) +- функция: новый оператор [`#233`](https://github.com/nocobase/nocobase/pull/233) +- исправлено: текущая роль пользователя [`#232`](https://github.com/nocobase/nocobase/pull/232) +- расширяемое разрешение [`#229`](https://github.com/nocobase/nocobase/pull/229) +- тест: обновить обратное поле [`#231`](https://github.com/nocobase/nocobase/pull/231) +- подвиг: канбан [`#230`](https://github.com/nocobase/nocobase/pull/230) +- Не использовать следующий канбан [`#223`](https://github.com/nocobase/nocobase/pull/223) +- добавить: тест [`#224`](https://github.com/nocobase/nocobase/pull/224) +- Обработчик ошибок плагина [`#222`](https://github.com/nocobase/nocobase/pull/222) +- исправить: массив $noneOf с нулем [`#220`](https://github.com/nocobase/nocobase/pull/220) +- исправлено: синтаксический анализатор фильтровал с номером в ключе [`#219`](https://github.com/nocobase/nocobase/pull/219) +- функция: индекс потомка пользовательского интерфейса-схемы-дерева-пути [`#218`](https://github.com/nocobase/nocobase/pull/218) +- исправлено: ошибка запроса оператора массива [`#217`](https://github.com/nocobase/nocobase/pull/217) +- исправлено: значение запроса оператора [`#216`](https://github.com/nocobase/nocobase/pull/216) +- исправлено: строковые операторы [`#215`](https://github.com/nocobase/nocobase/pull/215) +- исправлено: промежуточное программное обеспечение для обработки ошибок [`#214`](https://github.com/nocobase/nocobase/pull/214) +- переработано: компонент схемы фильтра [`#213`](https://github.com/nocobase/nocobase/pull/213) +- исправлено: пустой оператор с $или filter [`#212`](https://github.com/nocobase/nocobase/pull/212) +- функция: установка плагина [`#211`](https://github.com/nocobase/nocobase/pull/211) +- функция: сортировка по значению в таблице [`#209`](https://github.com/nocobase/nocobase/pull/209) +- Функция: рабочий процесс плагина [`#210`](https://github.com/nocobase/nocobase/pull/210) +- исправлена ошибка сортировки полей коллекции [`#208`](https://github.com/nocobase/nocobase/pull/208) +- исправлена ошибка сортировки в полях коллекции [`# 207`](https://github.com/nocobase/nocobase/pull/207) +- исправлен rest api коллекции [`#205`](https://github.com/nocobase/nocobase/pull/205) +- подвиг: список не выгружается [`#204`](https://github.com/nocobase/nocobase/pull/204) +- доработка: завершение разработки компонента календаря [`#199`](https://github.com/nocobase/nocobase/pull/199) +- исправление (зависимости): перенос json-шаблона в исходные вложенные пакеты [`#203`](https://github.com/nocobase/nocobase/pull/203) +- Исправлена ошибка (рабочий процесс плагина): добавлены дополнительные инструкции [`#201`](https://github.com/nocobase/nocobase/pull/201) +- исправлена ошибка: получить JSONSCHEMA со свойствами [`#202`](https://github.com/nocobase/nocobase/pull/202) +- исправлено: оператор массива postgres [`#200`](https://github.com/nocobase/nocobase/pull/200) +- исправлено: сортировка в postgres с добавлением ошибки [`#198`](https://github.com/nocobase/nocobase/pull/198) +- исправлено: uiSchema удалила api [`#196`](https://github.com/nocobase/nocobase/pull/196) +- изменен размер страницы на pageSize [`#197`](https://github.com/nocobase/nocobase/pull/197) +- исправлено: проверка синтаксического анализа параметров [`#195`](https://github.com/nocobase/nocobase/pull/195) +- исправлено: добавлено гнездо [`#194`](https://github.com/nocobase/nocobase/pull/194) +- исправлено: тест с базой данных [`#193`](https://github.com/nocobase/nocobase/pull/193) +- исправлено (плагин-рабочий процесс): исправлены зависимости в пакете [`#192`](https://github.com/nocobase/nocobase/pull/192) +- Исправлено: тест плагина-рабочего процесса [`#191`](https://github.com/nocobase/nocobase/pull/191) +- Рефакторинг (plugin-workflow): обновление плагина для использования абстрактного класса плагина и исправление типов [`#190`](https://github.com/nocobase/nocobase/pull/190) +- исправление: хранение схемы пользовательского интерфейса [`#188`](https://github.com/nocobase/nocobase/pull/188) +- исправлено: хранилище схем пользовательского интерфейса [`#187`](https://github.com/nocobase/nocobase/pull/187) +- исправлено: обновление guard с помощью экземпляра модели [`#186`](https://github.com/nocobase/nocobase/pull/186) +- исправлено: получение свойств с помощью order [`# 183`](https://github.com/nocobase/nocobase/pull/183) +- функция (сервер): улучшение приложения [`#177`](https://github.com/nocobase/nocobase/pull/177) +- Функция: плагин-workflow MVP [`#171`](https://github.com/nocobase/nocobase/pull/171) +- исправление (root): исправление зависимостей в пакетах, чтобы избежать ошибок при сборке [`#178`](https://github.com/nocobase/nocobase/pull/178) +- Приложение [`#175`](https://github.com/nocobase/nocobase/pull/175) +- подвиг: добавить плагин acl [`#169`](https://github.com/nocobase/nocobase/pull/169) +- добавить компонент фильтра в компоненты схемы [`#176`](https://github.com/nocobase/nocobase/pull/176) +- функция: добавить компонент Markdown в компоненты схемы [`#173`](https://github.com/nocobase/nocobase/pull/173) +- функция: компоненты, связанные с таблицей [`#172`](https://github.com/nocobase/nocobase/pull/172) +- функция: добавить компонент select в компонент schema [`#168`](https://github.com/nocobase/nocobase/pull/168) +- функция: добавить компонент TreeSelect в компоненты schema [`#167`](https://github.com/nocobase/nocobase/pull/167) +- Acl плагина [`#166`](https://github.com/nocobase/nocobase/pull/166) +- добавить компонент загрузки в компоненты схемы [`#165`](https://github.com/nocobase/nocobase/pull/165) +- перенести компонент выбора времени в компоненты схемы [`#164`](https://github.com/nocobase/nocobase/pull/164) +- Схема пользовательского интерфейса Feat/plugin версии 0.6 [`#143`](https://github.com/nocobase/nocobase/pull/143) +- Функция/менеджер коллекций плагинов [`#147`](https://github.com/nocobase/nocobase/pull/147) +- Acl [`#162`](https://github.com/nocobase/nocobase/pull/162) +- функция: acl [`#153`](https://github.com/nocobase/nocobase/pull/153) +- функция: добавить компонент inputNumber в компонент schema [`#160`](https://github.com/nocobase/nocobase/pull/160) +- функция/nocobase next password [`#159`](https://github.com/nocobase/nocobase/pull/159) +- функция: добавить средство выбора даты в компоненты схемы [`#161`](https://github.com/nocobase/nocobase/pull/161) +- функция: добавить вводимые данные в компонент схемы [`#158`](https://github.com/nocobase/nocobase/pull/158) +- функция: добавить радио в компонент схемы [`#154`](https://github.com/nocobase/nocobase/pull/154) +- оптимизировать: переименовать файл компонента с флажком [`#155`](https://github.com/nocobase/nocobase/pull/155) +- Не привязывать следующий цвет к выбранному [`#157`](https://github.com/nocobase/nocobase/pull/157) +- функция: добавить компонент асинхронного поставщика данных [`#151`](https://github.com/nocobase/nocobase/pull/151) +- функция: клиент версии 0.6 [`#150`](https://github.com/nocobase/nocobase/pull/150) +- Функция/действия на GitHub [`#148`](https://github.com/nocobase/nocobase/pull/148) +- функция: фильтрация по целевому ключу [`#146`](https://github.com/nocobase/nocobase/pull/146) +- рефакторинг: действия [`#137`](https://github.com/nocobase/nocobase/pull/137) +- функция: поддержка типов контекстных полей [`#131`](https://github.com/nocobase/nocobase/pull/131) +- подвиг: следующая база данных [`#130`](https://github.com/nocobase/nocobase/pull/130) +- доработка: переименование ResourceKey и associatedKey в resourceIndex и associatedIndex [`#126`](https://github.com/nocobase/nocobase/pull/126) +- рефакторинг: переполнение ячеек таблицы текстом с многоточием [`#125`](https://github.com/nocobase/nocobase/pull/125) +- Добавить хранилище S3 и рефакторинг [`#124`](https://github.com/nocobase/nocobase/pull/124) +- Исправить: плагин-файловый менеджер [`#111`](https://github.com/nocobase/nocobase/pull/111) +- рефакторинг: разделение кода табличного компонента [`#121`](https://github.com/nocobase/nocobase/pull/121) +- рефакторинг: разбиение кода табличного компонента [`#120`](https://github.com/nocobase/nocobase/pull/120) +- функция: добавление кнопки сброса в панель фильтров [`#110`](https://github.com/nocobase/nocobase/pull/110) +- функция: разрешить пользователю сменить пароль [`#109`](https://github.com/nocobase/nocobase/pull/109) + +## Фиксации + +- исправление: yarn.блокировка [`7a7eb0c`](https://github.com/nocobase/nocobase/commit/7a7eb0cc82af0b1621476d2bb163b43ccc92da80) +- исправление: yarn.блокировка [`e226f04`](https://github.com/nocobase/nocobase/commit/e226f04e505ed7f4d94abf3074ad4f375d15c67d) +- функция: форматированный текст [`5b41b33`](https://github.com/nocobase/nocobase/commit/5b41b338072ec75f579a695bdae34dd69918752b) + +- версия 0.6 [`732d310`](https://github.com/nocobase/nocobase/commit/732d31009eafbded78dd35dee5d891438783ba53) +- создать шаблон приложения-базы данных-nocobase из [разработка] [`9f4bea7`](https://github.com/nocobase/nocobase/commit/9f4bea79668643d37c2b488eb969b2c93a241026) +- функция: улучшить инициализатор схемы действий для просмотра [`590ca26`](https://github.com/nocobase/nocobase/commit/590ca267b27b093b67aa140c4e94fd2b97c8eeb6) diff --git a/docs/ru-RU/welcome/release/v0070-changelog.md b/docs/ru-RU/welcome/release/v0070-changelog.md new file mode 100644 index 0000000000..c4272fc671 --- /dev/null +++ b/docs/ru-RU/welcome/release/v0070-changelog.md @@ -0,0 +1,67 @@ +# Bерсия 0.7: 2022-04-25 + +## Объединено + +- функция (клиент, sdk): улучшение api клиента [`#425`](https://github.com/nocobase/nocobase/pull/425) +- исправлено: добавлена команда создания плагина [`#423`](https://github.com/nocobase/nocobase/pull/423) +- исправлено: добавлен цвет кнопки [`#420`](https://github.com/nocobase/nocobase/pull/420) +- исправлено: 204 сообщения не отвечали на запрос [`#378`](https://github.com/nocobase/nocobase/pull/378) +- умение: уничтожать поле ассоциаций после уничтожения коллекции целей [`#376`](https://github.com/nocobase/nocobase/pull/376) +- исправлено (тип): использовать sequelize native Transactionable вместо TransactionAble [`#410`](https://github.com/nocobase/nocobase/pull/410) +- исправлено (плагин-рабочий процесс): удалять предыдущие прослушиватели при изменении коллекции в конфигурации [`#409`](https://github.com/nocobase/nocobase/pull/409) +- исправлено: добавлено пользовательское действие [`#396`](https://github.com/nocobase/nocobase/pull/396) +- рефакторинг (плагин-рабочий процесс): несколько экземпляров и управление событиями (исправлено #384) [`#408`](https://github.com/nocobase/nocobase/pull/408) +- исправлено (plugin-workflow): исправлено название типа узла в ящиках [`#389`](https://github.com/nocobase/nocobase/pull/389) +- Исправлено(plugin workflow): исправлено, что не удается получить свойства результата задания [`#382`](https://github.com/nocobase/nocobase/pull/382) +- исправлено: ошибка при запуске сервера [`#374`](https://github.com/nocobase/nocobase/pull/374) +- дополнительная информация: параметры приложения [`#375`](https://github.com/nocobase/nocobase/pull/375) +- исправлено: нет в операторе записи с нулевым значением [`#377`](https://github.com/nocobase/nocobase/pull/377) +- Исправление (рабочий процесс плагина): изменения [`#379`](https://github.com/nocobase/nocobase/pull/379) +- исправление (база данных): исправлена опция -синтаксический анализатор включает индекс списка [`#371`](https://github.com/nocobase/nocobase/pull/371) +- исправлено (плагин-worklfow): исправлено дублирование описания в значениях полей [`#368`](https://github.com/nocobase/nocobase/pull/368) +- исправлено (база данных): исправлен тип и транзакция в репозитории [`#366`](https://github.com/nocobase/nocobase/pull/366) +- Исправлено (рабочий процесс плагина): исправлена транзакция выполнения [`#364`](https://github.com/nocobase/nocobase/pull/364) +- исправлено (плагин-рабочий процесс): добавлено название документа [`#363`](https://github.com/nocobase/nocobase/pull/363) +- исправлено: установить видимый с подтверждением [`#361`](https://github.com/nocobase/nocobase/pull/361) +- исправлено: ошибка с пустым списком управления доступом к ресурсам [`#357`](https://github.com/nocobase/nocobase/pull/357) +- Исправлено: при изменении несохраненных значений будет отображаться запрос [`#351`](https://github.com/nocobase/nocobase/pull/351) +- исправлено: изменение цвета значка закрытия фильтра [`#356`](https://github.com/nocobase/nocobase/pull/356) +- исправлено (плагин-рабочий процесс): исправлен i18n [`#354`](https://github.com/nocobase/nocobase/pull/354) +- Исправлено (плагин-рабочий процесс) [`#353`](https://github.com/nocobase/nocobase/pull/353) +- исправлено(плагин-файловый менеджер): обновлен пакет multer-aliyun-oss для исправления размера [`#352`](https://github.com/nocobase/nocobase/pull/352) +- исправлено: улучшен код [`#350`](https://github.com/nocobase/nocobase/pull/350) +- Исправлен рабочий процесс плагина [`#349`](https://github.com/nocobase/nocobase/pull/349) +- исправлено: db:синхронизация не работает [`#348`](https://github.com/nocobase/nocobase/pull/348) +- исправлено (плагин-рабочий процесс): исправлена логика привязки триггера, чтобы избежать дублирования [`#347`](https://github.com/nocobase/nocobase/pull/347) +- Исправлено (рабочий процесс плагина) [`#346`](https://github.com/nocobase/nocobase/pull/346) +- Исправлено: стиль URL-адреса меню [`#344`](https://github.com/nocobase/nocobase/pull/344) +- основная задача (рабочий процесс плагина): добавить перевод [`#345`](https://github.com/nocobase/nocobase/pull/345) +- исправлено (плагин-рабочий процесс): прерывание циклического запуска с помощью идентификатора транзакции [`#341`](https://github.com/nocobase/nocobase/pull/341) +- исправлено: model.beforeCreate не вызывался [`#343`](https://github.com/nocobase/nocobase/pull/343) +- исправлено: уменьшенное изображение в карточке канбан [`#338`](https://github.com/nocobase/nocobase/pull/338) +- умение: аутентификация в базе данных [`#342`](https://github.com/nocobase/nocobase/pull/342) +- рутинная работа: асинхронная установка дополнительного приложения [`#336`](https://github.com/nocobase/nocobase/pull/336) +- исправлено (плагин-workflow): изменен пользовательский интерфейс ввода значений коллекции в узлах workflow [`#340`](https://github.com/nocobase/nocobase/pull/340) +- исправление: улучшения [`#335`](https://github.com/nocobase/nocobase/pull/335) +- Функция (рабочий процесс плагина): добавление измененных полей в конфигурацию триггера модели [`#332`](https://github.com/nocobase/nocobase/pull/332) +- исправлено: создание-nocobase-совместимости с приложениями [`#323`](https://github.com/nocobase/nocobase/pull/323) +- исправлено: создание-nocobase-версии клиентского пакета приложения [`#321`](https://github.com/nocobase/nocobase/pull/321) +- исправлено: диспетчер приложений [`#320`](https://github.com/nocobase/nocobase/pull/320) +- рефакторинг: изменен стиль ярлыка по умолчанию [`#318`](https://github.com/nocobase/nocobase/pull/318) +- Исправлено несколько приложений [`#317`](https://github.com/nocobase/nocobase/pull/317) +- Исправлено несколько приложений [`#316`](https://github.com/nocobase/nocobase/pull/316) +- Исправлена ошибка целевого действия acl [`#311`](https://github.com/nocobase/nocobase/pull/311) +- функция: файловые хранилища [`#314`](https://github.com/nocobase/nocobase/pull/314) +- исправление (плагин-рабочий процесс): исправлен некоторый ux [`#313`](https://github.com/nocobase/nocobase/pull/313) +- исправлено (плагин-рабочий процесс): исправлено поле получения узла запроса [`#308`](https://github.com/nocobase/nocobase/pull/308) +- Исправлено создание приложения nocobase [`#307`](https://github.com/nocobase/nocobase/pull/307) +- исправлено: создать-nocobase-приложение [`#306`](https://github.com/nocobase/nocobase/pull/306) +- Исправлено создание приложения nocobase [`#305`](https://github.com/nocobase/nocobase/pull/305) +- исправлено: блокирование элемента, добавление переполнения: скрытое [`#304`](https://github.com/nocobase/nocobase/pull/304) + +## Фиксации + +- функция(лицензия): заменить лицензию MIT на Apache-2.0 [`717efa8`](https://github.com/nocobase/nocobase/commit/717efa889d471fac3f909137e2adb96586414aad) +- функция: переводы [`5c0184a`](https://github.com/nocobase/nocobase/commit/5c0184a397885d6de5307a7087c2d93042cd49f8) +- качество: перевод [`1f04f90`](https://github.com/nocobase/nocobase/commit/1f04f90a00e071aa9ab294f21e8d02373191eecc) +- - подвиг: kanban disableCardDrag [`05a251b`](https://github.com/nocobase/nocobase/commit/05a251b1fc06012e77e402b422e3120430effef1) diff --git a/docs/ru-RU/welcome/release/v0071-changelog.md b/docs/ru-RU/welcome/release/v0071-changelog.md new file mode 100644 index 0000000000..e136189c8f --- /dev/null +++ b/docs/ru-RU/welcome/release/v0071-changelog.md @@ -0,0 +1,74 @@ +# Версия 0.7.1: 2022-06-26 + +## Объединено + +- основная работа (создание-nocobase-приложения): исправлены некоторые ошибки [`#538`](https://github.com/nocobase/nocobase/pull/538) +- исправлено: уничтожено поле сбора [`#536`](https://github.com/nocobase/nocobase/pull/536) +- функция (плагин-рабочий процесс): добавлен тип узла задержки [`#532`](https://github.com/nocobase/nocobase/pull/532) +- рефакторинг: клиентское приложение [`#533`](https://github.com/nocobase/nocobase/pull/533) +- исправлено: отсутствовала транзакция [`#531`](https://github.com/nocobase/nocobase/pull/531) +- исправлено: добавлено свойство многоточия в средство выбора записей [`#527`](https://github.com/nocobase/nocobase/pull/527) +- исправлено: удален шаблон без элемента формы [`#528`](https://github.com/nocobase/nocobase/pull/528) +- исправлено (плагин-рабочий процесс): устанавливается текущим при обновлении [`# 526`](https://github.com/nocobase/nocobase/pull/526) +- исправлено: последний заказ обнуляется [`#519`](https://github.com/nocobase/nocobase/pull/519) +- исправлено: загрузка действий, обновление контекста, отправка и проверка формы [`#523`](https://github.com/nocobase/nocobase/pull/523) +- Исправлен шаблон поля [`#520`](https://github.com/nocobase/nocobase/pull/520) +- исправлено (плагин-рабочий процесс): исправлена возможность выбора минимальной ширины для поиска [`#524`](https://github.com/nocobase/nocobase/pull/524) +- исправлено: шаблон содержит только поля [`#517`](https://github.com/nocobase/nocobase/pull/517) +- исправлено (плагин-рабочий процесс): исправлено текущее свойство рабочего процесса обновления [`#521`](https://github.com/nocobase/nocobase/pull/521) +- рефакторинг (плагин-workflow): абстрагирование от классов [`#515`](https://github.com/nocobase/nocobase/pull/515) +- функция: сортировка столбцов и формирование шаблона элементов [`#518`](https://github.com/nocobase/nocobase/pull/518) +- исправлено (пользовательский запрос): поддержка шаблонов строк/json [`#514`](https://github.com/nocobase/nocobase/pull/514) +- исправление: добавить заголовок блока [`#513`](https://github.com/nocobase/nocobase/pull/513) +- исправление: удалить коллекции и поля из базы данных [`#511`](https://github.com/nocobase/nocobase/pull/511) +- исправление: улучшить миграцию [`#510`](https://github.com/nocobase/nocobase/pull/510) +- исправлено (клиент): консолидировано использование даты и времени как UTC при передаче [`#509`](https://github.com/nocobase/nocobase/pull/509) +- исправлена ошибка в формуле [`#508`](https://github.com/nocobase/nocobase/pull/508) +- исправлено: экспортируемые поля по умолчанию [`#506`](https://github.com/nocobase/nocobase/pull/506) +- исправление: блокировка ассоциативного поля [`#493`](https://github.com/nocobase/nocobase/pull/493) +- исправление: экспорт плагина [`#479`](https://github.com/nocobase/nocobase/pull/479) +- исправление (клиент): путь к пакету (исправление #503) [`#504`](https://github.com/nocobase/nocobase/pull/504) +- исправлено: ошибка создания или удаления коллекции [`#501`](https://github.com/nocobase/nocobase/pull/501) +- исправлено: обновление коллекций и полей [`#500`](https://github.com/nocobase/nocobase/pull/500) +- исправлено: откат при сбое создания поля [`#498`](https://github.com/nocobase/nocobase/pull/498) +- исправлено (клиент): глобально для параметра `dropdownMatchSelectWidth` установлено значение false [`#497`](https://github.com/nocobase/nocobase/pull/497) +- исправлено (клиент): предупреждение об отсутствии клавиш в пунктах пользовательского меню [`#496`](https://github.com/nocobase/nocobase/pull/496) +- Функция (рабочий процесс плагина): поле cron для настройки запуска расписания [`#495`](https://github.com/nocobase/nocobase/pull/495) +- функция: журналы аудита [`#494`](https://github.com/nocobase/nocobase/pull/494) +- рефакторинг (plugin-workflow): добавление столбца изменений в выполнение [`#491`](https://github.com/nocobase/nocobase/pull/491) +- функция: изменение структуры поля связи [`#487`](https://github.com/nocobase/nocobase/pull/487) +- функция: изменение FK на входной компонент [`#488`](https://github.com/nocobase/nocobase/pull/488) +- исправлено (plugin-multi-app-manager): исправлено, что pg не может создавать тесты блоков базы данных [`#486`](https://github.com/nocobase/nocobase/pull/486) +- рефакторинг (базы данных): подключен прокси-сервер [`#402`](https://github.com/nocobase/nocobase/pull/402) +- подвиг: блоки на графике [`#484`](https://github.com/nocobase/nocobase/pull/484) +- Рефакторинг (рабочий процесс плагина): номер поддержки в конфигурации повтора для расписания [`#482`](https://github.com/nocobase/nocobase/pull/482) +- рутинная работа (отладка): добавление конфигурации отладки [`#475`](https://github.com/nocobase/nocobase/pull/475) +- исправлено: есть одна ошибка [`#478`](https://github.com/nocobase/nocobase/pull/478) +- функция: отношения [`#473`](https://github.com/nocobase/nocobase/pull/473) +- исправление (плагин-рабочий процесс): исправлена транзакция, запускающая сбор [`#474`](https://github.com/nocobase/nocobase/pull/474) +- исправлено (плагин-рабочий процесс): временное решение для условий запуска сбора [`#472`](https://github.com/nocobase/nocobase/pull/472) +- исправлено: компонент markdown [`#469`](https://github.com/nocobase/nocobase/pull/469) +- исправлено: поле формулы и поле процента [`#467`](https://github.com/nocobase/nocobase/pull/467) +- исправлено (плагин-рабочий процесс): исправлено действие обновления рабочего процесса [`#464`](https://github.com/nocobase/nocobase/pull/464) +- исправлено: обновлено поле формулы и поле процента [`#461`](https://github.com/nocobase/nocobase/pull/461) +- исправлено: добавлен тип поля формулы [`#457`](https://github.com/nocobase/nocobase/pull/457) +- исправлено: подробные сведения о связанных данных в подтаблице не отображаются [`#454`](https://github.com/nocobase/nocobase/pull/454) +- исправлено (plugin-workflow): исправлены языки [`#451`](https://github.com/nocobase/nocobase/pull/451) +- исправлено: не запускалась функция afterSync [`#450`](https://github.com/nocobase/nocobase/pull/450) +- документы (разные): улучшена читаемость [`#447`](https://github.com/nocobase/nocobase/pull/447) +- функция: пользовательский запрос [`#439`](https://github.com/nocobase/nocobase/pull/439) +- Функция (рабочий процесс плагина): запуск по расписанию [`#438`](https://github.com/nocobase/nocobase/pull/438) +- функция: db migrator [`#432`](https://github.com/nocobase/nocobase/pull/432) +- исправлено (клиент): невозможно открыть выбранный компонент в блоке вложенных таблиц [`#431`](https://github.com/nocobase/nocobase/pull/431) +- документы (github): изменен на формат markdown [`#430`](https://github.com/nocobase/nocobase/pull/430) +- исправлено (cli): опечатка [`#429`](https://github.com/nocobase/nocobase/pull/429) + +## Исправлено + +- исправлено (клиент): путь к пакету (исправлено #503) (#504) [`#503`](https://github.com/nocobase/nocobase/issues/503) + +## Фиксации + +- feat(клиент): обновить локали [`e57e60e`](https://github.com/nocobase/nocobase/commit/e57e60e6cb84431e694e69830d128cd71938388f) +- документы: обновить документацию [`e5cb948`](https://github.com/nocobase/nocobase/commit/e5cb94803f738961fcbc1986a94d258ef9e191a9) +- исправлено (клиент): улучшен компонент выбора даты, дата с часовым поясом, поддержка gmt [`1c03fbb`](https://github.com/nocobase/nocobase/commit/1c03fbb853b5885547835f50fc9a0932f63c363b) diff --git a/docs/ru-RU/welcome/release/v0072-changelog.md b/docs/ru-RU/welcome/release/v0072-changelog.md new file mode 100644 index 0000000000..12e2159ae2 --- /dev/null +++ b/docs/ru-RU/welcome/release/v0072-changelog.md @@ -0,0 +1,29 @@ +# Версия 0.7.2: 2022-07-05 + +## Объединено + +- работа(версии): 😊 публикация версии 0.7.2-альфа.1 [`#578`](https://github.com/nocobase/nocobase/pull/578) +- исправлено: удаление всех внешних ключей [`#576`](https://github.com/nocobase/nocobase/pull/576) +- исправление (плагин-рабочий процесс): исправлена конфигурация триггера сбора [`#575`](https://github.com/nocobase/nocobase/pull/575) +- функция: фильтр с переменной [`#574`](https://github.com/nocobase/nocobase/pull/574) +- функция (cli): проверьте версию базы данных перед установкой [`#572`](https://github.com/nocobase/nocobase/pull/572) +- исправлено (база данных): неверный индекс [`#564`](https://github.com/nocobase/nocobase/pull/564) +- исправлено: экспорт данных таблицы ассоциаций [`#561`](https://github.com/nocobase/nocobase/pull/561) +- Рефакторинг (рабочий процесс плагина): переместите клиентские файлы в плагин [`#556`](https://github.com/nocobase/nocobase/pull/556) +- исправление (база данных): ограничения по умолчанию равны false [`#550`](https://github.com/nocobase/nocobase/pull/550) +- исправлено (плагин-рабочий процесс): исправлена ширина выбора [`#552`](https://github.com/nocobase/nocobase/pull/552) +- функция: совместима со старым канбаном [`#553`](https://github.com/nocobase/nocobase/pull/553) +- исправлено: отображение ассоциативных полей [`#512`](https://github.com/nocobase/nocobase/pull/512) +- Исправлено (рабочий процесс плагина) [`#549`](https://github.com/nocobase/nocobase/pull/549) +- исправлено: обновление порта mysql [`#548`](https://github.com/nocobase/nocobase/pull/548) +- исправлено: экспорт блоков связей [`#546`](https://github.com/nocobase/nocobase/pull/546) +- исправлено (плагин-рабочий процесс): очистка параметров при изменении коллекции [`#547`](https://github.com/nocobase/nocobase/pull/547) +- подвиг (плагин-рабочий процесс): добавлен режим гонки [`#542`](https://github.com/nocobase/nocobase/pull/542) +- исправлено (клиент): изменено значение toArr на \_.castArray в выбранном компоненте [`#543`](https://github.com/nocobase/nocobase/pull/543) +- основная работа (версии): 😊 публикация версии 0.7.1-альфа.7 [`#539`](https://github.com/nocobase/nocobase/pull/539) + +## Фиксации + +- исправление (клиент): закомментируйте бесполезный код [`4e9384b`](https://github.com/nocobase/nocobase/commit/4e9384bce27676a3cc1ce8d8fd08f5611cffbe5a) +- исправление (рабочий процесс): объедините поставщиков рабочего процесса [`008a7f7`](https://github.com/nocobase/nocobase/commit/008a7f7f3351bdedf01b4490d1658edeacc95a16) +- функция (клиент): целочисленное поле [`9928424`](https://github.com/nocobase/nocobase/commit/9928424f5a163fe4edd7cfd60f349ca65b47c9bf) diff --git a/docs/ru-RU/welcome/release/v0073-changelog.md b/docs/ru-RU/welcome/release/v0073-changelog.md new file mode 100644 index 0000000000..41a3416ea9 --- /dev/null +++ b/docs/ru-RU/welcome/release/v0073-changelog.md @@ -0,0 +1,33 @@ +# Версия 0.7.3: 2022-07-10 + +## Объединено + +- работа(версии): 😊 публикация версии 0.7.3-альфа.1 [`#657`](https://github.com/nocobase/nocobase/pull/657) +- функция: печать действия [`#652`](https://github.com/nocobase/nocobase/pull/652) +- функция: восстановление перехватов действий [`#655`](https://github.com/nocobase/nocobase/pull/655) +- функция: проблема с разбивкой коллекций и полей на страницы [`#653`](https://github.com/nocobase/nocobase/pull/653) +- исправлено (основное): изменены методы прокси-агента на собственные [`#654`](https://github.com/nocobase/nocobase/pull/654) +- исправлено: удаление сведений о действиях с полем таблицы [`#638`](https://github.com/nocobase/nocobase/pull/638) +- исправлено: ссылка на значение по умолчанию [`#641`](https://github.com/nocobase/nocobase/pull/641) +- улучшена поддержка отображения полей реляционных таблиц в виде деталей или блоков форм [`#635`](https://github.com/nocobase/nocobase/pull/635) +- исправлено: программа выбора записей не может выбирать из разных страниц [`#623`](https://github.com/nocobase/nocobase/pull/623) +- исправлено: перетаскивание элемента влево, вправо или вниз приводило к исчезновению элемента [`#620`](https://github.com/nocobase/nocobase/pull/620) +- функция: добавление кнопки перезагрузки в действие с таблицей [`#630`](https://github.com/nocobase/nocobase/pull/630) +- функция: улучшение языковых настроек [`#627`](https://github.com/nocobase/nocobase/pull/627) +- функция: назначение полей для пользовательских действий поддерживает строковые переменные [`#597`](https://github.com/nocobase/nocobase/pull/597) +- исправлено: пропуск рекурсивного удаления в компоненте grid [`#621`](https://github.com/nocobase/nocobase/pull/621) +- исправлено время и разбивка коллекции на страницы [`#618`](https://github.com/nocobase/nocobase/pull/618) +- исправлено: поля инициализаторов записей выбираются [`#558`](https://github.com/nocobase/nocobase/pull/558) +- исправлено: неправильно: активный фон [`#607`](https://github.com/nocobase/nocobase/pull/607) +- исправлено: выбор таблицы obo [`#613`](https://github.com/nocobase/nocobase/pull/613) +- исправлена ошибка: средство проверки формы [`#569`](https://github.com/nocobase/nocobase/pull/569) +- исправлена ошибка выбора таблицы [`#612`](https://github.com/nocobase/nocobase/pull/612) +- основная работа (версии): 😊 публикация версии 0.7.2-альфа.7 [`#611`](https://github.com/nocobase/nocobase/pull/611) +- основная работа (версии): 😊 публикация версии 0.7.2-альфа.3 [`#608`](https://github.com/nocobase/nocobase/pull/608) +- основная работа (версии): 😊 публикация версии 0.7.2-альфа.2 [`#606`](https://github.com/nocobase/nocobase/pull/606) + +## Фиксации + +- исправление (клиент): ошибка сборки [`600f13f`](https://github.com/nocobase/nocobase/commit/600f13f4a06ccfed27df928d7435afa83391c18a) +- исправление (клиент): блоки удаляются, когда их перетаскивают ниже текущего блока [`20ab8c1`](https://github.com/nocobase/nocobase/commit/20ab8c15017d9dbf941bf963ce3023115050edf8) +- функция (клиент): значки на панели инструментов плагина и переводы [`c51c6c0`](https://github.com/nocobase/nocobase/commit/c51c6c097f24417f0ff82d3c5178ec3be1ee7630) diff --git a/docs/ru-RU/welcome/release/v0074-changelog.md b/docs/ru-RU/welcome/release/v0074-changelog.md new file mode 100644 index 0000000000..ad23ac041d --- /dev/null +++ b/docs/ru-RU/welcome/release/v0074-changelog.md @@ -0,0 +1,40 @@ +# Версия 0.7.4: 2022-08-12 + +## Объединено + +- работа(версии): 😊 публикация версии 0.7.4-альфа.4 [`#727`](https://github.com/nocobase/nocobase/pull/727) +- исправлено: синхронизация сортировки таблицы для экспорта [`#723`](https://github.com/nocobase/nocobase/pull/723) +- исправлено: полная версия файла настройки NocoBase [`#719`](https://github.com/nocobase/nocobase/pull/719) +- исправлено (плагин-рабочий процесс): исправлено расширение коллекции [`#708`](https://github.com/nocobase/nocobase/pull/708) +- исправлено: DB_TABLE_PREFIX не применяется [`#710`](https://github.com/nocobase/nocobase/pull/710) +- исправлено: значение по умолчанию [`#679`](https://github.com/nocobase/nocobase/pull/679) +- исправлено: ошибка отправки при удалении обязательного поля (#688) [`#694`](https://github.com/nocobase/nocobase/pull/694) +- основная работа (версии): 😊 публикация версии 0.7.4-альфа.1 [`#696`](https://github.com/nocobase/nocobase/pull/696) +- исправление: добавление ролей к текущему пользователю [`#695`](https://github.com/nocobase/nocobase/pull/695) +- исправлено: исправлен формат даты [`#686`](https://github.com/nocobase/nocobase/pull/686) +- тест (плагин-рабочий процесс): пропущены тесты с подсказками [`#692`](https://github.com/nocobase/nocobase/pull/692) +- исправлено: исправлена точность в процентах [`#685`](https://github.com/nocobase/nocobase/pull/685) +- исправлено (плагин-рабочий процесс): изменено время ожидания для тестовых случаев [`#691`](https://github.com/nocobase/nocobase/pull/691) +- функция (плагин-рабочий процесс): добавлена конфигурация назначаемых лиц для получения быстрых инструкций [`#690`](https://github.com/nocobase/nocobase/pull/690) +- исправлено: отображалась кнопка экспорта ролей (#616) [`#666`](https://github.com/nocobase/nocobase/pull/666) +- подвиг: проверка uid [`#681`](https://github.com/nocobase/nocobase/pull/681) +- рефакторинг: замените react-drag-listview на @dnd-kit/sortable [`#660`](https://github.com/nocobase/nocobase/pull/660) +- рефакторинг (для пользователей плагинов): улучшите расширяемость промежуточных программ [`#677`](https://github.com/nocobase/nocobase/pull/677) +- исправлено: o2m удаляет, а не обновляет [`#646`](https://github.com/nocobase/nocobase/pull/646) +- исправлено: в канбан добавлено описание [`#659`](https://github.com/nocobase/nocobase/pull/659) +- исправлено: в поле потеряно перечисление [`#667`](https://github.com/nocobase/nocobase/pull/667) +- функция: добавить в редактор горячую клавишу Ctrl+Shift+U [`#675`](https://github.com/nocobase/nocobase/pull/675) +- исправлено: Исправлена ошибка в поле изменения календаря (#626) [`#671`](https://github.com/nocobase/nocobase/pull/671) +- основная работа: исправлена ошибка, из-за которой не работает eslint [`#670`](https://github.com/nocobase/nocobase/pull/670) +- улучшение: точность чисел [`#661`](https://github.com/nocobase/nocobase/pull/661) +- исправление: конфигурация nginx [`#664`](https://github.com/nocobase/nocobase/pull/664) +- исправление: проблема с переключением формы в конструкторе элементов формы [`#656`](https://github.com/nocobase/nocobase/pull/656) + +## Фиксации + +- исправление: добавление примеров [`b848b9c`](https://github.com/nocobase/nocobase/commit/b848b9cd6774df6ed86acd30edb81ed6381c3555) +- исправлено: для чтения pretty требуется поставщик записей [`38c3e3e`](https://github.com/nocobase/nocobase/commit/38c3e3e4cc2698069c741d25ddda8e3e8e4d1db0) +- Обновлено README.zh-CN.md [`ba0e618`](https://github.com/nocobase/nocobase/commit/ba0e61873e7f69dee6a76929eb774828ac980760) +- исправлено (клиент): имена полей средства выбора записей [`9038d11`](https://github.com/nocobase/nocobase/commit/9038d111ea71a89798cb1499f3dadc3f9c3dbfd7) +- исправлено (клиент): требуется для поля вложенной таблицы [`609b0e2`](https://github.com/nocobase/nocobase/commit/609b0e2ff2d5aece96185cbcd30ec1810194be0d) +- функция(клиент): значок вкладки [`d9b2bf8`](https://github.com/nocobase/nocobase/commit/d9b2bf8af1c42e2f4e81533f6db92b19523410bd) diff --git a/docs/ru-RU/welcome/release/v0075-changelog.md b/docs/ru-RU/welcome/release/v0075-changelog.md new file mode 100644 index 0000000000..fe2463e593 --- /dev/null +++ b/docs/ru-RU/welcome/release/v0075-changelog.md @@ -0,0 +1,59 @@ +# Версия 0.7.5: 2022-10-16 + +## Объединено + +- работа(версии): 😊 публикация версии 0.7.5-альфа.1 [`#920`](https://github.com/nocobase/nocobase/pull/920) +- Исправлено: поле сбора данных для рабочего процесса плагина [`#919`](https://github.com/nocobase/nocobase/pull/919) +- исправлено: создание с использованием массива значений [`#912`](https://github.com/nocobase/nocobase/pull/912) +- исправлено: отмена привязки при возникновении ошибки [`#914`](https://github.com/nocobase/nocobase/pull/914) +- исправлено: теперь слияние добавляется с использованием первичного ключа [`#911`](https://github.com/nocobase/nocobase/pull/911) +- исправлено ограничение идентификатора базы данных [`#908`](https://github.com/nocobase/nocobase/pull/908) +- исправлено: значение по умолчанию в поле сбора данных для синхронизации [`#907`](https://github.com/nocobase/nocobase/pull/907) +- исправлено: добавлено значение, включающее в себя [`#905`](https://github.com/nocobase/nocobase/pull/905) +- исправлено: репозиторий с одним отношением добавляет проблему с запросом [`#901`](https://github.com/nocobase/nocobase/pull/901) +- функция (плагин-рабочий процесс): добавить калькулятор объединения [`#894`](https://github.com/nocobase/nocobase/pull/894) +- исправлено (клиент / средство выбора записей): поддержка средства выбора записей для отображения формата DataPicker [`#888`](https://github.com/nocobase/nocobase/pull/888) +- исправлено (клиент /блок-выбор-коллекция): исправлена ошибка при просмотре меню выбора коллекции [`#889`](https://github.com/nocobase/nocobase/pull/889) +- исправлено: не удалось отправить форму во время загрузки файла [`#892`](https://github.com/nocobase/nocobase/pull/892) +- исправлено: запуск теста в шутку [`#891`](https://github.com/nocobase/nocobase/pull/891) +- функция (менеджер коллекций): можно настроить обратные поля [`#883`](https://github.com/nocobase/nocobase/pull/883) +- исправлено (формула): поддержка целого числа и исправлена ошибка NaN [`#879`](https://github.com/nocobase/nocobase/pull/879) +- исправлено: отсутствует параметр сортировки [`#849`](https://github.com/nocobase/nocobase/pull/849) +- исправлено: медленный запрос на присоединение, выдаваемый полем добавления в методе поиска репозитория [`#845`](https://github.com/nocobase/nocobase/pull/845) +- функция (ядро/кэш): поддержка кэша [`#876`](https://github.com/nocobase/nocobase/pull/876) +- функция: опция обновления должна содержать фильтр или filterByTk [`#847`](https://github.com/nocobase/nocobase/pull/847) +- добавлен русский перевод [`#840`](https://github.com/nocobase/nocobase/pull/840) +- функция (база данных): добавить тип поля последовательности [`#779`](https://github.com/nocobase/nocobase/pull/779) +- исправлено: невозможно получить доступ к страницам без разрешения по URL [`#826`](https://github.com/nocobase/nocobase/pull/826) +- рефакторинг (resourcer): объединение классов промежуточного программного обеспечения [`#825`](https://github.com/nocobase/nocobase/pull/825) +- рефакторинг (базы данных): исправлены некоторые поля и типы [`#820`](https://github.com/nocobase/nocobase/pull/820) +- функция (язык): добавлен перевод на японский [`#813`](https://github.com/nocobase/nocobase/pull/813) +- исправление (plugin-workflow): исправлен тип значения для выбора даты на текущий момент (#815) [`#819`](https://github.com/nocobase/nocobase/pull/819) +- рефакторинг(plugin-workflow): экспорт реестра клиентских калькуляторов [`#816`](https://github.com/nocobase/nocobase/pull/816) +- исправлено: тип записи номера изменен на двойной [`#810`](https://github.com/nocobase/nocobase/pull/810) +- рефакторинг (сервера) [`#795`](https://github.com/nocobase/nocobase/pull/795) +- исправление (проверка плагина): изменение ошибки ограничения скорости провайдера на 429 [`#788`](https://github.com/nocobase/nocobase/pull/788) +- исправлено(plugin-cm): исправлено исчезновение поля после неудачного обновления [`#773`](https://github.com/nocobase/nocobase/pull/773) +- исправлено: исправлена неопределенность в uiSchema [`#770`](https://github.com/nocobase/nocobase/pull/770) +- исправлено(plugin-cm): исправлено значение уникальной опции по умолчанию для обновления [`#768`](https://github.com/nocobase/nocobase/pull/768) +- исправлено (плагин-пользователи): исправлено обновление профиля 500 (#766) [`#767`](https://github.com/nocobase/nocobase/pull/767) +- исправлено: столбец mysql в предложении where неоднозначен [`#756`](https://github.com/nocobase/nocobase/pull/756) +- функция (plugin-cm): добавить уникальную опцию для базовых полей [`#745`](https://github.com/nocobase/nocobase/pull/745) +- функция(plugin-verification): добавить плагин-верификацию и телефон для пользователей [`#722`](https://github.com/nocobase/nocobase/pull/722) +- умение: изменять размер столбцов сетки с помощью перетаскивания [`#748`](https://github.com/nocobase/nocobase/pull/748) +- рефакторинг (клиент): разделение элементов инициализатора схемы на несколько файлов [`#744`](https://github.com/nocobase/nocobase/pull/744) +- рефакторинг (плагин-рабочий процесс): изменение режима файлов на 644 [`#755`](https://github.com/nocobase/nocobase/pull/755) +- исправлено: проверка версии базы данных [`#749`](https://github.com/nocobase/nocobase/pull/749) +- исправлено: добавление примеров [`#718`](https://github.com/nocobase/nocobase/pull/718) + +## Исправлено + +- исправление (плагин-рабочий процесс): исправлен тип значения для выбора даты на текущий момент (#815) (#819) [`#815`](https://github.com/nocobase/nocobase/issues/815) +- исправлено (плагин-пользователи): исправлено обновление профиля 500 (#766) (#767) [`#766`](https://github.com/nocobase/nocobase/issues/766) +- исправлено: проверка версии базы данных (#749) [`#742`](https://github.com/nocobase/nocobase/issues/742) + +## Фиксации + +- исправлено (клиент): инициализаторы панели вкладок для создания блока формы [`7efc4bc`](https://github.com/nocobase/nocobase/commit/7efc4bca0e3c5f2e1c5cd9e1365e77a005f3e108) +- исправлено: транзакция не может быть откатана, поскольку она была завершена с состоянием: откат [`6dacec4`](https://github.com/nocobase/nocobase/commit/6dacec4158103fd165ec2865ea87ed9d3d4ceaa4) +- исправлено (база данных): исправлена ошибка слишком длинного имени индекса [`7bfe6b8`](https://github.com/nocobase/nocobase/commit/7bfe6b8c46bef0183c4703683175561c7fc91aee) diff --git a/docs/ru-RU/welcome/release/v0080-changelog.md b/docs/ru-RU/welcome/release/v0080-changelog.md new file mode 100644 index 0000000000..352f2b9bad --- /dev/null +++ b/docs/ru-RU/welcome/release/v0080-changelog.md @@ -0,0 +1,222 @@ +# Версия 0.8: 2022-11-01 + +Начиная с версии 0.8, NocoBase начинает предоставлять доступ к менеджеру плагинов и документации по разработке. Вот основные изменения в версии 0.8. + +## Изменения в правом верхнем углу интерфейса + +- Редактор пользовательского интерфейса +- Менеджер плагинов +- Центр настроек +- Персональный центр + +<img src="./v08-changelog/topright.jpg" style="max-width: 500px;" /> + +## Новый менеджер плагинов + +Версия 0.8 предоставляет мощный менеджер плагинов для управления плагинами без использования кода. + +### Поток управления плагинами + +<img src="./v08-changelog/pm-flow.svg" style="max-width: 580px;"/> + +### Интерфейс менеджера плагинов + +В настоящее время он в основном используется для отключения, активации и удаления локальных плагинов. Встроенные плагины удалить невозможно. + +<img src="./v08-changelog/pm-ui.jpg" /> + +### Команда менеджера плагинов + +Помимо возможности активировать и отключать плагины из интерфейса без использования кода, вы также можете более полно управлять плагинами из командной строки. + +``` +# Создаем плагин +yarn pm create hello +# Регистрируем плагин +yarn pm add hello +# Активируем плагин +yarn pm enable hello +# Отключаем плагин +yarn pm disable hello +# Удаляем плагин +yarn pm remove hello + +``` + +Примечание: Релизы и обновления для плагинов будут поддерживаться в последующих версиях. + +``` +# Publish the plugin +yarn pm publish hello +# Publish the plugin +yarn pm upgrade hello + +``` + +Дополнительные примеры плагинов смотрите в разделе [пакеты/примеры](https://github.com/nocobase/nocobase/tree/main/packages/samples). + +## Изменения в плагине + +### Структура каталогов плагина + +``` +|- /hello + |- /src + |- /client # Plugin client + |- /server # Plugin server + |- client.d.ts + |- client.js + |- package.json # Plugin package information + |- server.d.ts + |- server.js + +``` + +### Спецификация имени плагина + +Плагин NocoBase также является пакетом NPM, правило соответствия между именем плагина и именем пакета NPM таково: `${PLUGIN_PACKAGE_PREFIX}-${PluginName}`. + +`PLUGIN_PACKAGE_PREFIX` - это префикс пакета плагина, который можно настроить в `.env`, [нажмите здесь, чтобы ознакомиться с описанием PLUGIN_PACKAGE_PREFIX](https://www.notion.so/api/env#plugin_package_prefix). + +Например, проект с именем `my-nocobase-app` добавляет плагин `hello` с именем пакета `@my-nocobase-app/plugin-hello`. + +`PLUGIN_PACKAGE_PREFIX` настраивается следующим образом. + +``` +PLUGIN_PACKAGE_PREFIX=@nocobase/plugin-,@nocobase/preset-,@my-nocobase-app/plugin- + +``` + +Соответствие между названиями плагинов и названиями пакетов таково: + +- `users` название пакета плагина - `@nocobase/plugin-users` +- `nocobase` название пакета плагина - `@nocobase/preset-nocobase` +- `hello` название пакета плагина - `@my-nocobase-app/plugin-hello` + +### Жизненный цикл плагина + +Версия 0.8 обеспечивает более полный подход к жизненному циклу плагина. + +``` +import { InstallOptions, Plugin } from '@nocobase/server'; + +export class HelloPlugin extends Plugin { + afterAdd() { + // After the plugin has been added via pm.add + } + + beforeLoad() { + // Before all plugins are loaded, generally used to register classes and event listeners + } + + async load() { + // Load configuration + } + + async install(options?: InstallOptions) { + // Install logic + } + + async afterEnable() { + // After activation + } + + async afterDisable() { + // After disable + } + + async remove() { + // Remove logic + } +} + +export default HelloPlugin; + +``` + +### Интерфейсный и серверный вход для плагинов + +Жизненный цикл плагина контролируется сервером: + +``` +import { Application } from '@nocobase/server'; + +const app = new Application({ + // ... +}); + +class MyPlugin extends Plugin { + afterAdd() {} + beforeLoad() {} + load() {} + install() {} + afterEnable() {} + afterDisable() {} + remove() {} +} + +app.plugin(MyPlugin, { name: 'my-plugin' }); + +``` + +Клиентская часть плагина существует в виде контекста. Провайдер (аналогично промежуточному программному обеспечению на стороне сервера) + +``` +import React from 'react'; +import { Application } from '@nocobase/client'; + +const app = new Application({ + apiClient: { + baseURL: process.env.API_BASE_URL, + }, + dynamicImport: (name: string) => { + return import(`../plugins/${name}`); + }, +}); + +// When you visit the /hello page, it displays Hello world! +const HelloProvider = React.memo((props) => { + const location = useLocation(); + if (location.pathname === '/hello') { + return <div>Hello world!</div> + } + return <>{props.children}</> +}); +HelloProvider.displayName = 'HelloProvider' + +app.use(HelloProvider); + +``` + +## Пользовательский бизнес-код + +Плагины версии 0.7 не являются полными, пользовательский бизнес-код может быть разбросан по `пакетам/приложению/клиенту` и `пакетам/приложению/серверу`, что не способствует обновлению и обслуживанию. В версии 0.8 рекомендуется организовать его в виде пакета плагинов и использовать `yarn pm` для управления плагинами. + +## Предоставляется более полная документация + +- **Добро пожаловать**: краткий обзор NocoBase +- **Руководство**: узнайте больше об основных функциях, предоставляемых платформой NocoBase +- **Руководство по разработке плагинов**: Углубленное изучение разработки плагинов +- **Ссылка на API**: Проверьте использование API при разработке плагинов +- **Библиотека клиентских компонентов** (в стадии подготовки): содержит примеры использования компонентов NocoBase + +## Приведены дополнительные примеры плагинов + +- [команда](https://github.com/nocobase/nocobase/tree/develop/packages/samples/command) +- [пользовательский блок](https://github.com/nocobase/nocobase/tree/develop/packages/samples/custom-block) +- [пользовательская страница](https://github.com/nocobase/nocobase/tree/develop/packages/samples/custom-page) +- [custom-signup-page](https://github.com/nocobase/nocobase/tree/develop/packages/samples/custom-signup-page) +- [привет](https://github.com/nocobase/nocobase/tree/develop/packages/samples/hello) +- [ограничение по ставке](https://github.com/nocobase/nocobase/tree/develop/packages/samples/ratelimit) +- [действия в магазине](https://github.com/nocobase/nocobase/tree/develop/packages/samples/shop-actions) +- [магазин-события](https://github.com/nocobase/nocobase/tree/develop/packages/samples/shop-events) +- [магазин-i18n](https://github.com/nocobase/nocobase/tree/develop/packages/samples/shop-i18n) +- [магазин-моделирование](https://github.com/nocobase/nocobase/tree/develop/packages/samples/shop-modeling) + +## Другие новые возможности и функционал + +- Импорт из Excel +- Массовое обновление и редактирование +- Графическая коллекция +- Поддержка рабочего процесса для просмотра истории выполнения +- Поле JSON diff --git a/docs/ru-RU/welcome/release/v0091-changelog.md b/docs/ru-RU/welcome/release/v0091-changelog.md new file mode 100644 index 0000000000..b6aa34afa2 --- /dev/null +++ b/docs/ru-RU/welcome/release/v0091-changelog.md @@ -0,0 +1,108 @@ +# Версия 0.9.1: 2023-03-09 + +## Объединено + +- исправление (plugin-workflow): исправлен импорт модуля (#1550) [`#1552`](https://github.com/nocobase/nocobase/pull/1552) +- рутинная работа: ответ хранилища связей, когда исходная модель не найдена [`#1546`](https://github.com/nocobase/nocobase/pull/1546) +- исправление (плагин-рабочий процесс): исправление компонента конфигурации назначенцев в ручном узле [`#1547`](https://github.com/nocobase/nocobase/pull/1547) +- функция: остановлено состояние приложения [`#1543`](https://github.com/nocobase/nocobase/pull/1543) +- исправлено (плагин-рабочий процесс): исправлен путь к полю ввода ассоциаций [`#1542`](https://github.com/nocobase/nocobase/pull/1542) +- исправлено: кэширование с помощью index.html [`#1541`](https://github.com/nocobase/nocobase/pull/1541) +- исправлено: относится ко многим таблицам с пользовательской схемой [`#1539`](https://github.com/nocobase/nocobase/pull/1539) +- исправлено (плагин-формула): отображение результата в поле формулы в форме [`#1534`](https://github.com/nocobase/nocobase/pull/1534) +- тест: с collection_manager_schema env [`#1532`](https://github.com/nocobase/nocobase/pull/1532) +- исправлено: фильтр по ассоциативному полю с подчеркиванием [`#1537`](https://github.com/nocobase/nocobase/pull/1537) +- исправлено (графики): исправлена копия [`#1533`](https://github.com/nocobase/nocobase/pull/1533) +- исправлено: добавлен плагин для диаграмм [`#1477`](https://github.com/nocobase/nocobase/pull/1477) +- функция: поддержка добавления нового в блок для коллекции наследования [`#1518`](https://github.com/nocobase/nocobase/pull/1518) +- рефакторинг (плагин-рабочий процесс): изменение карточки холста и настройка стилей [`#1529`](https://github.com/nocobase/nocobase/pull/1529) +- исправлено: тест с плагином nocobase [`#1525`](https://github.com/nocobase/nocobase/pull/1525) +- исправлено: кэш nginx [`#1523`](https://github.com/nocobase/nocobase/pull/1523) +- исправлено: удалялось поле, когда коллекция имела схему различий с базой данных [`#1524`](https://github.com/nocobase/nocobase/pull/1524) +- рефакторинг: блок журналов аудита [`#1517`](https://github.com/nocobase/nocobase/pull/1517) +- исправление (оценщики): исправлена предварительная обработка и добавлены тестовые примеры [`#1519`](https://github.com/nocobase/nocobase/pull/1519) +- рутинная работа (отладка): исправлено имя файла отладки при запуске теста [`#1520`](https://github.com/nocobase/nocobase/pull/1520) +- функция: env схемы менеджера коллекций [`#1506`](https://github.com/nocobase/nocobase/pull/1506) +- исправить (клиент): исправить снятый флажок для отображения [`#1508`](https://github.com/nocobase/nocobase/pull/1508) +- функция (поле моментального снимка): улучшение перехода [`#1513`](https://github.com/nocobase/nocobase/pull/1513) +- исправление (плагин-рабочий процесс): исправлена проверка поля коллекции при использовании переменной [`#1512`](https://github.com/nocobase/nocobase/pull/1512) +- функция (плагин-формула): вычисление с использованием поля моментального снимка [`#1498`](https://github.com/nocobase/nocobase/pull/1498) +- исправление (выбор ассоциации): фильтр без области данных не работает [`#1509`](https://github.com/nocobase/nocobase/pull/1509) +- функция: изменение поля сортировки на поле createdAt [`#1507`](https://github.com/nocobase/nocobase/pull/1507) +- исправлено (графический интерфейс): категория коллекции не отображает заголовок [`#1503`](https://github.com/nocobase/nocobase/pull/1503) +- исправлено (выбор ассоциации): неверные данные при использовании области данных [`#1491`](https://github.com/nocobase/nocobase/pull/1491) +- исправлено: средства доступа к версии на диалекте [`#1502`](https://github.com/nocobase/nocobase/pull/1502) +- исправлено: схема коллекции обновлена, но модель \_schema не изменена [`#1500`](https://github.com/nocobase/nocobase/pull/1500) +- Обновить zh_CN.ts [`#1481`](https://github.com/nocobase/nocobase/pull/1481) +- исправлено (linkageRules): поддерживается пустое условие [`#1496`](https://github.com/nocobase/nocobase/pull/1496) +- исправлено: правила привязки форм/ кнопок [`#1456`](https://github.com/nocobase/nocobase/pull/1456) +- исправлено: импортер коллекций указал неверную ссылку [`#1495`](https://github.com/nocobase/nocobase/pull/1495) +- исправлено: поддержка развертывания пользовательского плагина в dockerfile [`#1494`](https://github.com/nocobase/nocobase/pull/1494) +- исправлено: переменные среды [`#1490`](https://github.com/nocobase/nocobase/pull/1490) +- исправлено: метод подготовки базы данных [`#1492`](https://github.com/nocobase/nocobase/pull/1492) +- Исправлено/запрос множественной схемы [`#1488`](https://github.com/nocobase/nocobase/pull/1488) +- исправлено: нарушение строки [`#1487`](https://github.com/nocobase/nocobase/pull/1487) +- рефакторинг (плагин-рабочий процесс): перенос оценщиков [`#1485`](https://github.com/nocobase/nocobase/pull/1485) +- документы: исправление опечатки [`#1482`](https://github.com/nocobase/nocobase/pull/1482) +- исправлено(plugin-workflow): исправлен статус настраиваемого задания [`#1484`](https://github.com/nocobase/nocobase/pull/1484) +- исправлено(plugin-workflow): исправлен параметр конфигурации условия [`#1483`](https://github.com/nocobase/nocobase/pull/1483) +- исправлено (плагин-рабочий процесс): исправлена миграция [`#1479`](https://github.com/nocobase/nocobase/pull/1479) +- исправлено (плагин-рабочий процесс): исправлена миграция префикса таблицы [`#1478`](https://github.com/nocobase/nocobase/pull/1478) +- рефакторинг (плагин-формула): объединено 2 типа полей формулы в 1 [`#1457`](https://github.com/nocobase/nocobase/pull/1457) +- исправлено (plugin-workflow): исправлена миграция для расчета [`#1476`](https://github.com/nocobase/nocobase/pull/1476) +- исправлено(plugin-workflow): исправлено повторение типа номера триггера расписания [`#1475`](https://github.com/nocobase/nocobase/pull/1475) +- Инструкция по эксплуатации Feat(plugin-workflow) [`#1339`](https://github.com/nocobase/nocobase/pull/1339) +- исправлена ошибка: поддержка импорта вложений [`#1466`](https://github.com/nocobase/nocobase/pull/1466) +- исправлена ошибка: столбец не существует после поля связи с удалением [`#1465`](https://github.com/nocobase/nocobase/pull/1465) +- исправлено: добавлена схема [`#1464`](https://github.com/nocobase/nocobase/pull/1464) +- исправлено: избегайте o2o, o2m может выбирать уже выбранные данные [`#1462`](https://github.com/nocobase/nocobase/pull/1462) +- исправлено: добавление тестовых примеров [`#1463`](https://github.com/nocobase/nocobase/pull/1463) +- исправлено: обновление zh_CN.ts [`#1458`](https://github.com/nocobase/nocobase/pull/1458) +- переработан плагин для экспорта [`#1460`](https://github.com/nocobase/nocobase/pull/1460) +- Исправлена схема/pg с наследованием [`#1446`](https://github.com/nocobase/nocobase/pull/1446) +- умение: администрировать несколько приложений [`#1431`](https://github.com/nocobase/nocobase/pull/1431) +- задача: исправить ошибку плагина сборки [`#1454`](https://github.com/nocobase/nocobase/pull/1454) +- функция: укажите подчеркнутый параметр для базы данных [`#1366`](https://github.com/nocobase/nocobase/pull/1366) +- Отменить "исправление (таблица): исправлено переполнение файла (#1392)" [`#1452`](https://github.com/nocobase/nocobase/pull/1452) +- исправление (категория коллекции): дефект языка zh_cn [`#1451`](https://github.com/nocobase/nocobase/pull/1451) +- исправлено: добавлены параметры пространства имен и дубликатора для параметров коллекции [`#1449`](https://github.com/nocobase/nocobase/pull/1449) +- исправлено (поле моментального снимка): снято ограничение по глубине [`#1450`](https://github.com/nocobase/nocobase/pull/1450) +- рутинная работа: обновить URL-адрес лицензии [`#1285`](https://github.com/nocobase/nocobase/pull/1285) +- исправлено: моментальный снимок ассоциации [`#1438`](https://github.com/nocobase/nocobase/pull/1438) +- исправлено (таблица): исправлено переполнение файла [`#1392`](https://github.com/nocobase/nocobase/pull/1392) +- исправлено (плагин-последовательность): исправлено пропущенное поле createdAt в массовом подключении [`#1448`](https://github.com/nocobase/nocobase/pull/1448) +- исправлено: ошибка: 0308010C:процедуры обработки цифровых конвертов::не поддерживаются [`#1447`](https://github.com/nocobase/nocobase/pull/1447) +- исправлено: категории коллекций [`#1327`](https://github.com/nocobase/nocobase/pull/1327) +- исправлено (plugin-fm): исправлена конфигурация пути для хранилищ [`#1445`](https://github.com/nocobase/nocobase/pull/1445) +- исправлено: node.js 17+, добавлен openssl-legacy-provider [`#1434`](https://github.com/nocobase/nocobase/pull/1434) +- исправлено (плагин-workflow): исправлено расписание для нулевого значения поля [`#1442`](https://github.com/nocobase/nocobase/pull/1442) +- исправлено: поддержка схемы pg [`#1439`](https://github.com/nocobase/nocobase/pull/1439) +- исправлено (i18n): по умолчанию для разделителя ключей и ns установлено значение false [`#1432`](https://github.com/nocobase/nocobase/pull/1432) +- умение: отключать триггер при импорте коллекции [`#1417`](https://github.com/nocobase/nocobase/pull/1417) +- задача: перевести "Добавить вкладку" в заголовок страницы [`#1424`](https://github.com/nocobase/nocobase/pull/1424) +- исправлено (плагин-рабочий процесс): используйте promise для запроса [`#1426`](https://github.com/nocobase/nocobase/pull/1426) +- исправлено (acl): пользователь добавляет стратегию слияния [`#1416`](https://github.com/nocobase/nocobase/pull/1416) +- документы: обновлен URL-адрес примера G2Plot [`#1408`](https://github.com/nocobase/nocobase/pull/1408) +- документы: исправлена опечатка [`#1412`](https://github.com/nocobase/nocobase/pull/1412) +- исправлено(FixedBlock): при использовании как ассоциативных фильтров, так и FixedBlock не отображается полная таблица [`#1405`](https://github.com/nocobase/nocobase/pull/1405) +- функция (календарь): начальная и конечная даты поддерживают использование ассоциативных полей [`#1397`](https://github.com/nocobase/nocobase/pull/1397) +- исправлено: загрузка через collection перед привязкой поля belongsToMany [`#1409`](https://github.com/nocobase/nocobase/pull/1409) +- функция (плагин для проверки): поддержка sms от tencent [`#1382`](https://github.com/nocobase/nocobase/pull/1382) +- исправлено: внешние ключи доступны для редактирования при добавлении полей [`#1404`](https://github.com/nocobase/nocobase/pull/1404) +- исправлено: стиль navbar_ui [`#1398`](https://github.com/nocobase/nocobase/pull/1398) +- исправлено: наследование сортировки при запуске [`#1402`](https://github.com/nocobase/nocobase/pull/1402) +- исправлено (плагин-рабочий процесс): исправлена ширина ввода URL-адреса для конфигурации запроса [`#1401`](https://github.com/nocobase/nocobase/pull/1401) +- Исправление/моментальный снимок [`#1396`](https://github.com/nocobase/nocobase/pull/1396) +- исправление: исправлено, что коллекции наследуют фильтр [`#1394`](https://github.com/nocobase/nocobase/pull/1394) +- Исправление (плагин-последовательность): поддерживает поле последовательности в m2m через таблицу [`#1383`](https://github.com/nocobase/nocobase/pull/1383) +- исправлено (плагин-рабочий процесс): изменена позиция исполняемого оповещения [`#1381`](https://github.com/nocobase/nocobase/pull/1381) +- исправлено: через сбор отдельных записей [`#1378`](https://github.com/nocobase/nocobase/pull/1378) +- исправлено: через сбор записей не следует сбрасывать [`#1377`](https://github.com/nocobase/nocobase/pull/1377) +- функция (клиент): добавление отключенного контекста формы [`#1374`](https://github.com/nocobase/nocobase/pull/1374) +- Исправление (плагин-рабочий процесс): узел запроса [`#1367`](https://github.com/nocobase/nocobase/pull/1367) + +## Фиксы + +- документы: добавление документации по подключаемому модулю [`68511f0`](https://github.com/nocobase/nocobase/commit/68511f05bc7dbca49e0ab95eb868a193a3502d71) +- функция(db): анализатор значений полей [`5805b69`](https://github.com/nocobase/nocobase/commit/5805b69455532ad643e9c87831da985d41bc5d6d) +- основная работа (версии): 😊 публикация версии 0.9.1-альфа.1 [`946c8f2`](https://github.com/nocobase/nocobase/commit/946c8f25a3df538f4a83abe4468786cf554d8914) diff --git a/docs/ru-RU/welcome/release/v0092-changelog.md b/docs/ru-RU/welcome/release/v0092-changelog.md new file mode 100644 index 0000000000..5f2ab7c0a9 --- /dev/null +++ b/docs/ru-RU/welcome/release/v0092-changelog.md @@ -0,0 +1,133 @@ +# Версия 0.9.2: 2023-04-19 + +## Объединено + +- рефакторинг (плагин-рабочий процесс): изменение единой формы на пользовательский блок форм [`#1707`](https://github.com/nocobase/nocobase/pull/1707) +- рутинная работа (ci): добавлена настройка тайм-аута для заданий [`#1725`](https://github.com/nocobase/nocobase/pull/1725) +- рефакторинг (плагин-рабочий процесс): перенос пунктов меню в опции [`#1724`](https://github.com/nocobase/nocobase/pull/1724) +- исправлено (клиент): исправлена ошибка при очистке значения при вводе переменной [`#1723`](https://github.com/nocobase/nocobase/pull/1723) +- исправлено (средство выбора записей): исправлена проблема с подкачкой таблицы [`#1718`](https://github.com/nocobase/nocobase/pull/1718) +- исправлено (map-plugin): некоторые данные неверны [`#1717`](https://github.com/nocobase/nocobase/pull/1717) +- исправлено: область действия данных не отображается в gantt [`#1716`](https://github.com/nocobase/nocobase/pull/1716) +- исправлено: загрузка кнопки не исчезала, когда операция отправки завершалась ошибкой [`#1698`](https://github.com/nocobase/nocobase/pull/1698) +- исправлено (правило привязки): ошибка при выполнении условия множественного выбора [`#1715`](https://github.com/nocobase/nocobase/pull/1715) +- Исправить/сохранить с помощью табличных данных [`#1714`](https://github.com/nocobase/nocobase/pull/1714) +- функция: улучшение дизайна пользовательского интерфейса для действия привязки [`#1659`](https://github.com/nocobase/nocobase/pull/1659) +- функция (карта): поддержка фильтрации других блоков [`#1691`](https://github.com/nocobase/nocobase/pull/1691) +- рефакторинг: улучшено включение правила привязки [`#1700`](https://github.com/nocobase/nocobase/pull/1700) +- исправлено: поиск полей с параметром [`#1710`](https://github.com/nocobase/nocobase/pull/1710) +- исправлена ошибка (блок форм): шаблоны данных [`#1704`](https://github.com/nocobase/nocobase/pull/1704) +- исправлено: не удалось определить состояние данных о взаимосвязи [`#1681`](https://github.com/nocobase/nocobase/pull/1681) +- исправлено (gantt): проверка прав доступа к обновлению в блоке gantt [`#1701`](https://github.com/nocobase/nocobase/pull/1701) +- исправлено: clearFormGraph [`#1706`](https://github.com/nocobase/nocobase/pull/1706) +- исправлено (плагин-рабочий процесс): исправлен компонент переменной тела запроса [`#1703`](https://github.com/nocobase/nocobase/pull/1703) +- исправлено (Гантт): улучшен текст на панели задач [`#1696`](https://github.com/nocobase/nocobase/pull/1696) +- исправлено: длинный текст должен быть переведен на другую строку [`#1686`](https://github.com/nocobase/nocobase/pull/1686) +- исправлено: не удается отобразить данные при удалении последней страницы, а на странице только один элемент [`#1685`](https://github.com/nocobase/nocobase/pull/1685) +- исправлено: мета-acl с ассоциативным запросом [`#1695`](https://github.com/nocobase/nocobase/pull/1695) +- исправлено: заголовок правила привязки не может быть пустым [`#1688`](https://github.com/nocobase/nocobase/pull/1688) +- подвиг: улучшение интерфейса менеджера плагинов [`#1650`](https://github.com/nocobase/nocobase/pull/1650) +- подвиг: блок Ганта [`#1393`](https://github.com/nocobase/nocobase/pull/1393) +- исправление (клиент): исправлена потеря фокуса при постоянном вводе переменной [`#1689`](https://github.com/nocobase/nocobase/pull/1689) +- функция (плагин-рабочий процесс): добавлен регистратор для конкретного рабочего процесса [`#1677`](https://github.com/nocobase/nocobase/pull/1677) +- исправлено: удален конструктор [`#1684`](https://github.com/nocobase/nocobase/pull/1684) +- тест: должен быть загружен файл .env.test [`#1678`](https://github.com/nocobase/nocobase/pull/1678) +- исправлено: неправильный язык после выхода из системы [`#1679`](https://github.com/nocobase/nocobase/pull/1679) +- исправлено: оптимизация сбора файлов [`#1666`](https://github.com/nocobase/nocobase/pull/1666) +- исправлено: повышение производительности при сортировке полей [`#1675`](https://github.com/nocobase/nocobase/pull/1675) +- исправлено (плагин-рабочий процесс): исправлены пустые поля для сбора данных [`#1674`](https://github.com/nocobase/nocobase/pull/1674) +- исправлено (клиент): исправлен режим чтения переменных компонента pretty mode [`#1673`](https://github.com/nocobase/nocobase/pull/1673) +- исправлена проблема с пользовательским интерфейсом в компактной теме [`#1670`](https://github.com/nocobase/nocobase/pull/1670) +- исправлено: правило привязки активировало эффект в форме [`#1669`](https://github.com/nocobase/nocobase/pull/1669) +- исправлено: краткое описание шаблона коллекции [`#1672`](https://github.com/nocobase/nocobase/pull/1672) +- функция: (плагин-рабочий процесс) динамическое выражение [`#1560`](https://github.com/nocobase/nocobase/pull/1560) +- основная задача: найти предупреждение о наследовании коллекции [`#1663`](https://github.com/nocobase/nocobase/pull/1663) +- исправлено: при настройке заголовка правила привязки устраняется исключение [`#1665`](https://github.com/nocobase/nocobase/pull/1665) +- функция: поддержка фильтра tableoid [`#1657`](https://github.com/nocobase/nocobase/pull/1657) +- функция (плагин-рабочий процесс): добавление поддержки сопоставления массивов в процессоре [`#1662`](https://github.com/nocobase/nocobase/pull/1662) +- исправлено (плагин-рабочий процесс): исправлено добавление null к триггеру сбора [`#1661`](https://github.com/nocobase/nocobase/pull/1661) +- функция (операторы фильтров): операторы eq и ne поддерживают массив [`#1658`](https://github.com/nocobase/nocobase/pull/1658) +- исправление (плагин-рабочий процесс): исправлена загрузка данных в ящик задач [`#1656`](https://github.com/nocobase/nocobase/pull/1656) +- рефакторинг (клиент): улучшение перевода [`#1654`](https://github.com/nocobase/nocobase/pull/1654) +- исправление: исправлено исчезновение кнопки "Добавить пункт меню" [`#1655`](https://github.com/nocobase/nocobase/pull/1655) +- основная задача: добавить новую конфигурацию allowAddtoCurrent [`#1652`](https://github.com/nocobase/nocobase/pull/1652) +- функция: поддержка сбора файлов [`#1636`](https://github.com/nocobase/nocobase/pull/1636) +- исправление (plugin-workflow): исправлена ручная настройка узла [`#1653`](https://github.com/nocobase/nocobase/pull/1653) +- рутинная работа: унаследованный api с разностной схемой [`#1545`](https://github.com/nocobase/nocobase/pull/1545) +- исправление: при выборе записи не удается включить дочернюю коллекцию [`#1649`](https://github.com/nocobase/nocobase/pull/1649) +- исправление: плагин перед включением хука [`#1648`](https://github.com/nocobase/nocobase/pull/1648) +- рутинная работа: добавить транзакцию в действие поля set [`#1647`](https://github.com/nocobase/nocobase/pull/1647) +- исправление (правило привязки): правило привязки не отображается в действии [`#1644`](https://github.com/nocobase/nocobase/pull/1644) +- переработать: просмотреть параметры коллекции [`#1643`](https://github.com/nocobase/nocobase/pull/1643) +- исправить: ошибка обновления поля [`#1645`](https://github.com/nocobase/nocobase/pull/1645) +- функция (таблица): правила привязки действий в столбце [`#1638`](https://github.com/nocobase/nocobase/pull/1638) +- исправлено (просмотр-коллекция): имя поля не может быть изменено, если оно используется с источником поля [`#1642`](https://github.com/nocobase/nocobase/pull/1642) +- исправлено: для вступления в силу правил закрытия конфигурации правила привязки требуют повторного открытия формы [`#1640`](https://github.com/nocobase/nocobase/pull/1640) +- рефакторинг (клиент): измените переменную.Текстовое поле преобразуется в управляемый компонент [`#1605`](https://github.com/nocobase/nocobase/pull/1605) +- исправлено: получить значение pg view def [`#1641`](https://github.com/nocobase/nocobase/pull/1641) +- исправлено: вывод типа столбца просмотра с псевдонимом [`#1634`](https://github.com/nocobase/nocobase/pull/1634) +- исправлено (плагин-рабочий процесс): исправлены незначительные проблемы с пользовательским интерфейсом [`# 1635`](https://github.com/nocobase/nocobase/pull/1635) +- рутинная работа: отключено подчеркивание в коллекции представлений. [`#1633`](https://github.com/nocobase/nocobase/pull/1633) +- исправлено: область перетаскивания формы слишком велика [`# 1628`](https://github.com/nocobase/nocobase/pull/1628) +- исправлено: пользовательский интерфейс, связанный с фиксированными блоками [`# 1632`](https://github.com/nocobase/nocobase/pull/1632) +- исправлено: коллекция представлений базы данных [`#1587`](https://github.com/nocobase/nocobase/pull/1587) +- исправлено: ввод значения сортировки в поле сортировки с помощью scopeKey [`#1626`](https://github.com/nocobase/nocobase/pull/1626) +- стиль: улучшен стиль правила привязки [`#1625`](https://github.com/nocobase/nocobase/pull/1625) +- исправлено: поиск по атрибутам и группировка [`#1411`](https://github.com/nocobase/nocobase/pull/1411) +- документы: преобразование ссылки на видео в тег видео [`#1414`](https://github.com/nocobase/nocobase/pull/1414) +- функция (синтаксический анализ переменных): поддержка синтаксического анализа переменных в параметрах фильтра [`#1558`](https://github.com/nocobase/nocobase/pull/1558) +- исправлено (правила привязки): поддержка именования, включения и выключения, копирования и присвоения нулевых значений [`#1511`](https://github.com/nocobase/nocobase/pull/1511) +- основная задача: обновить тестовый ci [`#1622`](https://github.com/nocobase/nocobase/pull/1622) +- исправлено: кнопка добавления новой истории не поддерживает включение дочерней коллекции [`#1536`](https://github.com/nocobase/nocobase/pull/1536) +- исправлено/(linkages-action): подробный блок действий не поддерживает правила привязки [`#1504`](https://github.com/nocobase/nocobase/pull/1504) +- исправлено: во всплывающем окне не работает фиксированная высота блока [`#1621`](https://github.com/nocobase/nocobase/pull/1621) +- исправлено: когда на странице установлен фиксированный блок, таблица всплывающих окон не отображается [`#1619`](https://github.com/nocobase/nocobase/pull/1619) +- функция: ассоциация-фильтр-улучшение [`#1606`](https://github.com/nocobase/nocobase/pull/1606) +- исправление (таблица): невозможно отобразить данные таблицы [`#1617`](https://github.com/nocobase/nocobase/pull/1617) +- исправление (плагин-рабочий процесс): исправлена форма списка дел, которая удобна для чтения пользователю, не назначенному пользователем [`#1615`](https://github.com/nocobase/nocobase/pull/1615) +- функция (таблица): скрытая разбивка на страницы, когда доступна только одна страница [`#1614`](https://github.com/nocobase/nocobase/pull/1614) +- рефакторинг: улучшена производительность фиксированного блока [`#1593`](https://github.com/nocobase/nocobase/pull/1593) +- исправлено (менеджер коллекций): бесконечная рекурсия [`#1608`](https://github.com/nocobase/nocobase/pull/1608) +- исправлено (журналы аудита): добавлено многоточие в столбцы таблицы [`#1603`](https://github.com/nocobase/nocobase/pull/1603) +- улучшен пользовательский интерфейс для ассоциативных данных, который не содержит ссылок [`#1602`](https://github.com/nocobase/nocobase/pull/1602) +- улучшен (канбан): карта поддерживает открытый режим [`#1601`](https://github.com/nocobase/nocobase/pull/1601) +- исправлено (импортируемое поле): некорректное отображение при перемещении дескриптора сортировки [`#1613`](https://github.com/nocobase/nocobase/pull/1613) +- исправлено: включение сохранения дочерних коллекций после удаления дочерней коллекции [`#1610`](https://github.com/nocobase/nocobase/pull/1610) +- исправлено: удаление записи таблицы, ссылающейся на таблицу коллекций [`#1611`](https://github.com/nocobase/nocobase/pull/1611) +- исправление (plugin-workflow): добавлено значение действий по умолчанию для узла вручную [`#1600`](https://github.com/nocobase/nocobase/pull/1600) +- функция(plugin-workflow): добавлена опция failOnEmpty для узла запроса [`#1599`](https://github.com/nocobase/nocobase/pull/1599) +- исправлено (плагин-рабочий процесс): используйте toJSON вместо get для получения корректного результата [`#1596`](https://github.com/nocobase/nocobase/pull/1596) +- Перевод pt-BR (бразильский португальский) [`#1591`](https://github.com/nocobase/nocobase/pull/1591) +- исправлено: разрешение роли добавило новую область отображения пустой [`#1592`](https://github.com/nocobase/nocobase/pull/1592) +- исправлено (FixedBlock): предотвращение запуска канбана при программной прокрутке [`#1406`](https://github.com/nocobase/nocobase/pull/1406) +- исправлено: повторяющиеся категории запросов при переключении между графическим интерфейсом и коллекцией и полями [`#1590`](https://github.com/nocobase/nocobase/pull/1590) +- исправлено: collectionFieldsOptions не может получить все поля [`#1588`](https://github.com/nocobase/nocobase/pull/1588) +- исправление (плагин-рабочий процесс): исправлена ширина ввода в конфигурации узла запроса [`#1585`](https://github.com/nocobase/nocobase/pull/1585) +- функция (блоки фильтров): поддержка блоков фильтров [`#1505`](https://github.com/nocobase/nocobase/pull/1505) +- рефакторинг: поддержка нескольких приложений [`#1578`](https://github.com/nocobase/nocobase/pull/1578) +- функция: компактная тема [`#1574`](https://github.com/nocobase/nocobase/pull/1574) +- функция: поддержка поля cron [`#1421`](https://github.com/nocobase/nocobase/pull/1421) +- исправлено (календарь): чтобы получить правильный инициализатор сетки при добавлении нового... [`#1425`](https://github.com/nocobase/nocobase/pull/1425) +- функция (markdown): поддержка русалки и улучшенный стиль [`#1583`](https://github.com/nocobase/nocobase/pull/1583) +- исправление (плагин-карта): повторяется блок карты [`#1582`](https://github.com/nocobase/nocobase/pull/1582) +- функция: сбор дерева [`#1561`](https://github.com/nocobase/nocobase/pull/1561) +- функция (плагин-карта): добавление блока карты [`#1486`](https://github.com/nocobase/nocobase/pull/1486) +- рутинная работа: отложенная загрузка дополнительного приложения в общую коллекцию [`#1569`](https://github.com/nocobase/nocobase/pull/1569) +- исправлено (средство выбора записей): поддерживается добавление записей во вложенную коллекцию [`#1573`](https://github.com/nocobase/nocobase/pull/1573) +- исправлено: перезагрузка менеджера приложений [`#1565`](https://github.com/nocobase/nocobase/pull/1565) +- исправлено: плагин для совместного использования нескольких приложений [`#1562`](https://github.com/nocobase/nocobase/pull/1562) +- функция: поддержка выбора записей для включения ссылок [`#1515`](https://github.com/nocobase/nocobase/pull/1515) +- функция: несколько приложений [`#1540`](https://github.com/nocobase/nocobase/pull/1540) +- документы (клиент): добавлена переменная docs [`#1556`](https://github.com/nocobase/nocobase/pull/1556) +- исправлено (графики): улучшен предварительный просмотр таблицы диаграмм с использованием типа объекта [`#1555`](https://github.com/nocobase/nocobase/pull/1555) +- исправлена возможность настройки (plugin-workflow) ассоциаций предварительной загрузки в триггерах и узлах [`#1548`](https://github.com/nocobase/nocobase/pull/1548) + +## Исправлено + +- исправлено (плагин-workflow): исправлена форма списка дел, которая была бы удобна для чтения пользователю, не назначенному пользователем (#1615) [`#1572`](https://github.com/nocobase/nocobase/issues/1572) + +## Фиксы + +- основная работа (версии): 😊 публикация версии 0.9.2-альфа.1 [`d1adc9d`](https://github.com/nocobase/nocobase/commit/d1adc9de0b87b896e90c81c226646b840309c240) +- исправление (файловый менеджер): обновление версии s3 [`50183b0`](https://github.com/nocobase/nocobase/commit/50183b065d32be5d2f6590bfb0c6190fafc12881) +- исправлено: правило привязки [`b8776fe`](https://github.com/nocobase/nocobase/commit/b8776fe2d0fd6729c18b968d9f7b15e7c81c4ef2) diff --git a/docs/ru-RU/welcome/release/v0093-changelog.md b/docs/ru-RU/welcome/release/v0093-changelog.md new file mode 100644 index 0000000000..9eb66084b5 --- /dev/null +++ b/docs/ru-RU/welcome/release/v0093-changelog.md @@ -0,0 +1,133 @@ +# Версия 0.9.3: 2023-05-11 + +## Объединено + +- рефакторинг (плагин-рабочий процесс): изменение единой формы на пользовательский блок форм [`#1707`](https://github.com/nocobase/nocobase/pull/1707) +- рутинная работа (ci): добавлена настройка тайм-аута для заданий [`#1725`](https://github.com/nocobase/nocobase/pull/1725) +- рефакторинг (плагин-рабочий процесс): перенос пунктов меню в опции [`#1724`](https://github.com/nocobase/nocobase/pull/1724) +- исправлено (клиент): исправлена ошибка при очистке значения при вводе переменной [`#1723`](https://github.com/nocobase/nocobase/pull/1723) +- исправлено (средство выбора записей): исправлена проблема с подкачкой таблицы [`#1718`](https://github.com/nocobase/nocobase/pull/1718) +- исправлено (map-plugin): некоторые данные неверны [`#1717`](https://github.com/nocobase/nocobase/pull/1717) +- исправлено: область действия данных не отображается в gantt [`#1716`](https://github.com/nocobase/nocobase/pull/1716) +- исправлено: загрузка кнопки не исчезала, когда операция отправки завершалась ошибкой [`#1698`](https://github.com/nocobase/nocobase/pull/1698) +- исправлено (правило привязки): ошибка при выполнении условия множественного выбора [`#1715`](https://github.com/nocobase/nocobase/pull/1715) +- Исправить/сохранить с помощью табличных данных [`#1714`](https://github.com/nocobase/nocobase/pull/1714) +- функция: улучшение дизайна пользовательского интерфейса для действия привязки [`#1659`](https://github.com/nocobase/nocobase/pull/1659) +- функция (карта): поддержка фильтрации других блоков [`#1691`](https://github.com/nocobase/nocobase/pull/1691) +- рефакторинг: улучшено включение правила привязки [`#1700`](https://github.com/nocobase/nocobase/pull/1700) +- исправлено: поиск полей с параметром [`#1710`](https://github.com/nocobase/nocobase/pull/1710) +- исправлена ошибка (блок форм): шаблоны данных [`#1704`](https://github.com/nocobase/nocobase/pull/1704) +- исправлено: не удалось определить состояние данных о взаимосвязи [`#1681`](https://github.com/nocobase/nocobase/pull/1681) +- исправлено (gantt): проверка прав доступа к обновлению в блоке gantt [`#1701`](https://github.com/nocobase/nocobase/pull/1701) +- исправлено: clearFormGraph [`#1706`](https://github.com/nocobase/nocobase/pull/1706) +- исправлено (плагин-рабочий процесс): исправлен компонент переменной тела запроса [`#1703`](https://github.com/nocobase/nocobase/pull/1703) +- исправлено (Гантт): улучшен текст панели задач [`#1696`](https://github.com/nocobase/nocobase/pull/1696) +- исправлено: длинный текст должен быть переведен в строку [`#1686`](https://github.com/nocobase/nocobase/pull/1686) +- исправлено: не удается отобразить данные при удалении последней страницы, а на странице только один элемент [`#1685`](https://github.com/nocobase/nocobase/pull/1685) +- исправлено: мета-acl с ассоциативным запросом [`#1695`](https://github.com/nocobase/nocobase/pull/1695) +- исправлено: заголовок правила привязки не может быть пустым [`#1688`](https://github.com/nocobase/nocobase/pull/1688) +- исправлено: улучшен пользовательский интерфейс менеджера плагинов [`#1650`](https://github.com/nocobase/nocobase/pull/1650) +- подвиг: блок Ганта [`#1393`](https://github.com/nocobase/nocobase/pull/1393) +- исправление (клиент): исправлена потеря фокуса при постоянном вводе переменной [`#1689`](https://github.com/nocobase/nocobase/pull/1689) +- функция (плагин-рабочий процесс): добавлен регистратор для конкретного рабочего процесса [`#1677`](https://github.com/nocobase/nocobase/pull/1677) +- исправлено: удален конструктор [`#1684`](https://github.com/nocobase/nocobase/pull/1684) +- тест: должен быть загружен файл .env.test [`#1678`](https://github.com/nocobase/nocobase/pull/1678) +- исправлено: неправильный язык после выхода из системы [`#1679`](https://github.com/nocobase/nocobase/pull/1679) +- улучшение: оптимизация сбора файлов [`#1666`](https://github.com/nocobase/nocobase/pull/1666) +- исправлено: поле сортировки при запуске [`#1675`](https://github.com/nocobase/nocobase/pull/1675) +- исправлено (плагин-рабочий процесс): исправлены поля сбора пустых данных [`#1674`](https://github.com/nocobase/nocobase/pull/1674) +- исправлено (клиент): исправлен режим чтения переменной компонента pretty mode [`#1673`](https://github.com/nocobase/nocobase/pull/1673) +- исправлено: проблема с пользовательским интерфейсом в компактной теме [`# 1670`](https://github.com/nocobase/nocobase/pull/1670) +- исправлено: включение эффекта правила привязки в форме [`# 1669`](https://github.com/nocobase/nocobase/pull/1669) +- исправлено: краткое описание шаблона коллекции [`#1672`](https://github.com/nocobase/nocobase/pull/1672) +- функция: динамическое выражение (плагин-рабочий процесс) [`#1560`](https://github.com/nocobase/nocobase/pull/1560) +- задача: найти предупреждение о наследовании коллекции [`#1663`](https://github.com/nocobase/nocobase/pull/1663) +- исправлено: при настройке заголовка правила привязки устранялось исключение [`#1665`](https://github.com/nocobase/nocobase/pull/1665) +- функция: поддержка фильтра tableoid [`#1657`](https://github.com/nocobase/nocobase/pull/1657) +- функция (плагин-рабочий процесс): добавление поддержки сопоставления массивов в процессоре [`#1662`](https://github.com/nocobase/nocobase/pull/1662) +- исправлено (плагин-рабочий процесс): исправлено добавление null к триггеру сбора [`#1661`](https://github.com/nocobase/nocobase/pull/1661) +- функция (операторы фильтров): операторы eq и ne поддерживают массив [`#1658`](https://github.com/nocobase/nocobase/pull/1658) +- исправление (плагин-рабочий процесс): исправлена загрузка данных в ящик задач [`#1656`](https://github.com/nocobase/nocobase/pull/1656) +- рефакторинг (клиент): улучшен перевод [`#1654`](https://github.com/nocobase/nocobase/pull/1654) +- исправлено: исправлена ошибка, из-за которой кнопка "Добавить пункт меню" исчезла ['#1655'](https://github.com/nocobase/nocobase/pull/1655) +- основная задача: добавить новую конфигурацию allowAddtoCurrent [`#1652`](https://github.com/nocobase/nocobase/pull/1652) +- функция: поддержка сбора файлов [`#1636`](https://github.com/nocobase/nocobase/pull/1636) +- исправление (plugin-workflow): исправлена ручная настройка узла [`#1653`](https://github.com/nocobase/nocobase/pull/1653) +- рутинная работа: унаследованный api с разностной схемой [`#1545`](https://github.com/nocobase/nocobase/pull/1545) +- исправлено: при выборе записи не удается включить дочернюю коллекцию [`#1649`](https://github.com/nocobase/nocobase/pull/1649) +- умение: подключать плагин перед включением перехвата [`#1648`](https://github.com/nocobase/nocobase/pull/1648) +- рутинная работа: добавить транзакцию в поле set action [`#1647`](https://github.com/nocobase/nocobase/pull/1647) +- исправлено (правило привязки): правило привязки не отображается в действии [`#1644`](https://github.com/nocobase/nocobase/pull/1644) +- переработка: просмотр параметров коллекции [`#1643`](https://github.com/nocobase/nocobase/pull/1643) +- исправлено: ошибка при обновлении поля [`#1645`](https://github.com/nocobase/nocobase/pull/1645) +- функция (таблица): действие в столбце поддерживает правила привязки [`#1638`](https://github.com/nocobase/nocobase/pull/1638) +- исправлено (просмотр-коллекция): имя поля не может быть изменено, если оно используется с источником поля [`#1642`](https://github.com/nocobase/nocobase/pull/1642) +- исправлено: для вступления в силу правил закрытия конфигурации правила привязки требуют повторного открытия формы [`#1640`](https://github.com/nocobase/nocobase/pull/1640) +- рефакторинг (клиент): измените переменную.Текстовое поле преобразуется в управляемый компонент [`#1605`](https://github.com/nocobase/nocobase/pull/1605) +- исправлено: получить значение pg view def [`#1641`](https://github.com/nocobase/nocobase/pull/1641) +- исправлено: вывод типа столбца просмотра с псевдонимом [`#1634`](https://github.com/nocobase/nocobase/pull/1634) +- исправлено (плагин-рабочий процесс): исправлены незначительные проблемы с пользовательским интерфейсом [`# 1635`](https://github.com/nocobase/nocobase/pull/1635) +- рутинная работа: отключено подчеркивание в коллекции представлений. [`#1633`](https://github.com/nocobase/nocobase/pull/1633) +- исправлено: область перетаскивания действия формы слишком велика [`# 1628`](https://github.com/nocobase/nocobase/pull/1628) +- исправлено: пользовательский интерфейс, связанный с исправленными блоками [`#1632`](https://github.com/nocobase/nocobase/pull/1632) +- подвиг: коллекция просмотров базы данных [`#1587`](https://github.com/nocobase/nocobase/pull/1587) +- исправлено: ввод значения сортировки в поле сортировки с помощью scopeKey [`#1626`](https://github.com/nocobase/nocobase/pull/1626) +- стиль: улучшен стиль правила привязки [`#1625`](https://github.com/nocobase/nocobase/pull/1625) +- исправлено: поиск по атрибутам и группировка [`#1411`](https://github.com/nocobase/nocobase/pull/1411) +- документы: преобразование ссылки на видео в тег видео [`#1414`](https://github.com/nocobase/nocobase/pull/1414) +- функция (parse-variables): поддержка синтаксического анализа переменных в параметрах фильтра [`#1558`](https://github.com/nocobase/nocobase/pull/1558) +- исправлено (правила привязки): поддержка именования, включения и выключения, копирования и присвоения нулевых значений [`#1511`](https://github.com/nocobase/nocobase/pull/1511) +- основная задача: обновить тестовый ci [`#1622`](https://github.com/nocobase/nocobase/pull/1622) +- исправлено: кнопка добавления новой истории не поддерживает включение дочерней коллекции [`#1536`](https://github.com/nocobase/nocobase/pull/1536) +- исправлено/(linkages-action): подробный блок действий не поддерживает правила привязки [`#1504`](https://github.com/nocobase/nocobase/pull/1504) +- исправлено: во всплывающем окне не работает фиксированная высота блока [`#1621`](https://github.com/nocobase/nocobase/pull/1621) +- исправлено: когда на странице установлен фиксированный блок, таблица всплывающих окон не отображается [`#1619`](https://github.com/nocobase/nocobase/pull/1619) +- функция: ассоциация-фильтр-улучшение [`#1606`](https://github.com/nocobase/nocobase/pull/1606) +- исправлено(таблица): не удается отобразить данные таблицы [`#1617`](https://github.com/nocobase/nocobase/pull/1617) +- исправление (плагин-рабочий процесс): исправлена форма списка дел, которая удобна для чтения пользователю, не назначенному пользователем [`#1615`](https://github.com/nocobase/nocobase/pull/1615) +- функция (таблица): скрытая разбивка на страницы, когда доступна только одна страница [`#1614`](https://github.com/nocobase/nocobase/pull/1614) +- рефакторинг: улучшена производительность фиксированного блока [`#1593`](https://github.com/nocobase/nocobase/pull/1593) +- исправлено (менеджер коллекций): бесконечная рекурсия [`#1608`](https://github.com/nocobase/nocobase/pull/1608) +- исправлено (журналы аудита): добавлено многоточие в столбцы таблицы [`#1603`](https://github.com/nocobase/nocobase/pull/1603) +- улучшен пользовательский интерфейс для ассоциативных данных, который не содержит ссылок [`#1602`](https://github.com/nocobase/nocobase/pull/1602) +- улучшен (канбан): карта поддерживает открытый режим [`#1601`](https://github.com/nocobase/nocobase/pull/1601) +- исправлено (импортируемое поле): некорректное отображение при перемещении дескриптора сортировки [`#1613`](https://github.com/nocobase/nocobase/pull/1613) +- исправлено: включение сохранения дочерних коллекций после удаления дочерней коллекции [`#1610`](https://github.com/nocobase/nocobase/pull/1610) +- исправлено: удаление записи таблицы, ссылающейся на таблицу коллекций [`#1611`](https://github.com/nocobase/nocobase/pull/1611) +- исправление (plugin-workflow): добавлено значение действий по умолчанию для узла вручную [`#1600`](https://github.com/nocobase/nocobase/pull/1600) +- функция(plugin-workflow): добавлена опция failOnEmpty для узла запроса [`#1599`](https://github.com/nocobase/nocobase/pull/1599) +- исправлено (плагин-рабочий процесс): используйте toJSON вместо get, чтобы получить корректный результат [`#1596`](https://github.com/nocobase/nocobase/pull/1596) +- Перевод pt-BR (бразильский португальский) [`#1591`](https://github.com/nocobase/nocobase/pull/1591) +- исправлено: в разрешении роли добавлено пустое поле для отображения новой области [`#1592`](https://github.com/nocobase/nocobase/pull/1592) +- исправлено (FixedBlock): предотвращение запуска канбана при программной прокрутке [`#1406`](https://github.com/nocobase/nocobase/pull/1406) +- исправлено: повторение категорий запросов при переключении между графическим интерфейсом и коллекцией и полями [`#1590`](https://github.com/nocobase/nocobase/pull/1590) +- исправлено: collectionFieldsOptions не может получить все поля [`#1588`](https://github.com/nocobase/nocobase/pull/1588) +- исправление (плагин-рабочий процесс): исправлена ширина ввода в конфигурации узла запроса [`#1585`](https://github.com/nocobase/nocobase/pull/1585) +- функция (блоки фильтров): поддержка блоков фильтров [`#1505`](https://github.com/nocobase/nocobase/pull/1505) +- рефакторинг: поддержка нескольких приложений [`#1578`](https://github.com/nocobase/nocobase/pull/1578) +- функция: компактная тема [`#1574`](https://github.com/nocobase/nocobase/pull/1574) +- функция: поддержка поля cron [`#1421`](https://github.com/nocobase/nocobase/pull/1421) +- исправлено (календарь): чтобы получить правильный инициализатор сетки при добавлении нового... [`#1425`](https://github.com/nocobase/nocobase/pull/1425) +- функция (markdown): поддержка русалки и улучшенный стиль [`#1583`](https://github.com/nocobase/nocobase/pull/1583) +- исправление (плагин-карта): повторяется блок карты [`#1582`](https://github.com/nocobase/nocobase/pull/1582) +- функция: сбор дерева [`#1561`](https://github.com/nocobase/nocobase/pull/1561) +- функция (плагин-карта): добавление блока карты [`#1486`](https://github.com/nocobase/nocobase/pull/1486) +- рутинная работа: отложенная загрузка дополнительного приложения в коллекции общего доступа [`# 1569`](https://github.com/nocobase/nocobase/pull/1569) +- исправление (средство выбора записей): поддержка добавления записей во вложенную коллекцию [`# 1573`](https://github.com/nocobase/nocobase/pull/1573) +- исправлено: перезагрузка менеджера приложений [`#1565`](https://github.com/nocobase/nocobase/pull/1565) +- исправлено: плагин для совместного использования нескольких приложений [`#1562`](https://github.com/nocobase/nocobase/pull/1562) +- функция: поддержка выбора записей для включения ссылок [`#1515`](https://github.com/nocobase/nocobase/pull/1515) +- функция: несколько приложений [`#1540`](https://github.com/nocobase/nocobase/pull/1540) +- документы (клиент): добавлена переменная docs [`#1556`](https://github.com/nocobase/nocobase/pull/1556) +- исправлено (графики): улучшен предварительный просмотр таблицы диаграмм с использованием типа объекта [`#1555`](https://github.com/nocobase/nocobase/pull/1555) +- функция настройки (plugin-workflow) для предварительной загрузки ассоциаций в триггерах и узлах [`#1548`](https://github.com/nocobase/nocobase/pull/1548) + +## Исправлено + +- исправление (плагин-рабочий процесс): исправлена форма списка дел, которая была удобна для чтения пользователю, не назначенному пользователем (#1615) [`#1572`](https://github.com/nocobase/nocobase/issues/1572) + +## Фиксы + +- основная работа (версии): 😊 публикация версии 0.9.2-альфа.1 [`d1adc9d`](https://github.com/nocobase/nocobase/commit/d1adc9de0b87b896e90c81c226646b840309c240) +- исправление (файловый менеджер): обновление версии s3 [`50183b0`](https://github.com/nocobase/nocobase/commit/50183b065d32be5d2f6590bfb0c6190fafc12881) +- исправлено: правило привязки [`b8776fe`](https://github.com/nocobase/nocobase/commit/b8776fe2d0fd6729c18b968d9f7b15e7c81c4ef2) diff --git a/docs/ru-RU/welcome/release/v0094-changelog.md b/docs/ru-RU/welcome/release/v0094-changelog.md new file mode 100644 index 0000000000..2dbe1f03b0 --- /dev/null +++ b/docs/ru-RU/welcome/release/v0094-changelog.md @@ -0,0 +1,67 @@ +# Версия 0.9.4: 2023-05-25 + +## Объединено + +- задача: загрузить коллекцию просмотров, если источник не найден [`#1930`](https://github.com/nocobase/nocobase/pull/1930) +- функция (шаблон данных): поддержка настройки объема данных и заголовка поля [`#1918`](https://github.com/nocobase/nocobase/pull/1918) +- функция (шаблон данных): поддержка неограниченного количества уровней выбора полей [`#1910`](https://github.com/nocobase/nocobase/pull/1910) +- рутинная работа: при использовании ассоциативного поля в режиме выбора его размер может быть изменен [`#1926`](https://github.com/nocobase/nocobase/pull/1926) +- исправлено (ConfigurationTabs): не допускалась ошибка [`#1782`](https://github.com/nocobase/nocobase/pull/1782) +- исправлено: поле таблицы запрашивало данные при добавлении дочернего действия [`#1876`](https://github.com/nocobase/nocobase/pull/1876) +- рефакторинг: интерфейсное тестирование с помощью vitest [`#1900`](https://github.com/nocobase/nocobase/pull/1900) +- исправление: отключение всплывающей кнопки в add-modal [`#1808`](https://github.com/nocobase/nocobase/pull/1808) +- исправлено: добавлено добавление параметров ресурса acl [`#1923`](https://github.com/nocobase/nocobase/pull/1923) +- исправлено: обновление guard с массивом, содержащим null [`#1922`](https://github.com/nocobase/nocobase/pull/1922) +- рефакторинг: инициализация при переключении компонентов поля [`#1915`](https://github.com/nocobase/nocobase/pull/1915) +- исправлено (ассоциативное поле): только после успешного создания новых данных они могут быть связаны [`#1884`](https://github.com/nocobase/nocobase/pull/1884) +- исправлено: активная загрузка с помощью пользовательского исходного ключа принадлежит многим [`#1913`](https://github.com/nocobase/nocobase/pull/1913) +- исправлено: при скрытии заголовка подчиненной формы будут скрыты все встроенные заголовки [`#1904`](https://github.com/nocobase/nocobase/pull/1904) +- исправлено: обновление значений ассоциации [`#1903`](https://github.com/nocobase/nocobase/pull/1903) +- исправлено (плагин-формула): в результате используется компонент read-pretty [`#1911`](https://github.com/nocobase/nocobase/pull/1911) +- исправлено: не удается установить значение по умолчанию при включении обязательного поля формы [`#1887`](https://github.com/nocobase/nocobase/pull/1887) +- исправление (шаблон данных): исправлена ошибка при удалении полей [`#1907`](https://github.com/nocobase/nocobase/pull/1907) +- функция (приложение): добавлена кнопка очистки кэша [`#1909`](https://github.com/nocobase/nocobase/pull/1909) +- исправлено: активная загрузка принадлежит многим ассоциациям [`#1906`](https://github.com/nocobase/nocobase/pull/1906) +- улучшена поддержка многопольных переменных [`#1680`](https://github.com/nocobase/nocobase/pull/1680) +- исправлено: добавление относится к ассоциации с полями [`#1894`](https://github.com/nocobase/nocobase/pull/1894) +- исправлено: добавлялось значение, принадлежащее ассоциации [`#1893`](https://github.com/nocobase/nocobase/pull/1893) +- исправлено: предварительно загружались реляционные данные [`#1847`](https://github.com/nocobase/nocobase/pull/1847) +- функция: поддержка перезагрузки приложения вручную [`#1889`](https://github.com/nocobase/nocobase/pull/1889) +- Рефакторинг / добавление полей [`#1883`](https://github.com/nocobase/nocobase/pull/1883) +- рутинная работа: анализатор pg sql [`#1890`](https://github.com/nocobase/nocobase/pull/1890) +- исправлено (плагин-рабочий процесс): исправлен язык [`#1886`](https://github.com/nocobase/nocobase/pull/1886) +- исправлено: обязательное поле при настройке правил сортировки [`#1885`](https://github.com/nocobase/nocobase/pull/1885) +- функция (плагин-рабочий процесс): добавляйте описание узла в панель при редактировании узла [`#1882`](https://github.com/nocobase/nocobase/pull/1882) +- исправление (плагин-рабочий процесс): исправлена переменная, вызывающая api в цикле [`#1877`](https://github.com/nocobase/nocobase/pull/1877) +- рутинная работа (github-шаблон): очистка комментариев и форматирование [`#1878`](https://github.com/nocobase/nocobase/pull/1878) +- функция (поле ассоциации): по умолчанию используются одни данные для объединения "многие" [`#1873`](https://github.com/nocobase/nocobase/pull/1873) +- исправление (плагин-рабочий процесс): исправлено название триггера, когда рабочий процесс не загружен [`#1875`](https://github.com/nocobase/nocobase/pull/1875) +- функция(плагин-рабочий процесс): aggregate [`#1852`](https://github.com/nocobase/nocobase/pull/1852) +- Подвиг/перевод es_ES [`#1801`](https://github.com/nocobase/nocobase/pull/1801) +- исправлено: данные не обновляются при изменении добавлений [`#1872`](https://github.com/nocobase/nocobase/pull/1872) +- исправлено:при очистке фильтра не выбирается связь [`#1866`](https://github.com/nocobase/nocobase/pull/1866) +- исправлено (acl): проблема с повторяющимся полем createdById [`#1871`](https://github.com/nocobase/nocobase/pull/1871) +- функция (клиент): разрешить поиск по названию в выборе коллекции [`#1869`](https://github.com/nocobase/nocobase/pull/1869) +- рутинная работа: пропустить создание отдельного приложения для развертывания [`#1868`](https://github.com/nocobase/nocobase/pull/1868) +- исправлено (plugin-workflow): убрана ненужная опция контекста [`#1867`](https://github.com/nocobase/nocobase/pull/1867) +- исправлено: поля наследования фильтруют поля внешнего ключа [`#1864`](https://github.com/nocobase/nocobase/pull/1864) +- исправлена ошибка (плагин-рабочий процесс): цикл [`#1787`](https://github.com/nocobase/nocobase/pull/1787) +- исправлено: вставка рядом не находит [`#1861`](https://github.com/nocobase/nocobase/pull/1861) +- рефакторинг (добавление нового):поле ассоциации, добавление новой кнопки поддержки, редактирование [`#1854`](https://github.com/nocobase/nocobase/pull/1854) +- подвиг: список поддержки и блокировка карты Grid [`#1753`](https://github.com/nocobase/nocobase/pull/1753) +- исправлено: исправлено, что в поле множественного выбора не отображался переключатель "Разрешить множественный выбор" ['#1857'](https://github.com/nocobase/nocobase/pull/1857) +- исправлено: поле для ввода типа интерфейса вложения без добавления [`#1856`](https://github.com/nocobase/nocobase/pull/1856) +- исправлено: ошибка действия при удалении поля [`#1849`](https://github.com/nocobase/nocobase/pull/1849) +- исправлено: поддержка запуска отдельного дополнительного приложения [`# 1853`](https://github.com/nocobase/nocobase/pull/1853) +- исправлено: присвоение полю значения удалить поле [`#1850`](https://github.com/nocobase/nocobase/pull/1850) +- исправлено: поле заголовка при присвоении полям значения [`#1848`](https://github.com/nocobase/nocobase/pull/1848) +- исправлено:добавлена ассоциация [`#1842`](https://github.com/nocobase/nocobase/pull/1842) +- функция (плагин-рабочий процесс): добавить кнопку удаления на странице workflow canvas [`#1844`](https://github.com/nocobase/nocobase/pull/1844) +- исправление (блок-провайдер): исправление фильтра getNesterAppends [`#1839`](https://github.com/nocobase/nocobase/pull/1839) +- функция: агрегированный метод репозитория [`#1829`](https://github.com/nocobase/nocobase/pull/1829) + +## Фиксы + +- подвиг (документы): обновить документы [`0b0a8d2`](https://github.com/nocobase/nocobase/commit/0b0a8d2be5f007c94c2050ddf28767100eba2ea8) +- работа (версии): 😊 опубликовать версию 0.9.4-альфа.1 [`9c94840`](https://github.com/nocobase/nocobase/commit/9c94840c6b8cafa7dfc37bb660a7269c2480f995) +- главная задача: обновить список изменений [`a6c7b41`](https://github.com/nocobase/nocobase/commit/a6c7b417dee9b45006b77459a29ebbdb8428dfc5) diff --git a/docs/ru-RU/welcome/release/v0100-changelog.md b/docs/ru-RU/welcome/release/v0100-changelog.md new file mode 100644 index 0000000000..40bda87e4e --- /dev/null +++ b/docs/ru-RU/welcome/release/v0100-changelog.md @@ -0,0 +1,233 @@ +# Версия 0.10: 2023-06-20 + +## Новые возможности во втором квартале + +- Улучшения в компонентах ассоциативных полей, поддержка переключения между несколькими компонентами + - Выбор + - Средство выбора записей + - Вспомогательная форма/дополнительные сведения + - Вспомогательная таблица + - файловый менеджер + - Название (только для чтения) +- Быстрое создание реляционных данных, поддерживает два режима быстрого создания + - Добавить в выпадающем меню для быстрого создания новой записи на основе поля заголовка + - Добавить во всплывающем окне для настройки сложных форм добавления +- Действие дублирования, поддерживает два режима + - Прямое дублирование + - Скопируйте в форму и продолжайте заполнять +- Шаблоны данных формы +- Переменные поддержки области данных фильтра +- Блок списка +- Блок карточек сетки +- Подключаемый модуль мобильного клиента +- Подключаемый модуль аутентификации пользователя, поддерживающий различные методы аутентификации + - Адрес электронной почты / пароль +- SMS + - OIDC + - SAML +- Узлы рабочего процесса + - Обновление узлов вручную, поддержка добавления и редактирования из существующих коллекций + - Узел цикла + - Узел агрегирования +- файловый менеджер + - Предоставить шаблон сбора файлов + - Предоставить компонент файлового менеджера + +## Обновление приложений + +### Обновление для Docker compose + +Изменений нет, ссылка на обновление [Обновление для Docker compose] (/добро пожаловать/начало работы/обновление/docker-compose) + +### Обновление исходного кода Git + +Версия 0.10 содержит значительное обновление зависимостей, поэтому для предотвращения ошибок при обновлении исходного кода перед обновлением необходимо удалить следующие каталоги + +```bash +# Remove .umi cache +yarn rimraf -rf "./**/{.umi,.umi-production}" +# Delete compiled files +yarn rimraf -rf "./packages/*/*/{lib,esm,es,dist,node_modules}" +# Remove dependencies +yarn rimraf -rf node_modules +``` + +Смотрите [Обновление исходного кода Git] (/добро пожаловать/начало работы/обновление/git-clone) для получения более подробной информации + +### Обновление для create-nocobase-app + +Рекомендуется, чтобы `yarn create` повторно загрузил новую версию и изменил конфигурацию `.env`, для получения более подробной информации обратитесь к [руководству по обновлению основной версии] (/добро пожаловать/начало работы/обновление/create-nocobase-app#основное обновление). + +## Предстоящие устаревшие и потенциально несовместимые изменения + +### Компонент полей вложенных таблиц + +Не совместим с новой версией, необходимо удалить и переназначить поля блоков (только переназначение пользовательского интерфейса) + +### Изменения в api загрузки вложений + +В дополнение к встроенной таблице вложений пользователи также могут настраивать сбор файлов, api-интерфейс загрузки для вложений был изменен с `/api/attachments:upload` на `/api/<коллекция файлов>:create`, загрузка устарела, по-прежнему совместима с версией 0.10, но будет обновлена. быть удаленным. + +### Изменения в API входа/регистрации + +Ядро nocobase предоставляет более мощный [модуль аутентификации] (https://github.com/nocobase/nocobase/tree/main/packages/plugins/auth) со следующими изменениями в интерфейсах входа пользователя в систему, регистрации, верификации и выхода из системы: + +```bash +/api/users:signin -> /api/auth:signIn +/api/users:signup -> /api/auth:signUp +/api/users:signout -> /api/auth:signOut +/api/users:check -> /api/auth:check +``` + +Примечание: Вышеупомянутый пользовательский интерфейс, который устарел, по-прежнему совместим с версией 0.10, но будет удален в следующем крупном выпуске. + +### Изменения в фильтрации полей даты + +Если ранее в диапазоне данных была настроена фильтрация, связанная с датой, ее необходимо удалить и перенастроить. + +## Руководство по обновлению сторонних плагинов + +### Обновление зависимостей + +Зависимости, в основном включающие: + +- обновление `react` до версии 18 +- обновление `react-dom` до версии 18 +- обновление `react-router` до версии 6.11 +- обновление `umi` до версии 4 +- обновление `dumi` до версии 2 + +Зависимости `package.json` должны быть изменены на последнюю версию, например: + +```diff +{ + "devDependencies": { ++ "react": "^18". ++ "react-dom": "^18". ++ "react-router-dom": "^6.11.2". +- "react": "^17". +- "react-dom": "^17". +- "react-router-dom": "^5". + } +} +``` + +### Изменения в коде + +Поскольку react-router был обновлен, необходимо также изменить соответствующий код, основные изменения включают в себя + +### Компонент компоновки + +Компонент компоновки должен использовать `<Outlet />` вместо `props.children`. + +```diff +import React from 'react'; ++ import { Outlet } from 'react-router-dom'; + +export default function Layout(props) { + return ( + <div> +- { props.children } ++ <Outlet /> + </div> + ); +} +``` + +если вы используете `React.cloneElement` для отображения компонента route, вам нужно изменить его следующим образом: + +```diff +import React from 'react'; ++ import { Outlet } from 'react-router-dom'; + +export default function RouteComponent(props) { + return ( + <div> +- { React.cloneElement(props.children, { someProp: 'p1' }) } ++ <Outlet context={{ someProp: 'p1' }} /> + </div> + ); +} +``` + +Измените компонент маршрута, чтобы получить значение из `useOutletContext` + +```diff +import React from 'react'; ++ import { useOutletContext } from 'react-router-dom'; + +- export function Comp(props){ ++ export function Comp() { ++ const props = useOutletContext(); + return props.someProp; +} +``` + +### Перенаправление + +`<Перенаправление>` заменено на `<Перейти к замене />`. + +```diff +- <Redirect to="about" /> ++ <Navigate to="about" replace /> +``` + +### useHistory + +`useNavigate` изменен на `useHistory`. + +```diff +- import { useHistory } from 'react-router-dom'; ++ import { useNavigate} from 'react-router-dom'; + +- const history = useHistory(); ++ const navigate = useNavigate(); + +- history.push('/about') ++ navigate('/about') + +- history.replace('/about') ++ navigate('/about', { replace: true }) +``` + +### useLocation + +`useLocation<type>()` изменен на `useLocation`. + +```diff +- const location= useLocation<type>(); ++ const location= useLocation(); +``` + +`const { query } = useLocation()` изменен на `useSearchParams()`。 + +```diff +- const location = useLocation(); +- const query = location.query; +- const name = query.name; ++ const [searchParams, setSearchParams] = useSearchParams(); ++ searchParams.get('name'); +``` + +### Путь + +Все приведенные ниже пути являются допустимыми в версии 6: + +``` +/groups +/groups/admin +/users/:id +/users/:id/messages +/files/* +/files/:id/* +``` + +Следующие маршруты в стиле регулярных выражений недопустимы в версии 6: + +``` +/tweets/:id(\d+) +/files/*/cat.jpg +/files-* +``` + +Для получения дополнительной информации об изменениях в api, пожалуйста, обратитесь к [react-router@6](https://reactrouter.com/en/main/upgrading/v5). diff --git a/docs/ru-RU/welcome/release/v0110-changelog.md b/docs/ru-RU/welcome/release/v0110-changelog.md new file mode 100644 index 0000000000..1066e4f0e4 --- /dev/null +++ b/docs/ru-RU/welcome/release/v0110-changelog.md @@ -0,0 +1,120 @@ +# Версия 0.11: 2023-07-08 + +## Новые возможности + +- Новое клиентское приложение, плагин и маршрутизатор +- Обновление дизайна Ant до версии 5 +- Новый плагин + - Визуализация данных + - Ключи API + - Карта Google + +## Несовместимые изменения + +### Новое клиентское приложение, плагин и маршрутизатор + +#### Изменения в плагинах + +Раньше вам приходилось передавать компонент, а компоненту требовалось передавать `props.children`, например: + +```tsx | pure +const HelloProvider = (props) => { + // do something logic + return <div>{props.children}</div>; +}; + +export default HelloProvider; +``` + +Теперь вам нужно перейти на использование плагина, например: + +```diff | pure ++import { Plugin } from '@nocobase/client' + +const HelloProvider = (props) => { + // do something logic + return <div> + {props.children} + </div>; +} + ++ export class HelloPlugin extends Plugin { ++ async load() { ++ this.app.addProvider(HelloProvider); ++ } ++ } + +- export default HelloProvider; ++ export default HelloPlugin; +``` + +Плагины очень мощные и могут многое делать на этапе `загрузки`: + +- изменить маршруты +- добавить компоненты +- добавить поставщиков +- добавить области видимости +- загрузить другие плагины + +#### Изменения маршрута + +Если раньше вы использовали "RouteSwitchContext" для изменения маршрута, то теперь вам нужно заменить его плагином:mm + +```tsx | pure +import { RouteSwitchContext } from '@nocobase/client'; + +const HelloProvider = () => { + const { routes, ...others } = useContext(RouteSwitchContext); + routes[1].routes.unshift({ + path: '/hello', + component: Hello, + }); + + return ( + <div> + <RouteSwitchContext.Provider value={{ ...others, routes }}> + {props.children} + </RouteSwitchContext.Provider> + </div> + ); +}; +``` + +Теперь вам нужно перейти на использование плагина, например: + +```diff | pure +- import { RouteSwitchContext } from '@nocobase/client'; ++ import { Plugin } from '@nocobase/client'; + +const HelloProvider = (props) => { +- const { routes, ...others } = useContext(RouteSwitchContext); +- routes[1].routes.unshift({ +- path: '/hello', +- component: Hello, +- }); + + return <div> +- <RouteSwitchContext.Provider value={{ ...others, routes }}> + {props.children} +- </RouteSwitchContext.Provider> + </div> +} + ++ export class HelloPlugin extends Plugin { ++ async load() { ++ this.app.router.add('admin.hello', { ++ path: '/hello', ++ Component: Hello, ++ }); ++ this.app.addProvider(HelloProvider); ++ } ++ } ++ export default HelloPlugin; +``` + +Более подробную информацию можно найти в разделе [packages/core/client/src/application/index.md](https://github.com/nocobase/nocobase/blob/main/packages/core/client/src/application/index.md) + +### Обновление antd до версии 5 + +- подробности, связанные с antd, смотрите на официальном веб-сайте [версии с 4 по 5](https://ant.design/docs/react/migration-v5) +- `@formily/antd` заменить на `@formily/antd-v5` diff --git a/docs/ru-RU/welcome/release/v0120-changelog.md b/docs/ru-RU/welcome/release/v0120-changelog.md new file mode 100644 index 0000000000..20bbd9acce --- /dev/null +++ b/docs/ru-RU/welcome/release/v0120-changelog.md @@ -0,0 +1,180 @@ +# Версия 0.12: 2023-08-02 + +## Новые возможности + +- Новый инструмент для сборки плагинов. Встроенные плагины можно будет использовать непосредственно в рабочей среде без необходимости повторной сборки. + +## Обновления приложений + +### Обновление установки Docker + +Изменений нет, обратитесь к [Руководству по обновлению образа Docker] (/welcome/начало работы/обновление/docker-compose) для получения информации об обновлении. + +### Обновление установки исходного кода + +Инструмент сборки плагина был недавно обновлен, и после загрузки новых исходных текстов необходимо очистить кэш. + +```bash +git pull # Извлеките новый исходный код. +yarn clean # Очистите кэш. +``` + +Более подробную информацию смотрите в [Руководстве по обновлению исходного кода Git] (`/добро пожаловать/начало работы/обновление/git-clone`). + +### Обновление установки create-nocobase-app + +Повторно загрузите новую версию через `yarn create` и обновите конфигурацию .env, более подробную информацию смотрите в [руководстве по обновлению основной версии] (`/welcome/начало работы/обновление/create-nocobase-app#Обновление основной версии`). + +## Несовместимые изменения + +### @nocobase/app-клиент и @nocobase/app-сервер объединены в @nocobase-app + +Приложения, установленные с помощью `create-nocobase-app`, больше не имеют каталога `packages/app`, и пользовательский код в `packages/app` необходимо перенести в пользовательский плагин. + +### Путь к приложению dist/client изменился. + +Если вы настраиваете nginx самостоятельно, вам нужно будет выполнить аналогичную настройку + +```diff +server { +- root /app/nocobase/packages/app/client/dist; ++ root /app/nocobase/node_modules/@nocobase/app/dist/client; + + location / { +- root /app/nocobase/packages/app/client/dist; ++ root /app/nocobase/node_modules/@nocobase/app/dist/client; + try_files $uri $uri/ /index.html; + add_header Last-Modified $date_gmt; + add_header Cache-Control 'no-store, no-cache'; + if_modified_since off; + expires off; + etag off; + } +} +``` + +### Необходимо перестроить плагины сторонних производителей + +Обратитесь к руководству по обновлению плагинов сторонних производителей, приведенному ниже + +## Руководство по обновлению плагинов сторонних производителей + +### В каталоге плагинов должны быть каталоги `src/client` и `src/server`. + +```js +// src/client/index.ts +import { Plugin } from '@nocobase/client'; + +class MyPlugin extends Plugin { + async load() { + // ... + } +} + +export default MyPlugin; +``` + +```js +// src/server/index.ts +import { Plugin } from '@nocobase/server'; + +class MyPlugin extends Plugin { + async load() { + // ... + } +} + +export default MyPlugin; +``` + +Конкретный демонстрационный код можно найти по ссылке: [пример-привет](https://github.com/nocobase/nocobase/tree/main/packages/samples/hello) + +### Каталог многоязычного размещения плагина `src/locale` + +Файлы многоязычных переводов как для внешнего, так и для внутреннего интерфейса размещаются в каталоге `src/locale`, поэтому плагину не нужно загружать многоязычные пакеты самостоятельно. + +### Настройка зависимостей плагина + +Зависимости плагина делятся на его собственные зависимости и глобальные зависимости. Глобальные зависимости напрямую используются во всем мире и не будут включены в продукт плагина, в то время как его собственные зависимости будут включены в продукт. После сборки подключаемого модуля производственная среда становится доступной по принципу "подключай и работай", и нет необходимости устанавливать зависимости или выполнять сборку дважды. Настройки зависимостей подключаемого модуля включают: + +- Поместите связанные пакеты `@nocobase/*` в "peerDependencies" и укажите номер версии как `0.x`.; +- Поместите другие зависимости в поле `devDependencies`, а не `dependencies`, так как плагин извлечет все зависимости, необходимые производственной среде, после упаковки. + +```diff +{ + "devDependencies": { + "@formily/react": "2.x", + "@formily/shared": "2.x", + "ahooks": "3.x", + "antd": "5.x", + "dayjs": "1.x", + "i18next": "22.x", + "react": "18.x", + "react-dom": "18.x", + "react-i18next": "11.x" + }, + "peerDependencies": { + "@nocobase/actions": "0.x", + "@nocobase/client": "0.x", + "@nocobase/database": "0.x", + "@nocobase/resourcer": "0.x", + "@nocobase/server": "0.x", + "@nocobase/test": "0.x", + "@nocobase/utils": "0.x" + } +} +``` + +### Выходной путь плагина был изменен с `lib` на `dist` + +Структура каталогов dist: + +```bash +|- dist + |- client # Клиентская сторона, umd + |- index.js + |- index.d.ts + |- server # Серверная часть, cjs + |- index.js + |- index.d.ts + |- others + |- locale # многоязычный пакет + |- node_modules # зависимости от сервера +``` + +Другие связанные с этим изменения включают в себя: + +Изменение основного параметра package.json + +```diff +{ + - "main": "./lib/server/index.js", + + "main": "./dist/server/index.js", +} +``` + +client.d.ts + +```ts +export * from './dist/client'; +export { default } from './dist/client'; +``` + +client.js + +```js +module.exports = require('./dist/client/index.js'); +``` + +server.d.ts + +```ts +export * from './dist/server'; +export { default } from './dist/server'; +``` + +server.js + +```js +module.exports = require('./dist/server/index.js'); +``` diff --git a/docs/ru-RU/welcome/release/v0130-changelog.md b/docs/ru-RU/welcome/release/v0130-changelog.md new file mode 100644 index 0000000000..d08627a57c --- /dev/null +++ b/docs/ru-RU/welcome/release/v0130-changelog.md @@ -0,0 +1,19 @@ +# Версия 0.13: 2023-08-24 + +## Новые возможности + +### Поток запросов о статусе + +<img src="https://nocobase.oss-cn-beijing.aliyuncs.com/57c8e420be0c9c27392d793d5073c060.png" /> + +### Демонстрационное видео + +<video controls width="100%"> + <source src="https://nocobase.oss-cn-beijing.aliyuncs.com/6430cb4ca6310724a7c25a256bce995f.mp4" type="video/mp4" /> +</video> + +## Обновление + +- [Обновление для Docker compose] (/добро пожаловать/начало работы/обновление/docker-compose) +- [Обновление для create-nocobase-app] (/добро пожаловать/начало работы/обновление/create-nocobase-app) +- [Обновление для исходного кода Git] (/добро пожаловать/начало работы/обновление/git-clone) diff --git a/docs/ru-RU/welcome/release/v0140-changelog.md b/docs/ru-RU/welcome/release/v0140-changelog.md new file mode 100644 index 0000000000..7a0151a1d6 --- /dev/null +++ b/docs/ru-RU/welcome/release/v0140-changelog.md @@ -0,0 +1,82 @@ +# Версия 0.14: 2023-09-12 + +В этом выпуске доступны подключаемые модули `plug-and-play` в производственных средах. Теперь вы можете добавлять плагины непосредственно через пользовательский интерфейс и поддерживать загрузку из реестра npm (который может быть частным), локальную загрузку и загрузку по URL-адресу. + +## Новые возможности + +### Новый интерфейс менеджера плагинов + +![20240429074459](https://static-docs.nocobase.com/20240429074459.png) + +### Загруженные плагины находятся в каталоге storage/plugins. + +Каталог storage/plugins используется для загрузки плагинов и организован в виде пакетов npm. + +```bash +|- /storage/ + |- /plugins/ + |- /@nocobase/ + |- /plugin-hello1/ + |- /plugin-hello2/ + |- /@foo/ + |- /bar/ + |- /my-nocobase-plugin-hello/ +``` + +### Обновления плагинов + +В настоящее время можно обновлять только плагины в разделе хранилище/plugins, как показано здесь: + +![20240429074511](https://static-docs.nocobase.com/20240429074511.png) + +Примечание: Чтобы упростить обслуживание и обновление, а также избежать недоступности плагинов хранилища из-за обновления, вы можете установить новый плагин непосредственно в хранилище/плагины, а затем выполнить операцию обновления. + +## Несовместимые изменения + +### Изменения в названиях плагинов + +- Переменная среды `PLUGIN_PACKAGE_PREFIX` больше не используется. +- Имена плагинов и пакетов унифицированы, старые имена плагинов по-прежнему могут использоваться в качестве псевдонимов. + +### Улучшения в pm.add + +```bash +# Использовать packageName вместо PluginName, выполнить поиск локально, ошибка, если не найдено +pm add packageName + +# Загрузка с удаленного компьютера возможна только при наличии реестра, также можно указать версию +pm add packageName --registry=xx --auth-token=yy --version=zz + +# Вы также можете указать локальный почтовый индекс, добавлять его несколько раз и заменять последним +pm add /a/plugin.zip + +# Удаленный архив, замените его на то же имя +pm add http://url/plugin.zip +``` + +### Изменения конфигурации Nginx + +Добавить расположение `/static/plugins/` + +```conf +server { + location ^~ /static/plugins/ { + proxy_pass http://127.0.0.1:13000/static/plugins/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_cache_bypass $http_upgrade; + proxy_connect_timeout 600; + proxy_send_timeout 600; + proxy_read_timeout 600; + send_timeout 600; + } +} +``` + +Подробнее смотрите в полной версии [nocobase.conf](https://github.com/nocobase/nocobase/blob/main/docker/nocobase/nocobase.conf) + +## Руководство по разработке плагина + +[Разработка первого плагина](/development/your-fisrt-plugin) diff --git a/docs/ru-RU/welcome/release/v0150-changelog.md b/docs/ru-RU/welcome/release/v0150-changelog.md new file mode 100644 index 0000000000..e156682e58 --- /dev/null +++ b/docs/ru-RU/welcome/release/v0150-changelog.md @@ -0,0 +1,156 @@ +# Версия 0.15: 2023-11-13 + +## Особенности + +![Plugin settings manager](https://static-docs.nocobase.com/20240115140600.png) + +## Кардинальные изменения + +### API регистрации страницы настройки плагина + +Раньше я использовал Настройку `scenterprovider` для регистрации страницы конфигурации подключаемого модуля, но теперь мне нужно зарегистрироваться через подключаемый модуль. + +Ранее страница настройки плагина была зарегистрирована с помощью `SettingsCenterProvider`, а теперь ее необходимо зарегистрировать через плагин. + +- Пример 1: На исходной странице есть только одна вкладка + +Если на странице есть только одна вкладка, новая версия вкладки будет удалена, оставив только заголовок и значок страницы. + +```tsx | pure +const HelloProvider = React.memo(props => { + return ( + <SettingsCenterProvider + settings={{ + hello: { + title: "Hello", + icon: "ApiOutlined", + tabs: { + tab1: { + title: "Hello tab", + component: HelloPluginSettingPage, + }, + }, + }, + }} + > + {props.children} + </SettingsCenterProvider> + ); +}); +``` + +Теперь его нужно изменить на: + +```tsx | pure +class HelloPlugin extends Plugin { + async load() { + this.app.pluginSettingsManager.add("hello", { + title: "Hello", + icon: "ApiOutlined", + Component: HelloPluginSettingPage, + // It is not necessary to pass this parameter if it is a new plugin + aclSnippet: "pm.hello.tab1", + }); + } +} +``` + +`Приветственная вкладка` из `tab1` удалена. + +Параметр `aclSnippet` `pm.hello.tab1" соответствует ключу исходного объекта `настройки`.: + +```tsx +<SettingsCenterProvider + settings={{ + hello: { + // This `hello` corresponds to `hello` in `pm.hello.tab1` + tabs: { + tab1: { + // Here, `tab1` corresponds to `tab1` in `pm.hello.tab1` + }, + }, + }, + }} +></SettingsCenterProvider> +``` + +- Пример 2: На исходной странице есть несколько вкладок + +```tsx +const HelloProvider = React.memo(props => { + return ( + <SettingsCenterProvider + settings={{ + hello: { + title: "Hello", + icon: "ApiOutlined", + tabs: { + tab1: { + title: "Hello tab1", + component: HelloPluginSettingPage1, + }, + tab2: { + title: "Hello tab2", + component: HelloPluginSettingPage2, + }, + }, + }, + }} + > + {props.children} + </SettingsCenterProvider> + ); +}); +``` + +Теперь его нужно изменить на: + +```tsx +import { Outlet } from "react-router-dom"; + +class HelloPlugin extends Plugin { + async load() { + this.app.pluginSettingsManager.add("hello", { + title: "Hello", + icon: "ApiOutlined", + Component: Outlet, + }); + + this.app.pluginSettingsManager.add("hello.tab1", { + title: "Hello tab1", + Component: HelloPluginSettingPage1, + }); + + this.app.pluginSettingsManager.add("hello.tab2", { + title: "Hello tab2", + Component: HelloPluginSettingPage1, + }); + } +} +``` + +Получите информацию о маршруте, соответствующую `pluginSettingsManager` + +```tsx +const baseName = app.pluginSettingsManager.getRouteName("hello"); +// admin.settings.hello +const basePath = app.pluginSettingsManager.getRoutePath("hello"); // /admin/settings. +// /admin/settings/hello +``` + +Если на странице конфигурации плагина есть переход по ссылке, вам необходимо соответствующим образом изменить ее, например: + +```tsx | pure +navigate("/admin/settings/hello/1").navigate("/admin/settings/hello/2"); + +// This can be changed to +const basePath = app.pluginSettingsManager.getRoutePath("hello"); +navigate(`${basePath}/1`); +navigate(`${basePath}/2`); +``` + +Для получения дополнительной информации обратитесь к [менеджеру настроек плагина](https://docs.nocobase.com/development/client/plugin-settings). + +## Список изменений + +Полный список изменений приведен в разделе [Список изменений](https://github.com/nocobase/nocobase/blob/main/CHANGELOG.md). diff --git a/docs/ru-RU/welcome/release/v0160-changelog.md b/docs/ru-RU/welcome/release/v0160-changelog.md new file mode 100644 index 0000000000..11c3b6a236 --- /dev/null +++ b/docs/ru-RU/welcome/release/v0160-changelog.md @@ -0,0 +1,68 @@ +# Версия 0.16: 2023-11-20 + +## Новые возможности + +Предыдущая версия cache отличается плохим удобством использования (поддерживает только кэш памяти), версия 0.16 была переработана, встроенная память и хранилище redis также поддерживают пользовательское хранилище. пожалуйста, обратитесь к [документации по API](https://docs.nocobase.com/api/cache/cache-manager) для получения подробной информации о том, как использовать. + +## Кардинальные изменения + +### Минимальная версия узла изменена на 18 +Узел v16 больше не поддерживается, минимальная версия была изменена на v18. + +```json +{ + "engines": { + "node": ">=18" + } +} +``` + +### Обновление метода создания кэша + +Устарело: используйте `createCache` для создания кэша. + +```ts +import { createCache } from "@nocobase/cache"; + +const cache = createCache(); +``` + +Кэш теперь управляется с помощью `CacheManager` и создается с помощью `app.cacheManager`. + +```ts +const cache = await app.cacheManager.createCache({ + name: "memory", // unique name of cache + store: "memory", // unique name of cache method + // other config + max: 2000, + ttl: 60 * 1000, +}); +``` + +### Обновление переменных среды + +Для настройки предыдущих переменных среды кэша требовалась строка JSON. + +```bash +CACHE_CONFIG={"storePackage":"cache-manager-fs-hash","ttl":86400,"max":1000} +``` + +Новые переменные среды для настройки кэша: + +```bash +# Уникальное имя метода кэширования по умолчанию, памяти или redis +CACHE_DEFAULT_STORE=memory +# Максимальное количество элементов в кэше памяти +CACHE_MEMORY_MAX=2000 +# Повторное использование, необязательно +CACHE_REDIS_URL=redis://localhost:6379 +``` +## Полный список изменений +- рефакторинг (кэширование): улучшение кэширования [`#3004`](https://github.com/nocobase/nocobase/pull/3004) +- исправлено: URL-адрес базы данных локального хранилища [`#3063`](https://github.com/nocobase/nocobase/pull/3063) +- функция: отображение определения таблицы [`#3061`](https://github.com/nocobase/nocobase/pull/3061) +- особенность: поддержка mariadb [`#3052`](https://github.com/nocobase/nocobase/pull/3052) +- исправление (плагин-рабочий процесс): незначительные исправления для клиента [`#3062`](https://github.com/nocobase/nocobase/pull/3062) +- рутинная работа: просмотр логического вывода [`#3060`](https://github.com/nocobase/nocobase/pull/3060) +- исправлено: сортировка по коллекции ассоциаций [`#3058`](https://github.com/nocobase/nocobase/pull/3058) +- достижение: узел >= 18 [`#3066`](https://github.com/nocobase/nocobase/pull/3066) diff --git a/docs/ru-RU/welcome/release/v0170-changelog.md b/docs/ru-RU/welcome/release/v0170-changelog.md new file mode 100644 index 0000000000..9f9fa44c58 --- /dev/null +++ b/docs/ru-RU/welcome/release/v0170-changelog.md @@ -0,0 +1,85 @@ +# Версия 0.17: 2023-12-04 + +## Новые возможности + +Чтобы сократить затраты на обучение разработчиков и повысить качество разработки интерфейса, за последние несколько месяцев мы провели поэтапную реконструкцию ядра интерфейса, включая: + +![20240115141058](https://static-docs.nocobase.com/20240115141058.png) + +На этот раз в версии 0.17 был переработан конструктор схем пользовательского интерфейса, связанный с инициализатором схем и настройками схем. + +![20240115141118](https://static-docs.nocobase.com/20240115141118.png) + +![20240115141129](https://static-docs.nocobase.com/20240115141129.png) + +Чтобы пользователям было проще приступить к работе, мы также реорганизовали различные разделы документации: + +- [Разработка плагинов](https://docs.nocobase.com/development) (полностью переработан и опубликован) +- [Ссылка на API / клиент](https://client.docs.nocobase.com/core/application/application) (новый раздел, уже опубликован) +- Руководство пользователя (полностью переработанное, будет выпущено в ближайшие одну-две недели) +- Список плагинов (новый раздел, включающий введение, инструкции по использованию и разработке расширений для всех существующих плагинов, будет выпущен в ближайшие одну-две недели) + +## Несовместимые изменения + +### Изменения в SchemaInitializer + +- Добавлен `SchemaInitializerManager` для регистрации `SchemaInitializer` +- Добавлен `useSchemaInitializerRender()`, чтобы заменить исходный `useSchemaInitializer()` на `render()`. +- Добавлен компонент `useSchemaInitializerItem()` для получения контекста текущего элемента инициализации +- Добавлен компонент `SchemaInitializerItemGroup` в качестве компонента по умолчанию для `type: `ItemGroup``. +- Добавлен компонент `SchemaInitializerSubMenu` в качестве компонента по умолчанию для подменю `type: ` +- Добавлен компонент `SchemaInitializerDivider` в качестве компонента по умолчанию для разделителя `type: ` +- Добавлен компонент `SchemaInitializerChildren` для пользовательского отображения нескольких элементов списка +- Добавлен компонент `Schemainitializerchildren` для пользовательского отображения одного элемента списка +- Изменены обязанности `SchemaInitializerContext` по сохранению контекста текущего инициализатора +- Изменены обязанности `useSchemaInitializer()` по получению контекста текущего инициализатора. +- Изменен `function SchemaInitializer` на `class SchemaInitializer` для определения инициализатора +- Изменены параметры `SchemaInitializer` +- Добавлен обязательный параметр `name` для значения `x-initializer` + - Добавлен параметр `Component` для пользовательского отображения кнопки. По умолчанию используется `SchemaInitializerButton`. + - Добавлены `componentProps`, `style` для настройки свойств и стиля `Component` + - Добавлен параметр `ItemsComponent` для пользовательского отображения списка. По умолчанию используется `SchemaInitializerItems`. + - Добавлены `itemsComponentProps`, `itemsComponentStyle` для настройки свойств и стиля `ItemsComponent` + - Добавлен параметр `popover` для настройки отображения эффекта `popover`. + - Добавлен параметр `useInsert` для случаев, когда функция `insert` должна использовать перехватчики + - Изменен параметр `dropdown` на `popoverProps`, используя `Popover` вместо `Dropdown` +- Изменены параметры `items` для `SchemaInitializer` +- Добавлена функция `useChildren` для динамического управления дочерними элементами + - Добавлена функция `componentProps` для управления свойствами самого компонента + - Добавлена функция `useComponentProps` для динамической обработки реквизитов компонента + - Изменен параметр `key` на `name` для уникальной идентификации элементов списка + - Изменен параметр `visible` на `useVisible` для функции динамического управления отображением + - Изменен параметр `component` на `Component` для отображения элементов списка +- Изменено значение `SchemaInitializer.Кнопка` на `SchemaInitializerButton`, значение по умолчанию для параметра компонента SchemaInitializer +- Изменено значение `SchemaInitializer.Элемент` на `SchemaInitializerItem` с неизменными параметрами. +- Изменен `SchemaInitializer.ActionModal` на `SchemaInitializerActionModal` с неизменными параметрами +- Изменен `SchemaInitializer.SwitchItem` на `SchemaInitializer.Switch` с неизменными параметрами +- Удален `SchemaInitializerProvider`, заменен на `SchemaInitializerManager` +- Удален `SchemaInitializer.itemWrap`, больше не нужно обертывать компонент `item` + +### Изменения в настройках схемы + +- Добавлен `SchemaSettingsManager` для регистрации `SchemaSettings` +- Добавлен `useSchemaSettingsItem()` +- Добавлен `useSchemaSettingsRender()` +- Добавлен параметр `x-settings` для настройки параметров схемы +- Добавлен параметр `x-toolbar` для настройки панели инструментов схемы +- Добавлен компонент `SchemaToolbar` для настройки панели инструментов схемы +- Добавлен `useSchemaToolbarRender()` вместо исходного `useDesigner()`. +- Изменены `настройки функций` на `настройки классов` для определения параметров +- Изменены исходные `Настройки схем` на `Настройки выпадающего списка` +- Изменено `SchemaSettings.Item` на `SchemaSettingsItem` +- Изменено `SchemaSettings.ItemGroup` на `SchemaSettingsItemGroup` +- Изменено `SchemaSettings.SubMenu` на `SchemaSettingsSubMenu` +- Изменено `SchemaSettings.Divider` на `SchemaSettingsDivider` +- Изменено `SchemaSettings.Remove` на `SchemaSettingsRemove` +- Изменено `SchemaSettings.SelectItem` на `SchemaSettingsSelectItem` +- Изменено `SchemaSettings.CascaderItem` на `SchemaSettingsCascaderItem` +- Изменено `SchemaSettings.SwitchItem` на `SchemaSettingsSwitchItem` +- Изменено `SchemaSettings.ModalItem` на `SchemaSettingsModalItem` +- Изменено `SchemaSettings.ActionModalItem` на `SchemaSettingsActionModalItem` +- Удалён параметр `x-designer` (устарел, будет удалён в будущем, используйте `x-toolbar`) +- Удалён хук `useDesigner()` (устарел, будет удалён в будущем, используйте `useSchemaToolbarRender()`) + +Подробнее см. [Критические изменения в NocoBase 0.17](https://docs.nocobase.com/welcome/release/upgrade-to/v017) + diff --git a/docs/ru-RU/welcome/release/v0180-changelog.md b/docs/ru-RU/welcome/release/v0180-changelog.md new file mode 100644 index 0000000000..489802c51d --- /dev/null +++ b/docs/ru-RU/welcome/release/v0180-changelog.md @@ -0,0 +1,177 @@ +# Версия 0.18: 2023-12-21 + +## Новые возможности + +Чтобы повысить надежность NocoBase, в течение четвертого квартала мы проводили комплексное тестирование E2E. Одновременно мы также совершенствовали всю систему тестирования. + +### @nocobase/test + +Набор для тестирования NocoBase, включающий: + +- тестирование на стороне сервера `@nocobase/test/server` + - Встроенный `супертест` для тестирования интерфейса. + - Встроены `mockDatabase` и `MockServer`. +- `@nocobase/test/client` Тестирование на стороне клиента + - интегрированы `@testing-library/react` и `@testing-library/user-event`. +- Тестирование `@nocobase/test/e2e` E2E + - Интеграция `@playground/test`. + - Встроенные общие макетные методы. + +### Фреймворк тестирования + +- Тестирование на стороне сервера с использованием Vitest framework +- Тестирование на стороне клиента с использованием Vitest framework +- Тестирование E2E с использованием Playstation framework + +### Написание тестов + +#### Серверное тестирование + +```typescript +import { mockDatabase } from `@nocobase/test/server`; + +describe('my db suite', () => { + let db; + + beforeEach(async () => { + db = mockDatabase(); + db.collection({ + name: 'posts', + fields: [ + { + type: 'string', + name: 'title', + }, + ], + }); + await db.sync(); + }); + + afterEach(async () => { + await db.close(); + }); + + test('my case', async () => { + const repository = db.getRepository('posts'); + const post = await repository.create({ + values: { + title: 'hello', + }, + }); + + expect(post.get('title')).toEqual('hello'); + }); +}); +``` + +#### Тестирование на стороне клиента + +```typescript +import { render, screen, userEvent, waitFor } from '@nocobase/test/client'; + +it('should display the value of user input', async () => { + const { container } = render(<App1 />); + const input = container.querySelector('input'); + await userEvent.type(input, 'Hello World'); + await waitFor(() => { + expect(screen.getByText('Hello World')).toBeInTheDocument(); + }); +}); +``` + +#### Тестирование E2E + +```typescript +import { test } from '@nocobase/test/e2e'; + +test('sign in', async ({ page }) => { + await page.goto('/'); + await page.getByPlaceholder('Username/Email').click(); + await page.getByPlaceholder('Username/Email').fill('admin@nocobase.com'); + await page.getByPlaceholder('Password').click(); + await page.getByPlaceholder('Password').fill('admin123'); + await page.getByRole('button', { name: 'Sign in' }).click(); + await expect( + page.getByTestId('user-center-button').getByText('Super Admin') + ).toBeVisible(); +}); +``` + +### Проведите самый важный тест + +```bash +# Запустите все тесты с помощью двух параллельных процессов Vitest как для внешнего интерфейса, так и для серверной части. +yarn test + +# Запустите клиентские тестовые примеры. +yarn test --client +# равно +yarn cross-env TEST_ENV=client-side vitest + +# Запустите серверные тестовые примеры. +yarn test --server +# равно +yarn cross-env TEST_ENV=server-side vitest + +# Укажите каталог или файл. +yarn test your/path/src/__tests__/test-file.test.ts +# Файлы на стороне клиента должны содержать /client/ +yarn test your/path/client/src/__tests__/test-file.test.ts +``` + +📢 Отличие от прямого запуска vitest + +- Когда вы указываете путь, вы можете автоматически распознавать интерфейс и серверную часть, во внешнем интерфейсе должен быть указан `/клиент/`. +- По умолчанию серверный тест выполняется в режиме `-single-thread`, если вы хотите отключить его, вы можете добавить `-single-thread=false`. +- По умолчанию используется `--run`, если вам нужно прослушать, добавьте `--watch`. + +### Проведите тест на драматурга + +```bash +# Установить зависимости +yarn e2e install-deps + +# Запуск тестов +yarn e2e test + +# Режим пользовательского интерфейса +yarn e2e test --ui + +# Укажите URL-адрес приложения +yarn e2e test --url=http://localhost:20000 + +# Запустите приложение. Оно каждый раз переустанавливается. +yarn e2e start-app +``` + +## Другие изменения + +### Оптимизация плагина auth + +- Руководство по разработке расширения Auth [https://docs.nocobase.com/plugins/auth/dev/guide](https://docs.nocobase.com/plugins/auth/dev/guide) +- Основные изменения [https://docs.nocobase.com/breaking-changes/v0-18-0-alpha-1](https://docs.nocobase.com/breaking-changes/v0-18-0-alpha-1) + +### Модульная декомпозиция на плагины + +Чтобы усовершенствовать ядро и сделать его более оптимизированным, некоторые функциональные возможности были разделены на модули. Недавно в число плагинов, которые подверглись такой модуляции, вошли: + +| Название плагина | Название пакета | +| ------------------------------ | --------------------------------------------- | +| Action - Bulk edit | @nocobase/plugin-action-bulk-edit | +| Action - Bulk update | @nocobase/plugin-action-bulk-update | +| Action - Duplicate | @nocobase/plugin-action-duplicate | +| Kanban | @nocobase/plugin-kanban | +| Gantt | @nocobase/plugin-gantt | +| Workflow - Aggregate | @nocobase/plugin-workflow-aggregate | +| Workflow - Approval | @nocobase/plugin-workflow-approval | +| Workflow - Delay | @nocobase/plugin-workflow-delay | +| Workflow - Dynamic calculation | @nocobase/plugin-workflow-dynamic-calculation | +| Workflow - Form trigger | @nocobase/plugin-workflow-form-trigger | +| Workflow - JSON query | @nocobase/plugin-workflow-json-query | +| Workflow - Loop | @nocobase/plugin-workflow-loop | +| Workflow - Manual | @nocobase/plugin-workflow-manual | +| Workflow - Parallel | @nocobase/plugin-workflow-parallel | +| Workflow - Request | @nocobase/plugin-workflow-request | +| Workflow - SQL | @nocobase/plugin-workflow-sql | + +Смотрите [полный список плагинов](https://docs.nocobase.com/plugins) для получения подробной информации. В настоящее время документ находится в стадии разработки, возможно, часть содержимого отсутствует или ожидает перевода. Следите за обновлениями в [nocobase/docs](https://github.com/nocobase/docs). diff --git a/docs/ru-RU/welcome/release/v0190-changelog.md b/docs/ru-RU/welcome/release/v0190-changelog.md new file mode 100644 index 0000000000..442d6ea3da --- /dev/null +++ b/docs/ru-RU/welcome/release/v0190-changelog.md @@ -0,0 +1,275 @@ +# Версия 0.19: 2024-01-08 + +## Новые функции + +### Телеметрия + +- Документация по разработке: https://docs.nocobase.com/development/server/telemetry +- API ядра: https://docs.nocobase.com/api/telemetry/telemetry +- Плагин Prometheus: https://docs.nocobase.com/plugins/telemetry-prometheus + +### Резервное копирование и восстановление приложений + +- Документация по плагину: https://docs.nocobase.com/plugins/backup-restore + +## Оптимизация ядра + +### Оптимизация командной строки + +Для NocoBase 0.19 и выше пользовательские команды плагина должны быть размещены в каталоге плагина `src/server/commands/*.ts` со следующим содержимым: + +```typescript +export default function(app) { + app.command('custom1').action(); +} +``` + +Процесс выполнения командной строки: + +![20240115141900](https://static-docs.nocobase.com/20240115141900.png) + +Специальная конфигурация команды + +- `ipc()` Когда приложение запущено, командная строка отправляет команды через ipc для управления запущенным экземпляром приложения, когда ipc() не настроен, будет создан новый экземпляр приложения, а затем операция будет выполнена (это не повлияет на работу запущенного экземпляра приложения) +- `auth()` выполняет проверку базы данных, если конфигурация базы данных неверна, эта команда выполнена не будет. +- `preload()` следует ли предварительно загрузить конфигурацию приложения, то есть выполнить app.load() + +Это может быть настроено в соответствии с фактическим использованием команды, примерами являются следующие: + +```typescript +app.command('a').ipc().action() +app.command('a').auth().action() +app.command('a').preload().action() +``` + +### Оптимизация процесса установки + +![20240115141914](https://static-docs.nocobase.com/20240115141914.png) + +### Оптимизация процесса запуска + +![20240115141922](https://static-docs.nocobase.com/20240115141922.png) + +### Оптимизация процесса обновления + +![20240115141933](https://static-docs.nocobase.com/20240115141933.png) + +Миграции обновлений подразделяются на beforeLoad, afterSync и afterLoad после загрузки: + +- Предварительная загрузка: Выполняется перед загрузкой каждого модуля, разделена на три этапа: + + - Перед загрузкой модулей ядра + - Перед загрузкой предустановленных плагинов + - Перед загрузкой других плагинов + +- Последующая синхронизация: Выполняется после синхронизации конфигураций таблиц данных с базой данных, разделенной на три этапа: + + - После синхронизации таблиц ядра с базой данных + - После синхронизации предустановленных таблиц подключаемого модуля с базой данных + - После синхронизации других таблиц подключаемого модуля с базой данных. + +```typescript +export default class extends Migration { + // Когда следует выполнить миграцию + on = 'beforeLoad'; + // Выполняется только при выполнении следующего номера версии приложения. + appVersion = '<=0.13.0-alpha.5'; + // Выполняется только при выполнении следующего номера версии плагина. + pluginVersion = '<=0.13.0-alpha.5'; + // Сценарий обновления. + async up() {} +} +``` + +### Добавьте команду create-migration + +Создадим файл миграции: + +```bash +yarn nocobase create-migration -h + +Usage: nocobase create-migration [options] <name> + +Options: + --pkg <pkg> package name + --on [on] Options include beforeLoad, afterSync and afterLoad + -h, --help display help for command +``` + +Например: + +```bash +$ yarn nocobase create-migration update-ui --pkg=@nocobase/plugin-client + +2024-01-07 17:33:13 [info ] add app main into supervisor +2024-01-07 17:33:13 [info ] migration file in /nocobase/packages/plugins/@nocobase/plugin-client/src/server/migrations/20240107173313-update-ui.ts +✨ Done in 5.02s. +``` + +Файл миграции будет сгенерирован в `src/server/migrations` пакета плагинов `@nocobase/plugin-client` как `20240107173313-update-ui.ts` со следующим исходным содержимым: + +```typescript +import { Migration } from '@nocobase/server'; + +export default class extends Migration { + on = 'afterLoad'; // 'beforeLoad' | 'afterSync' | 'afterLoad' + appVersion = '<0.18.0-alpha.10'; + + async up() { + // coding + } +} +``` + +### Каталоги плагина, основанные на соглашениях + +```bash +|- /plugin-sample-hello + |- /dist # Каталог для скомпилированного плагина + |- /src # Исходный код для плагина + |- /client + |- plugin.ts + |- index.ts # Точка входа на стороне клиента + |- /locale # Обычный каталог для обмена многоязычными файлами между интерфейсом и серверной частью + |- /swagger # Обычный каталог для документации Swagger + |- /server + |- collections # Обычный каталог для конфигураций таблиц данных плагина + |- commands # Обычный каталог для пользовательских команд + |- migrations # Обычный каталог для переноса файлов + |- plugin.ts # Класс подключаемого модуля + |- index.ts # Точка входа на стороне сервера + |- index.ts + |- .npmignore + |- client.d.ts + |- client.js + |- package.json + |- server.d.ts + |- server.js +``` + +Оптимизация процесса тестирования + +Добавлены более удобные для пользователя методы `createMockServer()` и `startMockServer()` для написания тестовых примеров: + +- `createMockServer()` Быстро создает и запускает приложение. +- `startMockServer()` Быстро запускает приложение (без переустановки). + +```typescript +import { createMockServer } from '@nocobase/server'; + +describe('test example', () => { + let app: MockServer; + + beforeEach(async () => { + app = await createMockServer({ + plugins: ['nocobase'], + }); + }); + + afterEach(async () => { + await app.destroy(); + }); + + test('case1', async () => { + // coding... + }); +}); +``` + +## Важные изменения + +### Коллекции, команды, миграции изменяют конфигурацию в каталогах, основанных на соглашениях + +Пример 1: Коллекции загружаются с помощью importCollections, код удаляется напрямую, а файл конфигурации коллекций должен быть помещен в каталог `src/server/collections`. + +```diff +export class AuthPlugin extends Plugin { + async load() { +- await this.importCollections(resolve(__dirname, 'collections')); + } +} +``` + +Пример 2: Коллекции загружены через this.db.import, код удаляется напрямую, файл конфигурации коллекций должен быть помещен в каталог `src/server/collections` + +```diff +export class AuthPlugin extends Plugin { + async load() { +- await this.db.import({ +- directory: resolve(__dirname, 'collections') +- }); + } +} +``` + +Пример 3: Коллекцию, определенную с помощью db.collection(), рекомендуется поместить в каталог `src/server/collections`. + +```diff +export class AuthPlugin extends Plugin { + async load() { +- this.db.collection({ +- name: 'examples', +- }); + } +} +``` + +Добавьте новый файл `src/server/collections/examples.ts` со следующим содержимым: + +```typescript +import { defineCollection } from '@nocobase/database'; + +export default defineCollection({ + name: 'examples', +}); +``` + +Пример 4. Удалите db.addMigrations() и поместите файл миграции в каталог `src/server/migrations`. + +```diff +export class AuthPlugin extends Plugin { + async load() { +- this.db.addMigrations({ +- namespace: 'auth', +- directory: resolve(__dirname, 'migrations'), +- context: { +- plugin: this, +- }, +- }); + } +} +``` + +Пример 5. Настройка командной строки + +```diff +export class MyPlugin extends Plugin { + load() { +- this.app +- .command('echo') +- .option('-v, --version'); +- .action(async ([options]) => { +- console.log('Hello World!'); +- if (options.version) { +- console.log('Current version:', app.getVersion()); +- } +- }); +- } +} +``` + +Добавьте новый файл `src/server/collections/echo.ts` со следующим содержимым: + +```typescript +export default function(app) { + app + .command('echo') + .option('-v, --version'); + .action(async ([options]) => { + console.log('Hello World!'); + if (options.version) { + console.log('Current version:', await app.version.get()); + } + }); +} +``` diff --git a/docs/ru-RU/welcome/release/v0200-changelog/20240303170947_rec_.gif b/docs/ru-RU/welcome/release/v0200-changelog/20240303170947_rec_.gif new file mode 100644 index 0000000000..597aafc8fc Binary files /dev/null and b/docs/ru-RU/welcome/release/v0200-changelog/20240303170947_rec_.gif differ diff --git a/docs/ru-RU/welcome/release/v0200-changelog/20240303172205_rec_.gif b/docs/ru-RU/welcome/release/v0200-changelog/20240303172205_rec_.gif new file mode 100644 index 0000000000..f2713b5a32 Binary files /dev/null and b/docs/ru-RU/welcome/release/v0200-changelog/20240303172205_rec_.gif differ diff --git a/docs/ru-RU/welcome/release/v0200-changelog/image-1.png b/docs/ru-RU/welcome/release/v0200-changelog/image-1.png new file mode 100644 index 0000000000..75b48b6ceb Binary files /dev/null and b/docs/ru-RU/welcome/release/v0200-changelog/image-1.png differ diff --git a/docs/ru-RU/welcome/release/v0200-changelog/image-10.png b/docs/ru-RU/welcome/release/v0200-changelog/image-10.png new file mode 100644 index 0000000000..c4c9ca82da Binary files /dev/null and b/docs/ru-RU/welcome/release/v0200-changelog/image-10.png differ diff --git a/docs/ru-RU/welcome/release/v0200-changelog/image-11.png b/docs/ru-RU/welcome/release/v0200-changelog/image-11.png new file mode 100644 index 0000000000..762ea21ee0 Binary files /dev/null and b/docs/ru-RU/welcome/release/v0200-changelog/image-11.png differ diff --git a/docs/ru-RU/welcome/release/v0200-changelog/image-12.png b/docs/ru-RU/welcome/release/v0200-changelog/image-12.png new file mode 100644 index 0000000000..9a83fb1be5 Binary files /dev/null and b/docs/ru-RU/welcome/release/v0200-changelog/image-12.png differ diff --git a/docs/ru-RU/welcome/release/v0200-changelog/image-13.png b/docs/ru-RU/welcome/release/v0200-changelog/image-13.png new file mode 100644 index 0000000000..ff459608df Binary files /dev/null and b/docs/ru-RU/welcome/release/v0200-changelog/image-13.png differ diff --git a/docs/ru-RU/welcome/release/v0200-changelog/image-14.png b/docs/ru-RU/welcome/release/v0200-changelog/image-14.png new file mode 100644 index 0000000000..f7f8b70824 Binary files /dev/null and b/docs/ru-RU/welcome/release/v0200-changelog/image-14.png differ diff --git a/docs/ru-RU/welcome/release/v0200-changelog/image-15.png b/docs/ru-RU/welcome/release/v0200-changelog/image-15.png new file mode 100644 index 0000000000..1aa59c4d9e Binary files /dev/null and b/docs/ru-RU/welcome/release/v0200-changelog/image-15.png differ diff --git a/docs/ru-RU/welcome/release/v0200-changelog/image-16.png b/docs/ru-RU/welcome/release/v0200-changelog/image-16.png new file mode 100644 index 0000000000..2313fccba7 Binary files /dev/null and b/docs/ru-RU/welcome/release/v0200-changelog/image-16.png differ diff --git a/docs/ru-RU/welcome/release/v0200-changelog/image-17.png b/docs/ru-RU/welcome/release/v0200-changelog/image-17.png new file mode 100644 index 0000000000..88aa7ddf65 Binary files /dev/null and b/docs/ru-RU/welcome/release/v0200-changelog/image-17.png differ diff --git a/docs/ru-RU/welcome/release/v0200-changelog/image-18.png b/docs/ru-RU/welcome/release/v0200-changelog/image-18.png new file mode 100644 index 0000000000..c2e2059424 Binary files /dev/null and b/docs/ru-RU/welcome/release/v0200-changelog/image-18.png differ diff --git a/docs/ru-RU/welcome/release/v0200-changelog/image-2.png b/docs/ru-RU/welcome/release/v0200-changelog/image-2.png new file mode 100644 index 0000000000..7498245c04 Binary files /dev/null and b/docs/ru-RU/welcome/release/v0200-changelog/image-2.png differ diff --git a/docs/ru-RU/welcome/release/v0200-changelog/image-3.png b/docs/ru-RU/welcome/release/v0200-changelog/image-3.png new file mode 100644 index 0000000000..acd326aa9b Binary files /dev/null and b/docs/ru-RU/welcome/release/v0200-changelog/image-3.png differ diff --git a/docs/ru-RU/welcome/release/v0200-changelog/image-4.png b/docs/ru-RU/welcome/release/v0200-changelog/image-4.png new file mode 100644 index 0000000000..95e4985ee7 Binary files /dev/null and b/docs/ru-RU/welcome/release/v0200-changelog/image-4.png differ diff --git a/docs/ru-RU/welcome/release/v0200-changelog/image-5.png b/docs/ru-RU/welcome/release/v0200-changelog/image-5.png new file mode 100644 index 0000000000..c4cd97426b Binary files /dev/null and b/docs/ru-RU/welcome/release/v0200-changelog/image-5.png differ diff --git a/docs/ru-RU/welcome/release/v0200-changelog/image-6.png b/docs/ru-RU/welcome/release/v0200-changelog/image-6.png new file mode 100644 index 0000000000..ad2cd8af55 Binary files /dev/null and b/docs/ru-RU/welcome/release/v0200-changelog/image-6.png differ diff --git a/docs/ru-RU/welcome/release/v0200-changelog/image-7.png b/docs/ru-RU/welcome/release/v0200-changelog/image-7.png new file mode 100644 index 0000000000..5fbfd54d0d Binary files /dev/null and b/docs/ru-RU/welcome/release/v0200-changelog/image-7.png differ diff --git a/docs/ru-RU/welcome/release/v0200-changelog/image-8.png b/docs/ru-RU/welcome/release/v0200-changelog/image-8.png new file mode 100644 index 0000000000..aa70bb33f6 Binary files /dev/null and b/docs/ru-RU/welcome/release/v0200-changelog/image-8.png differ diff --git a/docs/ru-RU/welcome/release/v0200-changelog/image-9.png b/docs/ru-RU/welcome/release/v0200-changelog/image-9.png new file mode 100644 index 0000000000..2716b6a3f6 Binary files /dev/null and b/docs/ru-RU/welcome/release/v0200-changelog/image-9.png differ diff --git a/docs/ru-RU/welcome/release/v0200-changelog/image.png b/docs/ru-RU/welcome/release/v0200-changelog/image.png new file mode 100644 index 0000000000..1e9a56c9e7 Binary files /dev/null and b/docs/ru-RU/welcome/release/v0200-changelog/image.png differ diff --git a/docs/ru-RU/welcome/release/v0200-changelog/index.md b/docs/ru-RU/welcome/release/v0200-changelog/index.md new file mode 100644 index 0000000000..e19004e901 --- /dev/null +++ b/docs/ru-RU/welcome/release/v0200-changelog/index.md @@ -0,0 +1,362 @@ +# Версия 0.20: 2024-03-03 + +## Новые возможности + +### Поддержка нескольких источников данных + +Добавлен плагин [Менеджер источников данных](/handbook/data-source-manager), используемый для управления всеми коллекциями и полями для источников данных. Плагин Data Source Manager предоставляет централизованный интерфейс для управления источниками данных и не предоставляет возможности доступа к источникам данных. Его необходимо использовать в сочетании с различными плагинами для источников данных. В настоящее время поддерживаются следующие источники данных: + +- [Основная база данных](/handbook/data-source-main): основная база данных NocoBase, поддерживающая реляционные базы данных, такие как MySQL, PostgreSQL, SQLite и т.д. +- [Внешний источник данных MySQL](/handbook/data-source-external-mysql): Доступ к существующей базе данных MySQL в качестве источника данных. +- [Внешний источник данных MariaDB](/handbook/data-source-external-mariadb): Доступ к существующей базе данных MariaDB в качестве источника данных. +- [Внешний источник данных PostgreSQL](/handbook/data-source-external-postgres): Доступ к существующей базе данных PostgreSQL в качестве источника данных. + +Кроме того, можно расширить число источников данных, которые могут быть обычными типами баз данных или платформ, предоставляющих API (SDK). + +![Data Source Manager](https://static-docs.nocobase.com/fe8ecdaf640097eeb310c94a997b9090.png) + +### Настройка управления коллекциями + +Перенес исходный "Менеджер коллекций" в "Источник данных > Основная база данных > Конфигурация". + +![Main Database Configuration](https://static-docs.nocobase.com/b5ad882a131e447f78b0c22a92ec9df6.gif) + +### Поддержка полей, отличных от ID, в качестве основных и связанных ограничений + +При создании коллекции вы можете отказаться от создания поля ID. + +![Predefined Fields](https://static-docs.nocobase.com/87dc4101a884f97cbfce00f1891f7cf6.png) + +Целочисленные поля могут использоваться в качестве первичных ключей. + +![Integer fields can be used as primary keys](https://static-docs.nocobase.com/cce37d7d8e9feaa66970da0c643a2d9d.png) + +Однострочные текстовые поля также могут использоваться в качестве первичных ключей. + +![Single-line text fields can also be used as primary keys](https://static-docs.nocobase.com/b2c797f52bedfcfa06936a244dd9be4b.png) + +Ограничения взаимосвязи поддерживают выбор других полей с уникальными индексами, установленными в качестве полей, не являющихся первичными ключами. + +![](https://static-docs.nocobase.com/e5515e58426c5be08ba982b0bb311410.png) + +### Настройка сортировки с помощью перетаскивания + +Добавлено поле типа "Сортировать". Поля сортировки больше не создаются автоматически при создании коллекций и их необходимо создавать вручную. + +![](https://static-docs.nocobase.com/470891c7bb34c506328c1f3824a6cf20.png) + +При выборе поля в качестве группы перед сортировкой будет произведена группировка. + +![](https://static-docs.nocobase.com/0794d0a9c0dc288a8fc924a3542bb86e.png) + +При включении сортировки перетаскиванием в табличном блоке вам необходимо выбрать поле сортировки. + +![](https://static-docs.nocobase.com/20cf12fd7ca3d8c0aa1917a95c0a7e7c.png) + +При создании блока Канбан вам необходимо выбрать поле сортировки. + +![](https://static-docs.nocobase.com/b810265790d6a1ec099e3d88d1361271.png) + +### Настройка пользовательского интерфейса и интерфейсов разрешений + +Добавлен интерфейс управления пользователями и унифицированное управление пользователями и ролями в одном меню. + +![](https://static-docs.nocobase.com/7be26746652098f07ce105dbae373522.png) + +Изменен интерфейс управления ролями, чтобы упростить управление связанными с пользователями ролями, разрешениями, отделами и т.д. + +![](https://static-docs.nocobase.com/4ec942af764dfcec1ddc9a244816a6ee.png) + +Перенес исходные "Разрешения на действия" на вкладку "Источник данных". + +![](https://static-docs.nocobase.com/461ab881fe94a33f9a122e9734b85f4d.gif) + +### Плагин отделов + +![](https://static-docs.nocobase.com/093473d9c23a789d41899df9bcaf3389.png) + +Организуйте пользователей по отделам, устанавливайте иерархические связи, связывайте роли для управления разрешениями и используйте отделы в качестве переменных в рабочих процессах и выражениях. + +### Рабочий процесс: Утверждение + +Плагин утверждения предоставляет специальные типы рабочих процессов (триггеры) "Инициировать утверждение" и узлы "Утверждение" для этого процесса. В сочетании с уникальными пользовательскими таблицами данных и пользовательскими блоками NocoBase можно быстро и гибко создавать различные сценарии утверждения и управлять ими. + +Конфигурация утверждения + +![Approval Configuration](https://static-docs.nocobase.com/21acc5615ecc03aeeb44671ab945baea.png) + +Процесс утверждения + +![Approval Process](https://static-docs.nocobase.com/6a879641bd15de0648cd4602779ef9fa.png) + +Более подробную информацию можно найти в документации: [Утверждение рабочего процесса](/handbook/workflow-approval) + +### Рабочий процесс: Узел завершения процесса + +Этот узел немедленно завершает текущее выполнение рабочего процесса при выполнении и сохраняет статус, настроенный в узле. Обычно он используется для управления определенным логическим потоком, чтобы завершить текущий рабочий процесс после выполнения определенных логических условий без продолжения последующей обработки. Это можно сравнить с командой return в языках программирования, используемой для выхода из выполняемой в данный момент функции. + +![](https://static-docs.nocobase.com/38d6352211d791fd4233f5cd4bdb34f2.png) + +Более подробную информацию можно найти в документации: [Конечный узел процесса](/handbook/workflow/manual/nodes/end) + +### Рабочий процесс: Custom Variable Node + +Переменные могут быть объявлены в рабочем процессе или присвоены значения ранее объявленным переменным, которые обычно используются для хранения временных данных в рабочем процессе. Он подходит для сценариев, где результаты вычислений необходимо сохранить для последующего использования вне ветви (например, циклы, параллелизм и т.д.). + +![](https://static-docs.nocobase.com/c19913f99968d987a52aaa53578a7318.png) + +Более подробную информацию можно найти в документации: [Пользовательский переменный узел](/handbook/workflow-variable) + +### Рабочий процесс: перехватчик запросов + +Плагин request interceptor предоставляет механизм перехвата операций с формами, при котором событие перехвата запускается после отправки соответствующей операции с формой и до ее обработки. Если узел "Завершить процесс" выполняется в последующем потоке процесса после запуска или если другие узлы не выполняются (ошибки или другие неполные выполнения), операция с формой будет перехвачена, в противном случае запланированная операция будет выполнена в обычном режиме. Его можно использовать для бизнес-проверки или логических проверок для утверждения или перехвата отправленных клиентом операций создания, обновления и удаления. + +![](https://static-docs.nocobase.com/3f3991aaf9d73b8c2f7c179e7702d16b.png) + +Более подробную информацию можно найти в документации: [Перехватчик запросов](/handbook/workflow-request-interceptor) + +### Рабочий процесс: Узел ответных сообщений + +Узел ответных сообщений используется для предоставления обратной связи клиенту с помощью пользовательских сообщений в определенных типах рабочих процессов (таких как перехват запросов и события форм). + +Конфигурация узла + +![](https://static-docs.nocobase.com/4376843af541ef6a08696e074cb6cd07.png) + +Подсказка + +![](https://static-docs.nocobase.com/051f12855bd0ce74b22de191b8b87cf5.png) + +Более подробную информацию можно найти в документации: [Узел ответного сообщения](/handbook/workflow-response-message) + +## Несовместимые изменения + +### API с разными именами + +В результате этого изменения в ядре некоторые API новой версии вступают в конфликт с именами старых версий. Эти конфликтующие API старой версии будут сохранены в этой версии, но к ним будет добавлен суффикс `_deprecated`. +| Оригинальный API | Устаревший API | Новый API | +| ---------------------- | ------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | +| CollectionProvider | CollectionProvider_deprecated | [CollectionProvider](https://client.docs.nocobase.com/core/data-source/collection-provider) | +| useCollection | useCollection_deprecated | [useCollection](https://client.docs.nocobase.com/core/data-source/collection-provider#hooks) | +| useCollectionField | useCollectionField_deprecated | [useCollectionField](https://client.docs.nocobase.com/core/data-source/collection-field#hooks) | +| useCollectionManager | usecollectionmanager_рекомендуемый | [useCollectionManager](https://client.docs.nocobase.com/core/data-source/collection-manager-provider#hooks) | +| useContext(CollectionManagerContext) | useCollectionManager_deprecated | [useCollectionManager](https://client.docs.nocobase.com/core/data-source/collection-manager-provider#hooks) | + +Если вы используете вышеупомянутые связанные API, у вас есть два способа изменить: + +- Простая замена: замените исходный API на API с суффиксом `_deprecated`, например, замените `useCollection()` на `useRecord_deprecated()`. +- Используйте новый API в соответствии с новой документацией: хотя названия новых API совпадают со старыми, существуют различия в параметрах и возвращаемых значениях. Вам необходимо обратиться к новой документации для корректировки соответствующего кода. + +### Другие API, требующие корректировки + +- `registerTemplate()` изменен на `app.dataSourceManager.addCollectionTemplates()` +- `registerField()` изменено на `app.dataSourceManager.addFieldInterfaces()` +- `registerGroup()` изменено на `app.dataSourceManager.addFieldInterfaceGroups()` +- `useContext(CollectionManagerContext)` изменен на `useCollectionManager_deprecated()` +- Расширяем коллекции с помощью `ExtendCollectionsProvider` +- `RecordProvider` требует явной передачи родительского параметра, когда это необходимо + +## Изменить примеры + +### Расширение шаблона коллекции + +#### Определение + +Ранее он был определен как объект, теперь его необходимо преобразовать в класс. Например: + +До: + +```typescript +import { ICollectionTemplate } from '@nocobase/client'; + +const calendar: ICollectionTemplate = { + name: 'calendar', + title: 'Calendar collection', + order: 2, + color: 'orange', + // ... +} +``` + +После: + +```typescript +import { CollectionTemplate } from '@nocobase/client'; + +class CalendarCollectionTemplate extends CollectionTemplate { + name = 'calendar'; + title = 'Calendar collection'; + order = 2; + color = 'orange'; +} +``` + +Свойства исходного объекта становятся членами класса. + +#### Регистрация + +Ранее зарегистрированный через "registerTemplate", теперь должен быть зарегистрирован через "dataSourceManager.addCollectionTemplates" плагина. Например: + +До: + +```typescript +import { registerTemplate } from '@nocobase/client'; +import { calendar } from './calendar' + +registerTemplate('calendar', calendar); +``` + +После: + +```typescript +import { Plugin } from '@nocobase/client'; +import { CalendarCollectionTemplate } from './calendar' + +export class CalendarPluginClient extends Plugin { + async load() { + this.app.dataSourceManager.addCollectionTemplates([CalendarCollectionTemplate]); + } +} +``` + +### Расширение интерфейса поля + +#### Определение + +Ранее оно было определено как объект, теперь его необходимо преобразовать в класс. Например: + +До: + +```typescript +import { IField } from '@nocobase/client'; + +const attachment: IField = { + name: 'attachment', + type: 'object', + group: 'media', + title: 'Attachment', + // ... +} +``` + +После: + +```typescript +import { CollectionFieldInterface } from '@nocobase/client'; + +class AttachmentFieldInterface extends CollectionFieldInterface { + name = 'attachment'; + type = 'object'; + group = 'media'; + title = 'Attachment'; + // ... +} +``` + +Свойства исходного объекта становятся членами класса. + +#### Регистрация + +Ранее зарегистрированный через `registerField`, теперь должен быть зарегистрирован через `dataSourceManager.addFieldInterfaces` плагина и не требует повторной передачи `CollectionManagerProvider`. Например: + +До: + +```diff +import { registerField } from '@nocobase/client'; +import { attachment } from './attachment' + +- registerField(attachment.group, 'attachment', attachment); + +export const FileManagerProvider: FC = (props) => { + return ( +- <CollectionManagerProvider interfaces={{ attachment }}> + <SchemaComponentOptions scope={hooks} components={{ UploadActionInitializer }}> + {props.children} + </SchemaComponentOptions> +- </CollectionManagerProvider> + ); +}; +``` + +После: + +```typescript +import { Plugin } from '@nocobase/client'; +import { AttachmentFieldInterface } from './attachment' + +export class FilPlugin extends Plugin { + async load() { + this.app.dataSourceManager.addFieldInterfaces([AttachmentFieldInterface]); + } +} +``` + +### Расширение группы интерфейса поля + +Ранее зарегистрированное через `registerGroup`, теперь необходимо зарегистрировать через `dataSourceManager.addFieldInterfaceGroups` плагина. Например: + +```diff +- import { registerGroup, Plugin } from '@nocobase/client'; ++ import { Plugin } from '@nocobase/client'; + +- registerGroup('map', { +- label: 'Map-based geometry', +- order: 10 +- }) + +export class MapPlugin extends Plugin { + async load() { ++ this.app.dataSourceManager.addFieldInterfaceGroups({ ++ map: { ++ label: generateNTemplate('Map-based geometry'), ++ order: 51, ++ }, ++ }); + } +} +``` + +### `useContext(CollectionManagerContext)` изменен на `useCollectionManager_deprecated()` + +```diff +- const ctx = useContext(CollectionManagerContext); ++ const ctx = useCollectionManager_deprecated(); +``` + +### Расширьте коллекции, используйте "ExtendCollectionsProvider` вместо `CollectionManagerProvider` + +```diff +const Demo = () => { +- <CollectionManagerProvider collections={[apiKeysCollection]}> ++ <ExtendCollectionsProvider collections={[apiKeysCollection]}> +... +- </CollectionManagerProvider> ++ </ExtendCollectionsProvider> +} +``` + +### Изменения в RecordProvider + +Ранее, когда родительское свойство не передавалось, значение последнего RecordProvider автоматически извлекалось в качестве родительского. Теперь родительское значение должно быть передано явно, и если родительское значение не передано, значение родительского значения будет неопределенным. + +```diff +- <RecordProvider record={recordData}> ++ <RecordProvider record={recordData} parent={parentRecordData}> +... +</RecordProvider> +``` + +Если у вас нет архивных данных, вы также можете напрямую использовать `CollectionRecordProvider` для замены. + +```diff +- <RecordProvider record={recordData}> ++ <CollectionRecordProvider record={recordData} parent={parentRecordData}> +... +- </RecordProvider> ++ </CollectionRecordProvider> +``` + +### Разница между `RecordProvider` и `CollectionRecordProvider` + +- `RecordProvider` устарел и будет удален в будущем. +- `RecordProvider` содержит старый `RecordContext`, в то время как `CollectionRecordProvider` этого не делает. diff --git a/docs/ru-RU/welcome/release/v0210-changelog/index.md b/docs/ru-RU/welcome/release/v0210-changelog/index.md new file mode 100644 index 0000000000..45bcca1b1d --- /dev/null +++ b/docs/ru-RU/welcome/release/v0210-changelog/index.md @@ -0,0 +1,187 @@ +# Версия 0.21: 2024-03-29 + +## Анонс + +![v1.0](https://static-docs.nocobase.com/img_v3_029o_3dd91ba0-bb96-4315-a273-208f06d432fg.png) + +## Новые возможности + +### Поддержка графиков с несколькими источниками данных + +![20240407222304](https://static-docs.nocobase.com/20240407222304.png) + +<br /> + +[Для получения дополнительной информации смотрите [Data Visualization] documentation](/handbook/data-visualization) + +### Поддержка нескольких источников данных для рабочего процесса + +![20240407222523](https://static-docs.nocobase.com/20240407222523.png) + +<br /> + +[Дополнительные сведения см. в документации [Workflow] documentation](/handbook/workflow) + +### Оптимизация триггерных событий рабочего процесса + +Изменены названия триггеров: + +| Первоначальное название | Изменено на | +| ------------------ | ------------ | +| События в форме, Операционные события | Послеоперационные события | +| Запланированные задачи | Запланированные события | +| Перехватчики запросов | События, предшествующие операции | +| Утверждение | Approval | + +Усовершенствована настройка режима запуска для следующих событий: + +#### Мероприятия после акции + +![20240407222652](https://static-docs.nocobase.com/20240407222652.png) + +<br /> + +[См. дополнительные сведения [Workflow - Post-action events] documentation](/handbook/workflow-action-trigger) + +#### Мероприятия, предшествующие акции + +![20240407222834](https://static-docs.nocobase.com/20240407222834.png) + +<br /> + +[См. дополнительные сведения [Workflow - Pre-action events] documentation](/handbook/workflow-request-interceptor) + +### Пользовательский плагин для бренда + +![20240407222949](https://static-docs.nocobase.com/20240407222949.png) + +<br /> + +[См. дополнительные сведения [Custom Branding] documentation](/handbook/custom-brand) + +### Поддержка наноидного поля + +![20240407223221](https://static-docs.nocobase.com/20240407223221.png) + +<br /> + +[См. дополнительные сведения [nanoid field] documentation](/handbook/data-modeling/collection-fields/advanced/nanoid) + +### Поддержка поля uuid + +![20240407223431](https://static-docs.nocobase.com/20240407223431.png) + +<br /> + +[См. дополнительные сведения [uuid field] documentation](/handbook/data-modeling/collection-fields/advanced/uuid) + +### Поддержка поля временной метки unix + +![20240407223512](https://static-docs.nocobase.com/20240407223512.png) + +<br /> + +[См. дополнительные сведения [Unix timestamp field] documentation](/handbook/data-modeling/collection-fields/datetime/unix-timestamp) + +### Поле типа номера поддерживает конфигурацию форматирования + +![20240407223736_rec_](https://static-docs.nocobase.com/20240407223736_rec_.gif) + +<br /> + +[См. дополнительные сведенияe [Field configure / Specific property settings / Number component] documentation](/handbook/ui/fields/field-settings/input-number) + +### Поддержка развертывания по дополнительному пути + +Добавлена переменная среды APP_PUBLIC_PATH для поддержки развертывания по дополнительному пути. Например: + +```bash +APP_PUBLIC_PATH=/nocobase/ +``` + +Доступ локально по URL-адресу `http://localhost:13000/nocobase/` + +Пример прокси-сервера nginx: + +```bash +server { + listen 80; + server_name your_domain.com; # Replace your_domain.com with your domain + + location /nocobase/ { + proxy_pass http://127.0.0.1:13000/nocobase/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + proxy_set_header Host $host; + } +} +``` + +Теперь вы можете получить доступ через http://your_domain.com/nocobase/. + +### Оптимизация производительности блоков + +#### Поддержка эффекта скелетного экрана + +Карточный блок + +![20240407224956](https://static-docs.nocobase.com/20240407224956.png) + +Карты Канбан + +![20240407224811](https://static-docs.nocobase.com/20240407224811.png) + +Ячейки таблицы + +![20240407230028](https://static-docs.nocobase.com/20240407230028.png) + +#### Распределенная обработка конфигурации блоков + +Ранее изменения в любой схеме на всей странице приводили к повторному отображению всей страницы. Теперь схема каждого блока независима. + +```tsx | pure +<SchemaComponent distributed schema={} /> +``` + +Грид-компонент также поддерживает распределенную обработку. + +```tsx | pure +{ + 'x-component': 'Grid', + 'x-component-props': { + distributed: true, + }, +} +``` + +## Несовместимые изменения + +### Различные варианты использования схемы пользовательского интерфейса заменены на x-use-decorator-props и x-use-component-props + +Для useProps вместо использования x-component-props с ключом useProps теперь используется x-use-component-props. Вот разница: + +```diff +{ + "x-component": "Input", ++ "x-use-component-props": "useInputProps", +- "x-component-props": { +- useProps: "{{ useInputProps }}" +- } +} +``` + +Для useParams и useSourceId вместо использования x-decorator-props с ключами для useParams и useSourceId теперь используется x-use-decorator-props с одним ключом. Вот разница: + +```diff +{ + "x-decorator": "TableBlockProvider", ++ "x-use-decorator-props": "useDecoratorProps", +- "x-decorator-props": { +- useParams: "{{ useParams }}", +- useSourceId: "{{ useSourceId }}" +- } +} +``` + +Более подробную информацию о x-use-decorator-props и различии между статическими и динамическими свойствами можно найти здесь: [Статические и динамические свойства](https://client.docs.nocobase.com/core/data-block/data-block-provider#%E9%9D%99%E6%80%81%E5%B1%9E%E6%80%A7%E5%92%8C%E5%8A%A8%E6%80%81%E5%B1%9E%E6%80%A7). diff --git a/docs/ru-RU/welcome/release/v08-1-collection-templates/v08-1-collection-templates.jpg b/docs/ru-RU/welcome/release/v08-1-collection-templates/v08-1-collection-templates.jpg new file mode 100644 index 0000000000..dd0a99af84 Binary files /dev/null and b/docs/ru-RU/welcome/release/v08-1-collection-templates/v08-1-collection-templates.jpg differ diff --git a/docs/ru-RU/welcome/release/v08-changelog/pm-flow.svg b/docs/ru-RU/welcome/release/v08-changelog/pm-flow.svg new file mode 100644 index 0000000000..a8a23e1d10 --- /dev/null +++ b/docs/ru-RU/welcome/release/v08-changelog/pm-flow.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="833px" height="633px" viewBox="-0.5 -0.5 833 633"><defs/><g><path d="M 276 176 L 275.84 176 L 275.76 184 L 275.77 192 L 276.22 200 L 275.87 208 L 276 216 L 276 215.97 L 286 216.08 L 296 215.53 L 306 216.69 L 316 216.6 L 326 215.28 L 336 215.48 L 346 215.77 L 356 216.18 L 366 216.11 L 376 215.91 L 386 216.44 L 396 215.95 L 406 216.44 L 416 216.73 L 426 216.59 L 436 215.66 L 446 216.68 L 456 215.37 L 466 216.06 L 476 216 L 475.77 216 L 476.14 222.73 L 475.94 229.45 L 475.79 236.18 L 475.93 242.91 L 476 249.63" fill="none" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 476 254.88 L 476.21 254.98 L 475.29 253.48 L 474.56 252.06 L 473.75 250.61 L 473.24 249.3 L 472.5 247.88 L 472.44 247.77 L 473.31 248.45 L 473.88 248.55 L 474.71 249.15 L 475.3 249.29 L 476 249.63 L 475.99 249.62 L 476.69 249.27 L 477.36 248.84 L 478 248.38 L 478.72 248.08 L 479.5 247.88 L 479.33 247.8 L 478.72 249.24 L 478.08 250.67 L 477.59 252.18 L 476.51 253.39 L 476 254.88 Z Z" fill="#6c8ebf" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 276 116 L 276.59 116 L 276.49 106 L 275.52 96 L 276.4 86 L 276.27 76 L 276.35 66 L 276.3 56 L 276 46 L 276 46.14 L 286.28 46.66 L 296.56 46.04 L 306.84 45.63 L 317.12 45.6 L 327.4 45.34 L 337.68 45.84 L 347.96 46.15 L 358.24 45.59 L 368.51 45.5 L 378.79 46.44 L 389.07 45.7 L 399.35 46.18 L 409.63 46" fill="none" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 414.88 46 L 414.94 46.12 L 413.59 46.92 L 412.07 47.37 L 410.69 48.12 L 409.24 48.71 L 407.88 49.5 L 407.82 49.47 L 408.16 48.77 L 408.6 48.11 L 409.12 47.5 L 409.28 46.7 L 409.63 46 L 409.46 45.91 L 409.15 45.23 L 409.07 44.67 L 408.49 43.85 L 408.18 43.17 L 407.88 42.5 L 407.98 42.7 L 409.33 43.3 L 410.61 43.76 L 412.08 44.59 L 413.56 45.45 L 414.88 46 Z Z" fill="#6c8ebf" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 216 116 L 216 115.51 L 226 115.63 L 236 115.42 L 246 116.26 L 256 116.68 L 266 116.12 L 276 115.71 L 286 115.53 L 296 116.37 L 306 116.4 L 316 116.13 L 326 116.63 L 336 116 L 336.17 116 L 335.29 126 L 335.75 136 L 336.65 146 L 335.89 156 L 335.8 166 L 336 176 L 336 175.59 L 326 175.87 L 316 176.04 L 306 176.37 L 296 176.09 L 286 175.33 L 276 175.72 L 266 176.38 L 256 175.29 L 246 175.39 L 236 175.98 L 226 175.28 L 216 176 L 215.48 176 L 215.81 166 L 216.36 156 L 216.48 146 L 215.94 136 L 216.67 126 L 216 116 L 216 116 Z Z" fill="#e1d5e7" stroke="#9673a6" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 146px; margin-left: 217px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Comic Sans MS; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Local</div></div></div></foreignObject></g><path d="M 136 146 L 136 146.64 L 146.52 145.54 L 157.04 146.39 L 167.56 145.32 L 178.08 146.46 L 188.59 145.66 L 199.11 146.59 L 209.63 146" fill="none" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 214.88 146 L 214.83 145.91 L 213.53 146.8 L 212.05 147.34 L 210.59 147.92 L 209.21 148.66 L 207.88 149.5 L 207.92 149.52 L 208.44 148.91 L 208.4 148.01 L 208.81 147.34 L 209.39 146.76 L 209.63 146 L 209.46 145.91 L 209.37 145.34 L 209.13 144.7 L 208.74 143.98 L 208.3 143.24 L 207.88 142.5 L 207.78 142.29 L 209.19 143.02 L 210.64 143.81 L 212.02 144.47 L 213.51 145.35 L 214.88 146 Z Z" fill="#6c8ebf" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 16 116 L 16 116.09 L 26 115.82 L 36 115.28 L 46 116.04 L 56 116.1 L 66 116.49 L 76 116.23 L 86 115.59 L 96 116.57 L 106 116.59 L 116 116.49 L 126 115.49 L 136 116 L 136.72 116 L 135.49 126 L 136.4 136 L 136.02 146 L 136.46 156 L 135.69 166 L 136 176 L 136 176.72 L 126 176.52 L 116 176.68 L 106 176.63 L 96 176.19 L 86 175.79 L 76 176.02 L 66 175.42 L 56 176.11 L 46 176.15 L 36 175.51 L 26 175.45 L 16 176 L 15.33 176 L 15.4 166 L 16.1 156 L 16.67 146 L 15.95 136 L 16.45 126 L 16 116 L 16 116 Z Z" fill="#dae8fc" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 146px; margin-left: 17px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Comic Sans MS; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">pm.create</div></div></div></foreignObject></g><path d="M 476 176 L 475.68 176 L 475.91 186.52 L 475.86 197.04 L 475.46 207.56 L 475.75 218.08 L 475.91 228.59 L 475.52 239.11 L 476 249.63" fill="none" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 476 254.88 L 476.02 254.89 L 475.46 253.56 L 474.41 251.99 L 474.05 250.76 L 473.41 249.39 L 472.5 247.88 L 472.42 247.72 L 473.14 248.11 L 473.85 248.48 L 474.6 248.94 L 475.35 249.39 L 476 249.63 L 475.9 249.44 L 476.59 249.06 L 477.29 248.72 L 478.04 248.46 L 478.71 248.06 L 479.5 247.88 L 479.7 247.98 L 478.64 249.2 L 478.28 250.77 L 477.53 252.15 L 476.63 253.45 L 476 254.88 Z Z" fill="#6c8ebf" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 416 116 L 416 115.72 L 426 115.43 L 436 115.98 L 446 115.58 L 456 116.19 L 466 115.69 L 476 116.39 L 486 115.61 L 496 116.44 L 506 116.64 L 516 116.4 L 526 115.32 L 536 116 L 536.44 116 L 536.07 126 L 536.25 136 L 536.48 146 L 535.52 156 L 535.7 166 L 536 176 L 536 175.77 L 526 176.05 L 516 176.05 L 506 176.66 L 496 176.01 L 486 175.31 L 476 176.52 L 466 175.54 L 456 176.56 L 446 175.25 L 436 176.66 L 426 175.57 L 416 176 L 416.62 176 L 415.52 166 L 416.5 156 L 416.01 146 L 416.07 136 L 415.38 126 L 416 116 L 416 116 Z Z" fill="#e1d5e7" stroke="#9673a6" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 146px; margin-left: 417px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Comic Sans MS; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Marketplace</div></div></div></foreignObject></g><path d="M 476 76 L 476.09 76 L 476.2 82.73 L 476.07 89.45 L 475.92 96.18 L 475.93 102.91 L 476 109.63" fill="none" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 476 114.88 L 475.85 114.81 L 475.15 113.41 L 474.76 112.16 L 474.07 110.77 L 472.99 109.18 L 472.5 107.88 L 472.56 108.01 L 473.3 108.44 L 473.85 108.48 L 474.68 109.1 L 475.3 109.29 L 476 109.63 L 475.94 109.51 L 476.63 109.14 L 477.33 108.79 L 478.2 108.79 L 478.78 108.19 L 479.5 107.88 L 479.65 107.96 L 478.89 109.33 L 477.9 110.58 L 477.33 112.05 L 476.88 113.57 L 476 114.88 Z Z" fill="#6c8ebf" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 536 46 L 536 46.14 L 546 45.36 L 556 46.35 L 566 45.61 L 576 46.27 L 586 45.68 L 596 45.46 L 606 46.73 L 616 46.33 L 626 45.85 L 636 46.71 L 646 46.04 L 656 45.52 L 666 46.19 L 676 46.01 L 686 45.45 L 696 46 L 695.97 46 L 695.86 56.61 L 696.51 67.21 L 696.62 77.82 L 696.53 88.42 L 695.35 99.03 L 696 109.63" fill="none" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 696 114.88 L 695.85 114.81 L 695.08 113.37 L 694.74 112.15 L 693.94 110.7 L 693.05 109.21 L 692.5 107.88 L 692.4 107.68 L 693.21 108.25 L 693.94 108.67 L 694.51 108.75 L 695.4 109.49 L 696 109.63 L 695.95 109.52 L 696.64 109.16 L 697.42 108.97 L 698 108.37 L 698.78 108.19 L 699.5 107.88 L 699.71 107.98 L 698.76 109.26 L 698.04 110.65 L 697.6 112.18 L 696.55 113.41 L 696 114.88 Z Z" fill="#6c8ebf" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 416 16 L 416 16.21 L 426 15.63 L 436 15.67 L 446 15.6 L 456 15.94 L 466 16.62 L 476 16.18 L 486 15.44 L 496 16.27 L 506 16.21 L 516 16.47 L 526 15.47 L 536 16 L 535.33 16 L 536.37 26 L 535.62 36 L 536.45 46 L 535.71 56 L 535.4 66 L 536 76 L 536 76.41 L 526 75.29 L 516 76.7 L 506 75.75 L 496 75.37 L 486 75.34 L 476 75.82 L 466 76.12 L 456 75.36 L 446 76.66 L 436 76.6 L 426 75.97 L 416 76 L 416.02 76 L 416.18 66 L 416.44 56 L 415.96 46 L 416.27 36 L 415.54 26 L 416 16 L 416 16 Z Z" fill="#dae8fc" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 46px; margin-left: 417px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Comic Sans MS; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">pm.publish</div></div></div></foreignObject></g><path d="M 696 176 L 696.19 176 L 695.76 184 L 696.15 192 L 695.97 200 L 695.85 208 L 696 216 L 696 216 L 686 216.03 L 676 216.08 L 666 215.43 L 656 216.43 L 646 215.43 L 636 216.22 L 626 216.01 L 616 216.47 L 606 216.33 L 596 215.72 L 586 215.43 L 576 216.63 L 566 216.58 L 556 216.12 L 546 215.65 L 536 216.2 L 526 216.7 L 516 215.73 L 506 215.88 L 496 216.39 L 486 216.01 L 476 216 L 476.16 216 L 476 222.73 L 476.1 229.45 L 476.07 236.18 L 475.75 242.91 L 476 249.63" fill="none" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 476 254.88 L 475.86 254.81 L 475.36 253.51 L 474.76 252.16 L 473.69 250.58 L 473.4 249.38 L 472.5 247.88 L 472.43 247.74 L 473.25 248.33 L 473.86 248.5 L 474.63 248.99 L 475.39 249.45 L 476 249.63 L 475.98 249.59 L 476.8 249.48 L 477.37 248.87 L 478.04 248.46 L 478.83 248.3 L 479.5 247.88 L 479.35 247.81 L 478.65 249.21 L 478.29 250.78 L 477.33 252.05 L 476.76 253.51 L 476 254.88 Z Z" fill="#6c8ebf" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 636 116 L 636 116.75 L 646 115.63 L 656 115.34 L 666 116.68 L 676 115.27 L 686 116.44 L 696 116.44 L 706 116.11 L 716 116.47 L 726 116.52 L 736 116.59 L 746 115.67 L 756 116 L 756.61 116 L 756.45 126 L 756.02 136 L 755.86 146 L 755.43 156 L 755.31 166 L 756 176 L 756 175.32 L 746 176.21 L 736 175.38 L 726 176.2 L 716 176.08 L 706 175.88 L 696 176.68 L 686 175.65 L 676 176.07 L 666 176.57 L 656 175.35 L 646 175.5 L 636 176 L 635.89 176 L 636.61 166 L 635.78 156 L 635.59 146 L 636.26 136 L 635.71 126 L 636 116 L 636 116 Z Z" fill="#e1d5e7" stroke="#9673a6" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 146px; margin-left: 637px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Comic Sans MS; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">NPM registry</div></div></div></foreignObject></g><path d="M 536 286 L 536 285.93 L 546.24 285.82 L 556.48 285.29 L 566.73 286.55 L 576.97 285.36 L 587.21 286.49 L 597.45 286.73 L 607.69 285.67 L 617.94 286.02 L 628.18 286.41 L 638.42 285.52 L 648.66 285.82 L 658.91 286.54 L 669.15 285.62 L 679.39 286.19 L 689.63 286" fill="none" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 694.88 286 L 694.93 286.1 L 693.42 286.58 L 692.18 287.6 L 690.78 288.3 L 689.33 288.89 L 687.88 289.5 L 687.92 289.52 L 688.43 288.9 L 688.8 288.21 L 688.77 287.32 L 689.22 286.67 L 689.63 286 L 689.8 286.08 L 689.09 285.2 L 689.02 284.64 L 688.55 283.88 L 688.02 283.1 L 687.88 282.5 L 687.81 282.36 L 689.38 283.39 L 690.67 283.87 L 691.99 284.42 L 693.41 285.16 L 694.88 286 Z Z" fill="#6c8ebf" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 286px; margin-left: 616px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Comic Sans MS; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">Extracting client files</div></div></div></foreignObject></g><path d="M 416 256 L 416 256.21 L 426 256.64 L 436 256.56 L 446 256.49 L 456 255.37 L 466 256.36 L 476 256.6 L 486 256.35 L 496 255.57 L 506 256.06 L 516 256.36 L 526 255.84 L 536 256 L 536.53 256 L 536.31 266 L 536.7 276 L 535.45 286 L 536.02 296 L 536.69 306 L 536 316 L 536 316.3 L 526 316.7 L 516 316.42 L 506 315.29 L 496 315.98 L 486 315.48 L 476 316.39 L 466 315.67 L 456 316.72 L 446 315.52 L 436 316.5 L 426 315.78 L 416 316 L 415.9 316 L 415.52 306 L 416.42 296 L 416.2 286 L 415.43 276 L 415.74 266 L 416 256 L 416 256 Z Z" fill="#dae8fc" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 286px; margin-left: 417px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Comic Sans MS; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">pm.add</div></div></div></foreignObject></g><path d="M 696 256 L 696 255.44 L 706 255.58 L 716 255.54 L 726 256.11 L 736 256 L 746 255.25 L 756 256.35 L 766 255.53 L 776 255.49 L 786 255.8 L 796 255.9 L 806 256.24 L 816 256 L 816.3 256 L 815.88 266 L 815.75 276 L 816.33 286 L 815.28 296 L 815.5 306 L 816 316 L 816 315.78 L 806 316.17 L 796 315.31 L 786 315.7 L 776 316.48 L 766 315.66 L 756 316.68 L 746 316.17 L 736 316.38 L 726 315.95 L 716 315.6 L 706 316.57 L 696 316 L 696.67 316 L 695.28 306 L 696.61 296 L 695.54 286 L 696.23 276 L 696.59 266 L 696 256 L 696 256 Z Z" fill="#ffe6cc" stroke="#d79b00" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 286px; margin-left: 697px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Comic Sans MS; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">app/client plugins</div></div></div></foreignObject></g><path d="M 476 316 L 475.97 316 L 475.76 322.73 L 475.86 329.45 L 476.15 336.18 L 475.9 342.91 L 476 349.63" fill="none" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 476 354.88 L 476.1 354.93 L 475.51 353.59 L 474.72 352.14 L 474.12 350.79 L 473.41 349.39 L 472.5 347.88 L 472.59 348.05 L 473.18 348.19 L 473.91 348.6 L 474.49 348.71 L 475.27 349.23 L 476 349.63 L 476.07 349.77 L 476.64 349.17 L 477.35 348.83 L 478.08 348.53 L 478.85 348.33 L 479.5 347.88 L 479.36 347.81 L 478.73 349.25 L 478.18 350.72 L 477.59 352.18 L 476.92 353.59 L 476 354.88 Z Z" fill="#6c8ebf" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 476 416 L 476.07 416 L 475.96 422.73 L 475.92 429.45 L 475.99 436.18 L 475.89 442.91 L 476 449.63" fill="none" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 476 454.88 L 476.06 454.91 L 475.25 453.46 L 474.69 452.13 L 473.85 450.66 L 473.21 449.29 L 472.5 447.88 L 472.53 447.95 L 473.13 448.09 L 473.85 448.49 L 474.67 449.07 L 475.38 449.44 L 476 449.63 L 475.96 449.56 L 476.68 449.25 L 477.47 449.07 L 478.09 448.56 L 478.81 448.25 L 479.5 447.88 L 479.33 447.8 L 478.69 449.23 L 477.99 450.63 L 477.43 452.1 L 476.89 453.58 L 476 454.88 Z Z" fill="#6c8ebf" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 416 356 L 416 356.2 L 426 355.28 L 436 356.24 L 446 355.32 L 456 355.83 L 466 355.46 L 476 356.04 L 486 355.37 L 496 356.21 L 506 356.38 L 516 356.28 L 526 355.87 L 536 356 L 535.99 356 L 536.2 366 L 535.76 376 L 535.77 386 L 535.36 396 L 535.33 406 L 536 416 L 536 415.34 L 526 416.62 L 516 416.67 L 506 416.04 L 496 416.64 L 486 415.95 L 476 415.34 L 466 416 L 456 416.44 L 446 416.7 L 436 415.48 L 426 416.69 L 416 416 L 415.89 416 L 416.1 406 L 416.57 396 L 415.39 386 L 415.96 376 L 416.1 366 L 416 356 L 416 356 Z Z" fill="#dae8fc" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 386px; margin-left: 417px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Comic Sans MS; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">pm.enable</div></div></div></foreignObject></g><path d="M 476 516 L 476.19 516 L 476.25 522.73 L 475.88 529.45 L 475.88 536.18 L 476.16 542.91 L 476 549.63" fill="none" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 476 554.88 L 475.99 554.88 L 475.09 553.38 L 474.56 552.06 L 474.05 550.75 L 473.31 549.34 L 472.5 547.88 L 472.52 547.91 L 473.3 548.43 L 473.93 548.65 L 474.61 548.95 L 475.31 549.3 L 476 549.63 L 475.92 549.47 L 476.68 549.23 L 477.4 548.93 L 478.02 548.42 L 478.78 548.2 L 479.5 547.88 L 479.46 547.86 L 478.96 549.36 L 478.24 550.75 L 477.35 552.06 L 476.59 553.43 L 476 554.88 Z Z" fill="#6c8ebf" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 416 456 L 416 456.62 L 426 455.28 L 436 455.99 L 446 455.29 L 456 456.54 L 466 455.74 L 476 455.65 L 486 455.76 L 496 456.41 L 506 455.76 L 516 455.69 L 526 455.78 L 536 456 L 536.33 456 L 536.19 466 L 535.85 476 L 536.34 486 L 535.58 496 L 535.64 506 L 536 516 L 536 515.51 L 526 516.66 L 516 516.12 L 506 515.97 L 496 515.37 L 486 516.22 L 476 515.71 L 466 516.46 L 456 516.52 L 446 515.87 L 436 516.72 L 426 516.36 L 416 516 L 416.48 516 L 416.44 506 L 416.72 496 L 415.76 486 L 415.75 476 L 416.38 466 L 416 456 L 416 456 Z Z" fill="#dae8fc" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 486px; margin-left: 417px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Comic Sans MS; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">pm.disable</div></div></div></foreignObject></g><path d="M 416 556 L 416 555.7 L 426 555.76 L 436 556.21 L 446 556.24 L 456 555.43 L 466 555.27 L 476 555.72 L 486 555.86 L 496 555.8 L 506 555.89 L 516 556.48 L 526 556.46 L 536 556 L 536.63 556 L 535.35 566 L 536.62 576 L 536.1 586 L 535.97 596 L 536.38 606 L 536 616 L 536 616.55 L 526 615.52 L 516 616.05 L 506 616.36 L 496 616.2 L 486 616.52 L 476 615.83 L 466 615.4 L 456 616.41 L 446 615.67 L 436 616.24 L 426 615.75 L 416 616 L 416.74 616 L 415.79 606 L 416.4 596 L 415.83 586 L 416.04 576 L 416.38 566 L 416 556 L 416 556 Z Z" fill="#dae8fc" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 586px; margin-left: 417px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Comic Sans MS; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">pm.remove</div></div></div></foreignObject></g></g></svg> diff --git a/docs/ru-RU/welcome/release/v08-changelog/pm-ui.jpg b/docs/ru-RU/welcome/release/v08-changelog/pm-ui.jpg new file mode 100644 index 0000000000..4c8fdd3c1a Binary files /dev/null and b/docs/ru-RU/welcome/release/v08-changelog/pm-ui.jpg differ diff --git a/docs/ru-RU/welcome/release/v08-changelog/topright.jpg b/docs/ru-RU/welcome/release/v08-changelog/topright.jpg new file mode 100644 index 0000000000..8ce5109730 Binary files /dev/null and b/docs/ru-RU/welcome/release/v08-changelog/topright.jpg differ diff --git a/docs/ru-RU/welcome/release/v1001-changelog.md b/docs/ru-RU/welcome/release/v1001-changelog.md new file mode 100644 index 0000000000..2d7003dbab --- /dev/null +++ b/docs/ru-RU/welcome/release/v1001-changelog.md @@ -0,0 +1,371 @@ +# Версия 1.0: 2024-04-28 + +## Этап обновления 1.0 + +После 3 лет разработки NocoBase достиг своего первого крупного обновления версии, перейдя с версии 0.x на 1.0. Это знаменует собой важную веху. + +В фазе 0.x: Основное API и функции претерпевали быстрые изменения, и каждая новая версия могла содержать критические изменения. +В фазе 1.x: Основное API стабилизировалось, и NocoBase сосредоточится на добавлении новых плагинов, оптимизации безопасности и улучшении производительности, сохраняя при этом стабильность. + +## Новые возможности + +- Редактор тем может настраивать отступы между страницами и режимами, интервал между блоками и радиус угла блока. +- При добавлении блоков коллекции поддерживают фильтрацию. +- Записи взаимосвязей поддерживают сортировку. +- Улучшена интерактивность визуализации данных. +- Поддержка добавления блоков диаграмм на мобильных устройствах. +- Блоки фильтров диаграммы поддерживают настройку объема данных поля. +- Добавьте дополнительные переменные, [подробнее](https://docs.nocobase.com/handbook/ui/variables). +- Блоки из любых коллекций могут быть добавлены во всплывающие окна. +- Рабочие процессы: "Событие после действия" может быть запущено с помощью кнопок внутри ассоциативных блоков. +- Автоматическое обновление данных в родительском контейнере при изменении данных во всплывающем окне. +- Значительное повышение производительности блоков таблиц. +- Существенное увеличение охвата тестированием.м + +## Новые плагины + +- Поле: Markdown (Vditor) + + - Используется для хранения Markdown и его рендеринга с помощью редактора Vditor, поддерживает общий синтаксис Markdown и поддерживает загрузку изображений, записей и т.д. Также позволяет выполнять мгновенный рендеринг, где вы получаете то, что видите. + - Комментарии + - Предоставляет шаблон коллекции комментариев и блок для добавления функций комментирования к любой коллекции. + +## Полный список изменений + +<details> +<summary>Открыть полный список изменений</summary> + +- feat(plugin-workflow): refresh the list after sync <u>#4177</u> +- feat(plugin-workflow): show workflow key as tooltip on title <u>#4178</u> +- test(plugin-workflow): add test cases <u>#4199</u> +- chore: api cache control header <u>#4203</u> +- feat: load vditor dep from local <u>#4190</u> +- test: input number separator test <u>#4204</u> +- fix: number field shuold support separator setting <u>#4197</u> +- fix(plugin-workflow): refine experience <u>#4195</u> +- chore: optimize warning wordings of import & export <u>#4196</u> +- refactor: external data source collection manager <u>#4193</u> +- fix: env bug <u>#4191</u> +- fix: empty operator with association field <u>#4189</u> +- chore: add e2e <u>#4184</u> +- fix: vditor version <u>#4183</u> +- refactor: form data template locale improve <u>#4188</u> +- test: add automated testing <u>#4098</u> +- chore: data source logger instance <u>#4181</u> +- chore: get database instance in relation repository <u>#4179</u> +- chore: add e2e for variables <u>#4152</u> +- chore: define collection debug message <u>#4176</u> +- chore: unsupportedFields in view collection <u>#4155</u> +- feat: add plugin-field-markdown-vditor <u>#4065</u> +- fix: bulk edit form acl action error <u>#4166</u> +- fix: auto create uuid foreign key in relation field <u>#4160</u> +- fix(plugin-fm): fix confusing size limit hint <u>#4153</u> +- fix(users): improve users:updateProfile <u>#4162</u> +- fix(client): get api url <u>#4161</u> +- feat: remove plugin-ui-routes-storage <u>#4140</u> +- fix: lock cytoscape version <u>#4158</u> +- refactor: collection template support presetFieldsDisabled <u>#4159</u> +- fix: grid schema <u>#4157</u> +- client unit test <u>#4150</u> +- fix: update belongs to many association that target key is not primary key <u>#4146</u> +- refactor: form data template locale improve <u>#4148</u> +- fix(database): column name in array field <u>#4110</u> +- test: refresh on action e2e test <u>#4147</u> +- fix(custom-request): support configuring content type <u>#4144</u> +- chore: deprecate the current record variable from the form <u>#4063</u> +- feat(Theme): add some tokens <u>#4137</u> +- fix(client): fix some warnings <u>#4143</u> +- style: tableActionColumn style improve <u>#4138</u> +- fix: actionBar style improve <u>#4123</u> +- chore: warning message if on delete conflict <u>#4141</u> +- fix(plugin-workflow-manual): allow pass node when no assignee <u>#4139</u> +- chore: datasource manager api <u>#4124</u> +- fix(plugin-workflow-manual): fix assignees parsing bug <u>#4125</u> +- fix: load association field in collection <u>#4122</u> +- perf: remove all Skeleton animation <u>#4113</u> +- test: add e2e <u>#4121</u> +- chore(data-vi): adjust api <u>#4116</u> +- fix: scheduleEventTrigger <u>#4114</u> +- feat(plugin-workflow): add checker for intervally dispatching <u>#4119</u> +- feat: add filterOtherRecordsCollection for DataBlockInitializer <u>#4117</u> +- refactor: optimize CollectionField <u>#4111</u> +- fix: improve sort field migration <u>#4112</u> +- fix: field component <u>#4102</u> +- fix: association select support add mode <u>#4108</u> +- fix: createdBy & updatedBy target option <u>#4109</u> +- fix(linkage-rule): linkage rule support empty condiction <u>#4103</u> +- fix: add SanitizedCollectionProvider <u>#4100</u> +- fix: tree collection target error <u>#4105</u> +- fix: add ClearCollectionFieldContext <u>#4101</u> +- feat: improve form block <u>#4099</u> +- chore: migrate sortable options to sort field <u>#4011</u> +- feat: support sort option in appends <u>#4056</u> +- feat(data-vi): allows pie chart to accept negative numbers, fix T-4075 <u>#4094</u> +- fix(data-vi): number becomes string after precision transformation <u>#4092</u> +- fix: encode url params <u>#4055</u> +- test(plugin-workflow): add test case for duplicated triggering schedule workflow <u>#3817</u> +- perf(LinkageRules): solve lagging problems <u>#4090</u> +- fix(subTable): should not display Allow add new data option <u>#4086</u> +- fix: missing fields <u>#4083</u> +- fix: table select pagination error <u>#4078</u> +- fix: reset page when setting block data scope <u>#4081</u> +- fix: custom request role list <u>#4074</u> +- fix: parse iso week <u>#4068</u> +- fix(sourceId): avoid error <u>#4077</u> +- fix(sql-collection): can't select interface when setting fields <u>#4079</u> +- fix: load with source field <u>#4075</u> +- fix: deletion of operation linkage rules does not take effect in real time <u>#4058</u> +- fix(core): fix round bug in formula evaluator <u>#4070</u> +- test: add e2e for data loading mode <u>#4069</u> +- fix(filterForm): avoid duplicate names <u>#4071</u> +- chore: optimize block title <u>#4040</u> +- fix: sync default value in view <u>#4067</u> +- fix(defaultValue): fix the issue of default values disappearing after refreshing the page <u>#4066</u> +- refactor: gantt block <u>#4059</u> +- fix: sub-table big field should support variable default value <u>#4062</u> +- chore(Theme): set the default font size of the Compact theme to 16 <u>#4064</u> +- test: add e2e for actions <u>#4053</u> +- fix(variable): missing variables and invalid translations <u>#4054</u> +- test: add backend unit tests <u>#4000</u> +- fix: improve card item <u>#4036</u> +- chore(acl): disable register association fields actions <u>#4014</u> +- fix(variable): fix parent record variable reporting errors in data scope <u>#4039</u> +- test(e2e): add assertions on field values <u>#4034</u> +- feat(Variable): add a new variable <u>#4025</u> +- feat: run e2e with pro plugins <u>#3890</u> +- fix: bug <u>#4038</u> +- fix: array operator with camel case field <u>#4032</u> +- fix: scopeKeyOptions should be obtained in real-time <u>#4029</u> +- fix(addText): should use FormItemSchemaToolbar instead of BlockSchema… <u>#3963</u> +- feat: register once hook in datasource manager <u>#4024</u> +- fix: snippets <u>#4030</u> +- fix: vitest single bug <u>#4031</u> +- feat(data-vi): improved user experiences (refer to pr) <u>#4013</u> +- test: add frontend unit test <u>#3991</u> +- feat: support Others option in popup <u>#4015</u> +- fix(collection-manager): no refresh after override the field <u>#4022</u> +- chore: add export & import warnings <u>#4027</u> +- refactor: third party data source support sort field grouped sorting edit <u>#4023</u> +- fix(plugin-acl): pm.acl.roles snippet <u>#4026</u> +- test: association name block e2e test <u>#4021</u> +- fix: get api url <u>#4020</u> +- fix(Sub-details): the initializer button is not displayed when the field value is empty <u>#4019</u> +- fix: initializer use useAassociationName <u>#4018</u> +- fix(auth): cas login bug when use subdirectory deployment <u>#4017</u> +- fix(TreeTable): add child error <u>#4008</u> +- fix: remove active field should not clear value <u>#4012</u> +- fix(plugin-acl): datasource roles snippet <u>#4016</u> +- fix: after selecting all, bulk update prompts for unselected data <u>#4010</u> +- refactor: tree table is not enabled by default <u>#4001</u> +- feat(plugin-workflow-action-trigger): support association actions to trigger <u>#4007</u> +- Update application.ts <u>#4006</u> +- fix: tag filed setting <u>#4009</u> +- fix(users): remove phone validation due to incorrect check of foreign phone numebrs <u>#4005</u> +- fix: association block action permission verification failed <u>#3994</u> +- refactor: fields for table sorting cannot select sorting fields with scopekey <u>#3984</u> +- fix(Form): invalid parentRecord <u>#3998</u> +- fix(plugin-workflow): adjust locale <u>#3993</u> +- fix: sub -table support allowSelectExistingRecord setting <u>#4004</u> +- fix(auth): sign up page not found when entering with url directly <u>#4002</u> +- chore(database): set null value when field is unique and value is empty string <u>#3997</u> +- chore(gateway): report error with cause message <u>#3999</u> +- chore(error-handler): display message cause the error <u>#3996</u> +- fix: restore with table name in camel case <u>#3995</u> +- refactor(plugin-workflow): adjust comments <u>#3990</u> +- fix: gantt collapse & expand <u>#3982</u> +- fix(BulkForm): should be required when switching to 'Changed to' <u>#3965</u> +- fix: move action <u>#3985</u> +- refactor: sort field should not has defaultValue <u>#3986</u> +- chore: update class names of plugins <u>#3981</u> +- feat(plugin-workflow-sync): add sync when multi-app-share-collection enabled <u>#3969</u> +- fix(localization): incorrect locale when first entering <u>#3968</u> +- chore: adjust and add api comments <u>#3951</u> +- refactor: select options configuration <u>#3964</u> +- fix(GridCard): set the count of columns displayed in a row <u>#3960</u> +- refactor: only numerical formula fields support format <u>#3962</u> +- chore(plugin-workflow): add comments <u>#3959</u> +- chore: remove legacy formula plugins <u>#3939</u> +- fix(LinkageRules): should be effective immediately <u>#3958</u> +- fix(Picker): should display Allow add new data option <u>#3957</u> +- fix(connect-data-blocks): should immediately show in the drop-down menu <u>#3953</u> +- fix: left menu title modify <u>#3956</u> +- fix: template list provider bug <u>#3950</u> +- refactor: nanoid &uuid autoFill <u>#3955</u> +- feat: getParentJsonSchema in ui schema repository <u>#3690</u> +- fix: save uuid & nano id field value with sequelize validation <u>#3952</u> +- fix: throughCollection support fuzzy search <u>#3949</u> +- fix: getSourceKeyByAssocation <u>#3947</u> +- fix(RichText): unify style <u>#3946</u> +- fix(connectDataBlocks): should add FilterBlockProvider to Grid <u>#3944</u> +- chore: add appVersion to Schema <u>#3936</u> +- fix: collectionFieldInterfaceSelect <u>#3945</u> +- fix: fix sourceId of templates <u>#3941</u> +- fix(collection manager): collection manager primarykey & nanoid & uuid suport index setting <u>#3943</u> +- fix(plugin-formula-field): fix component context <u>#3937</u> +- fix: nanoid availableTypes <u>#3942</u> +- fix: automatically generate default values <u>#3940</u> +- fix: formula field caluation error <u>#3938</u> +- fix: formula field support format <u>#3928</u> +- refactor: unify tab initailizer naming <u>#3932</u> +- fix: add zIndex to Lightbox overlay style <u>#3934</u> +- fix(Table): fix the problem that the content of the association field is not displayed <u>#3930</u> +- fix(evaluators): fix array flatten <u>#3931</u> +- refactor: main data source view collection support filterTargetKey <u>#3818</u> +- fix: formula field calculation error <u>#3929</u> +- fix: load view collection belongs to association with source options <u>#3912</u> +- fix: edit form unchanged should not appear unSaveed warning when cloas modal <u>#3920</u> +- fix(Collapse): fix error for chinaRegions <u>#3925</u> +- fix: number display format <u>#3924</u> +- fix(defaultValue): should immediate effect when set default value <u>#3923</u> +- feat: action support refreshDataBlockRequest configuration <u>#3882</u> +- refactor: formBlockProvider & detailBlockProvider <u>#3898</u> +- feat(data-vi): allows to add charts for mobile client <u>#3922</u> +- chore: add API comments <u>#3919</u> +- fix: fix Pagination <u>#3921</u> +- test(plugin-error-handler): middleware <u>#3909</u> +- fix: update plugin <u>#3895</u> +- fix: gantt block pagination <u>#3918</u> +- fix: source id null <u>#3917</u> +- fix(Table): fix Pagination <u>#3916</u> +- fix: get the correct sourceId <u>#3897</u> +- fix(DataScope): fix no immediate effect issue after saving <u>#3910</u> +- fix: select field options initialValue <u>#3911</u> +- fix: external link click <u>#3908</u> +- fix(inputNumber): loss of accuracy in inputNumber <u>#3902</u> +- feat(plugin-workflow-action-trigger): add global action events <u>#3883</u> +- docs: add api comment <u>#3868</u> +- fix: vitest config bug <u>#3907</u> +- fix: table fixed bug <u>#3901</u> +- fix: list data undefined error <u>#3905</u> +- fix: lazy render bug <u>#3886</u> +- fix: sort params missing <u>#3906</u> +- refactor: change useProps to x-use-component-props <u>#3853</u> +- fix(withDynamicSchemaProps): change deep merge to shallow merge <u>#3899</u> +- fix: history block add print button, click print button to report error <u>#3900</u> +- fix: tar bug <u>#3891</u> +- chore: return bigInt as string type <u>#3887</u> +- feat(data-vi): data scope for chart filter fields <u>#3894</u> +- feat: adjust menu of add new <u>#3884</u> +- fix(plugin-custom-request): fix edit button dialog <u>#3893</u> +- fix: fieldNames missing when setting data scope <u>#3892</u> +- fix: deps check error when dev add production plugin <u>#3848</u> +- fix: workflow tabs not exists <u>#3889</u> +- fix: association field support data scope linkage <u>#3888</u> +- fix: templateBlockProvider support association field append <u>#3866</u> +- chore: main datasource api <u>#3880</u> +- feat: run vitest with coverage <u>#3802</u> +- fix: avoid duplicate menu keys <u>#3885</u> +- fix(data-vi): dual axes chart displays abnormally <u>#3881</u> +- fix: reject update when filter is empty object <u>#3777</u> +- chore: update field with primary key attribute <u>#3852</u> +- refactor: uuid & nanoid support default value configuration <u>#3830</u> +- feat: table performance <u>#3791</u> +- fix: setFormValueChanged undefined <u>#3879</u> +- fix(client): fix diabled in filter dynamic component <u>#3874</u> +- fix(plugin-workflow-parallel): fix locale <u>#3876</u> +- fix(formula-field): formula field set form value change <u>#3873</u> +- fix: formBlockProvider block display <u>#3877</u> +- refactor(plugin-workflow): change to <u>#3871</u> +- fix: kanban card modal display abnormal <u>#3863</u> +- fix: filterTargetKey only support view collection <u>#3872</u> + +</details> + +## Изменения в плагинах + +Следующие плагины больше не предоставляются в виде версий с открытым исходным кодом (пользователи, которые использовали их в производственных средах, пожалуйста, свяжитесь с нами для обновления): + +- @nocobase/plugin-auth-cas: Аутентифицирует личность с помощью протокола CAS. +- @nocobase/plugin-auth-odic: Аутентифицирует личность по протоколу OIDC (OpenID Connect). +- @nocobase/plugin-auth-saml: Аутентифицирует личность по протоколу SAML 2.0. + +Следующие плагины устарели и будут удалены в следующих версиях: + +- @nocobase/plugin-audit-logs: Устарели, временно не удалены и не будут установлены в новой версии. +- @nocobase/plugin-snapshot-поле: устарело, временно не удалено, не будет установлено в новой версии. +- @nocobase/plugin-графики: вместо этого используйте @nocobase/plugin-визуализация данных. +- @nocobase/plugin-excel-formula-field: Вместо этого используйте @nocobase/plugin-field-formula. +- @nocobase/plugin-math-formula-field: Вместо этого используйте @nocobase/plugin-field-formula. +- @nocobase/plugin-ui-routes-storage: Устарел, интерфейсные маршруты могут быть расширены непосредственно во внешнем интерфейсе. + +С полным списком плагинов вы можете ознакомиться здесь: [https://www.nocobase.com/plugins.html](https://www.nocobase.com/plugins.html) + +## Комментарии к коду + +Чтобы упростить процесс разработки, мы добавили комментарии к некоторым специальным API-интерфейсам: + +- `@internal`: Обычно используется для определения деталей внутренней реализации или методов, которые не предназначены для публичного использования, но существуют для внутреннего использования в коде. +- `@experimental`: Используется для идентификации экспериментальных функций или API. Эти API все еще находятся на стадии разработки и тестирования, могут претерпеть значительные изменения или даже быть удалены или заменены в будущих версиях. +- `@deprecated`: Используется для идентификации устаревших функций, методов или API в коде. Хотя они все еще доступны, в будущих версиях они могут быть удалены или могут быть доступны более эффективные альтернативные решения. + +## Лицензионное соглашение + +NocoBase имеет двойную лицензию - AGPL-3.0 и коммерческую лицензию. Для получения дополнительной информации, пожалуйста, ознакомьтесь с [Лицензионным соглашением NocoBase](https://cn.nocobase.com/agreement-cn.html). + +## Руководство по обновлению + +- Всегда делайте резервную копию своей базы данных перед обновлением! Всегда делайте резервную копию своей базы данных! Всегда делайте резервную копию своей базы данных! +- Вы также можете создать резервную копию всего кода проекта. + +Поскольку три модуля единого входа Auth: CAS, Auth: OIDC, Auth: SAML удалены из открытого исходного кода, обновление будет разделено на два этапа. + +### Если вы не используете плагины единого входа + +Пожалуйста, выполните обновление [обычным способом](https://docs.nocobase.com/welcome/getting-started/upgrading). + +### Если вы используете плагины единого входа + +Пожалуйста, выполните следующие действия для обновления: + +#### 1. Обновите приложение + +Обратитесь к [Обзору обновления NocoBase] (/добро пожаловать/начало работы/обновление) и обновите NocoBase до последней версии. + +Если вы ранее включали плагины CAS, OIDC, SAML, во время обновления вы увидите следующие подсказки: + +Запрос терминала обновления командной строки: + +![20240428212151](https://static-docs.nocobase.com/20240428212151.png) + +Запрос интерфейса версии Docker: + +![20240428194926](https://static-docs.nocobase.com/20240428194926.png) + +#### 2. Удалите плагины или установите версию плагина 1.0? + +***Если вы решите удалить плагины и продолжить обновление:*** + +Удалите плагины в соответствии с инструкциями + +```bash +# Основное приложение +yarn pm remove cas oidc saml --force +# Если это вложенное приложение, добавьте --app parameter +yarn pm remove cas oidc saml --force --app=sub-app1 +``` + +Продолжайте обновление + +```bash +yarn nocobase upgrade +``` + +***Если вы решите обновить плагины до версии 1.0*** + +Свяжитесь с командой NocoBase, чтобы получить плагины версии 1.0 и продолжить обновление. + +#### 3. Процесс обновления плагинов CAS, OIDC, SAML + +На данный момент интерфейс приложения больше недоступен, поэтому нам необходимо обновить его вручную. + +1. Войдите в свою учетную запись на платформе Business User Services Platform, чтобы загрузить последнюю версию плагинов. +2. Распакуйте плагины в указанный каталог + - Плагин CAS распаковать в файл `./storage/plugins/@nocobase/plugin-auth-cas`. + - Плагин OIDC распаковать в "./хранилище/плагины/@nocobase/plugin-auth-oidc" + - Плагин SAML распаковать в `./хранилище/плагины/@nocobase/plugin-auth-saml` +3. Обновите приложение + - Для получения версии Docker просто перезапустите контейнер + - Для получения исходного кода или версии приложения create-nocobase-app + 1. Загрузите зависимости `yarn install` + 2. Выполните команду обновления "yarn nocobase upgrade` + 3. Перезапустите приложение diff --git a/package.json b/package.json index 951c81045e..f8239d93b0 100644 --- a/package.json +++ b/package.json @@ -8,10 +8,12 @@ "dev:en": "cross-env DOC_LANG=en-US dumi dev", "dev:fr": "cross-env DOC_LANG=fr-FR dumi dev", "dev:ja": "cross-env DOC_LANG=ja-JP dumi dev", + "dev:ru": "cross-env DOC_LANG=ru-RU dumi dev", "build": "dumi build", "build:en": "cross-env DOC_LANG=en-US dumi build", "build:fr": "cross-env DOC_LANG=fr-FR dumi build", "build:ja": "cross-env DOC_LANG=ja-JP dumi build", + "build:ru": "cross-env DOC_LANG=ru-RU dumi build", "prepare": "husky install && dumi setup" }, "authors": [], @@ -30,7 +32,7 @@ "@commitlint/cli": "^18.2.0", "@commitlint/config-conventional": "^18.1.0", "cross-env": "^7.0.3", - "dumi": "^2.2.14", + "dumi": "2.2.14", "husky": "^8.0.3", "lint-staged": "^15.0.2", "prettier": "^3.0.3" @@ -40,6 +42,9 @@ "@nocobase/client": "^0.21.0-alpha.6", "axios-mock-adapter": "1.22.0", "dumi-theme-nocobase": "^0.2.31", + "moment": "^2.30.1", + "react": "^19.1.1", + "react-dom": "^19.1.1", "sucrase": "^3.0.0", "vditor": "^3.10.8" }, diff --git a/yarn.lock b/yarn.lock index 54eee444d2..af15ab31a4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,51 +12,40 @@ tslib "^2.4.1" "@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" "@ant-design/colors@^6": version "6.0.0" - resolved "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz#9b9366257cffcc47db42b9d0203bb592c13c0298" + resolved "https://registry.yarnpkg.com/@ant-design/colors/-/colors-6.0.0.tgz#9b9366257cffcc47db42b9d0203bb592c13c0298" integrity sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ== dependencies: "@ctrl/tinycolor" "^3.4.0" -"@ant-design/colors@^7.0.0": - version "7.0.0" - resolved "https://registry.npmjs.org/@ant-design/colors/-/colors-7.0.0.tgz#eb7eecead124c3533aea05d61254f0a17f2b61b3" - integrity sha512-iVm/9PfGCbC0dSMBrz7oiEXZaaGH7ceU40OJEfKmyuzR9R5CRimJYPlRiFtMQGQcbNMea/ePcoIebi4ASGYXtg== - dependencies: - "@ctrl/tinycolor" "^3.4.0" - -"@ant-design/colors@^7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@ant-design/colors/-/colors-7.0.2.tgz#c5c753a467ce8d86ba7ca4736d2c01f599bb5492" - integrity sha512-7KJkhTiPiLHSu+LmMJnehfJ6242OCxSlR3xHVBecYxnMW8MS/878NXct1GqYARyL59fyeFdKRxXTfvR9SnDgJg== +"@ant-design/colors@^7.0.0", "@ant-design/colors@^7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@ant-design/colors/-/colors-7.2.1.tgz#3bbc1c6c18550020d1622a0067ff03492318df98" + integrity sha512-lCHDcEzieu4GA3n8ELeZ5VQ8pKQAWcGGLRTQ50aQM2iqPpq2evTxER84jfdPvsPAtEcZ7m44NI45edFMo8oOYQ== dependencies: - "@ctrl/tinycolor" "^3.6.1" + "@ant-design/fast-color" "^2.0.6" -"@ant-design/cssinjs@^1", "@ant-design/cssinjs@^1.11.1", "@ant-design/cssinjs@^1.17.2", "@ant-design/cssinjs@^1.3.1": - version "1.17.2" - resolved "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.17.2.tgz#08e939cbe60e9e0e0f3f03cd53a52e4a7623ed1f" - integrity sha512-vu7lnfEx4Mf8MPzZxn506Zen3Nt4fRr2uutwvdCuTCN5IiU0lDdQ0tiJ24/rmB8+pefwjluYsbyzbQSbgfJy+A== +"@ant-design/cssinjs-utils@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@ant-design/cssinjs-utils/-/cssinjs-utils-1.1.3.tgz#5dd79126057920a6992d57b38dd84e2c0b707977" + integrity sha512-nOoQMLW1l+xR1Co8NFVYiP8pZp3VjIIzqV6D6ShYF2ljtdwWJn5WSsH+7kvCktXL/yhEtWURKOfH5Xz/gzlwsg== dependencies: - "@babel/runtime" "^7.11.1" - "@emotion/hash" "^0.8.0" - "@emotion/unitless" "^0.7.5" - classnames "^2.3.1" - csstype "^3.0.10" - rc-util "^5.35.0" - stylis "^4.0.13" + "@ant-design/cssinjs" "^1.21.0" + "@babel/runtime" "^7.23.2" + rc-util "^5.38.0" -"@ant-design/cssinjs@^1.18.5": - version "1.19.1" - resolved "https://registry.yarnpkg.com/@ant-design/cssinjs/-/cssinjs-1.19.1.tgz#d3bb4f58ee884c9c757688e611e7a6de9867ea75" - integrity sha512-hgQ3wiys3X0sqDKWkqCJ6EYdF79i9JCvtavmIGwuuPUKmoJXV8Ff0sY+yQQSxk2dRmMyam/bYKo/Bwor45hnZw== +"@ant-design/cssinjs@^1", "@ant-design/cssinjs@^1.11.1", "@ant-design/cssinjs@^1.21.0", "@ant-design/cssinjs@^1.21.1", "@ant-design/cssinjs@^1.23.0", "@ant-design/cssinjs@^1.3.1": + version "1.24.0" + resolved "https://registry.yarnpkg.com/@ant-design/cssinjs/-/cssinjs-1.24.0.tgz#7db091f03f189abc77a13cbd27a2293802cd7285" + integrity sha512-K4cYrJBsgvL+IoozUXYjbT6LHHNt+19a9zkvpBPxLjFHas1UpPM2A5MlhROb0BT8N8WoavM5VsP9MeSeNK/3mg== dependencies: "@babel/runtime" "^7.11.1" "@emotion/hash" "^0.8.0" @@ -64,97 +53,80 @@ classnames "^2.3.1" csstype "^3.1.3" rc-util "^5.35.0" - stylis "^4.0.13" + stylis "^4.3.4" -"@ant-design/icons-svg@^4.2.1", "@ant-design/icons-svg@^4.3.0": - version "4.3.1" - resolved "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.3.1.tgz#4b2f65a17d4d32b526baa6414aca2117382bf8da" - integrity sha512-4QBZg8ccyC6LPIRii7A0bZUk3+lEDCLnhB+FVsflGdcWPPmV+j3fire4AwwoqHV/BibgvBmR9ZIo4s867smv+g== +"@ant-design/fast-color@^2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@ant-design/fast-color/-/fast-color-2.0.6.tgz#ab4d4455c1542c9017d367c2fa8ca3e4215d0ba2" + integrity sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA== + dependencies: + "@babel/runtime" "^7.24.7" -"@ant-design/icons-svg@^4.4.0": +"@ant-design/icons-svg@^4.2.1", "@ant-design/icons-svg@^4.4.0": version "4.4.2" resolved "https://registry.yarnpkg.com/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz#ed2be7fb4d82ac7e1d45a54a5b06d6cecf8be6f6" integrity sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA== -"@ant-design/icons@^5.0.0", "@ant-design/icons@^5.1.3", "@ant-design/icons@^5.1.4", "@ant-design/icons@^5.2.5", "@ant-design/icons@^5.2.6": - version "5.2.6" - resolved "https://registry.npmjs.org/@ant-design/icons/-/icons-5.2.6.tgz#2d4a9a37f531eb2a20cebec01d6fb69cf593900d" - integrity sha512-4wn0WShF43TrggskBJPRqCD0fcHbzTYjnaoskdiJrVHg86yxoZ8ZUqsXvyn4WUqehRiFKnaclOhqk9w4Ui2KVw== - dependencies: - "@ant-design/colors" "^7.0.0" - "@ant-design/icons-svg" "^4.3.0" - "@babel/runtime" "^7.11.2" - classnames "^2.2.6" - rc-util "^5.31.1" - -"@ant-design/icons@^5.3.6": - version "5.3.6" - resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-5.3.6.tgz#172bbcfcfa39f9a1d9ef73ad5cf98c6184fb83f8" - integrity sha512-JeWsgNjvkTTC73YDPgWOgdScRku/iHN9JU0qk39OSEmJSCiRghQMLlxGTCY5ovbRRoXjxHXnUKgQEgBDnQfKmA== +"@ant-design/icons@^5.0.0", "@ant-design/icons@^5.1.3", "@ant-design/icons@^5.1.4", "@ant-design/icons@^5.2.5", "@ant-design/icons@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-5.6.1.tgz#7290fcdc3d96ff3fca793ed399053cd29ad5dbd3" + integrity sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg== dependencies: "@ant-design/colors" "^7.0.0" "@ant-design/icons-svg" "^4.4.0" - "@babel/runtime" "^7.11.2" + "@babel/runtime" "^7.24.8" classnames "^2.2.6" rc-util "^5.31.1" "@ant-design/pro-layout@^7.16.11": - version "7.17.15" - resolved "https://registry.npmjs.org/@ant-design/pro-layout/-/pro-layout-7.17.15.tgz#54914d768f493a36a700536f6924f5642dbce78a" - integrity sha512-41rzo1WZA9v+tBpmQ2Uwax8j3ukEUQUJw1W7dwlbI5pVKfBExAtNL57Ygt5SFSB7ZyEhiOEK3UgSd4S33WOVCw== + version "7.22.7" + resolved "https://registry.yarnpkg.com/@ant-design/pro-layout/-/pro-layout-7.22.7.tgz#7002b1838e1cdf879bbec813677b478c26fbbb77" + integrity sha512-fvmtNA1r9SaasVIQIQt611VSlNxtVxDbQ3e+1GhYQza3tVJi/3gCZuDyfMfTnbLmf3PaW/YvLkn7MqDbzAzoLA== dependencies: + "@ant-design/cssinjs" "^1.21.1" "@ant-design/icons" "^5.0.0" - "@ant-design/pro-provider" "2.13.4" - "@ant-design/pro-utils" "2.15.1" + "@ant-design/pro-provider" "2.16.2" + "@ant-design/pro-utils" "2.18.0" "@babel/runtime" "^7.18.0" "@umijs/route-utils" "^4.0.0" "@umijs/use-params" "^1.0.9" classnames "^2.3.2" - lodash.merge "^4.6.2" - omit.js "^2.0.2" - path-to-regexp "2.4.0" + lodash "^4.17.21" + lodash-es "^4.17.21" + path-to-regexp "8.2.0" rc-resize-observer "^1.1.0" rc-util "^5.0.6" swr "^2.0.0" warning "^4.0.3" -"@ant-design/pro-provider@2.13.4": - version "2.13.4" - resolved "https://registry.npmjs.org/@ant-design/pro-provider/-/pro-provider-2.13.4.tgz#da4af436178fe2987b4f89154fa868ce82d9fdda" - integrity sha512-f0OaIObmU3e1CqkeqFdStBg92WiYm4N+XiecCqu+FV5wCauCv9HHQNJtIJlAt8Tr73fus3aQqu3/bob6bvzE3w== +"@ant-design/pro-provider@2.16.2": + version "2.16.2" + resolved "https://registry.yarnpkg.com/@ant-design/pro-provider/-/pro-provider-2.16.2.tgz#3ccec06ea9a69a4d48adc593a268413c813dab2f" + integrity sha512-0KmCH1EaOND787Jz6VRMYtLNZmqfT0JPjdUfxhyOxFfnBRfrjyfZgIa6CQoAJLEUMWv57PccWS8wRHVUUk2Yiw== dependencies: - "@ant-design/cssinjs" "^1.11.1" + "@ant-design/cssinjs" "^1.21.1" "@babel/runtime" "^7.18.0" "@ctrl/tinycolor" "^3.4.0" + dayjs "^1.11.10" rc-util "^5.0.1" swr "^2.0.0" -"@ant-design/pro-utils@2.15.1": - version "2.15.1" - resolved "https://registry.npmjs.org/@ant-design/pro-utils/-/pro-utils-2.15.1.tgz#bf09d0154bc60e6ce363b4753b0f301295bb5ebe" - integrity sha512-Al1rkk2D48ArG1D7v7eihhHM0WU/8g/DJaS0pyby5elqPW6BNGO1yB2caRYWf8z0t2kWp6c3ijhwaXpKSje8bg== +"@ant-design/pro-utils@2.18.0": + version "2.18.0" + resolved "https://registry.yarnpkg.com/@ant-design/pro-utils/-/pro-utils-2.18.0.tgz#50a6bcc95742b71a7a17252f7db6c2ccd2ec60f4" + integrity sha512-8+ikyrN8L8a8Ph4oeHTOJEiranTj18+9+WHCHjKNdEfukI7Rjn8xpYdLJWb2AUJkb9d4eoAqjd5+k+7w81Df0w== dependencies: "@ant-design/icons" "^5.0.0" - "@ant-design/pro-provider" "2.13.4" + "@ant-design/pro-provider" "2.16.2" "@babel/runtime" "^7.18.0" classnames "^2.3.2" dayjs "^1.11.10" - lodash.merge "^4.6.2" + lodash "^4.17.21" + lodash-es "^4.17.21" rc-util "^5.0.6" safe-stable-stringify "^2.4.3" swr "^2.0.0" -"@ant-design/react-slick@~1.0.2": - version "1.0.2" - resolved "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.0.2.tgz#241bb412aeacf7ff5d50c61fa5db66773fde6b56" - integrity sha512-Wj8onxL/T8KQLFFiCA4t8eIRGpRR+UPgOdac2sYzonv+i0n3kXHmvHLLiOYL655DQx2Umii9Y9nNgL7ssu5haQ== - dependencies: - "@babel/runtime" "^7.10.4" - classnames "^2.2.5" - json2mq "^0.2.0" - resize-observer-polyfill "^1.5.1" - throttle-debounce "^5.0.0" - "@ant-design/react-slick@~1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@ant-design/react-slick/-/react-slick-1.1.2.tgz#f84ce3e4d0dc941f02b16f1d1d6d7a371ffbb4f1" @@ -168,20 +140,20 @@ "@antfu/install-pkg@^0.1.1": version "0.1.1" - resolved "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-0.1.1.tgz#157bb04f0de8100b9e4c01734db1a6c77e98bbb5" + resolved "https://registry.yarnpkg.com/@antfu/install-pkg/-/install-pkg-0.1.1.tgz#157bb04f0de8100b9e4c01734db1a6c77e98bbb5" integrity sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ== dependencies: execa "^5.1.1" find-up "^5.0.0" "@antfu/utils@^0.7.2": - version "0.7.6" - resolved "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.6.tgz#30a046419b9e1ecd276e53d41ab68fb6c558c04d" - integrity sha512-pvFiLP2BeOKA/ZOS6jxx4XhKzdVLHDhGlFEaZ2flWWYf2xOqVniqpk38I04DFRyz+L0ASggl7SkItTc+ZLju4w== + version "0.7.10" + resolved "https://registry.yarnpkg.com/@antfu/utils/-/utils-0.7.10.tgz#ae829f170158e297a9b6a28f161a8e487d00814d" + integrity sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww== "@antv/adjust@^0.2.1": version "0.2.5" - resolved "https://registry.npmjs.org/@antv/adjust/-/adjust-0.2.5.tgz#bb37bb4a0a87ca3f4b660848bc9ac07f02bcf5db" + resolved "https://registry.yarnpkg.com/@antv/adjust/-/adjust-0.2.5.tgz#bb37bb4a0a87ca3f4b660848bc9ac07f02bcf5db" integrity sha512-MfWZOkD9CqXRES6MBGRNe27Q577a72EIwyMnE29wIlPliFvJfWwsrONddpGU7lilMpVKecS3WAzOoip3RfPTRQ== dependencies: "@antv/util" "~2.0.0" @@ -189,7 +161,7 @@ "@antv/attr@^0.3.1": version "0.3.5" - resolved "https://registry.npmjs.org/@antv/attr/-/attr-0.3.5.tgz#0708c74fed5ad6ee03ad1e2913099ed8248f7ebf" + resolved "https://registry.yarnpkg.com/@antv/attr/-/attr-0.3.5.tgz#0708c74fed5ad6ee03ad1e2913099ed8248f7ebf" integrity sha512-wuj2gUo6C8Q2ASSMrVBuTcb5LcV+Tc0Egiy6bC42D0vxcQ+ta13CLxgMmHz8mjD0FxTPJDXSciyszRSC5TdLsg== dependencies: "@antv/color-util" "^2.0.1" @@ -199,7 +171,7 @@ "@antv/color-util@^2.0.1", "@antv/color-util@^2.0.2", "@antv/color-util@^2.0.3", "@antv/color-util@^2.0.6": version "2.0.6" - resolved "https://registry.npmjs.org/@antv/color-util/-/color-util-2.0.6.tgz#5e129bb9ce3f2b9309b52102b3dc929430ccc016" + resolved "https://registry.yarnpkg.com/@antv/color-util/-/color-util-2.0.6.tgz#5e129bb9ce3f2b9309b52102b3dc929430ccc016" integrity sha512-KnPEaAH+XNJMjax9U35W67nzPI+QQ2x27pYlzmSIWrbj4/k8PGrARXfzDTjwoozHJY8qG62Z+Ww6Alhu2FctXQ== dependencies: "@antv/util" "^2.0.9" @@ -207,7 +179,7 @@ "@antv/component@^0.8.27": version "0.8.35" - resolved "https://registry.npmjs.org/@antv/component/-/component-0.8.35.tgz#1d5b8e11bd496cb505e646f505f5f58f0c5173e9" + resolved "https://registry.yarnpkg.com/@antv/component/-/component-0.8.35.tgz#1d5b8e11bd496cb505e646f505f5f58f0c5173e9" integrity sha512-VnRa5X77nBPI952o2xePEEMSNZ6g2mcUDrQY8mVL2kino/8TFhqDq5fTRmDXZyWyIYd4ulJTz5zgeSwAnX/INQ== dependencies: "@antv/color-util" "^2.0.3" @@ -222,7 +194,7 @@ "@antv/coord@^0.3.0": version "0.3.1" - resolved "https://registry.npmjs.org/@antv/coord/-/coord-0.3.1.tgz#982e261d8a1e06a198eb518ea7acc20ed875a019" + resolved "https://registry.yarnpkg.com/@antv/coord/-/coord-0.3.1.tgz#982e261d8a1e06a198eb518ea7acc20ed875a019" integrity sha512-rFE94C8Xzbx4xmZnHh2AnlB3Qm1n5x0VT3OROy257IH6Rm4cuzv1+tZaUBATviwZd99S+rOY9telw/+6C9GbRw== dependencies: "@antv/matrix-util" "^3.1.0-beta.2" @@ -231,20 +203,20 @@ "@antv/dom-util@^2.0.2", "@antv/dom-util@~2.0.1": version "2.0.4" - resolved "https://registry.npmjs.org/@antv/dom-util/-/dom-util-2.0.4.tgz#b09b56c56fec42896fc856edad56b595b47ab514" + resolved "https://registry.yarnpkg.com/@antv/dom-util/-/dom-util-2.0.4.tgz#b09b56c56fec42896fc856edad56b595b47ab514" integrity sha512-2shXUl504fKwt82T3GkuT4Uoc6p9qjCKnJ8gXGLSW4T1W37dqf9AV28aCfoVPHp2BUXpSsB+PAJX2rG/jLHsLQ== dependencies: tslib "^2.0.3" "@antv/event-emitter@^0.1.1", "@antv/event-emitter@^0.1.2", "@antv/event-emitter@~0.1.0": version "0.1.3" - resolved "https://registry.npmjs.org/@antv/event-emitter/-/event-emitter-0.1.3.tgz#3e06323b9dcd55a3241ddc7c5458cfabd2095164" + resolved "https://registry.yarnpkg.com/@antv/event-emitter/-/event-emitter-0.1.3.tgz#3e06323b9dcd55a3241ddc7c5458cfabd2095164" integrity sha512-4ddpsiHN9Pd4UIlWuKVK1C4IiZIdbwQvy9i7DUSI3xNJ89FPUFt8lxDYj8GzzfdllV0NkJTRxnG+FvLk0llidg== "@antv/g-base@^0.5.11", "@antv/g-base@^0.5.12", "@antv/g-base@^0.5.9", "@antv/g-base@~0.5.6": - version "0.5.15" - resolved "https://registry.npmjs.org/@antv/g-base/-/g-base-0.5.15.tgz#4d4174c956ba652a4b55c4f6a2c28aaa92e7738d" - integrity sha512-QOtq50QpnKez9J75/Z8j2yZ7QDQdk8R8mVQJiHtaEO5eI7DM4ZbrsWff/Ew26JYmPWdq7nbRuARMAD4PX9uuLA== + version "0.5.16" + resolved "https://registry.yarnpkg.com/@antv/g-base/-/g-base-0.5.16.tgz#22a0cbbfc810e6292e4d25e5708d0abe165912bf" + integrity sha512-jP06wggTubDPHXoKwFg3/f1lyxBX9ywwN3E/HG74Nd7DXqOXQis8tsIWW+O6dS/h9vyuXLd1/wDWkMMm3ZzXdg== dependencies: "@antv/event-emitter" "^0.1.1" "@antv/g-math" "^0.1.9" @@ -259,9 +231,9 @@ tslib "^2.0.3" "@antv/g-canvas@~0.5.10": - version "0.5.14" - resolved "https://registry.npmjs.org/@antv/g-canvas/-/g-canvas-0.5.14.tgz#099668cb65d9c89dc2fc1000313c18298dcf8a13" - integrity sha512-IUGLEMIMAUYgaBMT8h3FTmYQYz7sjQkKWwh6Psqx+UPK86fySa+G8fMRrh1EqAL07jVB+GRnn6Ym+3FoFUgeFg== + version "0.5.17" + resolved "https://registry.yarnpkg.com/@antv/g-canvas/-/g-canvas-0.5.17.tgz#2e0d263a355e167b9da5e606fbd1ad1500474fcf" + integrity sha512-sXYJMWTOlb/Ycb6sTKu00LcJqInXJY4t99+kSM40u2OfqrXYmaXDjHR7D2V0roMkbK/QWiWS9UnEidCR1VtMOA== dependencies: "@antv/g-base" "^0.5.12" "@antv/g-math" "^0.1.9" @@ -273,7 +245,7 @@ "@antv/g-math@^0.1.9": version "0.1.9" - resolved "https://registry.npmjs.org/@antv/g-math/-/g-math-0.1.9.tgz#1f981b9aebf5c024f284389aa3e5cba8cefa1f28" + resolved "https://registry.yarnpkg.com/@antv/g-math/-/g-math-0.1.9.tgz#1f981b9aebf5c024f284389aa3e5cba8cefa1f28" integrity sha512-KHMSfPfZ5XHM1PZnG42Q2gxXfOitYveNTA7L61lR6mhZ8Y/aExsYmHqaKBsSarU0z+6WLrl9C07PQJZaw0uljQ== dependencies: "@antv/util" "~2.0.0" @@ -281,7 +253,7 @@ "@antv/g-svg@~0.5.6": version "0.5.7" - resolved "https://registry.npmjs.org/@antv/g-svg/-/g-svg-0.5.7.tgz#d63db5f8590a5f3ceab097c183ec80ed143f0a50" + resolved "https://registry.yarnpkg.com/@antv/g-svg/-/g-svg-0.5.7.tgz#d63db5f8590a5f3ceab097c183ec80ed143f0a50" integrity sha512-jUbWoPgr4YNsOat2Y/rGAouNQYGpw4R0cvlN0YafwOyacFFYy2zC8RslNd6KkPhhR3XHNSqJOuCYZj/YmLUwYw== dependencies: "@antv/g-base" "^0.5.12" @@ -291,9 +263,9 @@ tslib "^2.0.3" "@antv/g2@^4.1.26": - version "4.2.10" - resolved "https://registry.npmjs.org/@antv/g2/-/g2-4.2.10.tgz#9448082e7610eb8d16bdf7c97c2ce4f275bafdf9" - integrity sha512-/ZlJ/DFJBCvtEQgE6roxdd6sBml0fZ8ZVfzG+HdjGpA7/ceURb8XkxUcqa0E8NV+e4sFijnaAhBCdUm2whiuyA== + version "4.2.11" + resolved "https://registry.yarnpkg.com/@antv/g2/-/g2-4.2.11.tgz#a3b257aca4db6004a0c7fe002dc9272795f9c18b" + integrity sha512-QiqxLLYDWkv9c4oTcXscs6NMxBuWZ1JCarHPZ27J43IN2BV+qUKw8yce0A8CBR8fCILEFqQAfS00Szqpye036Q== dependencies: "@antv/adjust" "^0.2.1" "@antv/attr" "^0.3.1" @@ -312,9 +284,9 @@ tslib "^2.0.0" "@antv/g2plot@^2.4.18": - version "2.4.31" - resolved "https://registry.npmjs.org/@antv/g2plot/-/g2plot-2.4.31.tgz#b444aee07d06939949eaa8ba8f8e93f948634aa5" - integrity sha512-SlWHYVsJgRN7E1Oe5Qk6yWBrSWmctmloknFmklaqe9vEeK+YB9ZLUffZvtAHT10mA2NZ+VjGUhlnMNgR9M1PQg== + version "2.4.33" + resolved "https://registry.yarnpkg.com/@antv/g2plot/-/g2plot-2.4.33.tgz#7af79d370ac2eb1e14f3e88db7afcf08b74fadf3" + integrity sha512-f3Fx3IL2nC3jZR2InoY5tSpouA06Lpa7vAHehkFPwmwaSV6gVGfmp08z/LGg6EAaqPP7I58c/UrGZVTD+61qzw== dependencies: "@antv/color-util" "^2.0.6" "@antv/event-emitter" "^0.1.2" @@ -333,7 +305,7 @@ "@antv/matrix-util@^3.0.4": version "3.0.4" - resolved "https://registry.npmjs.org/@antv/matrix-util/-/matrix-util-3.0.4.tgz#ea13f158aa2fb4ba2fb8d6b6b561ec467ea3ac20" + resolved "https://registry.yarnpkg.com/@antv/matrix-util/-/matrix-util-3.0.4.tgz#ea13f158aa2fb4ba2fb8d6b6b561ec467ea3ac20" integrity sha512-BAPyu6dUliHcQ7fm9hZSGKqkwcjEDVLVAstlHULLvcMZvANHeLXgHEgV7JqcAV/GIhIz8aZChIlzM1ZboiXpYQ== dependencies: "@antv/util" "^2.0.9" @@ -342,7 +314,7 @@ "@antv/matrix-util@^3.1.0-beta.1", "@antv/matrix-util@^3.1.0-beta.2", "@antv/matrix-util@^3.1.0-beta.3": version "3.1.0-beta.3" - resolved "https://registry.npmjs.org/@antv/matrix-util/-/matrix-util-3.1.0-beta.3.tgz#e061de8fa7be04605a155c69cc5ce9082eedddee" + resolved "https://registry.yarnpkg.com/@antv/matrix-util/-/matrix-util-3.1.0-beta.3.tgz#e061de8fa7be04605a155c69cc5ce9082eedddee" integrity sha512-W2R6Za3A6CmG51Y/4jZUM/tFgYSq7vTqJL1VD9dKrvwxS4sE0ZcXINtkp55CdyBwJ6Cwm8pfoRpnD4FnHahN0A== dependencies: "@antv/util" "^2.0.9" @@ -351,7 +323,7 @@ "@antv/path-util@^2.0.15", "@antv/path-util@~2.0.5", "@antv/path-util@~2.0.7": version "2.0.15" - resolved "https://registry.npmjs.org/@antv/path-util/-/path-util-2.0.15.tgz#a6f691dfc8b7bce5be7f0aabb5bd614964325631" + resolved "https://registry.yarnpkg.com/@antv/path-util/-/path-util-2.0.15.tgz#a6f691dfc8b7bce5be7f0aabb5bd614964325631" integrity sha512-R2VLZ5C8PLPtr3VciNyxtjKqJ0XlANzpFb5sE9GE61UQqSRuSVSzIakMxjEPrpqbgc+s+y8i+fmc89Snu7qbNw== dependencies: "@antv/matrix-util" "^3.0.4" @@ -360,7 +332,7 @@ "@antv/path-util@^3.0.1": version "3.0.1" - resolved "https://registry.npmjs.org/@antv/path-util/-/path-util-3.0.1.tgz#42fd84222824e8ad8d1bde70f164a05924870d4a" + resolved "https://registry.yarnpkg.com/@antv/path-util/-/path-util-3.0.1.tgz#42fd84222824e8ad8d1bde70f164a05924870d4a" integrity sha512-tpvAzMpF9Qm6ik2YSMqICNU5tco5POOW7S4XoxZAI/B0L26adU+Md/SmO0BBo2SpuywKvzPH3hPT3xmoyhr04Q== dependencies: gl-matrix "^3.1.0" @@ -369,7 +341,7 @@ "@antv/scale@^0.3.0", "@antv/scale@^0.3.14", "@antv/scale@^0.3.18", "@antv/scale@~0.3.1": version "0.3.18" - resolved "https://registry.npmjs.org/@antv/scale/-/scale-0.3.18.tgz#b911f431b3e0b9547b6a65f66d0d3fa295b5ef32" + resolved "https://registry.yarnpkg.com/@antv/scale/-/scale-0.3.18.tgz#b911f431b3e0b9547b6a65f66d0d3fa295b5ef32" integrity sha512-GHwE6Lo7S/Q5fgaLPaCsW+CH+3zl4aXpnN1skOiEY0Ue9/u+s2EySv6aDXYkAqs//i0uilMDD/0/4n8caX9U9w== dependencies: "@antv/util" "~2.0.3" @@ -378,7 +350,7 @@ "@antv/util@^2.0.17", "@antv/util@^2.0.9", "@antv/util@~2.0.0", "@antv/util@~2.0.12", "@antv/util@~2.0.13", "@antv/util@~2.0.3", "@antv/util@~2.0.5": version "2.0.17" - resolved "https://registry.npmjs.org/@antv/util/-/util-2.0.17.tgz#e8ef42aca7892815b229269f3dd10c6b3c7597a9" + resolved "https://registry.yarnpkg.com/@antv/util/-/util-2.0.17.tgz#e8ef42aca7892815b229269f3dd10c6b3c7597a9" integrity sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q== dependencies: csstype "^3.0.8" @@ -386,39 +358,40 @@ "@arvinxu/layout-kit@^1": version "1.4.0" - resolved "https://registry.npmjs.org/@arvinxu/layout-kit/-/layout-kit-1.4.0.tgz#8bcb4328a19b76a1aed2614730c330616b6ca29f" + resolved "https://registry.yarnpkg.com/@arvinxu/layout-kit/-/layout-kit-1.4.0.tgz#8bcb4328a19b76a1aed2614730c330616b6ca29f" integrity sha512-dEsmFwZa/NJ2XvDBL4sCPbgFPvCvpxP+G+90Ay9zqN92vc4YbgVo4NjpjsDihiNqwDQjWhasGCC3+v4w7bdYqg== dependencies: styled-components "^5.3.3" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.22.13": - version "7.22.13" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" - integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" + integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== dependencies: - "@babel/highlight" "^7.22.13" - chalk "^2.4.2" + "@babel/helper-validator-identifier" "^7.27.1" + js-tokens "^4.0.0" + picocolors "^1.1.1" -"@babel/compat-data@^7.22.9": - version "7.23.3" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz#3febd552541e62b5e883a25eb3effd7c7379db11" - integrity sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ== +"@babel/compat-data@^7.27.2": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.28.0.tgz#9fc6fd58c2a6a15243cd13983224968392070790" + integrity sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw== -"@babel/core@7.23.2": - version "7.23.2" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz#ed10df0d580fff67c5f3ee70fd22e2e4c90a9f94" - integrity sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ== +"@babel/core@7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.6.tgz#8be77cd77c55baadcc1eae1c33df90ab6d2151d4" + integrity sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-module-transforms" "^7.23.0" - "@babel/helpers" "^7.23.2" - "@babel/parser" "^7.23.0" + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.23.6" + "@babel/parser" "^7.23.6" "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.2" - "@babel/types" "^7.23.0" + "@babel/traverse" "^7.23.6" + "@babel/types" "^7.23.6" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -426,340 +399,337 @@ semver "^6.3.1" "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.17.9", "@babel/core@^7.19.6", "@babel/core@^7.21.4": - version "7.23.3" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz#5ec09c8803b91f51cc887dedc2654a35852849c9" - integrity sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew== + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.0.tgz#55dad808d5bf3445a108eefc88ea3fdf034749a4" + integrity sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.3" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.23.2" - "@babel/parser" "^7.23.3" - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.3" - "@babel/types" "^7.23.3" + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.28.0" + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-module-transforms" "^7.27.3" + "@babel/helpers" "^7.27.6" + "@babel/parser" "^7.28.0" + "@babel/template" "^7.27.2" + "@babel/traverse" "^7.28.0" + "@babel/types" "^7.28.0" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/eslint-parser@7.22.15": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.15.tgz#263f059c476e29ca4972481a17b8b660cb025a34" - integrity sha512-yc8OOBIQk1EcRrpizuARSQS0TWAcOMpEJ1aafhNznaeYkeL+OhqnDObGFylB8ka8VFF/sZc+S4RzHyO+3LjQxg== +"@babel/eslint-parser@7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.23.3.tgz#7bf0db1c53b54da0c8a12627373554a0828479ca" + integrity sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" semver "^6.3.1" -"@babel/generator@^7.23.0", "@babel/generator@^7.23.3": - version "7.23.3" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz#86e6e83d95903fbe7613f448613b8b319f330a8e" - integrity sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg== +"@babel/generator@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.2.0.tgz#eaf3821fa0301d9d4aef88e63d4bcc19b73ba16c" + integrity sha512-BA75MVfRlFQG2EZgFYIwyT1r6xSkwfP2bdkY/kLZusEYWiJs4xCowab/alaEaT0wSvmVuXGqiefeBlP+7V1yKg== dependencies: - "@babel/types" "^7.23.3" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" + "@babel/types" "^7.2.0" jsesc "^2.5.1" + lodash "^4.17.10" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/generator@^7.23.6", "@babel/generator@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.28.0.tgz#9cc2f7bd6eb054d77dc66c2664148a0c5118acd2" + integrity sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg== + dependencies: + "@babel/parser" "^7.28.0" + "@babel/types" "^7.28.0" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" + jsesc "^3.0.2" "@babel/helper-annotate-as-pure@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" - integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== + version "7.27.3" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz#f31fd86b915fc4daf1f3ac6976c59be7084ed9c5" + integrity sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.27.3" -"@babel/helper-compilation-targets@^7.22.15": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" - integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== +"@babel/helper-compilation-targets@^7.23.6", "@babel/helper-compilation-targets@^7.27.2": + version "7.27.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz#46a0f6efab808d51d29ce96858dd10ce8732733d" + integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.15" - browserslist "^4.21.9" + "@babel/compat-data" "^7.27.2" + "@babel/helper-validator-option" "^7.27.1" + browserslist "^4.24.0" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-environment-visitor@^7.22.20": - version "7.22.20" - resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== - -"@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" +"@babel/helper-globals@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674" + integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" - integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.22.5", "@babel/helper-module-imports@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204" + integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== dependencies: - "@babel/types" "^7.22.15" + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" -"@babel/helper-module-transforms@^7.23.0", "@babel/helper-module-transforms@^7.23.3": - version "7.23.3" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" - integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== +"@babel/helper-module-transforms@^7.23.3", "@babel/helper-module-transforms@^7.27.3": + version "7.27.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz#db0bbcfba5802f9ef7870705a7ef8788508ede02" + integrity sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg== dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@babel/traverse" "^7.27.3" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.27.1", "@babel/helper-plugin-utils@^7.8.0": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" + integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== "@babel/helper-simple-access@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" - integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.27.1.tgz#7f2171e29d95d6283ede286a4994f985cbe07973" + integrity sha512-OU4zVQrJgFBNXMjrHs1yFSdlTgufO4tefcUZoqNhukVfw0p8x1Asht/gcGZ3bpHbi8gu/76m4JhrlKPqkrs/WQ== dependencies: - "@babel/types" "^7.22.5" + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" -"@babel/helper-string-parser@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" - integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== +"@babel/helper-string-parser@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== +"@babel/helper-validator-identifier@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" + integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== -"@babel/helper-validator-option@^7.22.15": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" - integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== +"@babel/helper-validator-option@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" + integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== -"@babel/helpers@^7.23.2": - version "7.23.2" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz#2832549a6e37d484286e15ba36a5330483cac767" - integrity sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ== +"@babel/helpers@^7.23.6", "@babel/helpers@^7.27.6": + version "7.28.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.2.tgz#80f0918fecbfebea9af856c419763230040ee850" + integrity sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw== dependencies: - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.2" - "@babel/types" "^7.23.0" + "@babel/template" "^7.27.2" + "@babel/types" "^7.28.2" -"@babel/highlight@^7.22.13": - version "7.22.20" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" - integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.6", "@babel/parser@^7.27.2", "@babel/parser@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.0.tgz#979829fbab51a29e13901e5a80713dbcb840825e" + integrity sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g== dependencies: - "@babel/helper-validator-identifier" "^7.22.20" - chalk "^2.4.2" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0", "@babel/parser@^7.23.3": - version "7.23.3" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz#0ce0be31a4ca4f1884b5786057cadcb6c3be58f9" - integrity sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw== + "@babel/types" "^7.28.0" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-bigint@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.8.3": +"@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-import-meta@^7.8.3": +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-import-attributes@^7.24.7": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz#34c017d54496f9b11b61474e7ea3dfd5563ffe07" + integrity sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-jsx@^7.22.5": - version "7.23.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz#8f2e4f8a9b5f9aa16067e142c1ac9cd9f810f473" - integrity sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg== + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz#2f9beb5eff30fa507c5532d107daac7b888fa34c" + integrity sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.8.3": +"@babel/plugin-syntax-numeric-separator@^7.10.4": version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-top-level-await@^7.8.3": +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-modules-commonjs@7.23.0": - version "7.23.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz#b3dba4757133b2762c00f4f94590cf6d52602481" - integrity sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ== +"@babel/plugin-transform-modules-commonjs@7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz#661ae831b9577e52be57dd8356b734f9700b53b4" + integrity sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA== dependencies: - "@babel/helper-module-transforms" "^7.23.0" + "@babel/helper-module-transforms" "^7.23.3" "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-simple-access" "^7.22.5" "@babel/plugin-transform-react-jsx-self@^7.21.0": - version "7.23.3" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz#ed3e7dadde046cce761a8e3cf003a13d1a7972d9" - integrity sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ== + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz#af678d8506acf52c577cac73ff7fe6615c85fc92" + integrity sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-react-jsx-source@^7.19.6": - version "7.23.3" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz#03527006bdc8775247a78643c51d4e715fe39a3e" - integrity sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/runtime@7.23.2", "@babel/runtime@^7", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.7", "@babel/runtime@^7.18.0", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.6", "@babel/runtime@^7.20.0", "@babel/runtime@^7.20.6", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.3", "@babel/runtime@^7.22.5", "@babel/runtime@^7.23.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.7.7", "@babel/runtime@^7.9.2": - version "7.23.2" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885" - integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg== + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz#dcfe2c24094bb757bf73960374e7c55e434f19f0" + integrity sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw== dependencies: - regenerator-runtime "^0.14.0" + "@babel/helper-plugin-utils" "^7.27.1" -"@babel/runtime@^7.23.6", "@babel/runtime@^7.23.9", "@babel/runtime@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" - integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA== +"@babel/runtime@7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.6.tgz#c05e610dc228855dc92ef1b53d07389ed8ab521d" + integrity sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.22.15", "@babel/template@^7.3.3": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" - integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/parser" "^7.22.15" - "@babel/types" "^7.22.15" - -"@babel/traverse@^7.23.2", "@babel/traverse@^7.23.3", "@babel/traverse@^7.4.5": - version "7.23.3" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz#26ee5f252e725aa7aca3474aa5b324eaf7908b5b" - integrity sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.3" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.3" - "@babel/types" "^7.23.3" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.20.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.3", "@babel/types@^7.3.3": - version "7.23.3" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz#d5ea892c07f2ec371ac704420f4dcdb07b5f9598" - integrity sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw== - dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.20" - to-fast-properties "^2.0.0" +"@babel/runtime@^7", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.7", "@babel/runtime@^7.18.0", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.6", "@babel/runtime@^7.20.0", "@babel/runtime@^7.20.6", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.3", "@babel/runtime@^7.22.5", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.6", "@babel/runtime@^7.23.9", "@babel/runtime@^7.24.4", "@babel/runtime@^7.24.7", "@babel/runtime@^7.24.8", "@babel/runtime@^7.25.7", "@babel/runtime@^7.26.0", "@babel/runtime@^7.7.6", "@babel/runtime@^7.7.7", "@babel/runtime@^7.9.2": + version "7.28.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.28.2.tgz#2ae5a9d51cc583bd1f5673b3bb70d6d819682473" + integrity sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA== + +"@babel/template@^7.22.15", "@babel/template@^7.27.2", "@babel/template@^7.3.3": + version "7.27.2" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" + integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/parser" "^7.27.2" + "@babel/types" "^7.27.1" + +"@babel/traverse@^7.23.6", "@babel/traverse@^7.27.1", "@babel/traverse@^7.27.3", "@babel/traverse@^7.28.0", "@babel/traverse@^7.4.5": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.0.tgz#518aa113359b062042379e333db18380b537e34b" + integrity sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.28.0" + "@babel/helper-globals" "^7.28.0" + "@babel/parser" "^7.28.0" + "@babel/template" "^7.27.2" + "@babel/types" "^7.28.0" + debug "^4.3.1" + +"@babel/types@^7.0.0", "@babel/types@^7.19.0", "@babel/types@^7.2.0", "@babel/types@^7.20.0", "@babel/types@^7.20.7", "@babel/types@^7.23.6", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.0", "@babel/types@^7.28.2", "@babel/types@^7.3.3": + version "7.28.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.2.tgz#da9db0856a9a88e0a13b019881d7513588cf712b" + integrity sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" "@bloomberg/record-tuple-polyfill@0.0.4": version "0.0.4" - resolved "https://registry.npmjs.org/@bloomberg/record-tuple-polyfill/-/record-tuple-polyfill-0.0.4.tgz#9ef3df44e472ceb9a0a2010d858a526f2021fefa" + resolved "https://registry.yarnpkg.com/@bloomberg/record-tuple-polyfill/-/record-tuple-polyfill-0.0.4.tgz#9ef3df44e472ceb9a0a2010d858a526f2021fefa" integrity sha512-h0OYmPR3A5Dfbetra/GzxBAzQk8sH7LhRkRUTdagX6nrtlUgJGYCTv4bBK33jsTQw9HDd8PE2x1Ma+iRKEDUsw== "@braintree/sanitize-url@^6.0.0": version "6.0.4" - resolved "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz#923ca57e173c6b232bbbb07347b1be982f03e783" + resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz#923ca57e173c6b232bbbb07347b1be982f03e783" integrity sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A== "@commitlint/cli@^18.2.0": - version "18.4.2" - resolved "https://registry.npmjs.org/@commitlint/cli/-/cli-18.4.2.tgz#b00e711c371f010447f0a37d464d27e2d1e6cf49" - integrity sha512-dDfb2+wzeQe6ogdHNHOy0J0nraok+La0BoxamNMhBOng9/5GoESPDmKUJ1Lt1oivh5MfIgZh0Vm6f0rxkB8CoA== - dependencies: - "@commitlint/format" "^18.4.0" - "@commitlint/lint" "^18.4.2" - "@commitlint/load" "^18.4.2" - "@commitlint/read" "^18.4.0" - "@commitlint/types" "^18.4.0" + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-18.6.1.tgz#78bffdfa00d6f01425d53096954993d83f2b343d" + integrity sha512-5IDE0a+lWGdkOvKH892HHAZgbAjcj1mT5QrfA/SVbLJV/BbBMGyKN0W5mhgjekPJJwEQdVNvhl9PwUacY58Usw== + dependencies: + "@commitlint/format" "^18.6.1" + "@commitlint/lint" "^18.6.1" + "@commitlint/load" "^18.6.1" + "@commitlint/read" "^18.6.1" + "@commitlint/types" "^18.6.1" execa "^5.0.0" lodash.isfunction "^3.0.9" resolve-from "5.0.0" @@ -767,73 +737,73 @@ yargs "^17.0.0" "@commitlint/config-conventional@^18.1.0": - version "18.4.2" - resolved "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-18.4.2.tgz#df041190ddc7604a855633f4c36e80a81c65f9d3" - integrity sha512-qFjIqgKGV89lzUGHxanq2WJDXk5wZIxoZmZvf0I4i4CirL06Xj8qRh1shPsXNyI15d8Rj2HExww6cGJSFU9DdA== + version "18.6.3" + resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-18.6.3.tgz#1b2740dbe325d76e05924c46bc1504340b701ca1" + integrity sha512-8ZrRHqF6je+TRaFoJVwszwnOXb/VeYrPmTwPhf0WxpzpGTcYy1p0SPyZ2eRn/sRi/obnWAcobtDAq6+gJQQNhQ== dependencies: + "@commitlint/types" "^18.6.1" conventional-changelog-conventionalcommits "^7.0.2" -"@commitlint/config-validator@^18.4.0": - version "18.4.0" - resolved "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-18.4.0.tgz#7197d7ab3248dd936782b319cafc0480ab9732d5" - integrity sha512-1y6qHMU3o4cYQSK+Y9EnmH6H1GRiwQGjnLIUOIKlekrmfc8MrMk1ByNmb8od4vK3qHJAaL/77/5n+1uyyIF5dA== +"@commitlint/config-validator@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-18.6.1.tgz#e0d71a99c984a68586c7ae7afd3f52342022fae8" + integrity sha512-05uiToBVfPhepcQWE1ZQBR/Io3+tb3gEotZjnI4tTzzPk16NffN6YABgwFQCLmzZefbDcmwWqJWc2XT47q7Znw== dependencies: - "@commitlint/types" "^18.4.0" + "@commitlint/types" "^18.6.1" ajv "^8.11.0" -"@commitlint/ensure@^18.4.0": - version "18.4.0" - resolved "https://registry.npmjs.org/@commitlint/ensure/-/ensure-18.4.0.tgz#4f9ed3900a98c28c2991a07a6b1c6b1611c85892" - integrity sha512-N5cJo/n61ULSwz3W5Iz/IZJ0I9H/PaHc+OMcF2XcRVbLa6B3YwzEW66XGCRKVULlsBNSrIH6tk5un9ayXAXIdw== +"@commitlint/ensure@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-18.6.1.tgz#17141e083200ca94d8480dc23b0e8f8b1fd37b7f" + integrity sha512-BPm6+SspyxQ7ZTsZwXc7TRQL5kh5YWt3euKmEIBZnocMFkJevqs3fbLRb8+8I/cfbVcAo4mxRlpTPfz8zX7SnQ== dependencies: - "@commitlint/types" "^18.4.0" + "@commitlint/types" "^18.6.1" lodash.camelcase "^4.3.0" lodash.kebabcase "^4.1.1" lodash.snakecase "^4.1.1" lodash.startcase "^4.4.0" lodash.upperfirst "^4.3.1" -"@commitlint/execute-rule@^18.4.0": - version "18.4.0" - resolved "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-18.4.0.tgz#a19bdac0195738e264e7dc2028db673a62087b9e" - integrity sha512-g013SWki6ZWhURBLOSXTaVQGWHdA0QlPJGiW4a+YpThezmJOemvc4LiKVpn13AjSKQ40QnmBqpBrxujOaSo+3A== +"@commitlint/execute-rule@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-18.6.1.tgz#18175e043fe6fb5fceea7b8530316c644f93dfe6" + integrity sha512-7s37a+iWyJiGUeMFF6qBlyZciUkF8odSAnHijbD36YDctLhGKoYltdvuJ/AFfRm6cBLRtRk9cCVPdsEFtt/2rg== -"@commitlint/format@^18.4.0": - version "18.4.0" - resolved "https://registry.npmjs.org/@commitlint/format/-/format-18.4.0.tgz#4f76466a7cafef5a5c9e7ad2c609b81a6b77cd09" - integrity sha512-MiAe4D5/ahty38CzULdQbpRa3ReKZtx0kyigOWcntq+N5uqez+Ac4/MO7H+3j1kC4G7nfJVfBu6TqcXeyNvhCQ== +"@commitlint/format@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-18.6.1.tgz#5f2b8b3ae4d8d80bd9239178e97df63e5b8d280a" + integrity sha512-K8mNcfU/JEFCharj2xVjxGSF+My+FbUHoqR+4GqPGrHNqXOGNio47ziiR4HQUPKtiNs05o8/WyLBoIpMVOP7wg== dependencies: - "@commitlint/types" "^18.4.0" + "@commitlint/types" "^18.6.1" chalk "^4.1.0" -"@commitlint/is-ignored@^18.4.2": - version "18.4.2" - resolved "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-18.4.2.tgz#c0929ee7e88a95af7109563fb2e5c691eb934fd1" - integrity sha512-uujjyJlrXsMsQrv0r8HDGigAwJELPAMtA1Vxi2WUB54HbyAWa0Ue6ujMRZNKov2YeA96r6o72gLDnugb6yu8IA== - dependencies: - "@commitlint/types" "^18.4.0" - semver "7.5.4" - -"@commitlint/lint@^18.4.2": - version "18.4.2" - resolved "https://registry.npmjs.org/@commitlint/lint/-/lint-18.4.2.tgz#5a2f24ead427b9c9503ad12d135a295eb08f528b" - integrity sha512-ljGOIH7w9SnjvZFoKjf30iWFxDnezfRtOc50+rNLdDP0TpLspaYYLPhDO/TeVdmii1/AJiDgBIuBboQlaIy7Bw== - dependencies: - "@commitlint/is-ignored" "^18.4.2" - "@commitlint/parse" "^18.4.0" - "@commitlint/rules" "^18.4.0" - "@commitlint/types" "^18.4.0" - -"@commitlint/load@^18.4.2": - version "18.4.2" - resolved "https://registry.npmjs.org/@commitlint/load/-/load-18.4.2.tgz#f3f213f8c0fd36ded1f8950880905add8ae5920b" - integrity sha512-CKmzXdF9XwZJoVijAqpUlV9qzZOkyiYni4KuSCtTZVAAVudi9H84cJ4FqZxSwEP9G21vmoJiNrW8G042AsduVg== - dependencies: - "@commitlint/config-validator" "^18.4.0" - "@commitlint/execute-rule" "^18.4.0" - "@commitlint/resolve-extends" "^18.4.0" - "@commitlint/types" "^18.4.0" - "@types/node" "^18.11.9" +"@commitlint/is-ignored@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-18.6.1.tgz#4ee08ba91ff3defb06e0ef19259a9c6734a8d06e" + integrity sha512-MOfJjkEJj/wOaPBw5jFjTtfnx72RGwqYIROABudOtJKW7isVjFe9j0t8xhceA02QebtYf4P/zea4HIwnXg8rvA== + dependencies: + "@commitlint/types" "^18.6.1" + semver "7.6.0" + +"@commitlint/lint@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-18.6.1.tgz#fe3834636c99ee14534a8eb3832831ac362e9fd8" + integrity sha512-8WwIFo3jAuU+h1PkYe5SfnIOzp+TtBHpFr4S8oJWhu44IWKuVx6GOPux3+9H1iHOan/rGBaiacicZkMZuluhfQ== + dependencies: + "@commitlint/is-ignored" "^18.6.1" + "@commitlint/parse" "^18.6.1" + "@commitlint/rules" "^18.6.1" + "@commitlint/types" "^18.6.1" + +"@commitlint/load@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-18.6.1.tgz#fb79ed7ee8b5897a9b5c274c1e24eda9162df816" + integrity sha512-p26x8734tSXUHoAw0ERIiHyW4RaI4Bj99D8YgUlVV9SedLf8hlWAfyIFhHRIhfPngLlCe0QYOdRKYFt8gy56TA== + dependencies: + "@commitlint/config-validator" "^18.6.1" + "@commitlint/execute-rule" "^18.6.1" + "@commitlint/resolve-extends" "^18.6.1" + "@commitlint/types" "^18.6.1" chalk "^4.1.0" cosmiconfig "^8.3.6" cosmiconfig-typescript-loader "^5.0.0" @@ -842,76 +812,75 @@ lodash.uniq "^4.5.0" resolve-from "^5.0.0" -"@commitlint/message@^18.4.0": - version "18.4.0" - resolved "https://registry.npmjs.org/@commitlint/message/-/message-18.4.0.tgz#501e020c92d461f56f73d8359a79961b44eeb61c" - integrity sha512-3kg6NQO6pJ+VdBTWi51KInT8ngkxPJaW+iI7URtUALjKcO9K4XY3gf80ZPmS1hDessrjb7qCr1lau8eWMINAQw== +"@commitlint/message@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-18.6.1.tgz#107bd40923ad23d2de56c92a68b179ebfb7e314e" + integrity sha512-VKC10UTMLcpVjMIaHHsY1KwhuTQtdIKPkIdVEwWV+YuzKkzhlI3aNy6oo1eAN6b/D2LTtZkJe2enHmX0corYRw== -"@commitlint/parse@^18.4.0": - version "18.4.0" - resolved "https://registry.npmjs.org/@commitlint/parse/-/parse-18.4.0.tgz#40d45efd248dd0f540419f3fdb19f1165b46484f" - integrity sha512-SxTCSUZH8CJNYWOlFg18YUQ2RLz8ubXKbpHUIiSNwCbiQx7UDCydp1JnhoB4sOYOxgV8d3nuDwYluRU5KnEY4A== +"@commitlint/parse@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-18.6.1.tgz#2946b814125e907b9c4d63d3e71d0c1b54b30b62" + integrity sha512-eS/3GREtvVJqGZrwAGRwR9Gdno3YcZ6Xvuaa+vUF8j++wsmxrA2En3n0ccfVO2qVOLJC41ni7jSZhQiJpMPGOQ== dependencies: - "@commitlint/types" "^18.4.0" - conventional-changelog-angular "^6.0.0" + "@commitlint/types" "^18.6.1" + conventional-changelog-angular "^7.0.0" conventional-commits-parser "^5.0.0" -"@commitlint/read@^18.4.0": - version "18.4.0" - resolved "https://registry.npmjs.org/@commitlint/read/-/read-18.4.0.tgz#8d3bd35041f56510a64ce351e79cc568d36a1c41" - integrity sha512-IpnABCbDeOw5npZ09SZZGLfd3T7cFtsxUYm6wT3aGmIB2fXKE3fMeuj3jxXjMibiGIyA3Z5voCMuOcKWpkNySA== +"@commitlint/read@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-18.6.1.tgz#8c138311ed9749427920c369f6276be136f2aa50" + integrity sha512-ia6ODaQFzXrVul07ffSgbZGFajpe8xhnDeLIprLeyfz3ivQU1dIoHp7yz0QIorZ6yuf4nlzg4ZUkluDrGN/J/w== dependencies: - "@commitlint/top-level" "^18.4.0" - "@commitlint/types" "^18.4.0" - fs-extra "^11.0.0" + "@commitlint/top-level" "^18.6.1" + "@commitlint/types" "^18.6.1" git-raw-commits "^2.0.11" minimist "^1.2.6" -"@commitlint/resolve-extends@^18.4.0": - version "18.4.0" - resolved "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-18.4.0.tgz#69b04efb5253564c773a18241305ddb31b04d8af" - integrity sha512-qhgU6ach+S6sJMD9NjCYiEycOObGhxzWQLQzqlScJCv9zkPs15Bg0ffLXTQ3z7ipXv46XEKYMnSJzjLRw2Tlkg== +"@commitlint/resolve-extends@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-18.6.1.tgz#f0572c682fc24dbabe2e0f42873261e0fa42c91a" + integrity sha512-ifRAQtHwK+Gj3Bxj/5chhc4L2LIc3s30lpsyW67yyjsETR6ctHAHRu1FSpt0KqahK5xESqoJ92v6XxoDRtjwEQ== dependencies: - "@commitlint/config-validator" "^18.4.0" - "@commitlint/types" "^18.4.0" + "@commitlint/config-validator" "^18.6.1" + "@commitlint/types" "^18.6.1" import-fresh "^3.0.0" lodash.mergewith "^4.6.2" resolve-from "^5.0.0" resolve-global "^1.0.0" -"@commitlint/rules@^18.4.0": - version "18.4.0" - resolved "https://registry.npmjs.org/@commitlint/rules/-/rules-18.4.0.tgz#a156e357893c25b09d3a7ec5ee1a9f2c3168df4a" - integrity sha512-T3ChRxQZ6g0iNCpVLc6KeQId0/86TnyQA8PFkng+dWElO2DAA5km/yirgKZV1Xlc+gF7Rf6d+a0ottxdKpOY+w== +"@commitlint/rules@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-18.6.1.tgz#da25aeffe6c0e1c7625e44f46089fb8860986caf" + integrity sha512-kguM6HxZDtz60v/zQYOe0voAtTdGybWXefA1iidjWYmyUUspO1zBPQEmJZ05/plIAqCVyNUTAiRPWIBKLCrGew== dependencies: - "@commitlint/ensure" "^18.4.0" - "@commitlint/message" "^18.4.0" - "@commitlint/to-lines" "^18.4.0" - "@commitlint/types" "^18.4.0" + "@commitlint/ensure" "^18.6.1" + "@commitlint/message" "^18.6.1" + "@commitlint/to-lines" "^18.6.1" + "@commitlint/types" "^18.6.1" execa "^5.0.0" -"@commitlint/to-lines@^18.4.0": - version "18.4.0" - resolved "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-18.4.0.tgz#006c2be09a5ce322024bc3025d1fbb4478ea4ec5" - integrity sha512-bZXuCtfBPjNgtEnG3gwJrveIgfKK2UdhIhFvKpMTrQl/gAwoto/3mzmE7qGAHwmuP4eZ2U8X7iwMnqIlWmv2Tw== +"@commitlint/to-lines@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-18.6.1.tgz#d28827a4a540c98eea1aae31dafd66f80b2f1b9e" + integrity sha512-Gl+orGBxYSNphx1+83GYeNy5N0dQsHBQ9PJMriaLQDB51UQHCVLBT/HBdOx5VaYksivSf5Os55TLePbRLlW50Q== -"@commitlint/top-level@^18.4.0": - version "18.4.0" - resolved "https://registry.npmjs.org/@commitlint/top-level/-/top-level-18.4.0.tgz#b5210c35cf2942da9786d8fcab80bcddf2a952de" - integrity sha512-TfulcA8UHF7MZ6tm4Ci3aqZgMBZa1OoCg4prccWHvwG/hsHujZ7+0FKbeKqDbcSli/YWm4NJwEjl4uh5itIJeA== +"@commitlint/top-level@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-18.6.1.tgz#429fcb985e3beaba9b17e05c0ae61926c647baf0" + integrity sha512-HyiHQZUTf0+r0goTCDs/bbVv/LiiQ7AVtz6KIar+8ZrseB9+YJAIo8HQ2IC2QT1y3N1lbW6OqVEsTHjbT6hGSw== dependencies: find-up "^5.0.0" -"@commitlint/types@^18.4.0": - version "18.4.0" - resolved "https://registry.npmjs.org/@commitlint/types/-/types-18.4.0.tgz#482393d587a86fdf0d98ed17d2efd598d5021049" - integrity sha512-MKeaFxt0I9fhqUb2E+YIzX/gZtmkuodJET/XKiZIMvXUff8Ee4Ih86eLg+yAm2jf1pwGBmU02uNOp0y094w2Uw== +"@commitlint/types@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-18.6.1.tgz#7eb3ab2d799d9166fbb98b96b0744581e59a4ad4" + integrity sha512-gwRLBLra/Dozj2OywopeuHj2ac26gjGkz2cZ+86cTJOdtWfiRRr4+e77ZDAGc6MDWxaWheI+mAV5TLWWRwqrFg== dependencies: chalk "^4.1.0" "@csstools/postcss-color-function@^1.1.0": version "1.1.1" - resolved "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz#2bd36ab34f82d0497cfacdc9b18d34b5e6f64b6b" + resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz#2bd36ab34f82d0497cfacdc9b18d34b5e6f64b6b" integrity sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw== dependencies: "@csstools/postcss-progressive-custom-properties" "^1.1.0" @@ -919,21 +888,21 @@ "@csstools/postcss-font-format-keywords@^1.0.0": version "1.0.1" - resolved "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz#677b34e9e88ae997a67283311657973150e8b16a" + resolved "https://registry.yarnpkg.com/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz#677b34e9e88ae997a67283311657973150e8b16a" integrity sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg== dependencies: postcss-value-parser "^4.2.0" "@csstools/postcss-hwb-function@^1.0.0": version "1.0.2" - resolved "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz#ab54a9fce0ac102c754854769962f2422ae8aa8b" + resolved "https://registry.yarnpkg.com/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz#ab54a9fce0ac102c754854769962f2422ae8aa8b" integrity sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w== dependencies: postcss-value-parser "^4.2.0" "@csstools/postcss-ic-unit@^1.0.0": version "1.0.1" - resolved "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz#28237d812a124d1a16a5acc5c3832b040b303e58" + resolved "https://registry.yarnpkg.com/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz#28237d812a124d1a16a5acc5c3832b040b303e58" integrity sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw== dependencies: "@csstools/postcss-progressive-custom-properties" "^1.1.0" @@ -941,7 +910,7 @@ "@csstools/postcss-is-pseudo-class@^2.0.2": version "2.0.7" - resolved "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz#846ae6c0d5a1eaa878fce352c544f9c295509cd1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz#846ae6c0d5a1eaa878fce352c544f9c295509cd1" integrity sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA== dependencies: "@csstools/selector-specificity" "^2.0.0" @@ -949,14 +918,14 @@ "@csstools/postcss-normalize-display-values@^1.0.0": version "1.0.1" - resolved "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz#15da54a36e867b3ac5163ee12c1d7f82d4d612c3" + resolved "https://registry.yarnpkg.com/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz#15da54a36e867b3ac5163ee12c1d7f82d4d612c3" integrity sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw== dependencies: postcss-value-parser "^4.2.0" "@csstools/postcss-oklab-function@^1.1.0": version "1.1.1" - resolved "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz#88cee0fbc8d6df27079ebd2fa016ee261eecf844" + resolved "https://registry.yarnpkg.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz#88cee0fbc8d6df27079ebd2fa016ee261eecf844" integrity sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA== dependencies: "@csstools/postcss-progressive-custom-properties" "^1.1.0" @@ -964,43 +933,43 @@ "@csstools/postcss-progressive-custom-properties@^1.1.0", "@csstools/postcss-progressive-custom-properties@^1.3.0": version "1.3.0" - resolved "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz#542292558384361776b45c85226b9a3a34f276fa" + resolved "https://registry.yarnpkg.com/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz#542292558384361776b45c85226b9a3a34f276fa" integrity sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA== dependencies: postcss-value-parser "^4.2.0" "@csstools/postcss-stepped-value-functions@^1.0.0": version "1.0.1" - resolved "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz#f8772c3681cc2befed695e2b0b1d68e22f08c4f4" + resolved "https://registry.yarnpkg.com/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz#f8772c3681cc2befed695e2b0b1d68e22f08c4f4" integrity sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ== dependencies: postcss-value-parser "^4.2.0" "@csstools/postcss-unset-value@^1.0.0": version "1.0.2" - resolved "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz#c99bb70e2cdc7312948d1eb41df2412330b81f77" + resolved "https://registry.yarnpkg.com/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz#c99bb70e2cdc7312948d1eb41df2412330b81f77" integrity sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g== "@csstools/selector-specificity@^2.0.0": version "2.2.0" - resolved "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz#2cbcf822bf3764c9658c4d2e568bd0c0cb748016" + resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz#2cbcf822bf3764c9658c4d2e568bd0c0cb748016" integrity sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw== -"@ctrl/tinycolor@^3.4.0", "@ctrl/tinycolor@^3.6.0", "@ctrl/tinycolor@^3.6.1": +"@ctrl/tinycolor@^3.4.0", "@ctrl/tinycolor@^3.6.0": version "3.6.1" - resolved "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz#b6c75a56a1947cc916ea058772d666a2c8932f31" + resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz#b6c75a56a1947cc916ea058772d666a2c8932f31" integrity sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA== -"@dnd-kit/accessibility@^3.0.0", "@dnd-kit/accessibility@^3.1.0": - version "3.1.0" - resolved "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.0.tgz#1054e19be276b5f1154ced7947fc0cb5d99192e0" - integrity sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ== +"@dnd-kit/accessibility@^3.0.0", "@dnd-kit/accessibility@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz#3b4202bd6bb370a0730f6734867785919beac6af" + integrity sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw== dependencies: tslib "^2.0.0" "@dnd-kit/core@^5.0.1": version "5.0.3" - resolved "https://registry.npmjs.org/@dnd-kit/core/-/core-5.0.3.tgz#028d7e543e9fd3756f9cb857b34f818d73020810" + resolved "https://registry.yarnpkg.com/@dnd-kit/core/-/core-5.0.3.tgz#028d7e543e9fd3756f9cb857b34f818d73020810" integrity sha512-IribcBLsaPqHdYLpc5xG0TqwYIaD+65offdEYxoKh38WDjzRxUjDmrt7hj9oa/ooUKL0epux20u+mBTd92i/zw== dependencies: "@dnd-kit/accessibility" "^3.0.0" @@ -1008,17 +977,17 @@ tslib "^2.0.0" "@dnd-kit/core@^6.0.0": - version "6.1.0" - resolved "https://registry.npmjs.org/@dnd-kit/core/-/core-6.1.0.tgz#e81a3d10d9eca5d3b01cbf054171273a3fe01def" - integrity sha512-J3cQBClB4TVxwGo3KEjssGEXNJqGVWx17aRTZ1ob0FliR5IjYgTxl5YJbKTzA6IzrtelotH19v6y7uoIRUZPSg== + version "6.3.1" + resolved "https://registry.yarnpkg.com/@dnd-kit/core/-/core-6.3.1.tgz#4c36406a62c7baac499726f899935f93f0e6d003" + integrity sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ== dependencies: - "@dnd-kit/accessibility" "^3.1.0" + "@dnd-kit/accessibility" "^3.1.1" "@dnd-kit/utilities" "^3.2.2" tslib "^2.0.0" "@dnd-kit/modifiers@^6.0.0": version "6.0.1" - resolved "https://registry.npmjs.org/@dnd-kit/modifiers/-/modifiers-6.0.1.tgz#9e39b25fd6e323659604cc74488fe044d33188c8" + resolved "https://registry.yarnpkg.com/@dnd-kit/modifiers/-/modifiers-6.0.1.tgz#9e39b25fd6e323659604cc74488fe044d33188c8" integrity sha512-rbxcsg3HhzlcMHVHWDuh9LCjpOVAgqbV78wLGI8tziXY3+qcMQ61qVXIvNKQFuhj75dSfD+o+PYZQ/NUk2A23A== dependencies: "@dnd-kit/utilities" "^3.2.1" @@ -1026,7 +995,7 @@ "@dnd-kit/sortable@^6.0.0": version "6.0.1" - resolved "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-6.0.1.tgz#08d046efa85c546fd21979836b007d6fea1001f9" + resolved "https://registry.yarnpkg.com/@dnd-kit/sortable/-/sortable-6.0.1.tgz#08d046efa85c546fd21979836b007d6fea1001f9" integrity sha512-FGpRHBcflpwWpSP8bMJ4zNcDywDXssZDJBwGYuHd1RqUU/+JX43pEU0u0OHw06LabEZMOLBbyWoIaZJ0abCOEA== dependencies: "@dnd-kit/utilities" "^3.1.0" @@ -1034,7 +1003,7 @@ "@dnd-kit/sortable@^7.0.0": version "7.0.2" - resolved "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-7.0.2.tgz#791d550872457f3f3c843e00d159b640f982011c" + resolved "https://registry.yarnpkg.com/@dnd-kit/sortable/-/sortable-7.0.2.tgz#791d550872457f3f3c843e00d159b640f982011c" integrity sha512-wDkBHHf9iCi1veM834Gbk1429bd4lHX4RpAwT0y2cHLf246GAvU2sVw/oxWNpPKQNQRQaeGXhAVgrOl1IT+iyA== dependencies: "@dnd-kit/utilities" "^3.2.0" @@ -1042,21 +1011,21 @@ "@dnd-kit/utilities@^3.1.0", "@dnd-kit/utilities@^3.2.0", "@dnd-kit/utilities@^3.2.1", "@dnd-kit/utilities@^3.2.2": version "3.2.2" - resolved "https://registry.npmjs.org/@dnd-kit/utilities/-/utilities-3.2.2.tgz#5a32b6af356dc5f74d61b37d6f7129a4040ced7b" + resolved "https://registry.yarnpkg.com/@dnd-kit/utilities/-/utilities-3.2.2.tgz#5a32b6af356dc5f74d61b37d6f7129a4040ced7b" integrity sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg== dependencies: tslib "^2.0.0" -"@emotion/babel-plugin@^11.11.0": - version "11.11.0" - resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz#c2d872b6a7767a9d176d007f5b31f7d504bb5d6c" - integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ== +"@emotion/babel-plugin@^11.13.5": + version "11.13.5" + resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz#eab8d65dbded74e0ecfd28dc218e75607c4e7bc0" + integrity sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ== dependencies: "@babel/helper-module-imports" "^7.16.7" "@babel/runtime" "^7.18.3" - "@emotion/hash" "^0.9.1" - "@emotion/memoize" "^0.8.1" - "@emotion/serialize" "^1.1.2" + "@emotion/hash" "^0.9.2" + "@emotion/memoize" "^0.9.0" + "@emotion/serialize" "^1.3.3" babel-plugin-macros "^3.1.0" convert-source-map "^1.5.0" escape-string-regexp "^4.0.0" @@ -1064,78 +1033,78 @@ source-map "^0.5.7" stylis "4.2.0" -"@emotion/cache@^11", "@emotion/cache@^11.11.0": - version "11.11.0" - resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz#809b33ee6b1cb1a625fef7a45bc568ccd9b8f3ff" - integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ== +"@emotion/cache@^11", "@emotion/cache@^11.13.5", "@emotion/cache@^11.14.0": + version "11.14.0" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.14.0.tgz#ee44b26986eeb93c8be82bb92f1f7a9b21b2ed76" + integrity sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA== dependencies: - "@emotion/memoize" "^0.8.1" - "@emotion/sheet" "^1.2.2" - "@emotion/utils" "^1.2.1" - "@emotion/weak-memoize" "^0.3.1" + "@emotion/memoize" "^0.9.0" + "@emotion/sheet" "^1.4.0" + "@emotion/utils" "^1.4.2" + "@emotion/weak-memoize" "^0.4.0" stylis "4.2.0" "@emotion/css@^11", "@emotion/css@^11.7.1": - version "11.11.2" - resolved "https://registry.npmjs.org/@emotion/css/-/css-11.11.2.tgz#e5fa081d0c6e335352e1bc2b05953b61832dca5a" - integrity sha512-VJxe1ucoMYMS7DkiMdC2T7PWNbrEI0a39YRiyDvK2qq4lXwjRbVP/z4lpG+odCsRzadlR+1ywwrTzhdm5HNdew== - dependencies: - "@emotion/babel-plugin" "^11.11.0" - "@emotion/cache" "^11.11.0" - "@emotion/serialize" "^1.1.2" - "@emotion/sheet" "^1.2.2" - "@emotion/utils" "^1.2.1" + version "11.13.5" + resolved "https://registry.yarnpkg.com/@emotion/css/-/css-11.13.5.tgz#db2d3be6780293640c082848e728a50544b9dfa4" + integrity sha512-wQdD0Xhkn3Qy2VNcIzbLP9MR8TafI0MJb7BEAXKp+w4+XqErksWR4OXomuDzPsN4InLdGhVe6EYcn2ZIUCpB8w== + dependencies: + "@emotion/babel-plugin" "^11.13.5" + "@emotion/cache" "^11.13.5" + "@emotion/serialize" "^1.3.3" + "@emotion/sheet" "^1.4.0" + "@emotion/utils" "^1.4.2" "@emotion/hash@^0.8.0": version "0.8.0" - resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== -"@emotion/hash@^0.9.1": - version "0.9.1" - resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz#4ffb0055f7ef676ebc3a5a91fb621393294e2f43" - integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== +"@emotion/hash@^0.9.2": + version "0.9.2" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.2.tgz#ff9221b9f58b4dfe61e619a7788734bd63f6898b" + integrity sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g== "@emotion/is-prop-valid@^1.1.0": - version "1.2.1" - resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc" - integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw== + version "1.3.1" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz#8d5cf1132f836d7adbe42cf0b49df7816fc88240" + integrity sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw== dependencies: - "@emotion/memoize" "^0.8.1" + "@emotion/memoize" "^0.9.0" -"@emotion/memoize@^0.8.1": - version "0.8.1" - resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" - integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== +"@emotion/memoize@^0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.9.0.tgz#745969d649977776b43fc7648c556aaa462b4102" + integrity sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ== "@emotion/react@^11", "@emotion/react@^11.11.0": - version "11.11.1" - resolved "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz#b2c36afac95b184f73b08da8c214fdf861fa4157" - integrity sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA== + version "11.14.0" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.14.0.tgz#cfaae35ebc67dd9ef4ea2e9acc6cd29e157dd05d" + integrity sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA== dependencies: "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.11.0" - "@emotion/cache" "^11.11.0" - "@emotion/serialize" "^1.1.2" - "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" - "@emotion/utils" "^1.2.1" - "@emotion/weak-memoize" "^0.3.1" + "@emotion/babel-plugin" "^11.13.5" + "@emotion/cache" "^11.14.0" + "@emotion/serialize" "^1.3.3" + "@emotion/use-insertion-effect-with-fallbacks" "^1.2.0" + "@emotion/utils" "^1.4.2" + "@emotion/weak-memoize" "^0.4.0" hoist-non-react-statics "^3.3.1" -"@emotion/serialize@^1", "@emotion/serialize@^1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz#017a6e4c9b8a803bd576ff3d52a0ea6fa5a62b51" - integrity sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA== +"@emotion/serialize@^1", "@emotion/serialize@^1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.3.3.tgz#d291531005f17d704d0463a032fe679f376509e8" + integrity sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA== dependencies: - "@emotion/hash" "^0.9.1" - "@emotion/memoize" "^0.8.1" - "@emotion/unitless" "^0.8.1" - "@emotion/utils" "^1.2.1" + "@emotion/hash" "^0.9.2" + "@emotion/memoize" "^0.9.0" + "@emotion/unitless" "^0.10.0" + "@emotion/utils" "^1.4.2" csstype "^3.0.2" "@emotion/server@^11": version "11.11.0" - resolved "https://registry.npmjs.org/@emotion/server/-/server-11.11.0.tgz#35537176a2a5ed8aed7801f254828e636ec3bd6e" + resolved "https://registry.yarnpkg.com/@emotion/server/-/server-11.11.0.tgz#35537176a2a5ed8aed7801f254828e636ec3bd6e" integrity sha512-6q89fj2z8VBTx9w93kJ5n51hsmtYuFPtZgnc1L8VzRx9ti4EU6EyvF6Nn1H1x3vcCQCF7u2dB2lY4AYJwUW4PA== dependencies: "@emotion/utils" "^1.2.1" @@ -1143,288 +1112,317 @@ multipipe "^1.0.2" through "^2.3.8" -"@emotion/sheet@^1.2.2": - version "1.2.2" - resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz#d58e788ee27267a14342303e1abb3d508b6d0fec" - integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA== +"@emotion/sheet@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.4.0.tgz#c9299c34d248bc26e82563735f78953d2efca83c" + integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg== "@emotion/stylis@^0.8.4": version "0.8.5" - resolved "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04" + resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04" integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== +"@emotion/unitless@^0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.10.0.tgz#2af2f7c7e5150f497bdabd848ce7b218a27cf745" + integrity sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg== + "@emotion/unitless@^0.7.4", "@emotion/unitless@^0.7.5": version "0.7.5" - resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== -"@emotion/unitless@^0.8.1": - version "0.8.1" - resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3" - integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== +"@emotion/use-insertion-effect-with-fallbacks@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz#8a8cb77b590e09affb960f4ff1e9a89e532738bf" + integrity sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg== -"@emotion/use-insertion-effect-with-fallbacks@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz#08de79f54eb3406f9daaf77c76e35313da963963" - integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== +"@emotion/utils@^1", "@emotion/utils@^1.2.1", "@emotion/utils@^1.4.2": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.4.2.tgz#6df6c45881fcb1c412d6688a311a98b7f59c1b52" + integrity sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA== -"@emotion/utils@^1", "@emotion/utils@^1.2.1": - version "1.2.1" - resolved "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz#bbab58465738d31ae4cb3dbb6fc00a5991f755e4" - integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg== +"@emotion/weak-memoize@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz#5e13fac887f08c44f76b0ccaf3370eb00fec9bb6" + integrity sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg== -"@emotion/weak-memoize@^0.3.1": - version "0.3.1" - resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz#d0fce5d07b0620caa282b5131c297bb60f9d87e6" - integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== +"@esbuild-kit/cjs-loader@^2.4.1": + version "2.4.4" + resolved "https://registry.yarnpkg.com/@esbuild-kit/cjs-loader/-/cjs-loader-2.4.4.tgz#8638177732e2de258a3243597bfdba082993c442" + integrity sha512-NfsJX4PdzhwSkfJukczyUiZGc7zNNWZcEAyqeISpDnn0PTfzMJR1aR8xAIPskBejIxBJbIgCCMzbaYa9SXepIg== + dependencies: + "@esbuild-kit/core-utils" "^3.2.3" + get-tsconfig "^4.7.0" + +"@esbuild-kit/core-utils@^3.0.0", "@esbuild-kit/core-utils@^3.2.3", "@esbuild-kit/core-utils@^3.3.2": + version "3.3.2" + resolved "https://registry.yarnpkg.com/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz#186b6598a5066f0413471d7c4d45828e399ba96c" + integrity sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ== + dependencies: + esbuild "~0.18.20" + source-map-support "^0.5.21" -"@esbuild/android-arm64@0.17.19": - version "0.17.19" - resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz#bafb75234a5d3d1b690e7c2956a599345e84a2fd" - integrity sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA== +"@esbuild-kit/esm-loader@^2.5.4": + version "2.6.5" + resolved "https://registry.yarnpkg.com/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz#6eedee46095d7d13b1efc381e2211ed1c60e64ea" + integrity sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA== + dependencies: + "@esbuild-kit/core-utils" "^3.3.2" + get-tsconfig "^4.7.0" + +"@esbuild/aix-ppc64@0.21.4": + version "0.21.4" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.4.tgz#f83eb142df3ca7b49531c1ed680b81e484316508" + integrity sha512-Zrm+B33R4LWPLjDEVnEqt2+SLTATlru1q/xYKVn8oVTbiRBGmK2VIMoIYGJDGyftnGaC788IuzGFAlb7IQ0Y8A== "@esbuild/android-arm64@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== -"@esbuild/android-arm@0.17.19": - version "0.17.19" - resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz#5898f7832c2298bc7d0ab53701c57beb74d78b4d" - integrity sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A== +"@esbuild/android-arm64@0.21.4": + version "0.21.4" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.4.tgz#dd328039daccd6033b2d1e536c054914bfc92287" + integrity sha512-fYFnz+ObClJ3dNiITySBUx+oNalYUT18/AryMxfovLkYWbutXsct3Wz2ZWAcGGppp+RVVX5FiXeLYGi97umisA== "@esbuild/android-arm@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== -"@esbuild/android-x64@0.17.19": - version "0.17.19" - resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz#658368ef92067866d95fb268719f98f363d13ae1" - integrity sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww== +"@esbuild/android-arm@0.21.4": + version "0.21.4" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.4.tgz#76767a989720a97b206ea14c52af6e4589e48b0d" + integrity sha512-E7H/yTd8kGQfY4z9t3nRPk/hrhaCajfA3YSQSBrst8B+3uTcgsi8N+ZWYCaeIDsiVs6m65JPCaQN/DxBRclF3A== "@esbuild/android-x64@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== -"@esbuild/darwin-arm64@0.17.19": - version "0.17.19" - resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz#584c34c5991b95d4d48d333300b1a4e2ff7be276" - integrity sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg== +"@esbuild/android-x64@0.21.4": + version "0.21.4" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.4.tgz#14a8ae3c35702d882086efb5a8f8d7b0038d8d35" + integrity sha512-mDqmlge3hFbEPbCWxp4fM6hqq7aZfLEHZAKGP9viq9wMUBVQx202aDIfc3l+d2cKhUJM741VrCXEzRFhPDKH3Q== "@esbuild/darwin-arm64@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== -"@esbuild/darwin-x64@0.17.19": - version "0.17.19" - resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz#7751d236dfe6ce136cce343dce69f52d76b7f6cb" - integrity sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw== +"@esbuild/darwin-arm64@0.21.4": + version "0.21.4" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.4.tgz#7e735046005e4c12e9139e0bdd1fa6a754430d57" + integrity sha512-72eaIrDZDSiWqpmCzVaBD58c8ea8cw/U0fq/PPOTqE3c53D0xVMRt2ooIABZ6/wj99Y+h4ksT/+I+srCDLU9TA== "@esbuild/darwin-x64@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== -"@esbuild/freebsd-arm64@0.17.19": - version "0.17.19" - resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz#cacd171665dd1d500f45c167d50c6b7e539d5fd2" - integrity sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ== +"@esbuild/darwin-x64@0.21.4": + version "0.21.4" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.4.tgz#db623553547a5fe3502a63aa88306e9023178482" + integrity sha512-uBsuwRMehGmw1JC7Vecu/upOjTsMhgahmDkWhGLWxIgUn2x/Y4tIwUZngsmVb6XyPSTXJYS4YiASKPcm9Zitag== "@esbuild/freebsd-arm64@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== -"@esbuild/freebsd-x64@0.17.19": - version "0.17.19" - resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz#0769456eee2a08b8d925d7c00b79e861cb3162e4" - integrity sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ== +"@esbuild/freebsd-arm64@0.21.4": + version "0.21.4" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.4.tgz#91cbad647c079bf932086fbd4749d7f563df67b8" + integrity sha512-8JfuSC6YMSAEIZIWNL3GtdUT5NhUA/CMUCpZdDRolUXNAXEE/Vbpe6qlGLpfThtY5NwXq8Hi4nJy4YfPh+TwAg== "@esbuild/freebsd-x64@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== -"@esbuild/linux-arm64@0.17.19": - version "0.17.19" - resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz#38e162ecb723862c6be1c27d6389f48960b68edb" - integrity sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg== +"@esbuild/freebsd-x64@0.21.4": + version "0.21.4" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.4.tgz#723299b9859ccbe5532fecbadba3ac33019ba8e8" + integrity sha512-8d9y9eQhxv4ef7JmXny7591P/PYsDFc4+STaxC1GBv0tMyCdyWfXu2jBuqRsyhY8uL2HU8uPyscgE2KxCY9imQ== "@esbuild/linux-arm64@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== -"@esbuild/linux-arm@0.17.19": - version "0.17.19" - resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz#1a2cd399c50040184a805174a6d89097d9d1559a" - integrity sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA== +"@esbuild/linux-arm64@0.21.4": + version "0.21.4" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.4.tgz#531743f861e1ef6e50b874d6c784cda37aa5e685" + integrity sha512-/GLD2orjNU50v9PcxNpYZi+y8dJ7e7/LhQukN3S4jNDXCKkyyiyAz9zDw3siZ7Eh1tRcnCHAo/WcqKMzmi4eMQ== "@esbuild/linux-arm@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== -"@esbuild/linux-ia32@0.17.19": - version "0.17.19" - resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz#e28c25266b036ce1cabca3c30155222841dc035a" - integrity sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ== +"@esbuild/linux-arm@0.21.4": + version "0.21.4" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.4.tgz#1144b5654764960dd97d90ddf0893a9afc63ad91" + integrity sha512-2rqFFefpYmpMs+FWjkzSgXg5vViocqpq5a1PSRgT0AvSgxoXmGF17qfGAzKedg6wAwyM7UltrKVo9kxaJLMF/g== "@esbuild/linux-ia32@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== -"@esbuild/linux-loong64@0.17.19": - version "0.17.19" - resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz#0f887b8bb3f90658d1a0117283e55dbd4c9dcf72" - integrity sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ== +"@esbuild/linux-ia32@0.21.4": + version "0.21.4" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.4.tgz#c81b6f2ed3308d3b75ccefb5ac63bc4cf3a9d2e9" + integrity sha512-pNftBl7m/tFG3t2m/tSjuYeWIffzwAZT9m08+9DPLizxVOsUl8DdFzn9HvJrTQwe3wvJnwTdl92AonY36w/25g== "@esbuild/linux-loong64@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== -"@esbuild/linux-mips64el@0.17.19": - version "0.17.19" - resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz#f5d2a0b8047ea9a5d9f592a178ea054053a70289" - integrity sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A== +"@esbuild/linux-loong64@0.21.4": + version "0.21.4" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.4.tgz#87b6af7cd0f2551653955fc2dc465b7f4464af0a" + integrity sha512-cSD2gzCK5LuVX+hszzXQzlWya6c7hilO71L9h4KHwqI4qeqZ57bAtkgcC2YioXjsbfAv4lPn3qe3b00Zt+jIfQ== "@esbuild/linux-mips64el@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== -"@esbuild/linux-ppc64@0.17.19": - version "0.17.19" - resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz#876590e3acbd9fa7f57a2c7d86f83717dbbac8c7" - integrity sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg== +"@esbuild/linux-mips64el@0.21.4": + version "0.21.4" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.4.tgz#fec73cd39490a0c45d052bef03e011a0ad366c06" + integrity sha512-qtzAd3BJh7UdbiXCrg6npWLYU0YpufsV9XlufKhMhYMJGJCdfX/G6+PNd0+v877X1JG5VmjBLUiFB0o8EUSicA== "@esbuild/linux-ppc64@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== -"@esbuild/linux-riscv64@0.17.19": - version "0.17.19" - resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz#7f49373df463cd9f41dc34f9b2262d771688bf09" - integrity sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA== +"@esbuild/linux-ppc64@0.21.4": + version "0.21.4" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.4.tgz#ea3b5e13b0fc8666bd4c6f7ea58bd1830f3e6e78" + integrity sha512-yB8AYzOTaL0D5+2a4xEy7OVvbcypvDR05MsB/VVPVA7nL4hc5w5Dyd/ddnayStDgJE59fAgNEOdLhBxjfx5+dg== "@esbuild/linux-riscv64@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== -"@esbuild/linux-s390x@0.17.19": - version "0.17.19" - resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz#e2afd1afcaf63afe2c7d9ceacd28ec57c77f8829" - integrity sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q== +"@esbuild/linux-riscv64@0.21.4": + version "0.21.4" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.4.tgz#80d406f653fc6b193edaeb55ac88d4ac22c8f155" + integrity sha512-Y5AgOuVzPjQdgU59ramLoqSSiXddu7F3F+LI5hYy/d1UHN7K5oLzYBDZe23QmQJ9PIVUXwOdKJ/jZahPdxzm9w== "@esbuild/linux-s390x@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== -"@esbuild/linux-x64@0.17.19": - version "0.17.19" - resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz#8a0e9738b1635f0c53389e515ae83826dec22aa4" - integrity sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw== +"@esbuild/linux-s390x@0.21.4": + version "0.21.4" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.4.tgz#9cbd26854b5b12cf22fb54c96cd1adffaf6ace6f" + integrity sha512-Iqc/l/FFwtt8FoTK9riYv9zQNms7B8u+vAI/rxKuN10HgQIXaPzKZc479lZ0x6+vKVQbu55GdpYpeNWzjOhgbA== "@esbuild/linux-x64@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== -"@esbuild/netbsd-x64@0.17.19": - version "0.17.19" - resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz#c29fb2453c6b7ddef9a35e2c18b37bda1ae5c462" - integrity sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q== +"@esbuild/linux-x64@0.21.4": + version "0.21.4" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.4.tgz#44dfe1c5cad855362c830c604dba97fbb16fc114" + integrity sha512-Td9jv782UMAFsuLZINfUpoF5mZIbAj+jv1YVtE58rFtfvoKRiKSkRGQfHTgKamLVT/fO7203bHa3wU122V/Bdg== "@esbuild/netbsd-x64@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== -"@esbuild/openbsd-x64@0.17.19": - version "0.17.19" - resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz#95e75a391403cb10297280d524d66ce04c920691" - integrity sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g== +"@esbuild/netbsd-x64@0.21.4": + version "0.21.4" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.4.tgz#89b97d823e1cc4bf8c4e5dc8f76c8d6ceb1c87f3" + integrity sha512-Awn38oSXxsPMQxaV0Ipb7W/gxZtk5Tx3+W+rAPdZkyEhQ6968r9NvtkjhnhbEgWXYbgV+JEONJ6PcdBS+nlcpA== "@esbuild/openbsd-x64@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== -"@esbuild/sunos-x64@0.17.19": - version "0.17.19" - resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz#722eaf057b83c2575937d3ffe5aeb16540da7273" - integrity sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg== +"@esbuild/openbsd-x64@0.21.4": + version "0.21.4" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.4.tgz#080715bb4981c326364320d7b56835608e2bd98d" + integrity sha512-IsUmQeCY0aU374R82fxIPu6vkOybWIMc3hVGZ3ChRwL9hA1TwY+tS0lgFWV5+F1+1ssuvvXt3HFqe8roCip8Hg== "@esbuild/sunos-x64@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== -"@esbuild/win32-arm64@0.17.19": - version "0.17.19" - resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz#9aa9dc074399288bdcdd283443e9aeb6b9552b6f" - integrity sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag== +"@esbuild/sunos-x64@0.21.4": + version "0.21.4" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.4.tgz#8d838a8ac80e211536490108b72fb0091a811626" + integrity sha512-hsKhgZ4teLUaDA6FG/QIu2q0rI6I36tZVfM4DBZv3BG0mkMIdEnMbhc4xwLvLJSS22uWmaVkFkqWgIS0gPIm+A== "@esbuild/win32-arm64@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== -"@esbuild/win32-ia32@0.17.19": - version "0.17.19" - resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz#95ad43c62ad62485e210f6299c7b2571e48d2b03" - integrity sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw== +"@esbuild/win32-arm64@0.21.4": + version "0.21.4" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.4.tgz#94afb4c2ac89b0f09791606d6d93fdab322f81c8" + integrity sha512-UUfMgMoXPoA/bvGUNfUBFLCh0gt9dxZYIx9W4rfJr7+hKe5jxxHmfOK8YSH4qsHLLN4Ck8JZ+v7Q5fIm1huErg== "@esbuild/win32-ia32@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== -"@esbuild/win32-x64@0.17.19": - version "0.17.19" - resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz#8cfaf2ff603e9aabb910e9c0558c26cf32744061" - integrity sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA== +"@esbuild/win32-ia32@0.21.4": + version "0.21.4" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.4.tgz#822085cd52f2f1dd90eabb59346ffa779c0bab83" + integrity sha512-yIxbspZb5kGCAHWm8dexALQ9en1IYDfErzjSEq1KzXFniHv019VT3mNtTK7t8qdy4TwT6QYHI9sEZabONHg+aw== "@esbuild/win32-x64@0.18.20": version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== +"@esbuild/win32-x64@0.21.4": + version "0.21.4" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.4.tgz#11ef0398f9abee161193461910a507ef0d4c0c32" + integrity sha512-sywLRD3UK/qRJt0oBwdpYLBibk7KiRfbswmWRDabuncQYSlf8aLEEUor/oP6KRz8KEG+HoiVLBhPRD5JWjS8Sg== + "@eslint-community/eslint-utils@^4.2.0": - version "4.4.0" - resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + version "4.7.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz#607084630c6c033992a082de6e6fbc1a8b52175a" + integrity sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw== dependencies: - eslint-visitor-keys "^3.3.0" + eslint-visitor-keys "^3.4.3" "@eslint-community/regexpp@^4.4.0": - version "4.10.0" - resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" - integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + version "4.12.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== "@floating-ui/core@^0.6.2": version "0.6.2" - resolved "https://registry.npmjs.org/@floating-ui/core/-/core-0.6.2.tgz#f2813f0e5f3d5ed7af5029e1a082203dadf02b7d" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-0.6.2.tgz#f2813f0e5f3d5ed7af5029e1a082203dadf02b7d" integrity sha512-jktYRmZwmau63adUG3GKOAVCofBXkk55S/zQ94XOorAHhwqFIOFAy1rSp2N0Wp6/tGbe9V3u/ExlGZypyY17rg== "@floating-ui/dom@^0.4.5": version "0.4.5" - resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-0.4.5.tgz#2e88d16646119cc67d44683f75ee99840475bbfa" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-0.4.5.tgz#2e88d16646119cc67d44683f75ee99840475bbfa" integrity sha512-b+prvQgJt8pieaKYMSJBXHxX/DYwdLsAWxKYqnO5dO2V4oo/TYBZJAUQCVNjTWWsrs6o4VDrNcP9+E70HAhJdw== dependencies: "@floating-ui/core" "^0.6.2" "@floating-ui/react-dom-interactions@^0.3.1": version "0.3.1" - resolved "https://registry.npmjs.org/@floating-ui/react-dom-interactions/-/react-dom-interactions-0.3.1.tgz#abc0cb4b18e6f095397e50f9846572eee4e34554" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom-interactions/-/react-dom-interactions-0.3.1.tgz#abc0cb4b18e6f095397e50f9846572eee4e34554" integrity sha512-tP2KEh7EHJr5hokSBHcPGojb+AorDNUf0NYfZGg/M+FsMvCOOsSEeEF0O1NDfETIzDnpbHnCs0DuvCFhSMSStg== dependencies: "@floating-ui/react-dom" "^0.6.3" @@ -1434,86 +1432,87 @@ "@floating-ui/react-dom@^0.6.3": version "0.6.3" - resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-0.6.3.tgz#7b64cfd4fd12e4a0515dbf1b2be16e48c9a06c5a" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-0.6.3.tgz#7b64cfd4fd12e4a0515dbf1b2be16e48c9a06c5a" integrity sha512-hC+pS5D6AgS2wWjbmSQ6UR6Kpy+drvWGJIri6e1EDGADTPsCaa4KzCgmCczHrQeInx9tqs81EyDmbKJYY2swKg== dependencies: "@floating-ui/dom" "^0.4.5" use-isomorphic-layout-effect "^1.1.1" -"@formatjs/ecma402-abstract@1.18.0": - version "1.18.0" - resolved "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.18.0.tgz#e2120e7101020140661b58430a7ff4262705a2f2" - integrity sha512-PEVLoa3zBevWSCZzPIM/lvPCi8P5l4G+NXQMc/CjEiaCWgyHieUoo0nM7Bs0n/NbuQ6JpXEolivQ9pKSBHaDlA== - dependencies: - "@formatjs/intl-localematcher" "0.5.2" - tslib "^2.4.0" - -"@formatjs/fast-memoize@2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz#33bd616d2e486c3e8ef4e68c99648c196887802b" - integrity sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA== - dependencies: - tslib "^2.4.0" - -"@formatjs/icu-messageformat-parser@2.7.3": - version "2.7.3" - resolved "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.3.tgz#c8c95e7c9f8141bdb93bea0e92e4fcace19d3c9f" - integrity sha512-X/jy10V9S/vW+qlplqhMUxR8wErQ0mmIYSq4mrjpjDl9mbuGcCILcI1SUYkL5nlM4PJqpc0KOS0bFkkJNPxYRw== - dependencies: - "@formatjs/ecma402-abstract" "1.18.0" - "@formatjs/icu-skeleton-parser" "1.7.0" - tslib "^2.4.0" - -"@formatjs/icu-skeleton-parser@1.7.0": - version "1.7.0" - resolved "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.7.0.tgz#796938d6d0ba8fc75bb9edee038d1350bfee32cb" - integrity sha512-Cfdo/fgbZzpN/jlN/ptQVe0lRHora+8ezrEeg2RfrNjyp+YStwBy7cqDY8k5/z2LzXg6O0AdzAV91XS0zIWv+A== - dependencies: - "@formatjs/ecma402-abstract" "1.18.0" - tslib "^2.4.0" - -"@formatjs/intl-displaynames@6.6.4": - version "6.6.4" - resolved "https://registry.npmjs.org/@formatjs/intl-displaynames/-/intl-displaynames-6.6.4.tgz#dd9ca9bb2d1f4b140cc8814667bc830802621674" - integrity sha512-ET8KQ+L9Q0K8x1SnJQa4DNssUcbATlMopWqYvGGR8yAvw5qwAQc1fv+DshCoZNIE9pbcue0IGC4kWNAkWqlFag== - dependencies: - "@formatjs/ecma402-abstract" "1.18.0" - "@formatjs/intl-localematcher" "0.5.2" - tslib "^2.4.0" - -"@formatjs/intl-listformat@7.5.3": - version "7.5.3" - resolved "https://registry.npmjs.org/@formatjs/intl-listformat/-/intl-listformat-7.5.3.tgz#c6f028471839cd1014760498f783fdfe011422d5" - integrity sha512-l7EOr0Yh1m8KagytukB90yw81uyzrM7amKFrgxXqphz4KeSIL0KPa68lPsdtZ+JmQB73GaDQRwLOwUKFZ1VZPQ== - dependencies: - "@formatjs/ecma402-abstract" "1.18.0" - "@formatjs/intl-localematcher" "0.5.2" - tslib "^2.4.0" - -"@formatjs/intl-localematcher@0.5.2": - version "0.5.2" - resolved "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.2.tgz#5fcf029fd218905575e5080fa33facdcb623d532" - integrity sha512-txaaE2fiBMagLrR4jYhxzFO6wEdEG4TPMqrzBAcbr4HFUYzH/YC+lg6OIzKCHm8WgDdyQevxbAAV1OgcXctuGw== +"@formatjs/ecma402-abstract@2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.4.tgz#355e42d375678229d46dc8ad7a7139520dd03e7b" + integrity sha512-lFyiQDVvSbQOpU+WFd//ILolGj4UgA/qXrKeZxdV14uKiAUiPAtX6XAn7WBCRi7Mx6I7EybM9E5yYn4BIpZWYg== dependencies: - tslib "^2.4.0" + "@formatjs/fast-memoize" "2.2.3" + "@formatjs/intl-localematcher" "0.5.8" + tslib "2" -"@formatjs/intl@2.9.9": - version "2.9.9" - resolved "https://registry.npmjs.org/@formatjs/intl/-/intl-2.9.9.tgz#866629b565e20dd7490f9e77ee41a00748913e8f" - integrity sha512-JI3CNgL2Zdg5lv9ncT2sYKqbAj2RGrCbdzaCckIxMPxn4QuHuOVvYUGmBAXVusBmfG/0sxLmMrnwnBioz+QKdA== - dependencies: - "@formatjs/ecma402-abstract" "1.18.0" - "@formatjs/fast-memoize" "2.2.0" - "@formatjs/icu-messageformat-parser" "2.7.3" - "@formatjs/intl-displaynames" "6.6.4" - "@formatjs/intl-listformat" "7.5.3" - intl-messageformat "10.5.8" - tslib "^2.4.0" +"@formatjs/fast-memoize@2.2.3": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-2.2.3.tgz#74e64109279d5244f9fc281f3ae90c407cece823" + integrity sha512-3jeJ+HyOfu8osl3GNSL4vVHUuWFXR03Iz9jjgI7RwjG6ysu/Ymdr0JRCPHfF5yGbTE6JCrd63EpvX1/WybYRbA== + dependencies: + tslib "2" + +"@formatjs/icu-messageformat-parser@2.9.4": + version "2.9.4" + resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.9.4.tgz#52501fbdc122a86097644f03ae1117b9ced00872" + integrity sha512-Tbvp5a9IWuxUcpWNIW6GlMQYEc4rwNHR259uUFoKWNN1jM9obf9Ul0e+7r7MvFOBNcN+13K7NuKCKqQiAn1QEg== + dependencies: + "@formatjs/ecma402-abstract" "2.2.4" + "@formatjs/icu-skeleton-parser" "1.8.8" + tslib "2" + +"@formatjs/icu-skeleton-parser@1.8.8": + version "1.8.8" + resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.8.tgz#a16eff7fd040acf096fb1853c99527181d38cf90" + integrity sha512-vHwK3piXwamFcx5YQdCdJxUQ1WdTl6ANclt5xba5zLGDv5Bsur7qz8AD7BevaKxITwpgDeU0u8My3AIibW9ywA== + dependencies: + "@formatjs/ecma402-abstract" "2.2.4" + tslib "2" + +"@formatjs/intl-displaynames@6.8.5": + version "6.8.5" + resolved "https://registry.yarnpkg.com/@formatjs/intl-displaynames/-/intl-displaynames-6.8.5.tgz#e9cd778764209534795f2a579d0269b26631d1ae" + integrity sha512-85b+GdAKCsleS6cqVxf/Aw/uBd+20EM0wDpgaxzHo3RIR3bxF4xCJqH/Grbzx8CXurTgDDZHPdPdwJC+May41w== + dependencies: + "@formatjs/ecma402-abstract" "2.2.4" + "@formatjs/intl-localematcher" "0.5.8" + tslib "2" + +"@formatjs/intl-listformat@7.7.5": + version "7.7.5" + resolved "https://registry.yarnpkg.com/@formatjs/intl-listformat/-/intl-listformat-7.7.5.tgz#e7d9fd66b648bbe878f9c64fcba756f1634a7794" + integrity sha512-Wzes10SMNeYgnxYiKsda4rnHP3Q3II4XT2tZyOgnH5fWuHDtIkceuWlRQNsvrI3uiwP4hLqp2XdQTCsfkhXulg== + dependencies: + "@formatjs/ecma402-abstract" "2.2.4" + "@formatjs/intl-localematcher" "0.5.8" + tslib "2" + +"@formatjs/intl-localematcher@0.5.8": + version "0.5.8" + resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.5.8.tgz#b11bbd04bd3551f7cadcb1ef1e231822d0e3c97e" + integrity sha512-I+WDNWWJFZie+jkfkiK5Mp4hEDyRSEvmyfYadflOno/mmKJKcB17fEpEH0oJu/OWhhCJ8kJBDz2YMd/6cDl7Mg== + dependencies: + tslib "2" + +"@formatjs/intl@2.10.15": + version "2.10.15" + resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-2.10.15.tgz#c592507512d7827c760b74bb8afc37629f89523a" + integrity sha512-i6+xVqT+6KCz7nBfk4ybMXmbKO36tKvbMKtgFz9KV+8idYFyFbfwKooYk8kGjyA5+T5f1kEPQM5IDLXucTAQ9g== + dependencies: + "@formatjs/ecma402-abstract" "2.2.4" + "@formatjs/fast-memoize" "2.2.3" + "@formatjs/icu-messageformat-parser" "2.9.4" + "@formatjs/intl-displaynames" "6.8.5" + "@formatjs/intl-listformat" "7.7.5" + intl-messageformat "10.7.7" + tslib "2" "@formily/antd-v5@^1.1.9": - version "1.1.9" - resolved "https://registry.yarnpkg.com/@formily/antd-v5/-/antd-v5-1.1.9.tgz#bdfedb1ec98f48d372cad9ab1faceff6b4e3e2f6" - integrity sha512-Gw0wx6zERLJS8GvmTizV6UPNyxNrg2svbV1Dr38jwsw+dkEef7ZANNERfEpsl2TvCEDl4W3QVFNPws5woLGl8g== + version "1.2.4" + resolved "https://registry.yarnpkg.com/@formily/antd-v5/-/antd-v5-1.2.4.tgz#ad9bc3e529f20d52374c9b42910758e639e68788" + integrity sha512-OaPJ9GtxQnPTPy4nKnNyWuGyIw9LVvVg0ptEOXP096/pBiFhOV/1UyIdgdp/4pM1CglLKwAf+DJw4e+CKYiTpg== dependencies: "@ant-design/cssinjs" "^1.3.1" "@ant-design/icons" "^5.0.0" @@ -1529,69 +1528,69 @@ classnames "^2.2.6" react-sticky-box "^1.0.2" -"@formily/core@2.3.0", "@formily/core@^2.2.0", "@formily/core@^2.2.27": - version "2.3.0" - resolved "https://registry.npmjs.org/@formily/core/-/core-2.3.0.tgz#2d9c09ec7579dc11cfd4d8f2f20fb0a56504e180" - integrity sha512-kYMvASeycoS7i5L4Huu4iyNYzRJ4vqJ/MMhxdhpn21DgESlPmOhiTJCTMR9UOU3PDH0aN7dmF6zla1W8wojKFg== +"@formily/core@2.3.7", "@formily/core@^2.2.0", "@formily/core@^2.2.27": + version "2.3.7" + resolved "https://registry.yarnpkg.com/@formily/core/-/core-2.3.7.tgz#4f86da177a7b3d46091f4da663631278e830c7e0" + integrity sha512-oqLE6gOoM2xjwlUrfH4cyjscO4kZJNpidtVytZeBvYp9v4OgL9EUm89laPcF4cnpWE2lZIqqzfGluOySxku8WQ== dependencies: - "@formily/reactive" "2.3.0" - "@formily/shared" "2.3.0" - "@formily/validator" "2.3.0" + "@formily/reactive" "2.3.7" + "@formily/shared" "2.3.7" + "@formily/validator" "2.3.7" "@formily/grid@^2.2.0", "@formily/grid@^2.2.27": - version "2.3.0" - resolved "https://registry.npmjs.org/@formily/grid/-/grid-2.3.0.tgz#c41d671b97314cee7317d1dd6db7b3dc54712a25" - integrity sha512-IkWunF19yG/HDy3qoAdQA2ziBe1CndFX7wsmcxr5mMdGDGcbrBTD9aJb8ALtC+5DXQ2t+slaFrLIQN9jPTPamQ== + version "2.3.7" + resolved "https://registry.yarnpkg.com/@formily/grid/-/grid-2.3.7.tgz#afa2f49aea37d97f00a9d819f895b838cad08000" + integrity sha512-QTmmFkNVxcL+nQVvrqhBrUwhRCXDVy5iycTb4IJILqK4puYUKRajbsbm0oudTE0Yyo6ovpM6SD8QtdFU/cwLLw== dependencies: - "@formily/reactive" "2.3.0" + "@formily/reactive" "2.3.7" "@juggle/resize-observer" "^3.3.1" -"@formily/json-schema@2.3.0", "@formily/json-schema@^2.2.0", "@formily/json-schema@^2.2.27": - version "2.3.0" - resolved "https://registry.npmjs.org/@formily/json-schema/-/json-schema-2.3.0.tgz#95bd78533540093da526628520d21b2a470d5180" - integrity sha512-xtkcBbHikzjRYLwYgaM7vF3fTjHPnAYHRhu6b+cPY8OZQRN7h6SiDKyyD0tgAb3HyDs49RP3wTKhIEH/5Jqn8Q== +"@formily/json-schema@2.3.7", "@formily/json-schema@^2.2.0", "@formily/json-schema@^2.2.27": + version "2.3.7" + resolved "https://registry.yarnpkg.com/@formily/json-schema/-/json-schema-2.3.7.tgz#313b950acbfd7112571b2bf2d71eed568ee17a4f" + integrity sha512-YmDmH98sJLOPO5GAq5NJw+NP3i2vCELBoz4Y4w+nhpKI5n8eQHe2GczQKntWDOnTfchXD2dXcgpb0ub6KNeATw== dependencies: - "@formily/core" "2.3.0" - "@formily/reactive" "2.3.0" - "@formily/shared" "2.3.0" + "@formily/core" "2.3.7" + "@formily/reactive" "2.3.7" + "@formily/shared" "2.3.7" -"@formily/path@2.3.0", "@formily/path@^2.2.27": - version "2.3.0" - resolved "https://registry.npmjs.org/@formily/path/-/path-2.3.0.tgz#1cb71389ad39fd30e323b7f35f96cb35f12e304f" - integrity sha512-LbSW50ytAH9wPlZc2VkjRjMukoYWiDAII7HfGkSnkCDQYduhWzvbqpkKOd/W8l5VFrLrl2/7yWkfp5cChv0wjA== +"@formily/path@2.3.7", "@formily/path@^2.2.27": + version "2.3.7" + resolved "https://registry.yarnpkg.com/@formily/path/-/path-2.3.7.tgz#bed9bbb9c5b11a7cd7a5402bbdbec710bc853265" + integrity sha512-uDqXlW3TwJ8dImi5FrKze/yAbnxqpE/z1ZzJLNSlNr+T4bJRrC7Ya2veOOYeDaM9EK6eQNQCXST55REj5DKVmQ== "@formily/react@^2.2.0", "@formily/react@^2.2.27": - version "2.3.0" - resolved "https://registry.npmjs.org/@formily/react/-/react-2.3.0.tgz#381233c5b523dd8bb20385252eb466d6d24e7c79" - integrity sha512-bDi2YcRQXad2Qyytg39sP4jn5N0OR2772GszFfcdAiHEJLxYms6/2nw2KiYJx7Ohv4r3T4RhPttwuvkBKWJ1ow== - dependencies: - "@formily/core" "2.3.0" - "@formily/json-schema" "2.3.0" - "@formily/reactive" "2.3.0" - "@formily/reactive-react" "2.3.0" - "@formily/shared" "2.3.0" - "@formily/validator" "2.3.0" + version "2.3.7" + resolved "https://registry.yarnpkg.com/@formily/react/-/react-2.3.7.tgz#7b8869ed40150b77c55f90dcb462b300a6b7523e" + integrity sha512-yn3xhFgl5pdDECiyOtt/hlwhnxzpjjYkig1Oyyg4mgYDeP9UT9jd0V3/iLasOdoogUJj+j28XegFZRneITIuew== + dependencies: + "@formily/core" "2.3.7" + "@formily/json-schema" "2.3.7" + "@formily/reactive" "2.3.7" + "@formily/reactive-react" "2.3.7" + "@formily/shared" "2.3.7" + "@formily/validator" "2.3.7" hoist-non-react-statics "^3.3.2" -"@formily/reactive-react@2.3.0", "@formily/reactive-react@^2.2.0", "@formily/reactive-react@^2.2.27": - version "2.3.0" - resolved "https://registry.npmjs.org/@formily/reactive-react/-/reactive-react-2.3.0.tgz#4a70bf3d91054eca8ef15a2b39ac75c29a8bf40e" - integrity sha512-d4uOF60/wtGsF63IuLTy2XFmL/fK0AMpl4mEyLXMpjdv7nZzSpi78EDwJjgAAySGSGHSHtUVOKCLCj9/0s1vQA== +"@formily/reactive-react@2.3.7", "@formily/reactive-react@^2.2.0", "@formily/reactive-react@^2.2.27": + version "2.3.7" + resolved "https://registry.yarnpkg.com/@formily/reactive-react/-/reactive-react-2.3.7.tgz#efa64bfcc16aca38bccfd2267bb0573fc55e41d7" + integrity sha512-foUP2El31RrCS+cj6QhZ9nhO5h8HhTFT4kof6Dt9qI72pzcdoxjGSiPSSstfn4eFmUbyiD8APz8d/ynB4INo5Q== dependencies: - "@formily/reactive" "2.3.0" + "@formily/reactive" "2.3.7" hoist-non-react-statics "^3.3.2" -"@formily/reactive@2.3.0", "@formily/reactive@^2.2.0", "@formily/reactive@^2.2.27": - version "2.3.0" - resolved "https://registry.npmjs.org/@formily/reactive/-/reactive-2.3.0.tgz#95582dfcf97c42410454ef7df0c247514bd4446e" - integrity sha512-8QYApPL/GvATIP/9K3UeICJNuCaLq99NLlNLEuBsE7cIk2hFiFhWP7vnLtWBdorqeQZNYZ6lzSuau2Ndogu+Dw== +"@formily/reactive@2.3.7", "@formily/reactive@^2.2.0", "@formily/reactive@^2.2.27": + version "2.3.7" + resolved "https://registry.yarnpkg.com/@formily/reactive/-/reactive-2.3.7.tgz#8f6d23b1871dd7d487512a35e2eb2d773f8f457b" + integrity sha512-+ovdvYfig7K97Ktel8qY1xAUM4O1uxSm79yuk7xmaAhOJWDAkvDPvzGtcB95cQ3vhPN9d/2sOvRzxMlVlr/gpg== -"@formily/shared@2.3.0", "@formily/shared@^2.2.0", "@formily/shared@^2.2.27": - version "2.3.0" - resolved "https://registry.npmjs.org/@formily/shared/-/shared-2.3.0.tgz#4423c3dfad0d1017cab1e3c6c8fd34004e0a9664" - integrity sha512-sJiMLBmk4JMPI1CxzLawIc+ERTjcnWOm8u4cpmF+3XABdLNU3CxsIRT9CXiJnrS9ZR+OE12AW7cGp6A1hPm7ZA== +"@formily/shared@2.3.7", "@formily/shared@^2.2.0", "@formily/shared@^2.2.27": + version "2.3.7" + resolved "https://registry.yarnpkg.com/@formily/shared/-/shared-2.3.7.tgz#85aa3f89008b12239703d4b7adc94f9db30651cf" + integrity sha512-Xccuay6CP1CNvieyTjAniFG08biUVA+xBZZuZboCzdxoUO1gOCzUz9A2U7cvw0Xw+Hm4uI1sgISE95lCD5R3fQ== dependencies: - "@formily/path" "2.3.0" + "@formily/path" "2.3.7" camel-case "^4.1.1" lower-case "^2.0.1" no-case "^3.0.4" @@ -1599,49 +1598,49 @@ pascal-case "^3.1.1" upper-case "^2.0.1" -"@formily/validator@2.3.0", "@formily/validator@^2.2.27": - version "2.3.0" - resolved "https://registry.npmjs.org/@formily/validator/-/validator-2.3.0.tgz#a04b94f7a18ac1a490c1e273eb0c2acd6662d6c2" - integrity sha512-uh6rGjEZhCv+asDhkhKHVnN00tIQcb5wVFyAqtaHlUHGh2gBCiv0e3yb9H80UGQx/EiVuklmcVgR96gAMJfmDw== +"@formily/validator@2.3.7", "@formily/validator@^2.2.27": + version "2.3.7" + resolved "https://registry.yarnpkg.com/@formily/validator/-/validator-2.3.7.tgz#94083e03edbac494ac420b9546582a940f9dbbb4" + integrity sha512-/bIZL0YoEhi/AxwbJz1FxkcAXI4tyzaMF8j7LTJigKgjrJLGCiLEU1GtSk+9OmUSRDHblr73jM/TWMlb/L3EuA== dependencies: - "@formily/shared" "2.3.0" + "@formily/shared" "2.3.7" "@formulajs/formulajs@4.2.0": version "4.2.0" - resolved "https://registry.npmjs.org/@formulajs/formulajs/-/formulajs-4.2.0.tgz#e5c6a98fa5863442cb68f93b8b9b28d75070abc4" + resolved "https://registry.yarnpkg.com/@formulajs/formulajs/-/formulajs-4.2.0.tgz#e5c6a98fa5863442cb68f93b8b9b28d75070abc4" integrity sha512-egxyvwj08iwOznFgxv7dvjgHUC7C8jdtznAs+15uThIti7TwDGhB3wsbJt1dlfhSHKvlRAiW4MDYxNkvgmyjyg== dependencies: bessel "^1.0.2" jstat "^1.9.6" "@formulajs/formulajs@^4.4.9": - version "4.4.9" - resolved "https://registry.yarnpkg.com/@formulajs/formulajs/-/formulajs-4.4.9.tgz#34a4f1c8eae6351330e367a874e45a8ded7cb33e" - integrity sha512-11kIRYGI7YtKz9gMLgQgqs3yBC6ciT2SZRmAsLUt3CLdGfH5w9UW+Ie2Oc/MfzjobwwoJ7DcbeW+ccnHEjaGvQ== + version "4.5.3" + resolved "https://registry.yarnpkg.com/@formulajs/formulajs/-/formulajs-4.5.3.tgz#5985d186dfbc1f0ed5d2d0a824a8ab34025fb0e8" + integrity sha512-bFyB7/3BWIny8rGJfbFnhHHM2ZNYiYoM4f9Q6fJVWo8wyfS174lDbk469A+J2NjECWq/M2CZVJcwDhzZ9EW8Sw== dependencies: bessel "^1.0.2" jstat "^1.9.6" "@hapi/hoek@^11.0.2": - version "11.0.2" - resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.2.tgz#cb3ea547daac7de5c9cf1d960c3f35c34f065427" - integrity sha512-aKmlCO57XFZ26wso4rJsW4oTUnrgTFw2jh3io7CAtO9w4UltBNwRXvXIVzzyfkaaLRo3nluP/19msA8vDUUuKw== + version "11.0.7" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-11.0.7.tgz#56a920793e0a42d10e530da9a64cc0d3919c4002" + integrity sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ== "@hapi/topo@^6.0.0": version "6.0.2" - resolved "https://registry.npmjs.org/@hapi/topo/-/topo-6.0.2.tgz#f219c1c60da8430228af4c1f2e40c32a0d84bbb4" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-6.0.2.tgz#f219c1c60da8430228af4c1f2e40c32a0d84bbb4" integrity sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg== dependencies: "@hapi/hoek" "^11.0.2" "@iconify/types@^2.0.0": version "2.0.0" - resolved "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz#ab0e9ea681d6c8a1214f30cd741fe3a20cc57f57" + resolved "https://registry.yarnpkg.com/@iconify/types/-/types-2.0.0.tgz#ab0e9ea681d6c8a1214f30cd741fe3a20cc57f57" integrity sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg== "@iconify/utils@2.1.1": version "2.1.1" - resolved "https://registry.npmjs.org/@iconify/utils/-/utils-2.1.1.tgz#a75387fff55aa9c95841968c7de05a210010c1ac" + resolved "https://registry.yarnpkg.com/@iconify/utils/-/utils-2.1.1.tgz#a75387fff55aa9c95841968c7de05a210010c1ac" integrity sha512-H8xz74JDzDw8f0qLxwIaxFMnFkbXTZNWEufOk3WxaLFHV4h0A2FjIDgNk5LzC0am4jssnjdeJJdRs3UFu3582Q== dependencies: "@antfu/install-pkg" "^0.1.1" @@ -1665,7 +1664,7 @@ "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" - resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== dependencies: camelcase "^5.3.1" @@ -1676,19 +1675,19 @@ "@istanbuljs/schema@^0.1.2": version "0.1.3" - resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== "@jest/schemas@^29.6.3": version "29.6.3" - resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== dependencies: "@sinclair/typebox" "^0.27.8" "@jest/transform@^29.7.0": version "29.7.0" - resolved "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== dependencies: "@babel/core" "^7.11.6" @@ -1709,7 +1708,7 @@ "@jest/types@27.5.1": version "27.5.1" - resolved "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" @@ -1718,9 +1717,18 @@ "@types/yargs" "^16.0.0" chalk "^4.0.0" +"@jest/types@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" + integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^13.0.0" + "@jest/types@^29.6.3": version "29.6.3" - resolved "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== dependencies: "@jest/schemas" "^29.6.3" @@ -1730,68 +1738,62 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== +"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": + version "0.3.12" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz#2234ce26c62889f03db3d7fea43c1932ab3e927b" + integrity sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg== dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/sourcemap-codec" "^1.5.0" + "@jridgewell/trace-mapping" "^0.3.24" "@jridgewell/resolve-uri@^3.1.0": - version "3.1.1" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== - -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/source-map@^0.3.3": - version "0.3.5" - resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" - integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== + version "0.3.10" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.10.tgz#a35714446a2e84503ff9bfe66f1d1d4846f2075b" + integrity sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q== dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== +"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz#7358043433b2e5da569aa02cbc4c121da3af27d7" + integrity sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw== -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.20" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" - integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== +"@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.28": + version "0.3.29" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz#a58d31eaadaf92c6695680b2e1d464a9b8fbf7fc" + integrity sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" "@juggle/resize-observer@^3.3.1": version "3.4.0" - resolved "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz#08d6c5e20cf7e4cc02fd181c4b0c225cd31dbb60" + resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz#08d6c5e20cf7e4cc02fd181c4b0c225cd31dbb60" integrity sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA== "@ljharb/resumer@~0.0.1": version "0.0.1" - resolved "https://registry.npmjs.org/@ljharb/resumer/-/resumer-0.0.1.tgz#8a940a9192dd31f6a1df17564bbd26dc6ad3e68d" + resolved "https://registry.yarnpkg.com/@ljharb/resumer/-/resumer-0.0.1.tgz#8a940a9192dd31f6a1df17564bbd26dc6ad3e68d" integrity sha512-skQiAOrCfO7vRTq53cxznMpks7wS1va95UCidALlOVWqvBAzwPVErwizDwoMqNVMEn1mDq0utxZd02eIrvF1lw== dependencies: "@ljharb/through" "^2.3.9" "@ljharb/through@^2.3.9", "@ljharb/through@~2.3.9": - version "2.3.11" - resolved "https://registry.npmjs.org/@ljharb/through/-/through-2.3.11.tgz#783600ff12c06f21a76cc26e33abd0b1595092f9" - integrity sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w== + version "2.3.14" + resolved "https://registry.yarnpkg.com/@ljharb/through/-/through-2.3.14.tgz#a5df44295f44dc23bfe106af59426dd0677760b1" + integrity sha512-ajBvlKpWucBB17FuQYUShqpqy8GRgYEpJW0vWJbUu1CV9lWyrDCapy0lScU8T8Z6qn49sSwJB3+M+evYIdGg+A== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.8" "@loadable/component@5.15.2": version "5.15.2" - resolved "https://registry.npmjs.org/@loadable/component/-/component-5.15.2.tgz#b6c418d592e0a64f16b1d614ca9d3b1443d3b498" + resolved "https://registry.yarnpkg.com/@loadable/component/-/component-5.15.2.tgz#b6c418d592e0a64f16b1d614ca9d3b1443d3b498" integrity sha512-ryFAZOX5P2vFkUdzaAtTG88IGnr9qxSdvLRvJySXcUA4B4xVWurUNADu3AnKPksxOZajljqTrDEDcYjeL4lvLw== dependencies: "@babel/runtime" "^7.7.7" @@ -1800,20 +1802,159 @@ "@makotot/ghostui@^2.0.0": version "2.0.0" - resolved "https://registry.npmjs.org/@makotot/ghostui/-/ghostui-2.0.0.tgz#ae035d405a9ed5100436158e953ed9480f1c09a7" + resolved "https://registry.yarnpkg.com/@makotot/ghostui/-/ghostui-2.0.0.tgz#ae035d405a9ed5100436158e953ed9480f1c09a7" integrity sha512-LD6OeMv+yGjpYZNjh34yDTCIE1NegqOtJq5gm4wX6op3QL7K5psTVzMjkWzseBoYj0XOD4g+UJVIZTprfoOPGg== +"@module-federation/error-codes@0.8.12": + version "0.8.12" + resolved "https://registry.yarnpkg.com/@module-federation/error-codes/-/error-codes-0.8.12.tgz#b9f3b6de8760c3db1b8b33bf0c47bc7d775fa344" + integrity sha512-K+F4iiV62KY+IpjK6ggn3vI5Yt/T/LUb6xuazY78bhAGwLaHe1DYr7BfSutKMpiB+Dcs6U4dYOBogSMnnl0j4Q== + +"@module-federation/runtime-core@0.6.20": + version "0.6.20" + resolved "https://registry.yarnpkg.com/@module-federation/runtime-core/-/runtime-core-0.6.20.tgz#cd03756b1d46faae87a1f65d2ea37e0eded3dcdf" + integrity sha512-rX7sd/i7tpkAbfMD4TtFt/57SWNC/iv7UYS8g+ad7mnCJggWE1YEKsKSFgcvp4zU3thwR+j2y+kOCwd1sQvxEA== + dependencies: + "@module-federation/error-codes" "0.8.12" + "@module-federation/sdk" "0.8.12" + +"@module-federation/runtime@0.8.12": + version "0.8.12" + resolved "https://registry.yarnpkg.com/@module-federation/runtime/-/runtime-0.8.12.tgz#ce3b4f04b6e523c809244745381982e085b494aa" + integrity sha512-eYohRfambj/qzxz6tEakDn459ROcixWO4zL5gmTEOmwG+jCDnxGR14j1guopyrrpjb6EKFNrPVWtYZTPPfGdQQ== + dependencies: + "@module-federation/error-codes" "0.8.12" + "@module-federation/runtime-core" "0.6.20" + "@module-federation/sdk" "0.8.12" + +"@module-federation/sdk@0.8.12": + version "0.8.12" + resolved "https://registry.yarnpkg.com/@module-federation/sdk/-/sdk-0.8.12.tgz#3822d3bb03ed4826ac31648a40df6d18cb943e37" + integrity sha512-zFgXYBHbzwIqlrLfn6ewIRXDZCctDDQT2nFhbsZr29yWQgpmW1fm2kJCxQsG0DENGGN1KpzfDoxjjvSKJS/ZHA== + dependencies: + isomorphic-rslog "0.0.7" + +"@module-federation/webpack-bundler-runtime@^0.8.0": + version "0.8.12" + resolved "https://registry.yarnpkg.com/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.8.12.tgz#35638aaa6525d173091b8dfb2c47c45b1329fe45" + integrity sha512-zd343RO7/R7Xjh5ym5KdnYQ70z4LBmMxWsa44FS0nyNv04sOq6V1eZSCGKbEhbfqqhbS5Wfj8OzJyedeVvV/OQ== + dependencies: + "@module-federation/runtime" "0.8.12" + "@module-federation/sdk" "0.8.12" + +"@napi-rs/nice-android-arm-eabi@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.0.4.tgz#d6b0194f10b1fac2b49d303aeab920651abf10f7" + integrity sha512-OZFMYUkih4g6HCKTjqJHhMUlgvPiDuSLZPbPBWHLjKmFTv74COzRlq/gwHtmEVaR39mJQ6ZyttDl2HNMUbLVoA== + +"@napi-rs/nice-android-arm64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.0.4.tgz#254ecc462693698ecf597c792d57b6b1b1a9467f" + integrity sha512-k8u7cjeA64vQWXZcRrPbmwjH8K09CBnNaPnI9L1D5N6iMPL3XYQzLcN6WwQonfcqCDv5OCY3IqX89goPTV4KMw== + +"@napi-rs/nice-darwin-arm64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.0.4.tgz#7db12e6babb8fae50289ab604401501a7c2c452a" + integrity sha512-GsLdQvUcuVzoyzmtjsThnpaVEizAqH5yPHgnsBmq3JdVoVZHELFo7PuJEdfOH1DOHi2mPwB9sCJEstAYf3XCJA== + +"@napi-rs/nice-darwin-x64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.0.4.tgz#f1f11a045934a4d4a2a22064cd3550fd20d5e2cb" + integrity sha512-1y3gyT3e5zUY5SxRl3QDtJiWVsbkmhtUHIYwdWWIQ3Ia+byd/IHIEpqAxOGW1nhhnIKfTCuxBadHQb+yZASVoA== + +"@napi-rs/nice-freebsd-x64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.0.4.tgz#79672daa873cd070d94118f0674d77e24ed65062" + integrity sha512-06oXzESPRdXUuzS8n2hGwhM2HACnDfl3bfUaSqLGImM8TA33pzDXgGL0e3If8CcFWT98aHows5Lk7xnqYNGFeA== + +"@napi-rs/nice-linux-arm-gnueabihf@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.0.4.tgz#ebd0fe94ecbf1a05be29aa04928eea8f97f57550" + integrity sha512-CgklZ6g8WL4+EgVVkxkEvvsi2DSLf9QIloxWO0fvQyQBp6VguUSX3eHLeRpqwW8cRm2Hv/Q1+PduNk7VK37VZw== + +"@napi-rs/nice-linux-arm64-gnu@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.0.4.tgz#714d62af0ec354a60b134e8c3bbc018667248b5a" + integrity sha512-wdAJ7lgjhAlsANUCv0zi6msRwq+D4KDgU+GCCHssSxWmAERZa2KZXO0H2xdmoJ/0i03i6YfK/sWaZgUAyuW2oQ== + +"@napi-rs/nice-linux-arm64-musl@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.0.4.tgz#fa068003a1e18289b7ee9e58dfceb77a0f0b1d08" + integrity sha512-4b1KYG+sriufhFrpUS9uNOEYYJqSfcbnwGx6uGX7JjrH8tELG90cOpCawz5THNIwlS3DhLgnCOcn0+4p6z26QA== + +"@napi-rs/nice-linux-ppc64-gnu@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.0.4.tgz#8e4ae1b53c200e6bfe80b31751685e97d4feb368" + integrity sha512-iaf3vMRgr23oe1PUaKpxaH3DS0IMN0+N9iEiWVwYPm/U15vZFYdqVegGfN2PzrZLUl5lc8ZxbmEKDfuqslhAMA== + +"@napi-rs/nice-linux-riscv64-gnu@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.0.4.tgz#5de54f35ad57663b0121bcb8705ecc11e7f0bbda" + integrity sha512-UXoREY6Yw6rHrGuTwQgBxpfjK34t6mTjibE9/cXbefL9AuUCJ9gEgwNKZiONuR5QGswChqo9cnthjdKkYyAdDg== + +"@napi-rs/nice-linux-s390x-gnu@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.0.4.tgz#6fa0fe90d97278ce30f556165bdaaffca8d5bf15" + integrity sha512-eFbgYCRPmsqbYPAlLYU5hYTNbogmIDUvknilehHsFhCH1+0/kN87lP+XaLT0Yeq4V/rpwChSd9vlz4muzFArtw== + +"@napi-rs/nice-linux-x64-gnu@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.0.4.tgz#2b94c9dc0116c906dbbe0e3509075365e44e1081" + integrity sha512-4T3E6uTCwWT6IPnwuPcWVz3oHxvEp/qbrCxZhsgzwTUBEwu78EGNXGdHfKJQt3soth89MLqZJw+Zzvnhrsg1mQ== + +"@napi-rs/nice-linux-x64-musl@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.0.4.tgz#5c8a7b1305b154747b47c7f9a69ae25441891179" + integrity sha512-NtbBkAeyBPLvCBkWtwkKXkNSn677eaT0cX3tygq+2qVv71TmHgX4gkX6o9BXjlPzdgPGwrUudavCYPT9tzkEqQ== + +"@napi-rs/nice-win32-arm64-msvc@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.0.4.tgz#95e2920ae08b11ae61dbdbc55320013391af01f9" + integrity sha512-vubOe3i+YtSJGEk/++73y+TIxbuVHi+W8ZzrRm2eETCjCRwNlgbfToQZ85dSA+4iBB/NJRGNp+O4hfdbbttZWA== + +"@napi-rs/nice-win32-ia32-msvc@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.0.4.tgz#ceed828b2ef32675430c69f110eb49e80d7c0aa7" + integrity sha512-BMOVrUDZeg1RNRKVlh4eyLv5djAAVLiSddfpuuQ47EFjBcklg0NUeKMFKNrKQR4UnSn4HAiACLD7YK7koskwmg== + +"@napi-rs/nice-win32-x64-msvc@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.0.4.tgz#38148eac5fb12244e39dceef6e291d0aa5ba763d" + integrity sha512-kCNk6HcRZquhw/whwh4rHsdPyOSCQCgnVDVik+Y9cuSVTDy3frpiCJTScJqPPS872h4JgZKkr/+CwcwttNEo9Q== + +"@napi-rs/nice@^1.0.1": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@napi-rs/nice/-/nice-1.0.4.tgz#a5dbd1d4ab1767108f9bbe55e482e03c62845f60" + integrity sha512-Sqih1YARrmMoHlXGgI9JrrgkzxcaaEso0AH+Y7j8NHonUs+xe4iDsgC3IBIDNdzEewbNpccNN6hip+b5vmyRLw== + optionalDependencies: + "@napi-rs/nice-android-arm-eabi" "1.0.4" + "@napi-rs/nice-android-arm64" "1.0.4" + "@napi-rs/nice-darwin-arm64" "1.0.4" + "@napi-rs/nice-darwin-x64" "1.0.4" + "@napi-rs/nice-freebsd-x64" "1.0.4" + "@napi-rs/nice-linux-arm-gnueabihf" "1.0.4" + "@napi-rs/nice-linux-arm64-gnu" "1.0.4" + "@napi-rs/nice-linux-arm64-musl" "1.0.4" + "@napi-rs/nice-linux-ppc64-gnu" "1.0.4" + "@napi-rs/nice-linux-riscv64-gnu" "1.0.4" + "@napi-rs/nice-linux-s390x-gnu" "1.0.4" + "@napi-rs/nice-linux-x64-gnu" "1.0.4" + "@napi-rs/nice-linux-x64-musl" "1.0.4" + "@napi-rs/nice-win32-arm64-msvc" "1.0.4" + "@napi-rs/nice-win32-ia32-msvc" "1.0.4" + "@napi-rs/nice-win32-x64-msvc" "1.0.4" + "@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": version "5.1.1-v1" - resolved "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== dependencies: eslint-scope "5.1.1" "@nocobase/client@^0.21.0-alpha.6": - version "0.21.0-alpha.6" - resolved "https://registry.yarnpkg.com/@nocobase/client/-/client-0.21.0-alpha.6.tgz#679d54e2710572f6e44deff24aaf8ca13e838f48" - integrity sha512-jYQjbYFte2/YRkpPyHjZPnJWPm6wNxMjpv7x/jMUHxfQlNIwaM+8f7aicxEISkXiPY4Q7Es5C/fexWx2AJXhWA== + version "0.21.0-alpha.16" + resolved "https://registry.yarnpkg.com/@nocobase/client/-/client-0.21.0-alpha.16.tgz#69dc0825f0a7d05512c41d02ec9e6e7e5a88e64c" + integrity sha512-VW6Dh02PNfrnUvverfl6d8xagv/TJ6Ao6lOK9DudxNM762eBP8lp3mHbK8yb19Kb/pH/Uh4Zz1u+WKsi1kf7VQ== dependencies: "@ahooksjs/use-url-state" "3.5.1" "@ant-design/cssinjs" "^1.11.1" @@ -1835,9 +1976,9 @@ "@formily/reactive-react" "^2.2.27" "@formily/shared" "^2.2.27" "@formily/validator" "^2.2.27" - "@nocobase/evaluators" "0.21.0-alpha.6" - "@nocobase/sdk" "0.21.0-alpha.6" - "@nocobase/utils" "0.21.0-alpha.6" + "@nocobase/evaluators" "0.21.0-alpha.16" + "@nocobase/sdk" "0.21.0-alpha.16" + "@nocobase/utils" "0.21.0-alpha.16" ahooks "^3.7.2" antd "^5.12.8" antd-style "3.4.5" @@ -1870,27 +2011,27 @@ sanitize-html "2.10.0" use-deep-compare-effect "^1.8.1" -"@nocobase/evaluators@0.21.0-alpha.6": - version "0.21.0-alpha.6" - resolved "https://registry.yarnpkg.com/@nocobase/evaluators/-/evaluators-0.21.0-alpha.6.tgz#13913f9b0a840e98906a4969afbe63f24ad2fb08" - integrity sha512-1utvLM5bUzlyDiHSfP+Sjo6RloqZltLFSljJ58IvJwMrhs4ZNjVa7NnxY080Pmf00I3Zf0jShhGdvVrpxTl9rQ== +"@nocobase/evaluators@0.21.0-alpha.16": + version "0.21.0-alpha.16" + resolved "https://registry.yarnpkg.com/@nocobase/evaluators/-/evaluators-0.21.0-alpha.16.tgz#3de706b2e92bf2ec249dff5ad871eddd6114ea1d" + integrity sha512-ecCfQaSdYhmUwSSPCiCQcDQCiQa8RXZEsay/YJMKn6M2zZ4KvRaPjjEoiBk/S0z71X6ApZq1Ee+Pl+1EXtpusA== dependencies: "@formulajs/formulajs" "4.2.0" - "@nocobase/utils" "0.21.0-alpha.6" + "@nocobase/utils" "0.21.0-alpha.16" mathjs "^10.6.0" -"@nocobase/sdk@0.21.0-alpha.6": - version "0.21.0-alpha.6" - resolved "https://registry.yarnpkg.com/@nocobase/sdk/-/sdk-0.21.0-alpha.6.tgz#901ff6488f572a05a22a745227a0a82f6701cbcf" - integrity sha512-1afJZH+B2s7atkKyMFEsrcOUTJBWGtyN6ASDjF6PzKKoRQgD+bWm1oBsrQz89cYNY9qwqme2SIAeUhgA+7wOkw== +"@nocobase/sdk@0.21.0-alpha.16": + version "0.21.0-alpha.16" + resolved "https://registry.yarnpkg.com/@nocobase/sdk/-/sdk-0.21.0-alpha.16.tgz#3da6c0f254c189bf4fae6ac69692f0ac22a9eacc" + integrity sha512-hZTj60Wcz90d7RaFn/3JTXvkfLKtwgILeA0VknZS4uiblPNUwOmDz5nC2wWNNJw4df5AEeMJc7k6xn8v4gU7zQ== dependencies: axios "^0.26.1" qs "^6.10.1" -"@nocobase/utils@0.21.0-alpha.6": - version "0.21.0-alpha.6" - resolved "https://registry.yarnpkg.com/@nocobase/utils/-/utils-0.21.0-alpha.6.tgz#5c8e768fd9053f00bab55cc5d073eca1aef351aa" - integrity sha512-et2jM+W6XHjX6ASG+wmOoqY3H2BPmmrzpXZMCkwYfa1AnvRbcAsOxZVqi3W87e1uoH27GkWTPhQGT1bsYLzFrw== +"@nocobase/utils@0.21.0-alpha.16": + version "0.21.0-alpha.16" + resolved "https://registry.yarnpkg.com/@nocobase/utils/-/utils-0.21.0-alpha.16.tgz#54857fc5bde8bc9c1b184faf14d9374b11b113f9" + integrity sha512-Yomd9O72fmNpXmkWgbAZdWJ2SHBMldQ9/iNGi+V59m516SDgiOYHmaiO3xTRP0eH3sADNGyT1R7BhT2KDn6FAQ== dependencies: "@hapi/topo" "^6.0.0" "@rc-component/mini-decimal" "^1.1.0" @@ -1904,7 +2045,7 @@ "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" @@ -1912,57 +2053,143 @@ "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" - resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": version "1.2.8" - resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== +"@parcel/watcher-android-arm64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz#507f836d7e2042f798c7d07ad19c3546f9848ac1" + integrity sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA== -"@pkgr/utils@^2.3.1": - version "2.4.2" - resolved "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz#9e638bbe9a6a6f165580dc943f138fd3309a2cbc" - integrity sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw== - dependencies: - cross-spawn "^7.0.3" - fast-glob "^3.3.0" - is-glob "^4.0.3" - open "^9.1.0" - picocolors "^1.0.0" - tslib "^2.6.0" +"@parcel/watcher-darwin-arm64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz#3d26dce38de6590ef79c47ec2c55793c06ad4f67" + integrity sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw== -"@rc-component/color-picker@~1.4.1": - version "1.4.1" - resolved "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-1.4.1.tgz#dcab0b660e9c4ed63a7582db68ed4a77c862cb93" - integrity sha512-vh5EWqnsayZa/JwUznqDaPJz39jznx/YDbyBuVJntv735tKXKwEUZZb2jYEldOg+NKWZwtALjGMrNeGBmqFoEw== - dependencies: - "@babel/runtime" "^7.10.1" - "@ctrl/tinycolor" "^3.6.0" - classnames "^2.2.6" - rc-util "^5.30.0" +"@parcel/watcher-darwin-x64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz#99f3af3869069ccf774e4ddfccf7e64fd2311ef8" + integrity sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg== -"@rc-component/color-picker@~1.5.3": - version "1.5.3" - resolved "https://registry.yarnpkg.com/@rc-component/color-picker/-/color-picker-1.5.3.tgz#f3b0e14bb67ec5ee77d1fd5d261f63dd4fd00449" - integrity sha512-+tGGH3nLmYXTalVe0L8hSZNs73VTP5ueSHwUlDC77KKRaN7G4DS4wcpG5DTDzdcV/Yas+rzA6UGgIyzd8fS4cw== - dependencies: +"@parcel/watcher-freebsd-x64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz#14d6857741a9f51dfe51d5b08b7c8afdbc73ad9b" + integrity sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ== + +"@parcel/watcher-linux-arm-glibc@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz#43c3246d6892381db473bb4f663229ad20b609a1" + integrity sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA== + +"@parcel/watcher-linux-arm-musl@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz#663750f7090bb6278d2210de643eb8a3f780d08e" + integrity sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q== + +"@parcel/watcher-linux-arm64-glibc@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz#ba60e1f56977f7e47cd7e31ad65d15fdcbd07e30" + integrity sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w== + +"@parcel/watcher-linux-arm64-musl@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz#f7fbcdff2f04c526f96eac01f97419a6a99855d2" + integrity sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg== + +"@parcel/watcher-linux-x64-glibc@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz#4d2ea0f633eb1917d83d483392ce6181b6a92e4e" + integrity sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A== + +"@parcel/watcher-linux-x64-musl@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz#277b346b05db54f55657301dd77bdf99d63606ee" + integrity sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg== + +"@parcel/watcher-win32-arm64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz#7e9e02a26784d47503de1d10e8eab6cceb524243" + integrity sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw== + +"@parcel/watcher-win32-ia32@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz#2d0f94fa59a873cdc584bf7f6b1dc628ddf976e6" + integrity sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ== + +"@parcel/watcher-win32-x64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz#ae52693259664ba6f2228fa61d7ee44b64ea0947" + integrity sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA== + +"@parcel/watcher@^2.4.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.5.1.tgz#342507a9cfaaf172479a882309def1e991fb1200" + integrity sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg== + dependencies: + detect-libc "^1.0.3" + is-glob "^4.0.3" + micromatch "^4.0.5" + node-addon-api "^7.0.0" + optionalDependencies: + "@parcel/watcher-android-arm64" "2.5.1" + "@parcel/watcher-darwin-arm64" "2.5.1" + "@parcel/watcher-darwin-x64" "2.5.1" + "@parcel/watcher-freebsd-x64" "2.5.1" + "@parcel/watcher-linux-arm-glibc" "2.5.1" + "@parcel/watcher-linux-arm-musl" "2.5.1" + "@parcel/watcher-linux-arm64-glibc" "2.5.1" + "@parcel/watcher-linux-arm64-musl" "2.5.1" + "@parcel/watcher-linux-x64-glibc" "2.5.1" + "@parcel/watcher-linux-x64-musl" "2.5.1" + "@parcel/watcher-win32-arm64" "2.5.1" + "@parcel/watcher-win32-ia32" "2.5.1" + "@parcel/watcher-win32-x64" "2.5.1" + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@pkgr/utils@^2.3.1": + version "2.4.2" + resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.4.2.tgz#9e638bbe9a6a6f165580dc943f138fd3309a2cbc" + integrity sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw== + dependencies: + cross-spawn "^7.0.3" + fast-glob "^3.3.0" + is-glob "^4.0.3" + open "^9.1.0" + picocolors "^1.0.0" + tslib "^2.6.0" + +"@rc-component/async-validator@^5.0.3": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@rc-component/async-validator/-/async-validator-5.0.4.tgz#5291ad92f00a14b6766fc81735c234277f83e948" + integrity sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg== + dependencies: + "@babel/runtime" "^7.24.4" + +"@rc-component/color-picker@~2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@rc-component/color-picker/-/color-picker-2.0.1.tgz#6b9b96152466a9d4475cbe72b40b594bfda164be" + integrity sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q== + dependencies: + "@ant-design/fast-color" "^2.0.6" "@babel/runtime" "^7.23.6" - "@ctrl/tinycolor" "^3.6.1" classnames "^2.2.6" rc-util "^5.38.1" "@rc-component/context@^1.4.0": version "1.4.0" - resolved "https://registry.npmjs.org/@rc-component/context/-/context-1.4.0.tgz#dc6fb021d6773546af8f016ae4ce9aea088395e8" + resolved "https://registry.yarnpkg.com/@rc-component/context/-/context-1.4.0.tgz#dc6fb021d6773546af8f016ae4ce9aea088395e8" integrity sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w== dependencies: "@babel/runtime" "^7.10.1" @@ -1970,14 +2197,14 @@ "@rc-component/mini-decimal@^1.0.1", "@rc-component/mini-decimal@^1.1.0": version "1.1.0" - resolved "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz#7b7a362b14a0a54cb5bc6fd2b82731f29f11d9b0" + resolved "https://registry.yarnpkg.com/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz#7b7a362b14a0a54cb5bc6fd2b82731f29f11d9b0" integrity sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ== dependencies: "@babel/runtime" "^7.18.0" "@rc-component/mutate-observer@^1.1.0": version "1.1.0" - resolved "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz#ee53cc88b78aade3cd0653609215a44779386fd8" + resolved "https://registry.yarnpkg.com/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz#ee53cc88b78aade3cd0653609215a44779386fd8" integrity sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw== dependencies: "@babel/runtime" "^7.18.0" @@ -1986,28 +2213,26 @@ "@rc-component/portal@^1.0.0-8", "@rc-component/portal@^1.0.0-9", "@rc-component/portal@^1.0.2", "@rc-component/portal@^1.1.0", "@rc-component/portal@^1.1.1": version "1.1.2" - resolved "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz#55db1e51d784e034442e9700536faaa6ab63fc71" + resolved "https://registry.yarnpkg.com/@rc-component/portal/-/portal-1.1.2.tgz#55db1e51d784e034442e9700536faaa6ab63fc71" integrity sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg== dependencies: "@babel/runtime" "^7.18.0" classnames "^2.3.2" rc-util "^5.24.4" -"@rc-component/tour@~1.10.0": - version "1.10.0" - resolved "https://registry.npmjs.org/@rc-component/tour/-/tour-1.10.0.tgz#b05bc327438f1c583439e2d2dcc10ec0530aea19" - integrity sha512-voV0BKaTJbewB9LLgAHQ7tAGG7rgDkKQkZo82xw2gIk542hY+o7zwoqdN16oHhIKk7eG/xi+mdXrONT62Dt57A== +"@rc-component/qrcode@~1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@rc-component/qrcode/-/qrcode-1.0.0.tgz#48a8de5eb11d0e65926f1377c4b1ef4c888997f5" + integrity sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg== dependencies: - "@babel/runtime" "^7.18.0" - "@rc-component/portal" "^1.0.0-9" - "@rc-component/trigger" "^1.3.6" + "@babel/runtime" "^7.24.7" classnames "^2.3.2" - rc-util "^5.24.4" + rc-util "^5.38.0" -"@rc-component/tour@~1.14.2": - version "1.14.2" - resolved "https://registry.yarnpkg.com/@rc-component/tour/-/tour-1.14.2.tgz#142f0973975eb0e3af3c75aa868ffc9d8ba27cae" - integrity sha512-A75DZ8LVvahBIvxooj3Gvf2sxe+CGOkmzPNX7ek0i0AJHyKZ1HXe5ieIGo3m0FMdZfVOlbCJ952Duq8VKAHk6g== +"@rc-component/tour@~1.15.1": + version "1.15.1" + resolved "https://registry.yarnpkg.com/@rc-component/tour/-/tour-1.15.1.tgz#9b79808254185fc19e964172d99e25e8c6800ded" + integrity sha512-Tr2t7J1DKZUpfJuDZWHxyxWpfmj8EZrqSgyMZ+BCdvKZ6r1UDsfU46M/iWAAFBy961Ssfom2kv5f3UcjIL2CmQ== dependencies: "@babel/runtime" "^7.18.0" "@rc-component/portal" "^1.0.0-9" @@ -2015,10 +2240,10 @@ classnames "^2.3.2" rc-util "^5.24.4" -"@rc-component/trigger@^1.17.0", "@rc-component/trigger@^1.18.0", "@rc-component/trigger@^1.18.1", "@rc-component/trigger@^1.3.6", "@rc-component/trigger@^1.5.0", "@rc-component/trigger@^1.7.0": - version "1.18.2" - resolved "https://registry.npmjs.org/@rc-component/trigger/-/trigger-1.18.2.tgz#dc52c4c66fa8aaccaf0710498f2429fc05454e3b" - integrity sha512-jRLYgFgjLEPq3MvS87fIhcfuywFSRDaDrYw1FLku7Cm4esszvzTbA0JBsyacAyLrK9rF3TiHFcvoEDMzoD3CTA== +"@rc-component/trigger@^1.17.0", "@rc-component/trigger@^1.7.0": + version "1.18.3" + resolved "https://registry.yarnpkg.com/@rc-component/trigger/-/trigger-1.18.3.tgz#b323b9e33f2700ca8d24a96f21401ab7b0eafdcd" + integrity sha512-Ksr25pXreYe1gX6ayZ1jLrOrl9OAUHUqnuhEx6MeHnNa1zVM5Y2Aj3Q35UrER0ns8D2cJYtmJtVli+i+4eKrvA== dependencies: "@babel/runtime" "^7.23.2" "@rc-component/portal" "^1.1.0" @@ -2027,40 +2252,40 @@ rc-resize-observer "^1.3.1" rc-util "^5.38.0" -"@rc-component/trigger@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@rc-component/trigger/-/trigger-2.0.0.tgz#f3d63daea1b734ffe9cbf2e9403fae523d449a8a" - integrity sha512-niwKADPdY5dhdIblV6uwSayVivwo2uUISfJqri+/ovYQcH/omxDYBJKo755QKeoIIsWptxnRpgr7reEnNEZGFg== +"@rc-component/trigger@^2.0.0", "@rc-component/trigger@^2.1.1", "@rc-component/trigger@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@rc-component/trigger/-/trigger-2.3.0.tgz#9499ada078daca9dd99d01f0f0743ee1ab9e398b" + integrity sha512-iwaxZyzOuK0D7lS+0AQEtW52zUWxoGqTGkke3dRyb8pYiShmRpCjB/8TzPI4R6YySCH7Vm9BZj/31VPiiQTLBg== dependencies: "@babel/runtime" "^7.23.2" "@rc-component/portal" "^1.1.0" classnames "^2.3.2" rc-motion "^2.0.0" rc-resize-observer "^1.3.1" - rc-util "^5.38.0" + rc-util "^5.44.0" -"@reactflow/background@11.3.6": - version "11.3.6" - resolved "https://registry.npmjs.org/@reactflow/background/-/background-11.3.6.tgz#10f51a8915903cf5cf4a447963e5a01831498f79" - integrity sha512-06FPlSUOOMALEEs+2PqPAbpqmL7WDjrkbG2UsDr2d6mbcDDhHiV4tu9FYoz44SQvXo7ma9VRotlsaR4OiRcYsg== +"@reactflow/background@11.3.14": + version "11.3.14" + resolved "https://registry.yarnpkg.com/@reactflow/background/-/background-11.3.14.tgz#778ca30174f3de77fc321459ab3789e66e71a699" + integrity sha512-Gewd7blEVT5Lh6jqrvOgd4G6Qk17eGKQfsDXgyRSqM+CTwDqRldG2LsWN4sNeno6sbqVIC2fZ+rAUBFA9ZEUDA== dependencies: - "@reactflow/core" "11.10.1" + "@reactflow/core" "11.11.4" classcat "^5.0.3" zustand "^4.4.1" -"@reactflow/controls@11.2.6": - version "11.2.6" - resolved "https://registry.npmjs.org/@reactflow/controls/-/controls-11.2.6.tgz#20ef4f14550b43cceec39350132dbdd3f849bb6c" - integrity sha512-4QHT92/ACVlZkvV+Hq44bAPV8WbMhkJl+/J0EbXcqQ1+an7cWJsF84eeelJw7R5J76RoaSSpKdsWsL2v7HAVlw== +"@reactflow/controls@11.2.14": + version "11.2.14" + resolved "https://registry.yarnpkg.com/@reactflow/controls/-/controls-11.2.14.tgz#508ed2c40d23341b3b0919dd11e76fd49cf850c7" + integrity sha512-MiJp5VldFD7FrqaBNIrQ85dxChrG6ivuZ+dcFhPQUwOK3HfYgX2RHdBua+gx+40p5Vw5It3dVNp/my4Z3jF0dw== dependencies: - "@reactflow/core" "11.10.1" + "@reactflow/core" "11.11.4" classcat "^5.0.3" zustand "^4.4.1" -"@reactflow/core@11.10.1": - version "11.10.1" - resolved "https://registry.npmjs.org/@reactflow/core/-/core-11.10.1.tgz#c2b46cb166a883562d2f751e1d3e9f867a7b0424" - integrity sha512-GIh3usY1W3eVobx//OO9+Cwm+5evQBBdPGxDaeXwm25UqPMWRI240nXQA5F/5gL5Mwpf0DUC7DR2EmrKNQy+Rw== +"@reactflow/core@11.11.4": + version "11.11.4" + resolved "https://registry.yarnpkg.com/@reactflow/core/-/core-11.11.4.tgz#89bd86d1862aa1416f3f49926cede7e8c2aab6a7" + integrity sha512-H4vODklsjAq3AMq6Np4LE12i1I4Ta9PrDHuBR9GmL8uzTt2l2jh4CiQbEMpvMDcp7xi4be0hgXj+Ysodde/i7Q== dependencies: "@types/d3" "^7.4.0" "@types/d3-drag" "^3.0.1" @@ -2072,12 +2297,12 @@ d3-zoom "^3.0.0" zustand "^4.4.1" -"@reactflow/minimap@11.7.6": - version "11.7.6" - resolved "https://registry.npmjs.org/@reactflow/minimap/-/minimap-11.7.6.tgz#99c6dc511252e0dd2afa8db62f1594a6d30da935" - integrity sha512-kJEtyeQkTZYViLGebVWHVUJROMAGcvejvT+iX4DqKnFb5yK8E8LWlXQpRx2FrL9gDy80mJJaciy7IxnnQKE1bg== +"@reactflow/minimap@11.7.14": + version "11.7.14" + resolved "https://registry.yarnpkg.com/@reactflow/minimap/-/minimap-11.7.14.tgz#298d7a63cb1da06b2518c99744f716560c88ca73" + integrity sha512-mpwLKKrEAofgFJdkhwR5UQ1JYWlcAAL/ZU/bctBkuNTT1yqV+y0buoNVImsRehVYhJwffSWeSHaBR5/GJjlCSQ== dependencies: - "@reactflow/core" "11.10.1" + "@reactflow/core" "11.11.4" "@types/d3-selection" "^3.0.3" "@types/d3-zoom" "^3.0.1" classcat "^5.0.3" @@ -2085,34 +2310,34 @@ d3-zoom "^3.0.0" zustand "^4.4.1" -"@reactflow/node-resizer@2.2.6": - version "2.2.6" - resolved "https://registry.npmjs.org/@reactflow/node-resizer/-/node-resizer-2.2.6.tgz#7cc23c2774980a76e488621453076e9a35b7e37a" - integrity sha512-1Xb6q97uP7hRBLpog9sRCNfnsHdDgFRGEiU+lQqGgPEAeYwl4nRjWa/sXwH6ajniKxBhGEvrdzOgEFn6CRMcpQ== +"@reactflow/node-resizer@2.2.14": + version "2.2.14" + resolved "https://registry.yarnpkg.com/@reactflow/node-resizer/-/node-resizer-2.2.14.tgz#1810c0ce51aeb936f179466a6660d1e02c7a77a8" + integrity sha512-fwqnks83jUlYr6OHcdFEedumWKChTHRGw/kbCxj0oqBd+ekfs+SIp4ddyNU0pdx96JIm5iNFS0oNrmEiJbbSaA== dependencies: - "@reactflow/core" "11.10.1" + "@reactflow/core" "11.11.4" classcat "^5.0.4" d3-drag "^3.0.0" d3-selection "^3.0.0" zustand "^4.4.1" -"@reactflow/node-toolbar@1.3.6": - version "1.3.6" - resolved "https://registry.npmjs.org/@reactflow/node-toolbar/-/node-toolbar-1.3.6.tgz#ec9f5cb89575d58c2f1a5b610022159d2fcf6dfe" - integrity sha512-JXDEuZ0wKjZ8z7qK2bIst0eZPzNyVEsiHL0e93EyuqT4fA9icoyE0fLq2ryNOOp7MXgId1h7LusnH6ta45F0yQ== +"@reactflow/node-toolbar@1.3.14": + version "1.3.14" + resolved "https://registry.yarnpkg.com/@reactflow/node-toolbar/-/node-toolbar-1.3.14.tgz#c6ffc76f82acacdce654f2160dc9852162d6e7c9" + integrity sha512-rbynXQnH/xFNu4P9H+hVqlEUafDCkEoCy0Dg9mG22Sg+rY/0ck6KkrAQrYrTgXusd+cEJOMK0uOOFCK2/5rSGQ== dependencies: - "@reactflow/core" "11.10.1" + "@reactflow/core" "11.11.4" classcat "^5.0.3" zustand "^4.4.1" -"@remix-run/router@1.12.0": - version "1.12.0" - resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.12.0.tgz#e89b64b6fa97a8a5b740a4c38c2904b80f1f229a" - integrity sha512-2hXv036Bux90e1GXTWSMfNzfDDK8LA8JYEWfyHxzvwdp6GyoWEovKc9cotb3KCKmkdwsIBuFGX7ScTWyiHv7Eg== +"@remix-run/router@1.23.0": + version "1.23.0" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.23.0.tgz#35390d0e7779626c026b11376da6789eb8389242" + integrity sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA== "@selderee/plugin-htmlparser2@^0.11.0": version "0.11.0" - resolved "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz#d5b5e29a7ba6d3958a1972c7be16f4b2c188c517" + resolved "https://registry.yarnpkg.com/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz#d5b5e29a7ba6d3958a1972c7be16f4b2c188c517" integrity sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ== dependencies: domhandler "^5.0.3" @@ -2120,69 +2345,74 @@ "@sinclair/typebox@^0.27.8": version "0.27.8" - resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== "@sketch-hq/sketch-file-format-ts@^6": version "6.5.0" - resolved "https://registry.npmjs.org/@sketch-hq/sketch-file-format-ts/-/sketch-file-format-ts-6.5.0.tgz#038b6feb52d5698bec62715d43d13b889e4af3aa" + resolved "https://registry.yarnpkg.com/@sketch-hq/sketch-file-format-ts/-/sketch-file-format-ts-6.5.0.tgz#038b6feb52d5698bec62715d43d13b889e4af3aa" integrity sha512-shaGl4ttFDpHjYBoMaZpciOtsi/lKvJ3VfcBYk6+PjjbFs6H5GxPAyhbiSqy3Vmx30aos284pd88QzD3rE6iag== "@stackblitz/sdk@^1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@stackblitz/sdk/-/sdk-1.9.0.tgz#b5174f3f45a51b6c1b9e67f1ef4e2e783ab105e9" - integrity sha512-3m6C7f8pnR5KXys/Hqx2x6ylnpqOak6HtnZI6T5keEO0yT+E4Spkw37VEbdwuC+2oxmjdgq6YZEgiKX7hM1GmQ== + version "1.11.0" + resolved "https://registry.yarnpkg.com/@stackblitz/sdk/-/sdk-1.11.0.tgz#ba30c837decca221ce8d605ff768a774c0f92f89" + integrity sha512-DFQGANNkEZRzFk1/rDP6TcFdM82ycHE+zfl9C/M/jXlH68jiqHWHFMQURLELoD8koxvu/eW5uhg94NSAZlYrUQ== + +"@stagewise/toolbar@0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@stagewise/toolbar/-/toolbar-0.6.2.tgz#65c2deda0c565e4b229e7a91ec57eac7a5f7dd28" + integrity sha512-WN7PWaOT6YQKjJYL4/85V5UU0eZEws+/UBT/J4wJOEbFxoluLuchqh7xVTmUZTtw0q0xpzlgX8Vb0kAZf/pjmw== "@stylelint/postcss-css-in-js@^0.38.0": version "0.38.0" - resolved "https://registry.npmjs.org/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.38.0.tgz#eabb061df932744db766f11a153ae1c465b6263c" + resolved "https://registry.yarnpkg.com/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.38.0.tgz#eabb061df932744db766f11a153ae1c465b6263c" integrity sha512-XOz5CAe49kS95p5yRd+DAIWDojTjfmyAQ4bbDlXMdbZTQ5t0ThjSLvWI6JI2uiS7MFurVBkZ6zUqcimzcLTBoQ== dependencies: "@babel/core" "^7.17.9" "@svgr/babel-plugin-add-jsx-attribute@^6.5.1": version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz#74a5d648bd0347bda99d82409d87b8ca80b9a1ba" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz#74a5d648bd0347bda99d82409d87b8ca80b9a1ba" integrity sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ== "@svgr/babel-plugin-remove-jsx-attribute@*": version "8.0.0" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz#69177f7937233caca3a1afb051906698f2f59186" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz#69177f7937233caca3a1afb051906698f2f59186" integrity sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA== "@svgr/babel-plugin-remove-jsx-empty-expression@*": version "8.0.0" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz#c2c48104cfd7dcd557f373b70a56e9e3bdae1d44" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz#c2c48104cfd7dcd557f373b70a56e9e3bdae1d44" integrity sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA== "@svgr/babel-plugin-replace-jsx-attribute-value@^6.5.1": version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz#fb9d22ea26d2bc5e0a44b763d4c46d5d3f596c60" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz#fb9d22ea26d2bc5e0a44b763d4c46d5d3f596c60" integrity sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg== "@svgr/babel-plugin-svg-dynamic-title@^6.5.1": version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz#01b2024a2b53ffaa5efceaa0bf3e1d5a4c520ce4" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz#01b2024a2b53ffaa5efceaa0bf3e1d5a4c520ce4" integrity sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw== "@svgr/babel-plugin-svg-em-dimensions@^6.5.1": version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz#dd3fa9f5b24eb4f93bcf121c3d40ff5facecb217" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz#dd3fa9f5b24eb4f93bcf121c3d40ff5facecb217" integrity sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA== "@svgr/babel-plugin-transform-react-native-svg@^6.5.1": version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz#1d8e945a03df65b601551097d8f5e34351d3d305" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz#1d8e945a03df65b601551097d8f5e34351d3d305" integrity sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg== "@svgr/babel-plugin-transform-svg-component@^6.5.1": version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz#48620b9e590e25ff95a80f811544218d27f8a250" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz#48620b9e590e25ff95a80f811544218d27f8a250" integrity sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ== "@svgr/babel-preset@^6.5.1": version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz#b90de7979c8843c5c580c7e2ec71f024b49eb828" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-6.5.1.tgz#b90de7979c8843c5c580c7e2ec71f024b49eb828" integrity sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw== dependencies: "@svgr/babel-plugin-add-jsx-attribute" "^6.5.1" @@ -2196,7 +2426,7 @@ "@svgr/core@6.5.1": version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz#d3e8aa9dbe3fbd747f9ee4282c1c77a27410488a" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-6.5.1.tgz#d3e8aa9dbe3fbd747f9ee4282c1c77a27410488a" integrity sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw== dependencies: "@babel/core" "^7.19.6" @@ -2207,7 +2437,7 @@ "@svgr/hast-util-to-babel-ast@^6.5.1": version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz#81800bd09b5bcdb968bf6ee7c863d2288fdb80d2" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz#81800bd09b5bcdb968bf6ee7c863d2288fdb80d2" integrity sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw== dependencies: "@babel/types" "^7.20.0" @@ -2215,7 +2445,7 @@ "@svgr/plugin-jsx@^6.5.1": version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz#0e30d1878e771ca753c94e69581c7971542a7072" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz#0e30d1878e771ca753c94e69581c7971542a7072" integrity sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw== dependencies: "@babel/core" "^7.19.6" @@ -2225,7 +2455,7 @@ "@svgr/plugin-svgo@^6.5.1": version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz#0f91910e988fc0b842f88e0960c2862e022abe84" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz#0f91910e988fc0b842f88e0960c2862e022abe84" integrity sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ== dependencies: cosmiconfig "^7.0.1" @@ -2234,57 +2464,57 @@ "@swc/core-darwin-arm64@1.3.72": version "1.3.72" - resolved "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.72.tgz#73ab213a2a07bfbf6ff71ce5f5bef7fb6857a032" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.72.tgz#73ab213a2a07bfbf6ff71ce5f5bef7fb6857a032" integrity sha512-oNSI5hVfZ+1xpj+dH1g4kQqA0VsGtqd8S9S+cDqkHZiOOVOevw9KN6dzVtmLOcPtlULVypVc0TVvsB55KdVZhQ== "@swc/core-darwin-x64@1.3.72": version "1.3.72" - resolved "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.72.tgz#b9d7d5ba3b68ae507e48e038f91d97aafd6bd907" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.72.tgz#b9d7d5ba3b68ae507e48e038f91d97aafd6bd907" integrity sha512-y5O/WQ1g0/VfTgeNahWIOutbdD5U2Gi703jaefdcoJo3FUx8WU108QQdbVGwGMgaqapo3iQB6Qs9paixYQAYsA== "@swc/core-linux-arm-gnueabihf@1.3.72": version "1.3.72" - resolved "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.72.tgz#af8fd09684d5a1327949cf64cad3a1e45b082c4f" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.72.tgz#af8fd09684d5a1327949cf64cad3a1e45b082c4f" integrity sha512-05JdWcso0OomHF+7bk5MBDgI8MZ9skcQ/4nhSv5gboSgSiuBmKM15Bg3lZ5iAUwGByNj7pGkSmmd3YwTrXEB+g== "@swc/core-linux-arm64-gnu@1.3.72": version "1.3.72" - resolved "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.72.tgz#2c0e365431e25d0fb0d1be3f6cb71ff6b315287e" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.72.tgz#2c0e365431e25d0fb0d1be3f6cb71ff6b315287e" integrity sha512-8qRELJaeYshhJgqvyOeXCKqBOpai+JYdWuouMbvvDUL85j3OcZhzR+bipexEbbJKcOCdRnoYB7Qg6mjqZ0t7VA== "@swc/core-linux-arm64-musl@1.3.72": version "1.3.72" - resolved "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.72.tgz#dbb6579daed116657d7ee6994bea75abb385ba6f" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.72.tgz#dbb6579daed116657d7ee6994bea75abb385ba6f" integrity sha512-tOqAGZw+Pe7YrBHFrwFVyRiKqjgjzwYbJmY+UDxLrzWrZSVtC3eO2TPrp7kWmhirg40Og81BbdfRAl8ds48w0Q== "@swc/core-linux-x64-gnu@1.3.72": version "1.3.72" - resolved "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.72.tgz#80dcbf6d71cb7ef0b92aa868ef605427305e83a8" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.72.tgz#80dcbf6d71cb7ef0b92aa868ef605427305e83a8" integrity sha512-U2W2xWR3s9nplGVWz376GiBlcLTgxyYKlpZPBNZk0w3OvTcjKC62gW1Pe7PUkk4NgJUnaQDBa/mb4V4Zl+GZPA== "@swc/core-linux-x64-musl@1.3.72": version "1.3.72" - resolved "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.72.tgz#0a8ef179f89cc1f62dae8061e759d987c596ccb3" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.72.tgz#0a8ef179f89cc1f62dae8061e759d987c596ccb3" integrity sha512-3+2dUiZBsifKgvnFEHWdysXjInK8K+BfPBw2tTZJmq1+fZLt0rvuErYDVMLfIJnVWLCcJMnDtTXrvkFV1y/6iA== "@swc/core-win32-arm64-msvc@1.3.72": version "1.3.72" - resolved "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.72.tgz#ac1a858b3777ba5dba2d55db7648f5a1ad7b840e" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.72.tgz#ac1a858b3777ba5dba2d55db7648f5a1ad7b840e" integrity sha512-ndI8xZ2AId806D25xgqw2SFJ9gc/jhg21+5hA8XPq9ZL+oDiaYDztaP3ijVmZ1G5xXKD9DpgB7xmylv/f6o6GA== "@swc/core-win32-ia32-msvc@1.3.72": version "1.3.72" - resolved "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.72.tgz#3b7764bee0e276b2545e21a85a54381bdc34c3b8" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.72.tgz#3b7764bee0e276b2545e21a85a54381bdc34c3b8" integrity sha512-F3TK8JHP3SRFjLRlzcRVZPnvvGm2CQ5/cwbIkaEq0Dla3kyctU8SiRqvtYwWCW4JuY10cUygIg93Ec/C9Lkk4g== "@swc/core-win32-x64-msvc@1.3.72": version "1.3.72" - resolved "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.72.tgz#d3fba8398bb7844353eacb859d61cc1e70c39470" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.72.tgz#d3fba8398bb7844353eacb859d61cc1e70c39470" integrity sha512-FXMnIUtLl0yEmGkw+xbUg/uUPExvUxUlLSHbX7CnbSuOIHqMHzvEd9skIueLAst4bvmJ8kT1hDyAIWQcTIAJYQ== "@swc/core@1.3.72": version "1.3.72" - resolved "https://registry.npmjs.org/@swc/core/-/core-1.3.72.tgz#6eb7eb0388f98c5934343b2db1cbc616831afe03" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.72.tgz#6eb7eb0388f98c5934343b2db1cbc616831afe03" integrity sha512-+AKjwLH3/STfPrd7CHzB9+NG1FVT0UKJMUChuWq9sQ8b9xlV8vUeRgZXgh/EHYvNQgl/OUTQKtL6xU2yOLuEuA== optionalDependencies: "@swc/core-darwin-arm64" "1.3.72" @@ -2298,15 +2528,22 @@ "@swc/core-win32-ia32-msvc" "1.3.72" "@swc/core-win32-x64-msvc" "1.3.72" +"@swc/helpers@0.5.1": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.1.tgz#e9031491aa3f26bfcc974a67f48bd456c8a5357a" + integrity sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg== + dependencies: + tslib "^2.4.0" + "@trysound/sax@0.2.0": version "0.2.0" - resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" + resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== "@types/babel__core@^7.1.14": - version "7.20.4" - resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.4.tgz#26a87347e6c6f753b3668398e34496d6d9ac6ac0" - integrity sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== dependencies: "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" @@ -2315,59 +2552,59 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.7" - resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz#a7aebf15c7bc0eb9abd638bdb5c0b8700399c9d0" - integrity sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ== + version "7.27.0" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.27.0.tgz#b5819294c51179957afaec341442f9341e4108a9" + integrity sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": version "7.4.4" - resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.4" - resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz#ec2c06fed6549df8bc0eb4615b683749a4a92e1b" - integrity sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA== + version "7.28.0" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.28.0.tgz#07d713d6cce0d265c9849db0cbe62d3f61f36f74" + integrity sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q== dependencies: - "@babel/types" "^7.20.7" + "@babel/types" "^7.28.2" "@types/d3-array@*": version "3.2.1" - resolved "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz#1f6658e3d2006c4fceac53fde464166859f8b8c5" + resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.2.1.tgz#1f6658e3d2006c4fceac53fde464166859f8b8c5" integrity sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg== "@types/d3-axis@*": version "3.0.6" - resolved "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz#e760e5765b8188b1defa32bc8bb6062f81e4c795" + resolved "https://registry.yarnpkg.com/@types/d3-axis/-/d3-axis-3.0.6.tgz#e760e5765b8188b1defa32bc8bb6062f81e4c795" integrity sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw== dependencies: "@types/d3-selection" "*" "@types/d3-brush@*": version "3.0.6" - resolved "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz#c2f4362b045d472e1b186cdbec329ba52bdaee6c" + resolved "https://registry.yarnpkg.com/@types/d3-brush/-/d3-brush-3.0.6.tgz#c2f4362b045d472e1b186cdbec329ba52bdaee6c" integrity sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A== dependencies: "@types/d3-selection" "*" "@types/d3-chord@*": version "3.0.6" - resolved "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz#1706ca40cf7ea59a0add8f4456efff8f8775793d" + resolved "https://registry.yarnpkg.com/@types/d3-chord/-/d3-chord-3.0.6.tgz#1706ca40cf7ea59a0add8f4456efff8f8775793d" integrity sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg== "@types/d3-color@*": version "3.1.3" - resolved "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz#368c961a18de721da8200e80bf3943fb53136af2" + resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.1.3.tgz#368c961a18de721da8200e80bf3943fb53136af2" integrity sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A== "@types/d3-contour@*": version "3.0.6" - resolved "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz#9ada3fa9c4d00e3a5093fed0356c7ab929604231" + resolved "https://registry.yarnpkg.com/@types/d3-contour/-/d3-contour-3.0.6.tgz#9ada3fa9c4d00e3a5093fed0356c7ab929604231" integrity sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg== dependencies: "@types/d3-array" "*" @@ -2375,141 +2612,141 @@ "@types/d3-delaunay@*": version "6.0.4" - resolved "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz#185c1a80cc807fdda2a3fe960f7c11c4a27952e1" + resolved "https://registry.yarnpkg.com/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz#185c1a80cc807fdda2a3fe960f7c11c4a27952e1" integrity sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw== "@types/d3-dispatch@*": - version "3.0.6" - resolved "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz#096efdf55eb97480e3f5621ff9a8da552f0961e7" - integrity sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ== + version "3.0.7" + resolved "https://registry.yarnpkg.com/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz#ef004d8a128046cfce434d17182f834e44ef95b2" + integrity sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA== "@types/d3-drag@*", "@types/d3-drag@^3.0.1": version "3.0.7" - resolved "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz#b13aba8b2442b4068c9a9e6d1d82f8bcea77fc02" + resolved "https://registry.yarnpkg.com/@types/d3-drag/-/d3-drag-3.0.7.tgz#b13aba8b2442b4068c9a9e6d1d82f8bcea77fc02" integrity sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ== dependencies: "@types/d3-selection" "*" "@types/d3-dsv@*": version "3.0.7" - resolved "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz#0a351f996dc99b37f4fa58b492c2d1c04e3dac17" + resolved "https://registry.yarnpkg.com/@types/d3-dsv/-/d3-dsv-3.0.7.tgz#0a351f996dc99b37f4fa58b492c2d1c04e3dac17" integrity sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g== "@types/d3-ease@*": version "3.0.2" - resolved "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz#e28db1bfbfa617076f7770dd1d9a48eaa3b6c51b" + resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-3.0.2.tgz#e28db1bfbfa617076f7770dd1d9a48eaa3b6c51b" integrity sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA== "@types/d3-fetch@*": version "3.0.7" - resolved "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz#c04a2b4f23181aa376f30af0283dbc7b3b569980" + resolved "https://registry.yarnpkg.com/@types/d3-fetch/-/d3-fetch-3.0.7.tgz#c04a2b4f23181aa376f30af0283dbc7b3b569980" integrity sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA== dependencies: "@types/d3-dsv" "*" "@types/d3-force@*": - version "3.0.9" - resolved "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.9.tgz#dd96ccefba4386fe4ff36b8e4ee4e120c21fcf29" - integrity sha512-IKtvyFdb4Q0LWna6ymywQsEYjK/94SGhPrMfEr1TIc5OBeziTi+1jcCvttts8e0UWZIxpasjnQk9MNk/3iS+kA== + version "3.0.10" + resolved "https://registry.yarnpkg.com/@types/d3-force/-/d3-force-3.0.10.tgz#6dc8fc6e1f35704f3b057090beeeb7ac674bff1a" + integrity sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw== "@types/d3-format@*": version "3.0.4" - resolved "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz#b1e4465644ddb3fdf3a263febb240a6cd616de90" + resolved "https://registry.yarnpkg.com/@types/d3-format/-/d3-format-3.0.4.tgz#b1e4465644ddb3fdf3a263febb240a6cd616de90" integrity sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g== "@types/d3-geo@*": version "3.1.0" - resolved "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz#b9e56a079449174f0a2c8684a9a4df3f60522440" + resolved "https://registry.yarnpkg.com/@types/d3-geo/-/d3-geo-3.1.0.tgz#b9e56a079449174f0a2c8684a9a4df3f60522440" integrity sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ== dependencies: "@types/geojson" "*" "@types/d3-hierarchy@*": - version "3.1.6" - resolved "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.6.tgz#8d3638df273ec90da34b3ac89d8784c59708cb0d" - integrity sha512-qlmD/8aMk5xGorUvTUWHCiumvgaUXYldYjNVOWtYoTYY/L+WwIEAmJxUmTgr9LoGNG0PPAOmqMDJVDPc7DOpPw== + version "3.1.7" + resolved "https://registry.yarnpkg.com/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz#6023fb3b2d463229f2d680f9ac4b47466f71f17b" + integrity sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg== "@types/d3-interpolate@*": version "3.0.4" - resolved "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz#412b90e84870285f2ff8a846c6eb60344f12a41c" + resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz#412b90e84870285f2ff8a846c6eb60344f12a41c" integrity sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA== dependencies: "@types/d3-color" "*" "@types/d3-path@*": - version "3.0.2" - resolved "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.2.tgz#4327f4a05d475cf9be46a93fc2e0f8d23380805a" - integrity sha512-WAIEVlOCdd/NKRYTsqCpOMHQHemKBEINf8YXMYOtXH0GA7SY0dqMB78P3Uhgfy+4X+/Mlw2wDtlETkN6kQUCMA== + version "3.1.1" + resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-3.1.1.tgz#f632b380c3aca1dba8e34aa049bcd6a4af23df8a" + integrity sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg== "@types/d3-polygon@*": version "3.0.2" - resolved "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz#dfae54a6d35d19e76ac9565bcb32a8e54693189c" + resolved "https://registry.yarnpkg.com/@types/d3-polygon/-/d3-polygon-3.0.2.tgz#dfae54a6d35d19e76ac9565bcb32a8e54693189c" integrity sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA== "@types/d3-quadtree@*": - version "3.0.5" - resolved "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.5.tgz#2bc3884742e8b53dbc41175b0720373f3aae04a2" - integrity sha512-Cb1f3jyNBnvMMkf4KBZ7IgAQVWd9yzBwYcrxGqg3aPCUgWELAS+nyeB7r76aqu1e3+CGDjhk4BrWaFBekMwigg== + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz#d4740b0fe35b1c58b66e1488f4e7ed02952f570f" + integrity sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg== "@types/d3-random@*": version "3.0.3" - resolved "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz#ed995c71ecb15e0cd31e22d9d5d23942e3300cfb" + resolved "https://registry.yarnpkg.com/@types/d3-random/-/d3-random-3.0.3.tgz#ed995c71ecb15e0cd31e22d9d5d23942e3300cfb" integrity sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ== "@types/d3-scale-chromatic@*": - version "3.0.2" - resolved "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.2.tgz#e44c0031d0a8fb6efff8b17b0c4a2e680741cdaf" - integrity sha512-kpKNZMDT3OAX6b5ct5nS/mv6LULagnUy4DmS6yyNjclje1qVe7vbjPwY3q1TGz6+Wr2IUkgFatCzqYUl54fHag== + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz#dc6d4f9a98376f18ea50bad6c39537f1b5463c39" + integrity sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ== "@types/d3-scale@*": - version "4.0.8" - resolved "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz#d409b5f9dcf63074464bf8ddfb8ee5a1f95945bb" - integrity sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ== + version "4.0.9" + resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.9.tgz#57a2f707242e6fe1de81ad7bfcccaaf606179afb" + integrity sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw== dependencies: "@types/d3-time" "*" "@types/d3-selection@*", "@types/d3-selection@^3.0.3": - version "3.0.10" - resolved "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.10.tgz#98cdcf986d0986de6912b5892e7c015a95ca27fe" - integrity sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg== + version "3.0.11" + resolved "https://registry.yarnpkg.com/@types/d3-selection/-/d3-selection-3.0.11.tgz#bd7a45fc0a8c3167a631675e61bc2ca2b058d4a3" + integrity sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w== "@types/d3-shape@*": - version "3.1.5" - resolved "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.5.tgz#ab2f9c1485667be729b68bf2d9219858bc6d4009" - integrity sha512-dfEWpZJ1Pdg8meLlICX1M3WBIpxnaH2eQV2eY43Y5ysRJOTAV9f3/R++lgJKFstfrEOE2zdJ0sv5qwr2Bkic6Q== + version "3.1.7" + resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-3.1.7.tgz#2b7b423dc2dfe69c8c93596e673e37443348c555" + integrity sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg== dependencies: "@types/d3-path" "*" "@types/d3-time-format@*": version "4.0.3" - resolved "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz#d6bc1e6b6a7db69cccfbbdd4c34b70632d9e9db2" + resolved "https://registry.yarnpkg.com/@types/d3-time-format/-/d3-time-format-4.0.3.tgz#d6bc1e6b6a7db69cccfbbdd4c34b70632d9e9db2" integrity sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg== "@types/d3-time@*": - version "3.0.3" - resolved "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz#3c186bbd9d12b9d84253b6be6487ca56b54f88be" - integrity sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.4.tgz#8472feecd639691450dd8000eb33edd444e1323f" + integrity sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g== "@types/d3-timer@*": version "3.0.2" - resolved "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz#70bbda77dc23aa727413e22e214afa3f0e852f70" + resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-3.0.2.tgz#70bbda77dc23aa727413e22e214afa3f0e852f70" integrity sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw== "@types/d3-timer@^2.0.0": version "2.0.3" - resolved "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-2.0.3.tgz#d74350a9eb5991f054b2cf8e92efaf22be3e1a25" + resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-2.0.3.tgz#d74350a9eb5991f054b2cf8e92efaf22be3e1a25" integrity sha512-jhAJzaanK5LqyLQ50jJNIrB8fjL9gwWZTgYjevPvkDLMU+kTAZkYsobI59nYoeSrH1PucuyJEi247Pb90t6XUg== "@types/d3-transition@*": - version "3.0.8" - resolved "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.8.tgz#677707f5eed5b24c66a1918cde05963021351a8f" - integrity sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ== + version "3.0.9" + resolved "https://registry.yarnpkg.com/@types/d3-transition/-/d3-transition-3.0.9.tgz#1136bc57e9ddb3c390dccc9b5ff3b7d2b8d94706" + integrity sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg== dependencies: "@types/d3-selection" "*" "@types/d3-zoom@*", "@types/d3-zoom@^3.0.1": version "3.0.8" - resolved "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz#dccb32d1c56b1e1c6e0f1180d994896f038bc40b" + resolved "https://registry.yarnpkg.com/@types/d3-zoom/-/d3-zoom-3.0.8.tgz#dccb32d1c56b1e1c6e0f1180d994896f038bc40b" integrity sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw== dependencies: "@types/d3-interpolate" "*" @@ -2517,7 +2754,7 @@ "@types/d3@^7.4.0": version "7.4.3" - resolved "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz#d4550a85d08f4978faf0a4c36b848c61eaac07e2" + resolved "https://registry.yarnpkg.com/@types/d3/-/d3-7.4.3.tgz#d4550a85d08f4978faf0a4c36b848c61eaac07e2" integrity sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww== dependencies: "@types/d3-array" "*" @@ -2553,242 +2790,250 @@ "@types/debug@^4.0.0": version "4.1.12" - resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== dependencies: "@types/ms" "*" "@types/estree-jsx@^1.0.0": - version "1.0.3" - resolved "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.3.tgz#f8aa833ec986d82b8271a294a92ed1565bf2c66a" - integrity sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w== + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree-jsx/-/estree-jsx-1.0.5.tgz#858a88ea20f34fe65111f005a689fa1ebf70dc18" + integrity sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg== dependencies: "@types/estree" "*" "@types/estree@*", "@types/estree@^1.0.0": - version "1.0.5" - resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" - integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" + integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== "@types/fs-extra@11.0.1": version "11.0.1" - resolved "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.1.tgz#f542ec47810532a8a252127e6e105f487e0a6ea5" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-11.0.1.tgz#f542ec47810532a8a252127e6e105f487e0a6ea5" integrity sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA== dependencies: "@types/jsonfile" "*" "@types/node" "*" "@types/geojson@*": - version "7946.0.13" - resolved "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.13.tgz#e6e77ea9ecf36564980a861e24e62a095988775e" - integrity sha512-bmrNrgKMOhM3WsafmbGmC+6dsF2Z308vLFsQ3a/bT8X8Sv5clVYpPars/UPq+sAaJP+5OoLAYgwbkS5QEJdLUQ== + version "7946.0.16" + resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.16.tgz#8ebe53d69efada7044454e3305c19017d97ced2a" + integrity sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg== "@types/graceful-fs@^4.1.3": version "4.1.9" - resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== dependencies: "@types/node" "*" "@types/hapi__joi@17.1.9": version "17.1.9" - resolved "https://registry.npmjs.org/@types/hapi__joi/-/hapi__joi-17.1.9.tgz#fb4001df38aba1cd2406ce4b17d4e6fc3b0bd036" + resolved "https://registry.yarnpkg.com/@types/hapi__joi/-/hapi__joi-17.1.9.tgz#fb4001df38aba1cd2406ce4b17d4e6fc3b0bd036" integrity sha512-oOMFT8vmCTFncsF1engrs04jatz8/Anwx3De9uxnOK4chgSEgWBvFtpSoJo8u3784JNO+ql5tzRR6phHoRnscQ== "@types/hast@^2.0.0", "@types/hast@^2.3.5": - version "2.3.8" - resolved "https://registry.npmjs.org/@types/hast/-/hast-2.3.8.tgz#4ac5caf38b262b7bd5ca3202dda71f0271635660" - integrity sha512-aMIqAlFd2wTIDZuvLbhUT+TGvMxrNC8ECUIVtH6xxy0sQLs3iu6NO8Kp/VT5je7i5ufnebXzdV1dNDMnvaH6IQ== + version "2.3.10" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.10.tgz#5c9d9e0b304bbb8879b857225c5ebab2d81d7643" + integrity sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw== dependencies: "@types/unist" "^2" -"@types/hoist-non-react-statics@^3.3.0", "@types/hoist-non-react-statics@^3.3.1": - version "3.3.5" - resolved "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz#dab7867ef789d87e2b4b0003c9d65c49cc44a494" - integrity sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg== +"@types/hoist-non-react-statics@3", "@types/hoist-non-react-statics@^3.3.0": + version "3.3.7" + resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.7.tgz#306e3a3a73828522efa1341159da4846e7573a6c" + integrity sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g== dependencies: - "@types/react" "*" hoist-non-react-statics "^3.3.0" "@types/html-minifier-terser@^6.0.0": version "6.1.0" - resolved "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": version "2.0.6" - resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== "@types/istanbul-lib-report@*": version "3.0.3" - resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== dependencies: "@types/istanbul-lib-coverage" "*" +"@types/istanbul-reports@^1.1.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" + integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== + dependencies: + "@types/istanbul-lib-coverage" "*" + "@types/istanbul-lib-report" "*" + "@types/istanbul-reports@^3.0.0": version "3.0.4" - resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== dependencies: "@types/istanbul-lib-report" "*" -"@types/js-cookie@^2.x.x": - version "2.2.7" - resolved "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.7.tgz#226a9e31680835a6188e887f3988e60c04d3f6a3" - integrity sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA== - "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.15" - resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/jsonfile@*": version "6.1.4" - resolved "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz#614afec1a1164e7d670b4a7ad64df3e7beb7b702" + resolved "https://registry.yarnpkg.com/@types/jsonfile/-/jsonfile-6.1.4.tgz#614afec1a1164e7d670b4a7ad64df3e7beb7b702" integrity sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ== dependencies: "@types/node" "*" "@types/mdast@^3.0.0", "@types/mdast@^3.0.12": version "3.0.15" - resolved "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz#49c524a263f30ffa28b71ae282f813ed000ab9f5" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.15.tgz#49c524a263f30ffa28b71ae282f813ed000ab9f5" integrity sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ== dependencies: "@types/unist" "^2" "@types/minimist@^1.2.0": version "1.2.5" - resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== "@types/ms@*": - version "0.7.34" - resolved "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" - integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-2.1.0.tgz#052aa67a48eccc4309d7f0191b7e41434b90bb78" + integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== "@types/node@*": - version "20.9.1" - resolved "https://registry.npmjs.org/@types/node/-/node-20.9.1.tgz#9d578c610ce1e984adda087f685ace940954fe19" - integrity sha512-HhmzZh5LSJNS5O8jQKpJ/3ZcrrlG6L70hpGqMIAoM9YVD0YBRNWYsfwcXq8VnSjlNpCpgLzMXdiPo+dxcvSmiA== + version "24.1.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-24.1.0.tgz#0993f7dc31ab5cc402d112315b463e383d68a49c" + integrity sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w== dependencies: - undici-types "~5.26.4" + undici-types "~7.8.0" "@types/node@^17.0.5": version "17.0.45" - resolved "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== -"@types/node@^18.11.9": - version "18.18.9" - resolved "https://registry.npmjs.org/@types/node/-/node-18.18.9.tgz#5527ea1832db3bba8eb8023ce8497b7d3f299592" - integrity sha512-0f5klcuImLnG4Qreu9hPj/rEfFq6YRc5n2mAjSsH+ec/mJL+3voBH0+8T7o8RpFjH7ovc+TRsL/c7OYIQsPTfQ== - dependencies: - undici-types "~5.26.4" - "@types/normalize-package-data@^2.4.0": version "2.4.4" - resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== "@types/parse-json@^4.0.0": version "4.0.2" - resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== "@types/parse5@^6.0.0": version "6.0.3" - resolved "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb" + resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb" integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g== "@types/prop-types@*": - version "15.7.10" - resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.10.tgz#892afc9332c4d62a5ea7e897fe48ed2085bbb08a" - integrity sha512-mxSnDQxPqsZxmeShFH+uwQ4kO4gcJcGahjjMFeLbKE95IAZiiZyiEepGZjtXJ7hN/yfu0bu9xN2ajcU0JcxX6A== + version "15.7.15" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.15.tgz#e6e5a86d602beaca71ce5163fadf5f95d70931c7" + integrity sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw== "@types/q@^1.5.1": version "1.5.8" - resolved "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz#95f6c6a08f2ad868ba230ead1d2d7f7be3db3837" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.8.tgz#95f6c6a08f2ad868ba230ead1d2d7f7be3db3837" integrity sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw== "@types/quill@^1.3.10": version "1.3.10" - resolved "https://registry.npmjs.org/@types/quill/-/quill-1.3.10.tgz#dc1f7b6587f7ee94bdf5291bc92289f6f0497613" + resolved "https://registry.yarnpkg.com/@types/quill/-/quill-1.3.10.tgz#dc1f7b6587f7ee94bdf5291bc92289f6f0497613" integrity sha512-IhW3fPW+bkt9MLNlycw8u8fWb7oO7W5URC9MfZYHBlA24rex9rs23D5DETChu1zvgVdc5ka64ICjJOgQMr6Shw== dependencies: parchment "^1.1.2" "@types/ramda@0.29.3": version "0.29.3" - resolved "https://registry.npmjs.org/@types/ramda/-/ramda-0.29.3.tgz#6e4d4066df900a3456cf402bcef9b78b6990a754" + resolved "https://registry.yarnpkg.com/@types/ramda/-/ramda-0.29.3.tgz#6e4d4066df900a3456cf402bcef9b78b6990a754" integrity sha512-Yh/RHkjN0ru6LVhSQtTkCRo6HXkfL9trot/2elzM/yXLJmbLm2v6kJc8yftTnwv1zvUob6TEtqI2cYjdqG3U0Q== dependencies: types-ramda "^0.29.4" "@types/react-redux@^7.1.20": - version "7.1.30" - resolved "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.30.tgz#4f9731cc987eb6285fe2b472231fb42120efc22c" - integrity sha512-i2kqM6YaUwFKduamV6QM/uHbb0eCP8f8ZQ/0yWf+BsAVVsZPRYJ9eeGWZ3uxLfWwwA0SrPRMTPTqsPFkY3HZdA== + version "7.1.34" + resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.34.tgz#83613e1957c481521e6776beeac4fd506d11bd0e" + integrity sha512-GdFaVjEbYv4Fthm2ZLvj1VSCedV7TqE5y1kNwnjSdBOTXuRSgowux6J8TAct15T3CKBr63UMk+2CO7ilRhyrAQ== dependencies: "@types/hoist-non-react-statics" "^3.3.0" "@types/react" "*" hoist-non-react-statics "^3.3.0" redux "^4.0.0" -"@types/react@*", "@types/react@16 || 17 || 18": - version "18.2.37" - resolved "https://registry.npmjs.org/@types/react/-/react-18.2.37.tgz#0f03af69e463c0f19a356c2660dbca5d19c44cae" - integrity sha512-RGAYMi2bhRgEXT3f4B92WTohopH6bIXw05FuGlmJEnv/omEn190+QYEIYxIAuIBdKgboYYdVved2p1AxZVQnaw== +"@types/react@*": + version "19.1.9" + resolved "https://registry.yarnpkg.com/@types/react/-/react-19.1.9.tgz#f42b24f35474566a39b5c3a98e4d0c425b79a849" + integrity sha512-WmdoynAX8Stew/36uTSVMcLJJ1KRh6L3IZRx1PZ7qJtBqT3dYTgyDTx8H1qoRghErydW7xw9mSJ3wS//tCRpFA== + dependencies: + csstype "^3.0.2" + +"@types/react@16 || 17 || 18": + version "18.3.23" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.23.tgz#86ae6f6b95a48c418fecdaccc8069e0fbb63696a" + integrity sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w== dependencies: "@types/prop-types" "*" - "@types/scheduler" "*" csstype "^3.0.2" +"@types/resolve@^1.20.6": + version "1.20.6" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.6.tgz#e6e60dad29c2c8c206c026e6dd8d6d1bdda850b8" + integrity sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ== + "@types/sax@^1.2.1": version "1.2.7" - resolved "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz#ba5fe7df9aa9c89b6dff7688a19023dd2963091d" + resolved "https://registry.yarnpkg.com/@types/sax/-/sax-1.2.7.tgz#ba5fe7df9aa9c89b6dff7688a19023dd2963091d" integrity sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A== dependencies: "@types/node" "*" -"@types/scheduler@*": - version "0.16.6" - resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.6.tgz#eb26db6780c513de59bee0b869ef289ad3068711" - integrity sha512-Vlktnchmkylvc9SnwwwozTv04L/e1NykF5vgoQ0XTmI8DD+wxfjQuHuvHS3p0r2jz2x2ghPs2h1FVeDirIteWA== - "@types/semver@^7.3.12": - version "7.5.5" - resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz#deed5ab7019756c9c90ea86139106b0346223f35" - integrity sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg== + version "7.7.0" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.7.0.tgz#64c441bdae033b378b6eef7d0c3d77c329b9378e" + integrity sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA== "@types/unist@^2", "@types/unist@^2.0.0": - version "2.0.10" - resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz#04ffa7f406ab628f7f7e97ca23e290cd8ab15efc" - integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== + version "2.0.11" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.11.tgz#11af57b127e32487774841f7a4e54eab166d03c4" + integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== "@types/yargs-parser@*": version "21.0.3" - resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== +"@types/yargs@^13.0.0": + version "13.0.12" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.12.tgz#d895a88c703b78af0465a9de88aa92c61430b092" + integrity sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ== + dependencies: + "@types/yargs-parser" "*" + "@types/yargs@^16.0.0": - version "16.0.8" - resolved "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.8.tgz#0d57a5a491d85ae75d372a32e657b1779b86c65d" - integrity sha512-1GwLEkmFafeb/HbE6pC7tFlgYSQ4Iqh2qlWCq8xN+Qfaiaxr2PcLfuhfRFRYqI6XJyeFoLYyKnhFbNsst9FMtQ== + version "16.0.9" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.9.tgz#ba506215e45f7707e6cbcaf386981155b7ab956e" + integrity sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA== dependencies: "@types/yargs-parser" "*" "@types/yargs@^17.0.8": - version "17.0.31" - resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz#8fd0089803fd55d8a285895a18b88cb71a99683c" - integrity sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg== + version "17.0.33" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" + integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== dependencies: "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^5.62.0": version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== dependencies: "@eslint-community/regexpp" "^4.4.0" @@ -2804,7 +3049,7 @@ "@typescript-eslint/parser@^5.62.0": version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== dependencies: "@typescript-eslint/scope-manager" "5.62.0" @@ -2814,7 +3059,7 @@ "@typescript-eslint/scope-manager@5.62.0": version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== dependencies: "@typescript-eslint/types" "5.62.0" @@ -2822,7 +3067,7 @@ "@typescript-eslint/type-utils@5.62.0": version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== dependencies: "@typescript-eslint/typescript-estree" "5.62.0" @@ -2832,12 +3077,12 @@ "@typescript-eslint/types@5.62.0": version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== "@typescript-eslint/typescript-estree@5.62.0": version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== dependencies: "@typescript-eslint/types" "5.62.0" @@ -2850,7 +3095,7 @@ "@typescript-eslint/utils@5.62.0", "@typescript-eslint/utils@^5.10.0": version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" @@ -2864,90 +3109,108 @@ "@typescript-eslint/visitor-keys@5.62.0": version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== dependencies: "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" -"@umijs/ast@4.0.88": - version "4.0.88" - resolved "https://registry.npmjs.org/@umijs/ast/-/ast-4.0.88.tgz#ec517183c2c7c0db6883ce4e7a75adb77d2d03d5" - integrity sha512-4V1fXo8U3pRbM9EsxGBW+1h2t1tobEdZCIDvTQUp90WS3CdVFvWWIEzQuP0Dlxs9A7iT/XVbxtjL9gOHX44eng== +"@umijs/ast@4.4.12": + version "4.4.12" + resolved "https://registry.yarnpkg.com/@umijs/ast/-/ast-4.4.12.tgz#596a0a6441488a01f83c8e90174adb4b4e7212e5" + integrity sha512-+u7W9uO9NKwm9SsI2f8l8JTYqrD+Ff/GaxyHeK+YzieSnS0kr9kMs6PoDxxGMmYWbKszPBGckXJHvAXtC1GVoA== dependencies: - "@umijs/bundler-utils" "4.0.88" + "@umijs/bundler-utils" "4.4.12" -"@umijs/babel-preset-umi@4.0.88": - version "4.0.88" - resolved "https://registry.npmjs.org/@umijs/babel-preset-umi/-/babel-preset-umi-4.0.88.tgz#1077594b3b82f6b6852c1b16219ccb91f21e819e" - integrity sha512-HZXPA7gvYkaW3Ts67jUtduik8iWlFRyIom7Z/vbfq5YCwWvSVRXUAPBAirKkUfOHsizgGt0iKsL88pu921WWqw== +"@umijs/babel-preset-umi@4.4.12": + version "4.4.12" + resolved "https://registry.yarnpkg.com/@umijs/babel-preset-umi/-/babel-preset-umi-4.4.12.tgz#131dcf3deefdd7b53409f832fe620bde2723573b" + integrity sha512-c63MHYgEWid8jZbA7Wst9PZIhRk5HTKvvCsJ0WJH7cROjC0+DjXlm9yl11omAY5Jj43iLv00w6vZOkNQc4WWYw== dependencies: - "@babel/runtime" "7.23.2" + "@babel/runtime" "7.23.6" "@bloomberg/record-tuple-polyfill" "0.0.4" - "@umijs/bundler-utils" "4.0.88" - "@umijs/utils" "4.0.88" - core-js "3.28.0" + "@umijs/bundler-utils" "4.4.12" + "@umijs/utils" "4.4.12" + core-js "3.34.0" -"@umijs/bundler-esbuild@4.0.88": - version "4.0.88" - resolved "https://registry.npmjs.org/@umijs/bundler-esbuild/-/bundler-esbuild-4.0.88.tgz#2f9bc52aacffd46f396ec80604190205c56cdea2" - integrity sha512-gbUnsQ4JCx0zVjq7olCVM8mg4yX4IwzNQwic/iJM5s5KS/Cv+u5JHIfGyevYZT3FUjxVl79IsmxYOwKXoDaTpA== +"@umijs/bundler-esbuild@4.4.12": + version "4.4.12" + resolved "https://registry.yarnpkg.com/@umijs/bundler-esbuild/-/bundler-esbuild-4.4.12.tgz#f3875450f63408c05e28f043be6a39b65e302a30" + integrity sha512-MZGITWDR9LyO4DW/gLLWScz1523ZfhMKNsnWxOdqQWRG2Y0ft2SxU+domO/JOcOB4fiTD0rauG2x5V2sV7ULDw== dependencies: - "@umijs/bundler-utils" "4.0.88" - "@umijs/utils" "4.0.88" + "@umijs/bundler-utils" "4.4.12" + "@umijs/utils" "4.4.12" enhanced-resolve "5.9.3" postcss "^8.4.21" postcss-flexbugs-fixes "5.0.2" postcss-preset-env "7.5.0" -"@umijs/bundler-utils@4.0.88", "@umijs/bundler-utils@^4.0.84": - version "4.0.88" - resolved "https://registry.npmjs.org/@umijs/bundler-utils/-/bundler-utils-4.0.88.tgz#675cd0b26ac9739ffd4ac761c2a219075306b378" - integrity sha512-jJmen5OLJhO8Hd3GWolC1VvxD5RZLHQl9Jx2Lz2soA1463gAqdAAh0Wa6m69YdVBzh0WzHZ9049RmP23K1ow8A== +"@umijs/bundler-mako@0.11.10": + version "0.11.10" + resolved "https://registry.yarnpkg.com/@umijs/bundler-mako/-/bundler-mako-0.11.10.tgz#b58d0d1333e979cf4c511d6d22aa8e6d7d9fa527" + integrity sha512-RNop0kmMXJUOLQYp61ZW3NVdD8ikOPW0zoCmgkN+nIUVw+QKcA+9tSPEcT6Rr8id9+Ed3lMjLqktev20guRp1g== + dependencies: + "@umijs/bundler-utils" "^4.0.81" + "@umijs/mako" "0.11.10" + chalk "^4.1.2" + compression "^1.7.4" + connect-history-api-fallback "^2.0.0" + cors "^2.8.5" + express "^4.18.2" + express-http-proxy "^2.1.1" + get-tsconfig "4.7.5" + lodash "^4.17.21" + rimraf "5.0.1" + webpack-5-chain "8.0.1" + +"@umijs/bundler-utils@4.4.12", "@umijs/bundler-utils@^4.0.81", "@umijs/bundler-utils@^4.0.84": + version "4.4.12" + resolved "https://registry.yarnpkg.com/@umijs/bundler-utils/-/bundler-utils-4.4.12.tgz#028c9722decbc7e425f6c6f7b9ff46bafa01c203" + integrity sha512-V78hkr3o6XnYqMEdpKlDmKzDaDGI4c7SBphIzt1eNUKaha/WcuVuXyQ0mnX6SzbFmNIF/PwHjZ2SOGxlJFyiHQ== dependencies: - "@umijs/utils" "4.0.88" - esbuild "0.17.19" + "@umijs/utils" "4.4.12" + esbuild "0.21.4" regenerate "^1.4.2" regenerate-unicode-properties "10.1.1" spdy "^4.0.2" -"@umijs/bundler-vite@4.0.88": - version "4.0.88" - resolved "https://registry.npmjs.org/@umijs/bundler-vite/-/bundler-vite-4.0.88.tgz#c562f0fcee88ae1aa4aac16dad9fb586318c982e" - integrity sha512-qiToAgLwmPWz1t8l82qEPyFXlZvnRKWJW0WG6vuxQNikDMKCWhk18gZaWwMNhqQvAx/oZ37vFCmR8CDoNOMI/A== +"@umijs/bundler-vite@4.4.12": + version "4.4.12" + resolved "https://registry.yarnpkg.com/@umijs/bundler-vite/-/bundler-vite-4.4.12.tgz#dffcc3c68d6a1ae97c1e48bdf454aca1ce7c69e5" + integrity sha512-C/qE6zQ0ZrtM2Vsyw8NRtYOyGOZ7ptbldmhQS33dwLSBx4fncEUvkxNi6HYhgMPLDkjVO/WACfvJ3FOUnAqFHw== dependencies: "@svgr/core" "6.5.1" - "@umijs/bundler-utils" "4.0.88" - "@umijs/utils" "4.0.88" + "@umijs/bundler-utils" "4.4.12" + "@umijs/utils" "4.4.12" "@vitejs/plugin-react" "4.0.0" - core-js "3.28.0" + core-js "3.34.0" less "4.1.3" postcss-preset-env "7.5.0" rollup-plugin-visualizer "5.9.0" systemjs "^6.14.1" - vite "4.3.1" + vite "4.5.2" -"@umijs/bundler-webpack@4.0.88": - version "4.0.88" - resolved "https://registry.npmjs.org/@umijs/bundler-webpack/-/bundler-webpack-4.0.88.tgz#280e057ea3d6367720cdf465f100addb1e15cd9f" - integrity sha512-9ivKa6pREdgLhni9Zl+HhdqehizLOw+U8Md31l8pcQFq8KHrmlYj0X4iGNMaT7OVWJtZznY0wH4lfLNKSd+RXA== +"@umijs/bundler-webpack@4.4.12": + version "4.4.12" + resolved "https://registry.yarnpkg.com/@umijs/bundler-webpack/-/bundler-webpack-4.4.12.tgz#ede905fc532e848c84604e34669378cddf183c25" + integrity sha512-ih4SxtyJLJw1sg+r9+KWNr+57n4Lg+dmI+z4wSjwSoWuVdGyd346iindqcqBJwttRmxS+OIh4IVn30/Y2l15Ww== dependencies: "@svgr/core" "6.5.1" "@svgr/plugin-jsx" "^6.5.1" "@svgr/plugin-svgo" "^6.5.1" "@types/hapi__joi" "17.1.9" - "@umijs/babel-preset-umi" "4.0.88" - "@umijs/bundler-utils" "4.0.88" + "@umijs/babel-preset-umi" "4.4.12" + "@umijs/bundler-utils" "4.4.12" "@umijs/case-sensitive-paths-webpack-plugin" "^1.0.1" - "@umijs/mfsu" "4.0.88" + "@umijs/mfsu" "4.4.12" "@umijs/react-refresh-webpack-plugin" "0.5.11" - "@umijs/utils" "4.0.88" + "@umijs/utils" "4.4.12" cors "^2.8.5" css-loader "6.7.1" es5-imcompatible-versions "^0.1.78" fork-ts-checker-webpack-plugin "8.0.0" jest-worker "29.4.3" - lightningcss "1.19.0" + lightningcss "1.22.1" node-libs-browser "2.2.1" postcss "^8.4.21" postcss-preset-env "7.5.0" @@ -2956,70 +3219,70 @@ "@umijs/case-sensitive-paths-webpack-plugin@^1.0.1": version "1.0.1" - resolved "https://registry.npmjs.org/@umijs/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-1.0.1.tgz#02655299f52912289f2df28fbeaea636e748c1df" + resolved "https://registry.yarnpkg.com/@umijs/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-1.0.1.tgz#02655299f52912289f2df28fbeaea636e748c1df" integrity sha512-kDKJ8yTarxwxGJDInG33hOpaQRZ//XpNuuznQ/1Mscypw6kappzFmrBr2dOYave++K7JHouoANF354UpbEQw0Q== -"@umijs/core@4.0.88", "@umijs/core@^4.0.84": - version "4.0.88" - resolved "https://registry.npmjs.org/@umijs/core/-/core-4.0.88.tgz#bdb82ed1191fc3de6e856ca4dd588407bcc5f76c" - integrity sha512-fwOCDOEW0evLmOWc/uGdlJ8VOS2KhfOd446B2TBUTdyBE8etUBMtZo9NgN2z8VOC+Xu0jLlBIjEMbJ73eWV/qQ== +"@umijs/core@4.4.12", "@umijs/core@^4.0.84": + version "4.4.12" + resolved "https://registry.yarnpkg.com/@umijs/core/-/core-4.4.12.tgz#3c444feeaf527861340a5be83e7dc3ae145c0184" + integrity sha512-Pz5fWUsH3OzDqIZvLp03GQwwe+YtvEn/VZ8177COkRXqLXZkIVMfE8+t7gNvC6thVPcZwnur1c1Fg2tdKMExdQ== dependencies: - "@umijs/bundler-utils" "4.0.88" - "@umijs/utils" "4.0.88" + "@umijs/bundler-utils" "4.4.12" + "@umijs/utils" "4.4.12" -"@umijs/did-you-know@1.0.3": - version "1.0.3" - resolved "https://registry.npmjs.org/@umijs/did-you-know/-/did-you-know-1.0.3.tgz#c7cc40f404dec6fe5500d16c9f87d8c1ddfbc781" - integrity sha512-9EZ+rgY9+2HEaE+Z9dGkal2ccw8L4uuz77tCB5WpskW7NBZX5nOj82sqF/shEtA5tU3SWO/Mi4n35K3iONvDtw== +"@umijs/did-you-know@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@umijs/did-you-know/-/did-you-know-1.0.4.tgz#2a0826f277ca6aeb07e3f019a78fe40d54074afb" + integrity sha512-eAHGNRZe9b7nOXINBIWNga/Nh0LWyTILXtFVcEDiJBXhehUi5OtpPHnA18KCgfmsOFxYPt5fzdumHTYQKm92Vw== "@umijs/es-module-parser-darwin-arm64@0.0.7": version "0.0.7" - resolved "https://registry.npmjs.org/@umijs/es-module-parser-darwin-arm64/-/es-module-parser-darwin-arm64-0.0.7.tgz#7278f3487c586a3ee63bbf45f8504490bef2ebe0" + resolved "https://registry.yarnpkg.com/@umijs/es-module-parser-darwin-arm64/-/es-module-parser-darwin-arm64-0.0.7.tgz#7278f3487c586a3ee63bbf45f8504490bef2ebe0" integrity sha512-1QeNupekuVYVvL4UHyCRq4ISP2PNk4rDd9UOPONW+KpqTyP9p7RfgGpwB0VLPaFSu2ADtm0XZyIaYEGPY6zuDw== "@umijs/es-module-parser-darwin-x64@0.0.7": version "0.0.7" - resolved "https://registry.npmjs.org/@umijs/es-module-parser-darwin-x64/-/es-module-parser-darwin-x64-0.0.7.tgz#e6e154ad19909d817ce36a65b3bcb1a4d99168f3" + resolved "https://registry.yarnpkg.com/@umijs/es-module-parser-darwin-x64/-/es-module-parser-darwin-x64-0.0.7.tgz#e6e154ad19909d817ce36a65b3bcb1a4d99168f3" integrity sha512-FBFmfigmToPc9qBCW7wHiTYpqnLdPbAvoMGOydzAu2NspdPEF7TfILcr8vCPNbNe3vCobS+T/YM1dP+SagERlA== "@umijs/es-module-parser-linux-arm-gnueabihf@0.0.7": version "0.0.7" - resolved "https://registry.npmjs.org/@umijs/es-module-parser-linux-arm-gnueabihf/-/es-module-parser-linux-arm-gnueabihf-0.0.7.tgz#6ab6b28f5abbb97b84cb4c9665279cd0dc67f7fe" + resolved "https://registry.yarnpkg.com/@umijs/es-module-parser-linux-arm-gnueabihf/-/es-module-parser-linux-arm-gnueabihf-0.0.7.tgz#6ab6b28f5abbb97b84cb4c9665279cd0dc67f7fe" integrity sha512-AXfmg3htkadLGsXUyiyrTig4omGCWIN4l+HS7Qapqv0wlfFYSpC0KPemjyBQgzXO70tDcT+1FNhGjIy+yr2pIQ== "@umijs/es-module-parser-linux-arm64-gnu@0.0.7": version "0.0.7" - resolved "https://registry.npmjs.org/@umijs/es-module-parser-linux-arm64-gnu/-/es-module-parser-linux-arm64-gnu-0.0.7.tgz#a3c3bac9d6718a362f4612b16826c4daaff24a6a" + resolved "https://registry.yarnpkg.com/@umijs/es-module-parser-linux-arm64-gnu/-/es-module-parser-linux-arm64-gnu-0.0.7.tgz#a3c3bac9d6718a362f4612b16826c4daaff24a6a" integrity sha512-2wSdChFc39fPJwvS8tRq+jx8qNlIwrjRk1hb3N5o0rJR+rqt+ceAyNPbYwpNBmUHW7xtmDQvJUeinvr7hIBP+w== "@umijs/es-module-parser-linux-arm64-musl@0.0.7": version "0.0.7" - resolved "https://registry.npmjs.org/@umijs/es-module-parser-linux-arm64-musl/-/es-module-parser-linux-arm64-musl-0.0.7.tgz#0c9ea0d46e7e14eafb6e93b940c9f3887025ee5a" + resolved "https://registry.yarnpkg.com/@umijs/es-module-parser-linux-arm64-musl/-/es-module-parser-linux-arm64-musl-0.0.7.tgz#0c9ea0d46e7e14eafb6e93b940c9f3887025ee5a" integrity sha512-cqQffARWkmQ3n1RYNKZR3aD6X8YaP6u1maASjDgPQOpZMAlv/OSDrM/7iGujWTs0PD0haockNG9/DcP6lgPHMw== "@umijs/es-module-parser-linux-x64-gnu@0.0.7": version "0.0.7" - resolved "https://registry.npmjs.org/@umijs/es-module-parser-linux-x64-gnu/-/es-module-parser-linux-x64-gnu-0.0.7.tgz#07c35db7eba4ff7b6f34ce7539fe38875ae27129" + resolved "https://registry.yarnpkg.com/@umijs/es-module-parser-linux-x64-gnu/-/es-module-parser-linux-x64-gnu-0.0.7.tgz#07c35db7eba4ff7b6f34ce7539fe38875ae27129" integrity sha512-PHrKHtT665Za0Ydjch4ACrNpRU+WIIden12YyF1CtMdhuLDSoU6UfdhF3NoDbgEUcXVDX/ftOqmj0SbH3R1uew== "@umijs/es-module-parser-linux-x64-musl@0.0.7": version "0.0.7" - resolved "https://registry.npmjs.org/@umijs/es-module-parser-linux-x64-musl/-/es-module-parser-linux-x64-musl-0.0.7.tgz#0954cdde0d3a0c15f22d8712f52f31142b1b577e" + resolved "https://registry.yarnpkg.com/@umijs/es-module-parser-linux-x64-musl/-/es-module-parser-linux-x64-musl-0.0.7.tgz#0954cdde0d3a0c15f22d8712f52f31142b1b577e" integrity sha512-cyZvUK5lcECLWzLp/eU1lFlCETcz+LEb+wrdARQSST1dgoIGZsT4cqM1WzYmdZNk3o883tiZizLt58SieEiHBQ== "@umijs/es-module-parser-win32-arm64-msvc@0.0.7": version "0.0.7" - resolved "https://registry.npmjs.org/@umijs/es-module-parser-win32-arm64-msvc/-/es-module-parser-win32-arm64-msvc-0.0.7.tgz#a3d07a733843e2b287a8135714fbd51950ae0de5" + resolved "https://registry.yarnpkg.com/@umijs/es-module-parser-win32-arm64-msvc/-/es-module-parser-win32-arm64-msvc-0.0.7.tgz#a3d07a733843e2b287a8135714fbd51950ae0de5" integrity sha512-V7WxnUI88RboSl0RWLNQeKBT7EDW35fW6Tn92zqtoHHxrhAIL9DtDyvC8REP4qTxeZ6Oej/Ax5I6IjsLx3yTOg== "@umijs/es-module-parser-win32-x64-msvc@0.0.7": version "0.0.7" - resolved "https://registry.npmjs.org/@umijs/es-module-parser-win32-x64-msvc/-/es-module-parser-win32-x64-msvc-0.0.7.tgz#0b7dbfd611c1f6e2a067d56a0da69f129d42e408" + resolved "https://registry.yarnpkg.com/@umijs/es-module-parser-win32-x64-msvc/-/es-module-parser-win32-x64-msvc-0.0.7.tgz#0b7dbfd611c1f6e2a067d56a0da69f129d42e408" integrity sha512-X3Pqy0l38hg6wMPquPeMHuoHU+Cx+wzyz32SVYCta+RPJQ7n9PjrEBiIuVAw5+GJZjSABN7LVr8u/n0RZT9EQA== "@umijs/es-module-parser@0.0.7": version "0.0.7" - resolved "https://registry.npmjs.org/@umijs/es-module-parser/-/es-module-parser-0.0.7.tgz#7f6d7573a1725204dd6f2a67bb883cf20deed8e4" + resolved "https://registry.yarnpkg.com/@umijs/es-module-parser/-/es-module-parser-0.0.7.tgz#7f6d7573a1725204dd6f2a67bb883cf20deed8e4" integrity sha512-x47CMi/Hw7Nkz3RXTUqlldH/UM+Tcmw2PziV3k+itJqTFJc8oVx3lzdUgCnG+eL3ZtmLPbOEBhPb30V0NytNDQ== optionalDependencies: "@umijs/es-module-parser-darwin-arm64" "0.0.7" @@ -3034,23 +3297,23 @@ "@umijs/history@5.3.1": version "5.3.1" - resolved "https://registry.npmjs.org/@umijs/history/-/history-5.3.1.tgz#947217594203bf9fd332f95e6113f50855d655b7" + resolved "https://registry.yarnpkg.com/@umijs/history/-/history-5.3.1.tgz#947217594203bf9fd332f95e6113f50855d655b7" integrity sha512-/e0cEGrR2bIWQD7pRl3dl9dcyRGeC9hoW0OCvUTT/hjY0EfUrkd6G8ZanVghPMpDuY5usxq9GVcvrT8KNXLWvA== dependencies: "@babel/runtime" "^7.7.6" query-string "^6.13.6" -"@umijs/lint@4.0.88": - version "4.0.88" - resolved "https://registry.npmjs.org/@umijs/lint/-/lint-4.0.88.tgz#2b544ff38d5cc6e9c8afb69bb9e55597ec86f3bf" - integrity sha512-vDLhfsA0zrAR2NFr/hna75kr1uTYSG032eCg89yBvC7fDn0jxIcXQXEHriZCsgge1puWw0bscnAWR8fx9rdmfA== +"@umijs/lint@4.4.12": + version "4.4.12" + resolved "https://registry.yarnpkg.com/@umijs/lint/-/lint-4.4.12.tgz#cae13243225378283827882ad423caabc927280b" + integrity sha512-Kh/pDGlfDFkS0TrdxV99QsnxQIH1cRClh1mS50FZFSK79NsmWO75H3VdgOo8UUH01i4IWt8zaTDwgL1H3vHrBg== dependencies: - "@babel/core" "7.23.2" - "@babel/eslint-parser" "7.22.15" + "@babel/core" "7.23.6" + "@babel/eslint-parser" "7.23.3" "@stylelint/postcss-css-in-js" "^0.38.0" "@typescript-eslint/eslint-plugin" "^5.62.0" "@typescript-eslint/parser" "^5.62.0" - "@umijs/babel-preset-umi" "4.0.88" + "@umijs/babel-preset-umi" "4.4.12" eslint-plugin-jest "27.2.3" eslint-plugin-react "7.33.2" eslint-plugin-react-hooks "4.6.0" @@ -3058,68 +3321,145 @@ postcss-syntax "0.36.2" stylelint-config-standard "25.0.0" -"@umijs/mfsu@4.0.88": - version "4.0.88" - resolved "https://registry.npmjs.org/@umijs/mfsu/-/mfsu-4.0.88.tgz#e368bcecf08fc34b859938d28734e3fd8dc277f5" - integrity sha512-McHqSuLShUZYD15PsYqpelbot7PyakbMSDr/ckDQNzll6g6B0WIAsDLcDzDf4NFHnxqG76eiWjPuB29f5VSymA== +"@umijs/mako-darwin-arm64@0.11.10": + version "0.11.10" + resolved "https://registry.yarnpkg.com/@umijs/mako-darwin-arm64/-/mako-darwin-arm64-0.11.10.tgz#3829fac23c0106c34b91b8df8053e57d00df65c8" + integrity sha512-kCn0mJx2Hq4RIkMNIzMDOdO4JSWq120auFmSEleHkfrFFFqSWX2qgz5mR5VI7kaPH0GUh0+hwfRkjEVGysJGjA== + +"@umijs/mako-darwin-x64@0.11.10": + version "0.11.10" + resolved "https://registry.yarnpkg.com/@umijs/mako-darwin-x64/-/mako-darwin-x64-0.11.10.tgz#85b63ee1db83d7a65a9b1004264525095c22f390" + integrity sha512-SKgadN/mAU8YxrQnsGQ2lFuR8I12EQSsaei41Ke5qBtXhbSxAxt5MMxBKWdB+dUe74dh6dXnllwAk/ts34vCog== + +"@umijs/mako-linux-arm64-gnu@0.11.10": + version "0.11.10" + resolved "https://registry.yarnpkg.com/@umijs/mako-linux-arm64-gnu/-/mako-linux-arm64-gnu-0.11.10.tgz#71d2b08c10488fde9571f349d798c6f6c2e040ae" + integrity sha512-h6TEyMe9zIuH6w5to+XeZciWDD99RaMdfwvqdcHHyJaLH9wfGwSsiHuf/z3Evwkxy8xoNAvBOngwUD35RGYa/A== + +"@umijs/mako-linux-arm64-musl@0.11.10": + version "0.11.10" + resolved "https://registry.yarnpkg.com/@umijs/mako-linux-arm64-musl/-/mako-linux-arm64-musl-0.11.10.tgz#ac3fbcc2a4ece6ef86171d4bae8c3617fa9b6847" + integrity sha512-kqI1Jw6IHtDwrcsqPZrYxsV3pHzZyOR+6fCFnF5MSURnXbUbJb6Rk66VsKKpMqbyfsEO6nt0WT9FrRBlFvRU2A== + +"@umijs/mako-linux-x64-gnu@0.11.10": + version "0.11.10" + resolved "https://registry.yarnpkg.com/@umijs/mako-linux-x64-gnu/-/mako-linux-x64-gnu-0.11.10.tgz#41cfcf45cac621a8c282158b60d440dc219adc31" + integrity sha512-jlhXVvWJuumMmiE3z3ViugOMx9ZasNM1anng0PsusCgDwfy0IOfGzfwfwagqtzfsC5MwyRcfnRQyDdbfbroaSA== + +"@umijs/mako-linux-x64-musl@0.11.10": + version "0.11.10" + resolved "https://registry.yarnpkg.com/@umijs/mako-linux-x64-musl/-/mako-linux-x64-musl-0.11.10.tgz#91a964a7a9347e2446d3f0c8722518c3c1c99e4a" + integrity sha512-SLV/PRdL12dFEKlQGenW3OboZXmdYi25y+JblgVJLBhpdxZrHFqpCsTZn4L3hVEhyl0/ksR1iY0wtfK3urR29g== + +"@umijs/mako-win32-ia32-msvc@0.11.10": + version "0.11.10" + resolved "https://registry.yarnpkg.com/@umijs/mako-win32-ia32-msvc/-/mako-win32-ia32-msvc-0.11.10.tgz#8f517b986bf2cbe3ab3cf9e68dd7f2a7b8b5184c" + integrity sha512-quCWpVl7yQjG+ccGhkF81GxO3orXdPW1OZWXWxJgOI0uPk7Hczh2EYMEVqqQGbi/83eJ1e3iE1jRTl/+2eHryQ== + +"@umijs/mako-win32-x64-msvc@0.11.10": + version "0.11.10" + resolved "https://registry.yarnpkg.com/@umijs/mako-win32-x64-msvc/-/mako-win32-x64-msvc-0.11.10.tgz#99577175631b752282b22c333ed94ae65d36240b" + integrity sha512-NjUfV1vwUeDk5IXyleGb+pa/DZkGpjkclY/TJcK/X2OQ0Yh7Cr3sfZykhCoTEN2Y74k5rEKWYNQA0nTb6akj9Q== + +"@umijs/mako@0.11.10": + version "0.11.10" + resolved "https://registry.yarnpkg.com/@umijs/mako/-/mako-0.11.10.tgz#deef25223b7282ff6bdaaacbf4009be26adbbc66" + integrity sha512-qh0DzCtwwYjxey7Hn6B+66KVwDhMa/cIZQYgaeUVs76Ut5WDuUlfkFfJh4VA9k1F9YLBHXMaW2IeKIWTTIPVDg== dependencies: - "@umijs/bundler-esbuild" "4.0.88" - "@umijs/bundler-utils" "4.0.88" - "@umijs/utils" "4.0.88" + "@module-federation/webpack-bundler-runtime" "^0.8.0" + "@swc/helpers" "0.5.1" + "@types/resolve" "^1.20.6" + chalk "^4.1.2" + enhanced-resolve "^5.18.1" + less "^4.2.0" + less-loader "^12.2.0" + loader-runner "^4.3.0" + loader-utils "^3.3.1" + lodash "^4.17.21" + node-libs-browser-okam "^2.2.5" + piscina "^4.5.1" + postcss-loader "^8.1.1" + react-error-overlay "6.0.9" + react-refresh "^0.14.0" + resolve "^1.22.8" + sass-loader "^16.0.5" + semver "^7.6.2" + yargs-parser "^21.1.1" + optionalDependencies: + "@umijs/mako-darwin-arm64" "0.11.10" + "@umijs/mako-darwin-x64" "0.11.10" + "@umijs/mako-linux-arm64-gnu" "0.11.10" + "@umijs/mako-linux-arm64-musl" "0.11.10" + "@umijs/mako-linux-x64-gnu" "0.11.10" + "@umijs/mako-linux-x64-musl" "0.11.10" + "@umijs/mako-win32-ia32-msvc" "0.11.10" + "@umijs/mako-win32-x64-msvc" "0.11.10" + +"@umijs/mfsu@4.4.12": + version "4.4.12" + resolved "https://registry.yarnpkg.com/@umijs/mfsu/-/mfsu-4.4.12.tgz#d37e831ae3002f0e31b091bb6c0a4b09f91f15d5" + integrity sha512-QS9ZKJqPJ1roxQzcZnwmrpTLmC3TwhiUIlVqeNeYU58eOS00Yw+QAhp+ngpOrfqqPpxyxzfCnz5bxn05QaoNwQ== + dependencies: + "@umijs/bundler-esbuild" "4.4.12" + "@umijs/bundler-utils" "4.4.12" + "@umijs/utils" "4.4.12" enhanced-resolve "5.9.3" is-equal "^1.6.4" -"@umijs/plugin-run@4.0.88": - version "4.0.88" - resolved "https://registry.npmjs.org/@umijs/plugin-run/-/plugin-run-4.0.88.tgz#2423f7abc2bf5debc9d6bb59058fbd2b6b3fcbdb" - integrity sha512-WV/tR8c3hpum+Dr1o+cxYyzUigRZOMQxiB5KtZD9x1JzX+nZFCCsXraIQAW6RcJ3bpGOUv7aKMWfx1LWoE2K7A== +"@umijs/plugin-run@4.4.12": + version "4.4.12" + resolved "https://registry.yarnpkg.com/@umijs/plugin-run/-/plugin-run-4.4.12.tgz#a1c4e0f99b96acd2061c162b8b5c76f08120d004" + integrity sha512-npZ04MFY8yjir3tIluzWD1RTOfZ8Jjg9P2qukqDmoSyerY79kzC+CB/u4tc6myYa1xDtz3+Z0gxQLjoUUTIx8Q== dependencies: - tsx "^3.12.2" + tsx "3.12.2" -"@umijs/preset-umi@4.0.88": - version "4.0.88" - resolved "https://registry.npmjs.org/@umijs/preset-umi/-/preset-umi-4.0.88.tgz#3ba01080f27ddd0338b8528144ec9040e1e8f56e" - integrity sha512-q5emmxWjOrA8ZNTNaNcUEU/FxM/DDnpjGK8aYIce/ih/suzo+K2csWDAkQCBYgNPg4Ro1Juv2oUgyOt3TVcUXA== +"@umijs/preset-umi@4.4.12": + version "4.4.12" + resolved "https://registry.yarnpkg.com/@umijs/preset-umi/-/preset-umi-4.4.12.tgz#e5ca70c51ea0288a3cf81d139e1e704d49a2eba7" + integrity sha512-Z1ZvfHDfdMuPMDEt2uB5fMDLfVVo9ZSf4uGX344DSy+A0iWsLg7xEWrLlAh4SgpxQjrQ+tGPGQgK61s+PJ/JAw== dependencies: "@iconify/utils" "2.1.1" + "@stagewise/toolbar" "0.6.2" "@svgr/core" "6.5.1" - "@umijs/ast" "4.0.88" - "@umijs/babel-preset-umi" "4.0.88" - "@umijs/bundler-esbuild" "4.0.88" - "@umijs/bundler-utils" "4.0.88" - "@umijs/bundler-vite" "4.0.88" - "@umijs/bundler-webpack" "4.0.88" - "@umijs/core" "4.0.88" - "@umijs/did-you-know" "1.0.3" + "@umijs/ast" "4.4.12" + "@umijs/babel-preset-umi" "4.4.12" + "@umijs/bundler-esbuild" "4.4.12" + "@umijs/bundler-mako" "0.11.10" + "@umijs/bundler-utils" "4.4.12" + "@umijs/bundler-vite" "4.4.12" + "@umijs/bundler-webpack" "4.4.12" + "@umijs/core" "4.4.12" + "@umijs/did-you-know" "^1.0.4" "@umijs/es-module-parser" "0.0.7" "@umijs/history" "5.3.1" - "@umijs/mfsu" "4.0.88" - "@umijs/plugin-run" "4.0.88" - "@umijs/renderer-react" "4.0.88" - "@umijs/server" "4.0.88" + "@umijs/mfsu" "4.4.12" + "@umijs/plugin-run" "4.4.12" + "@umijs/renderer-react" "4.4.12" + "@umijs/server" "4.4.12" "@umijs/ui" "3.0.1" - "@umijs/utils" "4.0.88" - "@umijs/zod2ts" "4.0.88" + "@umijs/utils" "4.4.12" + "@umijs/zod2ts" "4.4.12" babel-plugin-dynamic-import-node "2.3.3" - click-to-react-component "^1.0.8" - core-js "3.28.0" + babel-plugin-react-compiler "0.0.0-experimental-c23de8d-20240515" + click-to-react-component "1.1.0" + core-js "3.34.0" current-script-polyfill "1.0.0" enhanced-resolve "5.9.3" fast-glob "3.2.12" html-webpack-plugin "5.5.0" - less-plugin-resolve "1.0.0" + less-plugin-resolve "1.0.2" path-to-regexp "1.7.0" postcss "^8.4.21" postcss-prefix-selector "1.16.0" - react "18.1.0" - react-dom "18.1.0" + react "18.3.1" + react-dom "18.3.1" react-router "6.3.0" react-router-dom "6.3.0" regenerator-runtime "0.13.11" "@umijs/react-refresh-webpack-plugin@0.5.11": version "0.5.11" - resolved "https://registry.npmjs.org/@umijs/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz#e45dd3004d2c02bb562425d91f9b6014469598c2" + resolved "https://registry.yarnpkg.com/@umijs/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz#e45dd3004d2c02bb562425d91f9b6014469598c2" integrity sha512-RtFvB+/GmjRhpHcqNgnw8iWZpTlxOnmNxi8eDcecxMmxmSgeDj25LV0jr4Q6rOhv3GTIfVGBhkwz+khGT5tfmg== dependencies: ansi-html-community "^0.0.8" @@ -3132,12 +3472,12 @@ schema-utils "^3.0.0" source-map "^0.7.3" -"@umijs/renderer-react@4.0.88": - version "4.0.88" - resolved "https://registry.npmjs.org/@umijs/renderer-react/-/renderer-react-4.0.88.tgz#e7443a7e654f2bcbf3f7d6dc78f437166354143a" - integrity sha512-5zU4+PLO9+D8nl/WikGE6QjYvztKWSLGp+N33TPL0BrrJOSTI/ffH/iwsPxiFG/ABX4oz3SShUyIhyChSnP/WQ== +"@umijs/renderer-react@4.4.12": + version "4.4.12" + resolved "https://registry.yarnpkg.com/@umijs/renderer-react/-/renderer-react-4.4.12.tgz#9d35e5c1a905d56341bf18c28e82fb856ab01f83" + integrity sha512-vG6klDjXAWi+aH1q1hGmDkSbqT4OvECJI3AVsaXZPaq53mhkli3OdiTnQj52zFD5FE3At5cgPK159bxuD/UXNA== dependencies: - "@babel/runtime" "7.23.2" + "@babel/runtime" "7.23.6" "@loadable/component" "5.15.2" history "5.3.0" react-helmet-async "1.3.0" @@ -3145,60 +3485,60 @@ "@umijs/route-utils@^4.0.0": version "4.0.1" - resolved "https://registry.npmjs.org/@umijs/route-utils/-/route-utils-4.0.1.tgz#156df5b3f2328059722d3ee7dd8f65e18c3cde8b" + resolved "https://registry.yarnpkg.com/@umijs/route-utils/-/route-utils-4.0.1.tgz#156df5b3f2328059722d3ee7dd8f65e18c3cde8b" integrity sha512-+1ixf1BTOLuH+ORb4x8vYMPeIt38n9q0fJDwhv9nSxrV46mxbLF0nmELIo9CKQB2gHfuC4+hww6xejJ6VYnBHQ== -"@umijs/server@4.0.88": - version "4.0.88" - resolved "https://registry.npmjs.org/@umijs/server/-/server-4.0.88.tgz#868e48805878551bf06ca8be2c0b720dcef883ca" - integrity sha512-Bvt6HCVn7NO7hrHbWXccJhpeQCwb5/lL9g5ShSOIfcf8WwND+U7E9H3ME5cMJywdgeTjEe+yItLGQHur9TpOTg== +"@umijs/server@4.4.12": + version "4.4.12" + resolved "https://registry.yarnpkg.com/@umijs/server/-/server-4.4.12.tgz#f34ac56afa81a2157c9455f12ad3ec77f3e8ddad" + integrity sha512-t4qX/A4/ROQ3+JiBJi8YugK6d+pEIv4xXqckQjDnL8YBooG1OC5gIdCMczTQser4PVzNxy2q8ufJ9lPAj79MTA== dependencies: - "@umijs/bundler-utils" "4.0.88" + "@umijs/bundler-utils" "4.4.12" history "5.3.0" - react "18.1.0" - react-dom "18.1.0" + react "18.3.1" + react-dom "18.3.1" react-router-dom "6.3.0" -"@umijs/test@4.0.88": - version "4.0.88" - resolved "https://registry.npmjs.org/@umijs/test/-/test-4.0.88.tgz#018d2947f3a92a51ad1010d4b00972db0dfc5e32" - integrity sha512-3v021VhU/aQc3Jk421z3ys1Q5S/JJlIzhJYYds+O1gb3esgeaGIS6OyDA1xmCaqVGgJeYOq408AN43/hCR9rtw== +"@umijs/test@4.4.12": + version "4.4.12" + resolved "https://registry.yarnpkg.com/@umijs/test/-/test-4.4.12.tgz#83a332044c02280f6af19a9951a7a20c1253d3f7" + integrity sha512-jzX2aLckXIES7uaGQPnJX3VNZZ6veaSzVwAKVp1qBPNkjn3YwUdo4EqeLIrMe3jKiA+0JgB1vIsrw7Yf3tjFTQ== dependencies: - "@babel/plugin-transform-modules-commonjs" "7.23.0" + "@babel/plugin-transform-modules-commonjs" "7.23.3" "@jest/types" "27.5.1" - "@umijs/bundler-utils" "4.0.88" - "@umijs/utils" "4.0.88" - babel-jest "^29.4.3" - esbuild "0.17.19" + "@umijs/bundler-utils" "4.4.12" + "@umijs/utils" "4.4.12" + babel-jest "^29.7.0" + esbuild "0.21.4" identity-obj-proxy "3.0.0" isomorphic-unfetch "4.0.2" "@umijs/ui@3.0.1": version "3.0.1" - resolved "https://registry.npmjs.org/@umijs/ui/-/ui-3.0.1.tgz#64ae7ef36bf9374823f7361a7a844876d96c9e06" + resolved "https://registry.yarnpkg.com/@umijs/ui/-/ui-3.0.1.tgz#64ae7ef36bf9374823f7361a7a844876d96c9e06" integrity sha512-zcz37AJH0xt/6XVVbyO/hmsK9Hq4vH23HZ4KYVi5A8rbM9KeJkJigTS7ELOdArawZhVNGe+h3a5Oixs4a2QsWw== "@umijs/use-params@^1.0.9": version "1.0.9" - resolved "https://registry.npmjs.org/@umijs/use-params/-/use-params-1.0.9.tgz#0ae4a87f4922d8e8e3fb4495b0f8f4de9ca38c52" + resolved "https://registry.yarnpkg.com/@umijs/use-params/-/use-params-1.0.9.tgz#0ae4a87f4922d8e8e3fb4495b0f8f4de9ca38c52" integrity sha512-QlN0RJSBVQBwLRNxbxjQ5qzqYIGn+K7USppMoIOVlf7fxXHsnQZ2bEsa6Pm74bt6DVQxpUE8HqvdStn6Y9FV1w== -"@umijs/utils@4.0.88", "@umijs/utils@^4.0.84": - version "4.0.88" - resolved "https://registry.npmjs.org/@umijs/utils/-/utils-4.0.88.tgz#0761f74b54b9214c2a77d5fb0ace0e3f19841fa4" - integrity sha512-b7rW75hQ18+1Q3rt6cqOIed6hftmsExUsfJaCjYCIqFL3DRn+D8Uwb0EEsNlxgLnWUgwGC2KrIYYMvc2Q2XfWA== +"@umijs/utils@4.4.12", "@umijs/utils@^4.0.84": + version "4.4.12" + resolved "https://registry.yarnpkg.com/@umijs/utils/-/utils-4.4.12.tgz#d088e52ccd654772b06dfef9831a49e40a3debe0" + integrity sha512-1Ea+STKP6IxI7yhsURJooCRX//BXnSjgD86XoR4JiYB9MSOhAeS/vpY9f48PpEe/jpKO+JfieqbY4hWHGZGJZw== dependencies: chokidar "3.5.3" pino "7.11.0" -"@umijs/zod2ts@4.0.88": - version "4.0.88" - resolved "https://registry.npmjs.org/@umijs/zod2ts/-/zod2ts-4.0.88.tgz#9272b9ddf6153e0fa9a37eba9159de14220d9e6a" - integrity sha512-YdctA0RdGlJCnkc7wegre4BD2QfWGPOXes6pBiD1HUxBYiB4VQRrk54ESOD87o/OVB2VfhfqjE/v+xeevEeF3w== +"@umijs/zod2ts@4.4.12": + version "4.4.12" + resolved "https://registry.yarnpkg.com/@umijs/zod2ts/-/zod2ts-4.4.12.tgz#8f7f341a7a5dc98c9f1c4aec32305287f4bb8741" + integrity sha512-NZVCmNwryU6r/M3Ymyv7FyJWoeucTZmeO2OK+eCgPkQbIst3mfTBeDmXAgL3+Lr3bB1m6u489AQRJLEP844Bzg== "@vitejs/plugin-react@4.0.0": version "4.0.0" - resolved "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.0.tgz#46d1c37c507447d10467be1c111595174555ef28" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.0.0.tgz#46d1c37c507447d10467be1c111595174555ef28" integrity sha512-HX0XzMjL3hhOYm+0s95pb0Z7F8O81G7joUHgfDd/9J/ZZf5k4xX6QAMFkKsHFxaHlf6X7GD7+XuaZ66ULiJuhQ== dependencies: "@babel/core" "^7.21.4" @@ -3208,75 +3548,62 @@ JSONStream@^1.3.5: version "1.3.5" - resolved "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== dependencies: jsonparse "^1.2.0" through ">=2.2.7 <3" -acorn@^8.8.2: - version "8.11.2" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" - integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== +accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn@^8.14.0: + version "8.15.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" + integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== agent-base@4, agent-base@^4.1.0, agent-base@^4.3.0: version "4.3.0" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== dependencies: es6-promisify "^5.0.0" agentkeepalive@^3.3.0: - version "3.5.2" - resolved "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz#a113924dd3fa24a0bc3b78108c450c2abee00f67" - integrity sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ== + version "3.5.3" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.5.3.tgz#c210afce942b4287e2df2fbfe6c0d57eda2ce634" + integrity sha512-yqXL+k5rr8+ZRpOAntkaaRgWgE5o8ESAj5DyRmVTCSoZxXmqemb9Dd7T4i5UzwuERdLAJUy6XzR9zFVuf0kzkw== dependencies: humanize-ms "^1.2.1" -ahooks-v3-count@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/ahooks-v3-count/-/ahooks-v3-count-1.0.0.tgz#ddeb392e009ad6e748905b3cbf63a9fd8262ca80" - integrity sha512-V7uUvAwnimu6eh/PED4mCDjE7tokeZQLKlxg9lCTMPhN+NjsSbtdacByVlR1oluXQzD3MOw55wylDmQo4+S9ZQ== - -ahooks@^3.4.1: - version "3.7.11" - resolved "https://registry.yarnpkg.com/ahooks/-/ahooks-3.7.11.tgz#51b6fdcad8cb603511318ac370feee0628bd6d68" - integrity sha512-BfSq7HJ9wk/7a2vX7WbLdwzHyQHmbNe21ipX1PfIzssXIzQfAl79WVJ9GjZaqNl4PFPsJusj/Xjg2OF+gIgGaQ== +ahooks@^3.4.1, ahooks@^3.7.2: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ahooks/-/ahooks-3.9.0.tgz#e3cdf74ca1bb0668c7c342a8160eb5700f3397d6" + integrity sha512-r20/C38aFyU3Zqp3620gkdLnxmQhnmWORB3eGGTDlM4i/fOc0GUvM+f2oleMzEu7b3+pHXyzz+FB6ojxsUdYdw== dependencies: "@babel/runtime" "^7.21.0" dayjs "^1.9.1" intersection-observer "^0.12.0" - js-cookie "^2.x.x" + js-cookie "^3.0.5" lodash "^4.17.21" react-fast-compare "^3.2.2" resize-observer-polyfill "^1.5.1" screenfull "^5.0.0" tslib "^2.4.1" -ahooks@^3.7.2: - version "3.7.8" - resolved "https://registry.npmjs.org/ahooks/-/ahooks-3.7.8.tgz#3fa3c491cd153e884a32b0c4192fc72cf84c4332" - integrity sha512-e/NMlQWoCjaUtncNFIZk3FG1ImSkV/JhScQSkTqnftakRwdfZWSw6zzoWSG9OMYqPNs2MguDYBUFFC6THelWXA== - dependencies: - "@babel/runtime" "^7.21.0" - "@types/js-cookie" "^2.x.x" - ahooks-v3-count "^1.0.0" - dayjs "^1.9.1" - intersection-observer "^0.12.0" - js-cookie "^2.x.x" - lodash "^4.17.21" - resize-observer-polyfill "^1.5.1" - screenfull "^5.0.0" - tslib "^2.4.1" - ajv-keywords@^3.5.2: version "3.5.2" - resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== ajv@^6.12.5: version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -3285,18 +3612,18 @@ ajv@^6.12.5: uri-js "^4.2.2" ajv@^8.11.0: - version "8.12.0" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== dependencies: - fast-deep-equal "^3.1.1" + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" - uri-js "^4.2.2" align-text@^0.1.1, align-text@^0.1.3: version "0.1.4" - resolved "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" integrity sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg== dependencies: kind-of "^3.0.2" @@ -3305,90 +3632,90 @@ align-text@^0.1.1, align-text@^0.1.3: amdefine@>=0.0.4: version "1.0.1" - resolved "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== animated-scroll-to@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/animated-scroll-to/-/animated-scroll-to-2.3.0.tgz#01d7a82db7ace7017eae11c5ebbafd3b0270bced" - integrity sha512-PT/5MSKCWQaK2kuOl2HT2KJMuJEvUS4/TgMhWy82c2EmF74/CIkvPBPKOvd8nMYP6Higo7xCn49/iSW9BccMoQ== + version "2.3.2" + resolved "https://registry.yarnpkg.com/animated-scroll-to/-/animated-scroll-to-2.3.2.tgz#2e5bd6012bffd6f13ec6c68d5cd45ffd525b3b7d" + integrity sha512-GBX6+V06anH2rRt1sGmYXvAVpBo0tMmJxVvGuMcd+KV+EzMnYFSYBnccCa5IYWJvEigI+vFLKKLLEeO6SyfjcQ== ansi-align@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" integrity sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA== dependencies: string-width "^2.0.0" ansi-escapes@^3.2.0: version "3.2.0" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== -ansi-escapes@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz#b6a0caf0eef0c41af190e9a749e0c00ec04bb2a6" - integrity sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA== +ansi-escapes@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-7.0.0.tgz#00fc19f491bbb18e1d481b97868204f92109bfe7" + integrity sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw== dependencies: - type-fest "^1.0.2" + environment "^1.0.0" ansi-html-community@^0.0.8: version "0.0.8" - resolved "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== ansi-regex@^2.0.0: version "2.1.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== ansi-regex@^3.0.0: version "3.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== -ansi-regex@^4.1.0: +ansi-regex@^4.0.0, ansi-regex@^4.1.0: version "4.1.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== ansi-styles@^2.2.1: version "2.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== -ansi-styles@^3.2.1: +ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" -ansi-styles@^6.0.0, ansi-styles@^6.1.0: +ansi-styles@^6.0.0, ansi-styles@^6.1.0, ansi-styles@^6.2.1: version "6.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== antd-style@3.4.5: version "3.4.5" - resolved "https://registry.npmjs.org/antd-style/-/antd-style-3.4.5.tgz#ed1c81a738b3ae9c4079824b13a30c27ab934f4e" + resolved "https://registry.yarnpkg.com/antd-style/-/antd-style-3.4.5.tgz#ed1c81a738b3ae9c4079824b13a30c27ab934f4e" integrity sha512-6aC4P9XyuVy0O7eZ+HZXd8GbbFX9HgzsXsJ341ihJhgqrfsQZNx8lDQvS2kCV6ao99QqtyTDphK9gWOgV2bHEw== dependencies: "@ant-design/cssinjs" "^1" @@ -3402,9 +3729,9 @@ antd-style@3.4.5: use-merge-value "^1" antd-token-previewer@^2.0.0-alpha.6: - version "2.0.5" - resolved "https://registry.npmjs.org/antd-token-previewer/-/antd-token-previewer-2.0.5.tgz#78e09d15cf19825f39a30a4c1767a5ad3d65a65c" - integrity sha512-AIxkqI6nd1VJSNsd77tp1UhBQ0K0YdRcWan6E2aG9RTvapZf8hhwcDL/YVJaPaS/4V3iFeOtD2z12BMseemshg== + version "2.0.8" + resolved "https://registry.yarnpkg.com/antd-token-previewer/-/antd-token-previewer-2.0.8.tgz#d374bc03b09610c2a9e86f9ed0b300cfade20fb3" + integrity sha512-Dp5a1thv8lHTJdmJAog75Mt8ZXQ9NYXX7WxRy49UeYVeR+kDKbolww+aIQlO974jQBF+swtL/jL0MMgIUg0WKg== dependencies: "@ant-design/colors" "^6" "@ant-design/cssinjs" "^1" @@ -3419,113 +3746,60 @@ antd-token-previewer@^2.0.0-alpha.6: use-debouncy "~4.3.0" vanilla-jsoneditor "^0.16.1" -antd@^5.12.8: - version "5.16.1" - resolved "https://registry.yarnpkg.com/antd/-/antd-5.16.1.tgz#a258e73cac8c6e63c4ec44588e5474f0403cd33a" - integrity sha512-XAlLRrgYV+nj9FHnkXEPS6HNcKcluEa8v44e7Cixjlp8aOXRhUI6IfZaKpc2MPGjQ+06rp62/dsxOUNJW9kfLA== +antd@^5.12.8, antd@^5.5.1: + version "5.26.7" + resolved "https://registry.yarnpkg.com/antd/-/antd-5.26.7.tgz#e2f7e37330b27eec0de7a7789767975373f61602" + integrity sha512-iCyXN6+i2CUVEOSzzJKfbKeg115qoJhGvSkCh5uzAf9hANwHUOJQhsMn+KtN+Lx/2NQ6wfM7nGZ+7NPNO5Pn1w== dependencies: - "@ant-design/colors" "^7.0.2" - "@ant-design/cssinjs" "^1.18.5" - "@ant-design/icons" "^5.3.6" + "@ant-design/colors" "^7.2.1" + "@ant-design/cssinjs" "^1.23.0" + "@ant-design/cssinjs-utils" "^1.1.3" + "@ant-design/fast-color" "^2.0.6" + "@ant-design/icons" "^5.6.1" "@ant-design/react-slick" "~1.1.2" - "@babel/runtime" "^7.24.4" - "@ctrl/tinycolor" "^3.6.1" - "@rc-component/color-picker" "~1.5.3" + "@babel/runtime" "^7.26.0" + "@rc-component/color-picker" "~2.0.1" "@rc-component/mutate-observer" "^1.1.0" - "@rc-component/tour" "~1.14.2" - "@rc-component/trigger" "^2.0.0" + "@rc-component/qrcode" "~1.0.0" + "@rc-component/tour" "~1.15.1" + "@rc-component/trigger" "^2.3.0" classnames "^2.5.1" copy-to-clipboard "^3.3.3" - dayjs "^1.11.10" - qrcode.react "^3.1.0" - rc-cascader "~3.24.0" - rc-checkbox "~3.2.0" - rc-collapse "~3.7.3" - rc-dialog "~9.4.0" - rc-drawer "~7.1.0" - rc-dropdown "~4.2.0" - rc-field-form "~1.44.0" - rc-image "~7.6.0" - rc-input "~1.4.5" - rc-input-number "~9.0.0" - rc-mentions "~2.11.1" - rc-menu "~9.13.0" - rc-motion "^2.9.0" - rc-notification "~5.4.0" - rc-pagination "~4.0.4" - rc-picker "~4.3.0" + dayjs "^1.11.11" + rc-cascader "~3.34.0" + rc-checkbox "~3.5.0" + rc-collapse "~3.9.0" + rc-dialog "~9.6.0" + rc-drawer "~7.3.0" + rc-dropdown "~4.2.1" + rc-field-form "~2.7.0" + rc-image "~7.12.0" + rc-input "~1.8.0" + rc-input-number "~9.5.0" + rc-mentions "~2.20.0" + rc-menu "~9.16.1" + rc-motion "^2.9.5" + rc-notification "~5.6.4" + rc-pagination "~5.1.0" + rc-picker "~4.11.3" rc-progress "~4.0.0" - rc-rate "~2.12.0" - rc-resize-observer "^1.4.0" - rc-segmented "~2.3.0" - rc-select "~14.13.0" - rc-slider "~10.5.0" - rc-steps "~6.0.1" - rc-switch "~4.1.0" - rc-table "~7.45.4" - rc-tabs "~14.1.1" - rc-textarea "~1.6.3" - rc-tooltip "~6.2.0" - rc-tree "~5.8.5" - rc-tree-select "~5.19.0" - rc-upload "~4.5.2" - rc-util "^5.39.1" - scroll-into-view-if-needed "^3.1.0" - throttle-debounce "^5.0.0" - -antd@^5.5.1: - version "5.11.1" - resolved "https://registry.npmjs.org/antd/-/antd-5.11.1.tgz#69bc1a7f52536ec5eec0afe88ec3aacd274c5faf" - integrity sha512-X7Gk1TtJtM9goTrmTPVserqcP7crtV2TX/pbxgqyHpMZRrnBy0EI3h4ngrW+zsIAW8/iqpgrYsG/NVUel6xkBA== - dependencies: - "@ant-design/colors" "^7.0.0" - "@ant-design/cssinjs" "^1.17.2" - "@ant-design/icons" "^5.2.6" - "@ant-design/react-slick" "~1.0.2" - "@babel/runtime" "^7.18.3" - "@ctrl/tinycolor" "^3.6.1" - "@rc-component/color-picker" "~1.4.1" - "@rc-component/mutate-observer" "^1.1.0" - "@rc-component/tour" "~1.10.0" - "@rc-component/trigger" "^1.18.1" - classnames "^2.3.2" - copy-to-clipboard "^3.3.3" - dayjs "^1.11.1" - qrcode.react "^3.1.0" - rc-cascader "~3.20.0" - rc-checkbox "~3.1.0" - rc-collapse "~3.7.1" - rc-dialog "~9.3.4" - rc-drawer "~6.5.2" - rc-dropdown "~4.1.0" - rc-field-form "~1.40.0" - rc-image "~7.3.2" - rc-input "~1.3.5" - rc-input-number "~8.4.0" - rc-mentions "~2.9.1" - rc-menu "~9.12.2" - rc-motion "^2.9.0" - rc-notification "~5.3.0" - rc-pagination "~3.7.0" - rc-picker "~3.14.6" - rc-progress "~3.5.1" - rc-rate "~2.12.0" - rc-resize-observer "^1.4.0" - rc-segmented "~2.2.2" - rc-select "~14.10.0" - rc-slider "~10.4.0" + rc-rate "~2.13.1" + rc-resize-observer "^1.4.3" + rc-segmented "~2.7.0" + rc-select "~14.16.8" + rc-slider "~11.1.8" rc-steps "~6.0.1" rc-switch "~4.1.0" - rc-table "~7.35.2" - rc-tabs "~12.13.1" - rc-textarea "~1.5.2" - rc-tooltip "~6.1.2" - rc-tree "~5.8.2" - rc-tree-select "~5.15.0" - rc-upload "~4.3.5" - rc-util "^5.38.1" + rc-table "~7.51.1" + rc-tabs "~15.6.1" + rc-textarea "~1.10.1" + rc-tooltip "~6.4.0" + rc-tree "~5.13.1" + rc-tree-select "~5.27.0" + rc-upload "~4.9.2" + rc-util "^5.44.4" scroll-into-view-if-needed "^3.1.0" - throttle-debounce "^5.0.0" + throttle-debounce "^5.0.2" any-promise@^1.0.0: version "1.3.0" @@ -3534,7 +3808,7 @@ any-promise@^1.0.0: anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -3542,193 +3816,201 @@ anymatch@^3.0.3, anymatch@~3.1.2: append-field@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56" + resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56" integrity sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw== aproba@^1.1.1: version "1.2.0" - resolved "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== arg@^5.0.0: version "5.0.2" - resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== argparse@^1.0.7: version "1.0.10" - resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" argparse@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== aria-hidden@^1.1.3: - version "1.2.3" - resolved "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz#14aeb7fb692bbb72d69bebfa47279c1fd725e954" - integrity sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ== + version "1.2.6" + resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.6.tgz#73051c9b088114c795b1ea414e9c0fff874ffc1a" + integrity sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA== dependencies: tslib "^2.0.0" -array-buffer-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" - integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== +array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" + integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" + call-bound "^1.0.3" + is-array-buffer "^3.0.5" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== array-ify@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" + resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== array-includes@^3.1.6: - version "3.1.7" - resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" - integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== + version "3.1.9" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.9.tgz#1f0ccaa08e90cdbc3eb433210f903ad0f17c3f3a" + integrity sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - is-string "^1.0.7" - -array-tree-filter@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz#873ac00fec83749f255ac8dd083814b4f6329190" - integrity sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw== + call-bind "^1.0.8" + call-bound "^1.0.4" + define-properties "^1.2.1" + es-abstract "^1.24.0" + es-object-atoms "^1.1.1" + get-intrinsic "^1.3.0" + is-string "^1.1.1" + math-intrinsics "^1.1.0" array-union@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== array.prototype.flat@^1.3.1: - version "1.3.2" - resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" - integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + version "1.3.3" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz#534aaf9e6e8dd79fb6b9a9917f839ef1ec63afe5" + integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" array.prototype.flatmap@^1.3.1: - version "1.3.2" - resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" - integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + version "1.3.3" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz#712cc792ae70370ae40586264629e33aab5dd38b" + integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" array.prototype.reduce@^1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz#63149931808c5fc1e1354814923d92d45f7d96d5" - integrity sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg== + version "1.0.8" + resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.8.tgz#42f97f5078daedca687d4463fd3c05cbfd83da57" + integrity sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.8" + call-bound "^1.0.4" + define-properties "^1.2.1" + es-abstract "^1.23.9" es-array-method-boxes-properly "^1.0.0" - is-string "^1.0.7" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + is-string "^1.1.1" array.prototype.tosorted@^1.1.1: - version "1.1.2" - resolved "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz#620eff7442503d66c799d95503f82b475745cefd" - integrity sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg== + version "1.1.4" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" + integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + es-shim-unscopables "^1.0.2" -arraybuffer.prototype.slice@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" - integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== +arraybuffer.prototype.slice@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" + integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - is-array-buffer "^3.0.2" - is-shared-array-buffer "^1.0.2" + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + is-array-buffer "^3.0.4" arrify@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== -asn1.js@^5.2.0: - version "5.4.1" - resolved "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== +asn1.js@^4.10.1: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== dependencies: bn.js "^4.0.0" inherits "^2.0.1" minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" + +assert-okam@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert-okam/-/assert-okam-1.5.0.tgz#c697095e6ba2d97dc9b02a6ad1464e3668a471bc" + integrity sha512-pchhPo40i8GsTj/7h6P8LSSzwRErnh2nCEiwXNTxy4VYw6lSesSac4rTKqwsA+fOZdj6FT81Mb9U1vIZEua1EQ== + dependencies: + object-assign "^4.1.1" + util "0.10.3" assert@^1.1.1: version "1.5.1" - resolved "https://registry.npmjs.org/assert/-/assert-1.5.1.tgz#038ab248e4ff078e7bc2485ba6e6388466c78f76" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.1.tgz#038ab248e4ff078e7bc2485ba6e6388466c78f76" integrity sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A== dependencies: object.assign "^4.1.4" util "^0.10.4" astring@^1.8.0: - version "1.8.6" - resolved "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz#2c9c157cf1739d67561c56ba896e6948f6b93731" - integrity sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg== - -async-validator@^4.1.0: - version "4.2.5" - resolved "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz#c96ea3332a521699d0afaaceed510a54656c6339" - integrity sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg== + version "1.9.0" + resolved "https://registry.yarnpkg.com/astring/-/astring-1.9.0.tgz#cc73e6062a7eb03e7d19c22d8b0b3451fd9bfeef" + integrity sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg== -asynciterator.prototype@^1.0.0: +async-function@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz#8c5df0514936cdd133604dfcc9d3fb93f09b2b62" - integrity sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg== - dependencies: - has-symbols "^1.0.3" + resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b" + integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== atob@^2.1.2: version "2.1.2" - resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== atomic-sleep@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" + resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== autoprefixer@^10.4.6: - version "10.4.16" - resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz#fad1411024d8670880bdece3970aa72e3572feb8" - integrity sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ== + version "10.4.21" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.21.tgz#77189468e7a8ad1d9a37fbc08efc9f480cf0a95d" + integrity sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ== dependencies: - browserslist "^4.21.10" - caniuse-lite "^1.0.30001538" - fraction.js "^4.3.6" + browserslist "^4.24.4" + caniuse-lite "^1.0.30001702" + fraction.js "^4.3.7" normalize-range "^0.1.2" - picocolors "^1.0.0" + picocolors "^1.1.1" postcss-value-parser "^4.2.0" -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" axios-mock-adapter@1.22.0: version "1.22.0" @@ -3740,7 +4022,7 @@ axios-mock-adapter@1.22.0: axios@^0.18.1: version "0.18.1" - resolved "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz#ff3f0de2e7b5d180e757ad98000f1081b87bcea3" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.1.tgz#ff3f0de2e7b5d180e757ad98000f1081b87bcea3" integrity sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g== dependencies: follow-redirects "1.5.10" @@ -3748,14 +4030,14 @@ axios@^0.18.1: axios@^0.26.1: version "0.26.1" - resolved "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9" integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA== dependencies: follow-redirects "^1.14.8" -babel-jest@^29.4.3: +babel-jest@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== dependencies: "@jest/transform" "^29.7.0" @@ -3768,14 +4050,14 @@ babel-jest@^29.4.3: babel-plugin-dynamic-import-node@2.3.3: version "2.3.3" - resolved "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== dependencies: object.assign "^4.1.0" babel-plugin-istanbul@^6.1.1: version "6.1.1" - resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -3786,7 +4068,7 @@ babel-plugin-istanbul@^6.1.1: babel-plugin-jest-hoist@^29.6.3: version "29.6.3" - resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== dependencies: "@babel/template" "^7.3.3" @@ -3796,16 +4078,29 @@ babel-plugin-jest-hoist@^29.6.3: babel-plugin-macros@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== dependencies: "@babel/runtime" "^7.12.5" cosmiconfig "^7.0.0" resolve "^1.19.0" +babel-plugin-react-compiler@0.0.0-experimental-c23de8d-20240515: + version "0.0.0-experimental-c23de8d-20240515" + resolved "https://registry.yarnpkg.com/babel-plugin-react-compiler/-/babel-plugin-react-compiler-0.0.0-experimental-c23de8d-20240515.tgz#9030a1e93b5cd6d83ea1aa168eddf91beac5217b" + integrity sha512-0XN2gmpT55QtAz5n7d5g91y1AuO9tRhWBaLgCRyc4ExHrlr7+LfxW+YTb3mOwxngkkiggwM8HyYsaEK9MqhnlQ== + dependencies: + "@babel/generator" "7.2.0" + "@babel/types" "^7.19.0" + chalk "4" + invariant "^2.2.4" + pretty-format "^24" + zod "^3.22.4" + zod-validation-error "^2.1.0" + "babel-plugin-styled-components@>= 1.12.0": version "2.1.4" - resolved "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.4.tgz#9a1f37c7f32ef927b4b008b529feb4a2c82b1092" + resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.4.tgz#9a1f37c7f32ef927b4b008b529feb4a2c82b1092" integrity sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" @@ -3815,26 +4110,29 @@ babel-plugin-macros@^3.1.0: picomatch "^2.3.1" babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + version "1.2.0" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz#20730d6cdc7dda5d89401cab10ac6a32067acde6" + integrity sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-import-attributes" "^7.24.7" + "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" babel-preset-jest@^29.6.3: version "29.6.3" - resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== dependencies: babel-plugin-jest-hoist "^29.6.3" @@ -3842,7 +4140,7 @@ babel-preset-jest@^29.6.3: babel-runtime@^6.26.0: version "6.26.0" - resolved "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g== dependencies: core-js "^2.4.0" @@ -3850,52 +4148,52 @@ babel-runtime@^6.26.0: bail@^2.0.0: version "2.0.2" - resolved "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" + resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base64-js@^1.0.2: version "1.5.1" - resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== bessel@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/bessel/-/bessel-1.0.2.tgz#828812291e0b62e94959cdea43fac186e8a7202d" + resolved "https://registry.yarnpkg.com/bessel/-/bessel-1.0.2.tgz#828812291e0b62e94959cdea43fac186e8a7202d" integrity sha512-Al3nHGQGqDYqqinXhQzmwmcRToe/3WyBv4N8aZc5Pef8xw2neZlR9VPi84Sa23JtgWcucu18HxVZrnI0fn2etw== big-integer@^1.6.44: - version "1.6.51" - resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" - integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== + version "1.6.52" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85" + integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg== big.js@^5.2.2: version "5.2.2" - resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== bignumber.js@^9.1.2: - version "9.1.2" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" - integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== + version "9.3.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.3.1.tgz#759c5aaddf2ffdc4f154f7b493e1c8770f88c4d7" + integrity sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ== binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== binaryextensions@^2.1.2: version "2.3.0" - resolved "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.3.0.tgz#1d269cbf7e6243ea886aa41453c3651ccbe13c22" + resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.3.0.tgz#1d269cbf7e6243ea886aa41453c3651ccbe13c22" integrity sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg== bl@^1.0.0: version "1.2.3" - resolved "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7" integrity sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww== dependencies: readable-stream "^2.3.5" @@ -3903,27 +4201,45 @@ bl@^1.0.0: bluebird@^3.5.0, bluebird@^3.5.1: version "3.7.2" - resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + version "4.12.2" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.2.tgz#3d8fed6796c24e177737f7cc5172ee04ef39ec99" + integrity sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw== -bn.js@^5.0.0, bn.js@^5.2.1: - version "5.2.1" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" - integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== +bn.js@^5.2.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.2.tgz#82c09f9ebbb17107cd72cb7fd39bd1f9d0aaa566" + integrity sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw== + +body-parser@1.20.3: + version "1.20.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" + integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.13.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" boolbase@^1.0.0, boolbase@~1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== boxen@^1.2.1: version "1.3.0" - resolved "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== dependencies: ansi-align "^2.0.0" @@ -3936,41 +4252,41 @@ boxen@^1.2.1: bplist-parser@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e" + resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e" integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw== dependencies: big-integer "^1.6.44" brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + version "1.1.12" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" + integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + version "2.0.2" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" + integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== dependencies: balanced-match "^1.0.0" -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== -browserify-aes@^1.0.0, browserify-aes@^1.0.4: +browserify-aes@^1.0.4, browserify-aes@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== dependencies: buffer-xor "^1.0.3" @@ -3980,9 +4296,9 @@ browserify-aes@^1.0.0, browserify-aes@^1.0.4: inherits "^2.0.1" safe-buffer "^5.0.1" -browserify-cipher@^1.0.0: +browserify-cipher@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== dependencies: browserify-aes "^1.0.4" @@ -3991,7 +4307,7 @@ browserify-cipher@^1.0.0: browserify-des@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== dependencies: cipher-base "^1.0.1" @@ -4000,60 +4316,62 @@ browserify-des@^1.0.0: safe-buffer "^5.1.2" browserify-rsa@^4.0.0, browserify-rsa@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + version "4.1.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.1.tgz#06e530907fe2949dc21fc3c2e2302e10b1437238" + integrity sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ== dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" + bn.js "^5.2.1" + randombytes "^2.1.0" + safe-buffer "^5.2.1" -browserify-sign@^4.0.0: - version "4.2.2" - resolved "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz#e78d4b69816d6e3dd1c747e64e9947f9ad79bc7e" - integrity sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg== +browserify-sign@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.3.tgz#7afe4c01ec7ee59a89a558a4b75bd85ae62d4208" + integrity sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw== dependencies: bn.js "^5.2.1" browserify-rsa "^4.1.0" create-hash "^1.2.0" create-hmac "^1.1.7" - elliptic "^6.5.4" + elliptic "^6.5.5" + hash-base "~3.0" inherits "^2.0.4" - parse-asn1 "^5.1.6" - readable-stream "^3.6.2" + parse-asn1 "^5.1.7" + readable-stream "^2.3.8" safe-buffer "^5.2.1" browserify-zlib@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== dependencies: pako "~1.0.5" -browserslist@^4.20.3, browserslist@^4.21.10, browserslist@^4.21.9: - version "4.22.1" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" - integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== +browserslist@^4.20.3, browserslist@^4.24.0, browserslist@^4.24.4: + version "4.25.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.25.1.tgz#ba9e8e6f298a1d86f829c9b975e07948967bb111" + integrity sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw== dependencies: - caniuse-lite "^1.0.30001541" - electron-to-chromium "^1.4.535" - node-releases "^2.0.13" - update-browserslist-db "^1.0.13" + caniuse-lite "^1.0.30001726" + electron-to-chromium "^1.5.173" + node-releases "^2.0.19" + update-browserslist-db "^1.1.3" bser@2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== dependencies: node-int64 "^0.4.0" buffer-alloc-unsafe@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== buffer-alloc@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== dependencies: buffer-alloc-unsafe "^1.1.0" @@ -4061,27 +4379,36 @@ buffer-alloc@^1.2.0: buffer-fill@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" integrity sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ== buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer-from@~0.1.1: version "0.1.2" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-0.1.2.tgz#15f4b9bcef012044df31142c14333caf6e0260d0" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-0.1.2.tgz#15f4b9bcef012044df31142c14333caf6e0260d0" integrity sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg== +buffer-okam@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer-okam/-/buffer-okam-4.9.2.tgz#63225572fbf6626dc1225736068b0720f4f360b0" + integrity sha512-t+vozme+an7flUs6GXHGMiP3PdodTse1NgRHSDWioIFJAtmMlj3pj7qD20Mkr9hZy0+9HA4R0xcumpMewrRdZQ== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + buffer-xor@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== buffer@^4.3.0: version "4.9.2" - resolved "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== dependencies: base64-js "^1.0.2" @@ -4090,31 +4417,36 @@ buffer@^4.3.0: builtin-status-codes@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== builtins@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ== bundle-name@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz#ba59bcc9ac785fb67ccdbf104a2bf60c099f0e1a" + resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-3.0.0.tgz#ba59bcc9ac785fb67ccdbf104a2bf60c099f0e1a" integrity sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw== dependencies: run-applescript "^5.0.0" busboy@^1.0.0: version "1.6.0" - resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== dependencies: streamsearch "^1.1.0" +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + cacache@^10.0.0: version "10.0.4" - resolved "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" integrity sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA== dependencies: bluebird "^3.5.1" @@ -4133,7 +4465,7 @@ cacache@^10.0.0: cacache@^9.2.9: version "9.3.0" - resolved "https://registry.npmjs.org/cacache/-/cacache-9.3.0.tgz#9cd58f2dd0b8c8cacf685b7067b416d6d3cf9db1" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-9.3.0.tgz#9cd58f2dd0b8c8cacf685b7067b416d6d3cf9db1" integrity sha512-Vbi8J1XfC8v+FbQ6QkOtKXsHpPnB0i9uMeYFJoj40EbdOsEqWB3DPpNjfsnYBkqOPYA8UvrqH6FZPpBP0zdN7g== dependencies: bluebird "^3.5.0" @@ -4150,23 +4482,40 @@ cacache@^9.2.9: unique-filename "^1.1.0" y18n "^3.2.1" -call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5, call-bind@~1.0.2: - version "1.0.5" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" - integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== dependencies: + es-errors "^1.3.0" function-bind "^1.1.2" - get-intrinsic "^1.2.1" - set-function-length "^1.1.1" + +call-bind@^1.0.2, call-bind@^1.0.7, call-bind@^1.0.8, call-bind@~1.0.2: + version "1.0.8" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" + get-intrinsic "^1.2.4" + set-function-length "^1.2.2" + +call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" callsites@^3.0.0: version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camel-case@^4.1.1, camel-case@^4.1.2: version "4.1.2" - resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== dependencies: pascal-case "^3.1.2" @@ -4174,7 +4523,7 @@ camel-case@^4.1.1, camel-case@^4.1.2: camelcase-keys@^6.2.2: version "6.2.2" - resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== dependencies: camelcase "^5.3.1" @@ -4183,60 +4532,63 @@ camelcase-keys@^6.2.2: camelcase@^1.0.2: version "1.2.1" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" integrity sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g== camelcase@^4.0.0: version "4.1.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw== camelcase@^5.3.1: version "5.3.1" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== camelcase@^6.2.0: version "6.3.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== camelize@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" + resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== -caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001541: - version "1.0.30001562" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001562.tgz#9d16c5fd7e9c592c4cd5e304bc0f75b0008b2759" - integrity sha512-kfte3Hym//51EdX4239i+Rmp20EsLIYGdPkERegTgU19hQWCRhsRFGKHTliUlsry53tv17K7n077Kqa0WJU4ng== +caniuse-lite@^1.0.30001702, caniuse-lite@^1.0.30001726: + version "1.0.30001731" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001731.tgz#277c07416ea4613ec564e5b0ffb47e7b60f32e2f" + integrity sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg== capture-stack-trace@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.2.tgz#1c43f6b059d4249e7f3f8724f15f048b927d3a8a" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.2.tgz#1c43f6b059d4249e7f3f8724f15f048b927d3a8a" integrity sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w== ccount@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== center-align@^0.1.1: version "0.1.3" - resolved "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" integrity sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ== dependencies: align-text "^0.1.3" lazy-cache "^1.0.3" -chalk@5.3.0: - version "5.3.0" - resolved "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" - integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== +chalk@4, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" chalk@^1.1.1: version "1.1.3" - resolved "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== dependencies: ansi-styles "^2.2.1" @@ -4247,49 +4599,46 @@ chalk@^1.1.1: chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" +chalk@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.4.1.tgz#1b48bf0963ec158dce2aacf69c093ae2dd2092d8" + integrity sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w== character-entities-html4@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" + resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== character-entities-legacy@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== character-entities@^2.0.0: version "2.0.2" - resolved "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== character-reference-invalid@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9" integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== chardet@^0.7.0: version "0.7.0" - resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -chokidar@3.5.3, "chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3: +chokidar@3.5.3: version "3.5.3" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: anymatch "~3.1.2" @@ -4302,105 +4651,122 @@ chokidar@3.5.3, "chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chokidar@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" + integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== + dependencies: + readdirp "^4.0.1" + chownr@^1.0.1: version "1.1.4" - resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== ci-info@^1.5.0: version "1.6.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== ci-info@^3.2.0: version "3.9.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + version "1.0.6" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.6.tgz#8fe672437d01cd6c4561af5334e0cc50ff1955f7" + integrity sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw== dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" + inherits "^2.0.4" + safe-buffer "^5.2.1" classcat@^5.0.3, classcat@^5.0.4: - version "5.0.4" - resolved "https://registry.npmjs.org/classcat/-/classcat-5.0.4.tgz#e12d1dfe6df6427f260f03b80dc63571a5107ba6" - integrity sha512-sbpkOw6z413p+HDGcBENe498WM9woqWHiJxCq7nvmxe9WmrUmqfAcxpIwAiMtM5Q3AhYkzXcNQHqsWq0mND51g== + version "5.0.5" + resolved "https://registry.yarnpkg.com/classcat/-/classcat-5.0.5.tgz#8c209f359a93ac302404a10161b501eba9c09c77" + integrity sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w== -classnames@2.3.2, classnames@2.x, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1, classnames@^2.3.2: +classnames@2.3.2: version "2.3.2" - resolved "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== -classnames@^2.5.1: +classnames@2.x, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1, classnames@^2.3.2, classnames@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== clean-css@^5.2.2: - version "5.3.2" - resolved "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz#70ecc7d4d4114921f5d298349ff86a31a9975224" - integrity sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww== + version "5.3.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.3.tgz#b330653cd3bd6b75009cc25c714cae7b93351ccd" + integrity sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg== dependencies: source-map "~0.6.0" cli-boxes@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" integrity sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg== cli-cursor@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw== dependencies: restore-cursor "^2.0.0" -cli-cursor@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea" - integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== +cli-cursor@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-5.0.0.tgz#24a4831ecf5a6b01ddeb32fb71a4b2088b0dce38" + integrity sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw== dependencies: - restore-cursor "^4.0.0" + restore-cursor "^5.0.0" cli-spinners@^1.0.1: version "1.3.1" - resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg== -cli-truncate@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" - integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== +cli-truncate@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a" + integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== dependencies: slice-ansi "^5.0.0" - string-width "^5.0.0" + string-width "^7.0.0" cli-width@^2.0.0: version "2.2.1" - resolved "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== -click-to-react-component@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/click-to-react-component/-/click-to-react-component-1.0.8.tgz#bcad2f4551dde67c54cec77e02791c7ecda50e5a" - integrity sha512-YBNYOp00udy+NBEnUmM/3Df0Yco1iHNQ8k0ltlJVcDYK9AuYt14xPoJicBh/BokLqbzkci1p+pbdY5r4JXZC4g== +click-to-react-component@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/click-to-react-component/-/click-to-react-component-1.1.0.tgz#6268659153881d9e6052deee54b1716c63706ff6" + integrity sha512-/DjZemufS1BkxyRgZL3r7HXVVOFRWVQi5Xd4EBnjxZMwrHEh0OlUVA2N9CjXkZ0x8zMf8dL1cKnnx+xUWUg4VA== dependencies: "@floating-ui/react-dom-interactions" "^0.3.1" htm "^3.1.0" react-merge-refs "^1.1.0" -client-only@^0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" - integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== - cliui@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" integrity sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA== dependencies: center-align "^0.1.1" @@ -4409,7 +4775,7 @@ cliui@^2.1.0: cliui@^8.0.1: version "8.0.1" - resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: string-width "^4.2.0" @@ -4418,12 +4784,12 @@ cliui@^8.0.1: clone@^2.1.1: version "2.1.2" - resolved "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== coa@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== dependencies: "@types/q" "^1.5.1" @@ -4432,12 +4798,12 @@ coa@^2.0.2: codesandbox-import-util-types@^2.2.3: version "2.2.3" - resolved "https://registry.npmjs.org/codesandbox-import-util-types/-/codesandbox-import-util-types-2.2.3.tgz#b354b2f732ad130e119ebd9ead3bda3be5981a54" + resolved "https://registry.yarnpkg.com/codesandbox-import-util-types/-/codesandbox-import-util-types-2.2.3.tgz#b354b2f732ad130e119ebd9ead3bda3be5981a54" integrity sha512-Qj00p60oNExthP2oR3vvXmUGjukij+rxJGuiaKM6tyUmSyimdZsqHI/TUvFFClAffk9s7hxGnQgWQ8KCce27qQ== codesandbox-import-utils@^2.2.3: version "2.2.3" - resolved "https://registry.npmjs.org/codesandbox-import-utils/-/codesandbox-import-utils-2.2.3.tgz#f7b4801245b381cb8c90fe245e336624e19b6c84" + resolved "https://registry.yarnpkg.com/codesandbox-import-utils/-/codesandbox-import-utils-2.2.3.tgz#f7b4801245b381cb8c90fe245e336624e19b6c84" integrity sha512-ymtmcgZKU27U+nM2qUb21aO8Ut/u2S9s6KorOgG81weP+NA0UZkaHKlaRqbLJ9h4i/4FLvwmEXYAnTjNmp6ogg== dependencies: codesandbox-import-util-types "^2.2.3" @@ -4446,7 +4812,7 @@ codesandbox-import-utils@^2.2.3: codesandbox@^2.2.3: version "2.2.3" - resolved "https://registry.npmjs.org/codesandbox/-/codesandbox-2.2.3.tgz#092de403506d9e4c5358cd61dc84068c3ee8ceea" + resolved "https://registry.yarnpkg.com/codesandbox/-/codesandbox-2.2.3.tgz#092de403506d9e4c5358cd61dc84068c3ee8ceea" integrity sha512-IAkWFk6UUglOhSemI7UFgNNL/jgg+1YjVEIllFULLgsaHhFnY51pCqAifMNuAd5d9Zp4Nk/xMgrEaGNV0L4Xlg== dependencies: axios "^0.18.1" @@ -4473,31 +4839,31 @@ codesandbox@^2.2.3: color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@1.1.3: version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== color-string@^1.6.0: version "1.9.1" - resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== dependencies: color-name "^1.0.0" @@ -4505,7 +4871,7 @@ color-string@^1.6.0: color@^3.1.2: version "3.2.1" - resolved "https://registry.npmjs.org/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== dependencies: color-convert "^1.9.3" @@ -4513,27 +4879,27 @@ color@^3.1.2: colorette@^2.0.20: version "2.0.20" - resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== comma-separated-tokens@^2.0.0: version "2.0.3" - resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== -commander@11.1.0: - version "11.1.0" - resolved "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906" - integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== - commander@7, commander@^7.2.0: version "7.2.0" - resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== +commander@^13.1.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-13.1.0.tgz#776167db68c78f38dcce1f9b8d7b8b9a488abf46" + integrity sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw== + commander@^2.20.0, commander@^2.9.0: version "2.20.3" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== commander@^4.0.0: @@ -4543,40 +4909,60 @@ commander@^4.0.0: commander@^8.3.0: version "8.3.0" - resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== common-path-prefix@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" + resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== compare-func@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" + resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== dependencies: array-ify "^1.0.0" dot-prop "^5.1.0" complex.js@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/complex.js/-/complex.js-2.1.1.tgz#0675dac8e464ec431fb2ab7d30f41d889fb25c31" - integrity sha512-8njCHOTtFFLtegk6zQo0kkVX1rngygb/KQI6z1qZxlFI3scluC+LVTCFbrkWjBv4vvLlbQ9t88IPMC6k95VTTg== + version "2.4.2" + resolved "https://registry.yarnpkg.com/complex.js/-/complex.js-2.4.2.tgz#76f260a9e7e232d8ad26348484a9b128c13fcc9a" + integrity sha512-qtx7HRhPGSCBtGiST4/WGHuW+zeaND/6Ld+db6PbrulIB1i2Ev/2UPiqcmpQNPSyfBKraC0EOvOKCB5dGZKt3g== + +compressible@~2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.8.1" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.8.1.tgz#4a45d909ac16509195a9a28bd91094889c180d79" + integrity sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w== + dependencies: + bytes "3.1.2" + compressible "~2.0.18" + debug "2.6.9" + negotiator "~0.6.4" + on-headers "~1.1.0" + safe-buffer "5.2.1" + vary "~1.1.2" compute-scroll-into-view@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz#753f11d972596558d8fe7c6bcbc8497690ab4c87" - integrity sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg== + version "3.1.1" + resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz#02c3386ec531fb6a9881967388e53e8564f3e9aa" + integrity sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== concat-stream@^1.5.0, concat-stream@^1.5.2: version "1.6.2" - resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== dependencies: buffer-from "^1.0.0" @@ -4586,7 +4972,7 @@ concat-stream@^1.5.0, concat-stream@^1.5.2: configstore@^3.0.0: version "3.1.5" - resolved "https://registry.npmjs.org/configstore/-/configstore-3.1.5.tgz#e9af331fadc14dabd544d3e7e76dc446a09a530f" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.5.tgz#e9af331fadc14dabd544d3e7e76dc446a09a530f" integrity sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA== dependencies: dot-prop "^4.2.1" @@ -4596,38 +4982,55 @@ configstore@^3.0.0: write-file-atomic "^2.0.0" xdg-basedir "^3.0.0" +connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== + console-browserify@^1.1.0: version "1.2.0" - resolved "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== constants-browserify@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + contour_plot@^0.0.1: version "0.0.1" - resolved "https://registry.npmjs.org/contour_plot/-/contour_plot-0.0.1.tgz#475870f032b8e338412aa5fc507880f0bf495c77" + resolved "https://registry.yarnpkg.com/contour_plot/-/contour_plot-0.0.1.tgz#475870f032b8e338412aa5fc507880f0bf495c77" integrity sha512-Nil2HI76Xux6sVGORvhSS8v66m+/h5CwFkBJDO+U5vWaMdNC0yXNCsGDPbzPhvqOEU5koebhdEvD372LI+IyLw== -conventional-changelog-angular@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-6.0.0.tgz#a9a9494c28b7165889144fd5b91573c4aa9ca541" - integrity sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg== +conventional-changelog-angular@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz#5eec8edbff15aa9b1680a8dcfbd53e2d7eb2ba7a" + integrity sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ== dependencies: compare-func "^2.0.0" conventional-changelog-conventionalcommits@^7.0.2: version "7.0.2" - resolved "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz#aa5da0f1b2543094889e8cf7616ebe1a8f5c70d5" + resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz#aa5da0f1b2543094889e8cf7616ebe1a8f5c70d5" integrity sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w== dependencies: compare-func "^2.0.0" conventional-commits-parser@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz#57f3594b81ad54d40c1b4280f04554df28627d9a" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz#57f3594b81ad54d40c1b4280f04554df28627d9a" integrity sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA== dependencies: JSONStream "^1.3.5" @@ -4637,24 +5040,34 @@ conventional-commits-parser@^5.0.0: convert-source-map@^1.5.0: version "1.9.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== convert-source-map@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" + integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== + copy-anything@^2.0.1: version "2.0.6" - resolved "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz#092454ea9584a7b7ad5573062b2a87f5900fc480" + resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-2.0.6.tgz#092454ea9584a7b7ad5573062b2a87f5900fc480" integrity sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw== dependencies: is-what "^3.14.1" copy-concurrently@^1.0.0: version "1.0.5" - resolved "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== dependencies: aproba "^1.1.1" @@ -4666,34 +5079,34 @@ copy-concurrently@^1.0.0: copy-to-clipboard@^3.3.1, copy-to-clipboard@^3.3.3: version "3.3.3" - resolved "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" + resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA== dependencies: toggle-selection "^1.0.6" core-js-pure@^3.23.3: - version "3.33.2" - resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.33.2.tgz#644830db2507ef84d068a70980ccd99c275f5fa6" - integrity sha512-a8zeCdyVk7uF2elKIGz67AjcXOxjRbwOLz8SbklEso1V+2DoW4OkAMZN9S9GBgvZIaqQi/OemFX4OiSoQEmg1Q== + version "3.44.0" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.44.0.tgz#6e9d6c128c8b967c5eac4f181c2b654d85c28090" + integrity sha512-gvMQAGB4dfVUxpYD0k3Fq8J+n5bB6Ytl15lqlZrOIXFzxOhtPaObfkQGHtMRdyjIf7z2IeNULwi1jEwyS+ltKQ== -core-js@3.28.0: - version "3.28.0" - resolved "https://registry.npmjs.org/core-js/-/core-js-3.28.0.tgz#ed8b9e99c273879fdfff0edfc77ee709a5800e4a" - integrity sha512-GiZn9D4Z/rSYvTeg1ljAIsEqFm0LaN9gVtwDCrKL80zHtS31p9BAjmTxVqTQDMpwlMolJZOFntUG2uwyj7DAqw== +core-js@3.34.0: + version "3.34.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.34.0.tgz#5705e6ad5982678612e96987d05b27c6c7c274a5" + integrity sha512-aDdvlDder8QmY91H88GzNi9EtQi2TjvQhpCX6B1v/dAZHU1AuLgHvRh54RiOerpEhEW46Tkf+vgAViB/CWC0ag== core-js@^2.4.0: version "2.6.12" - resolved "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-util-is@~1.0.0: version "1.0.3" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cors@^2.8.5: version "2.8.5" - resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== dependencies: object-assign "^4" @@ -4701,28 +5114,28 @@ cors@^2.8.5: cose-base@^1.0.0: version "1.0.3" - resolved "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz#650334b41b869578a543358b80cda7e0abe0a60a" + resolved "https://registry.yarnpkg.com/cose-base/-/cose-base-1.0.3.tgz#650334b41b869578a543358b80cda7e0abe0a60a" integrity sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg== dependencies: layout-base "^1.0.0" cose-base@^2.2.0: version "2.2.0" - resolved "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz#1c395c35b6e10bb83f9769ca8b817d614add5c01" + resolved "https://registry.yarnpkg.com/cose-base/-/cose-base-2.2.0.tgz#1c395c35b6e10bb83f9769ca8b817d614add5c01" integrity sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g== dependencies: layout-base "^2.0.0" cosmiconfig-typescript-loader@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.0.0.tgz#0d3becfe022a871f7275ceb2397d692e06045dc8" - integrity sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA== + version "5.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.1.0.tgz#d8d02bff04e63faa2dc794d618168bd764c704be" + integrity sha512-7PtBB+6FdsOvZyJtlF3hEPpACq7RQX6BVGsgC7/lfVXnKMvNCu/XY3ykreqG5w/rBNdu2z8LCIKoF3kpHHdHlA== dependencies: - jiti "^1.19.1" + jiti "^1.21.6" cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: version "7.1.0" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== dependencies: "@types/parse-json" "^4.0.0" @@ -4733,7 +5146,7 @@ cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: cosmiconfig@^8.3.6: version "8.3.6" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== dependencies: import-fresh "^3.3.0" @@ -4741,9 +5154,19 @@ cosmiconfig@^8.3.6: parse-json "^5.2.0" path-type "^4.0.0" -create-ecdh@^4.0.0: +cosmiconfig@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" + integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== + dependencies: + env-paths "^2.2.1" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + +create-ecdh@^4.0.4: version "4.0.4" - resolved "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== dependencies: bn.js "^4.1.0" @@ -4751,14 +5174,14 @@ create-ecdh@^4.0.0: create-error-class@^3.0.0: version "3.0.2" - resolved "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" integrity sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw== dependencies: capture-stack-trace "^1.0.0" -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: +create-hash@^1.1.0, create-hash@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== dependencies: cipher-base "^1.0.1" @@ -4767,9 +5190,19 @@ create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: ripemd160 "^2.0.1" sha.js "^2.4.0" -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: +create-hash@~1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" + integrity sha512-snRpch/kwQhcdlnZKYanNF1m0RDlrCdSKQaH87w1FCFPVPNCQ/Il9QJKAX2jVBZddRdaHBMC+zXa9Gw9tmkNUA== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + ripemd160 "^2.0.0" + sha.js "^2.4.0" + +create-hmac@^1.1.7: version "1.1.7" - resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== dependencies: cipher-base "^1.0.3" @@ -4780,93 +5213,94 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: sha.js "^2.4.8" cronstrue@^2.11.0: - version "2.44.0" - resolved "https://registry.npmjs.org/cronstrue/-/cronstrue-2.44.0.tgz#d843ec59182bb4034a1b379ca0c5463af164ee08" - integrity sha512-71aQD16uXrqjDUYHsFYY4/SSmEepzQZqTqWsU9x2kDMCYKyIp/5e0QW/cp2lBNO9PJB1xOpIbBJuQEa5yKx98A== + version "2.61.0" + resolved "https://registry.yarnpkg.com/cronstrue/-/cronstrue-2.61.0.tgz#97c79c77045c052afb44cb9f5f8eaf54398094f2" + integrity sha512-ootN5bvXbIQI9rW94+QsXN5eROtXWwew6NkdGxIRpS/UFWRggL0G5Al7a9GTBFEsuvVhJ2K3CntIIVt7L2ILhA== cross-env@^7.0.3: version "7.0.3" - resolved "https://registry.npmmirror.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== dependencies: cross-spawn "^7.0.1" cross-fetch@4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz#f037aef1580bb3a1a35164ea2a848ba81b445983" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-4.0.0.tgz#f037aef1580bb3a1a35164ea2a848ba81b445983" integrity sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g== dependencies: node-fetch "^2.6.12" cross-spawn@^5.0.1: version "5.1.0" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== dependencies: lru-cache "^4.0.1" shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== +cross-spawn@^7.0.1, cross-spawn@^7.0.3, cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" which "^2.0.1" crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + version "3.12.1" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.1.tgz#bb8921bec9acc81633379aa8f52d69b0b69e0dac" + integrity sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ== dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" + browserify-cipher "^1.0.1" + browserify-sign "^4.2.3" + create-ecdh "^4.0.4" + create-hash "^1.2.0" + create-hmac "^1.1.7" + diffie-hellman "^5.0.3" + hash-base "~3.0.4" + inherits "^2.0.4" + pbkdf2 "^3.1.2" + public-encrypt "^4.0.3" + randombytes "^2.1.0" + randomfill "^1.0.4" crypto-random-string@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" integrity sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg== css-blank-pseudo@^3.0.3: version "3.0.3" - resolved "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz#36523b01c12a25d812df343a32c322d2a2324561" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz#36523b01c12a25d812df343a32c322d2a2324561" integrity sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ== dependencies: postcss-selector-parser "^6.0.9" css-box-model@^1.2.0: version "1.2.1" - resolved "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz#59951d3b81fd6b2074a62d49444415b0d2b4d7c1" + resolved "https://registry.yarnpkg.com/css-box-model/-/css-box-model-1.2.1.tgz#59951d3b81fd6b2074a62d49444415b0d2b4d7c1" integrity sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw== dependencies: tiny-invariant "^1.0.6" css-color-keywords@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" + resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== css-has-pseudo@^3.0.4: version "3.0.4" - resolved "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz#57f6be91ca242d5c9020ee3e51bbb5b89fc7af73" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz#57f6be91ca242d5c9020ee3e51bbb5b89fc7af73" integrity sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw== dependencies: postcss-selector-parser "^6.0.9" css-loader@6.7.1: version "6.7.1" - resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz#e98106f154f6e1baf3fc3bc455cb9981c1d5fd2e" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.1.tgz#e98106f154f6e1baf3fc3bc455cb9981c1d5fd2e" integrity sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw== dependencies: icss-utils "^5.1.0" @@ -4880,17 +5314,17 @@ css-loader@6.7.1: css-prefers-color-scheme@^6.0.3: version "6.0.3" - resolved "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz#ca8a22e5992c10a5b9d315155e7caee625903349" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz#ca8a22e5992c10a5b9d315155e7caee625903349" integrity sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA== css-select-base-adapter@^0.1.1: version "0.1.1" - resolved "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== css-select@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== dependencies: boolbase "^1.0.0" @@ -4900,7 +5334,7 @@ css-select@^2.0.0: css-select@^4.1.3: version "4.3.0" - resolved "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== dependencies: boolbase "^1.0.0" @@ -4911,7 +5345,7 @@ css-select@^4.1.3: css-to-react-native@^3.0.0: version "3.2.0" - resolved "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz#cdd8099f71024e149e4f6fe17a7d46ecd55f1e32" + resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.2.0.tgz#cdd8099f71024e149e4f6fe17a7d46ecd55f1e32" integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ== dependencies: camelize "^1.0.0" @@ -4920,7 +5354,7 @@ css-to-react-native@^3.0.0: css-tree@1.0.0-alpha.37: version "1.0.0-alpha.37" - resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== dependencies: mdn-data "2.0.4" @@ -4928,7 +5362,7 @@ css-tree@1.0.0-alpha.37: css-tree@^1.1.2, css-tree@^1.1.3: version "1.1.3" - resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== dependencies: mdn-data "2.0.14" @@ -4936,17 +5370,17 @@ css-tree@^1.1.2, css-tree@^1.1.3: css-what@^3.2.1: version "3.4.2" - resolved "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== css-what@^6.0.1: - version "6.1.0" - resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" - integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + version "6.2.2" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.2.2.tgz#cdcc8f9b6977719fdfbd1de7aec24abf756b9dea" + integrity sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA== css@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/css/-/css-3.0.0.tgz#4447a4d58fdd03367c516ca9f64ae365cee4aa5d" + resolved "https://registry.yarnpkg.com/css/-/css-3.0.0.tgz#4447a4d58fdd03367c516ca9f64ae365cee4aa5d" integrity sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ== dependencies: inherits "^2.0.4" @@ -4955,85 +5389,77 @@ css@^3.0.0: cssdb@^6.6.1: version "6.6.3" - resolved "https://registry.npmjs.org/cssdb/-/cssdb-6.6.3.tgz#1f331a2fab30c18d9f087301e6122a878bb1e505" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-6.6.3.tgz#1f331a2fab30c18d9f087301e6122a878bb1e505" integrity sha512-7GDvDSmE+20+WcSMhP17Q1EVWUrLlbxxpMDqG731n8P99JhnQZHR9YvtjPvEHfjFUjvQJvdpKCjlKOX+xe4UVA== cssesc@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== csso@^4.0.2, csso@^4.2.0: version "4.2.0" - resolved "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== dependencies: css-tree "^1.1.2" -csstype@^3.0.10, csstype@^3.0.2, csstype@^3.0.8: - version "3.1.2" - resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" - integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== - -csstype@^3.1.3: +csstype@^3.0.2, csstype@^3.0.8, csstype@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== current-script-polyfill@1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/current-script-polyfill/-/current-script-polyfill-1.0.0.tgz#f31cf7e4f3e218b0726e738ca92a02d3488ef615" + resolved "https://registry.yarnpkg.com/current-script-polyfill/-/current-script-polyfill-1.0.0.tgz#f31cf7e4f3e218b0726e738ca92a02d3488ef615" integrity sha512-qv8s+G47V6Hq+g2kRE5th+ASzzrL7b6l+tap1DHKK25ZQJv3yIFhH96XaQ7NGL+zRW3t/RDbweJf/dJDe5Z5KA== cwd@^0.9.1: version "0.9.1" - resolved "https://registry.npmjs.org/cwd/-/cwd-0.9.1.tgz#41e10a7e1ab833dc59c2eca83814c7de77b5a4fd" + resolved "https://registry.yarnpkg.com/cwd/-/cwd-0.9.1.tgz#41e10a7e1ab833dc59c2eca83814c7de77b5a4fd" integrity sha512-4+0D+ojEasdLndYX4Cqff057I/Jp6ysXpwKkdLQLnZxV8f6IYZmZtTP5uqD91a/kWqejoc0sSqK4u8wpTKCh8A== dependencies: find-pkg "^0.1.0" cyclist@^1.0.1: version "1.0.2" - resolved "https://registry.npmjs.org/cyclist/-/cyclist-1.0.2.tgz#673b5f233bf34d8e602b949429f8171d9121bea3" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.2.tgz#673b5f233bf34d8e602b949429f8171d9121bea3" integrity sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA== cytoscape-cose-bilkent@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz#762fa121df9930ffeb51a495d87917c570ac209b" + resolved "https://registry.yarnpkg.com/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz#762fa121df9930ffeb51a495d87917c570ac209b" integrity sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ== dependencies: cose-base "^1.0.0" cytoscape-fcose@^2.1.0: version "2.2.0" - resolved "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz#e4d6f6490df4fab58ae9cea9e5c3ab8d7472f471" + resolved "https://registry.yarnpkg.com/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz#e4d6f6490df4fab58ae9cea9e5c3ab8d7472f471" integrity sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ== dependencies: cose-base "^2.2.0" cytoscape@^3.23.0: - version "3.27.0" - resolved "https://registry.npmjs.org/cytoscape/-/cytoscape-3.27.0.tgz#5141cd694570807c91075b609181bce102e0bb88" - integrity sha512-pPZJilfX9BxESwujODz5pydeGi+FBrXq1rcaB1mfhFXXFJ9GjE6CNndAk+8jPzoXGD+16LtSS4xlYEIUiW4Abg== - dependencies: - heap "^0.2.6" - lodash "^4.17.21" + version "3.33.0" + resolved "https://registry.yarnpkg.com/cytoscape/-/cytoscape-3.33.0.tgz#c08136096f568d0f9b438406ec722f1a093b4e16" + integrity sha512-2d2EwwhaxLWC8ahkH1PpQwCyu6EY3xDRdcEJXrLTb4fOUtVc+YWQalHU67rFS1a6ngj1fgv9dQLtJxP/KAFZEw== "d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.2.0: version "3.2.4" - resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5" integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== dependencies: internmap "1 - 2" d3-axis@3: version "3.0.0" - resolved "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz#c42a4a13e8131d637b745fc2973824cfeaf93322" + resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-3.0.0.tgz#c42a4a13e8131d637b745fc2973824cfeaf93322" integrity sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw== d3-brush@3: version "3.0.0" - resolved "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz#6f767c4ed8dcb79de7ede3e1c0f89e63ef64d31c" + resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-3.0.0.tgz#6f767c4ed8dcb79de7ede3e1c0f89e63ef64d31c" integrity sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ== dependencies: d3-dispatch "1 - 3" @@ -5044,38 +5470,38 @@ d3-brush@3: d3-chord@3: version "3.0.1" - resolved "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz#d156d61f485fce8327e6abf339cb41d8cbba6966" + resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-3.0.1.tgz#d156d61f485fce8327e6abf339cb41d8cbba6966" integrity sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g== dependencies: d3-path "1 - 3" "d3-color@1 - 3", d3-color@3: version "3.1.0" - resolved "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== d3-contour@4: version "4.0.2" - resolved "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz#bb92063bc8c5663acb2422f99c73cbb6c6ae3bcc" + resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-4.0.2.tgz#bb92063bc8c5663acb2422f99c73cbb6c6ae3bcc" integrity sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA== dependencies: d3-array "^3.2.0" d3-delaunay@6: version "6.0.4" - resolved "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz#98169038733a0a5babbeda55054f795bb9e4a58b" + resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-6.0.4.tgz#98169038733a0a5babbeda55054f795bb9e4a58b" integrity sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A== dependencies: delaunator "5" "d3-dispatch@1 - 3", d3-dispatch@3: version "3.0.1" - resolved "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e" + resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e" integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== "d3-drag@2 - 3", d3-drag@3, d3-drag@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz#994aae9cd23c719f53b5e10e3a0a6108c69607ba" + resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-3.0.0.tgz#994aae9cd23c719f53b5e10e3a0a6108c69607ba" integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg== dependencies: d3-dispatch "1 - 3" @@ -5083,7 +5509,7 @@ d3-delaunay@6: "d3-dsv@1 - 3", d3-dsv@3: version "3.0.1" - resolved "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz#c63af978f4d6a0d084a52a673922be2160789b73" + resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-3.0.1.tgz#c63af978f4d6a0d084a52a673922be2160789b73" integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q== dependencies: commander "7" @@ -5092,24 +5518,24 @@ d3-delaunay@6: "d3-ease@1 - 3", d3-ease@3: version "3.0.1" - resolved "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4" + resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4" integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== d3-ease@^1.0.5: version "1.0.7" - resolved "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz#9a834890ef8b8ae8c558b2fe55bd57f5993b85e2" + resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.7.tgz#9a834890ef8b8ae8c558b2fe55bd57f5993b85e2" integrity sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ== d3-fetch@3: version "3.0.1" - resolved "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz#83141bff9856a0edb5e38de89cdcfe63d0a60a22" + resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-3.0.1.tgz#83141bff9856a0edb5e38de89cdcfe63d0a60a22" integrity sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw== dependencies: d3-dsv "1 - 3" d3-force@3: version "3.0.0" - resolved "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz#3e2ba1a61e70888fe3d9194e30d6d14eece155c4" + resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-3.0.0.tgz#3e2ba1a61e70888fe3d9194e30d6d14eece155c4" integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg== dependencies: d3-dispatch "1 - 3" @@ -5118,69 +5544,69 @@ d3-force@3: "d3-format@1 - 3", d3-format@3: version "3.1.0" - resolved "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641" integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== d3-geo@3: - version "3.1.0" - resolved "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz#74fd54e1f4cebd5185ac2039217a98d39b0a4c0e" - integrity sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA== + version "3.1.1" + resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-3.1.1.tgz#6027cf51246f9b2ebd64f99e01dc7c3364033a4d" + integrity sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q== dependencies: d3-array "2.5.0 - 3" d3-hierarchy@3: version "3.1.2" - resolved "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz#b01cd42c1eed3d46db77a5966cf726f8c09160c6" + resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz#b01cd42c1eed3d46db77a5966cf726f8c09160c6" integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA== d3-hierarchy@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-2.0.0.tgz#dab88a58ca3e7a1bc6cab390e89667fcc6d20218" + resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-2.0.0.tgz#dab88a58ca3e7a1bc6cab390e89667fcc6d20218" integrity sha512-SwIdqM3HxQX2214EG9GTjgmCc/mbSx4mQBn+DuEETubhOw6/U3fmnji4uCVrmzOydMHSO1nZle5gh6HB/wdOzw== "d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@3, d3-interpolate@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== dependencies: d3-color "1 - 3" "d3-path@1 - 3", d3-path@3, d3-path@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526" integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== d3-polygon@3: version "3.0.1" - resolved "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz#0b45d3dd1c48a29c8e057e6135693ec80bf16398" + resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-3.0.1.tgz#0b45d3dd1c48a29c8e057e6135693ec80bf16398" integrity sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg== "d3-quadtree@1 - 3", d3-quadtree@3: version "3.0.1" - resolved "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f" + resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f" integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw== d3-random@3: version "3.0.1" - resolved "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz#d4926378d333d9c0bfd1e6fa0194d30aebaa20f4" + resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-3.0.1.tgz#d4926378d333d9c0bfd1e6fa0194d30aebaa20f4" integrity sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ== d3-regression@^1.3.5: version "1.3.10" - resolved "https://registry.npmjs.org/d3-regression/-/d3-regression-1.3.10.tgz#d1a411ab45044d9e8d5b8aec05f2e598e1a621c9" + resolved "https://registry.yarnpkg.com/d3-regression/-/d3-regression-1.3.10.tgz#d1a411ab45044d9e8d5b8aec05f2e598e1a621c9" integrity sha512-PF8GWEL70cHHWpx2jUQXc68r1pyPHIA+St16muk/XRokETzlegj5LriNKg7o4LR0TySug4nHYPJNNRz/W+/Niw== d3-scale-chromatic@3: - version "3.0.0" - resolved "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz#15b4ceb8ca2bb0dcb6d1a641ee03d59c3b62376a" - integrity sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g== + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz#34c39da298b23c20e02f1a4b239bd0f22e7f1314" + integrity sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ== dependencies: d3-color "1 - 3" d3-interpolate "1 - 3" d3-scale@4: version "4.0.2" - resolved "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396" integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== dependencies: d3-array "2.10.0 - 3" @@ -5191,43 +5617,43 @@ d3-scale@4: "d3-selection@2 - 3", d3-selection@3, d3-selection@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31" + resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31" integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== d3-shape@3: version "3.2.0" - resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5" integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== dependencies: d3-path "^3.1.0" "d3-time-format@2 - 4", d3-time-format@4: version "4.1.0" - resolved "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== dependencies: d3-time "1 - 3" "d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@3: version "3.1.0" - resolved "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7" integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== dependencies: d3-array "2 - 3" "d3-timer@1 - 3", d3-timer@3: version "3.0.1" - resolved "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== d3-timer@^1.0.9: version "1.0.10" - resolved "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5" integrity sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw== "d3-transition@2 - 3", d3-transition@3: version "3.0.1" - resolved "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz#6869fdde1448868077fdd5989200cb61b2a1645f" + resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-3.0.1.tgz#6869fdde1448868077fdd5989200cb61b2a1645f" integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w== dependencies: d3-color "1 - 3" @@ -5238,7 +5664,7 @@ d3-timer@^1.0.9: d3-zoom@3, d3-zoom@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz#d13f4165c73217ffeaa54295cd6969b3e7aee8f3" + resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-3.0.0.tgz#d13f4165c73217ffeaa54295cd6969b3e7aee8f3" integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw== dependencies: d3-dispatch "1 - 3" @@ -5248,9 +5674,9 @@ d3-zoom@3, d3-zoom@^3.0.0: d3-transition "2 - 3" d3@^7.4.0, d3@^7.8.2: - version "7.8.5" - resolved "https://registry.npmjs.org/d3/-/d3-7.8.5.tgz#fde4b760d4486cdb6f0cc8e2cbff318af844635c" - integrity sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA== + version "7.9.0" + resolved "https://registry.yarnpkg.com/d3/-/d3-7.9.0.tgz#579e7acb3d749caf8860bd1741ae8d371070cd5d" + integrity sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA== dependencies: d3-array "3" d3-axis "3" @@ -5285,7 +5711,7 @@ d3@^7.4.0, d3@^7.8.2: dagre-d3-es@7.0.9: version "7.0.9" - resolved "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.9.tgz#aca12fccd9d09955a4430029ba72ee6934542a8d" + resolved "https://registry.yarnpkg.com/dagre-d3-es/-/dagre-d3-es-7.0.9.tgz#aca12fccd9d09955a4430029ba72ee6934542a8d" integrity sha512-rYR4QfVmy+sR44IBDvVtcAmOReGBvRCWDpO2QjYwqgh9yijw6eSHBqaPG/LIOEy7aBsniLvtMW6pg19qJhq60w== dependencies: d3 "^7.8.2" @@ -5293,51 +5719,85 @@ dagre-d3-es@7.0.9: dargs@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== data-uri-to-buffer@^4.0.0: version "4.0.1" - resolved "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== +data-view-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570" + integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735" + integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-offset@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191" + integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-data-view "^1.0.1" + datauri@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/datauri/-/datauri-3.0.0.tgz#6196997e9a7bbbee81b60e8c8acb1a2c871e2349" + resolved "https://registry.yarnpkg.com/datauri/-/datauri-3.0.0.tgz#6196997e9a7bbbee81b60e8c8acb1a2c871e2349" integrity sha512-NeDFuUPV1YCpCn8MUIcDk1QnuyenUHs7f4Q5P0n9FFA0neKFrfEH9esR+YMW95BplbYfdmjbs0Pl/ZGAaM2QHQ== dependencies: image-size "0.8.3" mimer "1.1.0" -dayjs@^1.11.1, dayjs@^1.11.10, dayjs@^1.11.7, dayjs@^1.11.9, dayjs@^1.9.1: - version "1.11.10" - resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" - integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== +dayjs@^1.11.10, dayjs@^1.11.11, dayjs@^1.11.7, dayjs@^1.11.9, dayjs@^1.9.1: + version "1.11.13" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" + integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" debug@3.1.0, debug@=3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== dependencies: ms "2.0.0" -debug@4.3.4, debug@^4.0.0, debug@^4.1.0, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^3.1.0, debug@^3.2.6: +debug@^3.0.1, debug@^3.1.0: version "3.2.7" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" +debug@^4.0.0, debug@^4.1.0, debug@^4.3.1, debug@^4.3.4, debug@^4.4.0: + version "4.4.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" + integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== + dependencies: + ms "^2.1.3" + decamelize-keys@^1.1.0: version "1.1.1" - resolved "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== dependencies: decamelize "^1.1.0" @@ -5345,34 +5805,34 @@ decamelize-keys@^1.1.0: decamelize@^1.0.0, decamelize@^1.1.0: version "1.2.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== decimal.js@^10.3.1: - version "10.4.3" - resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" - integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + version "10.6.0" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.6.0.tgz#e649a43e3ab953a72192ff5983865e509f37ed9a" + integrity sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg== decode-named-character-reference@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" - integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== + version "1.2.0" + resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz#25c32ae6dd5e21889549d40f676030e9514cc0ed" + integrity sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q== dependencies: character-entities "^2.0.0" decode-uri-component@^0.2.0: version "0.2.2" - resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== dedupe@^3.0.2: version "3.0.3" - resolved "https://registry.npmjs.org/dedupe/-/dedupe-3.0.3.tgz#7ae7b55ca01028bc7d5714cd57a5bdf5e4aeea6e" + resolved "https://registry.yarnpkg.com/dedupe/-/dedupe-3.0.3.tgz#7ae7b55ca01028bc7d5714cd57a5bdf5e4aeea6e" integrity sha512-ZSCmu4uLkBWTAPSz9LXtrTNusY2P6BoghZhokPBLzpQpLiBtU0B4QXNxVnwpy7yaqFc1jN30V5BkKMr/uXqf/w== deep-equal@^1.0.1, deep-equal@~1.1.1: version "1.1.2" - resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz#78a561b7830eef3134c7f6f3a3d6af272a678761" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.2.tgz#78a561b7830eef3134c7f6f3a3d6af272a678761" integrity sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg== dependencies: is-arguments "^1.1.1" @@ -5384,25 +5844,30 @@ deep-equal@^1.0.1, deep-equal@~1.1.1: deep-extend@^0.6.0: version "0.6.0" - resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== deep-rename-keys@^0.2.1: version "0.2.1" - resolved "https://registry.npmjs.org/deep-rename-keys/-/deep-rename-keys-0.2.1.tgz#ede78537d7a66a2be61517e2af956d7f58a3f1d8" + resolved "https://registry.yarnpkg.com/deep-rename-keys/-/deep-rename-keys-0.2.1.tgz#ede78537d7a66a2be61517e2af956d7f58a3f1d8" integrity sha512-RHd9ABw4Fvk+gYDWqwOftG849x0bYOySl/RgX0tLI9i27ZIeSO91mLZJEp7oPHOMFqHvpgu21YptmDt0FYD/0A== dependencies: kind-of "^3.0.2" rename-keys "^1.1.2" +deepmerge@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753" + integrity sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ== + deepmerge@^4.2.2, deepmerge@^4.3.1: version "4.3.1" - resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== default-browser-id@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz#bee7bbbef1f4e75d31f98f4d3f1556a14cea790c" + resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-3.0.0.tgz#bee7bbbef1f4e75d31f98f4d3f1556a14cea790c" integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA== dependencies: bplist-parser "^0.2.0" @@ -5410,7 +5875,7 @@ default-browser-id@^3.0.0: default-browser@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz#53c9894f8810bf86696de117a6ce9085a3cbc7da" + resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-4.0.0.tgz#53c9894f8810bf86696de117a6ce9085a3cbc7da" integrity sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA== dependencies: bundle-name "^3.0.0" @@ -5418,28 +5883,28 @@ default-browser@^4.0.0: execa "^7.1.1" titleize "^3.0.0" -define-data-property@^1.0.1, define-data-property@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" - integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== +define-data-property@^1.0.1, define-data-property@^1.1.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: - get-intrinsic "^1.2.1" + es-define-property "^1.0.0" + es-errors "^1.3.0" gopd "^1.0.1" - has-property-descriptors "^1.0.0" define-lazy-prop@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== define-lazy-prop@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== -define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, define-properties@^1.2.1: +define-properties@^1.1.3, define-properties@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: define-data-property "^1.0.1" @@ -5448,52 +5913,62 @@ define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, de defined@~1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== delaunator@5: - version "5.0.0" - resolved "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz#60f052b28bd91c9b4566850ebf7756efe821d81b" - integrity sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw== + version "5.0.1" + resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.1.tgz#39032b08053923e924d6094fe2cde1a99cc51278" + integrity sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw== dependencies: - robust-predicates "^3.0.0" + robust-predicates "^3.0.2" + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -dequal@^2.0.0, dequal@^2.0.2: +dequal@^2.0.0, dequal@^2.0.2, dequal@^2.0.3: version "2.0.3" - resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== des.js@^1.0.0: version "1.1.0" - resolved "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da" integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== dependencies: inherits "^2.0.1" minimalistic-assert "^1.0.0" +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + detect-browser@^5.0.0, detect-browser@^5.1.0: version "5.3.0" - resolved "https://registry.npmjs.org/detect-browser/-/detect-browser-5.3.0.tgz#9705ef2bddf46072d0f7265a1fe300e36fe7ceca" + resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.3.0.tgz#9705ef2bddf46072d0f7265a1fe300e36fe7ceca" integrity sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w== detect-indent@^7.0.1: version "7.0.1" - resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.1.tgz#cbb060a12842b9c4d333f1cac4aa4da1bb66bc25" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-7.0.1.tgz#cbb060a12842b9c4d333f1cac4aa4da1bb66bc25" integrity sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g== detect-libc@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== detect-newline@^4.0.0: version "4.0.1" - resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-4.0.1.tgz#fcefdb5713e1fb8cb2839b8b6ee22e6716ab8f23" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-4.0.1.tgz#fcefdb5713e1fb8cb2839b8b6ee22e6716ab8f23" integrity sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog== detect-node@^2.0.4: version "2.1.0" - resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== diff-match-patch@^1.0.5: @@ -5502,13 +5977,13 @@ diff-match-patch@^1.0.5: integrity sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw== diff@^5.0.0: - version "5.1.0" - resolved "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" - integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== + version "5.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" + integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== -diffie-hellman@^5.0.0: +diffie-hellman@^5.0.3: version "5.0.3" - resolved "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== dependencies: bn.js "^4.1.0" @@ -5517,28 +5992,28 @@ diffie-hellman@^5.0.0: dir-glob@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: path-type "^4.0.0" doctrine@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" dom-converter@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== dependencies: utila "~0.4" dom-serializer@0: version "0.2.2" - resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== dependencies: domelementtype "^2.0.1" @@ -5546,7 +6021,7 @@ dom-serializer@0: dom-serializer@^1.0.1: version "1.4.1" - resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== dependencies: domelementtype "^2.0.1" @@ -5555,7 +6030,7 @@ dom-serializer@^1.0.1: dom-serializer@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== dependencies: domelementtype "^2.3.0" @@ -5564,41 +6039,41 @@ dom-serializer@^2.0.0: domain-browser@^1.1.1: version "1.2.0" - resolved "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== domelementtype@1: version "1.3.1" - resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: version "2.3.0" - resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: version "4.3.1" - resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== dependencies: domelementtype "^2.2.0" domhandler@^5.0.2, domhandler@^5.0.3: version "5.0.3" - resolved "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== dependencies: domelementtype "^2.3.0" dompurify@2.4.3: version "2.4.3" - resolved "https://registry.npmjs.org/dompurify/-/dompurify-2.4.3.tgz#f4133af0e6a50297fc8874e2eaedc13a3c308c03" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.3.tgz#f4133af0e6a50297fc8874e2eaedc13a3c308c03" integrity sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ== domutils@^1.7.0: version "1.7.0" - resolved "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== dependencies: dom-serializer "0" @@ -5606,7 +6081,7 @@ domutils@^1.7.0: domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" - resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== dependencies: dom-serializer "^1.0.1" @@ -5614,9 +6089,9 @@ domutils@^2.5.2, domutils@^2.8.0: domhandler "^4.2.0" domutils@^3.0.1: - version "3.1.0" - resolved "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" - integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + version "3.2.2" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78" + integrity sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw== dependencies: dom-serializer "^2.0.0" domelementtype "^2.3.0" @@ -5624,7 +6099,7 @@ domutils@^3.0.1: dot-case@^3.0.4: version "3.0.4" - resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== dependencies: no-case "^3.0.4" @@ -5632,33 +6107,33 @@ dot-case@^3.0.4: dot-prop@^4.2.1: version "4.2.1" - resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz#45884194a71fc2cda71cbb4bceb3a4dd2f433ba4" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.1.tgz#45884194a71fc2cda71cbb4bceb3a4dd2f433ba4" integrity sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ== dependencies: is-obj "^1.0.0" dot-prop@^5.1.0: version "5.3.0" - resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== dependencies: is-obj "^2.0.0" dotignore@~0.1.2: version "0.1.2" - resolved "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905" + resolved "https://registry.yarnpkg.com/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905" integrity sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw== dependencies: minimatch "^3.0.4" dumi-afx-deps@^1.0.0-alpha.19: version "1.0.0-alpha.20" - resolved "https://registry.npmjs.org/dumi-afx-deps/-/dumi-afx-deps-1.0.0-alpha.20.tgz#f50b08f08da16bc2601861bd0408404b0ef90783" + resolved "https://registry.yarnpkg.com/dumi-afx-deps/-/dumi-afx-deps-1.0.0-alpha.20.tgz#f50b08f08da16bc2601861bd0408404b0ef90783" integrity sha512-PRSJlHuJkyHDET7Hukykx/hLULkgUBX5q2CutMG5EDI3eJLzJlX634wNll10m3at1uomcDAVudL7Dgh5UOJ7IQ== dumi-assets-types@2.0.0-alpha.0: version "2.0.0-alpha.0" - resolved "https://registry.npmjs.org/dumi-assets-types/-/dumi-assets-types-2.0.0-alpha.0.tgz#46bf619ed1cb6d27bbe6a9cfe4be51e5e9589981" + resolved "https://registry.yarnpkg.com/dumi-assets-types/-/dumi-assets-types-2.0.0-alpha.0.tgz#46bf619ed1cb6d27bbe6a9cfe4be51e5e9589981" integrity sha512-a/Y5lf0G6gwsEQ9hop/n03CcjmHsGBk384Cz/AEX6mRYrfSpUx/lQvP9HLoXkCzScl9PL1sSmLPnMkgaXDCZLA== dumi-theme-nocobase@^0.2.31: @@ -5676,9 +6151,9 @@ dumi-theme-nocobase@^0.2.31: dayjs "^1.11.7" rc-drawer "^6.1.2" -dumi@^2.2.14: +dumi@2.2.14: version "2.2.14" - resolved "https://registry.npmjs.org/dumi/-/dumi-2.2.14.tgz#273605f6751640c249ca39c8a6a1537dbfca3091" + resolved "https://registry.yarnpkg.com/dumi/-/dumi-2.2.14.tgz#273605f6751640c249ca39c8a6a1537dbfca3091" integrity sha512-RM2T5kJvYhOsp0lOwlIUxXtY8YLWKpq2HAQeVUZJj20xqn2UXQuohpAxQhxKvTtzE+k0WE8mEzVShIM/3cW6YA== dependencies: "@ant-design/icons-svg" "^4.2.1" @@ -5744,21 +6219,30 @@ dumi@^2.2.14: v8-compile-cache "2.3.0" vfile "^5.3.7" +dunder-proto@^1.0.0, dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + duplexer2@^0.1.2: version "0.1.4" - resolved "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" integrity sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA== dependencies: readable-stream "^2.0.2" duplexer3@^0.1.4: version "0.1.5" - resolved "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== duplexify@^3.4.2, duplexify@^3.6.0: version "3.7.1" - resolved "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== dependencies: end-of-stream "^1.0.0" @@ -5767,42 +6251,47 @@ duplexify@^3.4.2, duplexify@^3.6.0: stream-shift "^1.0.0" duplexify@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz#18b4f8d28289132fa0b9573c898d9f903f81c7b0" - integrity sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw== + version "4.1.3" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.3.tgz#a07e1c0d0a2c001158563d32592ba58bddb0236f" + integrity sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA== dependencies: end-of-stream "^1.4.1" inherits "^2.0.3" readable-stream "^3.1.1" - stream-shift "^1.0.0" + stream-shift "^1.0.2" eastasianwidth@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== editions@^2.2.0: version "2.3.1" - resolved "https://registry.npmjs.org/editions/-/editions-2.3.1.tgz#3bc9962f1978e801312fbd0aebfed63b49bfe698" + resolved "https://registry.yarnpkg.com/editions/-/editions-2.3.1.tgz#3bc9962f1978e801312fbd0aebfed63b49bfe698" integrity sha512-ptGvkwTvGdGfC0hfhKg0MT+TRLRKGtUiWGBInxOm5pz7ssADezahjCUaYuZ8Dr+C05FW0AECIIPt4WBxVINEhA== dependencies: errlop "^2.0.0" semver "^6.3.0" -electron-to-chromium@^1.4.535: - version "1.4.587" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.587.tgz#d8b864f21338b60798d447a3d83b90753f701d07" - integrity sha512-RyJX0q/zOkAoefZhB9XHghGeATVP0Q3mwA253XD/zj2OeXc+JZB9pCaEv6R578JUYaWM9PRhye0kXvd/V1cQ3Q== +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.5.173: + version "1.5.194" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.194.tgz#05e541c3373ba8d967a65c92bc14d60608908236" + integrity sha512-SdnWJwSUot04UR51I2oPD8kuP2VI37/CADR1OHsFOUzZIvfWJBO6q11k5P/uKNyTT3cdOsnyjkrZ+DDShqYqJA== elkjs@^0.8.2: version "0.8.2" - resolved "https://registry.npmjs.org/elkjs/-/elkjs-0.8.2.tgz#c37763c5a3e24e042e318455e0147c912a7c248e" + resolved "https://registry.yarnpkg.com/elkjs/-/elkjs-0.8.2.tgz#c37763c5a3e24e042e318455e0147c912a7c248e" integrity sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ== -elliptic@^6.5.3, elliptic@^6.5.4: - version "6.5.4" - resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== +elliptic@^6.5.3, elliptic@^6.5.5: + version "6.6.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.1.tgz#3b8ffb02670bf69e382c7f65bf524c97c5405c06" + integrity sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g== dependencies: bn.js "^4.11.9" brorand "^1.1.0" @@ -5812,150 +6301,205 @@ elliptic@^6.5.3, elliptic@^6.5.4: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +emoji-regex@^10.3.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.4.0.tgz#03553afea80b3975749cfcb36f776ca268e413d4" + integrity sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw== + emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emoji-regex@^9.2.2: version "9.2.2" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== emojis-list@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +encodeurl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + encoding@^0.1.11: version "0.1.13" - resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== dependencies: iconv-lite "^0.6.2" end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: - version "1.4.4" - resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + version "1.4.5" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.5.tgz#7344d711dea40e0b74abc2ed49778743ccedb08c" + integrity sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg== dependencies: once "^1.4.0" enhanced-resolve@5.9.3: version "5.9.3" - resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88" integrity sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" -enhanced-resolve@^5.15.0: - version "5.15.0" - resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" - integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== +enhanced-resolve@^5.15.0, enhanced-resolve@^5.18.1: + version "5.18.2" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz#7903c5b32ffd4b2143eeb4b92472bd68effd5464" + integrity sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" entities@^2.0.0: version "2.2.0" - resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== entities@^4.2.0, entities@^4.4.0: version "4.5.0" - resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== +entities@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-6.0.1.tgz#c28c34a43379ca7f61d074130b2f5f7020a30694" + integrity sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g== + entities@~3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" + resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== +env-paths@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +environment@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/environment/-/environment-1.1.0.tgz#8e86c66b180f363c7ab311787e0259665f45a9f1" + integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== + err-code@^1.0.0: version "1.1.2" - resolved "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" integrity sha512-CJAN+O0/yA1CKfRn9SXOGctSpEM7DCon/r/5r2eXFMY2zCCJBasFhcM5I+1kh3Ap11FsQCX+vGHceNPvpWKhoA== errlop@^2.0.0: version "2.2.0" - resolved "https://registry.npmjs.org/errlop/-/errlop-2.2.0.tgz#1ff383f8f917ae328bebb802d6ca69666a42d21b" + resolved "https://registry.yarnpkg.com/errlop/-/errlop-2.2.0.tgz#1ff383f8f917ae328bebb802d6ca69666a42d21b" integrity sha512-e64Qj9+4aZzjzzFpZC7p5kmm/ccCrbLhAJplhsDXQFs87XTsXwOpH4s1Io2s90Tau/8r2j9f4l/thhDevRjzxw== errno@^0.1.1: version "0.1.8" - resolved "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== dependencies: prr "~1.0.1" error-ex@^1.3.1: version "1.3.2" - resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" error-stack-parser@^2.0.6: version "2.1.4" - resolved "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286" integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== dependencies: stackframe "^1.3.4" -es-abstract@^1.17.2, es-abstract@^1.22.1: - version "1.22.3" - resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32" - integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA== - dependencies: - array-buffer-byte-length "^1.0.0" - arraybuffer.prototype.slice "^1.0.2" - available-typed-arrays "^1.0.5" - call-bind "^1.0.5" - es-set-tostringtag "^2.0.1" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - get-intrinsic "^1.2.2" - get-symbol-description "^1.0.0" - globalthis "^1.0.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - internal-slot "^1.0.5" - is-array-buffer "^3.0.2" +es-abstract@^1.17.2, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23.5, es-abstract@^1.23.6, es-abstract@^1.23.9, es-abstract@^1.24.0: + version "1.24.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.24.0.tgz#c44732d2beb0acc1ed60df840869e3106e7af328" + integrity sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg== + dependencies: + array-buffer-byte-length "^1.0.2" + arraybuffer.prototype.slice "^1.0.4" + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + data-view-buffer "^1.0.2" + data-view-byte-length "^1.0.2" + data-view-byte-offset "^1.0.1" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + es-set-tostringtag "^2.1.0" + es-to-primitive "^1.3.0" + function.prototype.name "^1.1.8" + get-intrinsic "^1.3.0" + get-proto "^1.0.1" + get-symbol-description "^1.1.0" + globalthis "^1.0.4" + gopd "^1.2.0" + has-property-descriptors "^1.0.2" + has-proto "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + internal-slot "^1.1.0" + is-array-buffer "^3.0.5" is-callable "^1.2.7" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-typed-array "^1.1.12" - is-weakref "^1.0.2" - object-inspect "^1.13.1" + is-data-view "^1.0.2" + is-negative-zero "^2.0.3" + is-regex "^1.2.1" + is-set "^2.0.3" + is-shared-array-buffer "^1.0.4" + is-string "^1.1.1" + is-typed-array "^1.1.15" + is-weakref "^1.1.1" + math-intrinsics "^1.1.0" + object-inspect "^1.13.4" object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.1" - safe-array-concat "^1.0.1" - safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.8" - string.prototype.trimend "^1.0.7" - string.prototype.trimstart "^1.0.7" - typed-array-buffer "^1.0.0" - typed-array-byte-length "^1.0.0" - typed-array-byte-offset "^1.0.0" - typed-array-length "^1.0.4" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.13" + object.assign "^4.1.7" + own-keys "^1.0.1" + regexp.prototype.flags "^1.5.4" + safe-array-concat "^1.1.3" + safe-push-apply "^1.0.0" + safe-regex-test "^1.1.0" + set-proto "^1.0.0" + stop-iteration-iterator "^1.1.0" + string.prototype.trim "^1.2.10" + string.prototype.trimend "^1.0.9" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.3" + typed-array-byte-length "^1.0.3" + typed-array-byte-offset "^1.0.4" + typed-array-length "^1.0.7" + unbox-primitive "^1.1.0" + which-typed-array "^1.1.19" es-array-method-boxes-properly@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" + resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + es-get-iterator@^1.1.3: version "1.1.3" - resolved "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== dependencies: call-bind "^1.0.2" @@ -5969,98 +6513,109 @@ es-get-iterator@^1.1.3: stop-iteration-iterator "^1.0.0" es-iterator-helpers@^1.0.12: - version "1.0.15" - resolved "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz#bd81d275ac766431d19305923707c3efd9f1ae40" - integrity sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g== + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz#d1dd0f58129054c0ad922e6a9a1e65eef435fe75" + integrity sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w== dependencies: - asynciterator.prototype "^1.0.0" - call-bind "^1.0.2" + call-bind "^1.0.8" + call-bound "^1.0.3" define-properties "^1.2.1" - es-abstract "^1.22.1" - es-set-tostringtag "^2.0.1" - function-bind "^1.1.1" - get-intrinsic "^1.2.1" - globalthis "^1.0.3" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" - has-symbols "^1.0.3" - internal-slot "^1.0.5" - iterator.prototype "^1.1.2" - safe-array-concat "^1.0.1" + es-abstract "^1.23.6" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" + function-bind "^1.1.2" + get-intrinsic "^1.2.6" + globalthis "^1.0.4" + gopd "^1.2.0" + has-property-descriptors "^1.0.2" + has-proto "^1.2.0" + has-symbols "^1.1.0" + internal-slot "^1.1.0" + iterator.prototype "^1.1.4" + safe-array-concat "^1.1.3" + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" -es-set-tostringtag@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9" - integrity sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q== +es-set-tostringtag@^2.0.3, es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== dependencies: - get-intrinsic "^1.2.2" - has-tostringtag "^1.0.0" - hasown "^2.0.0" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" -es-shim-unscopables@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" - integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== +es-shim-unscopables@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz#438df35520dac5d105f3943d927549ea3b00f4b5" + integrity sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== dependencies: - hasown "^2.0.0" + hasown "^2.0.2" -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== +es-to-primitive@^1.2.1, es-to-primitive@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" + integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" + is-callable "^1.2.7" + is-date-object "^1.0.5" + is-symbol "^1.0.4" es5-imcompatible-versions@^0.1.78: - version "0.1.88" - resolved "https://registry.npmjs.org/es5-imcompatible-versions/-/es5-imcompatible-versions-0.1.88.tgz#bdda41dc2aa1e087696df2d284de58457e2014b2" - integrity sha512-GDJTmDGd65qyDk9fGClO+MOUgHuBuGMCL6EawvLH8Ob+HN8ui1OJwa4fEK0qh3fg2ieT2/pdZj41yrxnmOrK8w== + version "0.1.90" + resolved "https://registry.yarnpkg.com/es5-imcompatible-versions/-/es5-imcompatible-versions-0.1.90.tgz#7642260198b7197f9b5f6b82f5a8f8a1de8f1b32" + integrity sha512-2MPI0t/VV4j/oz1qbMekb4gCW81dewTpM2XJHKnPpZiPGu+1rVWmhTnwcq1vt8AFwWrkNF4RE7OZ9ibnKFYKwg== -es6-promise@^4.0.3: +es6-promise@^4.0.3, es6-promise@^4.1.1: version "4.2.8" - resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== es6-promisify@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" integrity sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ== dependencies: es6-promise "^4.0.3" -esbuild@0.17.19, esbuild@^0.17.5: - version "0.17.19" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz#087a727e98299f0462a3d0bcdd9cd7ff100bd955" - integrity sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw== +esbuild@0.21.4: + version "0.21.4" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.4.tgz#ceb501def8edb12a5bfd9c55f3a96db698edf022" + integrity sha512-sFMcNNrj+Q0ZDolrp5pDhH0nRPN9hLIM3fRPwgbLYJeSHHgnXSnbV3xYgSVuOeLWH9c73VwmEverVzupIv5xuA== optionalDependencies: - "@esbuild/android-arm" "0.17.19" - "@esbuild/android-arm64" "0.17.19" - "@esbuild/android-x64" "0.17.19" - "@esbuild/darwin-arm64" "0.17.19" - "@esbuild/darwin-x64" "0.17.19" - "@esbuild/freebsd-arm64" "0.17.19" - "@esbuild/freebsd-x64" "0.17.19" - "@esbuild/linux-arm" "0.17.19" - "@esbuild/linux-arm64" "0.17.19" - "@esbuild/linux-ia32" "0.17.19" - "@esbuild/linux-loong64" "0.17.19" - "@esbuild/linux-mips64el" "0.17.19" - "@esbuild/linux-ppc64" "0.17.19" - "@esbuild/linux-riscv64" "0.17.19" - "@esbuild/linux-s390x" "0.17.19" - "@esbuild/linux-x64" "0.17.19" - "@esbuild/netbsd-x64" "0.17.19" - "@esbuild/openbsd-x64" "0.17.19" - "@esbuild/sunos-x64" "0.17.19" - "@esbuild/win32-arm64" "0.17.19" - "@esbuild/win32-ia32" "0.17.19" - "@esbuild/win32-x64" "0.17.19" - -esbuild@~0.18.20: + "@esbuild/aix-ppc64" "0.21.4" + "@esbuild/android-arm" "0.21.4" + "@esbuild/android-arm64" "0.21.4" + "@esbuild/android-x64" "0.21.4" + "@esbuild/darwin-arm64" "0.21.4" + "@esbuild/darwin-x64" "0.21.4" + "@esbuild/freebsd-arm64" "0.21.4" + "@esbuild/freebsd-x64" "0.21.4" + "@esbuild/linux-arm" "0.21.4" + "@esbuild/linux-arm64" "0.21.4" + "@esbuild/linux-ia32" "0.21.4" + "@esbuild/linux-loong64" "0.21.4" + "@esbuild/linux-mips64el" "0.21.4" + "@esbuild/linux-ppc64" "0.21.4" + "@esbuild/linux-riscv64" "0.21.4" + "@esbuild/linux-s390x" "0.21.4" + "@esbuild/linux-x64" "0.21.4" + "@esbuild/netbsd-x64" "0.21.4" + "@esbuild/openbsd-x64" "0.21.4" + "@esbuild/sunos-x64" "0.21.4" + "@esbuild/win32-arm64" "0.21.4" + "@esbuild/win32-ia32" "0.21.4" + "@esbuild/win32-x64" "0.21.4" + +esbuild@^0.18.10, esbuild@~0.18.20: version "0.18.20" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6" integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA== optionalDependencies: "@esbuild/android-arm" "0.18.20" @@ -6086,46 +6641,51 @@ esbuild@~0.18.20: "@esbuild/win32-ia32" "0.18.20" "@esbuild/win32-x64" "0.18.20" -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== escape-latex@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz#07c03818cf7dac250cce517f4fda1b001ef2bca1" + resolved "https://registry.yarnpkg.com/escape-latex/-/escape-latex-1.2.0.tgz#07c03818cf7dac250cce517f4fda1b001ef2bca1" integrity sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw== escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== escape-string-regexp@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== eslint-plugin-jest@27.2.3: version "27.2.3" - resolved "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.2.3.tgz#6f8a4bb2ca82c0c5d481d1b3be256ab001f5a3ec" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-27.2.3.tgz#6f8a4bb2ca82c0c5d481d1b3be256ab001f5a3ec" integrity sha512-sRLlSCpICzWuje66Gl9zvdF6mwD5X86I4u55hJyFBsxYOsBCmT5+kSUjf+fkFWVMMgpzNEupjW8WzUqi83hJAQ== dependencies: "@typescript-eslint/utils" "^5.10.0" eslint-plugin-react-hooks@4.6.0: version "4.6.0" - resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== eslint-plugin-react@7.33.2: version "7.33.2" - resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz#69ee09443ffc583927eafe86ffebb470ee737608" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz#69ee09443ffc583927eafe86ffebb470ee737608" integrity sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw== dependencies: array-includes "^3.1.6" @@ -6147,7 +6707,7 @@ eslint-plugin-react@7.33.2: eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: esrecurse "^4.3.0" @@ -6155,51 +6715,51 @@ eslint-scope@5.1.1, eslint-scope@^5.1.1: eslint-visitor-keys@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint-visitor-keys@^3.3.0: +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.3: version "3.4.3" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== esprima@^4.0.0: version "4.0.1" - resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^4.1.1: version "4.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== estraverse@^5.2.0, estraverse@^5.3.0: version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== estree-util-attach-comments@^2.0.0: version "2.1.1" - resolved "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-2.1.1.tgz#ee44f4ff6890ee7dfb3237ac7810154c94c63f84" + resolved "https://registry.yarnpkg.com/estree-util-attach-comments/-/estree-util-attach-comments-2.1.1.tgz#ee44f4ff6890ee7dfb3237ac7810154c94c63f84" integrity sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w== dependencies: "@types/estree" "^1.0.0" estree-util-is-identifier-name@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-2.1.0.tgz#fb70a432dcb19045e77b05c8e732f1364b4b49b2" + resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-2.1.0.tgz#fb70a432dcb19045e77b05c8e732f1364b4b49b2" integrity sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ== estree-util-to-js@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-1.2.0.tgz#0f80d42443e3b13bd32f7012fffa6f93603f4a36" + resolved "https://registry.yarnpkg.com/estree-util-to-js/-/estree-util-to-js-1.2.0.tgz#0f80d42443e3b13bd32f7012fffa6f93603f4a36" integrity sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA== dependencies: "@types/estree-jsx" "^1.0.0" @@ -6208,7 +6768,7 @@ estree-util-to-js@^1.2.0: estree-util-visit@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-1.2.1.tgz#8bc2bc09f25b00827294703835aabee1cc9ec69d" + resolved "https://registry.yarnpkg.com/estree-util-visit/-/estree-util-visit-1.2.1.tgz#8bc2bc09f25b00827294703835aabee1cc9ec69d" integrity sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw== dependencies: "@types/estree-jsx" "^1.0.0" @@ -6216,50 +6776,45 @@ estree-util-visit@^1.2.1: esutils@^2.0.2: version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + eventemitter3@^2.0.0, eventemitter3@^2.0.3: version "2.0.3" - resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz#b5e1079b59fb5e1ba2771c0a993be060a58c99ba" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-2.0.3.tgz#b5e1079b59fb5e1ba2771c0a993be060a58c99ba" integrity sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg== eventemitter3@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== +events-okam@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events-okam/-/events-okam-3.3.0.tgz#66819139831f3c8b2e1e07fc8d33225673d87acb" + integrity sha512-6iR7z9hAJEwrT+D2Ywg6Fx62HSmN86OlcvPdrnq1JBeFr30dMF6l+j7M3VabjHfIi2KMtF8rO0J1rIZEfwMAwg== + events@^3.0.0: version "3.3.0" - resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== dependencies: md5.js "^1.3.4" safe-buffer "^5.1.1" -execa@8.0.1: - version "8.0.1" - resolved "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" - integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^8.0.1" - human-signals "^5.0.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^4.1.0" - strip-final-newline "^3.0.0" - execa@^0.7.0: version "0.7.0" - resolved "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" integrity sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw== dependencies: cross-spawn "^5.0.1" @@ -6272,7 +6827,7 @@ execa@^0.7.0: execa@^5.0.0, execa@^5.1.1: version "5.1.1" - resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: cross-spawn "^7.0.3" @@ -6287,7 +6842,7 @@ execa@^5.0.0, execa@^5.1.1: execa@^7.1.1: version "7.2.0" - resolved "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz#657e75ba984f42a70f38928cedc87d6f2d4fe4e9" + resolved "https://registry.yarnpkg.com/execa/-/execa-7.2.0.tgz#657e75ba984f42a70f38928cedc87d6f2d4fe4e9" integrity sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA== dependencies: cross-spawn "^7.0.3" @@ -6300,33 +6855,94 @@ execa@^7.1.1: signal-exit "^3.0.7" strip-final-newline "^3.0.0" +execa@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" + integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^8.0.1" + human-signals "^5.0.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^4.1.0" + strip-final-newline "^3.0.0" + exenv@^1.2.0: version "1.2.2" - resolved "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d" + resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d" integrity sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw== expand-tilde@^1.2.2: version "1.2.2" - resolved "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" integrity sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q== dependencies: os-homedir "^1.0.1" +express-http-proxy@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/express-http-proxy/-/express-http-proxy-2.1.1.tgz#90bd7eaee5166be968157b035eb6b499d2af2bf4" + integrity sha512-4aRQRqDQU7qNPV5av0/hLcyc0guB9UP71nCYrQEYml7YphTo8tmWf3nDZWdTJMMjFikyz9xKXaURor7Chygdwg== + dependencies: + debug "^3.0.1" + es6-promise "^4.1.1" + raw-body "^2.3.0" + +express@^4.18.2: + version "4.21.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32" + integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.3" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.7.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~2.0.0" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.3.1" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.3" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.12" + proxy-addr "~2.0.7" + qs "6.13.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.19.0" + serve-static "1.16.2" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + extend-shallow@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== dependencies: is-extendable "^0.1.0" extend@^3.0.0, extend@^3.0.2: version "3.0.2" - resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== external-editor@^3.0.3: version "3.1.0" - resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== dependencies: chardet "^0.7.0" @@ -6340,12 +6956,12 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: fast-diff@1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz#4b62c42b8e03de3f848460b639079920695d0154" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.1.2.tgz#4b62c42b8e03de3f848460b639079920695d0154" integrity sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig== fast-glob@3.2.12: version "3.2.12" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -6355,55 +6971,60 @@ fast-glob@3.2.12: micromatch "^4.0.4" fast-glob@^3.2.9, fast-glob@^3.3.0: - version "3.3.2" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + version "3.3.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" glob-parent "^5.1.2" merge2 "^1.3.0" - micromatch "^4.0.4" + micromatch "^4.0.8" fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-redact@^3.0.0: - version "3.3.0" - resolved "https://registry.npmjs.org/fast-redact/-/fast-redact-3.3.0.tgz#7c83ce3a7be4898241a46560d51de10f653f7634" - integrity sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ== + version "3.5.0" + resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.5.0.tgz#e9ea02f7e57d0cd8438180083e93077e496285e4" + integrity sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A== + +fast-uri@^3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.6.tgz#88f130b77cfaea2378d56bf970dea21257a68748" + integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + version "1.19.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5" + integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== dependencies: reusify "^1.0.4" fault@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz#d47ca9f37ca26e4bd38374a7c500b5a384755b6c" + resolved "https://registry.yarnpkg.com/fault/-/fault-2.0.1.tgz#d47ca9f37ca26e4bd38374a7c500b5a384755b6c" integrity sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ== dependencies: format "^0.2.0" fb-watchman@^2.0.0: version "2.0.2" - resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== dependencies: bser "2.1.1" fecha@~4.2.0: version "4.2.3" - resolved "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" + resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== fetch-blob@^3.1.2, fetch-blob@^3.1.4: version "3.2.0" - resolved "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9" + resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9" integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ== dependencies: node-domexception "^1.0.0" @@ -6411,25 +7032,25 @@ fetch-blob@^3.1.2, fetch-blob@^3.1.4: figures@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" integrity sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA== dependencies: escape-string-regexp "^1.0.5" file-name@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/file-name/-/file-name-0.1.0.tgz#12b122f120f9c34dbc176c1ab81a548aced6def7" + resolved "https://registry.yarnpkg.com/file-name/-/file-name-0.1.0.tgz#12b122f120f9c34dbc176c1ab81a548aced6def7" integrity sha512-Q8SskhjF4eUk/xoQkmubwLkoHwOTv6Jj/WGtOVLKkZ0vvM+LipkSXugkn1F/+mjWXU32AXLZB3qaz0arUzgtRw== file-saver@^2.0.5: version "2.0.5" - resolved "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz#d61cfe2ce059f414d899e9dd6d4107ee25670c38" + resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-2.0.5.tgz#d61cfe2ce059f414d899e9dd6d4107ee25670c38" integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA== file-system-cache@^2.4.3: - version "2.4.4" - resolved "https://registry.npmjs.org/file-system-cache/-/file-system-cache-2.4.4.tgz#90eb72960e3d7b72d09768d4d4262c98f8d206b6" - integrity sha512-vCYhn8pb5nlC3Gs2FFCOkmf4NEg2Ym3ulJwkmS9o6p9oRShGj6CwTMFvpgZihBlsh373NaM0XgAgDHXQIlS4LQ== + version "2.4.7" + resolved "https://registry.yarnpkg.com/file-system-cache/-/file-system-cache-2.4.7.tgz#d48ec59b384f91c9ee2d392831ce1fb35e90e5b5" + integrity sha512-VEUHQCtl3hjDH0bfjjwzuH6pP1rpmf1pjwQhiKm3cfcZnMidz7ILtjDecQz4yM8xidvoBSIdOke3GLe90gE1LQ== dependencies: "@types/fs-extra" "11.0.1" "@types/ramda" "0.29.3" @@ -6438,24 +7059,37 @@ file-system-cache@^2.4.3: filesize@^3.6.1: version "3.6.1" - resolved "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" filter-obj@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" + resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== -find-file-up@^0.1.2: - version "0.1.3" - resolved "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz#cf68091bcf9f300a40da411b37da5cce5a2fbea0" +finalhandler@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" + integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== + dependencies: + debug "2.6.9" + encodeurl "~2.0.0" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-file-up@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/find-file-up/-/find-file-up-0.1.3.tgz#cf68091bcf9f300a40da411b37da5cce5a2fbea0" integrity sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A== dependencies: fs-exists-sync "^0.1.0" @@ -6463,19 +7097,19 @@ find-file-up@^0.1.2: find-pkg@^0.1.0: version "0.1.2" - resolved "https://registry.npmjs.org/find-pkg/-/find-pkg-0.1.2.tgz#1bdc22c06e36365532e2a248046854b9788da557" + resolved "https://registry.yarnpkg.com/find-pkg/-/find-pkg-0.1.2.tgz#1bdc22c06e36365532e2a248046854b9788da557" integrity sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw== dependencies: find-file-up "^0.1.2" find-root@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== find-up@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" @@ -6483,7 +7117,7 @@ find-up@^4.1.0: find-up@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -6491,17 +7125,17 @@ find-up@^5.0.0: flat-to-nested@^1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/flat-to-nested/-/flat-to-nested-1.1.1.tgz#ec183cd9a72f6bfbf8ca21acb0fc8235e509f581" + resolved "https://registry.yarnpkg.com/flat-to-nested/-/flat-to-nested-1.1.1.tgz#ec183cd9a72f6bfbf8ca21acb0fc8235e509f581" integrity sha512-Sym5oik6BO9JnsDEjv9Q9hPTCexG2ttk0UiM2mgLEiCiiUOQr8acBd33r8ixnoSGR0HAxPoP8WtLAL5oV46IhQ== flat@^5.0.2: version "5.0.2" - resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== flush-write-stream@^1.0.0: version "1.1.1" - resolved "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== dependencies: inherits "^2.0.3" @@ -6509,7 +7143,7 @@ flush-write-stream@^1.0.0: fmin@^0.0.2: version "0.0.2" - resolved "https://registry.npmjs.org/fmin/-/fmin-0.0.2.tgz#59bbb40d43ffdc1c94cd00a568c41f95f1973017" + resolved "https://registry.yarnpkg.com/fmin/-/fmin-0.0.2.tgz#59bbb40d43ffdc1c94cd00a568c41f95f1973017" integrity sha512-sSi6DzInhl9d8yqssDfGZejChO8d2bAGIpysPsvYsxFe898z89XhCZg6CPNV3nhUhFefeC/AXZK2bAJxlBjN6A== dependencies: contour_plot "^0.0.1" @@ -6520,34 +7154,34 @@ fmin@^0.0.2: follow-redirects@1.5.10: version "1.5.10" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== dependencies: debug "=3.1.0" follow-redirects@^1.14.8: - version "1.15.3" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" - integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== + version "1.15.11" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340" + integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ== -for-each@^0.3.3, for-each@~0.3.3: - version "0.3.3" - resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== +for-each@^0.3.3, for-each@^0.3.5, for-each@~0.3.3: + version "0.3.5" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" + integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== dependencies: - is-callable "^1.1.3" + is-callable "^1.2.7" foreground-child@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.2.0.tgz#5eb496c4ebf3bcc4572e8908a45a72f5a1d2d658" - integrity sha512-CrWQNaEl1/6WeZoarcM9LHupTo3RpZO2Pdk1vktwzPiQTsJnAKJmm3TACKeG5UZbWDfaH2AbvYxzP96y0MT7fA== + version "3.3.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" + integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== dependencies: - cross-spawn "^7.0.0" + cross-spawn "^7.0.6" signal-exit "^4.0.1" fork-ts-checker-webpack-plugin@8.0.0: version "8.0.0" - resolved "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz#dae45dfe7298aa5d553e2580096ced79b6179504" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz#dae45dfe7298aa5d553e2580096ced79b6179504" integrity sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg== dependencies: "@babel/code-frame" "^7.16.7" @@ -6565,24 +7199,34 @@ fork-ts-checker-webpack-plugin@8.0.0: format@^0.2.0: version "0.2.2" - resolved "https://registry.npmjs.org/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" + resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== formdata-polyfill@^4.0.10: version "4.0.10" - resolved "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" + resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== dependencies: fetch-blob "^3.1.2" -fraction.js@^4.2.0, fraction.js@^4.3.6: +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fraction.js@^4.2.0, fraction.js@^4.3.7: version "4.3.7" - resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + from2@^2.1.0: version "2.3.0" - resolved "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g== dependencies: inherits "^2.0.1" @@ -6590,17 +7234,17 @@ from2@^2.1.0: fs-constants@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== fs-exists-sync@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" + resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" integrity sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg== -fs-extra@11.1.1, fs-extra@^11.0.0: +fs-extra@11.1.1: version "11.1.1" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== dependencies: graceful-fs "^4.2.0" @@ -6609,7 +7253,7 @@ fs-extra@11.1.1, fs-extra@^11.0.0: fs-extra@^10.0.0: version "10.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== dependencies: graceful-fs "^4.2.0" @@ -6618,7 +7262,7 @@ fs-extra@^10.0.0: fs-extra@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" integrity sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg== dependencies: graceful-fs "^4.1.2" @@ -6626,13 +7270,13 @@ fs-extra@^3.0.1: universalify "^0.1.0" fs-monkey@^1.0.4: - version "1.0.5" - resolved "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz#fe450175f0db0d7ea758102e1d84096acb925788" - integrity sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew== + version "1.1.0" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.1.0.tgz#632aa15a20e71828ed56b24303363fb1414e5997" + integrity sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw== fs-write-stream-atomic@^1.0.8: version "1.0.10" - resolved "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" integrity sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA== dependencies: graceful-fs "^4.1.2" @@ -6642,107 +7286,136 @@ fs-write-stream-atomic@^1.0.8: fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^2.3.2, fsevents@~2.3.2, fsevents@~2.3.3: +fsevents@^2.3.2, fsevents@~2.3.2: version "2.3.3" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -function-bind@^1.1.1, function-bind@^1.1.2: +function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: - version "1.1.6" - resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" - integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== +function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz#e68e1df7b259a5c949eeef95cdbde53edffabb78" + integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" functions-have-names "^1.2.3" + hasown "^2.0.2" + is-callable "^1.2.7" functions-have-names@^1.2.3: version "1.2.3" - resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== genfun@^4.0.1: version "4.0.1" - resolved "https://registry.npmjs.org/genfun/-/genfun-4.0.1.tgz#ed10041f2e4a7f1b0a38466d17a5c3e27df1dfc1" + resolved "https://registry.yarnpkg.com/genfun/-/genfun-4.0.1.tgz#ed10041f2e4a7f1b0a38466d17a5c3e27df1dfc1" integrity sha512-48yv1eDS5Qrz6cbSDBBik0u7jCgC/eA9eZrl9MIN1LfKzFTuGt6EHgr31YM8yT9cjb5BplXb4Iz3VtOYmgt8Jg== gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^2.0.5: version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" - integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== +get-east-asian-width@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz#21b4071ee58ed04ee0db653371b55b4299875389" + integrity sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" get-package-type@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== +get-proto@^1.0.0, get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + get-stream@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ== get-stream@^6.0.0, get-stream@^6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== get-stream@^8.0.1: version "8.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== +get-symbol-description@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" + integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" + call-bound "^1.0.3" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + +get-tsconfig@4.7.5: + version "4.7.5" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.5.tgz#5e012498579e9a6947511ed0cd403272c7acbbaf" + integrity sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw== + dependencies: + resolve-pkg-maps "^1.0.0" -get-tsconfig@^4.7.2: - version "4.7.2" - resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz#0dcd6fb330391d46332f4c6c1bf89a6514c2ddce" - integrity sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A== +get-tsconfig@^4.7.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.10.1.tgz#d34c1c01f47d65a606c37aa7a177bc3e56ab4b2e" + integrity sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ== dependencies: resolve-pkg-maps "^1.0.0" get-value@^2.0.3: version "2.0.6" - resolved "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== git-branch@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/git-branch/-/git-branch-1.0.0.tgz#64cc7dd75da2d81a9d4679087c1f8b56e6bd2d3d" + resolved "https://registry.yarnpkg.com/git-branch/-/git-branch-1.0.0.tgz#64cc7dd75da2d81a9d4679087c1f8b56e6bd2d3d" integrity sha512-ZTzuqw5Df8fyLXQWrX6hK+4FpNCdKzMcERlxENEGO5aKcLmG7MAszhrMhluUKNKmOS/JAGijDMQDXDCDw1mE/A== git-config-path@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/git-config-path/-/git-config-path-1.0.1.tgz#6d33f7ed63db0d0e118131503bab3aca47d54664" + resolved "https://registry.yarnpkg.com/git-config-path/-/git-config-path-1.0.1.tgz#6d33f7ed63db0d0e118131503bab3aca47d54664" integrity sha512-KcJ2dlrrP5DbBnYIZ2nlikALfRhKzNSX0stvv3ImJ+fvC4hXKoV+U+74SV0upg+jlQZbrtQzc0bu6/Zh+7aQbg== dependencies: extend-shallow "^2.0.1" @@ -6750,13 +7423,13 @@ git-config-path@^1.0.1: homedir-polyfill "^1.0.0" git-hooks-list@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/git-hooks-list/-/git-hooks-list-3.1.0.tgz#386dc531dcc17474cf094743ff30987a3d3e70fc" - integrity sha512-LF8VeHeR7v+wAbXqfgRlTSX/1BJR9Q1vEMR8JAz1cEg6GX07+zyj3sAdDvYjj/xnlIfVuGgj4qBei1K3hKH+PA== + version "3.2.0" + resolved "https://registry.yarnpkg.com/git-hooks-list/-/git-hooks-list-3.2.0.tgz#ffe5d5895e29d24f930f9a98dd604b7e407d2f5f" + integrity sha512-ZHG9a1gEhUMX1TvGrLdyWb9kDopCBbTnI8z4JgRMYxsijWipgjSEYoPWqBuIB0DnRnvqlQSEeVmzpeuPm7NdFQ== git-raw-commits@^2.0.11: version "2.0.11" - resolved "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== dependencies: dargs "^7.0.0" @@ -6767,7 +7440,7 @@ git-raw-commits@^2.0.11: git-repo-name@^0.6.0: version "0.6.0" - resolved "https://registry.npmjs.org/git-repo-name/-/git-repo-name-0.6.0.tgz#af09884656aa537ec625c7087008175cd61228ff" + resolved "https://registry.yarnpkg.com/git-repo-name/-/git-repo-name-0.6.0.tgz#af09884656aa537ec625c7087008175cd61228ff" integrity sha512-DF4XxB6H+Te79JA08/QF/IjIv+j+0gF990WlgAX3SXXU2irfqvBc/xxlAIh6eJWYaKz45MrrGVBFS0Qc4bBz5g== dependencies: cwd "^0.9.1" @@ -6777,42 +7450,43 @@ git-repo-name@^0.6.0: git-username@^0.5.0: version "0.5.1" - resolved "https://registry.npmjs.org/git-username/-/git-username-0.5.1.tgz#432a41b34a19607892354004c9893a8829ffa4f0" + resolved "https://registry.yarnpkg.com/git-username/-/git-username-0.5.1.tgz#432a41b34a19607892354004c9893a8829ffa4f0" integrity sha512-xjUjrj3i4kup2A3a/ZVZB1Nt0PUX7SU7KeVqIbXPdslT7NbNfyO04JMxBv4gar77JePdS+A6f05jG1Viy6+U1w== dependencies: remote-origin-url "^0.4.0" github-slugger@^1.5.0: version "1.5.0" - resolved "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz#17891bbc73232051474d68bd867a34625c955f7d" + resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.5.0.tgz#17891bbc73232051474d68bd867a34625c955f7d" integrity sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw== gl-matrix@^3.0.0, gl-matrix@^3.1.0, gl-matrix@^3.3.0, gl-matrix@^3.4.3: version "3.4.3" - resolved "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz#fc1191e8320009fd4d20e9339595c6041ddc22c9" + resolved "https://registry.yarnpkg.com/gl-matrix/-/gl-matrix-3.4.3.tgz#fc1191e8320009fd4d20e9339595c6041ddc22c9" integrity sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA== glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob@^10.3.10: - version "10.4.1" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.1.tgz#0cfb01ab6a6b438177bfe6a58e2576f6efe909c2" - integrity sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw== +glob@^10.2.5, glob@^10.3.10: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== dependencies: foreground-child "^3.1.0" jackspeak "^3.1.2" minimatch "^9.0.4" minipass "^7.1.2" + package-json-from-dist "^1.0.0" path-scurry "^1.11.1" glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@~7.2.3: version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -6824,14 +7498,14 @@ glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@~7.2.3: global-dirs@^0.1.0, global-dirs@^0.1.1: version "0.1.1" - resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" integrity sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg== dependencies: ini "^1.3.4" global-modules@^0.2.3: version "0.2.3" - resolved "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" integrity sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA== dependencies: global-prefix "^0.1.4" @@ -6839,7 +7513,7 @@ global-modules@^0.2.3: global-prefix@^0.1.4: version "0.1.5" - resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" integrity sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw== dependencies: homedir-polyfill "^1.0.0" @@ -6847,21 +7521,17 @@ global-prefix@^0.1.4: is-windows "^0.2.0" which "^1.2.12" -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== +globalthis@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== dependencies: - define-properties "^1.1.3" + define-properties "^1.2.1" + gopd "^1.0.1" globby@^11.1.0: version "11.1.0" - resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" @@ -6873,7 +7543,7 @@ globby@^11.1.0: globby@^13.1.2: version "13.2.2" - resolved "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== dependencies: dir-glob "^3.0.1" @@ -6882,16 +7552,14 @@ globby@^13.1.2: merge2 "^1.4.1" slash "^4.0.0" -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" +gopd@^1.0.1, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== got@^6.7.1: version "6.7.1" - resolved "https://registry.npmjs.org/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" integrity sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg== dependencies: create-error-class "^3.0.0" @@ -6908,85 +7576,87 @@ got@^6.7.1: graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: version "4.2.11" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== graphemer@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== graphlib@^2.1.8: version "2.1.8" - resolved "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz#5761d414737870084c92ec7b5dbcb0592c9d35da" + resolved "https://registry.yarnpkg.com/graphlib/-/graphlib-2.1.8.tgz#5761d414737870084c92ec7b5dbcb0592c9d35da" integrity sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A== dependencies: lodash "^4.17.15" handle-thing@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== hard-rejection@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== harmony-reflect@^1.4.6: version "1.6.2" - resolved "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" + resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== has-ansi@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== dependencies: ansi-regex "^2.0.0" -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== +has-bigints@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe" + integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" - integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: - get-intrinsic "^1.2.2" + es-define-property "^1.0.0" -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== +has-proto@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" + integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== + dependencies: + dunder-proto "^1.0.0" -has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-symbols@^1.0.1, has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: - has-symbols "^1.0.2" + has-symbols "^1.0.3" has-value@^0.3.1: version "0.3.1" - resolved "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== dependencies: get-value "^2.0.3" @@ -6995,41 +7665,56 @@ has-value@^0.3.1: has-values@^0.1.4: version "0.1.4" - resolved "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== has@~1.0.3: version "1.0.4" - resolved "https://registry.npmjs.org/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== +hash-base@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" + integrity sha512-0TROgQ1/SxE6KmxWSvXHvRj90/Xo1JvZShofnYF+f6ZsGtR4eES7WfrQzPalmyagfKZCXpVnitiRebZulWsbiw== + dependencies: + inherits "^2.0.1" + hash-base@^3.0.0: version "3.1.0" - resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== dependencies: inherits "^2.0.4" readable-stream "^3.6.0" safe-buffer "^5.2.0" +hash-base@~3.0, hash-base@~3.0.4: + version "3.0.5" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.5.tgz#52480e285395cf7fba17dc4c9e47acdc7f248a8a" + integrity sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg== + dependencies: + inherits "^2.0.4" + safe-buffer "^5.2.1" + hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" - resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== dependencies: inherits "^2.0.3" minimalistic-assert "^1.0.1" -hasown@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" - integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== +hasown@^2.0.0, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" hast-util-from-parse5@^7.0.0: version "7.1.2" - resolved "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz#aecfef73e3ceafdfa4550716443e4eb7b02e22b0" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz#aecfef73e3ceafdfa4550716443e4eb7b02e22b0" integrity sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw== dependencies: "@types/hast" "^2.0.0" @@ -7042,26 +7727,26 @@ hast-util-from-parse5@^7.0.0: hast-util-has-property@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-2.0.1.tgz#8ec99c3e8f02626304ee438cdb9f0528b017e083" + resolved "https://registry.yarnpkg.com/hast-util-has-property/-/hast-util-has-property-2.0.1.tgz#8ec99c3e8f02626304ee438cdb9f0528b017e083" integrity sha512-X2+RwZIMTMKpXUzlotatPzWj8bspCymtXH3cfG3iQKV+wPF53Vgaqxi/eLqGck0wKq1kS9nvoB1wchbCPEL8sg== hast-util-heading-rank@^2.0.0: version "2.1.1" - resolved "https://registry.npmjs.org/hast-util-heading-rank/-/hast-util-heading-rank-2.1.1.tgz#063b43b9cfb56a1a8ded84dd68d8af69e8864545" + resolved "https://registry.yarnpkg.com/hast-util-heading-rank/-/hast-util-heading-rank-2.1.1.tgz#063b43b9cfb56a1a8ded84dd68d8af69e8864545" integrity sha512-iAuRp+ESgJoRFJbSyaqsfvJDY6zzmFoEnL1gtz1+U8gKtGGj1p0CVlysuUAUjq95qlZESHINLThwJzNGmgGZxA== dependencies: "@types/hast" "^2.0.0" hast-util-is-conditional-comment@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/hast-util-is-conditional-comment/-/hast-util-is-conditional-comment-2.0.0.tgz#b1c915c17ced12635a87984e562d3688f90cdb93" + resolved "https://registry.yarnpkg.com/hast-util-is-conditional-comment/-/hast-util-is-conditional-comment-2.0.0.tgz#b1c915c17ced12635a87984e562d3688f90cdb93" integrity sha512-U66gW8ZWQdxP4ZjTEZ3xZT72y6rIKJqV4At5QmC1ItBbQyZyVkuTp8QkQwhxsbkHdzpifiZdQWrDipc9ByqhRg== dependencies: "@types/hast" "^2.0.0" hast-util-is-element@^2.0.0, hast-util-is-element@^2.1.3: version "2.1.3" - resolved "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-2.1.3.tgz#cd3279cfefb70da6d45496068f020742256fc471" + resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-2.1.3.tgz#cd3279cfefb70da6d45496068f020742256fc471" integrity sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA== dependencies: "@types/hast" "^2.0.0" @@ -7069,14 +7754,14 @@ hast-util-is-element@^2.0.0, hast-util-is-element@^2.1.3: hast-util-parse-selector@^3.0.0: version "3.1.1" - resolved "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz#25ab00ae9e75cbc62cf7a901f68a247eade659e2" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz#25ab00ae9e75cbc62cf7a901f68a247eade659e2" integrity sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA== dependencies: "@types/hast" "^2.0.0" hast-util-raw@^7.0.0: version "7.2.3" - resolved "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-7.2.3.tgz#dcb5b22a22073436dbdc4aa09660a644f4991d99" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-7.2.3.tgz#dcb5b22a22073436dbdc4aa09660a644f4991d99" integrity sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg== dependencies: "@types/hast" "^2.0.0" @@ -7093,7 +7778,7 @@ hast-util-raw@^7.0.0: hast-util-raw@^8.0.0: version "8.0.0" - resolved "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-8.0.0.tgz#4e3352da2735676b2ea7947e72104ca335b56df1" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-8.0.0.tgz#4e3352da2735676b2ea7947e72104ca335b56df1" integrity sha512-bKbaUxMNLjZMMowgcrc4l3aQSPiMLiceZD+mp+AKF8Si0mtyR2DYVdxzS2XBxXYDeW/VvfZy40lNxHRiY6MMTg== dependencies: "@types/hast" "^2.0.0" @@ -7111,7 +7796,7 @@ hast-util-raw@^8.0.0: hast-util-to-estree@^2.3.3: version "2.3.3" - resolved "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-2.3.3.tgz#da60142ffe19a6296923ec222aba73339c8bf470" + resolved "https://registry.yarnpkg.com/hast-util-to-estree/-/hast-util-to-estree-2.3.3.tgz#da60142ffe19a6296923ec222aba73339c8bf470" integrity sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ== dependencies: "@types/estree" "^1.0.0" @@ -7132,7 +7817,7 @@ hast-util-to-estree@^2.3.3: hast-util-to-html@^8.0.0: version "8.0.4" - resolved "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-8.0.4.tgz#0269ef33fa3f6599b260a8dc94f733b8e39e41fc" + resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-8.0.4.tgz#0269ef33fa3f6599b260a8dc94f733b8e39e41fc" integrity sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA== dependencies: "@types/hast" "^2.0.0" @@ -7149,7 +7834,7 @@ hast-util-to-html@^8.0.0: hast-util-to-parse5@^7.0.0: version "7.1.0" - resolved "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz#c49391bf8f151973e0c9adcd116b561e8daf29f3" + resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz#c49391bf8f151973e0c9adcd116b561e8daf29f3" integrity sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw== dependencies: "@types/hast" "^2.0.0" @@ -7161,19 +7846,19 @@ hast-util-to-parse5@^7.0.0: hast-util-to-string@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-2.0.0.tgz#b008b0a4ea472bf34dd390b7eea1018726ae152a" + resolved "https://registry.yarnpkg.com/hast-util-to-string/-/hast-util-to-string-2.0.0.tgz#b008b0a4ea472bf34dd390b7eea1018726ae152a" integrity sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A== dependencies: "@types/hast" "^2.0.0" hast-util-whitespace@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz#0ec64e257e6fc216c7d14c8a1b74d27d650b4557" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz#0ec64e257e6fc216c7d14c8a1b74d27d650b4557" integrity sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng== hastscript@^7.0.0: version "7.2.0" - resolved "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz#0eafb7afb153d047077fa2a833dc9b7ec604d10b" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-7.2.0.tgz#0eafb7afb153d047077fa2a833dc9b7ec604d10b" integrity sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw== dependencies: "@types/hast" "^2.0.0" @@ -7184,88 +7869,83 @@ hastscript@^7.0.0: he@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -heap@^0.2.6: - version "0.2.7" - resolved "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" - integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== - heti-findandreplacedomtext@^0.5.0: version "0.5.0" - resolved "https://registry.npmjs.org/heti-findandreplacedomtext/-/heti-findandreplacedomtext-0.5.0.tgz#a69dd028ac3d37c73a33173e376f2c3366cdd46f" + resolved "https://registry.yarnpkg.com/heti-findandreplacedomtext/-/heti-findandreplacedomtext-0.5.0.tgz#a69dd028ac3d37c73a33173e376f2c3366cdd46f" integrity sha512-GFZjqU8LAdu1uR72GqrReI+lzNLMlcWtvdz1TKNJiofyo1mfTecFYSZEoEbcLcRMl+KwEldnNQoS4BwO8wtg0A== heti@^0.9.4: - version "0.9.4" - resolved "https://registry.npmjs.org/heti/-/heti-0.9.4.tgz#23fed85c4ca69bdf2d24dfbf78cdf9d633faac43" - integrity sha512-DI1A/R6VabM8wulXrGVbeHZNZ8jJUm+Pwn+PEYZcNBxAO+4mXWPEX+Xu9R/YrHETGcevNrLO34m/99ZCnFnlhw== + version "0.9.5" + resolved "https://registry.yarnpkg.com/heti/-/heti-0.9.5.tgz#b5a4bed3e97f2d663dd8d50654e953fd6a8951c2" + integrity sha512-oVWQiQ8nvtfU9vc64ftAv+ylSwoeIJGOSm+LRpZz/XMlhFOtzybcpplmRTHxpz8X9vINlWVlniKCvF0LRo7s0Q== dependencies: heti-findandreplacedomtext "^0.5.0" highlight.js@^10.2.0: version "10.7.3" - resolved "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== history@5.3.0, history@^5.2.0: version "5.3.0" - resolved "https://registry.npmjs.org/history/-/history-5.3.0.tgz#1548abaa245ba47992f063a0783db91ef201c73b" + resolved "https://registry.yarnpkg.com/history/-/history-5.3.0.tgz#1548abaa245ba47992f063a0783db91ef201c73b" integrity sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ== dependencies: "@babel/runtime" "^7.7.6" hmac-drbg@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== dependencies: hash.js "^1.0.3" minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: +hoist-non-react-statics@3, hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: version "3.3.2" - resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== dependencies: react-is "^16.7.0" homedir-polyfill@^1.0.0: version "1.0.3" - resolved "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== dependencies: parse-passwd "^1.0.0" hosted-git-info@^2.1.4, hosted-git-info@^2.4.2: version "2.8.9" - resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== hosted-git-info@^4.0.1: version "4.1.0" - resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== dependencies: lru-cache "^6.0.0" hosted-git-info@^6.1.1: - version "6.1.1" - resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz#629442c7889a69c05de604d52996b74fe6f26d58" - integrity sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w== + version "6.1.3" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-6.1.3.tgz#2ee1a14a097a1236bddf8672c35b613c46c55946" + integrity sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw== dependencies: lru-cache "^7.5.1" hotkeys-js@3.9.4: version "3.9.4" - resolved "https://registry.npmjs.org/hotkeys-js/-/hotkeys-js-3.9.4.tgz#ce1aa4c3a132b6a63a9dd5644fc92b8a9b9cbfb9" + resolved "https://registry.yarnpkg.com/hotkeys-js/-/hotkeys-js-3.9.4.tgz#ce1aa4c3a132b6a63a9dd5644fc92b8a9b9cbfb9" integrity sha512-2zuLt85Ta+gIyvs4N88pCYskNrxf1TFv3LR9t5mdAZIX8BcgQQ48F2opUptvHa6m8zsy5v/a0i9mWzTrlNWU0Q== hpack.js@^2.1.6: version "2.1.6" - resolved "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== dependencies: inherits "^2.0.1" @@ -7275,17 +7955,17 @@ hpack.js@^2.1.6: htm@^3.1.0: version "3.1.1" - resolved "https://registry.npmjs.org/htm/-/htm-3.1.1.tgz#49266582be0dc66ed2235d5ea892307cc0c24b78" + resolved "https://registry.yarnpkg.com/htm/-/htm-3.1.1.tgz#49266582be0dc66ed2235d5ea892307cc0c24b78" integrity sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ== html-entities@^2.1.0: - version "2.4.0" - resolved "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz#edd0cee70402584c8c76cc2c0556db09d1f45061" - integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== + version "2.6.0" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.6.0.tgz#7c64f1ea3b36818ccae3d3fb48b6974208e984f8" + integrity sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ== html-minifier-terser@^6.0.2: version "6.1.0" - resolved "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== dependencies: camel-case "^4.1.2" @@ -7298,14 +7978,14 @@ html-minifier-terser@^6.0.2: html-parse-stringify@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz#dfc1017347ce9f77c8141a507f233040c59c55d2" + resolved "https://registry.yarnpkg.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz#dfc1017347ce9f77c8141a507f233040c59c55d2" integrity sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg== dependencies: void-elements "3.1.0" html-to-text@^9.0.5: version "9.0.5" - resolved "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.5.tgz#6149a0f618ae7a0db8085dca9bbf96d32bb8368d" + resolved "https://registry.yarnpkg.com/html-to-text/-/html-to-text-9.0.5.tgz#6149a0f618ae7a0db8085dca9bbf96d32bb8368d" integrity sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg== dependencies: "@selderee/plugin-htmlparser2" "^0.11.0" @@ -7316,7 +7996,7 @@ html-to-text@^9.0.5: html-tokenize@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/html-tokenize/-/html-tokenize-2.0.1.tgz#c3b2ea6e2837d4f8c06693393e9d2a12c960be5f" + resolved "https://registry.yarnpkg.com/html-tokenize/-/html-tokenize-2.0.1.tgz#c3b2ea6e2837d4f8c06693393e9d2a12c960be5f" integrity sha512-QY6S+hZ0f5m1WT8WffYN+Hg+xm/w5I8XeUcAq/ZYP5wVC8xbKi4Whhru3FtrAebD5EhBW8rmFzkDI6eCAuFe2w== dependencies: buffer-from "~0.1.1" @@ -7327,12 +8007,12 @@ html-tokenize@^2.0.0: html-void-elements@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz#29459b8b05c200b6c5ee98743c41b979d577549f" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-2.0.1.tgz#29459b8b05c200b6c5ee98743c41b979d577549f" integrity sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A== html-webpack-plugin@5.5.0: version "5.5.0" - resolved "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz#c3911936f57681c1f9f4d8b68c158cd9dfe52f50" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz#c3911936f57681c1f9f4d8b68c158cd9dfe52f50" integrity sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw== dependencies: "@types/html-minifier-terser" "^6.0.0" @@ -7343,7 +8023,7 @@ html-webpack-plugin@5.5.0: html2sketch@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/html2sketch/-/html2sketch-1.0.2.tgz#8911ddbe007642ad8f07982674af42f15d84633f" + resolved "https://registry.yarnpkg.com/html2sketch/-/html2sketch-1.0.2.tgz#8911ddbe007642ad8f07982674af42f15d84633f" integrity sha512-/P9NcVH9yBhrOkcnaFkAbWJifDO8Ii+CTIxy9gE6trSQvo2OH++TKQIP5MICEoWvgXpVhZ6botj7P63Krl1/gg== dependencies: "@sketch-hq/sketch-file-format-ts" "^6" @@ -7357,7 +8037,7 @@ html2sketch@^1.0.2: htmlparser2@^6.1.0: version "6.1.0" - resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== dependencies: domelementtype "^2.0.1" @@ -7367,7 +8047,7 @@ htmlparser2@^6.1.0: htmlparser2@^8.0.0, htmlparser2@^8.0.2: version "8.0.2" - resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== dependencies: domelementtype "^2.3.0" @@ -7377,17 +8057,28 @@ htmlparser2@^8.0.0, htmlparser2@^8.0.2: http-cache-semantics@^3.8.0: version "3.8.1" - resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== http-deceiver@^1.2.7: version "1.2.7" - resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + http-proxy-agent@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg== dependencies: agent-base "4" @@ -7395,12 +8086,12 @@ http-proxy-agent@^2.0.0: https-browserify@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== https-proxy-agent@^2.1.0: version "2.2.4" - resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg== dependencies: agent-base "^4.3.0" @@ -7408,162 +8099,167 @@ https-proxy-agent@^2.1.0: human-signals@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== human-signals@^4.3.0: version "4.3.1" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== human-signals@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== humanize-ms@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== dependencies: ms "^2.0.0" humps@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/humps/-/humps-2.0.1.tgz#dd02ea6081bd0568dc5d073184463957ba9ef9aa" + resolved "https://registry.yarnpkg.com/humps/-/humps-2.0.1.tgz#dd02ea6081bd0568dc5d073184463957ba9ef9aa" integrity sha512-E0eIbrFWUhwfXJmsbdjRQFQPrl5pTEoKlz163j1mTqqUnU9PgR4AgB8AIITzuB3vLBdxZXyZ9TDIrwB2OASz4g== husky@^8.0.3: version "8.0.3" - resolved "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" + resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== i18next-http-backend@^2.1.1: - version "2.4.1" - resolved "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.4.1.tgz#b0cd4926ea71a689da22d2b55ea2bc37fde8909a" - integrity sha512-CZHzFGDvF8zN7ya1W2lHbgLj2ejPUvPD836+vA3eNXc9eKGUM3MSF6SA2TKBXKBZ2cNG3nxzycCXeM6n/46KWQ== + version "2.7.3" + resolved "https://registry.yarnpkg.com/i18next-http-backend/-/i18next-http-backend-2.7.3.tgz#335e5884b4c5446cdb4817cb35e81ee4ac7be9f4" + integrity sha512-FgZxrXdRA5u44xfYsJlEBL4/KH3f2IluBpgV/7riW0YW2VEyM8FzVt2XHAOi6id0Ppj7vZvCZVpp5LrGXnc8Ig== dependencies: cross-fetch "4.0.0" i18next@^22.4.9: version "22.5.1" - resolved "https://registry.npmjs.org/i18next/-/i18next-22.5.1.tgz#99df0b318741a506000c243429a7352e5f44d424" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-22.5.1.tgz#99df0b318741a506000c243429a7352e5f44d424" integrity sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA== dependencies: "@babel/runtime" "^7.20.6" +iconv-lite@0.4.24, iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + iconv-lite@0.6, iconv-lite@^0.6.2, iconv-lite@^0.6.3: version "0.6.3" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - icss-utils@^5.0.0, icss-utils@^5.1.0: version "5.1.0" - resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== identity-obj-proxy@3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" + resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" integrity sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA== dependencies: harmony-reflect "^1.4.6" ieee754@^1.1.4: version "1.2.1" - resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== iferr@^0.1.5: version "0.1.5" - resolved "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" integrity sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA== ignore@^5.2.0, ignore@^5.2.4: - version "5.3.0" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" - integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== image-size@0.8.3: version "0.8.3" - resolved "https://registry.npmjs.org/image-size/-/image-size-0.8.3.tgz#f0b568857e034f29baffd37013587f2c0cad8b46" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.8.3.tgz#f0b568857e034f29baffd37013587f2c0cad8b46" integrity sha512-SMtq1AJ+aqHB45c3FsB4ERK0UCiA2d3H1uq8s+8T0Pf8A3W4teyBQyaFaktH6xvZqh+npwlKU7i4fJo0r7TYTg== dependencies: queue "6.0.1" image-size@~0.5.0: version "0.5.5" - resolved "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== -immutable@^4.0.0: - version "4.3.4" - resolved "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz#2e07b33837b4bb7662f288c244d1ced1ef65a78f" - integrity sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA== +immutable@^5.0.2: + version "5.1.3" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-5.1.3.tgz#e6486694c8b76c37c063cca92399fa64098634d4" + integrity sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg== import-fresh@^3.0.0, import-fresh@^3.2.1, import-fresh@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + version "3.3.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" import-lazy@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" integrity sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A== imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA== + inherits@2.0.3: version "2.0.3" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== ini@^1.3.3, ini@^1.3.4, ini@~1.3.0: version "1.3.8" - resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== inline-style-parser@0.1.1: version "0.1.1" - resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== inquirer@^6.2.2: version "6.5.2" - resolved "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== dependencies: ansi-escapes "^3.2.0" @@ -7580,126 +8276,135 @@ inquirer@^6.2.2: strip-ansi "^5.1.0" through "^2.3.6" -internal-slot@^1.0.4, internal-slot@^1.0.5: - version "1.0.6" - resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930" - integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg== +internal-slot@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" + integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== dependencies: - get-intrinsic "^1.2.2" - hasown "^2.0.0" - side-channel "^1.0.4" + es-errors "^1.3.0" + hasown "^2.0.2" + side-channel "^1.1.0" "internmap@1 - 2": version "2.0.3" - resolved "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" + resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== intersection-observer@^0.12.0: version "0.12.2" - resolved "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.12.2.tgz#4a45349cc0cd91916682b1f44c28d7ec737dc375" + resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.12.2.tgz#4a45349cc0cd91916682b1f44c28d7ec737dc375" integrity sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg== -intl-messageformat@10.5.8: - version "10.5.8" - resolved "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.5.8.tgz#7184da425f360a53a5483a6194e16d666b011fc0" - integrity sha512-NRf0jpBWV0vd671G5b06wNofAN8tp7WWDogMZyaU8GUAsmbouyvgwmFJI7zLjfAMpm3zK+vSwRP3jzaoIcMbaA== +intl-messageformat@10.7.7: + version "10.7.7" + resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.7.7.tgz#42085e1664729d02240a03346e31a2540b1112a0" + integrity sha512-F134jIoeYMro/3I0h08D0Yt4N9o9pjddU/4IIxMMURqbAtI2wu70X8hvG1V48W49zXHXv3RKSF/po+0fDfsGjA== dependencies: - "@formatjs/ecma402-abstract" "1.18.0" - "@formatjs/fast-memoize" "2.2.0" - "@formatjs/icu-messageformat-parser" "2.7.3" - tslib "^2.4.0" + "@formatjs/ecma402-abstract" "2.2.4" + "@formatjs/fast-memoize" "2.2.3" + "@formatjs/icu-messageformat-parser" "2.9.4" + tslib "2" invariant@^2.2.4: version "2.2.4" - resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" ip@^1.1.4: - version "1.1.8" - resolved "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" - integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== + version "1.1.9" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.9.tgz#8dfbcc99a754d07f425310b86a99546b1151e396" + integrity sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== is-alphabetical@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b" integrity sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ== is-alphanumerical@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz#7c03fbe96e3e931113e57f964b0a368cc2dfd875" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz#7c03fbe96e3e931113e57f964b0a368cc2dfd875" integrity sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw== dependencies: is-alphabetical "^2.0.0" is-decimal "^2.0.0" is-arguments@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.2.0.tgz#ad58c6aecf563b78ef2bf04df540da8f5d7d8e1b" + integrity sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA== dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" + call-bound "^1.0.2" + has-tostringtag "^1.0.2" -is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== +is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" + integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" + call-bind "^1.0.8" + call-bound "^1.0.3" + get-intrinsic "^1.2.6" is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-arrayish@^0.3.1: version "0.3.2" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== is-arrow-function@^2.0.3: version "2.0.3" - resolved "https://registry.npmjs.org/is-arrow-function/-/is-arrow-function-2.0.3.tgz#29be2c2d8d9450852b8bbafb635ba7b8d8e87ec2" + resolved "https://registry.yarnpkg.com/is-arrow-function/-/is-arrow-function-2.0.3.tgz#29be2c2d8d9450852b8bbafb635ba7b8d8e87ec2" integrity sha512-iDStzcT1FJMzx+TjCOK//uDugSe/Mif/8a+T0htydQ3qkJGvSweTZpVYz4hpJH0baloSPiAFQdA8WslAgJphvQ== dependencies: is-callable "^1.0.4" is-async-function@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" - integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523" + integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== dependencies: - has-tostringtag "^1.0.0" + async-function "^1.0.0" + call-bound "^1.0.3" + get-proto "^1.0.1" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" -is-bigint@^1.0.1, is-bigint@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== +is-bigint@^1.0.4, is-bigint@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" + integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== dependencies: - has-bigints "^1.0.1" + has-bigints "^1.0.2" is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" -is-boolean-object@^1.1.0, is-boolean-object@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== +is-boolean-object@^1.1.2, is-boolean-object@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e" + integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" + call-bound "^1.0.3" + has-tostringtag "^1.0.2" is-buffer@^1.1.5: version "1.1.6" - resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-buffer@^2.0.0, is-buffer@^2.0.2, is-buffer@^2.0.5: @@ -7707,50 +8412,60 @@ is-buffer@^2.0.0, is-buffer@^2.0.2, is-buffer@^2.0.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== -is-callable@^1.0.4, is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: +is-callable@^1.0.4, is-callable@^1.2.7: version "1.2.7" - resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-ci@^1.0.10: version "1.2.1" - resolved "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== dependencies: ci-info "^1.5.0" -is-core-module@^2.13.0, is-core-module@^2.5.0: - version "2.13.1" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== +is-core-module@^2.13.0, is-core-module@^2.16.0, is-core-module@^2.5.0: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== dependencies: - hasown "^2.0.0" + hasown "^2.0.2" -is-date-object@^1.0.1, is-date-object@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== +is-data-view@^1.0.1, is-data-view@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" + integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== dependencies: - has-tostringtag "^1.0.0" + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + is-typed-array "^1.1.13" + +is-date-object@^1.0.5, is-date-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7" + integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== + dependencies: + call-bound "^1.0.2" + has-tostringtag "^1.0.2" is-decimal@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" - resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== is-docker@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== is-equal@^1.6.4: version "1.7.0" - resolved "https://registry.npmjs.org/is-equal/-/is-equal-1.7.0.tgz#8d30187ef6336b6e7beda071c25c3bb49dd0338e" + resolved "https://registry.yarnpkg.com/is-equal/-/is-equal-1.7.0.tgz#8d30187ef6336b6e7beda071c25c3bb49dd0338e" integrity sha512-hErktGR9jmoYXNWlbrwGjc8eHh09mbY6TWSTTFtnMcKaCuSMN8z+Ni5ma/8mkbVpe4CbB7V6kN1MkCg9bCx5bA== dependencies: es-get-iterator "^1.1.3" @@ -7778,144 +8493,165 @@ is-equal@^1.6.4: is-extendable@^0.1.0: version "0.1.1" - resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-finalizationregistry@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" - integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== +is-finalizationregistry@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90" + integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== dependencies: - call-bind "^1.0.2" + call-bound "^1.0.3" is-fullwidth-code-point@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-fullwidth-code-point@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== +is-fullwidth-code-point@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz#9609efced7c2f97da7b60145ef481c787c7ba704" + integrity sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA== + dependencies: + get-east-asian-width "^1.0.0" + is-generator-function@^1.0.10: - version "1.0.10" - resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.0.tgz#bf3eeda931201394f57b5dba2800f91a238309ca" + integrity sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ== dependencies: - has-tostringtag "^1.0.0" + call-bound "^1.0.3" + get-proto "^1.0.0" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-hexadecimal@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== is-inside-container@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" + resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== dependencies: is-docker "^3.0.0" is-installed-globally@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" integrity sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw== dependencies: global-dirs "^0.1.0" is-path-inside "^1.0.0" -is-map@^2.0.1, is-map@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" - integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== +is-map@^2.0.2, is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== is-npm@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" integrity sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg== -is-number-object@^1.0.4, is-number-object@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== +is-number-object@^1.0.7, is-number-object@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541" + integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== dependencies: - has-tostringtag "^1.0.0" + call-bound "^1.0.3" + has-tostringtag "^1.0.2" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-obj@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== is-obj@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== is-path-inside@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" integrity sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g== dependencies: path-is-inside "^1.0.1" is-plain-obj@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== is-plain-obj@^4.0.0, is-plain-obj@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== is-plain-object@^2.0.1: version "2.0.4" - resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" is-plain-object@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== is-redirect@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" integrity sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw== -is-regex@^1.1.4, is-regex@~1.1.4: +is-regex@^1.1.4, is-regex@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" + integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== + dependencies: + call-bound "^1.0.2" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +is-regex@~1.1.4: version "1.1.4" - resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== dependencies: call-bind "^1.0.2" @@ -7923,141 +8659,149 @@ is-regex@^1.1.4, is-regex@~1.1.4: is-retry-allowed@^1.0.0: version "1.2.0" - resolved "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== -is-set@^2.0.1, is-set@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" - integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== +is-set@^2.0.2, is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== +is-shared-array-buffer@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f" + integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== dependencies: - call-bind "^1.0.2" + call-bound "^1.0.3" is-stream@^1.0.0, is-stream@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== is-stream@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== is-stream@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== +is-string@^1.0.7, is-string@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" + integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== dependencies: - has-tostringtag "^1.0.0" + call-bound "^1.0.3" + has-tostringtag "^1.0.2" -is-symbol@^1.0.2, is-symbol@^1.0.3, is-symbol@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== +is-symbol@^1.0.4, is-symbol@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634" + integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== dependencies: - has-symbols "^1.0.2" + call-bound "^1.0.2" + has-symbols "^1.1.0" + safe-regex-test "^1.1.0" is-text-path@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz#b2484e2b720a633feb2e85b67dc193ff72c75636" + resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-2.0.0.tgz#b2484e2b720a633feb2e85b67dc193ff72c75636" integrity sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw== dependencies: text-extensions "^2.0.0" -is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9: - version "1.1.12" - resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" - integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== +is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" + integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== dependencies: - which-typed-array "^1.1.11" + which-typed-array "^1.1.16" -is-weakmap@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" - integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== +is-weakref@^1.0.2, is-weakref@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293" + integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== dependencies: - call-bind "^1.0.2" + call-bound "^1.0.3" -is-weakset@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" - integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== +is-weakset@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca" + integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" + call-bound "^1.0.3" + get-intrinsic "^1.2.6" is-what@^3.14.1: version "3.14.1" - resolved "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" + resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== is-windows@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" integrity sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q== is-wsl@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw== is-wsl@^2.2.0: version "2.2.0" - resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== dependencies: is-docker "^2.0.0" isarray@0.0.1: version "0.0.1" - resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isarray@^2.0.5: version "2.0.5" - resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isobject@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== +isomorphic-rslog@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/isomorphic-rslog/-/isomorphic-rslog-0.0.7.tgz#e4e618b511a32f505e91ef28d9d5fb457ea1d45e" + integrity sha512-n6/XnKnZ5eLEj6VllG4XmamXG7/F69nls8dcynHyhcTpsPUYgcgx4ifEaCo4lQJ2uzwfmIT+F0KBGwBcMKmt5g== + isomorphic-unfetch@4.0.2: version "4.0.2" - resolved "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-4.0.2.tgz#5fc04eeb1053b7b702278e2cf7a3f246cb3a9214" + resolved "https://registry.yarnpkg.com/isomorphic-unfetch/-/isomorphic-unfetch-4.0.2.tgz#5fc04eeb1053b7b702278e2cf7a3f246cb3a9214" integrity sha512-1Yd+CF/7al18/N2BDbsLBcp6RO3tucSW+jcLq24dqdX5MNbCNTw1z4BsGsp4zNmjr/Izm2cs/cEqZPp4kvWSCA== dependencies: node-fetch "^3.2.0" @@ -8065,12 +8809,12 @@ isomorphic-unfetch@4.0.2: istanbul-lib-coverage@^3.2.0: version "3.2.2" - resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== istanbul-lib-instrument@^5.0.4: version "5.2.1" - resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== dependencies: "@babel/core" "^7.12.3" @@ -8081,28 +8825,29 @@ istanbul-lib-instrument@^5.0.4: istextorbinary@^2.2.1: version "2.6.0" - resolved "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.6.0.tgz#60776315fb0fa3999add276c02c69557b9ca28ab" + resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.6.0.tgz#60776315fb0fa3999add276c02c69557b9ca28ab" integrity sha512-+XRlFseT8B3L9KyjxxLjfXSLMuErKDsd8DBNrsaxoViABMEZlOSCstwmw0qpoFX3+U6yWU1yhLudAe6/lETGGA== dependencies: binaryextensions "^2.1.2" editions "^2.2.0" textextensions "^2.5.0" -iterator.prototype@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" - integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== +iterator.prototype@^1.1.4: + version "1.1.5" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.5.tgz#12c959a29de32de0aa3bbbb801f4d777066dae39" + integrity sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g== dependencies: - define-properties "^1.2.1" - get-intrinsic "^1.2.1" - has-symbols "^1.0.3" - reflect.getprototypeof "^1.0.4" - set-function-name "^2.0.1" + define-data-property "^1.1.4" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.6" + get-proto "^1.0.0" + has-symbols "^1.1.0" + set-function-name "^2.0.2" jackspeak@^3.1.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.0.tgz#a75763ff36ad778ede6a156d8ee8b124de445b4a" - integrity sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw== + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== dependencies: "@isaacs/cliui" "^8.0.2" optionalDependencies: @@ -8110,12 +8855,17 @@ jackspeak@^3.1.2: javascript-natural-sort@^0.7.1: version "0.7.1" - resolved "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59" + resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59" integrity sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw== +javascript-stringify@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-2.1.0.tgz#27c76539be14d8bd128219a2d731b09337904e79" + integrity sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg== + jest-haste-map@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== dependencies: "@jest/types" "^29.6.3" @@ -8134,12 +8884,12 @@ jest-haste-map@^29.7.0: jest-regex-util@^29.6.3: version "29.6.3" - resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== jest-util@^29.4.3, jest-util@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== dependencies: "@jest/types" "^29.6.3" @@ -8151,7 +8901,7 @@ jest-util@^29.4.3, jest-util@^29.7.0: jest-worker@29.4.3: version "29.4.3" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-29.4.3.tgz#9a4023e1ea1d306034237c7133d7da4240e8934e" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.4.3.tgz#9a4023e1ea1d306034237c7133d7da4240e8934e" integrity sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA== dependencies: "@types/node" "*" @@ -8161,7 +8911,7 @@ jest-worker@29.4.3: jest-worker@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== dependencies: "@types/node" "*" @@ -8169,24 +8919,24 @@ jest-worker@^29.7.0: merge-stream "^2.0.0" supports-color "^8.0.0" -jiti@^1.19.1: - version "1.21.0" - resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" - integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== +jiti@^1.20.0, jiti@^1.21.6: + version "1.21.7" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.7.tgz#9dd81043424a3d28458b193d965f0d18a2300ba9" + integrity sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A== -js-cookie@^2.x.x: - version "2.2.1" - resolved "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" - integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== +js-cookie@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.5.tgz#0b7e2fd0c01552c58ba86e0841f94dc2557dcdbc" + integrity sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: version "3.14.1" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" @@ -8194,65 +8944,70 @@ js-yaml@^3.13.1: js-yaml@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" jsesc@^2.5.1: version "2.5.2" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + json-parse-better-errors@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== json-parse-even-better-errors@^2.3.0: version "2.3.1" - resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema-traverse@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== json2module@^0.0.3: version "0.0.3" - resolved "https://registry.npmjs.org/json2module/-/json2module-0.0.3.tgz#00fb5f4a9b7adfc3f0647c29cb17bcd1979be9b2" + resolved "https://registry.yarnpkg.com/json2module/-/json2module-0.0.3.tgz#00fb5f4a9b7adfc3f0647c29cb17bcd1979be9b2" integrity sha512-qYGxqrRrt4GbB8IEOy1jJGypkNsjWoIMlZt4bAsmUScCA507Hbc2p1JOhBzqn45u3PWafUgH2OnzyNU7udO/GA== dependencies: rw "^1.3.2" json2mq@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz#b637bd3ba9eabe122c83e9720483aeb10d2c904a" + resolved "https://registry.yarnpkg.com/json2mq/-/json2mq-0.2.0.tgz#b637bd3ba9eabe122c83e9720483aeb10d2c904a" integrity sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA== dependencies: string-convert "^0.2.0" json5@^2.1.2, json5@^2.2.3: version "2.2.3" - resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonfile@^3.0.0: version "3.0.1" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" integrity sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w== optionalDependencies: graceful-fs "^4.1.6" jsonfile@^6.0.1: version "6.1.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: universalify "^2.0.0" @@ -8261,17 +9016,17 @@ jsonfile@^6.0.1: jsonparse@^1.2.0: version "1.3.1" - resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== jstat@^1.9.6: version "1.9.6" - resolved "https://registry.npmjs.org/jstat/-/jstat-1.9.6.tgz#60e801b0d4c26e37aab0f375d1859fe9d60e10c0" + resolved "https://registry.yarnpkg.com/jstat/-/jstat-1.9.6.tgz#60e801b0d4c26e37aab0f375d1859fe9d60e10c0" integrity sha512-rPBkJbK2TnA8pzs93QcDDPlKcrtZWuuCo2dVR0TFLOJSxhqfWOVCSp8aV3/oSbn+4uY4yw1URtLpHQedtmXfug== "jsx-ast-utils@^2.4.1 || ^3.0.0": version "3.3.5" - resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== dependencies: array-includes "^3.1.6" @@ -8281,68 +9036,73 @@ jstat@^1.9.6: khroma@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz#45f2ce94ce231a437cf5b63c2e886e6eb42bbbb1" + resolved "https://registry.yarnpkg.com/khroma/-/khroma-2.1.0.tgz#45f2ce94ce231a437cf5b63c2e886e6eb42bbbb1" integrity sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw== kind-of@^3.0.2: version "3.2.2" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== dependencies: is-buffer "^1.1.5" kind-of@^6.0.3: version "6.0.3" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== kleur@^4.0.3: version "4.1.5" - resolved "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== kolorist@^1.6.0: version "1.8.0" - resolved "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz#edddbbbc7894bc13302cdf740af6374d4a04743c" + resolved "https://registry.yarnpkg.com/kolorist/-/kolorist-1.8.0.tgz#edddbbbc7894bc13302cdf740af6374d4a04743c" integrity sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ== latest-version@^3.0.0: version "3.1.0" - resolved "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" integrity sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w== dependencies: package-json "^4.0.0" layout-base@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz#1291e296883c322a9dd4c5dd82063721b53e26e2" + resolved "https://registry.yarnpkg.com/layout-base/-/layout-base-1.0.2.tgz#1291e296883c322a9dd4c5dd82063721b53e26e2" integrity sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg== layout-base@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz#d0337913586c90f9c2c075292069f5c2da5dd285" + resolved "https://registry.yarnpkg.com/layout-base/-/layout-base-2.0.1.tgz#d0337913586c90f9c2c075292069f5c2da5dd285" integrity sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg== lazy-cache@^1.0.3, lazy-cache@^1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" integrity sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ== leac@^0.6.0: version "0.6.0" - resolved "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz#dcf136e382e666bd2475f44a1096061b70dc0912" + resolved "https://registry.yarnpkg.com/leac/-/leac-0.6.0.tgz#dcf136e382e666bd2475f44a1096061b70dc0912" integrity sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg== -less-plugin-resolve@1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/less-plugin-resolve/-/less-plugin-resolve-1.0.0.tgz#c5cd9a4f75f24eccd69201df3a04b76eb5d806dc" - integrity sha512-offjRh1TfGsTgK0cqpl+RXFB0TFL6rPWy0yhCLhqhSEdWGVQp28K7wZ/ceUrRmWfZ5CSckYMe/KI+ViwaPLljQ== +less-loader@^12.2.0: + version "12.3.0" + resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-12.3.0.tgz#d4a00361568be86a97da3df4f16954b0d4c15340" + integrity sha512-0M6+uYulvYIWs52y0LqN4+QM9TqWAohYSNTo4htE8Z7Cn3G/qQMEmktfHmyJT23k+20kU9zHH2wrfFXkxNLtVw== + +less-plugin-resolve@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/less-plugin-resolve/-/less-plugin-resolve-1.0.2.tgz#da86d9ea78d762008d1221e619c99fe616d772c8" + integrity sha512-e1AHq0XNTU8S3d9JCc8CFYajoUBr0EK3pcuLT5PogyBBeE0knzZJL105kKKSZWfq2lQLq3/uEDrMK3JPq+fHaA== dependencies: enhanced-resolve "^5.15.0" less@4.1.3: version "4.1.3" - resolved "https://registry.npmjs.org/less/-/less-4.1.3.tgz#175be9ddcbf9b250173e0a00b4d6920a5b770246" + resolved "https://registry.yarnpkg.com/less/-/less-4.1.3.tgz#175be9ddcbf9b250173e0a00b4d6920a5b770246" integrity sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA== dependencies: copy-anything "^2.0.1" @@ -8357,260 +9117,293 @@ less@4.1.3: needle "^3.1.0" source-map "~0.6.0" -lightningcss-darwin-arm64@1.19.0: - version "1.19.0" - resolved "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.19.0.tgz#56ab071e932f845dbb7667f44f5b78441175a343" - integrity sha512-wIJmFtYX0rXHsXHSr4+sC5clwblEMji7HHQ4Ub1/CznVRxtCFha6JIt5JZaNf8vQrfdZnBxLLC6R8pC818jXqg== - -lightningcss-darwin-x64@1.19.0: - version "1.19.0" - resolved "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.19.0.tgz#c867308b88859ba61a2c46c82b1ca52ff73a1bd0" - integrity sha512-Lif1wD6P4poaw9c/4Uh2z+gmrWhw/HtXFoeZ3bEsv6Ia4tt8rOJBdkfVaUJ6VXmpKHALve+iTyP2+50xY1wKPw== - -lightningcss-linux-arm-gnueabihf@1.19.0: - version "1.19.0" - resolved "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.19.0.tgz#0f921dc45f2e5c3aea70fab98844ac0e5f2f81be" - integrity sha512-P15VXY5682mTXaiDtbnLYQflc8BYb774j2R84FgDLJTN6Qp0ZjWEFyN1SPqyfTj2B2TFjRHRUvQSSZ7qN4Weig== - -lightningcss-linux-arm64-gnu@1.19.0: - version "1.19.0" - resolved "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.19.0.tgz#027f9df9c7f4ffa127c37a71726245a5794d7ba2" - integrity sha512-zwXRjWqpev8wqO0sv0M1aM1PpjHz6RVIsBcxKszIG83Befuh4yNysjgHVplF9RTU7eozGe3Ts7r6we1+Qkqsww== - -lightningcss-linux-arm64-musl@1.19.0: - version "1.19.0" - resolved "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.19.0.tgz#85ea987da868524eac6db94f8e1eaa23d0b688a3" - integrity sha512-vSCKO7SDnZaFN9zEloKSZM5/kC5gbzUjoJQ43BvUpyTFUX7ACs/mDfl2Eq6fdz2+uWhUh7vf92c4EaaP4udEtA== - -lightningcss-linux-x64-gnu@1.19.0: - version "1.19.0" - resolved "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.19.0.tgz#02bec89579ab4153dccc0def755d1fd9e3ee7f3c" - integrity sha512-0AFQKvVzXf9byrXUq9z0anMGLdZJS+XSDqidyijI5njIwj6MdbvX2UZK/c4FfNmeRa2N/8ngTffoIuOUit5eIQ== - -lightningcss-linux-x64-musl@1.19.0: - version "1.19.0" - resolved "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.19.0.tgz#e36a5df8193ae961d22974635e4c100a1823bb8c" - integrity sha512-SJoM8CLPt6ECCgSuWe+g0qo8dqQYVcPiW2s19dxkmSI5+Uu1GIRzyKA0b7QqmEXolA+oSJhQqCmJpzjY4CuZAg== - -lightningcss-win32-x64-msvc@1.19.0: - version "1.19.0" - resolved "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.19.0.tgz#0854dbd153035eca1396e2227c708ad43655a61c" - integrity sha512-C+VuUTeSUOAaBZZOPT7Etn/agx/MatzJzGRkeV+zEABmPuntv1zihncsi+AyGmjkkzq3wVedEy7h0/4S84mUtg== - -lightningcss@1.19.0: - version "1.19.0" - resolved "https://registry.npmjs.org/lightningcss/-/lightningcss-1.19.0.tgz#fbbad0975de66252e38d96b5bdd2a62f2dd0ffbf" - integrity sha512-yV5UR7og+Og7lQC+70DA7a8ta1uiOPnWPJfxa0wnxylev5qfo4P+4iMpzWAdYWOca4jdNQZii+bDL/l+4hUXIA== +less@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/less/-/less-4.4.0.tgz#deaf881f4880ee80691beae925b8fac699d3a76d" + integrity sha512-kdTwsyRuncDfjEs0DlRILWNvxhDG/Zij4YLO4TMJgDLW+8OzpfkdPnRgrsRuY1o+oaxJGWsps5f/RVBgGmmN0w== + dependencies: + copy-anything "^2.0.1" + parse-node-version "^1.0.1" + tslib "^2.3.0" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + make-dir "^2.1.0" + mime "^1.4.1" + needle "^3.1.0" + source-map "~0.6.0" + +lightningcss-darwin-arm64@1.22.1: + version "1.22.1" + resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.22.1.tgz#c03c042335fd7e9e1f45c977b39ff6886b8b064f" + integrity sha512-ldvElu+R0QimNTjsKpaZkUv3zf+uefzLy/R1R19jtgOfSRM+zjUCUgDhfEDRmVqJtMwYsdhMI2aJtJChPC6Osg== + +lightningcss-darwin-x64@1.22.1: + version "1.22.1" + resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.22.1.tgz#cdd380006a176b7faea83d1d642d9c5d65620f74" + integrity sha512-5p2rnlVTv6Gpw4PlTLq925nTVh+HFh4MpegX8dPDYJae+NFVjQ67gY7O6iHIzQjLipDiYejFF0yHrhjU3XgLBQ== + +lightningcss-freebsd-x64@1.22.1: + version "1.22.1" + resolved "https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.22.1.tgz#dd1b19308e3b0f24b6f79da10fd3975e5e02ebda" + integrity sha512-1FaBtcFrZqB2hkFbAxY//Pnp8koThvyB6AhjbdVqKD4/pu13Rl91fKt2N9qyeQPUt3xy7ORUvSO+dPk3J6EjXg== + +lightningcss-linux-arm-gnueabihf@1.22.1: + version "1.22.1" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.22.1.tgz#134cf9b41abd44ec53d8bae02c9f6e4f257eb617" + integrity sha512-6rub98tYGfE5I5j0BP8t/2d4BZyu1S7Iz9vUkm0H26snAFHYxLfj3RbQn0xHHIePSetjLnhcg3QlfwUAkD/FYg== + +lightningcss-linux-arm64-gnu@1.22.1: + version "1.22.1" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.22.1.tgz#33800723fb3d782c71cc131cf38ca678a0e9d1fa" + integrity sha512-nYO5qGtb/1kkTZu3FeTiM+2B2TAb7m2DkLCTgQIs2bk2o9aEs7I96fwySKcoHWQAiQDGR9sMux9vkV4KQXqPaQ== + +lightningcss-linux-arm64-musl@1.22.1: + version "1.22.1" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.22.1.tgz#cff86acaa98a0245add5a333098befc894802137" + integrity sha512-MCV6RuRpzXbunvzwY644iz8cw4oQxvW7oer9xPkdadYqlEyiJJ6wl7FyJOH7Q6ZYH4yjGAUCvxDBxPbnDu9ZVg== + +lightningcss-linux-x64-gnu@1.22.1: + version "1.22.1" + resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.22.1.tgz#3f68602228b49d661db0692548e061456b603ca2" + integrity sha512-RjNgpdM20VUXgV7us/VmlO3Vn2ZRiDnc3/bUxCVvySZWPiVPprpqW/QDWuzkGa+NCUf6saAM5CLsZLSxncXJwg== + +lightningcss-linux-x64-musl@1.22.1: + version "1.22.1" + resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.22.1.tgz#e713e56798f8a50df3e3f285ef102191a01ef951" + integrity sha512-ZgO4C7Rd6Hv/5MnyY2KxOYmIlzk4rplVolDt3NbkNR8DndnyX0Q5IR4acJWNTBICQ21j3zySzKbcJaiJpk/4YA== + +lightningcss-win32-x64-msvc@1.22.1: + version "1.22.1" + resolved "https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.22.1.tgz#48b141554bf05cc4338f064b6892dd5dd16185ef" + integrity sha512-4pozV4eyD0MDET41ZLHAeBo+H04Nm2UEYIk5w/ts40231dRFV7E0cjwbnZvSoc1DXFgecAhiC0L16ruv/ZDCpg== + +lightningcss@1.22.1: + version "1.22.1" + resolved "https://registry.yarnpkg.com/lightningcss/-/lightningcss-1.22.1.tgz#8108ddecb2e859032bdd99908abd2b37515b1750" + integrity sha512-Fy45PhibiNXkm0cK5FJCbfO8Y6jUpD/YcHf/BtuI+jvYYqSXKF4muk61jjE8YxCR9y+hDYIWSzHTc+bwhDE6rQ== dependencies: detect-libc "^1.0.3" optionalDependencies: - lightningcss-darwin-arm64 "1.19.0" - lightningcss-darwin-x64 "1.19.0" - lightningcss-linux-arm-gnueabihf "1.19.0" - lightningcss-linux-arm64-gnu "1.19.0" - lightningcss-linux-arm64-musl "1.19.0" - lightningcss-linux-x64-gnu "1.19.0" - lightningcss-linux-x64-musl "1.19.0" - lightningcss-win32-x64-msvc "1.19.0" - -lilconfig@2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + lightningcss-darwin-arm64 "1.22.1" + lightningcss-darwin-x64 "1.22.1" + lightningcss-freebsd-x64 "1.22.1" + lightningcss-linux-arm-gnueabihf "1.22.1" + lightningcss-linux-arm64-gnu "1.22.1" + lightningcss-linux-arm64-musl "1.22.1" + lightningcss-linux-x64-gnu "1.22.1" + lightningcss-linux-x64-musl "1.22.1" + lightningcss-win32-x64-msvc "1.22.1" + +lilconfig@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" + integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== linkify-it@^4.0.1: version "4.0.1" - resolved "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz#01f1d5e508190d06669982ba31a7d9f56a5751ec" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-4.0.1.tgz#01f1d5e508190d06669982ba31a7d9f56a5751ec" integrity sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw== dependencies: uc.micro "^1.0.1" lint-staged@^15.0.2: - version "15.1.0" - resolved "https://registry.npmjs.org/lint-staged/-/lint-staged-15.1.0.tgz#c0f8e4d96ac3c09beac5c76d08524d6000c207b4" - integrity sha512-ZPKXWHVlL7uwVpy8OZ7YQjYDAuO5X4kMh0XgZvPNxLcCCngd0PO5jKQyy3+s4TL2EnHoIXIzP1422f/l3nZKMw== - dependencies: - chalk "5.3.0" - commander "11.1.0" - debug "4.3.4" - execa "8.0.1" - lilconfig "2.1.0" - listr2 "7.0.2" - micromatch "4.0.5" - pidtree "0.6.0" - string-argv "0.3.2" - yaml "2.3.4" - -listr2@7.0.2: - version "7.0.2" - resolved "https://registry.npmjs.org/listr2/-/listr2-7.0.2.tgz#3aa3e1549dfaf3c57ab5eeaba754da3b87f33063" - integrity sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g== - dependencies: - cli-truncate "^3.1.0" + version "15.5.2" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.5.2.tgz#beff028fd0681f7db26ffbb67050a21ed4d059a3" + integrity sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w== + dependencies: + chalk "^5.4.1" + commander "^13.1.0" + debug "^4.4.0" + execa "^8.0.1" + lilconfig "^3.1.3" + listr2 "^8.2.5" + micromatch "^4.0.8" + pidtree "^0.6.0" + string-argv "^0.3.2" + yaml "^2.7.0" + +listr2@^8.2.5: + version "8.3.3" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.3.3.tgz#815fc8f738260ff220981bf9e866b3e11e8121bf" + integrity sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ== + dependencies: + cli-truncate "^4.0.0" colorette "^2.0.20" eventemitter3 "^5.0.1" - log-update "^5.0.1" - rfdc "^1.3.0" - wrap-ansi "^8.1.0" + log-update "^6.1.0" + rfdc "^1.4.1" + wrap-ansi "^9.0.0" + +loader-runner@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== loader-utils@^2.0.0, loader-utils@^2.0.4: version "2.0.4" - resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" json5 "^2.1.2" +loader-utils@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.3.1.tgz#735b9a19fd63648ca7adbd31c2327dfe281304e5" + integrity sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg== + local-pkg@^0.4.2: version "0.4.3" - resolved "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz#0ff361ab3ae7f1c19113d9bb97b98b905dbc4963" + resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.4.3.tgz#0ff361ab3ae7f1c19113d9bb97b98b905dbc4963" integrity sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g== locate-path@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" lodash-es@^4.17.21: version "4.17.21" - resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== lodash.camelcase@^4.3.0: version "4.3.0" - resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== lodash.flow@^3.5.0: version "3.5.0" - resolved "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a" + resolved "https://registry.yarnpkg.com/lodash.flow/-/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a" integrity sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw== lodash.isfunction@^3.0.9: version "3.0.9" - resolved "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" + resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw== lodash.isplainobject@^4.0.6: version "4.0.6" - resolved "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== lodash.kebabcase@^4.1.1: version "4.1.1" - resolved "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" + resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash.mergewith@^4.6.2: version "4.6.2" - resolved "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== lodash.snakecase@^4.1.1: version "4.1.1" - resolved "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" + resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== lodash.startcase@^4.4.0: version "4.4.0" - resolved "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" + resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" integrity sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== lodash.throttle@^4.1.1: version "4.1.1" - resolved "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" + resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ== lodash.uniq@^4.5.0: version "4.5.0" - resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== lodash.upperfirst@^4.3.1: version "4.3.1" - resolved "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" + resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== -lodash@4.17.21, lodash@^4.17.12, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.17.5: +lodash@4.17.21, lodash@^4.17.10, lodash@^4.17.12, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.17.5: version "4.17.21" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log-symbols@^2.1.0: version "2.2.0" - resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== dependencies: chalk "^2.0.1" -log-update@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz#9e928bf70cb183c1f0c9e91d9e6b7115d597ce09" - integrity sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw== +log-update@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.1.0.tgz#1a04ff38166f94647ae1af562f4bd6a15b1b7cd4" + integrity sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w== dependencies: - ansi-escapes "^5.0.0" - cli-cursor "^4.0.0" - slice-ansi "^5.0.0" - strip-ansi "^7.0.1" - wrap-ansi "^8.0.1" + ansi-escapes "^7.0.0" + cli-cursor "^5.0.0" + slice-ansi "^7.1.0" + strip-ansi "^7.1.0" + wrap-ansi "^9.0.0" longest-streak@^3.0.0: version "3.1.0" - resolved "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== longest@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" integrity sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg== loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" lower-case@^2.0.1, lower-case@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== dependencies: tslib "^2.0.3" lowercase-keys@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== lru-cache@^10.2.0: - version "10.2.2" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878" - integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== lru-cache@^4.0.1, lru-cache@^4.1.1: version "4.1.5" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== dependencies: pseudomap "^1.0.2" @@ -8618,38 +9411,38 @@ lru-cache@^4.0.1, lru-cache@^4.1.1: lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" lru-cache@^7.5.1: version "7.18.3" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== lz-string@^1.4.4: version "1.5.0" - resolved "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" + resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== make-dir@^1.0.0: version "1.3.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== dependencies: pify "^3.0.0" make-dir@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== dependencies: pify "^4.0.1" @@ -8657,7 +9450,7 @@ make-dir@^2.1.0: make-fetch-happen@^2.4.13: version "2.6.0" - resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-2.6.0.tgz#8474aa52198f6b1ae4f3094c04e8370d35ea8a38" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-2.6.0.tgz#8474aa52198f6b1ae4f3094c04e8370d35ea8a38" integrity sha512-FFq0lNI0ax+n9IWzWpH8A4JdgYiAp2DDYIZ3rsaav8JDe8I+72CzK6PQW/oom15YDZpV5bYW/9INd6nIJ2ZfZw== dependencies: agentkeepalive "^3.3.0" @@ -8674,24 +9467,24 @@ make-fetch-happen@^2.4.13: makeerror@1.0.12: version "1.0.12" - resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== dependencies: tmpl "1.0.5" map-obj@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== map-obj@^4.0.0: version "4.3.0" - resolved "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== markdown-it-highlightjs@3.3.1: version "3.3.1" - resolved "https://registry.npmjs.org/markdown-it-highlightjs/-/markdown-it-highlightjs-3.3.1.tgz#38403610487292b8a1ae2d1acc7bb66e4ede6be8" + resolved "https://registry.yarnpkg.com/markdown-it-highlightjs/-/markdown-it-highlightjs-3.3.1.tgz#38403610487292b8a1ae2d1acc7bb66e4ede6be8" integrity sha512-T9L+37CC+H/aQWHbHCpmo6FvSH2imqXYjZj/Tj064UmPn0aCne/bAtSORo6W5x7BdLIWwbTR20xrdlKDAq0M6w== dependencies: highlight.js "^10.2.0" @@ -8699,7 +9492,7 @@ markdown-it-highlightjs@3.3.1: markdown-it@13.0.1: version "13.0.1" - resolved "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz#c6ecc431cacf1a5da531423fc6a42807814af430" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-13.0.1.tgz#c6ecc431cacf1a5da531423fc6a42807814af430" integrity sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q== dependencies: argparse "^2.0.1" @@ -8709,13 +9502,18 @@ markdown-it@13.0.1: uc.micro "^1.0.5" markdown-table@^3.0.0: - version "3.0.3" - resolved "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz#e6331d30e493127e031dd385488b5bd326e4a6bd" - integrity sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw== + version "3.0.4" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.4.tgz#fe44d6d410ff9d6f2ea1797a3f60aa4d2b631c2a" + integrity sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw== + +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== mathjs@^10.6.0: version "10.6.4" - resolved "https://registry.npmjs.org/mathjs/-/mathjs-10.6.4.tgz#1b87a1268781d64f0c8b4e5e1b36cf7ecf58bb05" + resolved "https://registry.yarnpkg.com/mathjs/-/mathjs-10.6.4.tgz#1b87a1268781d64f0c8b4e5e1b36cf7ecf58bb05" integrity sha512-omQyvRE1jIy+3k2qsqkWASOcd45aZguXZDckr3HtnTYyXk5+2xpVfC3kATgbO2Srjxlqww3TVdhD0oUdZ/hiFA== dependencies: "@babel/runtime" "^7.18.6" @@ -8730,7 +9528,7 @@ mathjs@^10.6.0: md5.js@^1.3.4: version "1.3.5" - resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== dependencies: hash-base "^3.0.0" @@ -8739,7 +9537,7 @@ md5.js@^1.3.4: mdast-util-definitions@^5.0.0: version "5.1.2" - resolved "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz#9910abb60ac5d7115d6819b57ae0bcef07a3f7a7" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz#9910abb60ac5d7115d6819b57ae0bcef07a3f7a7" integrity sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA== dependencies: "@types/mdast" "^3.0.0" @@ -8748,7 +9546,7 @@ mdast-util-definitions@^5.0.0: mdast-util-directive@^2.0.0: version "2.2.4" - resolved "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-2.2.4.tgz#e397ed699ec83938cb4a48dc1cec3ae69cbd7aa3" + resolved "https://registry.yarnpkg.com/mdast-util-directive/-/mdast-util-directive-2.2.4.tgz#e397ed699ec83938cb4a48dc1cec3ae69cbd7aa3" integrity sha512-sK3ojFP+jpj1n7Zo5ZKvoxP1MvLyzVG63+gm40Z/qI00avzdPCYxt7RBMgofwAva9gBjbDBWVRB/i+UD+fUCzQ== dependencies: "@types/mdast" "^3.0.0" @@ -8761,7 +9559,7 @@ mdast-util-directive@^2.0.0: mdast-util-find-and-replace@^2.0.0, mdast-util-find-and-replace@^2.2.2: version "2.2.2" - resolved "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz#cc2b774f7f3630da4bd592f61966fecade8b99b1" + resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz#cc2b774f7f3630da4bd592f61966fecade8b99b1" integrity sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw== dependencies: "@types/mdast" "^3.0.0" @@ -8771,7 +9569,7 @@ mdast-util-find-and-replace@^2.0.0, mdast-util-find-and-replace@^2.2.2: mdast-util-from-markdown@^1.0.0, mdast-util-from-markdown@^1.3.0: version "1.3.1" - resolved "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz#9421a5a247f10d31d2faed2a30df5ec89ceafcf0" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz#9421a5a247f10d31d2faed2a30df5ec89ceafcf0" integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww== dependencies: "@types/mdast" "^3.0.0" @@ -8789,7 +9587,7 @@ mdast-util-from-markdown@^1.0.0, mdast-util-from-markdown@^1.3.0: mdast-util-frontmatter@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-1.0.1.tgz#79c46d7414eb9d3acabe801ee4a70a70b75e5af1" + resolved "https://registry.yarnpkg.com/mdast-util-frontmatter/-/mdast-util-frontmatter-1.0.1.tgz#79c46d7414eb9d3acabe801ee4a70a70b75e5af1" integrity sha512-JjA2OjxRqAa8wEG8hloD0uTU0kdn8kbtOWpPP94NBkfAlbxn4S8gCGf/9DwFtEeGPXrDcNXdiDjVaRdUFqYokw== dependencies: "@types/mdast" "^3.0.0" @@ -8798,7 +9596,7 @@ mdast-util-frontmatter@^1.0.0: mdast-util-gfm-autolink-literal@^1.0.0: version "1.0.3" - resolved "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz#67a13abe813d7eba350453a5333ae1bc0ec05c06" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz#67a13abe813d7eba350453a5333ae1bc0ec05c06" integrity sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA== dependencies: "@types/mdast" "^3.0.0" @@ -8808,7 +9606,7 @@ mdast-util-gfm-autolink-literal@^1.0.0: mdast-util-gfm-footnote@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz#ce5e49b639c44de68d5bf5399877a14d5020424e" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz#ce5e49b639c44de68d5bf5399877a14d5020424e" integrity sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ== dependencies: "@types/mdast" "^3.0.0" @@ -8817,7 +9615,7 @@ mdast-util-gfm-footnote@^1.0.0: mdast-util-gfm-strikethrough@^1.0.0: version "1.0.3" - resolved "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz#5470eb105b483f7746b8805b9b989342085795b7" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz#5470eb105b483f7746b8805b9b989342085795b7" integrity sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ== dependencies: "@types/mdast" "^3.0.0" @@ -8825,7 +9623,7 @@ mdast-util-gfm-strikethrough@^1.0.0: mdast-util-gfm-table@^1.0.0: version "1.0.7" - resolved "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz#3552153a146379f0f9c4c1101b071d70bbed1a46" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz#3552153a146379f0f9c4c1101b071d70bbed1a46" integrity sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg== dependencies: "@types/mdast" "^3.0.0" @@ -8835,7 +9633,7 @@ mdast-util-gfm-table@^1.0.0: mdast-util-gfm-task-list-item@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz#b280fcf3b7be6fd0cc012bbe67a59831eb34097b" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz#b280fcf3b7be6fd0cc012bbe67a59831eb34097b" integrity sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ== dependencies: "@types/mdast" "^3.0.0" @@ -8843,7 +9641,7 @@ mdast-util-gfm-task-list-item@^1.0.0: mdast-util-gfm@^2.0.0: version "2.0.2" - resolved "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz#e92f4d8717d74bdba6de57ed21cc8b9552e2d0b6" + resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz#e92f4d8717d74bdba6de57ed21cc8b9552e2d0b6" integrity sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg== dependencies: mdast-util-from-markdown "^1.0.0" @@ -8856,7 +9654,7 @@ mdast-util-gfm@^2.0.0: mdast-util-mdx-expression@^1.0.0: version "1.3.2" - resolved "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-1.3.2.tgz#d027789e67524d541d6de543f36d51ae2586f220" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-1.3.2.tgz#d027789e67524d541d6de543f36d51ae2586f220" integrity sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA== dependencies: "@types/estree-jsx" "^1.0.0" @@ -8867,7 +9665,7 @@ mdast-util-mdx-expression@^1.0.0: mdast-util-mdxjs-esm@^1.0.0: version "1.3.1" - resolved "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-1.3.1.tgz#645d02cd607a227b49721d146fd81796b2e2d15b" + resolved "https://registry.yarnpkg.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-1.3.1.tgz#645d02cd607a227b49721d146fd81796b2e2d15b" integrity sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w== dependencies: "@types/estree-jsx" "^1.0.0" @@ -8878,7 +9676,7 @@ mdast-util-mdxjs-esm@^1.0.0: mdast-util-phrasing@^3.0.0: version "3.0.1" - resolved "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz#c7c21d0d435d7fb90956038f02e8702781f95463" + resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz#c7c21d0d435d7fb90956038f02e8702781f95463" integrity sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg== dependencies: "@types/mdast" "^3.0.0" @@ -8886,7 +9684,7 @@ mdast-util-phrasing@^3.0.0: mdast-util-to-hast@^12.0.0, mdast-util-to-hast@^12.1.0: version "12.3.0" - resolved "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz#045d2825fb04374e59970f5b3f279b5700f6fb49" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz#045d2825fb04374e59970f5b3f279b5700f6fb49" integrity sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw== dependencies: "@types/hast" "^2.0.0" @@ -8900,7 +9698,7 @@ mdast-util-to-hast@^12.0.0, mdast-util-to-hast@^12.1.0: mdast-util-to-markdown@^1.0.0, mdast-util-to-markdown@^1.3.0, mdast-util-to-markdown@^1.5.0: version "1.5.0" - resolved "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz#c13343cb3fc98621911d33b5cd42e7d0731171c6" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz#c13343cb3fc98621911d33b5cd42e7d0731171c6" integrity sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A== dependencies: "@types/mdast" "^3.0.0" @@ -8914,51 +9712,51 @@ mdast-util-to-markdown@^1.0.0, mdast-util-to-markdown@^1.3.0, mdast-util-to-mark mdast-util-to-string@^3.0.0, mdast-util-to-string@^3.1.0, mdast-util-to-string@^3.2.0: version "3.2.0" - resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz#66f7bb6324756741c5f47a53557f0cbf16b6f789" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz#66f7bb6324756741c5f47a53557f0cbf16b6f789" integrity sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg== dependencies: "@types/mdast" "^3.0.0" mdn-data@2.0.14: version "2.0.14" - resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== mdn-data@2.0.4: version "2.0.4" - resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== mdurl@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== media-typer@0.3.0: version "0.3.0" - resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== memfs@^3.4.1: version "3.6.0" - resolved "https://registry.npmjs.org/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== dependencies: fs-monkey "^1.0.4" memoize-one@^5.1.1: version "5.2.1" - resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== meow@^12.0.1: version "12.1.1" - resolved "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz#e558dddbab12477b69b2e9a2728c327f191bace6" + resolved "https://registry.yarnpkg.com/meow/-/meow-12.1.1.tgz#e558dddbab12477b69b2e9a2728c327f191bace6" integrity sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw== meow@^8.0.0: version "8.1.2" - resolved "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" + resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== dependencies: "@types/minimist" "^1.2.0" @@ -8973,19 +9771,24 @@ meow@^8.0.0: type-fest "^0.18.0" yargs-parser "^20.2.3" +merge-descriptors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" + integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== + merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" - resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== mermaid@9.4.3: version "9.4.3" - resolved "https://registry.npmjs.org/mermaid/-/mermaid-9.4.3.tgz#62cf210c246b74972ea98c19837519b6f03427f2" + resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-9.4.3.tgz#62cf210c246b74972ea98c19837519b6f03427f2" integrity sha512-TLkQEtqhRSuEHSE34lh5bCa94KATCyluAXmFnNI2PRZwOpXFeqiJWwZl+d2CcemE1RS6QbbueSSq9QIg8Uxcyw== dependencies: "@braintree/sanitize-url" "^6.0.0" @@ -9005,9 +9808,14 @@ mermaid@9.4.3: uuid "^9.0.0" web-worker "^1.2.0" +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + micromark-core-commonmark@^1.0.0, micromark-core-commonmark@^1.0.1: version "1.1.0" - resolved "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz#1386628df59946b2d39fb2edfd10f3e8e0a75bb8" + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz#1386628df59946b2d39fb2edfd10f3e8e0a75bb8" integrity sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw== dependencies: decode-named-character-reference "^1.0.0" @@ -9029,7 +9837,7 @@ micromark-core-commonmark@^1.0.0, micromark-core-commonmark@^1.0.1: micromark-extension-directive@^2.0.0: version "2.2.1" - resolved "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-2.2.1.tgz#181751e433a0f2cdfbccc520eb1da42d63cbe4bd" + resolved "https://registry.yarnpkg.com/micromark-extension-directive/-/micromark-extension-directive-2.2.1.tgz#181751e433a0f2cdfbccc520eb1da42d63cbe4bd" integrity sha512-ZFKZkNaEqAP86IghX1X7sE8NNnx6kFNq9mSBRvEHjArutTCJZ3LYg6VH151lXVb1JHpmIcW/7rX25oMoIHuSug== dependencies: micromark-factory-space "^1.0.0" @@ -9042,7 +9850,7 @@ micromark-extension-directive@^2.0.0: micromark-extension-frontmatter@^1.0.0: version "1.1.1" - resolved "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-1.1.1.tgz#2946643938e491374145d0c9aacc3249e38a865f" + resolved "https://registry.yarnpkg.com/micromark-extension-frontmatter/-/micromark-extension-frontmatter-1.1.1.tgz#2946643938e491374145d0c9aacc3249e38a865f" integrity sha512-m2UH9a7n3W8VAH9JO9y01APpPKmNNNs71P0RbknEmYSaZU5Ghogv38BYO94AI5Xw6OYfxZRdHZZ2nYjs/Z+SZQ== dependencies: fault "^2.0.0" @@ -9052,7 +9860,7 @@ micromark-extension-frontmatter@^1.0.0: micromark-extension-gfm-autolink-literal@^1.0.0: version "1.0.5" - resolved "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz#5853f0e579bbd8ef9e39a7c0f0f27c5a063a66e7" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz#5853f0e579bbd8ef9e39a7c0f0f27c5a063a66e7" integrity sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg== dependencies: micromark-util-character "^1.0.0" @@ -9062,7 +9870,7 @@ micromark-extension-gfm-autolink-literal@^1.0.0: micromark-extension-gfm-footnote@^1.0.0: version "1.1.2" - resolved "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz#05e13034d68f95ca53c99679040bc88a6f92fe2e" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz#05e13034d68f95ca53c99679040bc88a6f92fe2e" integrity sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q== dependencies: micromark-core-commonmark "^1.0.0" @@ -9076,7 +9884,7 @@ micromark-extension-gfm-footnote@^1.0.0: micromark-extension-gfm-strikethrough@^1.0.0: version "1.0.7" - resolved "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz#c8212c9a616fa3bf47cb5c711da77f4fdc2f80af" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz#c8212c9a616fa3bf47cb5c711da77f4fdc2f80af" integrity sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw== dependencies: micromark-util-chunked "^1.0.0" @@ -9088,7 +9896,7 @@ micromark-extension-gfm-strikethrough@^1.0.0: micromark-extension-gfm-table@^1.0.0: version "1.0.7" - resolved "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz#dcb46074b0c6254c3fc9cc1f6f5002c162968008" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz#dcb46074b0c6254c3fc9cc1f6f5002c162968008" integrity sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw== dependencies: micromark-factory-space "^1.0.0" @@ -9099,14 +9907,14 @@ micromark-extension-gfm-table@^1.0.0: micromark-extension-gfm-tagfilter@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz#aa7c4dd92dabbcb80f313ebaaa8eb3dac05f13a7" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz#aa7c4dd92dabbcb80f313ebaaa8eb3dac05f13a7" integrity sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g== dependencies: micromark-util-types "^1.0.0" micromark-extension-gfm-task-list-item@^1.0.0: version "1.0.5" - resolved "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz#b52ce498dc4c69b6a9975abafc18f275b9dde9f4" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz#b52ce498dc4c69b6a9975abafc18f275b9dde9f4" integrity sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ== dependencies: micromark-factory-space "^1.0.0" @@ -9117,7 +9925,7 @@ micromark-extension-gfm-task-list-item@^1.0.0: micromark-extension-gfm@^2.0.0: version "2.0.3" - resolved "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz#e517e8579949a5024a493e49204e884aa74f5acf" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz#e517e8579949a5024a493e49204e884aa74f5acf" integrity sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ== dependencies: micromark-extension-gfm-autolink-literal "^1.0.0" @@ -9131,7 +9939,7 @@ micromark-extension-gfm@^2.0.0: micromark-factory-destination@^1.0.0: version "1.1.0" - resolved "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz#eb815957d83e6d44479b3df640f010edad667b9f" + resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz#eb815957d83e6d44479b3df640f010edad667b9f" integrity sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg== dependencies: micromark-util-character "^1.0.0" @@ -9140,7 +9948,7 @@ micromark-factory-destination@^1.0.0: micromark-factory-label@^1.0.0: version "1.1.0" - resolved "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz#cc95d5478269085cfa2a7282b3de26eb2e2dec68" + resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz#cc95d5478269085cfa2a7282b3de26eb2e2dec68" integrity sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w== dependencies: micromark-util-character "^1.0.0" @@ -9150,7 +9958,7 @@ micromark-factory-label@^1.0.0: micromark-factory-space@^1.0.0: version "1.1.0" - resolved "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz#c8f40b0640a0150751d3345ed885a080b0d15faf" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz#c8f40b0640a0150751d3345ed885a080b0d15faf" integrity sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ== dependencies: micromark-util-character "^1.0.0" @@ -9158,7 +9966,7 @@ micromark-factory-space@^1.0.0: micromark-factory-title@^1.0.0: version "1.1.0" - resolved "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz#dd0fe951d7a0ac71bdc5ee13e5d1465ad7f50ea1" + resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz#dd0fe951d7a0ac71bdc5ee13e5d1465ad7f50ea1" integrity sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ== dependencies: micromark-factory-space "^1.0.0" @@ -9168,7 +9976,7 @@ micromark-factory-title@^1.0.0: micromark-factory-whitespace@^1.0.0: version "1.1.0" - resolved "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz#798fb7489f4c8abafa7ca77eed6b5745853c9705" + resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz#798fb7489f4c8abafa7ca77eed6b5745853c9705" integrity sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ== dependencies: micromark-factory-space "^1.0.0" @@ -9178,7 +9986,7 @@ micromark-factory-whitespace@^1.0.0: micromark-util-character@^1.0.0: version "1.2.0" - resolved "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz#4fedaa3646db249bc58caeb000eb3549a8ca5dcc" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.2.0.tgz#4fedaa3646db249bc58caeb000eb3549a8ca5dcc" integrity sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg== dependencies: micromark-util-symbol "^1.0.0" @@ -9186,14 +9994,14 @@ micromark-util-character@^1.0.0: micromark-util-chunked@^1.0.0: version "1.1.0" - resolved "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz#37a24d33333c8c69a74ba12a14651fd9ea8a368b" + resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz#37a24d33333c8c69a74ba12a14651fd9ea8a368b" integrity sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ== dependencies: micromark-util-symbol "^1.0.0" micromark-util-classify-character@^1.0.0: version "1.1.0" - resolved "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz#6a7f8c8838e8a120c8e3c4f2ae97a2bff9190e9d" + resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz#6a7f8c8838e8a120c8e3c4f2ae97a2bff9190e9d" integrity sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw== dependencies: micromark-util-character "^1.0.0" @@ -9202,7 +10010,7 @@ micromark-util-classify-character@^1.0.0: micromark-util-combine-extensions@^1.0.0: version "1.1.0" - resolved "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz#192e2b3d6567660a85f735e54d8ea6e3952dbe84" + resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz#192e2b3d6567660a85f735e54d8ea6e3952dbe84" integrity sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA== dependencies: micromark-util-chunked "^1.0.0" @@ -9210,14 +10018,14 @@ micromark-util-combine-extensions@^1.0.0: micromark-util-decode-numeric-character-reference@^1.0.0: version "1.1.0" - resolved "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz#b1e6e17009b1f20bc652a521309c5f22c85eb1c6" + resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz#b1e6e17009b1f20bc652a521309c5f22c85eb1c6" integrity sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw== dependencies: micromark-util-symbol "^1.0.0" micromark-util-decode-string@^1.0.0: version "1.1.0" - resolved "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz#dc12b078cba7a3ff690d0203f95b5d5537f2809c" + resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz#dc12b078cba7a3ff690d0203f95b5d5537f2809c" integrity sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ== dependencies: decode-named-character-reference "^1.0.0" @@ -9227,31 +10035,31 @@ micromark-util-decode-string@^1.0.0: micromark-util-encode@^1.0.0: version "1.1.0" - resolved "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz#92e4f565fd4ccb19e0dcae1afab9a173bbeb19a5" + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz#92e4f565fd4ccb19e0dcae1afab9a173bbeb19a5" integrity sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw== micromark-util-html-tag-name@^1.0.0: version "1.2.0" - resolved "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz#48fd7a25826f29d2f71479d3b4e83e94829b3588" + resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz#48fd7a25826f29d2f71479d3b4e83e94829b3588" integrity sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q== micromark-util-normalize-identifier@^1.0.0: version "1.1.0" - resolved "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz#7a73f824eb9f10d442b4d7f120fecb9b38ebf8b7" + resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz#7a73f824eb9f10d442b4d7f120fecb9b38ebf8b7" integrity sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q== dependencies: micromark-util-symbol "^1.0.0" micromark-util-resolve-all@^1.0.0: version "1.1.0" - resolved "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz#4652a591ee8c8fa06714c9b54cd6c8e693671188" + resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz#4652a591ee8c8fa06714c9b54cd6c8e693671188" integrity sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA== dependencies: micromark-util-types "^1.0.0" micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: version "1.2.0" - resolved "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz#613f738e4400c6eedbc53590c67b197e30d7f90d" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz#613f738e4400c6eedbc53590c67b197e30d7f90d" integrity sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A== dependencies: micromark-util-character "^1.0.0" @@ -9260,7 +10068,7 @@ micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: micromark-util-subtokenize@^1.0.0: version "1.1.0" - resolved "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz#941c74f93a93eaf687b9054aeb94642b0e92edb1" + resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz#941c74f93a93eaf687b9054aeb94642b0e92edb1" integrity sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A== dependencies: micromark-util-chunked "^1.0.0" @@ -9270,17 +10078,17 @@ micromark-util-subtokenize@^1.0.0: micromark-util-symbol@^1.0.0: version "1.1.0" - resolved "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz#813cd17837bdb912d069a12ebe3a44b6f7063142" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz#813cd17837bdb912d069a12ebe3a44b6f7063142" integrity sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag== micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: version "1.1.0" - resolved "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz#e6676a8cae0bb86a2171c498167971886cb7e283" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz#e6676a8cae0bb86a2171c498167971886cb7e283" integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== micromark@^3.0.0: version "3.2.0" - resolved "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz#1af9fef3f995ea1ea4ac9c7e2f19c48fd5c006e9" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.2.0.tgz#1af9fef3f995ea1ea4ac9c7e2f19c48fd5c006e9" integrity sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA== dependencies: "@types/debug" "^4.0.0" @@ -9301,17 +10109,17 @@ micromark@^3.0.0: micromark-util-types "^1.0.1" uvu "^0.5.0" -micromatch@4.0.5, micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== +micromatch@^4.0.4, micromatch@^4.0.5, micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: - braces "^3.0.2" + braces "^3.0.3" picomatch "^2.3.1" miller-rabin@^4.0.0: version "4.0.1" - resolved "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== dependencies: bn.js "^4.0.0" @@ -9319,73 +10127,83 @@ miller-rabin@^4.0.0: mime-db@1.52.0: version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@~2.1.24: +"mime-db@>= 1.43.0 < 2": + version "1.54.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" + integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== + +mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" -mime@^1.4.1: +mime@1.6.0, mime@^1.4.1: version "1.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mimer@1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/mimer/-/mimer-1.1.0.tgz#2cb67f7093998e772a0e62c090f77daa1b8a2dbe" + resolved "https://registry.yarnpkg.com/mimer/-/mimer-1.1.0.tgz#2cb67f7093998e772a0e62c090f77daa1b8a2dbe" integrity sha512-y9dVfy2uiycQvDNiAYW6zp49ZhFlXDMr5wfdOiMbdzGM/0N5LNR6HTUn3un+WUQcM0koaw8FMTG1bt5EnHJdvQ== mimic-fn@^1.0.0: version "1.2.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== mimic-fn@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== mimic-fn@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== +mimic-function@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" + integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== + min-indent@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== minimalistic-crypto-utils@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimatch@^9.0.4: - version "9.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" - integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: brace-expansion "^2.0.1" minimist-options@4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== dependencies: arrify "^1.0.1" @@ -9394,7 +10212,7 @@ minimist-options@4.1.0: minimist@^1.2.0, minimist@^1.2.6, minimist@~1.2.5, minimist@~1.2.8: version "1.2.8" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== "minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: @@ -9404,7 +10222,7 @@ minimist@^1.2.0, minimist@^1.2.6, minimist@~1.2.5, minimist@~1.2.8: mississippi@^1.2.0, mississippi@^1.3.0: version "1.3.1" - resolved "https://registry.npmjs.org/mississippi/-/mississippi-1.3.1.tgz#2a8bb465e86550ac8b36a7b6f45599171d78671e" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-1.3.1.tgz#2a8bb465e86550ac8b36a7b6f45599171d78671e" integrity sha512-/6rB8YXFbAtsUVRphIRQqB0+9c7VaPHCjVtvto+JqwVxgz8Zz+I+f68/JgQ+Pb4VlZb2svA9OtdXnHHsZz7ltg== dependencies: concat-stream "^1.5.0" @@ -9420,7 +10238,7 @@ mississippi@^1.2.0, mississippi@^1.3.0: mississippi@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" integrity sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw== dependencies: concat-stream "^1.5.0" @@ -9436,14 +10254,14 @@ mississippi@^2.0.0: mkdirp@^0.5.1, mkdirp@^0.5.4, mkdirp@~0.5.1: version "0.5.6" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" mock-property@~1.0.0: version "1.0.3" - resolved "https://registry.npmjs.org/mock-property/-/mock-property-1.0.3.tgz#3e37c50a56609d548cabd56559fde3dd8767b10c" + resolved "https://registry.yarnpkg.com/mock-property/-/mock-property-1.0.3.tgz#3e37c50a56609d548cabd56559fde3dd8767b10c" integrity sha512-2emPTb1reeLLYwHxyVx993iYyCHEiRRO+y8NFXFPL5kl5q14sgTK76cXyEKkeKCHeRw35SfdkUJ10Q1KfHuiIQ== dependencies: define-data-property "^1.1.1" @@ -9453,9 +10271,14 @@ mock-property@~1.0.0: hasown "^2.0.0" isarray "^2.0.5" +moment@^2.30.1: + version "2.30.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" + integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== + move-concurrently@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" integrity sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ== dependencies: aproba "^1.1.1" @@ -9467,28 +10290,23 @@ move-concurrently@^1.0.1: mri@^1.1.0: version "1.2.0" - resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" + resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== ms@2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== -ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.0.0, ms@^2.1.1: +ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.3: version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== multer@^1.4.5-lts.1: - version "1.4.5-lts.1" - resolved "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz#803e24ad1984f58edffbc79f56e305aec5cfd1ac" - integrity sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ== + version "1.4.5-lts.2" + resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.5-lts.2.tgz#340af065d8685dda846ec9e3d7655fcd50afba2d" + integrity sha512-VzGiVigcG9zUAoCNU+xShztrlr1auZOlurXynNvO9GiWD1/mTBbUljOKY+qMeazBqXgRnjzeEgJI/wyjJUHg9A== dependencies: append-field "^1.0.0" busboy "^1.0.0" @@ -9500,7 +10318,7 @@ multer@^1.4.5-lts.1: multipipe@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/multipipe/-/multipipe-1.0.2.tgz#cc13efd833c9cda99f224f868461b8e1a3fd939d" + resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-1.0.2.tgz#cc13efd833c9cda99f224f868461b8e1a3fd939d" integrity sha512-6uiC9OvY71vzSGX8lZvSqscE7ft9nPupJ8fMjrCNRAUy2LREUW42UL+V/NTrogr6rFgRydUrCX4ZitfpSNkSCQ== dependencies: duplexer2 "^0.1.2" @@ -9508,7 +10326,7 @@ multipipe@^1.0.2: mute-stream@0.0.7: version "0.0.7" - resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ== mz@^2.7.0: @@ -9520,33 +10338,42 @@ mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nanoid@^2.1.0: - version "2.1.11" - resolved "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz#ec24b8a758d591561531b4176a01e3ab4f0f0280" - integrity sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA== - -nanoid@^3.3.6: - version "3.3.7" - resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== +nanoid@^3.3.11, nanoid@^3.3.8: + version "3.3.11" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== natural-compare-lite@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== needle@^3.1.0: - version "3.2.0" - resolved "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz#07d240ebcabfd65c76c03afae7f6defe6469df44" - integrity sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ== + version "3.3.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-3.3.1.tgz#63f75aec580c2e77e209f3f324e2cdf3d29bd049" + integrity sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q== dependencies: - debug "^3.2.6" iconv-lite "^0.6.3" sax "^1.2.4" +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +negotiator@~0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" + integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + no-case@^3.0.4: version "3.0.4" - resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== dependencies: lower-case "^2.0.2" @@ -9554,17 +10381,22 @@ no-case@^3.0.4: node-abort-controller@^3.0.1: version "3.1.1" - resolved "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" + resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ== +node-addon-api@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" + integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== + node-domexception@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" + resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== node-fetch-npm@^2.0.2: version "2.0.4" - resolved "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz#6507d0e17a9ec0be3bec516958a497cec54bf5a4" + resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz#6507d0e17a9ec0be3bec516958a497cec54bf5a4" integrity sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg== dependencies: encoding "^0.1.11" @@ -9573,14 +10405,14 @@ node-fetch-npm@^2.0.2: node-fetch@^2.6.12: version "2.7.0" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" node-fetch@^3.2.0: version "3.3.2" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz#d1e889bacdf733b4ff3b2b243eb7a12866a0b78b" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.2.tgz#d1e889bacdf733b4ff3b2b243eb7a12866a0b78b" integrity sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA== dependencies: data-uri-to-buffer "^4.0.0" @@ -9589,51 +10421,80 @@ node-fetch@^3.2.0: node-int64@^0.4.0: version "0.4.0" - resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-libs-browser@2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" - integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== +node-libs-browser-okam@^2.2.5: + version "2.2.5" + resolved "https://registry.yarnpkg.com/node-libs-browser-okam/-/node-libs-browser-okam-2.2.5.tgz#743c52436a4c8d04b3f2466d552ab635606d9c1a" + integrity sha512-kD+WXACEThc6C5DA146KoCNbubjpXeYzXDrukvtXWr6MRzV3uvHCI0eb/GuugWVYnMoD4g3/uaIzvDYOpC4QWw== dependencies: - assert "^1.1.1" + assert-okam "^1.1.1" browserify-zlib "^0.2.0" - buffer "^4.3.0" + buffer-okam "^4.3.0" console-browserify "^1.1.0" constants-browserify "^1.0.0" crypto-browserify "^3.11.0" domain-browser "^1.1.1" - events "^3.0.0" + events-okam "^3.0.0" https-browserify "^1.0.0" os-browserify "^0.3.0" path-browserify "0.0.1" - process "^0.11.10" - punycode "^1.2.4" + process-okam "^0.11.10" + punycode-okam "^1.2.4" querystring-es3 "^0.2.0" readable-stream "^2.3.3" stream-browserify "^2.0.1" stream-http "^2.7.2" - string_decoder "^1.0.0" + string_decoder-okam "^1.0.0" timers-browserify "^2.0.4" tty-browserify "0.0.0" - url "^0.11.0" - util "^0.11.0" + url-okam "^0.11.0" + util-okam "^0.11.0" vm-browserify "^1.0.1" -node-releases@^2.0.13: - version "2.0.13" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" - integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== - +node-libs-browser@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== + non-layered-tidy-tree-layout@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz#57d35d13c356643fc296a55fb11ac15e74da7804" + resolved "https://registry.yarnpkg.com/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz#57d35d13c356643fc296a55fb11ac15e74da7804" integrity sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw== normalize-package-data@^2.4.0, normalize-package-data@^2.5.0: version "2.5.0" - resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== dependencies: hosted-git-info "^2.1.4" @@ -9643,7 +10504,7 @@ normalize-package-data@^2.4.0, normalize-package-data@^2.5.0: normalize-package-data@^3.0.0: version "3.0.3" - resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== dependencies: hosted-git-info "^4.0.1" @@ -9653,17 +10514,17 @@ normalize-package-data@^3.0.0: normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== normalize-range@^0.1.2: version "0.1.2" - resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== npm-package-arg@^5.1.2: version "5.1.2" - resolved "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-5.1.2.tgz#fb18d17bb61e60900d6312619919bd753755ab37" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-5.1.2.tgz#fb18d17bb61e60900d6312619919bd753755ab37" integrity sha512-wJBsrf0qpypPT7A0LART18hCdyhpCMxeTtcb0X4IZO2jsP6Om7EHN1d9KSKiqD+KVH030RVNpWS9thk+pb7wzA== dependencies: hosted-git-info "^2.4.2" @@ -9673,7 +10534,7 @@ npm-package-arg@^5.1.2: npm-pick-manifest@^1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-1.0.4.tgz#a5ee6510c1fe7221c0bc0414e70924c14045f7e8" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-1.0.4.tgz#a5ee6510c1fe7221c0bc0414e70924c14045f7e8" integrity sha512-MKxNdeyOZysPRTTbHtW0M5Fw38Jo/3ARsoGw5qjCfS+XGjvNB/Gb4qtAZUFmKPM2mVum+eX559eHvKywU856BQ== dependencies: npm-package-arg "^5.1.2" @@ -9681,40 +10542,40 @@ npm-pick-manifest@^1.0.4: npm-run-path@^2.0.0: version "2.0.2" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== dependencies: path-key "^2.0.0" npm-run-path@^4.0.1: version "4.0.1" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" npm-run-path@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" - integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== + version "5.3.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" + integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== dependencies: path-key "^4.0.0" nprogress@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" + resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" integrity sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA== nth-check@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== dependencies: boolbase "~1.0.0" nth-check@^2.0.1: version "2.1.1" - resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== dependencies: boolbase "^1.0.0" @@ -9724,166 +10585,189 @@ object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1 resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.13.1, object-inspect@^1.9.0: - version "1.13.1" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== +object-inspect@^1.13.1, object-inspect@^1.13.3, object-inspect@^1.13.4: + version "1.13.4" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== object-inspect@~1.12.3: version "1.12.3" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== object-is@^1.1.5: - version "1.1.5" - resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + version "1.1.6" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" + integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" + call-bind "^1.0.7" + define-properties "^1.2.1" object-keys@^1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== object-keys@~0.4.0: version "0.4.0" - resolved "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" integrity sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw== object-path@^0.11.8: version "0.11.8" - resolved "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz#ed002c02bbdd0070b78a27455e8ae01fc14d4742" + resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.8.tgz#ed002c02bbdd0070b78a27455e8ae01fc14d4742" integrity sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA== -object.assign@^4.1.0, object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== +object.assign@^4.1.0, object.assign@^4.1.4, object.assign@^4.1.7: + version "4.1.7" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" + integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + has-symbols "^1.1.0" object-keys "^1.1.1" object.entries@^1.1.6, object.entries@^1.1.7: - version "1.1.7" - resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131" - integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== + version "1.1.9" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.9.tgz#e4770a6a1444afb61bd39f984018b5bede25f8b3" + integrity sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.8" + call-bound "^1.0.4" + define-properties "^1.2.1" + es-object-atoms "^1.1.1" object.fromentries@^2.0.6: - version "2.0.7" - resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" - integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" object.getownpropertydescriptors@^2.1.0: - version "2.1.7" - resolved "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz#7a466a356cd7da4ba8b9e94ff6d35c3eeab5d56a" - integrity sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g== + version "2.1.8" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz#2f1fe0606ec1a7658154ccd4f728504f69667923" + integrity sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A== dependencies: array.prototype.reduce "^1.0.6" - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - safe-array-concat "^1.0.0" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + gopd "^1.0.1" + safe-array-concat "^1.1.2" object.getprototypeof@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/object.getprototypeof/-/object.getprototypeof-1.0.5.tgz#82d147e21f415e08663d46d17445f36562a938eb" - integrity sha512-4G0QiXpoIppBUz5efmxTm/HTbVN2ioGjk/PbsaNvwISFX+saj8muGp6vNuzIdsosFxM4V/kpUVNvy/+9+DVBZQ== + version "1.0.7" + resolved "https://registry.yarnpkg.com/object.getprototypeof/-/object.getprototypeof-1.0.7.tgz#c903cc875bc348843f5d002a95de16649fd1c42c" + integrity sha512-AS2h2hzryA95Z5SCy8DykYpdv82hHysDeMTBV5uWII4ljKiS0y2TC5aBQ+tHpCj0PfOy2/IPPY/O86F8uxx2gg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - reflect.getprototypeof "^1.0.4" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + get-proto "^1.0.1" + reflect.getprototypeof "^1.0.10" object.hasown@^1.1.2: - version "1.1.3" - resolved "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae" - integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== + version "1.1.4" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.4.tgz#e270ae377e4c120cdcb7656ce66884a6218283dc" + integrity sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg== dependencies: - define-properties "^1.2.0" - es-abstract "^1.22.1" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" object.values@^1.1.6: - version "1.1.7" - resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" - integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== + version "1.2.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.1.tgz#deed520a50809ff7f75a7cfd4bc64c7a038c6216" + integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== omit-deep@0.3.0: version "0.3.0" - resolved "https://registry.npmjs.org/omit-deep/-/omit-deep-0.3.0.tgz#21c8af3499bcadd29651a232cbcacbc52445ebec" + resolved "https://registry.yarnpkg.com/omit-deep/-/omit-deep-0.3.0.tgz#21c8af3499bcadd29651a232cbcacbc52445ebec" integrity sha512-Lbl/Ma59sss2b15DpnWnGmECBRL8cRl/PjPbPMVW+Y8zIQzRrwMaI65Oy6HvxyhYeILVKBJb2LWeG81bj5zbMg== dependencies: is-plain-object "^2.0.1" unset-value "^0.1.1" -omit.js@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/omit.js/-/omit.js-2.0.2.tgz#dd9b8436fab947a5f3ff214cb2538631e313ec2f" - integrity sha512-hJmu9D+bNB40YpL9jYebQl4lsTW6yEHRTroJzNLqQJYHm7c+NQnJGfZmIWh8S3q3KoaxV1aLhV6B3+0N0/kyJg== - on-exit-leak-free@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz#b39c9e3bf7690d890f4861558b0d7b90a442d209" + resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz#b39c9e3bf7690d890f4861558b0d7b90a442d209" integrity sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg== +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.1.0.tgz#59da4f91c45f5f989c6e4bcedc5a3b0aed70ff65" + integrity sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A== + once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" onetime@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ== dependencies: mimic-fn "^1.0.0" -onetime@^5.1.0, onetime@^5.1.2: +onetime@^5.1.2: version "5.1.2" - resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" onetime@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== dependencies: mimic-fn "^4.0.0" +onetime@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-7.0.0.tgz#9f16c92d8c9ef5120e3acd9dd9957cceecc1ab60" + integrity sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ== + dependencies: + mimic-function "^5.0.0" + open@^6.3.0: version "6.4.0" - resolved "https://registry.npmjs.org/open/-/open-6.4.0.tgz#5c13e96d0dc894686164f18965ecfe889ecfc8a9" + resolved "https://registry.yarnpkg.com/open/-/open-6.4.0.tgz#5c13e96d0dc894686164f18965ecfe889ecfc8a9" integrity sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg== dependencies: is-wsl "^1.1.0" open@^8.4.0: version "8.4.2" - resolved "https://registry.npmjs.org/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== dependencies: define-lazy-prop "^2.0.0" @@ -9892,7 +10776,7 @@ open@^8.4.0: open@^9.1.0: version "9.1.0" - resolved "https://registry.npmjs.org/open/-/open-9.1.0.tgz#684934359c90ad25742f5a26151970ff8c6c80b6" + resolved "https://registry.yarnpkg.com/open/-/open-9.1.0.tgz#684934359c90ad25742f5a26151970ff8c6c80b6" integrity sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg== dependencies: default-browser "^4.0.0" @@ -9902,7 +10786,7 @@ open@^9.1.0: ora@^1.3.0: version "1.4.0" - resolved "https://registry.npmjs.org/ora/-/ora-1.4.0.tgz#884458215b3a5d4097592285f93321bb7a79e2e5" + resolved "https://registry.yarnpkg.com/ora/-/ora-1.4.0.tgz#884458215b3a5d4097592285f93321bb7a79e2e5" integrity sha512-iMK1DOQxzzh2MBlVsU42G80mnrvUhqsMh74phHtDlrcTZPK0pH6o7l7DRshK+0YsxDyEuaOkziVdvM3T0QTzpw== dependencies: chalk "^2.1.0" @@ -9912,68 +10796,82 @@ ora@^1.3.0: os-browserify@^0.3.0: version "0.3.0" - resolved "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== os-homedir@^1.0.0, os-homedir@^1.0.1: version "1.0.2" - resolved "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== osenv@^0.1.4: version "0.1.5" - resolved "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +own-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" + integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== + dependencies: + get-intrinsic "^1.2.6" + object-keys "^1.1.1" + safe-push-apply "^1.0.0" + p-finally@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== p-limit@^2.2.0: version "2.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" p-limit@^3.0.2: version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" p-try@^2.0.0: version "2.2.0" - resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +package-json-from-dist@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== + package-json@^4.0.0: version "4.0.1" - resolved "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" integrity sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA== dependencies: got "^6.7.1" @@ -9983,7 +10881,7 @@ package-json@^4.0.0: pacote@^2.7.36: version "2.7.38" - resolved "https://registry.npmjs.org/pacote/-/pacote-2.7.38.tgz#5091f8774298c26c3eca24606037f1bb73db74c1" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-2.7.38.tgz#5091f8774298c26c3eca24606037f1bb73db74c1" integrity sha512-XxHUyHQB7QCVBxoXeVu0yKxT+2PvJucsc0+1E+6f95lMUxEAYERgSAc71ckYXrYr35Ew3xFU/LrhdIK21GQFFA== dependencies: bluebird "^3.5.0" @@ -10010,12 +10908,12 @@ pacote@^2.7.36: pako@~1.0.5: version "1.0.11" - resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== parallel-transform@^1.1.0: version "1.2.0" - resolved "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== dependencies: cyclist "^1.0.1" @@ -10024,7 +10922,7 @@ parallel-transform@^1.1.0: param-case@^3.0.4: version "3.0.4" - resolved "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== dependencies: dot-case "^3.0.4" @@ -10032,34 +10930,34 @@ param-case@^3.0.4: parchment@^1.1.2, parchment@^1.1.4: version "1.1.4" - resolved "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz#aeded7ab938fe921d4c34bc339ce1168bc2ffde5" + resolved "https://registry.yarnpkg.com/parchment/-/parchment-1.1.4.tgz#aeded7ab938fe921d4c34bc339ce1168bc2ffde5" integrity sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg== parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" -parse-asn1@^5.0.0, parse-asn1@^5.1.6: - version "5.1.6" - resolved "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" - integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== +parse-asn1@^5.0.0, parse-asn1@^5.1.7: + version "5.1.7" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.7.tgz#73cdaaa822125f9647165625eb45f8a051d2df06" + integrity sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg== dependencies: - asn1.js "^5.2.0" - browserify-aes "^1.0.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" + asn1.js "^4.10.1" + browserify-aes "^1.2.0" + evp_bytestokey "^1.0.3" + hash-base "~3.0" + pbkdf2 "^3.1.2" + safe-buffer "^5.2.1" parse-entities@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz#4e2a01111fb1c986549b944af39eeda258fc9e4e" - integrity sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w== + version "4.0.2" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.2.tgz#61d46f5ed28e4ee62e9ddc43d6b010188443f159" + integrity sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw== dependencies: "@types/unist" "^2.0.0" - character-entities "^2.0.0" character-entities-legacy "^3.0.0" character-reference-invalid "^2.0.0" decode-named-character-reference "^1.0.0" @@ -10069,14 +10967,14 @@ parse-entities@^4.0.0: parse-git-config@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/parse-git-config/-/parse-git-config-0.2.0.tgz#272833fdd15fea146fb75d336d236b963b6ff706" + resolved "https://registry.yarnpkg.com/parse-git-config/-/parse-git-config-0.2.0.tgz#272833fdd15fea146fb75d336d236b963b6ff706" integrity sha512-amapZFADOJtHvX2URcRfbzG2OFcW+UAwmdK2kht2N2vsH5Py65VxI5yZTlD2DjmxVhTz6htFoVCxROYUJaYOXQ== dependencies: ini "^1.3.3" parse-git-config@^1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/parse-git-config/-/parse-git-config-1.1.1.tgz#d3a9984317132f57398712bba438e129590ddf8c" + resolved "https://registry.yarnpkg.com/parse-git-config/-/parse-git-config-1.1.1.tgz#d3a9984317132f57398712bba438e129590ddf8c" integrity sha512-S3LGXJZVSy/hswvbSkfdbKBRVsnqKrVu6j8fcvdtJ4TxosSELyQDsJPuGPXuZ+EyuYuJd3O4uAF8gcISR0OFrQ== dependencies: extend-shallow "^2.0.1" @@ -10086,7 +10984,7 @@ parse-git-config@^1.1.1: parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" @@ -10096,42 +10994,47 @@ parse-json@^5.0.0, parse-json@^5.2.0: parse-node-version@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" + resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== parse-passwd@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== parse-srcset@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz#f2bd221f6cc970a938d88556abc589caaaa2bde1" + resolved "https://registry.yarnpkg.com/parse-srcset/-/parse-srcset-1.0.2.tgz#f2bd221f6cc970a938d88556abc589caaaa2bde1" integrity sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q== parse5@^6.0.0: version "6.0.1" - resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== parse5@^7.0.0: - version "7.1.2" - resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" - integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + version "7.3.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.3.0.tgz#d7e224fa72399c7a175099f45fc2ad024b05ec05" + integrity sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw== dependencies: - entities "^4.4.0" + entities "^6.0.0" parseley@^0.12.0: version "0.12.1" - resolved "https://registry.npmjs.org/parseley/-/parseley-0.12.1.tgz#4afd561d50215ebe259e3e7a853e62f600683aef" + resolved "https://registry.yarnpkg.com/parseley/-/parseley-0.12.1.tgz#4afd561d50215ebe259e3e7a853e62f600683aef" integrity sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw== dependencies: leac "^0.6.0" peberminta "^0.9.0" +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + pascal-case@^3.1.1, pascal-case@^3.1.2: version "3.1.2" - resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== dependencies: no-case "^3.0.4" @@ -10139,42 +11042,42 @@ pascal-case@^3.1.1, pascal-case@^3.1.2: path-browserify@0.0.1: version "0.0.1" - resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-is-inside@^1.0.1: version "1.0.2" - resolved "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== path-key@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-key@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-scurry@^1.11.1: @@ -10185,72 +11088,78 @@ path-scurry@^1.11.1: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" +path-to-regexp@0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" + integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== + path-to-regexp@1.7.0: version "1.7.0" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" integrity sha512-nifX1uj4S9IrK/w3Xe7kKvNEepXivANs9ng60Iq7PU/BlouV3yL/VUhFqTuTq33ykwUqoNcTeGo5vdOBP4jS/Q== dependencies: isarray "0.0.1" -path-to-regexp@2.4.0: - version "2.4.0" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.4.0.tgz#35ce7f333d5616f1c1e1bfe266c3aba2e5b2e704" - integrity sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w== +path-to-regexp@8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.2.0.tgz#73990cc29e57a3ff2a0d914095156df5db79e8b4" + integrity sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ== path-type@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -pbkdf2@^3.0.3: - version "3.1.2" - resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" - integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== +pbkdf2@^3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.3.tgz#8be674d591d65658113424592a95d1517318dd4b" + integrity sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA== dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" + create-hash "~1.1.3" + create-hmac "^1.1.7" + ripemd160 "=2.0.1" + safe-buffer "^5.2.1" + sha.js "^2.4.11" + to-buffer "^1.2.0" pdfast@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/pdfast/-/pdfast-0.2.0.tgz#8cbc556e1bf2522177787c0de2e0d4373ba885c9" + resolved "https://registry.yarnpkg.com/pdfast/-/pdfast-0.2.0.tgz#8cbc556e1bf2522177787c0de2e0d4373ba885c9" integrity sha512-cq6TTu6qKSFUHwEahi68k/kqN2mfepjkGrG9Un70cgdRRKLKY6Rf8P8uvP2NvZktaQZNF3YE7agEkLj0vGK9bA== peberminta@^0.9.0: version "0.9.0" - resolved "https://registry.npmjs.org/peberminta/-/peberminta-0.9.0.tgz#8ec9bc0eb84b7d368126e71ce9033501dca2a352" + resolved "https://registry.yarnpkg.com/peberminta/-/peberminta-0.9.0.tgz#8ec9bc0eb84b7d368126e71ce9033501dca2a352" integrity sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ== -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.0.0, picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pidtree@0.6.0: +pidtree@^0.6.0: version "0.6.0" - resolved "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== pify@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== pify@^4.0.1: version "4.0.1" - resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== pino-abstract-transport@v0.5.0: version "0.5.0" - resolved "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz#4b54348d8f73713bfd14e3dc44228739aa13d9c0" + resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz#4b54348d8f73713bfd14e3dc44228739aa13d9c0" integrity sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ== dependencies: duplexify "^4.1.2" @@ -10258,12 +11167,12 @@ pino-abstract-transport@v0.5.0: pino-std-serializers@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz#1791ccd2539c091ae49ce9993205e2cd5dbba1e2" + resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz#1791ccd2539c091ae49ce9993205e2cd5dbba1e2" integrity sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q== pino@7.11.0: version "7.11.0" - resolved "https://registry.npmjs.org/pino/-/pino-7.11.0.tgz#0f0ea5c4683dc91388081d44bff10c83125066f6" + resolved "https://registry.yarnpkg.com/pino/-/pino-7.11.0.tgz#0f0ea5c4683dc91388081d44bff10c83125066f6" integrity sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg== dependencies: atomic-sleep "^1.0.0" @@ -10279,86 +11188,98 @@ pino@7.11.0: thread-stream "^0.15.1" pirates@^4.0.1, pirates@^4.0.4: - version "4.0.6" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" - integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + version "4.0.7" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.7.tgz#643b4a18c4257c8a65104b73f3049ce9a0a15e22" + integrity sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA== + +piscina@^4.5.1: + version "4.9.2" + resolved "https://registry.yarnpkg.com/piscina/-/piscina-4.9.2.tgz#80f2c2375231720337c703e443941adfac8caf75" + integrity sha512-Fq0FERJWFEUpB4eSY59wSNwXD4RYqR+nR/WiEVcZW8IWfVBxJJafcgTEZDQo8k3w0sUarJ8RyVbbUF4GQ2LGbQ== + optionalDependencies: + "@napi-rs/nice" "^1.0.1" pluralize@^8.0.0: version "8.0.0" - resolved "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== point-in-polygon@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/point-in-polygon/-/point-in-polygon-1.1.0.tgz#b0af2616c01bdee341cbf2894df643387ca03357" + resolved "https://registry.yarnpkg.com/point-in-polygon/-/point-in-polygon-1.1.0.tgz#b0af2616c01bdee341cbf2894df643387ca03357" integrity sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw== +possible-typed-array-names@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" + integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== + postcss-attribute-case-insensitive@^5.0.0: version "5.0.2" - resolved "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz#03d761b24afc04c09e757e92ff53716ae8ea2741" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz#03d761b24afc04c09e757e92ff53716ae8ea2741" integrity sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ== dependencies: postcss-selector-parser "^6.0.10" postcss-clamp@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz#7263e95abadd8c2ba1bd911b0b5a5c9c93e02363" + resolved "https://registry.yarnpkg.com/postcss-clamp/-/postcss-clamp-4.1.0.tgz#7263e95abadd8c2ba1bd911b0b5a5c9c93e02363" integrity sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow== dependencies: postcss-value-parser "^4.2.0" postcss-color-functional-notation@^4.2.2: version "4.2.4" - resolved "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz#21a909e8d7454d3612d1659e471ce4696f28caec" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz#21a909e8d7454d3612d1659e471ce4696f28caec" integrity sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg== dependencies: postcss-value-parser "^4.2.0" postcss-color-hex-alpha@^8.0.3: version "8.0.4" - resolved "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz#c66e2980f2fbc1a63f5b079663340ce8b55f25a5" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz#c66e2980f2fbc1a63f5b079663340ce8b55f25a5" integrity sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ== dependencies: postcss-value-parser "^4.2.0" postcss-color-rebeccapurple@^7.0.2: version "7.1.1" - resolved "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz#63fdab91d878ebc4dd4b7c02619a0c3d6a56ced0" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz#63fdab91d878ebc4dd4b7c02619a0c3d6a56ced0" integrity sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg== dependencies: postcss-value-parser "^4.2.0" postcss-custom-media@^8.0.0: version "8.0.2" - resolved "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz#c8f9637edf45fef761b014c024cee013f80529ea" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz#c8f9637edf45fef761b014c024cee013f80529ea" integrity sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg== dependencies: postcss-value-parser "^4.2.0" postcss-custom-properties@^12.1.7: version "12.1.11" - resolved "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz#d14bb9b3989ac4d40aaa0e110b43be67ac7845cf" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz#d14bb9b3989ac4d40aaa0e110b43be67ac7845cf" integrity sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ== dependencies: postcss-value-parser "^4.2.0" postcss-custom-selectors@^6.0.0: version "6.0.3" - resolved "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz#1ab4684d65f30fed175520f82d223db0337239d9" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz#1ab4684d65f30fed175520f82d223db0337239d9" integrity sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg== dependencies: postcss-selector-parser "^6.0.4" postcss-dir-pseudo-class@^6.0.4: version "6.0.5" - resolved "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz#2bf31de5de76added44e0a25ecf60ae9f7c7c26c" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz#2bf31de5de76added44e0a25ecf60ae9f7c7c26c" integrity sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA== dependencies: postcss-selector-parser "^6.0.10" postcss-double-position-gradients@^3.1.1: version "3.1.2" - resolved "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz#b96318fdb477be95997e86edd29c6e3557a49b91" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz#b96318fdb477be95997e86edd29c6e3557a49b91" integrity sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ== dependencies: "@csstools/postcss-progressive-custom-properties" "^1.1.0" @@ -10366,101 +11287,110 @@ postcss-double-position-gradients@^3.1.1: postcss-env-function@^4.0.6: version "4.0.6" - resolved "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz#7b2d24c812f540ed6eda4c81f6090416722a8e7a" + resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-4.0.6.tgz#7b2d24c812f540ed6eda4c81f6090416722a8e7a" integrity sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA== dependencies: postcss-value-parser "^4.2.0" postcss-flexbugs-fixes@5.0.2: version "5.0.2" - resolved "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz#2028e145313074fc9abe276cb7ca14e5401eb49d" + resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz#2028e145313074fc9abe276cb7ca14e5401eb49d" integrity sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ== postcss-focus-visible@^6.0.4: version "6.0.4" - resolved "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz#50c9ea9afa0ee657fb75635fabad25e18d76bf9e" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz#50c9ea9afa0ee657fb75635fabad25e18d76bf9e" integrity sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw== dependencies: postcss-selector-parser "^6.0.9" postcss-focus-within@^5.0.4: version "5.0.4" - resolved "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz#5b1d2ec603195f3344b716c0b75f61e44e8d2e20" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz#5b1d2ec603195f3344b716c0b75f61e44e8d2e20" integrity sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ== dependencies: postcss-selector-parser "^6.0.9" postcss-font-variant@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz#efd59b4b7ea8bb06127f2d031bfbb7f24d32fa66" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz#efd59b4b7ea8bb06127f2d031bfbb7f24d32fa66" integrity sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA== postcss-gap-properties@^3.0.3: version "3.0.5" - resolved "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz#f7e3cddcf73ee19e94ccf7cb77773f9560aa2fff" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz#f7e3cddcf73ee19e94ccf7cb77773f9560aa2fff" integrity sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg== postcss-image-set-function@^4.0.6: version "4.0.7" - resolved "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz#08353bd756f1cbfb3b6e93182c7829879114481f" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz#08353bd756f1cbfb3b6e93182c7829879114481f" integrity sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw== dependencies: postcss-value-parser "^4.2.0" postcss-initial@^4.0.1: version "4.0.1" - resolved "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz#529f735f72c5724a0fb30527df6fb7ac54d7de42" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-4.0.1.tgz#529f735f72c5724a0fb30527df6fb7ac54d7de42" integrity sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ== postcss-lab-function@^4.2.0: version "4.2.1" - resolved "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz#6fe4c015102ff7cd27d1bd5385582f67ebdbdc98" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz#6fe4c015102ff7cd27d1bd5385582f67ebdbdc98" integrity sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w== dependencies: "@csstools/postcss-progressive-custom-properties" "^1.1.0" postcss-value-parser "^4.2.0" +postcss-loader@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-8.1.1.tgz#2822589e7522927344954acb55bbf26e8b195dfe" + integrity sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ== + dependencies: + cosmiconfig "^9.0.0" + jiti "^1.20.0" + semver "^7.5.4" + postcss-logical@^5.0.4: version "5.0.4" - resolved "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz#ec75b1ee54421acc04d5921576b7d8db6b0e6f73" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-5.0.4.tgz#ec75b1ee54421acc04d5921576b7d8db6b0e6f73" integrity sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g== postcss-media-minmax@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz#7140bddec173e2d6d657edbd8554a55794e2a5b5" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz#7140bddec173e2d6d657edbd8554a55794e2a5b5" integrity sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ== postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + version "3.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz#b4497cb85a9c0c4b5aabeb759bb25e8d89f15002" + integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== postcss-modules-local-by-default@^4.0.0: - version "4.0.3" - resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524" - integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz#d150f43837831dae25e4085596e84f6f5d6ec368" + integrity sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw== dependencies: icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" + postcss-selector-parser "^7.0.0" postcss-value-parser "^4.1.0" postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + version "3.2.1" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz#1bbccddcb398f1d7a511e0a2d1d047718af4078c" + integrity sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA== dependencies: - postcss-selector-parser "^6.0.4" + postcss-selector-parser "^7.0.0" postcss-modules-values@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== dependencies: icss-utils "^5.0.0" postcss-nesting@^10.1.4: version "10.2.0" - resolved "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz#0b12ce0db8edfd2d8ae0aaf86427370b898890be" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-10.2.0.tgz#0b12ce0db8edfd2d8ae0aaf86427370b898890be" integrity sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA== dependencies: "@csstools/selector-specificity" "^2.0.0" @@ -10468,36 +11398,36 @@ postcss-nesting@^10.1.4: postcss-opacity-percentage@^1.1.2: version "1.1.3" - resolved "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz#5b89b35551a556e20c5d23eb5260fbfcf5245da6" + resolved "https://registry.yarnpkg.com/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz#5b89b35551a556e20c5d23eb5260fbfcf5245da6" integrity sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A== postcss-overflow-shorthand@^3.0.3: version "3.0.4" - resolved "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz#7ed6486fec44b76f0eab15aa4866cda5d55d893e" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz#7ed6486fec44b76f0eab15aa4866cda5d55d893e" integrity sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A== dependencies: postcss-value-parser "^4.2.0" postcss-page-break@^3.0.4: version "3.0.4" - resolved "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz#7fbf741c233621622b68d435babfb70dd8c1ee5f" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-3.0.4.tgz#7fbf741c233621622b68d435babfb70dd8c1ee5f" integrity sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ== postcss-place@^7.0.4: version "7.0.5" - resolved "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz#95dbf85fd9656a3a6e60e832b5809914236986c4" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-7.0.5.tgz#95dbf85fd9656a3a6e60e832b5809914236986c4" integrity sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g== dependencies: postcss-value-parser "^4.2.0" postcss-prefix-selector@1.16.0: version "1.16.0" - resolved "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-1.16.0.tgz#ad5b56f9a73a2c090ca7161049632c9d89bcb404" + resolved "https://registry.yarnpkg.com/postcss-prefix-selector/-/postcss-prefix-selector-1.16.0.tgz#ad5b56f9a73a2c090ca7161049632c9d89bcb404" integrity sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q== postcss-preset-env@7.5.0: version "7.5.0" - resolved "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.5.0.tgz#0c1f23933597d55dab4a90f61eda30b76e710658" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-7.5.0.tgz#0c1f23933597d55dab4a90f61eda30b76e710658" integrity sha512-0BJzWEfCdTtK2R3EiKKSdkE51/DI/BwnhlnicSW482Ym6/DGHud8K0wGLcdjip1epVX0HKo4c8zzTeV/SkiejQ== dependencies: "@csstools/postcss-color-function" "^1.1.0" @@ -10548,119 +11478,142 @@ postcss-preset-env@7.5.0: postcss-pseudo-class-any-link@^7.1.2: version "7.1.6" - resolved "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz#2693b221902da772c278def85a4d9a64b6e617ab" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz#2693b221902da772c278def85a4d9a64b6e617ab" integrity sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w== dependencies: postcss-selector-parser "^6.0.10" postcss-replace-overflow-wrap@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz#d2df6bed10b477bf9c52fab28c568b4b29ca4319" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz#d2df6bed10b477bf9c52fab28c568b4b29ca4319" integrity sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw== postcss-selector-not@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz#ac5fc506f7565dd872f82f5314c0f81a05630dc7" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz#ac5fc506f7565dd872f82f5314c0f81a05630dc7" integrity sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ== dependencies: balanced-match "^1.0.0" -postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.9: - version "6.0.13" - resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" - integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== +postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.9: + version "6.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" + integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-selector-parser@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz#4d6af97eba65d73bc4d84bcb343e865d7dd16262" + integrity sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" postcss-syntax@0.36.2: version "0.36.2" - resolved "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz#f08578c7d95834574e5593a82dfbfa8afae3b51c" + resolved "https://registry.yarnpkg.com/postcss-syntax/-/postcss-syntax-0.36.2.tgz#f08578c7d95834574e5593a82dfbfa8afae3b51c" integrity sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w== postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: version "4.2.0" - resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.3.11, postcss@^8.4.21, postcss@^8.4.7: - version "8.4.31" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" - integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== +postcss@^8.3.11, postcss@^8.4.21, postcss@^8.4.27, postcss@^8.4.7: + version "8.5.6" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c" + integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" + nanoid "^3.3.11" + picocolors "^1.1.1" + source-map-js "^1.2.1" prepend-http@^1.0.1: version "1.0.4" - resolved "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" integrity sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg== prettier-plugin-organize-imports@^3.2.2: version "3.2.4" - resolved "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-3.2.4.tgz#77967f69d335e9c8e6e5d224074609309c62845e" + resolved "https://registry.yarnpkg.com/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-3.2.4.tgz#77967f69d335e9c8e6e5d224074609309c62845e" integrity sha512-6m8WBhIp0dfwu0SkgfOxJqh+HpdyfqSSLfKKRZSFbDuEQXDDndb8fTpRWkUrX/uBenkex3MgnVk0J3b3Y5byog== prettier-plugin-packagejson@2.4.3: version "2.4.3" - resolved "https://registry.npmjs.org/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.4.3.tgz#77f50538cc47c86d4fa510bc312a548e346fb724" + resolved "https://registry.yarnpkg.com/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.4.3.tgz#77f50538cc47c86d4fa510bc312a548e346fb724" integrity sha512-kPeeviJiwy0BgOSk7No8NmzzXfW4R9FYWni6ziA5zc1kGVVrKnBzMZdu2TUhI+I7h8/5Htt3vARYOk7KKJTTNQ== dependencies: sort-package-json "2.4.1" synckit "0.8.5" prettier@^3.0.3: - version "3.1.0" - resolved "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz#c6d16474a5f764ea1a4a373c593b779697744d5e" - integrity sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw== + version "3.6.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.6.2.tgz#ccda02a1003ebbb2bfda6f83a074978f608b9393" + integrity sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ== pretty-error@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== dependencies: lodash "^4.17.20" renderkid "^3.0.0" +pretty-format@^24: + version "24.9.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" + integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== + dependencies: + "@jest/types" "^24.9.0" + ansi-regex "^4.0.0" + ansi-styles "^3.2.0" + react-is "^16.8.4" + prism-react-renderer@^1.3.5: version "1.3.5" - resolved "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz#786bb69aa6f73c32ba1ee813fbe17a0115435085" + resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz#786bb69aa6f73c32ba1ee813fbe17a0115435085" integrity sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg== prism-themes@^1.9.0: version "1.9.0" - resolved "https://registry.npmjs.org/prism-themes/-/prism-themes-1.9.0.tgz#19c034f3205f1e28d75d89728e54ccd745f7e3dd" + resolved "https://registry.yarnpkg.com/prism-themes/-/prism-themes-1.9.0.tgz#19c034f3205f1e28d75d89728e54ccd745f7e3dd" integrity sha512-tX2AYsehKDw1EORwBps+WhBFKc2kxfoFpQAjxBndbZKr4fRmMkv47XN0BghC/K1qwodB1otbe4oF23vUTFDokw== prismjs@^1.29.0: - version "1.29.0" - resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" - integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== + version "1.30.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.30.0.tgz#d9709969d9d4e16403f6f348c63553b19f0975a9" + integrity sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw== process-nextick-args@~2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +process-okam@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process-okam/-/process-okam-0.11.10.tgz#c2da27b44cd78684da664e38d58b3f74059688cd" + integrity sha512-p8e5nl6/OCeMalVb9dSojND5B9m/nq64WsyUfRmrTdLMKcNYcDN++/2I8WV1mTQDqrh2PQ6tIIb2A7/A38eSvw== + process-warning@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz#980a0b25dc38cd6034181be4b7726d89066b4616" + resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-1.0.0.tgz#980a0b25dc38cd6034181be4b7726d89066b4616" integrity sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q== process@^0.11.10: version "0.11.10" - resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== promise-inflight@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== promise-retry@^1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d" integrity sha512-StEy2osPr28o17bIW776GtwO6+Q+M9zPiZkYfosciUUMYqjhU/ffwRAH0zN2+uvGyUsn8/YICIHRzLbPacpZGw== dependencies: err-code "^1.0.0" @@ -10668,7 +11621,7 @@ promise-retry@^1.1.1: prop-types@^15.5.8, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" - resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== dependencies: loose-envify "^1.4.0" @@ -10676,30 +11629,38 @@ prop-types@^15.5.8, prop-types@^15.7.2, prop-types@^15.8.1: react-is "^16.13.1" property-information@^6.0.0: - version "6.4.0" - resolved "https://registry.npmjs.org/property-information/-/property-information-6.4.0.tgz#6bc4c618b0c2d68b3bb8b552cbb97f8e300a0f82" - integrity sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ== + version "6.5.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.5.0.tgz#6212fbb52ba757e92ef4fb9d657563b933b7ffec" + integrity sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig== protoduck@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/protoduck/-/protoduck-4.0.0.tgz#fe4874d8c7913366cfd9ead12453a22cd3657f8e" + resolved "https://registry.yarnpkg.com/protoduck/-/protoduck-4.0.0.tgz#fe4874d8c7913366cfd9ead12453a22cd3657f8e" integrity sha512-9sxuz0YTU/68O98xuDn8NBxTVH9EuMhrBTxZdiBL0/qxRmWhB/5a8MagAebDa+98vluAZTs8kMZibCdezbRCeQ== dependencies: genfun "^4.0.1" +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + prr@~1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== pseudomap@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== -public-encrypt@^4.0.0: +public-encrypt@^4.0.3: version "4.0.3" - resolved "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== dependencies: bn.js "^4.1.0" @@ -10711,7 +11672,7 @@ public-encrypt@^4.0.0: pump@^1.0.0: version "1.0.3" - resolved "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954" + resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954" integrity sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw== dependencies: end-of-stream "^1.1.0" @@ -10719,7 +11680,7 @@ pump@^1.0.0: pump@^2.0.0, pump@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== dependencies: end-of-stream "^1.1.0" @@ -10727,39 +11688,46 @@ pump@^2.0.0, pump@^2.0.1: pumpify@^1.3.3: version "1.5.1" - resolved "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== dependencies: duplexify "^3.6.0" inherits "^2.0.3" pump "^2.0.0" +punycode-okam@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode-okam/-/punycode-okam-1.4.1.tgz#e0404d4be30147fbee874e75d5bf3e75efb8efdc" + integrity sha512-e4mSfzGfrVBJmhjp+8PHjXIz5WrvEEWB2FT+RJ6YS/ozGttTcnocuj0CtMo3dujWYe2708bTd79zeIrKBtRzCg== + punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== punycode@^2.1.0: version "2.3.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== q@^1.1.2: version "1.5.1" - resolved "https://registry.npmjs.org/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== -qrcode.react@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/qrcode.react/-/qrcode.react-3.1.0.tgz#5c91ddc0340f768316fbdb8fff2765134c2aecd8" - integrity sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q== +qs@6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" + integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== + dependencies: + side-channel "^1.0.6" -qs@^6.10.1, qs@^6.11.2: - version "6.11.2" - resolved "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" - integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== +qs@^6.10.1, qs@^6.11.0, qs@^6.12.3: + version "6.14.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930" + integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== dependencies: - side-channel "^1.0.4" + side-channel "^1.1.0" query-string@^6.13.6, query-string@^6.9.0: version "6.14.1" @@ -10773,34 +11741,34 @@ query-string@^6.13.6, query-string@^6.9.0: querystring-es3@^0.2.0: version "0.2.1" - resolved "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== queue-microtask@^1.2.2: version "1.2.3" - resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== queue@6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/queue/-/queue-6.0.1.tgz#abd5a5b0376912f070a25729e0b6a7d565683791" + resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.1.tgz#abd5a5b0376912f070a25729e0b6a7d565683791" integrity sha512-AJBQabRCCNr9ANq8v77RJEv73DPbn55cdTb+Giq4X0AVnNVZvMHlYp7XlQiN+1npCZj1DuSmaA2hYVUUDgxFDg== dependencies: inherits "~2.0.3" quick-format-unescaped@^4.0.3: version "4.0.4" - resolved "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" + resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== quick-lru@^4.0.1: version "4.0.1" - resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== quill-delta@^3.6.2: version "3.6.3" - resolved "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz#b19fd2b89412301c60e1ff213d8d860eac0f1032" + resolved "https://registry.yarnpkg.com/quill-delta/-/quill-delta-3.6.3.tgz#b19fd2b89412301c60e1ff213d8d860eac0f1032" integrity sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg== dependencies: deep-equal "^1.0.1" @@ -10809,7 +11777,7 @@ quill-delta@^3.6.2: quill@^1.3.7: version "1.3.7" - resolved "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz#da5b2f3a2c470e932340cdbf3668c9f21f9286e8" + resolved "https://registry.yarnpkg.com/quill/-/quill-1.3.7.tgz#da5b2f3a2c470e932340cdbf3668c9f21f9286e8" integrity sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g== dependencies: clone "^2.1.1" @@ -10821,114 +11789,86 @@ quill@^1.3.7: raf-schd@^4.0.2: version "4.0.3" - resolved "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz#5d6c34ef46f8b2a0e880a8fcdb743efc5bfdbc1a" + resolved "https://registry.yarnpkg.com/raf-schd/-/raf-schd-4.0.3.tgz#5d6c34ef46f8b2a0e880a8fcdb743efc5bfdbc1a" integrity sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ== ramda@0.29.0: version "0.29.0" - resolved "https://registry.npmjs.org/ramda/-/ramda-0.29.0.tgz#fbbb67a740a754c8a4cbb41e2a6e0eb8507f55fb" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.29.0.tgz#fbbb67a740a754c8a4cbb41e2a6e0eb8507f55fb" integrity sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA== -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" -randomfill@^1.0.3: +randomfill@^1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== dependencies: randombytes "^2.0.5" safe-buffer "^5.1.0" +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.2, raw-body@^2.3.0: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + raw-loader@^4.0.2: version "4.0.2" - resolved "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz#1aac6b7d1ad1501e66efdac1522c73e59a584eb6" + resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-4.0.2.tgz#1aac6b7d1ad1501e66efdac1522c73e59a584eb6" integrity sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA== dependencies: loader-utils "^2.0.0" schema-utils "^3.0.0" -rc-cascader@~3.20.0: - version "3.20.0" - resolved "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.20.0.tgz#b270f9d84ed83417ee7309ef5e56e415f1586076" - integrity sha512-lkT9EEwOcYdjZ/jvhLoXGzprK1sijT3/Tp4BLxQQcHDZkkOzzwYQC9HgmKoJz0K7CukMfgvO9KqHeBdgE+pELw== +rc-cascader@~3.34.0: + version "3.34.0" + resolved "https://registry.yarnpkg.com/rc-cascader/-/rc-cascader-3.34.0.tgz#56f936ab6b1229bab7d558701ce9b9e96536582c" + integrity sha512-KpXypcvju9ptjW9FaN2NFcA2QH9E9LHKq169Y0eWtH4e/wHQ5Wh5qZakAgvb8EKZ736WZ3B0zLLOBsrsja5Dag== dependencies: - "@babel/runtime" "^7.12.5" - array-tree-filter "^2.1.0" + "@babel/runtime" "^7.25.7" classnames "^2.3.1" - rc-select "~14.10.0" - rc-tree "~5.8.1" - rc-util "^5.37.0" + rc-select "~14.16.2" + rc-tree "~5.13.0" + rc-util "^5.43.0" -rc-cascader@~3.24.0: - version "3.24.0" - resolved "https://registry.yarnpkg.com/rc-cascader/-/rc-cascader-3.24.0.tgz#f43f06233b89b7b46005c19f3233068c5b379b24" - integrity sha512-NwkYsVULA61S085jbOYbq8Z7leyIxVmLwf+71mWLjA3kCfUf/rAKC0WfjQbqBDaLGlU9d4z1EzyPaHBKLYWv6A== - dependencies: - "@babel/runtime" "^7.12.5" - array-tree-filter "^2.1.0" - classnames "^2.3.1" - rc-select "~14.13.0" - rc-tree "~5.8.1" - rc-util "^5.37.0" - -rc-checkbox@~3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.1.0.tgz#6be0d9d8de2cc96fb5e37f9036a1c3e360d0a42d" - integrity sha512-PAwpJFnBa3Ei+5pyqMMXdcKYKNBMS+TvSDiLdDnARnMJHC8ESxwPfm4Ao1gJiKtWLdmGfigascnCpwrHFgoOBQ== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.3.2" - rc-util "^5.25.2" - -rc-checkbox@~3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/rc-checkbox/-/rc-checkbox-3.2.0.tgz#04f83b7f2bf63eaf0e2da25e947b88a0a6321b5a" - integrity sha512-8inzw4y9dAhZmv/Ydl59Qdy5tdp9CKg4oPVcRigi+ga/yKPZS5m5SyyQPtYSgbcqHRYOdUhiPSeKfktc76du1A== +rc-checkbox@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/rc-checkbox/-/rc-checkbox-3.5.0.tgz#3ae2441e3a321774d390f76539e706864fcf5ff0" + integrity sha512-aOAQc3E98HteIIsSqm6Xk2FPKIER6+5vyEFMZfo73TqM+VVAIqOkHoPjgKLqSNtVLWScoaM7vY2ZrGEheI79yg== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.3.2" rc-util "^5.25.2" -rc-collapse@~3.7.1: - version "3.7.1" - resolved "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.7.1.tgz#bda1f7f80adccf3433c1c15d4d9f9ca09910c727" - integrity sha512-N/7ejyiTf3XElNJBBpxqnZBUuMsQWEOPjB2QkfNvZ/Ca54eAvJXuOD1EGbCWCk2m7v/MSxku7mRpdeaLOCd4Gg== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-motion "^2.3.4" - rc-util "^5.27.0" - -rc-collapse@~3.7.3: - version "3.7.3" - resolved "https://registry.yarnpkg.com/rc-collapse/-/rc-collapse-3.7.3.tgz#68161683d8fd1004bef4eb281fc106f3c8dc16eb" - integrity sha512-60FJcdTRn0X5sELF18TANwtVi7FtModq649H11mYF1jh83DniMoM4MqY627sEKRCTm4+WXfGDcB7hY5oW6xhyw== +rc-collapse@~3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/rc-collapse/-/rc-collapse-3.9.0.tgz#972404ce7724e1c9d1d2476543e1175404a36806" + integrity sha512-swDdz4QZ4dFTo4RAUMLL50qP0EY62N2kvmk2We5xYdRwcRn8WcYtuetCJpwpaCbUfUt5+huLpVxhvmnK+PHrkA== dependencies: "@babel/runtime" "^7.10.1" classnames "2.x" rc-motion "^2.3.4" rc-util "^5.27.0" -rc-dialog@~9.3.4: - version "9.3.4" - resolved "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.3.4.tgz#e0decb3d4a0dbe36524a67ed2f8fe2daa4b7b73c" - integrity sha512-975X3018GhR+EjZFbxA2Z57SX5rnu0G0/OxFgMMvZK4/hQWEm3MHaNvP4wXpxYDoJsp+xUvVW+GB9CMMCm81jA== - dependencies: - "@babel/runtime" "^7.10.1" - "@rc-component/portal" "^1.0.0-8" - classnames "^2.2.6" - rc-motion "^2.3.0" - rc-util "^5.21.0" - -rc-dialog@~9.4.0: - version "9.4.0" - resolved "https://registry.yarnpkg.com/rc-dialog/-/rc-dialog-9.4.0.tgz#194c107d34cb36a56f1db4a49dc73f6d59eeae85" - integrity sha512-AScCexaLACvf8KZRqCPz12BJ8olszXOS4lKlkMyzDQHS1m0zj1KZMYgmMCh39ee0Dcv8kyrj8mTqxuLyhH+QuQ== +rc-dialog@~9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/rc-dialog/-/rc-dialog-9.6.0.tgz#dc7a255c6ad1cb56021c3a61c7de86ee88c7c371" + integrity sha512-ApoVi9Z8PaCQg6FsUzS8yvBEQy0ZL2PkuvAgrmohPkN3okps5WZ5WQWPc1RNuiOKaAYv8B97ACdsFU5LizzCqg== dependencies: "@babel/runtime" "^7.10.1" "@rc-component/portal" "^1.0.0-8" @@ -10936,9 +11876,9 @@ rc-dialog@~9.4.0: rc-motion "^2.3.0" rc-util "^5.21.0" -rc-drawer@^6.1.2, rc-drawer@~6.5.2: +rc-drawer@^6.1.2: version "6.5.2" - resolved "https://registry.npmjs.org/rc-drawer/-/rc-drawer-6.5.2.tgz#49c1f279261992f6d4653d32a03b14acd436d610" + resolved "https://registry.yarnpkg.com/rc-drawer/-/rc-drawer-6.5.2.tgz#49c1f279261992f6d4653d32a03b14acd436d610" integrity sha512-QckxAnQNdhh4vtmKN0ZwDf3iakO83W9eZcSKWYYTDv4qcD2fHhRAZJJ/OE6v2ZlQ2kSqCJX5gYssF4HJFvsEPQ== dependencies: "@babel/runtime" "^7.10.1" @@ -10947,10 +11887,10 @@ rc-drawer@^6.1.2, rc-drawer@~6.5.2: rc-motion "^2.6.1" rc-util "^5.36.0" -rc-drawer@~7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/rc-drawer/-/rc-drawer-7.1.0.tgz#2beabb8bab1784aea255d0d850bc206c3dc715da" - integrity sha512-nBE1rF5iZvpavoyqhSSz2mk/yANltA7g3aF0U45xkx381n3we/RKs9cJfNKp9mSWCedOKWt9FLEwZDaAaOGn2w== +rc-drawer@~7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/rc-drawer/-/rc-drawer-7.3.0.tgz#1bb5fe5f9da38b6a2b2a7dffc9fcb647252a328f" + integrity sha512-DX6CIgiBWNpJIMGFO8BAISFkxiuKitoizooj4BDyee8/SnBn0zwO2FHrNDpqqepj0E/TFTDpmEBCyFuTgC7MOg== dependencies: "@babel/runtime" "^7.23.9" "@rc-component/portal" "^1.1.1" @@ -10960,7 +11900,7 @@ rc-drawer@~7.1.0: rc-dropdown@~4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.1.0.tgz#418a68939631520de80d0865d02b440eeeb4168e" + resolved "https://registry.yarnpkg.com/rc-dropdown/-/rc-dropdown-4.1.0.tgz#418a68939631520de80d0865d02b440eeeb4168e" integrity sha512-VZjMunpBdlVzYpEdJSaV7WM7O0jf8uyDjirxXLZRNZ+tAC+NzD3PXPEtliFwGzVwBBdCmGuSqiS9DWcOLxQ9tw== dependencies: "@babel/runtime" "^7.18.3" @@ -10968,128 +11908,74 @@ rc-dropdown@~4.1.0: classnames "^2.2.6" rc-util "^5.17.0" -rc-dropdown@~4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/rc-dropdown/-/rc-dropdown-4.2.0.tgz#c6052fcfe9c701487b141e411cdc277dc7c6f061" - integrity sha512-odM8Ove+gSh0zU27DUj5cG1gNKg7mLWBYzB5E4nNLrLwBmYEgYP43vHKDGOVZcJSVElQBI0+jTQgjnq0NfLjng== +rc-dropdown@~4.2.0, rc-dropdown@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/rc-dropdown/-/rc-dropdown-4.2.1.tgz#44729eb2a4272e0353d31ac060da21e606accb1c" + integrity sha512-YDAlXsPv3I1n42dv1JpdM7wJ+gSUBfeyPK59ZpBD9jQhK9jVuxpjj3NmWQHOBceA1zEPVX84T2wbdb2SD0UjmA== dependencies: "@babel/runtime" "^7.18.3" "@rc-component/trigger" "^2.0.0" classnames "^2.2.6" - rc-util "^5.17.0" + rc-util "^5.44.1" -rc-field-form@~1.40.0: - version "1.40.0" - resolved "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.40.0.tgz#808dce06ebae1c3aea574e672b673533fc98f11f" - integrity sha512-OM3N01X2BYFGJDJcwpk9/BBtlwgveE7eh2SQAKIxVCt9KVWlODYJ9ypTHQdxchfDbeJKJKxMBFXlLAmyvlgPHg== - dependencies: - "@babel/runtime" "^7.18.0" - async-validator "^4.1.0" - rc-util "^5.32.2" - -rc-field-form@~1.44.0: - version "1.44.0" - resolved "https://registry.yarnpkg.com/rc-field-form/-/rc-field-form-1.44.0.tgz#a66548790fbcee8c5432e9f2efcd1b46b090984b" - integrity sha512-el7w87fyDUsca63Y/s8qJcq9kNkf/J5h+iTdqG5WsSHLH0e6Usl7QuYSmSVzJMgtp40mOVZIY/W/QP9zwrp1FA== +rc-field-form@~2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/rc-field-form/-/rc-field-form-2.7.0.tgz#22413e793f35bfc1f35b0ec462774d7277f5a399" + integrity sha512-hgKsCay2taxzVnBPZl+1n4ZondsV78G++XVsMIJCAoioMjlMQR9YwAp7JZDIECzIu2Z66R+f4SFIRrO2DjDNAA== dependencies: "@babel/runtime" "^7.18.0" - async-validator "^4.1.0" + "@rc-component/async-validator" "^5.0.3" rc-util "^5.32.2" -rc-image@~7.3.2: - version "7.3.2" - resolved "https://registry.npmjs.org/rc-image/-/rc-image-7.3.2.tgz#fd92ab9994552d4f42638af0810039d34ad32dba" - integrity sha512-ICEF6SWv9YKhDXxy1vrXcmf0TVvEcQWIww5Yg+f+mn7e4oGX7FNP4+FExwMjNO5UHBEuWrigbGhlCgI6yZZ1jg== +rc-image@~7.12.0: + version "7.12.0" + resolved "https://registry.yarnpkg.com/rc-image/-/rc-image-7.12.0.tgz#95e9314701e668217d113c1f29b4f01ac025cafe" + integrity sha512-cZ3HTyyckPnNnUb9/DRqduqzLfrQRyi+CdHjdqgsyDpI3Ln5UX1kXnAhPBSJj9pVRzwRFgqkN7p9b6HBDjmu/Q== dependencies: "@babel/runtime" "^7.11.2" "@rc-component/portal" "^1.0.2" classnames "^2.2.6" - rc-dialog "~9.3.4" + rc-dialog "~9.6.0" rc-motion "^2.6.2" rc-util "^5.34.1" -rc-image@~7.6.0: - version "7.6.0" - resolved "https://registry.yarnpkg.com/rc-image/-/rc-image-7.6.0.tgz#2867087b77c8595ea9eb37d18ca863e47904b191" - integrity sha512-tL3Rvd1sS+frZQ01i+tkeUPaOeFz2iG9/scAt/Cfs0hyCRVA/w0Pu1J/JxIX8blalvmHE0bZQRYdOmRAzWu4Hg== - dependencies: - "@babel/runtime" "^7.11.2" - "@rc-component/portal" "^1.0.2" - classnames "^2.2.6" - rc-dialog "~9.4.0" - rc-motion "^2.6.2" - rc-util "^5.34.1" - -rc-input-number@~8.4.0: - version "8.4.0" - resolved "https://registry.npmjs.org/rc-input-number/-/rc-input-number-8.4.0.tgz#f0d0caa2ce3a4e37f062556f9cb4c08c8c23322d" - integrity sha512-B6rziPOLRmeP7kcS5qbdC5hXvvDHYKV4vUxmahevYx2E6crS2bRi0xLDjhJ0E1HtOWo8rTmaE2EBJAkTCZOLdA== - dependencies: - "@babel/runtime" "^7.10.1" - "@rc-component/mini-decimal" "^1.0.1" - classnames "^2.2.5" - rc-input "~1.3.5" - rc-util "^5.28.0" - -rc-input-number@~9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/rc-input-number/-/rc-input-number-9.0.0.tgz#47da6eaf95b0cf566fcdf68196c4dc82b8c8f166" - integrity sha512-RfcDBDdWFFetouWFXBA+WPEC8LzBXyngr9b+yTLVIygfFu7HiLRGn/s/v9wwno94X7KFvnb28FNynMGj9XJlDQ== +rc-input-number@~9.5.0: + version "9.5.0" + resolved "https://registry.yarnpkg.com/rc-input-number/-/rc-input-number-9.5.0.tgz#b47963d0f2cbd85ab2f1badfdc089a904c073f38" + integrity sha512-bKaEvB5tHebUURAEXw35LDcnRZLq3x1k7GxfAqBMzmpHkDGzjAtnUL8y4y5N15rIFIg5IJgwr211jInl3cipag== dependencies: "@babel/runtime" "^7.10.1" "@rc-component/mini-decimal" "^1.0.1" classnames "^2.2.5" - rc-input "~1.4.0" - rc-util "^5.28.0" + rc-input "~1.8.0" + rc-util "^5.40.1" -rc-input@~1.3.5: - version "1.3.6" - resolved "https://registry.npmjs.org/rc-input/-/rc-input-1.3.6.tgz#038b74779b6c8b688ff60a41c3976d1db7a1d7d6" - integrity sha512-/HjTaKi8/Ts4zNbYaB5oWCquxFyFQO4Co1MnMgoCeGJlpe7k8Eir2HN0a0F9IHDmmo+GYiGgPpz7w/d/krzsJA== - dependencies: - "@babel/runtime" "^7.11.1" - classnames "^2.2.1" - rc-util "^5.18.1" - -rc-input@~1.4.0, rc-input@~1.4.5: - version "1.4.5" - resolved "https://registry.yarnpkg.com/rc-input/-/rc-input-1.4.5.tgz#1f2f13fb1adb15fce5936aebcfab354f41b4f348" - integrity sha512-AjzykhwnwYTRSwwgCu70CGKBIAv6bP2nqnFptnNTprph/TF1BAs0Qxl91mie/BR6n827WIJB6ZjaRf9iiMwAfw== +rc-input@~1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/rc-input/-/rc-input-1.8.0.tgz#d2f4404befebf2fbdc28390d5494c302f74ae974" + integrity sha512-KXvaTbX+7ha8a/k+eg6SYRVERK0NddX8QX7a7AnRvUa/rEH0CNMlpcBzBkhI0wp2C8C4HlMoYl8TImSN+fuHKA== dependencies: "@babel/runtime" "^7.11.1" classnames "^2.2.1" rc-util "^5.18.1" -rc-mentions@~2.11.1: - version "2.11.1" - resolved "https://registry.yarnpkg.com/rc-mentions/-/rc-mentions-2.11.1.tgz#3e742d4b558965701021cff75b84af6cd4744ed3" - integrity sha512-upb4AK1SRFql7qGnbLEvJqLMugVVIyjmwBJW9L0eLoN9po4JmJZaBzmKA4089fNtsU8k6l/tdZiVafyooeKnLw== +rc-mentions@~2.20.0: + version "2.20.0" + resolved "https://registry.yarnpkg.com/rc-mentions/-/rc-mentions-2.20.0.tgz#3bbeac0352b02e0ce3e1244adb48701bb6903bf7" + integrity sha512-w8HCMZEh3f0nR8ZEd466ATqmXFCMGMN5UFCzEUL0bM/nGw/wOS2GgRzKBcm19K++jDyuWCOJOdgcKGXU3fXfbQ== dependencies: "@babel/runtime" "^7.22.5" "@rc-component/trigger" "^2.0.0" classnames "^2.2.6" - rc-input "~1.4.0" - rc-menu "~9.13.0" - rc-textarea "~1.6.1" + rc-input "~1.8.0" + rc-menu "~9.16.0" + rc-textarea "~1.10.0" rc-util "^5.34.1" -rc-mentions@~2.9.1: - version "2.9.1" - resolved "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.9.1.tgz#cfe55913fd5bc156ef9814f38c1a2ceefee032ce" - integrity sha512-cZuElWr/5Ws0PXx1uxobxfYh4mqUw2FitfabR62YnWgm+WAfDyXZXqZg5DxXW+M1cgVvntrQgDDd9LrihrXzew== - dependencies: - "@babel/runtime" "^7.22.5" - "@rc-component/trigger" "^1.5.0" - classnames "^2.2.6" - rc-input "~1.3.5" - rc-menu "~9.12.0" - rc-textarea "~1.5.0" - rc-util "^5.34.1" - -rc-menu@~9.12.0, rc-menu@~9.12.2: - version "9.12.2" - resolved "https://registry.npmjs.org/rc-menu/-/rc-menu-9.12.2.tgz#1bab34646421224eff5c5b7de993f8ea1238418e" - integrity sha512-NzloFH2pRUYmQ3S/YbJAvRkgCZaLvq0sRa5rgJtuIHLfPPprNHNyepeSlT64+dbVqI4qRWL44VN0lUCldCbbfg== +rc-menu@~9.12.0: + version "9.12.4" + resolved "https://registry.yarnpkg.com/rc-menu/-/rc-menu-9.12.4.tgz#4959b5eeb780be7ff52aac31952b35efca46b9a3" + integrity sha512-t2NcvPLV1mFJzw4F21ojOoRVofK2rWhpKPx69q2raUsiHPDP6DDevsBILEYdsIegqBeSXoWs2bf6CueBKg3BFg== dependencies: "@babel/runtime" "^7.10.1" "@rc-component/trigger" "^1.17.0" @@ -11098,10 +11984,10 @@ rc-menu@~9.12.0, rc-menu@~9.12.2: rc-overflow "^1.3.1" rc-util "^5.27.0" -rc-menu@~9.13.0: - version "9.13.0" - resolved "https://registry.yarnpkg.com/rc-menu/-/rc-menu-9.13.0.tgz#55426531af5fd0a2a0e0a50020cbd002b231edf9" - integrity sha512-1l8ooCB3HcYJKCltC/s7OxRKRjgymdl9htrCeGZcXNaMct0RxZRK6OPV3lPhVksIvAGMgzPd54ClpZ5J4b8cZA== +rc-menu@~9.16.0, rc-menu@~9.16.1: + version "9.16.1" + resolved "https://registry.yarnpkg.com/rc-menu/-/rc-menu-9.16.1.tgz#9df1168e41d87dc7164c582173e1a1d32011899f" + integrity sha512-ghHx6/6Dvp+fw8CJhDUHFHDJ84hJE3BXNCzSgLdmNiFErWSOaZNsihDAsKq9ByTALo/xkNIwtDFGIl6r+RPXBg== dependencies: "@babel/runtime" "^7.10.1" "@rc-component/trigger" "^2.0.0" @@ -11110,29 +11996,19 @@ rc-menu@~9.13.0: rc-overflow "^1.3.1" rc-util "^5.27.0" -rc-motion@^2.0.0, rc-motion@^2.0.1, rc-motion@^2.3.0, rc-motion@^2.3.4, rc-motion@^2.4.3, rc-motion@^2.4.4, rc-motion@^2.6.1, rc-motion@^2.6.2, rc-motion@^2.7.3, rc-motion@^2.9.0: - version "2.9.0" - resolved "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.0.tgz#9e18a1b8d61e528a97369cf9a7601e9b29205710" - integrity sha512-XIU2+xLkdIr1/h6ohPZXyPBMvOmuyFZQ/T0xnawz+Rh+gh4FINcnZmMT5UTIj6hgI0VLDjTaPeRd+smJeSPqiQ== +rc-motion@^2.0.0, rc-motion@^2.0.1, rc-motion@^2.3.0, rc-motion@^2.3.4, rc-motion@^2.4.3, rc-motion@^2.4.4, rc-motion@^2.6.1, rc-motion@^2.6.2, rc-motion@^2.7.3, rc-motion@^2.9.0, rc-motion@^2.9.5: + version "2.9.5" + resolved "https://registry.yarnpkg.com/rc-motion/-/rc-motion-2.9.5.tgz#12c6ead4fd355f94f00de9bb4f15df576d677e0c" + integrity sha512-w+XTUrfh7ArbYEd2582uDrEhmBHwK1ZENJiSJVb7uRxdE7qJSYjbO2eksRXmndqyKqKoYPc9ClpPh5242mV1vA== dependencies: "@babel/runtime" "^7.11.1" classnames "^2.2.1" - rc-util "^5.21.0" - -rc-notification@~5.3.0: - version "5.3.0" - resolved "https://registry.npmjs.org/rc-notification/-/rc-notification-5.3.0.tgz#e31c86fe2350598ade8cff383babd1befa7a94fe" - integrity sha512-WCf0uCOkZ3HGfF0p1H4Sgt7aWfipxORWTPp7o6prA3vxwtWhtug3GfpYls1pnBp4WA+j8vGIi5c2/hQRpGzPcQ== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-motion "^2.9.0" - rc-util "^5.20.1" + rc-util "^5.44.0" -rc-notification@~5.4.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/rc-notification/-/rc-notification-5.4.0.tgz#c5ea20bfe4ed2dbacc7ef945777626c050945db8" - integrity sha512-li19y9RoYJciF3WRFvD+DvWS70jdL8Fr+Gfb/OshK+iY6iTkwzoigmSIp76/kWh5tF5i/i9im12X3nsF85GYdA== +rc-notification@~5.6.4: + version "5.6.4" + resolved "https://registry.yarnpkg.com/rc-notification/-/rc-notification-5.6.4.tgz#ea89c39c13cd517fdfd97fe63f03376fabb78544" + integrity sha512-KcS4O6B4qzM3KH7lkwOB7ooLPZ4b6J+VMmQgT51VZCeEcmghdeR4IrMcFq0LG+RPdnbe/ArT086tGM8Snimgiw== dependencies: "@babel/runtime" "^7.10.1" classnames "2.x" @@ -11140,63 +12016,35 @@ rc-notification@~5.4.0: rc-util "^5.20.1" rc-overflow@^1.3.1, rc-overflow@^1.3.2: - version "1.3.2" - resolved "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.3.2.tgz#72ee49e85a1308d8d4e3bd53285dc1f3e0bcce2c" - integrity sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw== + version "1.4.1" + resolved "https://registry.yarnpkg.com/rc-overflow/-/rc-overflow-1.4.1.tgz#e1bcf0375979c24cffa2d87bf83a19ded5fcdf45" + integrity sha512-3MoPQQPV1uKyOMVNd6SZfONi+f3st0r8PksexIdBTeIYbMX0Jr+k7pHEDvsXtR4BpCv90/Pv2MovVNhktKrwvw== dependencies: "@babel/runtime" "^7.11.1" classnames "^2.2.1" rc-resize-observer "^1.0.0" rc-util "^5.37.0" -rc-pagination@~3.7.0: - version "3.7.0" - resolved "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.7.0.tgz#4c4332800688ec0fd3b2435c4772f7f8d4d7b50e" - integrity sha512-IxSzKapd13L91/195o1TPkKnCNw8gIR25UP1GCW/7c7n/slhld4npu2j2PB9IWjXm4SssaAaSAt2lscYog7wzg== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.1" - rc-util "^5.32.2" - -rc-pagination@~4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/rc-pagination/-/rc-pagination-4.0.4.tgz#ea401388ae86eac17ed5b41212d487f12b65b773" - integrity sha512-GGrLT4NgG6wgJpT/hHIpL9nELv27A1XbSZzECIuQBQTVSf4xGKxWr6I/jhpRPauYEWEbWVw22ObG6tJQqwJqWQ== +rc-pagination@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/rc-pagination/-/rc-pagination-5.1.0.tgz#a6e63a2c5db29e62f991282eb18a2d3ee725ba8b" + integrity sha512-8416Yip/+eclTFdHXLKTxZvn70duYVGTvUUWbckCCZoIl3jagqke3GLsFrMs0bsQBikiYpZLD9206Ej4SOdOXQ== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.3.2" rc-util "^5.38.0" -rc-picker@~3.14.6: - version "3.14.6" - resolved "https://registry.npmjs.org/rc-picker/-/rc-picker-3.14.6.tgz#60fc34f9883272e10f6c593fa6d82e7e7a70781b" - integrity sha512-AdKKW0AqMwZsKvIpwUWDUnpuGKZVrbxVTZTNjcO+pViGkjC1EBcjMgxVe8tomOEaIHJL5Gd13vS8Rr3zzxWmag== - dependencies: - "@babel/runtime" "^7.10.1" - "@rc-component/trigger" "^1.5.0" - classnames "^2.2.1" - rc-util "^5.30.0" - -rc-picker@~4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/rc-picker/-/rc-picker-4.3.0.tgz#920e89093d0f7e31443718ad822dd97118ad84f4" - integrity sha512-bQNB/+NdW55jlQ5lPnNqF5J90Tq4SihLbAF7tzPBvGDJyoYmDgwLm4FN0ZB3Ot9i1v6vJY/1mgqZZTT9jbYc5w== +rc-picker@~4.11.3: + version "4.11.3" + resolved "https://registry.yarnpkg.com/rc-picker/-/rc-picker-4.11.3.tgz#7e7e3ad83aa461c284b8391c697492d1c34d2cb8" + integrity sha512-MJ5teb7FlNE0NFHTncxXQ62Y5lytq6sh5nUw0iH8OkHL/TjARSEvSHpr940pWgjGANpjCwyMdvsEV55l5tYNSg== dependencies: - "@babel/runtime" "^7.10.1" + "@babel/runtime" "^7.24.7" "@rc-component/trigger" "^2.0.0" classnames "^2.2.1" rc-overflow "^1.3.2" rc-resize-observer "^1.4.0" - rc-util "^5.38.1" - -rc-progress@~3.5.1: - version "3.5.1" - resolved "https://registry.npmjs.org/rc-progress/-/rc-progress-3.5.1.tgz#a3cdfd2fe04eb5c3d43fa1c69e7dd70c73b102ae" - integrity sha512-V6Amx6SbLRwPin/oD+k1vbPrO8+9Qf8zW1T8A7o83HdNafEVvAxPV5YsgtKFP+Ud5HghLj33zKOcEHrcrUGkfw== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.6" - rc-util "^5.16.1" + rc-util "^5.43.0" rc-progress@~4.0.0: version "4.0.0" @@ -11207,92 +12055,60 @@ rc-progress@~4.0.0: classnames "^2.2.6" rc-util "^5.16.1" -rc-rate@~2.12.0: - version "2.12.0" - resolved "https://registry.npmjs.org/rc-rate/-/rc-rate-2.12.0.tgz#0182deffed3b009cdcc61660da8746c39ed91ed5" - integrity sha512-g092v5iZCdVzbjdn28FzvWebK2IutoVoiTeqoLTj9WM7SjA/gOJIw5/JFZMRyJYYVe1jLAU2UhAfstIpCNRozg== +rc-rate@~2.13.1: + version "2.13.1" + resolved "https://registry.yarnpkg.com/rc-rate/-/rc-rate-2.13.1.tgz#29af7a3d4768362e9d4388f955a8b6389526b7fd" + integrity sha512-QUhQ9ivQ8Gy7mtMZPAjLbxBt5y9GRp65VcUyGUMF3N3fhiftivPHdpuDIaWIMOTEprAjZPC08bls1dQB+I1F2Q== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.2.5" rc-util "^5.0.1" -rc-resize-observer@^1.0.0, rc-resize-observer@^1.1.0, rc-resize-observer@^1.3.1, rc-resize-observer@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.4.0.tgz#7bba61e6b3c604834980647cce6451914750d0cc" - integrity sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q== +rc-resize-observer@^1.0.0, rc-resize-observer@^1.1.0, rc-resize-observer@^1.3.1, rc-resize-observer@^1.4.0, rc-resize-observer@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/rc-resize-observer/-/rc-resize-observer-1.4.3.tgz#4fd41fa561ba51362b5155a07c35d7c89a1ea569" + integrity sha512-YZLjUbyIWox8E9i9C3Tm7ia+W7euPItNWSPX5sCcQTYbnwDb5uNpnLHQCG1f22oZWUhLw4Mv2tFmeWe68CDQRQ== dependencies: "@babel/runtime" "^7.20.7" classnames "^2.2.1" - rc-util "^5.38.0" + rc-util "^5.44.1" resize-observer-polyfill "^1.5.1" -rc-segmented@~2.2.2: - version "2.2.2" - resolved "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.2.2.tgz#a34f12ce6c0975fc3042ae7656bcd18e1744798e" - integrity sha512-Mq52M96QdHMsNdE/042ibT5vkcGcD5jxKp7HgPC2SRofpia99P5fkfHy1pEaajLMF/kj0+2Lkq1UZRvqzo9mSA== - dependencies: - "@babel/runtime" "^7.11.1" - classnames "^2.2.1" - rc-motion "^2.4.4" - rc-util "^5.17.0" - -rc-segmented@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/rc-segmented/-/rc-segmented-2.3.0.tgz#b3fe080fb434a266c02e30bb62a47d2c6e094341" - integrity sha512-I3FtM5Smua/ESXutFfb8gJ8ZPcvFR+qUgeeGFQHBOvRiRKyAk4aBE5nfqrxXx+h8/vn60DQjOt6i4RNtrbOobg== +rc-segmented@~2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/rc-segmented/-/rc-segmented-2.7.0.tgz#f56c2044abf8f03958b3a9a9d32987f10dcc4fc4" + integrity sha512-liijAjXz+KnTRVnxxXG2sYDGd6iLL7VpGGdR8gwoxAXy2KglviKCxLWZdjKYJzYzGSUwKDSTdYk8brj54Bn5BA== dependencies: "@babel/runtime" "^7.11.1" classnames "^2.2.1" rc-motion "^2.4.4" rc-util "^5.17.0" -rc-select@~14.10.0: - version "14.10.0" - resolved "https://registry.npmjs.org/rc-select/-/rc-select-14.10.0.tgz#5f60e61ed7c9a83c8591616b1174a1c4ab2de0cd" - integrity sha512-TsIJTYafTTapCA32LLNpx/AD6ntepR1TG8jEVx35NiAAWCPymhUfuca8kRcUNd3WIGVMDcMKn9kkphoxEz+6Ag== +rc-select@~14.16.2, rc-select@~14.16.8: + version "14.16.8" + resolved "https://registry.yarnpkg.com/rc-select/-/rc-select-14.16.8.tgz#78e6782f1ccc1f03d9003bc3effa4ed609d29a97" + integrity sha512-NOV5BZa1wZrsdkKaiK7LHRuo5ZjZYMDxPP6/1+09+FB4KoNi8jcG1ZqLE3AVCxEsYMBe65OBx71wFoHRTP3LRg== dependencies: "@babel/runtime" "^7.10.1" - "@rc-component/trigger" "^1.5.0" + "@rc-component/trigger" "^2.1.1" classnames "2.x" rc-motion "^2.0.1" rc-overflow "^1.3.1" rc-util "^5.16.1" rc-virtual-list "^3.5.2" -rc-select@~14.13.0: - version "14.13.0" - resolved "https://registry.yarnpkg.com/rc-select/-/rc-select-14.13.0.tgz#5f343d18398833e0fe44a060a17a8dc1775cb650" - integrity sha512-ew34FsaqHokK4dxVrcIxSYrgWJ2XJYlkk32eiOIiEo3GkHUExdCzmozMYaUc2P67c5QJRUvvY0uqCs3QG67h5A== - dependencies: - "@babel/runtime" "^7.10.1" - "@rc-component/trigger" "^2.0.0" - classnames "2.x" - rc-motion "^2.0.1" - rc-overflow "^1.3.1" - rc-util "^5.16.1" - rc-virtual-list "^3.5.2" - -rc-slider@~10.4.0: - version "10.4.0" - resolved "https://registry.npmjs.org/rc-slider/-/rc-slider-10.4.0.tgz#efc016583fdea5f5dfb4f3dc61b6755a19e5f453" - integrity sha512-ZlpWjFhOlEf0w4Ng31avFBkXNNBj60NAcTPaIoiCxBkJ29wOtHSPMqv9PZeEoqmx64bpJkgK7kPa47HG4LPzww== +rc-slider@~11.1.8: + version "11.1.8" + resolved "https://registry.yarnpkg.com/rc-slider/-/rc-slider-11.1.8.tgz#cf3b30dacac8f98d44f7685f733f6f7da146fc06" + integrity sha512-2gg/72YFSpKP+Ja5AjC5DPL1YnV8DEITDQrcc1eASrUYjl0esptaBVJBh5nLTXCCp15eD8EuGjwezVGSHhs9tQ== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.2.5" - rc-util "^5.27.0" - -rc-slider@~10.5.0: - version "10.5.0" - resolved "https://registry.yarnpkg.com/rc-slider/-/rc-slider-10.5.0.tgz#1bd4853d114cb3403b67c485125887adb6a2a117" - integrity sha512-xiYght50cvoODZYI43v3Ylsqiw14+D7ELsgzR40boDZaya1HFa1Etnv9MDkQE8X/UrXAffwv2AcNAhslgYuDTw== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.5" - rc-util "^5.27.0" + rc-util "^5.36.0" rc-steps@~6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/rc-steps/-/rc-steps-6.0.1.tgz#c2136cd0087733f6d509209a84a5c80dc29a274d" + resolved "https://registry.yarnpkg.com/rc-steps/-/rc-steps-6.0.1.tgz#c2136cd0087733f6d509209a84a5c80dc29a274d" integrity sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g== dependencies: "@babel/runtime" "^7.16.7" @@ -11301,41 +12117,29 @@ rc-steps@~6.0.1: rc-switch@~4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/rc-switch/-/rc-switch-4.1.0.tgz#f37d81b4e0c5afd1274fd85367b17306bf25e7d7" + resolved "https://registry.yarnpkg.com/rc-switch/-/rc-switch-4.1.0.tgz#f37d81b4e0c5afd1274fd85367b17306bf25e7d7" integrity sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg== dependencies: "@babel/runtime" "^7.21.0" classnames "^2.2.1" rc-util "^5.30.0" -rc-table@~7.35.2: - version "7.35.2" - resolved "https://registry.npmjs.org/rc-table/-/rc-table-7.35.2.tgz#8fcd59e9342bf13fe131ca54c6105e71ab95588b" - integrity sha512-ZLIZdAEdfen21FI21xt2LDg9chQ7gc5Lpy4nkjWKPDgmQMnH0KJ8JQQzrd3zrEN16xzjiVdHHvRmi1RU8BtgYg== +rc-table@~7.51.1: + version "7.51.1" + resolved "https://registry.yarnpkg.com/rc-table/-/rc-table-7.51.1.tgz#cd69ae3262d3b61e4c93c979c12786906e944691" + integrity sha512-5iq15mTHhvC42TlBLRCoCBLoCmGlbRZAlyF21FonFnS/DIC8DeRqnmdyVREwt2CFbPceM0zSNdEeVfiGaqYsKw== dependencies: "@babel/runtime" "^7.10.1" "@rc-component/context" "^1.4.0" classnames "^2.2.5" rc-resize-observer "^1.1.0" - rc-util "^5.37.0" - rc-virtual-list "^3.11.1" + rc-util "^5.44.3" + rc-virtual-list "^3.14.2" -rc-table@~7.45.4: - version "7.45.4" - resolved "https://registry.yarnpkg.com/rc-table/-/rc-table-7.45.4.tgz#8657450d836f691e94ff2282a1c8ee344fe551e6" - integrity sha512-6aSbGrnkN2GLSt3s1x+wa4f3j/VEgg1uKPpaLY5qHH1/nFyreS2V7DFJ0TfUb18allf2FQl7oVYEjTixlBXEyQ== - dependencies: - "@babel/runtime" "^7.10.1" - "@rc-component/context" "^1.4.0" - classnames "^2.2.5" - rc-resize-observer "^1.1.0" - rc-util "^5.37.0" - rc-virtual-list "^3.11.1" - -rc-tabs@^12.10.0, rc-tabs@~12.13.1: - version "12.13.1" - resolved "https://registry.npmjs.org/rc-tabs/-/rc-tabs-12.13.1.tgz#e28c5652dfed4e72eb27a75a2691754afd3e5f68" - integrity sha512-83u3l2QkO0UznCzdBLEk9WnNcT+imtmDmMT993sUUEOGnNQAmqOdev0XjeqrcvsAMe9CDpAWDFd7L/RZw+LVJQ== +rc-tabs@^12.10.0: + version "12.15.0" + resolved "https://registry.yarnpkg.com/rc-tabs/-/rc-tabs-12.15.0.tgz#68d445f207a7bc4593d1b254ccd6cfccc1673a3f" + integrity sha512-aXFLRo7jo531Jed1LgRqrF0VmRnzM/Qki25PknM3S04gqyxpDaHNFpPba05pHhn+d1N+54qIi0IcY1odrCrF2A== dependencies: "@babel/runtime" "^7.11.2" classnames "2.x" @@ -11345,96 +12149,55 @@ rc-tabs@^12.10.0, rc-tabs@~12.13.1: rc-resize-observer "^1.0.0" rc-util "^5.34.1" -rc-tabs@~14.1.1: - version "14.1.1" - resolved "https://registry.yarnpkg.com/rc-tabs/-/rc-tabs-14.1.1.tgz#f49467feb69af0156c7864d04c21396e4c5c7911" - integrity sha512-5nOr9PVpJy2SWHTLgv1+kESDOb0tFzl0cYU9r9d8LfL0Wg9i/n1B558rmkxdQHgBwMqxmwoyPSAbQROxMQe8nw== +rc-tabs@~15.6.1: + version "15.6.1" + resolved "https://registry.yarnpkg.com/rc-tabs/-/rc-tabs-15.6.1.tgz#f0b6c65384dfa09a64eb539e86a0667c7a650708" + integrity sha512-/HzDV1VqOsUWyuC0c6AkxVYFjvx9+rFPKZ32ejxX0Uc7QCzcEjTA9/xMgv4HemPKwzBNX8KhGVbbumDjnj92aA== dependencies: "@babel/runtime" "^7.11.2" classnames "2.x" rc-dropdown "~4.2.0" - rc-menu "~9.13.0" + rc-menu "~9.16.0" rc-motion "^2.6.2" rc-resize-observer "^1.0.0" rc-util "^5.34.1" -rc-textarea@~1.5.0, rc-textarea@~1.5.2: - version "1.5.3" - resolved "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.5.3.tgz#513e837d308584996c05f540f4f58645a3a8c89a" - integrity sha512-oH682ghHx++stFNYrosPRBfwsypywrTXpaD0/5Z8MPkUOnyOQUaY9ueL9tMu6BP1LfsuYQ1VLpg5OtshViLNgA== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.1" - rc-input "~1.3.5" - rc-resize-observer "^1.0.0" - rc-util "^5.27.0" - -rc-textarea@~1.6.1, rc-textarea@~1.6.3: - version "1.6.3" - resolved "https://registry.yarnpkg.com/rc-textarea/-/rc-textarea-1.6.3.tgz#3f294fdf5dfadbe9d0e7b695cea4da557728a9be" - integrity sha512-8k7+8Y2GJ/cQLiClFMg8kUXOOdvcFQrnGeSchOvI2ZMIVvX5a3zQpLxoODL0HTrvU63fPkRmMuqaEcOF9dQemA== +rc-textarea@~1.10.0, rc-textarea@~1.10.1: + version "1.10.2" + resolved "https://registry.yarnpkg.com/rc-textarea/-/rc-textarea-1.10.2.tgz#459e3574a95c32939c6793045a1e4db04cb514cc" + integrity sha512-HfaeXiaSlpiSp0I/pvWpecFEHpVysZ9tpDLNkxQbMvMz6gsr7aVZ7FpWP9kt4t7DB+jJXesYS0us1uPZnlRnwQ== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.2.1" - rc-input "~1.4.0" + rc-input "~1.8.0" rc-resize-observer "^1.0.0" rc-util "^5.27.0" -rc-tooltip@~6.1.2: - version "6.1.2" - resolved "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.1.2.tgz#33923ecfb2cf24347975093cbd0b048ab33c9567" - integrity sha512-89zwvybvCxGJu3+gGF8w5AXd4HHk6hIN7K0vZbkzjilVaEAIWPqc1fcyeUeP71n3VCcw7pTL9LyFupFbrx8gHw== - dependencies: - "@babel/runtime" "^7.11.2" - "@rc-component/trigger" "^1.18.0" - classnames "^2.3.1" - -rc-tooltip@~6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/rc-tooltip/-/rc-tooltip-6.2.0.tgz#4dd7575674137a5b14f118a5c16435d3f5e4a9c9" - integrity sha512-iS/3iOAvtDh9GIx1ulY7EFUXUtktFccNLsARo3NPgLf0QW9oT0w3dA9cYWlhqAKmD+uriEwdWz1kH0Qs4zk2Aw== - dependencies: - "@babel/runtime" "^7.11.2" - "@rc-component/trigger" "^2.0.0" - classnames "^2.3.1" - -rc-tree-select@~5.15.0: - version "5.15.0" - resolved "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.15.0.tgz#8591f1dd28b043dde6fa1ca30c7acb198b160a42" - integrity sha512-YJHfdO6azFnR0/JuNBZLDptGE4/RGfVeHAafUIYcm2T3RBkL1O8aVqiHvwIyLzdK59ry0NLrByd+3TkfpRM+9Q== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-select "~14.10.0" - rc-tree "~5.8.1" - rc-util "^5.16.1" - -rc-tree-select@~5.19.0: - version "5.19.0" - resolved "https://registry.yarnpkg.com/rc-tree-select/-/rc-tree-select-5.19.0.tgz#1da83694ffeeeed7ba5e4bd49a1d7df48501677d" - integrity sha512-f4l5EsmSGF3ggj76YTzKNPY9SnXfFaer7ZccTSGb3urUf54L+cCqyT+UsPr+S5TAr8mZSxJ7g3CgkCe+cVQ6sw== +rc-tooltip@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/rc-tooltip/-/rc-tooltip-6.4.0.tgz#e832ed0392872025e59928cfc1ad9045656467fd" + integrity sha512-kqyivim5cp8I5RkHmpsp1Nn/Wk+1oeloMv9c7LXNgDxUpGm+RbXJGL+OPvDlcRnx9DBeOe4wyOIl4OKUERyH1g== dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-select "~14.13.0" - rc-tree "~5.8.1" - rc-util "^5.16.1" + "@babel/runtime" "^7.11.2" + "@rc-component/trigger" "^2.0.0" + classnames "^2.3.1" + rc-util "^5.44.3" -rc-tree@^5.7.9, rc-tree@~5.8.1, rc-tree@~5.8.2: - version "5.8.2" - resolved "https://registry.npmjs.org/rc-tree/-/rc-tree-5.8.2.tgz#ed3a3f7c56597bbeab3303407a9e1739bbf15621" - integrity sha512-xH/fcgLHWTLmrSuNphU8XAqV7CdaOQgm4KywlLGNoTMhDAcNR3GVNP6cZzb0GrKmIZ9yae+QLot/cAgUdPRMzg== +rc-tree-select@~5.27.0: + version "5.27.0" + resolved "https://registry.yarnpkg.com/rc-tree-select/-/rc-tree-select-5.27.0.tgz#3daa62972ae80846dac96bf4776d1a9dc9c7c4c6" + integrity sha512-2qTBTzwIT7LRI1o7zLyrCzmo5tQanmyGbSaGTIf7sYimCklAToVVfpMC6OAldSKolcnjorBYPNSKQqJmN3TCww== dependencies: - "@babel/runtime" "^7.10.1" + "@babel/runtime" "^7.25.7" classnames "2.x" - rc-motion "^2.0.1" - rc-util "^5.16.1" - rc-virtual-list "^3.5.1" + rc-select "~14.16.2" + rc-tree "~5.13.0" + rc-util "^5.43.0" -rc-tree@~5.8.5: - version "5.8.5" - resolved "https://registry.yarnpkg.com/rc-tree/-/rc-tree-5.8.5.tgz#f714a383be27bd87366cf32f7f85b2af1fbae6b6" - integrity sha512-PRfcZtVDNkR7oh26RuNe1hpw11c1wfgzwmPFL0lnxGnYefe9lDAO6cg5wJKIAwyXFVt5zHgpjYmaz0CPy1ZtKg== +rc-tree@^5.7.9, rc-tree@~5.13.0, rc-tree@~5.13.1: + version "5.13.1" + resolved "https://registry.yarnpkg.com/rc-tree/-/rc-tree-5.13.1.tgz#f36a33a94a1282f4b09685216c01487089748910" + integrity sha512-FNhIefhftobCdUJshO7M8uZTA9F4OPGVXqGfZkkD/5soDeOhwO06T/aKTrg0WD8gRg/pyfq+ql3aMymLHCTC4A== dependencies: "@babel/runtime" "^7.10.1" classnames "2.x" @@ -11442,44 +12205,27 @@ rc-tree@~5.8.5: rc-util "^5.16.1" rc-virtual-list "^3.5.1" -rc-upload@~4.3.5: - version "4.3.5" - resolved "https://registry.npmjs.org/rc-upload/-/rc-upload-4.3.5.tgz#12fc69b2af74d08646a104828831bcaf44076eda" - integrity sha512-EHlKJbhkgFSQHliTj9v/2K5aEuFwfUQgZARzD7AmAPOneZEPiCNF3n6PEWIuqz9h7oq6FuXgdR67sC5BWFxJbA== - dependencies: - "@babel/runtime" "^7.18.3" - classnames "^2.2.5" - rc-util "^5.2.0" - -rc-upload@~4.5.2: - version "4.5.2" - resolved "https://registry.yarnpkg.com/rc-upload/-/rc-upload-4.5.2.tgz#ea493fbaaf57d9369ee954b20e1d8bc35c818a1a" - integrity sha512-QO3ne77DwnAPKFn0bA5qJM81QBjQi0e0NHdkvpFyY73Bea2NfITiotqJqVjHgeYPOJu5lLVR32TNGP084aSoXA== +rc-upload@~4.9.2: + version "4.9.2" + resolved "https://registry.yarnpkg.com/rc-upload/-/rc-upload-4.9.2.tgz#297f52fd1b1c2a4b570c3e42444609b7530531bb" + integrity sha512-nHx+9rbd1FKMiMRYsqQ3NkXUv7COHPBo3X1Obwq9SWS6/diF/A0aJ5OHubvwUAIDs+4RMleljV0pcrNUc823GQ== dependencies: "@babel/runtime" "^7.18.3" classnames "^2.2.5" rc-util "^5.2.0" -rc-util@^5.0.1, rc-util@^5.0.6, rc-util@^5.16.1, rc-util@^5.17.0, rc-util@^5.18.1, rc-util@^5.2.0, rc-util@^5.20.1, rc-util@^5.21.0, rc-util@^5.21.5, rc-util@^5.24.4, rc-util@^5.25.2, rc-util@^5.27.0, rc-util@^5.28.0, rc-util@^5.30.0, rc-util@^5.31.1, rc-util@^5.32.2, rc-util@^5.34.1, rc-util@^5.35.0, rc-util@^5.36.0, rc-util@^5.37.0, rc-util@^5.38.0, rc-util@^5.38.1: - version "5.38.1" - resolved "https://registry.npmjs.org/rc-util/-/rc-util-5.38.1.tgz#4915503b89855f5c5cd9afd4c72a7a17568777bb" - integrity sha512-e4ZMs7q9XqwTuhIK7zBIVFltUtMSjphuPPQXHoHlzRzNdOwUxDejo0Zls5HYaJfRKNURcsS/ceKVULlhjBrxng== - dependencies: - "@babel/runtime" "^7.18.3" - react-is "^18.2.0" - -rc-util@^5.39.1: - version "5.39.1" - resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-5.39.1.tgz#7bca4fb55e20add0eef5c23166cd9f9e5f51a8a1" - integrity sha512-OW/ERynNDgNr4y0oiFmtes3rbEamXw7GHGbkbNd9iRr7kgT03T6fT0b9WpJ3mbxKhyOcAHnGcIoh5u/cjrC2OQ== +rc-util@^5.0.1, rc-util@^5.0.6, rc-util@^5.16.1, rc-util@^5.17.0, rc-util@^5.18.1, rc-util@^5.2.0, rc-util@^5.20.1, rc-util@^5.21.0, rc-util@^5.21.5, rc-util@^5.24.4, rc-util@^5.25.2, rc-util@^5.27.0, rc-util@^5.30.0, rc-util@^5.31.1, rc-util@^5.32.2, rc-util@^5.34.1, rc-util@^5.35.0, rc-util@^5.36.0, rc-util@^5.37.0, rc-util@^5.38.0, rc-util@^5.38.1, rc-util@^5.40.1, rc-util@^5.43.0, rc-util@^5.44.0, rc-util@^5.44.1, rc-util@^5.44.3, rc-util@^5.44.4: + version "5.44.4" + resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-5.44.4.tgz#89ee9037683cca01cd60f1a6bbda761457dd6ba5" + integrity sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w== dependencies: "@babel/runtime" "^7.18.3" react-is "^18.2.0" -rc-virtual-list@^3.11.1, rc-virtual-list@^3.5.1, rc-virtual-list@^3.5.2: - version "3.11.3" - resolved "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.11.3.tgz#77d4e12e20c1ba314b43c0e37e118296674c5401" - integrity sha512-tu5UtrMk/AXonHwHxUogdXAWynaXsrx1i6dsgg+lOo/KJSF8oBAcprh1z5J3xgnPJD5hXxTL58F8s8onokdt0Q== +rc-virtual-list@^3.14.2, rc-virtual-list@^3.5.1, rc-virtual-list@^3.5.2: + version "3.19.1" + resolved "https://registry.yarnpkg.com/rc-virtual-list/-/rc-virtual-list-3.19.1.tgz#785b5f409b0bbbfa1eaadcc811971359c83dd9fb" + integrity sha512-DCapO2oyPqmooGhxBuXHM4lFuX+sshQwWqqkuyFA+4rShLe//+GEPVwiDgO+jKtKHtbeYwZoNvetwfHdOf+iUQ== dependencies: "@babel/runtime" "^7.20.0" classnames "^2.2.6" @@ -11488,7 +12234,7 @@ rc-virtual-list@^3.11.1, rc-virtual-list@^3.5.1, rc-virtual-list@^3.5.2: rc@^1.0.1, rc@^1.1.6: version "1.2.8" - resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== dependencies: deep-extend "^0.6.0" @@ -11498,7 +12244,7 @@ rc@^1.0.1, rc@^1.1.6: react-beautiful-dnd@^13.1.0: version "13.1.1" - resolved "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz#b0f3087a5840920abf8bb2325f1ffa46d8c4d0a2" + resolved "https://registry.yarnpkg.com/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz#b0f3087a5840920abf8bb2325f1ffa46d8c4d0a2" integrity sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ== dependencies: "@babel/runtime" "^7.9.2" @@ -11511,53 +12257,60 @@ react-beautiful-dnd@^13.1.0: react-colorful@^5.5.1: version "5.6.1" - resolved "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz#7dc2aed2d7c72fac89694e834d179e32f3da563b" + resolved "https://registry.yarnpkg.com/react-colorful/-/react-colorful-5.6.1.tgz#7dc2aed2d7c72fac89694e834d179e32f3da563b" integrity sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw== react-copy-to-clipboard@^5.1.0: version "5.1.0" - resolved "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz#09aae5ec4c62750ccb2e6421a58725eabc41255c" + resolved "https://registry.yarnpkg.com/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz#09aae5ec4c62750ccb2e6421a58725eabc41255c" integrity sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A== dependencies: copy-to-clipboard "^3.3.1" prop-types "^15.8.1" -react-dom@18.1.0: - version "18.1.0" - resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.1.0.tgz#7f6dd84b706408adde05e1df575b3a024d7e8a2f" - integrity sha512-fU1Txz7Budmvamp7bshe4Zi32d0ll7ect+ccxNu9FlObT605GOEB8BfO4tmRJ39R5Zj831VCpvQ05QPBW5yb+w== +react-dom@18.3.1: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== dependencies: loose-envify "^1.1.0" - scheduler "^0.22.0" + scheduler "^0.23.2" + +react-dom@^19.1.1: + version "19.1.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.1.1.tgz#2daa9ff7f3ae384aeb30e76d5ee38c046dc89893" + integrity sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw== + dependencies: + scheduler "^0.26.0" react-drag-listview@^0.1.9: version "0.1.9" - resolved "https://registry.npmjs.org/react-drag-listview/-/react-drag-listview-0.1.9.tgz#6732849c50f1de088775c1f287017615544cec3d" + resolved "https://registry.yarnpkg.com/react-drag-listview/-/react-drag-listview-0.1.9.tgz#6732849c50f1de088775c1f287017615544cec3d" integrity sha512-/OsYevKtCUlw4FhJIfZPH7INHEmyl89sSC5COzonHW5Z2c8rHg4DNYFnUxOyqH+65o7sHweL13oaf6wr7dFvPA== dependencies: babel-runtime "^6.26.0" prop-types "^15.5.8" react-error-boundary@^4.0.10: - version "4.0.11" - resolved "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-4.0.11.tgz#36bf44de7746714725a814630282fee83a7c9a1c" - integrity sha512-U13ul67aP5DOSPNSCWQ/eO0AQEYzEFkVljULQIjMV0KlffTAhxuDoBKdO0pb/JZ8mDhMKFZ9NZi0BmLGUiNphw== + version "4.1.2" + resolved "https://registry.yarnpkg.com/react-error-boundary/-/react-error-boundary-4.1.2.tgz#bc750ad962edb8b135d6ae922c046051eb58f289" + integrity sha512-GQDxZ5Jd+Aq/qUxbCm1UtzmL/s++V7zKgE8yMktJiCQXCCFZnMZh9ng+6/Ne6PjNSXH0L9CjeOEREfRnq6Duag== dependencies: "@babel/runtime" "^7.12.5" react-error-overlay@6.0.9: version "6.0.9" - resolved "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz#3c743010c9359608c375ecd6bc76f35d93995b0a" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz#3c743010c9359608c375ecd6bc76f35d93995b0a" integrity sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew== react-fast-compare@^3.1.1, react-fast-compare@^3.2.0, react-fast-compare@^3.2.2: version "3.2.2" - resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49" integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== react-helmet-async@1.3.0: version "1.3.0" - resolved "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz#7bd5bf8c5c69ea9f02f6083f14ce33ef545c222e" + resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-1.3.0.tgz#7bd5bf8c5c69ea9f02f6083f14ce33ef545c222e" integrity sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg== dependencies: "@babel/runtime" "^7.12.5" @@ -11568,7 +12321,7 @@ react-helmet-async@1.3.0: react-helmet@^6.1.0: version "6.1.0" - resolved "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz#a750d5165cb13cf213e44747502652e794468726" + resolved "https://registry.yarnpkg.com/react-helmet/-/react-helmet-6.1.0.tgz#a750d5165cb13cf213e44747502652e794468726" integrity sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw== dependencies: object-assign "^4.1.1" @@ -11578,14 +12331,14 @@ react-helmet@^6.1.0: react-hotkeys-hook@^3.4.7: version "3.4.7" - resolved "https://registry.npmjs.org/react-hotkeys-hook/-/react-hotkeys-hook-3.4.7.tgz#e16a0a85f59feed9f48d12cfaf166d7df4c96b7a" + resolved "https://registry.yarnpkg.com/react-hotkeys-hook/-/react-hotkeys-hook-3.4.7.tgz#e16a0a85f59feed9f48d12cfaf166d7df4c96b7a" integrity sha512-+bbPmhPAl6ns9VkXkNNyxlmCAIyDAcWbB76O4I0ntr3uWCRuIQf/aRLartUahe9chVMPj+OEzzfk3CQSjclUEQ== dependencies: hotkeys-js "3.9.4" react-i18next@^11.15.1: version "11.18.6" - resolved "https://registry.npmjs.org/react-i18next/-/react-i18next-11.18.6.tgz#e159c2960c718c1314f1e8fcaa282d1c8b167887" + resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-11.18.6.tgz#e159c2960c718c1314f1e8fcaa282d1c8b167887" integrity sha512-yHb2F9BiT0lqoQDt8loZ5gWP331GwctHz9tYQ8A2EIEUu+CcEdjBLQWli1USG3RdWQt3W+jqQLg/d4rrQR96LA== dependencies: "@babel/runtime" "^7.14.5" @@ -11593,14 +12346,14 @@ react-i18next@^11.15.1: react-iframe@~1.8.5: version "1.8.5" - resolved "https://registry.npmjs.org/react-iframe/-/react-iframe-1.8.5.tgz#33dc091147c3f2371d0826797f1b5767ff28a56f" + resolved "https://registry.yarnpkg.com/react-iframe/-/react-iframe-1.8.5.tgz#33dc091147c3f2371d0826797f1b5767ff28a56f" integrity sha512-F4cQJGs3ydaG6fJWfuz9yLwOU0Trzl6kttXuUG+vYwosH8enOOFxZWEDQCSbNVO8ayjfYZeqLxEvdvcsSy4GvA== dependencies: object-assign "^4.1.1" react-image-lightbox@^5.1.4: version "5.1.4" - resolved "https://registry.npmjs.org/react-image-lightbox/-/react-image-lightbox-5.1.4.tgz#5b847dcb79e9efdf9d7cd5621a92e0f156d2cf30" + resolved "https://registry.yarnpkg.com/react-image-lightbox/-/react-image-lightbox-5.1.4.tgz#5b847dcb79e9efdf9d7cd5621a92e0f156d2cf30" integrity sha512-kTiAODz091bgT7SlWNHab0LSMZAPJtlNWDGKv7pLlLY1krmf7FuG1zxE0wyPpeA8gPdwfr3cu6sPwZRqWsc3Eg== dependencies: prop-types "^15.7.2" @@ -11612,55 +12365,55 @@ react-intersection-observer@9.8.1: integrity sha512-QzOFdROX8D8MH3wE3OVKH0f3mLjKTtEN1VX/rkNuECCff+aKky0pIjulDhr3Ewqj5el/L+MhBkM3ef0Tbt+qUQ== react-intl@^6.4.4: - version "6.5.5" - resolved "https://registry.npmjs.org/react-intl/-/react-intl-6.5.5.tgz#d2de7bfd79718a7e3d8031e2599e94e0c8638377" - integrity sha512-cI5UKvBh4tc1zxLIziHBYGMX3dhYWDEFlvUDVN6NfT2i96zTXz/zH2AmM8+2waqgOhwkFUzd+7kK1G9q7fiC2g== - dependencies: - "@formatjs/ecma402-abstract" "1.18.0" - "@formatjs/icu-messageformat-parser" "2.7.3" - "@formatjs/intl" "2.9.9" - "@formatjs/intl-displaynames" "6.6.4" - "@formatjs/intl-listformat" "7.5.3" - "@types/hoist-non-react-statics" "^3.3.1" + version "6.8.9" + resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-6.8.9.tgz#ef36b2a19a0eb97afbeaeab9679273fcbf2ea261" + integrity sha512-TUfj5E7lyUDvz/GtovC9OMh441kBr08rtIbgh3p0R8iF3hVY+V2W9Am7rb8BpJ/29BH1utJOqOOhmvEVh3GfZg== + dependencies: + "@formatjs/ecma402-abstract" "2.2.4" + "@formatjs/icu-messageformat-parser" "2.9.4" + "@formatjs/intl" "2.10.15" + "@formatjs/intl-displaynames" "6.8.5" + "@formatjs/intl-listformat" "7.7.5" + "@types/hoist-non-react-statics" "3" "@types/react" "16 || 17 || 18" - hoist-non-react-statics "^3.3.2" - intl-messageformat "10.5.8" - tslib "^2.4.0" + hoist-non-react-statics "3" + intl-messageformat "10.7.7" + tslib "2" -react-is@^16.12.0, react-is@^16.13.1, react-is@^16.7.0: +react-is@^16.12.0, react-is@^16.13.1, react-is@^16.7.0, react-is@^16.8.4: version "16.13.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== react-is@^17.0.2: version "17.0.2" - resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== react-is@^18.2.0: - version "18.2.0" - resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== react-js-cron@^3.1.0: version "3.2.0" - resolved "https://registry.npmjs.org/react-js-cron/-/react-js-cron-3.2.0.tgz#f3f3b0312077fa03594b8c769174478a0b4763e5" + resolved "https://registry.yarnpkg.com/react-js-cron/-/react-js-cron-3.2.0.tgz#f3f3b0312077fa03594b8c769174478a0b4763e5" integrity sha512-DAluNX6ZpfsSDAIAfJKNyWIckTWTcQ/7IK91J4jaS4o4iihRJo/8gd7kf6ACDTE2RKt0PiSpOf1MBrrSdmdyUQ== react-lifecycles-compat@^3.0.0: version "3.0.4" - resolved "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== react-merge-refs@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/react-merge-refs/-/react-merge-refs-1.1.0.tgz#73d88b892c6c68cbb7a66e0800faa374f4c38b06" + resolved "https://registry.yarnpkg.com/react-merge-refs/-/react-merge-refs-1.1.0.tgz#73d88b892c6c68cbb7a66e0800faa374f4c38b06" integrity sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ== react-modal@^3.11.1: - version "3.16.1" - resolved "https://registry.npmjs.org/react-modal/-/react-modal-3.16.1.tgz#34018528fc206561b1a5467fc3beeaddafb39b2b" - integrity sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg== + version "3.16.3" + resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-3.16.3.tgz#c412d41915782e3c261253435d01468e2439b11b" + integrity sha512-yCYRJB5YkeQDQlTt17WGAgFJ7jr2QYcWa1SHqZ3PluDmnKJ/7+tVU+E6uKyZ0nODaeEj+xCpK4LcSnKXLMC0Nw== dependencies: exenv "^1.2.0" prop-types "^15.7.2" @@ -11669,7 +12422,7 @@ react-modal@^3.11.1: react-quill@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/react-quill/-/react-quill-2.0.0.tgz#67a0100f58f96a246af240c9fa6841b363b3e017" + resolved "https://registry.yarnpkg.com/react-quill/-/react-quill-2.0.0.tgz#67a0100f58f96a246af240c9fa6841b363b3e017" integrity sha512-4qQtv1FtCfLgoD3PXAur5RyxuUbPXQGOHgTlFie3jtxp43mXDtzCKaOgQ3mLyZfi1PUlyjycfivKelFhy13QUg== dependencies: "@types/quill" "^1.3.10" @@ -11678,7 +12431,7 @@ react-quill@^2.0.0: react-redux@^7.2.0: version "7.2.9" - resolved "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz#09488fbb9416a4efe3735b7235055442b042481d" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.9.tgz#09488fbb9416a4efe3735b7235055442b042481d" integrity sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ== dependencies: "@babel/runtime" "^7.15.4" @@ -11688,80 +12441,90 @@ react-redux@^7.2.0: prop-types "^15.7.2" react-is "^17.0.2" -react-refresh@0.14.0, react-refresh@^0.14.0: +react-refresh@0.14.0: version "0.14.0" - resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== +react-refresh@^0.14.0: + version "0.14.2" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" + integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== + react-router-dom@6.3.0: version "6.3.0" - resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.3.0.tgz#a0216da813454e521905b5fa55e0e5176123f43d" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.3.0.tgz#a0216da813454e521905b5fa55e0e5176123f43d" integrity sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw== dependencies: history "^5.2.0" react-router "6.3.0" react-router-dom@^6.11.2: - version "6.19.0" - resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.19.0.tgz#ee807e36ae7dd954db7a3f770e38b7cc026c66a8" - integrity sha512-N6dWlcgL2w0U5HZUUqU2wlmOrSb3ighJmtQ438SWbhB1yuLTXQ8yyTBMK3BSvVjp7gBtKurT554nCtMOgxCZmQ== - dependencies: - "@remix-run/router" "1.12.0" - react-router "6.19.0" - -react-router@6.19.0: - version "6.19.0" - resolved "https://registry.npmjs.org/react-router/-/react-router-6.19.0.tgz#6d5062fa33495859daca98d86292ab03b037a9ca" - integrity sha512-0W63PKCZ7+OuQd7Tm+RbkI8kCLmn4GPjDbX61tWljPxWgqTKlEpeQUwPkT1DRjYhF8KSihK0hQpmhU4uxVMcdw== + version "6.30.1" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.30.1.tgz#da2580c272ddb61325e435478566be9563a4a237" + integrity sha512-llKsgOkZdbPU1Eg3zK8lCn+sjD9wMRZZPuzmdWWX5SUs8OFkN5HnFVC0u5KMeMaC9aoancFI/KoLuKPqN+hxHw== dependencies: - "@remix-run/router" "1.12.0" + "@remix-run/router" "1.23.0" + react-router "6.30.1" react-router@6.3.0: version "6.3.0" - resolved "https://registry.npmjs.org/react-router/-/react-router-6.3.0.tgz#3970cc64b4cb4eae0c1ea5203a80334fdd175557" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.3.0.tgz#3970cc64b4cb4eae0c1ea5203a80334fdd175557" integrity sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ== dependencies: history "^5.2.0" +react-router@6.30.1: + version "6.30.1" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.30.1.tgz#ecb3b883c9ba6dbf5d319ddbc996747f4ab9f4c3" + integrity sha512-X1m21aEmxGXqENEPG3T6u0Th7g0aS4ZmoNynhbs+Cn+q+QGTLt+d5IQ2bHAXKzKcxGJjxACpVbnYQSCRcfxHlQ== + dependencies: + "@remix-run/router" "1.23.0" + react-side-effect@^2.1.0: version "2.1.2" - resolved "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.2.tgz#dc6345b9e8f9906dc2eeb68700b615e0b4fe752a" + resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-2.1.2.tgz#dc6345b9e8f9906dc2eeb68700b615e0b4fe752a" integrity sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw== react-sticky-box@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/react-sticky-box/-/react-sticky-box-1.0.2.tgz#7e72a0f237bdf8270cec9254337f49519a411174" + resolved "https://registry.yarnpkg.com/react-sticky-box/-/react-sticky-box-1.0.2.tgz#7e72a0f237bdf8270cec9254337f49519a411174" integrity sha512-Kyvtppdtv1KqJyNU4DtrSMI0unyQRgtraZvVQ0GAazVbYiTsIVpyhpr+5R0Aavzu4uJNSe1awj2rk/qI7i6Zfw== dependencies: resize-observer-polyfill "^1.5.1" react-to-print@^2.14.7: - version "2.14.15" - resolved "https://registry.npmjs.org/react-to-print/-/react-to-print-2.14.15.tgz#edb4ce8a92205cf37fd8c3d57de829034aa5c911" - integrity sha512-SKnwOzU2cJ8eaAkoJO7+gNhvfEDmm+Y34IdcHsjtHioUevUPhprqbVtvNJlZ2JkGJ8ExK2QNWM9pXECTDR5D8w== + version "2.15.1" + resolved "https://registry.yarnpkg.com/react-to-print/-/react-to-print-2.15.1.tgz#c9a6732cadf1118fc90d886b54a9388c419561b9" + integrity sha512-1foogIFbCpzAVxydkhBiDfMiFYhIMphiagDOfcG4X/EcQ+fBPqJ0rby9Wv/emzY1YLkIQy/rEgOrWQT+rBKhjw== -react@18.1.0: - version "18.1.0" - resolved "https://registry.npmjs.org/react/-/react-18.1.0.tgz#6f8620382decb17fdc5cc223a115e2adbf104890" - integrity sha512-4oL8ivCz5ZEPyclFQXaNksK3adutVS8l2xzZU0cqEFrE9Sb7fC0EFK5uEk74wIreL1DERyjvsU915j1pcT2uEQ== +react@18.3.1: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== dependencies: loose-envify "^1.1.0" +react@^19.1.1: + version "19.1.1" + resolved "https://registry.yarnpkg.com/react/-/react-19.1.1.tgz#06d9149ec5e083a67f9a1e39ce97b06a03b644af" + integrity sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ== + reactflow@^11.8.1: - version "11.10.1" - resolved "https://registry.npmjs.org/reactflow/-/reactflow-11.10.1.tgz#8f8c75a7c7d07f44eeb8c0dcb3a757c5f4e95b03" - integrity sha512-Q616fElAc5/N37tMwjuRkkgm/VgmnLLTNNCj61z5mvJxae+/VXZQMfot1K6a5LLz9G3SVKqU97PMb9Ga1PRXew== + version "11.11.4" + resolved "https://registry.yarnpkg.com/reactflow/-/reactflow-11.11.4.tgz#e3593e313420542caed81aecbd73fb9bc6576653" + integrity sha512-70FOtJkUWH3BAOsN+LU9lCrKoKbtOPnz2uq0CV2PLdNSwxTXOhCbsZr50GmZ+Rtw3jx8Uv7/vBFtCGixLfd4Og== dependencies: - "@reactflow/background" "11.3.6" - "@reactflow/controls" "11.2.6" - "@reactflow/core" "11.10.1" - "@reactflow/minimap" "11.7.6" - "@reactflow/node-resizer" "2.2.6" - "@reactflow/node-toolbar" "1.3.6" + "@reactflow/background" "11.3.14" + "@reactflow/controls" "11.2.14" + "@reactflow/core" "11.11.4" + "@reactflow/minimap" "11.7.14" + "@reactflow/node-resizer" "2.2.14" + "@reactflow/node-toolbar" "1.3.14" read-pkg-up@^7.0.1: version "7.0.1" - resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== dependencies: find-up "^4.1.0" @@ -11770,7 +12533,7 @@ read-pkg-up@^7.0.1: read-pkg@^5.2.0: version "5.2.0" - resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== dependencies: "@types/normalize-package-data" "^2.4.0" @@ -11778,9 +12541,9 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@^2.3.8, readable-stream@~2.3.6: version "2.3.8" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" @@ -11791,9 +12554,9 @@ read-pkg@^5.2.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0, readable-stream@^3.6.2: +readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: version "3.6.2" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" @@ -11802,7 +12565,7 @@ readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.6, readable-stre readable-stream@~1.0.17, readable-stream@~1.0.27-1: version "1.0.34" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== dependencies: core-util-is "~1.0.0" @@ -11810,21 +12573,26 @@ readable-stream@~1.0.17, readable-stream@~1.0.27-1: isarray "0.0.1" string_decoder "~0.10.x" +readdirp@^4.0.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" + integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== + readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" real-require@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/real-require/-/real-require-0.1.0.tgz#736ac214caa20632847b7ca8c1056a0767df9381" + resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.1.0.tgz#736ac214caa20632847b7ca8c1056a0767df9381" integrity sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg== redent@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== dependencies: indent-string "^4.0.0" @@ -11832,62 +12600,67 @@ redent@^3.0.0: redux@^4.0.0, redux@^4.0.4: version "4.2.1" - resolved "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz#c08f4306826c49b5e9dc901dee0452ea8fce6197" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.1.tgz#c08f4306826c49b5e9dc901dee0452ea8fce6197" integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== dependencies: "@babel/runtime" "^7.9.2" -reflect.getprototypeof@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz#aaccbf41aca3821b87bb71d9dcbc7ad0ba50a3f3" - integrity sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw== +reflect.getprototypeof@^1.0.10, reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9" + integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - globalthis "^1.0.3" - which-builtin-type "^1.1.3" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.9" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.7" + get-proto "^1.0.1" + which-builtin-type "^1.2.1" regenerate-unicode-properties@10.1.1: version "10.1.1" - resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== dependencies: regenerate "^1.4.2" regenerate@^1.4.2: version "1.4.2" - resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== regenerator-runtime@0.13.11: version "0.13.11" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== regenerator-runtime@^0.11.0: version "0.11.1" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== regenerator-runtime@^0.14.0: - version "0.14.0" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" - integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== -regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.1: - version "1.5.1" - resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" - integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== +regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.3, regexp.prototype.flags@^1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19" + integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - set-function-name "^2.0.0" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-errors "^1.3.0" + get-proto "^1.0.1" + gopd "^1.2.0" + set-function-name "^2.0.2" registry-auth-token@^3.0.1: version "3.4.0" - resolved "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== dependencies: rc "^1.1.6" @@ -11895,14 +12668,14 @@ registry-auth-token@^3.0.1: registry-url@^3.0.3: version "3.1.0" - resolved "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" integrity sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA== dependencies: rc "^1.0.1" rehype-autolink-headings@^6.1.1: version "6.1.1" - resolved "https://registry.npmjs.org/rehype-autolink-headings/-/rehype-autolink-headings-6.1.1.tgz#0cb874a56f3de6ead1c2268d7f0fc5006f244db5" + resolved "https://registry.yarnpkg.com/rehype-autolink-headings/-/rehype-autolink-headings-6.1.1.tgz#0cb874a56f3de6ead1c2268d7f0fc5006f244db5" integrity sha512-NMYzZIsHM3sA14nC5rAFuUPIOfg+DFmf9EY1YMhaNlB7+3kK/ZlE6kqPfuxr1tsJ1XWkTrMtMoyHosU70d35mA== dependencies: "@types/hast" "^2.0.0" @@ -11915,7 +12688,7 @@ rehype-autolink-headings@^6.1.1: rehype-remove-comments@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/rehype-remove-comments/-/rehype-remove-comments-5.0.0.tgz#88b4faba10f217d4ab68b36eb958b386630d5672" + resolved "https://registry.yarnpkg.com/rehype-remove-comments/-/rehype-remove-comments-5.0.0.tgz#88b4faba10f217d4ab68b36eb958b386630d5672" integrity sha512-sfiVT+u1in19sxo9vv/SDQVbHE2mADScNrpeVsUxBFl14zOMZnfPb6l4hR+lXqe10G13UFVqv5pt8zDbCR4JYQ== dependencies: "@types/hast" "^2.0.0" @@ -11925,7 +12698,7 @@ rehype-remove-comments@^5.0.0: rehype-stringify@^9.0.3: version "9.0.4" - resolved "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-9.0.4.tgz#31dbb9de6f5034c6964760a1b1083218059c4343" + resolved "https://registry.yarnpkg.com/rehype-stringify/-/rehype-stringify-9.0.4.tgz#31dbb9de6f5034c6964760a1b1083218059c4343" integrity sha512-Uk5xu1YKdqobe5XpSskwPvo1XeHUUucWEQSl8hTrXt5selvca1e8K1EZ37E6YoZ4BT8BCqCdVfQW7OfHfthtVQ== dependencies: "@types/hast" "^2.0.0" @@ -11934,12 +12707,12 @@ rehype-stringify@^9.0.3: relateurl@^0.2.7: version "0.2.7" - resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== remark-directive@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/remark-directive/-/remark-directive-2.0.1.tgz#1c32d9df8d839a75ba3478112d21fe883635b48e" + resolved "https://registry.yarnpkg.com/remark-directive/-/remark-directive-2.0.1.tgz#1c32d9df8d839a75ba3478112d21fe883635b48e" integrity sha512-oosbsUAkU/qmUE78anLaJePnPis4ihsE7Agp0T/oqTzvTea8pOiaYEtfInU/+xMOVTS9PN5AhGOiaIVe4GD8gw== dependencies: "@types/mdast" "^3.0.0" @@ -11949,7 +12722,7 @@ remark-directive@^2.0.1: remark-frontmatter@^4.0.1: version "4.0.1" - resolved "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-4.0.1.tgz#84560f7ccef114ef076d3d3735be6d69f8922309" + resolved "https://registry.yarnpkg.com/remark-frontmatter/-/remark-frontmatter-4.0.1.tgz#84560f7ccef114ef076d3d3735be6d69f8922309" integrity sha512-38fJrB0KnmD3E33a5jZC/5+gGAC2WKNiPw1/fdXJvijBlhA7RCsvJklrYJakS0HedninvaCYW8lQGf9C918GfA== dependencies: "@types/mdast" "^3.0.0" @@ -11959,7 +12732,7 @@ remark-frontmatter@^4.0.1: remark-gfm@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz#0b180f095e3036545e9dddac0e8df3fa5cfee54f" + resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-3.0.1.tgz#0b180f095e3036545e9dddac0e8df3fa5cfee54f" integrity sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig== dependencies: "@types/mdast" "^3.0.0" @@ -11969,7 +12742,7 @@ remark-gfm@^3.0.1: remark-parse@^10.0.2: version "10.0.2" - resolved "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz#ca241fde8751c2158933f031a4e3efbaeb8bc262" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.2.tgz#ca241fde8751c2158933f031a4e3efbaeb8bc262" integrity sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw== dependencies: "@types/mdast" "^3.0.0" @@ -11978,7 +12751,7 @@ remark-parse@^10.0.2: remark-rehype@^10.1.0: version "10.1.0" - resolved "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz#32dc99d2034c27ecaf2e0150d22a6dcccd9a6279" + resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-10.1.0.tgz#32dc99d2034c27ecaf2e0150d22a6dcccd9a6279" integrity sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw== dependencies: "@types/hast" "^2.0.0" @@ -11988,26 +12761,26 @@ remark-rehype@^10.1.0: remote-origin-url@^0.4.0: version "0.4.0" - resolved "https://registry.npmjs.org/remote-origin-url/-/remote-origin-url-0.4.0.tgz#4d3e2902f34e2d37d1c263d87710b77eb4086a30" + resolved "https://registry.yarnpkg.com/remote-origin-url/-/remote-origin-url-0.4.0.tgz#4d3e2902f34e2d37d1c263d87710b77eb4086a30" integrity sha512-HYhdsT2pNd0LP4Osb0vtQ1iassxIc3Yk1oze7j8dMJFciMkW8e0rdg9E/mOunqtSVHSzvMfwLDIYzPnEDmpk6Q== dependencies: parse-git-config "^0.2.0" remote-origin-url@^0.5.1: version "0.5.3" - resolved "https://registry.npmjs.org/remote-origin-url/-/remote-origin-url-0.5.3.tgz#b9fc6ced2c826690d0b07218b2b8c17fcec88e87" + resolved "https://registry.yarnpkg.com/remote-origin-url/-/remote-origin-url-0.5.3.tgz#b9fc6ced2c826690d0b07218b2b8c17fcec88e87" integrity sha512-crQ7Xk1m/F2IiwBx5oTqk/c0hjoumrEz+a36+ZoVupskQRE/q7pAwHKsTNeiZ31sbSTELvVlVv4h1W0Xo5szKg== dependencies: parse-git-config "^1.1.1" rename-keys@^1.1.2: version "1.2.0" - resolved "https://registry.npmjs.org/rename-keys/-/rename-keys-1.2.0.tgz#be602fb0b750476b513ebe85ba4465d03254f0a3" + resolved "https://registry.yarnpkg.com/rename-keys/-/rename-keys-1.2.0.tgz#be602fb0b750476b513ebe85ba4465d03254f0a3" integrity sha512-U7XpAktpbSgHTRSNRrjKSrjYkZKuhUukfoBlXWXUExCAqhzh1TU3BDRAfJmarcl5voKS+pbKU9MvyLWKZ4UEEg== renderkid@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== dependencies: css-select "^4.1.3" @@ -12018,27 +12791,27 @@ renderkid@^3.0.0: repeat-string@^1.5.2: version "1.6.1" - resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-from-string@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== resize-observer-polyfill@^1.5.1: version "1.5.1" - resolved "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== resolve-dir@^0.1.0: version "0.1.1" - resolved "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" integrity sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA== dependencies: expand-tilde "^1.2.2" @@ -12046,38 +12819,38 @@ resolve-dir@^0.1.0: resolve-from@5.0.0, resolve-from@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-global@1.0.0, resolve-global@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz#a2a79df4af2ca3f49bf77ef9ddacd322dad19255" + resolved "https://registry.yarnpkg.com/resolve-global/-/resolve-global-1.0.0.tgz#a2a79df4af2ca3f49bf77ef9ddacd322dad19255" integrity sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw== dependencies: global-dirs "^0.1.1" resolve-pkg-maps@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== -resolve@^1.10.0, resolve@^1.19.0, resolve@~1.22.6: - version "1.22.8" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== +resolve@^1.10.0, resolve@^1.19.0, resolve@^1.22.8, resolve@~1.22.6: + version "1.22.10" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== dependencies: - is-core-module "^2.13.0" + is-core-module "^2.16.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" resolve@^2.0.0-next.4: version "2.0.0-next.5" - resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== dependencies: is-core-module "^2.13.0" @@ -12086,65 +12859,80 @@ resolve@^2.0.0-next.4: restore-cursor@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" integrity sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q== dependencies: onetime "^2.0.0" signal-exit "^3.0.2" -restore-cursor@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz#519560a4318975096def6e609d44100edaa4ccb9" - integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== +restore-cursor@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-5.1.0.tgz#0766d95699efacb14150993f55baf0953ea1ebe7" + integrity sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA== dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" + onetime "^7.0.0" + signal-exit "^4.1.0" retry@^0.10.0: version "0.10.1" - resolved "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" integrity sha512-ZXUSQYTHdl3uS7IuCehYfMzKyIDBNoAuUblvy5oGO5UJSUTmStUUVPXbA9Qxd173Bgre53yCQczQuHgRWAdvJQ== reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== -rfdc@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" - integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== +rfdc@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" + integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== right-align@^0.1.1: version "0.1.3" - resolved "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" integrity sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg== dependencies: align-text "^0.1.1" +rimraf@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.1.tgz#0881323ab94ad45fec7c0221f27ea1a142f3f0d0" + integrity sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg== + dependencies: + glob "^10.2.5" + rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: version "2.7.1" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" +ripemd160@=2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7" + integrity sha512-J7f4wutN8mdbV08MJnXibYpCOPHR+yzy+iQ/AsjMv2j8cLavQ8VGagDFUwwTAdF8FmRKVeNpbTTEwNHCW1g94w== + dependencies: + hash-base "^2.0.0" + inherits "^2.0.1" + ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" - resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== dependencies: hash-base "^3.0.0" inherits "^2.0.1" -robust-predicates@^3.0.0: +robust-predicates@^3.0.2: version "3.0.2" - resolved "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz#d5b28528c4824d20fc48df1928d41d9efa1ad771" + resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.2.tgz#d5b28528c4824d20fc48df1928d41d9efa1ad771" integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg== rollup-plugin-visualizer@5.9.0: version "5.9.0" - resolved "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.9.0.tgz#013ac54fb6a9d7c9019e7eb77eced673399e5a0b" + resolved "https://registry.yarnpkg.com/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.9.0.tgz#013ac54fb6a9d7c9019e7eb77eced673399e5a0b" integrity sha512-bbDOv47+Bw4C/cgs0czZqfm8L82xOZssk4ayZjG40y9zbXclNk7YikrZTDao6p7+HDiGxrN0b65SgZiVm9k1Cg== dependencies: open "^8.4.0" @@ -12154,107 +12942,116 @@ rollup-plugin-visualizer@5.9.0: rollup@^0.25.8: version "0.25.8" - resolved "https://registry.npmjs.org/rollup/-/rollup-0.25.8.tgz#bf6ce83b87510d163446eeaa577ed6a6fc5835e0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.25.8.tgz#bf6ce83b87510d163446eeaa577ed6a6fc5835e0" integrity sha512-a2S4Bh3bgrdO4BhKr2E4nZkjTvrJ2m2bWjMTzVYtoqSCn0HnuxosXnaJUHrMEziOWr3CzL9GjilQQKcyCQpJoA== dependencies: chalk "^1.1.1" minimist "^1.2.0" source-map-support "^0.3.2" -rollup@^3.20.2: - version "3.29.4" - resolved "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz#4d70c0f9834146df8705bfb69a9a19c9e1109981" - integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw== +rollup@^3.27.1: + version "3.29.5" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.5.tgz#8a2e477a758b520fb78daf04bca4c522c1da8a54" + integrity sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w== optionalDependencies: fsevents "~2.3.2" run-applescript@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz#e11e1c932e055d5c6b40d98374e0268d9b11899c" + resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-5.0.0.tgz#e11e1c932e055d5c6b40d98374e0268d9b11899c" integrity sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg== dependencies: execa "^5.0.0" run-async@^2.2.0: version "2.4.1" - resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" integrity sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg== dependencies: aproba "^1.1.1" rw@1, rw@^1.3.2: version "1.3.3" - resolved "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" + resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== rxjs@^6.4.0: version "6.6.7" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== dependencies: tslib "^1.9.0" sade@^1.7.3: version "1.8.1" - resolved "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" + resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== dependencies: mri "^1.1.0" -safe-array-concat@^1.0.0, safe-array-concat@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" - integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== +safe-array-concat@^1.1.2, safe-array-concat@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3" + integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - has-symbols "^1.0.3" + call-bind "^1.0.8" + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + has-symbols "^1.1.0" isarray "^2.0.5" -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-regex-test@^1.0.0: +safe-push-apply@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5" + integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - is-regex "^1.1.4" + es-errors "^1.3.0" + isarray "^2.0.5" + +safe-regex-test@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" + integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-regex "^1.2.1" safe-stable-stringify@^2.1.0, safe-stable-stringify@^2.4.3: - version "2.4.3" - resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" - integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== + version "2.5.0" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" + integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sanitize-html@2.10.0: version "2.10.0" - resolved "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.10.0.tgz#74d28848dfcf72c39693139131895c78900ab452" + resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-2.10.0.tgz#74d28848dfcf72c39693139131895c78900ab452" integrity sha512-JqdovUd81dG4k87vZt6uA6YhDfWkUGruUu/aPmXLxXi45gZExnt9Bnw/qeQU8oGf82vPyaE0vO4aH0PbobB9JQ== dependencies: deepmerge "^4.2.2" @@ -12264,35 +13061,49 @@ sanitize-html@2.10.0: parse-srcset "^1.0.2" postcss "^8.3.11" +sass-loader@^16.0.5: + version "16.0.5" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-16.0.5.tgz#257bc90119ade066851cafe7f2c3f3504c7cda98" + integrity sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw== + dependencies: + neo-async "^2.6.2" + sass@^1.64.1: - version "1.69.5" - resolved "https://registry.npmjs.org/sass/-/sass-1.69.5.tgz#23e18d1c757a35f2e52cc81871060b9ad653dfde" - integrity sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ== + version "1.89.2" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.89.2.tgz#a771716aeae774e2b529f72c0ff2dfd46c9de10e" + integrity sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA== dependencies: - chokidar ">=3.0.0 <4.0.0" - immutable "^4.0.0" + chokidar "^4.0.0" + immutable "^5.0.2" source-map-js ">=0.6.2 <2.0.0" + optionalDependencies: + "@parcel/watcher" "^2.4.1" sax@^1.2.4: - version "1.3.0" - resolved "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" - integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== + version "1.4.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.1.tgz#44cc8988377f126304d3b3fc1010c733b929ef0f" + integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== sax@~1.2.4: version "1.2.4" - resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -scheduler@^0.22.0: - version "0.22.0" - resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.22.0.tgz#83a5d63594edf074add9a7198b1bae76c3db01b8" - integrity sha512-6QAm1BgQI88NPYymgGQLCZgvep4FyePDWFpXVK+zNSUgHwlqpJy8VEh8Et0KxTACS4VWwMousBElAZOH9nkkoQ== +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== dependencies: loose-envify "^1.1.0" +scheduler@^0.26.0: + version "0.26.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.26.0.tgz#4ce8a8c2a2095f13ea11bf9a445be50c555d6337" + integrity sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA== + schema-utils@^3.0.0, schema-utils@^3.1.1: version "3.3.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== dependencies: "@types/json-schema" "^7.0.8" @@ -12301,137 +13112,220 @@ schema-utils@^3.0.0, schema-utils@^3.1.1: screenfull@^5.0.0: version "5.2.0" - resolved "https://registry.npmjs.org/screenfull/-/screenfull-5.2.0.tgz#6533d524d30621fc1283b9692146f3f13a93d1ba" + resolved "https://registry.yarnpkg.com/screenfull/-/screenfull-5.2.0.tgz#6533d524d30621fc1283b9692146f3f13a93d1ba" integrity sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA== scroll-into-view-if-needed@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz#fa9524518c799b45a2ef6bbffb92bcad0296d01f" + resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz#fa9524518c799b45a2ef6bbffb92bcad0296d01f" integrity sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ== dependencies: compute-scroll-into-view "^3.0.2" seedrandom@^3.0.5: version "3.0.5" - resolved "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz#54edc85c95222525b0c7a6f6b3543d8e0b3aa0a7" + resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.5.tgz#54edc85c95222525b0c7a6f6b3543d8e0b3aa0a7" integrity sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg== selderee@^0.11.0: version "0.11.0" - resolved "https://registry.npmjs.org/selderee/-/selderee-0.11.0.tgz#6af0c7983e073ad3e35787ffe20cefd9daf0ec8a" + resolved "https://registry.yarnpkg.com/selderee/-/selderee-0.11.0.tgz#6af0c7983e073ad3e35787ffe20cefd9daf0ec8a" integrity sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA== dependencies: parseley "^0.12.0" select-hose@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== semver-diff@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" integrity sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw== dependencies: semver "^5.0.3" "semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.6.0: version "5.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@7.5.4, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: - version "7.5.4" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== +semver@7.6.0: + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== dependencies: lru-cache "^6.0.0" semver@^6.3.0, semver@^6.3.1: version "6.3.1" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -set-function-length@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" - integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== +semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.4, semver@^7.6.2: + version "7.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" + integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== + +send@0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" + integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serve-static@1.16.2: + version "1.16.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" + integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== + dependencies: + encodeurl "~2.0.0" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.19.0" + +set-function-length@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: - define-data-property "^1.1.1" - get-intrinsic "^1.2.1" + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" gopd "^1.0.1" - has-property-descriptors "^1.0.0" + has-property-descriptors "^1.0.2" -set-function-name@^2.0.0, set-function-name@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" - integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== +set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== dependencies: - define-data-property "^1.0.1" + define-data-property "^1.1.4" + es-errors "^1.3.0" functions-have-names "^1.2.3" - has-property-descriptors "^1.0.0" + has-property-descriptors "^1.0.2" + +set-proto@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e" + integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== + dependencies: + dunder-proto "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" setimmediate@^1.0.4: version "1.0.5" - resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8: + version "2.4.12" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.12.tgz#eb8b568bf383dfd1867a32c3f2b74eb52bdbf23f" + integrity sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w== dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" + inherits "^2.0.4" + safe-buffer "^5.2.1" + to-buffer "^1.2.0" shallowequal@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== shebang-command@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== dependencies: shebang-regex "^1.0.0" shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shortid@^2.2.8: - version "2.2.16" - resolved "https://registry.npmjs.org/shortid/-/shortid-2.2.16.tgz#b742b8f0cb96406fd391c76bfc18a67a57fe5608" - integrity sha512-Ugt+GIZqvGXCIItnsL+lvFJOiN7RYqlGy7QE41O3YC1xbNSeDGIRO7xg2JJXIAj1cAGnOeC1r7/T9pgrtQbv4g== + version "2.2.17" + resolved "https://registry.yarnpkg.com/shortid/-/shortid-2.2.17.tgz#ea87297a36b7edd10a57818fbac5be798e0994bb" + integrity sha512-GpbM3gLF1UUXZvQw6MCyulHkWbRseNO4cyBEZresZRorwl1+SLu1ZdqgVtuwqz8mB6RpwPkm541mYSqrKyJSaA== dependencies: - nanoid "^2.1.0" + nanoid "^3.3.8" -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.0.6, side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== signal-exit@^4.0.1, signal-exit@^4.1.0: @@ -12441,15 +13335,15 @@ signal-exit@^4.0.1, signal-exit@^4.1.0: simple-swizzle@^0.2.2: version "0.2.2" - resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== dependencies: is-arrayish "^0.3.1" sitemap@^7.1.1: - version "7.1.1" - resolved "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz#eeed9ad6d95499161a3eadc60f8c6dce4bea2bef" - integrity sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg== + version "7.1.2" + resolved "https://registry.yarnpkg.com/sitemap/-/sitemap-7.1.2.tgz#6ce1deb43f6f177c68bc59cf93632f54e3ae6b72" + integrity sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw== dependencies: "@types/node" "^17.0.5" "@types/sax" "^1.2.1" @@ -12458,35 +13352,43 @@ sitemap@^7.1.1: size-sensor@^1.0.1: version "1.0.2" - resolved "https://registry.npmjs.org/size-sensor/-/size-sensor-1.0.2.tgz#b8f8da029683cf2b4e22f12bf8b8f0a1145e8471" + resolved "https://registry.yarnpkg.com/size-sensor/-/size-sensor-1.0.2.tgz#b8f8da029683cf2b4e22f12bf8b8f0a1145e8471" integrity sha512-2NCmWxY7A9pYKGXNBfteo4hy14gWu47rg5692peVMst6lQLPKrVjhY+UTEsPI5ceFRJSl3gVgMYaUi/hKuaiKw== slash@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== slash@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== slice-ansi@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== dependencies: ansi-styles "^6.0.0" is-fullwidth-code-point "^4.0.0" +slice-ansi@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.0.tgz#cd6b4655e298a8d1bdeb04250a433094b347b9a9" + integrity sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg== + dependencies: + ansi-styles "^6.2.1" + is-fullwidth-code-point "^5.0.0" + smart-buffer@^1.0.13: version "1.1.15" - resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz#7f114b5b65fab3e2a35aa775bb12f0d1c649bf16" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-1.1.15.tgz#7f114b5b65fab3e2a35aa775bb12f0d1c649bf16" integrity sha512-1+8bxygjTsNfvQe0/0pNBesTOlSHtOeG6b6LYbvsZCCHDKYZ40zcQo6YTnZBWrBSLWOCbrHljLdEmGMYebu7aQ== socks-proxy-agent@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-3.0.1.tgz#2eae7cf8e2a82d34565761539a7f9718c5617659" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-3.0.1.tgz#2eae7cf8e2a82d34565761539a7f9718c5617659" integrity sha512-ZwEDymm204mTzvdqyUqOdovVr2YRd2NYskrYrF2LXyZ9qDiMAoFESGK8CRphiO7rtbo2Y757k2Nia3x2hGtalA== dependencies: agent-base "^4.1.0" @@ -12494,7 +13396,7 @@ socks-proxy-agent@^3.0.1: socks@^1.1.10: version "1.1.10" - resolved "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz#5b8b7fc7c8f341c53ed056e929b7bf4de8ba7b5a" + resolved "https://registry.yarnpkg.com/socks/-/socks-1.1.10.tgz#5b8b7fc7c8f341c53ed056e929b7bf4de8ba7b5a" integrity sha512-ArX4vGPULWjKDKgUnW8YzfI2uXW7kzgkJuB0GnFBA/PfT3exrrOk+7Wk2oeb894Qf20u1PWv9LEgrO0Z82qAzA== dependencies: ip "^1.1.4" @@ -12502,19 +13404,19 @@ socks@^1.1.10: sonic-boom@^2.2.1: version "2.8.0" - resolved "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.8.0.tgz#c1def62a77425090e6ad7516aad8eb402e047611" + resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-2.8.0.tgz#c1def62a77425090e6ad7516aad8eb402e047611" integrity sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg== dependencies: atomic-sleep "^1.0.0" sort-object-keys@^1.1.3: version "1.1.3" - resolved "https://registry.npmjs.org/sort-object-keys/-/sort-object-keys-1.1.3.tgz#bff833fe85cab147b34742e45863453c1e190b45" + resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.3.tgz#bff833fe85cab147b34742e45863453c1e190b45" integrity sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg== sort-package-json@2.4.1: version "2.4.1" - resolved "https://registry.npmjs.org/sort-package-json/-/sort-package-json-2.4.1.tgz#4ea68a0b9ef34c2bc519e86d0d07de56622a7600" + resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-2.4.1.tgz#4ea68a0b9ef34c2bc519e86d0d07de56622a7600" integrity sha512-Nd3rgLBJcZ4iw7tpuOhwBupG6SvUDU0Fy1cZGAMorA2JmDUb+29Dg5phJK9gapa2Ak9d15w/RuMl/viwX+nKwQ== dependencies: detect-indent "^7.0.1" @@ -12524,14 +13426,14 @@ sort-package-json@2.4.1: is-plain-obj "^4.1.0" sort-object-keys "^1.1.3" -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== source-map-resolve@^0.6.0: version "0.6.0" - resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2" integrity sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w== dependencies: atob "^2.1.2" @@ -12539,14 +13441,14 @@ source-map-resolve@^0.6.0: source-map-support@^0.3.2: version "0.3.3" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.3.3.tgz#34900977d5ba3f07c7757ee72e73bb1a9b53754f" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.3.3.tgz#34900977d5ba3f07c7757ee72e73bb1a9b53754f" integrity sha512-9O4+y9n64RewmFoKUZ/5Tx9IHIcXM6Q+RTSw6ehnqybUz4a7iwR3Eaw80uLtqqQ5D0C+5H03D4KKGo9PdP33Gg== dependencies: source-map "0.1.32" source-map-support@^0.5.21, source-map-support@~0.5.20: version "0.5.21" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" @@ -12554,60 +13456,60 @@ source-map-support@^0.5.21, source-map-support@~0.5.20: source-map@0.1.32: version "0.1.32" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz#c8b6c167797ba4740a8ea33252162ff08591b266" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.32.tgz#c8b6c167797ba4740a8ea33252162ff08591b266" integrity sha512-htQyLrrRLkQ87Zfrir4/yN+vAUd6DNjVayEjTSHXu29AYQJw57I4/xEL/M6p6E/woPNJwvZt6rVlzc7gFEJccQ== dependencies: amdefine ">=0.0.4" -source-map@^0.5.7, source-map@~0.5.1: +source-map@^0.5.0, source-map@^0.5.7, source-map@~0.5.1: version "0.5.7" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@^0.7.0, source-map@^0.7.3, source-map@^0.7.4: - version "0.7.4" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" - integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + version "0.7.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.6.tgz#a3658ab87e5b6429c8a1f3ba0083d4c61ca3ef02" + integrity sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ== space-separated-tokens@^2.0.0: version "2.0.2" - resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== spdx-correct@^3.0.0: version "3.2.0" - resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + version "2.5.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== spdx-expression-parse@^3.0.0: version "3.0.1" - resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.16" - resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz#a14f64e0954f6e25cc6587bd4f392522db0d998f" - integrity sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw== + version "3.0.21" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz#6d6e980c9df2b6fc905343a3b2d702a6239536c3" + integrity sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg== spdy-transport@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== dependencies: debug "^4.1.0" @@ -12619,7 +13521,7 @@ spdy-transport@^3.0.0: spdy@^4.0.2: version "4.0.2" - resolved "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== dependencies: debug "^4.1.0" @@ -12630,60 +13532,66 @@ spdy@^4.0.2: split-on-first@^1.0.0: version "1.1.0" - resolved "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" + resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== split2@^3.0.0: version "3.2.2" - resolved "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" + resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== dependencies: readable-stream "^3.0.0" split2@^4.0.0: version "4.2.0" - resolved "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== ssri@^4.1.6: version "4.1.6" - resolved "https://registry.npmjs.org/ssri/-/ssri-4.1.6.tgz#0cb49b6ac84457e7bdd466cb730c3cb623e9a25b" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-4.1.6.tgz#0cb49b6ac84457e7bdd466cb730c3cb623e9a25b" integrity sha512-WUbCdgSAMQjTFZRWvSPpauryvREEA+Krn19rx67UlJEJx/M192ZHxMmJXjZ4tkdFm+Sb0SXGlENeQVlA5wY7kA== dependencies: safe-buffer "^5.1.0" ssri@^5.0.0, ssri@^5.2.4: version "5.3.0" - resolved "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" integrity sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ== dependencies: safe-buffer "^5.1.1" stable@^0.1.8: version "0.1.8" - resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== stackframe@^1.3.4: version "1.3.4" - resolved "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== -stop-iteration-iterator@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" - integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +stop-iteration-iterator@^1.0.0, stop-iteration-iterator@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz#f481ff70a548f6124d0312c3aa14cbfa7aa542ad" + integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== dependencies: - internal-slot "^1.0.4" + es-errors "^1.3.0" + internal-slot "^1.1.0" stream-browserify@^2.0.1: version "2.0.2" - resolved "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== dependencies: inherits "~2.0.1" @@ -12691,7 +13599,7 @@ stream-browserify@^2.0.1: stream-each@^1.1.0: version "1.2.3" - resolved "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== dependencies: end-of-stream "^1.1.0" @@ -12699,7 +13607,7 @@ stream-each@^1.1.0: stream-http@^2.7.2: version "2.8.3" - resolved "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== dependencies: builtin-status-codes "^3.0.0" @@ -12708,29 +13616,29 @@ stream-http@^2.7.2: to-arraybuffer "^1.0.0" xtend "^4.0.0" -stream-shift@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" - integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== +stream-shift@^1.0.0, stream-shift@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.3.tgz#85b8fab4d71010fc3ba8772e8046cc49b8a3864b" + integrity sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ== streamsearch@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== strict-uri-encode@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== -string-argv@0.3.2: +string-argv@^0.3.2: version "0.3.2" - resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== string-convert@^0.2.0: version "0.2.1" - resolved "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz#6982cc3049fbb4cd85f8b24568b9d9bf39eeff97" + resolved "https://registry.yarnpkg.com/string-convert/-/string-convert-0.2.1.tgz#6982cc3049fbb4cd85f8b24568b9d9bf39eeff97" integrity sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A== "string-width-cjs@npm:string-width@^4.2.0": @@ -12744,7 +13652,7 @@ string-convert@^0.2.0: string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== dependencies: is-fullwidth-code-point "^2.0.0" @@ -12752,87 +13660,112 @@ string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^5.0.0, string-width@^5.0.1, string-width@^5.1.2: +string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: eastasianwidth "^0.2.0" emoji-regex "^9.2.2" strip-ansi "^7.0.1" +string-width@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" + integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== + dependencies: + emoji-regex "^10.3.0" + get-east-asian-width "^1.0.0" + strip-ansi "^7.1.0" + string.prototype.matchall@^4.0.8: - version "4.0.10" - resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz#a1553eb532221d4180c51581d6072cd65d1ee100" - integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ== + version "4.0.12" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz#6c88740e49ad4956b1332a911e949583a275d4c0" + integrity sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - has-symbols "^1.0.3" - internal-slot "^1.0.5" - regexp.prototype.flags "^1.5.0" - set-function-name "^2.0.0" - side-channel "^1.0.4" + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-abstract "^1.23.6" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.6" + gopd "^1.2.0" + has-symbols "^1.1.0" + internal-slot "^1.1.0" + regexp.prototype.flags "^1.5.3" + set-function-name "^2.0.2" + side-channel "^1.1.0" + +string.prototype.trim@^1.2.10, string.prototype.trim@~1.2.8: + version "1.2.10" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81" + integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + define-data-property "^1.1.4" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-object-atoms "^1.0.0" + has-property-descriptors "^1.0.2" -string.prototype.trim@^1.2.8, string.prototype.trim@~1.2.8: - version "1.2.8" - resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" - integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== +string.prototype.trimend@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz#62e2731272cd285041b36596054e9f66569b6942" + integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.8" + call-bound "^1.0.2" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" -string.prototype.trimend@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" - integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" -string.prototype.trimstart@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" - integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== +string_decoder-okam@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder-okam/-/string_decoder-okam-1.3.0.tgz#277bb20dd66d6bf6279c0d52b75a34b08e98c8c5" + integrity sha512-N5lJgLJ02sIs9xNyqPgIywlGaLUW6s5cYRpnmM3gbfhGA3sggW0+E2go26D7oZgEH7jHpXDe+ArDrBXeCaP9QA== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + safe-buffer "~5.2.0" string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" string_decoder@~0.10.x: version "0.10.31" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== string_decoder@~1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" stringify-entities@^4.0.0: - version "4.0.3" - resolved "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz#cfabd7039d22ad30f3cc435b0ca2c1574fc88ef8" - integrity sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g== + version "4.0.4" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.4.tgz#b3b79ef5f277cc4ac73caeb0236c5ba939b3a4f3" + integrity sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg== dependencies: character-entities-html4 "^2.0.0" character-entities-legacy "^3.0.0" @@ -12846,76 +13779,76 @@ stringify-entities@^4.0.0: strip-ansi@^3.0.0: version "3.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== dependencies: ansi-regex "^2.0.0" strip-ansi@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== dependencies: ansi-regex "^3.0.0" strip-ansi@^5.1.0: version "5.2.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== dependencies: ansi-regex "^4.1.0" strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.0.1: +strip-ansi@^7.0.1, strip-ansi@^7.1.0: version "7.1.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" strip-eof@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== strip-final-newline@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== strip-final-newline@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== strip-indent@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== dependencies: min-indent "^1.0.0" strip-json-comments@~2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== style-to-object@^0.4.1: version "0.4.4" - resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz#266e3dfd56391a7eefb7770423612d043c3f33ec" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.4.tgz#266e3dfd56391a7eefb7770423612d043c3f33ec" integrity sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg== dependencies: inline-style-parser "0.1.1" styled-components@^5.3.3: version "5.3.11" - resolved "https://registry.npmjs.org/styled-components/-/styled-components-5.3.11.tgz#9fda7bf1108e39bf3f3e612fcc18170dedcd57a8" + resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.11.tgz#9fda7bf1108e39bf3f3e612fcc18170dedcd57a8" integrity sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw== dependencies: "@babel/helper-module-imports" "^7.0.0" @@ -12931,25 +13864,25 @@ styled-components@^5.3.3: stylelint-config-recommended@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-7.0.0.tgz#7497372ae83ab7a6fffc18d7d7b424c6480ae15e" + resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-7.0.0.tgz#7497372ae83ab7a6fffc18d7d7b424c6480ae15e" integrity sha512-yGn84Bf/q41J4luis1AZ95gj0EQwRX8lWmGmBwkwBNSkpGSpl66XcPTulxGa/Z91aPoNGuIGBmFkcM1MejMo9Q== stylelint-config-standard@25.0.0: version "25.0.0" - resolved "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-25.0.0.tgz#2c916984e6655d40d6e8748b19baa8603b680bff" + resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-25.0.0.tgz#2c916984e6655d40d6e8748b19baa8603b680bff" integrity sha512-21HnP3VSpaT1wFjFvv9VjvOGDtAviv47uTp3uFmzcN+3Lt+RYRv6oAplLaV51Kf792JSxJ6svCJh/G18E9VnCA== dependencies: stylelint-config-recommended "^7.0.0" stylis@4.2.0: version "4.2.0" - resolved "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== -stylis@^4.0.13, stylis@^4.1.2: - version "4.3.0" - resolved "https://registry.npmjs.org/stylis/-/stylis-4.3.0.tgz#abe305a669fc3d8777e10eefcfc73ad861c5588c" - integrity sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ== +stylis@^4.1.2, stylis@^4.3.4: + version "4.3.6" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.6.tgz#7c7b97191cb4f195f03ecab7d52f7902ed378320" + integrity sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ== sucrase@^3.0.0: version "3.35.0" @@ -12966,48 +13899,48 @@ sucrase@^3.0.0: supports-color@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-color@^8.0.0: version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== svg-parser@^2.0.4: version "2.0.4" - resolved "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== svg-pathdata@^5.0.5: version "5.0.5" - resolved "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-5.0.5.tgz#65e8d765642ba15fe15434444087d082bc526b29" + resolved "https://registry.yarnpkg.com/svg-pathdata/-/svg-pathdata-5.0.5.tgz#65e8d765642ba15fe15434444087d082bc526b29" integrity sha512-TAAvLNSE3fEhyl/Da19JWfMAdhSXTYeviXsLSoDT1UM76ADj5ndwAPX1FKQEgB/gFMPavOy6tOqfalXKUiXrow== svgo-browser@^1.3.7: version "1.3.8" - resolved "https://registry.npmjs.org/svgo-browser/-/svgo-browser-1.3.8.tgz#e90c75ebf74a7f052ca9841d9a34044e40f4f65c" + resolved "https://registry.yarnpkg.com/svgo-browser/-/svgo-browser-1.3.8.tgz#e90c75ebf74a7f052ca9841d9a34044e40f4f65c" integrity sha512-yOgDNIcewFZN3+jXdWeh/rQzbWJjCq1dTHphLz2r4T4AfTm+nqCxZ5B89v9bjQbFKA/s/k7TUc7J90+pP2HTyw== dependencies: chalk "^2.4.1" @@ -13025,7 +13958,7 @@ svgo-browser@^1.3.7: svgo@^2.8.0: version "2.8.0" - resolved "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== dependencies: "@trysound/sax" "0.2.0" @@ -13038,7 +13971,7 @@ svgo@^2.8.0: svgson@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/svgson/-/svgson-4.1.0.tgz#eb70dac8d0075c61e5bfd45411a56014e2d3610e" + resolved "https://registry.yarnpkg.com/svgson/-/svgson-4.1.0.tgz#eb70dac8d0075c61e5bfd45411a56014e2d3610e" integrity sha512-DodISxHtdLKUghDYA+PGK4Qq350+CbBAkdvGLkBFSmWd9WKSg4dijgjB1IiRPTmsUCd+a7KYe+ILHtklYgQyzQ== dependencies: deep-rename-keys "^0.2.1" @@ -13046,34 +13979,34 @@ svgson@^4.1.0: xml-reader "2.4.3" swr@^2.0.0: - version "2.2.4" - resolved "https://registry.npmjs.org/swr/-/swr-2.2.4.tgz#03ec4c56019902fbdc904d78544bd7a9a6fa3f07" - integrity sha512-njiZ/4RiIhoOlAaLYDqwz5qH/KZXVilRLvomrx83HjzCWTfa+InyfAjv05PSFxnmLzZkNO9ZfvgoqzAaEI4sGQ== + version "2.3.4" + resolved "https://registry.yarnpkg.com/swr/-/swr-2.3.4.tgz#60bcb5b97cae157a6ef69eff0ed2beb9010eba69" + integrity sha512-bYd2lrhc+VarcpkgWclcUi92wYCpOgMws9Sd1hG1ntAu0NEy+14CbotuFjshBU2kt9rYj9TSmDcybpxpeTU1fg== dependencies: - client-only "^0.0.1" - use-sync-external-store "^1.2.0" + dequal "^2.0.3" + use-sync-external-store "^1.4.0" synckit@0.8.5: version "0.8.5" - resolved "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz#b7f4358f9bb559437f9f167eb6bc46b3c9818fa3" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.5.tgz#b7f4358f9bb559437f9f167eb6bc46b3c9818fa3" integrity sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q== dependencies: "@pkgr/utils" "^2.3.1" tslib "^2.5.0" systemjs@^6.14.1: - version "6.14.2" - resolved "https://registry.npmjs.org/systemjs/-/systemjs-6.14.2.tgz#e289f959f8c8b407403bd39c6abaa16f2c13f316" - integrity sha512-1TlOwvKWdXxAY9vba+huLu99zrQURDWA8pUTYsRIYDZYQbGyK+pyEP4h4dlySsqo7ozyJBmYD20F+iUHhAltEg== + version "6.15.1" + resolved "https://registry.yarnpkg.com/systemjs/-/systemjs-6.15.1.tgz#74175b6810e27a79e1177d21db5f0e3057118cea" + integrity sha512-Nk8c4lXvMB98MtbmjX7JwJRgJOL8fluecYCfCeYBznwmpOs8Bf15hLM6z4z71EDAhQVrQrI+wt1aLWSXZq+hXA== tapable@^2.0.0, tapable@^2.2.0, tapable@^2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + version "2.2.2" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.2.tgz#ab4984340d30cb9989a490032f086dbb8b56d872" + integrity sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg== tape@^4.5.1: version "4.17.0" - resolved "https://registry.npmjs.org/tape/-/tape-4.17.0.tgz#de89f3671ddc5dad178d04c28dc6b0183f42268e" + resolved "https://registry.yarnpkg.com/tape/-/tape-4.17.0.tgz#de89f3671ddc5dad178d04c28dc6b0183f42268e" integrity sha512-KCuXjYxCZ3ru40dmND+oCLsXyuA8hoseu2SS404Px5ouyS0A99v8X/mdiLqsR5MTAyamMBN7PRwt2Dv3+xGIxw== dependencies: "@ljharb/resumer" "~0.0.1" @@ -13094,9 +14027,9 @@ tape@^4.5.1: string.prototype.trim "~1.2.8" tar-fs@^1.15.3: - version "1.16.3" - resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz#966a628841da2c4010406a82167cbd5e0c72d509" - integrity sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw== + version "1.16.5" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.5.tgz#716a323609c11182d1d3d7b5bf277d15dc128665" + integrity sha512-1ergVCCysmwHQNrOS+Pjm4DQ4nrGp43+Xnu4MRGjCnQu/m3hEgLNS78d5z+B8OJ1hN5EejJdCSFZE1oM6AQXAQ== dependencies: chownr "^1.0.1" mkdirp "^0.5.1" @@ -13105,7 +14038,7 @@ tar-fs@^1.15.3: tar-stream@^1.1.2, tar-stream@^1.5.4: version "1.6.2" - resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== dependencies: bl "^1.0.0" @@ -13118,24 +14051,24 @@ tar-stream@^1.1.2, tar-stream@^1.5.4: term-size@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" integrity sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ== dependencies: execa "^0.7.0" terser@^5.10.0: - version "5.24.0" - resolved "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz#4ae50302977bca4831ccc7b4fef63a3c04228364" - integrity sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw== + version "5.43.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.43.1.tgz#88387f4f9794ff1a29e7ad61fb2932e25b4fdb6d" + integrity sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg== dependencies: "@jridgewell/source-map" "^0.3.3" - acorn "^8.8.2" + acorn "^8.14.0" commander "^2.20.0" source-map-support "~0.5.20" test-exclude@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: "@istanbuljs/schema" "^0.1.2" @@ -13144,12 +14077,12 @@ test-exclude@^6.0.0: text-extensions@^2.0.0: version "2.4.0" - resolved "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz#a1cfcc50cf34da41bfd047cc744f804d1680ea34" + resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-2.4.0.tgz#a1cfcc50cf34da41bfd047cc744f804d1680ea34" integrity sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g== textextensions@^2.5.0: version "2.6.0" - resolved "https://registry.npmjs.org/textextensions/-/textextensions-2.6.0.tgz#d7e4ab13fe54e32e08873be40d51b74229b00fc4" + resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.6.0.tgz#d7e4ab13fe54e32e08873be40d51b74229b00fc4" integrity sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ== thenify-all@^1.0.0: @@ -13168,19 +14101,19 @@ thenify-all@^1.0.0: thread-stream@^0.15.1: version "0.15.2" - resolved "https://registry.npmjs.org/thread-stream/-/thread-stream-0.15.2.tgz#fb95ad87d2f1e28f07116eb23d85aba3bc0425f4" + resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-0.15.2.tgz#fb95ad87d2f1e28f07116eb23d85aba3bc0425f4" integrity sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA== dependencies: real-require "^0.1.0" -throttle-debounce@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.0.tgz#a17a4039e82a2ed38a5e7268e4132d6960d41933" - integrity sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg== +throttle-debounce@^5.0.0, throttle-debounce@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-5.0.2.tgz#ec5549d84e053f043c9fd0f2a6dd892ff84456b1" + integrity sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A== through2@^2.0.0: version "2.0.5" - resolved "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== dependencies: readable-stream "~2.3.6" @@ -13188,14 +14121,14 @@ through2@^2.0.0: through2@^4.0.0: version "4.0.2" - resolved "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" + resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== dependencies: readable-stream "3" through2@~0.4.1: version "0.4.2" - resolved "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz#dbf5866031151ec8352bb6c4db64a2292a840b9b" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.4.2.tgz#dbf5866031151ec8352bb6c4db64a2292a840b9b" integrity sha512-45Llu+EwHKtAZYTPPVn3XZHBgakWMN3rokhEv5hu596XP+cNgplMg+Gj+1nmAvj+L0K7+N49zBKx5rah5u0QIQ== dependencies: readable-stream "~1.0.17" @@ -13203,103 +14136,112 @@ through2@~0.4.1: "through@>=2.2.7 <3", through@^2.3.6, through@^2.3.8: version "2.3.8" - resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== timed-out@^4.0.0: version "4.0.1" - resolved "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" integrity sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA== timers-browserify@^2.0.4: version "2.0.12" - resolved "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== dependencies: setimmediate "^1.0.4" tiny-emitter@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" + resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== tiny-invariant@^1.0.6: - version "1.3.1" - resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" - integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== + version "1.3.3" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" + integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== titleize@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53" + resolved "https://registry.yarnpkg.com/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53" integrity sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ== tmp@^0.0.33: version "0.0.33" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" tmpl@1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== to-arraybuffer@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" integrity sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA== -to-buffer@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" - integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== +to-buffer@^1.1.1, to-buffer@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.2.1.tgz#2ce650cdb262e9112a18e65dc29dcb513c8155e0" + integrity sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ== + dependencies: + isarray "^2.0.5" + safe-buffer "^5.2.1" + typed-array-buffer "^1.0.3" to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" toggle-selection@^1.0.6: version "1.0.6" - resolved "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" + resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + tr46@~0.0.3: version "0.0.3" - resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== transformation-matrix@^2.11.1: - version "2.15.0" - resolved "https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-2.15.0.tgz#4276ac7e384d9764b044c2d48ced77f8cc1f88c0" - integrity sha512-HN3kCvvH4ug3Xm/ycOfCFQOOktg5htxlC4Ih1Z7Wb6BMtQho+q+irOdGo10ARRKpqkRBXgBzQFw/AVmR0oIf0g== + version "2.16.1" + resolved "https://registry.yarnpkg.com/transformation-matrix/-/transformation-matrix-2.16.1.tgz#4a2de06331b94ae953193d1b9a5ba002ec5f658a" + integrity sha512-tdtC3wxVEuzU7X/ydL131Q3JU5cPMEn37oqVLITjRDSDsnSHVFzW2JiCLfZLIQEgWzZHdSy3J6bZzvKEN24jGA== trim-lines@^3.0.0: version "3.0.1" - resolved "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" + resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== trim-newlines@^3.0.0: version "3.0.1" - resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw== + trough@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" - integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== + version "2.2.0" + resolved "https://registry.yarnpkg.com/trough/-/trough-2.2.0.tgz#94a60bd6bd375c152c1df911a4b11d5b0256f50f" + integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== ts-dedent@^2.2.0: version "2.2.0" - resolved "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5" + resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5" integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== ts-interface-checker@^0.1.9: @@ -13309,134 +14251,135 @@ ts-interface-checker@^0.1.9: ts-toolbelt@^9.6.0: version "9.6.0" - resolved "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz#50a25426cfed500d4a09bd1b3afb6f28879edfd5" + resolved "https://registry.yarnpkg.com/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz#50a25426cfed500d4a09bd1b3afb6f28879edfd5" integrity sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w== +tslib@2, tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.4.1, tslib@^2.5.0, tslib@^2.6.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: version "1.14.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.4.1, tslib@^2.5.0, tslib@^2.6.0: - version "2.6.2" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== - tsutils@^3.21.0: version "3.21.0" - resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" -tsx@^3.12.2: - version "3.14.0" - resolved "https://registry.npmjs.org/tsx/-/tsx-3.14.0.tgz#be6e2176b6f210fe8f48124fb6e22e0f075e927b" - integrity sha512-xHtFaKtHxM9LOklMmJdI3BEnQq/D5F73Of2E1GDrITi9sgoVkvIsrQUTY1G8FlmGtA+awCI4EBlTRRYxkL2sRg== +tsx@3.12.2: + version "3.12.2" + resolved "https://registry.yarnpkg.com/tsx/-/tsx-3.12.2.tgz#1c8a4fa08a97739e6eedf0ad464bd8218e1a64f0" + integrity sha512-ykAEkoBg30RXxeOMVeZwar+JH632dZn9EUJVyJwhfag62k6UO/dIyJEV58YuLF6e5BTdV/qmbQrpkWqjq9cUnQ== dependencies: - esbuild "~0.18.20" - get-tsconfig "^4.7.2" - source-map-support "^0.5.21" + "@esbuild-kit/cjs-loader" "^2.4.1" + "@esbuild-kit/core-utils" "^3.0.0" + "@esbuild-kit/esm-loader" "^2.5.4" optionalDependencies: - fsevents "~2.3.3" + fsevents "~2.3.2" tty-browserify@0.0.0: version "0.0.0" - resolved "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" integrity sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw== type-fest@^0.18.0: version "0.18.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== type-fest@^0.6.0: version "0.6.0" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== type-fest@^0.8.1: version "0.8.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-fest@^1.0.2: - version "1.4.0" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" - integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== - -type-is@^1.6.4: +type-is@^1.6.4, type-is@~1.6.18: version "1.6.18" - resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: media-typer "0.3.0" mime-types "~2.1.24" -typed-array-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" - integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== +typed-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" + integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - is-typed-array "^1.1.10" + call-bound "^1.0.3" + es-errors "^1.3.0" + is-typed-array "^1.1.14" -typed-array-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" - integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== +typed-array-byte-length@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce" + integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.8" for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.14" -typed-array-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" - integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== +typed-array-byte-offset@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355" + integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.15" + reflect.getprototypeof "^1.0.9" -typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== +typed-array-length@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" + integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" for-each "^0.3.3" - is-typed-array "^1.1.9" + gopd "^1.0.1" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + reflect.getprototypeof "^1.0.6" typed-function@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/typed-function/-/typed-function-2.1.0.tgz#ded6f8a442ba8749ff3fe75bc41419c8d46ccc3f" + resolved "https://registry.yarnpkg.com/typed-function/-/typed-function-2.1.0.tgz#ded6f8a442ba8749ff3fe75bc41419c8d46ccc3f" integrity sha512-bctQIOqx2iVbWGDGPWwIm18QScpu2XRmkC19D8rQGFsjKSgteq/o1hTZvIG/wuDq8fanpBDrLkLq+aEN/6y5XQ== typedarray@^0.0.6: version "0.0.6" - resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== types-ramda@^0.29.4: - version "0.29.6" - resolved "https://registry.npmjs.org/types-ramda/-/types-ramda-0.29.6.tgz#a1d2a3c15a48e27d35832d7194d93369975f1427" - integrity sha512-VJoOk1uYNh9ZguGd3eZvqkdhD4hTGtnjRBUx5Zc0U9ftmnCgiWcSj/lsahzKunbiwRje1MxxNkEy1UdcXRCpYw== + version "0.29.10" + resolved "https://registry.yarnpkg.com/types-ramda/-/types-ramda-0.29.10.tgz#820432905b820301c74f6396f07aa2359b41cde4" + integrity sha512-5PJiW/eiTPyXXBYGZOYGezMl6qj7keBiZheRwfjJZY26QPHsNrjfJnz0mru6oeqqoTHOni893Jfd6zyUXfQRWg== dependencies: ts-toolbelt "^9.6.0" uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" - resolved "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== uglify-js@^2.6.2: version "2.8.29" - resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" integrity sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w== dependencies: source-map "~0.5.1" @@ -13446,50 +14389,50 @@ uglify-js@^2.6.2: uglify-to-browserify@~1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" integrity sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q== umi@^4.0.84: - version "4.0.88" - resolved "https://registry.npmjs.org/umi/-/umi-4.0.88.tgz#2a12d1e15b5408688403037acf21441b54e81f2a" - integrity sha512-gNgBMbLuZwj5c2uroFmtgT4tJO2JFKfIxJaad3oFa0cOzJMSx6CnaG3Z2/+pU2eAy9EMBvbtY/iAmkr3ZNEAWg== - dependencies: - "@babel/runtime" "7.23.2" - "@umijs/bundler-utils" "4.0.88" - "@umijs/bundler-webpack" "4.0.88" - "@umijs/core" "4.0.88" - "@umijs/lint" "4.0.88" - "@umijs/preset-umi" "4.0.88" - "@umijs/renderer-react" "4.0.88" - "@umijs/server" "4.0.88" - "@umijs/test" "4.0.88" - "@umijs/utils" "4.0.88" + version "4.4.12" + resolved "https://registry.yarnpkg.com/umi/-/umi-4.4.12.tgz#11e8235c1dbf70f717a2dd322dc4c44784a56a35" + integrity sha512-xOI6bDP5wwHil+acmWOmTVvCEnjeEE5/ULXT3zRZOckgi+JQ5Omw2z5uo1xLRcVJjFz0qc7ywEL07wES9gIFew== + dependencies: + "@babel/runtime" "7.23.6" + "@umijs/bundler-utils" "4.4.12" + "@umijs/bundler-webpack" "4.4.12" + "@umijs/core" "4.4.12" + "@umijs/lint" "4.4.12" + "@umijs/preset-umi" "4.4.12" + "@umijs/renderer-react" "4.4.12" + "@umijs/server" "4.4.12" + "@umijs/test" "4.4.12" + "@umijs/utils" "4.4.12" prettier-plugin-organize-imports "^3.2.2" prettier-plugin-packagejson "2.4.3" -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== +unbox-primitive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" + integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== dependencies: - call-bind "^1.0.2" + call-bound "^1.0.3" has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" + has-symbols "^1.1.0" + which-boxed-primitive "^1.1.1" -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici-types@~7.8.0: + version "7.8.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.8.0.tgz#de00b85b710c54122e44fbfd911f8d70174cd294" + integrity sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw== unfetch@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/unfetch/-/unfetch-5.0.0.tgz#8a5b6e5779ebe4dde0049f7d7a81d4a1af99d142" + resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-5.0.0.tgz#8a5b6e5779ebe4dde0049f7d7a81d4a1af99d142" integrity sha512-3xM2c89siXg0nHvlmYsQ2zkLASvVMBisZm5lF3gFDqfF2xonNStDJyMpvaOBe0a1Edxmqrf2E0HBdmy9QyZaeg== unified@^10.0.0, unified@^10.1.2: version "10.1.2" - resolved "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" + resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== dependencies: "@types/unist" "^2.0.0" @@ -13502,28 +14445,28 @@ unified@^10.0.0, unified@^10.1.2: unique-filename@^1.1.0: version "1.1.1" - resolved "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== dependencies: unique-slug "^2.0.0" unique-slug@^2.0.0: version "2.0.2" - resolved "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== dependencies: imurmurhash "^0.1.4" unique-string@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" integrity sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg== dependencies: crypto-random-string "^1.0.0" unist-util-filter@^4.0.0: version "4.0.1" - resolved "https://registry.npmjs.org/unist-util-filter/-/unist-util-filter-4.0.1.tgz#fd885dd48adaad345de5f5dc706ec4ff44a8d074" + resolved "https://registry.yarnpkg.com/unist-util-filter/-/unist-util-filter-4.0.1.tgz#fd885dd48adaad345de5f5dc706ec4ff44a8d074" integrity sha512-RynicUM/vbOSTSiUK+BnaK9XMfmQUh6gyi7L6taNgc7FIf84GukXVV3ucGzEN/PhUUkdP5hb1MmXc+3cvPUm5Q== dependencies: "@types/unist" "^2.0.0" @@ -13532,33 +14475,33 @@ unist-util-filter@^4.0.0: unist-util-generated@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz#e37c50af35d3ed185ac6ceacb6ca0afb28a85cae" + resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-2.0.1.tgz#e37c50af35d3ed185ac6ceacb6ca0afb28a85cae" integrity sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A== unist-util-is@^5.0.0: version "5.2.1" - resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz#b74960e145c18dcb6226bc57933597f5486deae9" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.2.1.tgz#b74960e145c18dcb6226bc57933597f5486deae9" integrity sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw== dependencies: "@types/unist" "^2.0.0" unist-util-position@^4.0.0: version "4.0.4" - resolved "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz#93f6d8c7d6b373d9b825844645877c127455f037" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.4.tgz#93f6d8c7d6b373d9b825844645877c127455f037" integrity sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg== dependencies: "@types/unist" "^2.0.0" unist-util-stringify-position@^3.0.0: version "3.0.3" - resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== dependencies: "@types/unist" "^2.0.0" unist-util-visit-parents@^5.0.0, unist-util-visit-parents@^5.1.1, unist-util-visit-parents@^5.1.3: version "5.1.3" - resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz#b4520811b0ca34285633785045df7a8d6776cfeb" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz#b4520811b0ca34285633785045df7a8d6776cfeb" integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== dependencies: "@types/unist" "^2.0.0" @@ -13566,7 +14509,7 @@ unist-util-visit-parents@^5.0.0, unist-util-visit-parents@^5.1.1, unist-util-vis unist-util-visit@^4.0.0, unist-util-visit@^4.1.2: version "4.1.2" - resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz#125a42d1eb876283715a3cb5cceaa531828c72e2" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.2.tgz#125a42d1eb876283715a3cb5cceaa531828c72e2" integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== dependencies: "@types/unist" "^2.0.0" @@ -13575,22 +14518,27 @@ unist-util-visit@^4.0.0, unist-util-visit@^4.1.2: universalify@^0.1.0: version "0.1.2" - resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== universalify@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + unquote@~1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" integrity sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg== unset-value@^0.1.1: version "0.1.2" - resolved "https://registry.npmjs.org/unset-value/-/unset-value-0.1.2.tgz#506810b867f27c2a5a6e9b04833631f6de58d310" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-0.1.2.tgz#506810b867f27c2a5a6e9b04833631f6de58d310" integrity sha512-yhv5I4TsldLdE3UcVQn0hD2T5sNCPv4+qm/CTUpRKIpwthYRIipsAPdsrNpOI79hPQa0rTTeW22Fq6JWRcTgNg== dependencies: has-value "^0.3.1" @@ -13598,25 +14546,25 @@ unset-value@^0.1.1: untildify@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== unzip-response@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" integrity sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw== -update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== +update-browserslist-db@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" + integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" + escalade "^3.2.0" + picocolors "^1.1.1" update-notifier@^2.2.0: version "2.5.0" - resolved "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== dependencies: boxen "^1.2.1" @@ -13632,74 +14580,89 @@ update-notifier@^2.2.0: upper-case@^2.0.1: version "2.0.2" - resolved "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz#d89810823faab1df1549b7d97a76f8662bae6f7a" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-2.0.2.tgz#d89810823faab1df1549b7d97a76f8662bae6f7a" integrity sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg== dependencies: tslib "^2.0.3" uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" +url-okam@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/url-okam/-/url-okam-0.11.1.tgz#fd1b309d26e2e1f6aaec31c784d1a0e759be28c8" + integrity sha512-AM6OVeZNwKiirK3IwKxHuopgjX1jB0F8srK9OlCXN+wdmTNg6vgnN9xyQ5abhxq8Oj/kTleLU8OCfZ1FaEW37w== + dependencies: + punycode "^1.4.1" + qs "^6.11.0" + url-parse-lax@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" integrity sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA== dependencies: prepend-http "^1.0.1" url@^0.11.0, url@^0.11.1: - version "0.11.3" - resolved "https://registry.npmjs.org/url/-/url-0.11.3.tgz#6f495f4b935de40ce4a0a52faee8954244f3d3ad" - integrity sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw== + version "0.11.4" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.4.tgz#adca77b3562d56b72746e76b330b7f27b6721f3c" + integrity sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg== dependencies: punycode "^1.4.1" - qs "^6.11.2" + qs "^6.12.3" use-debouncy@~4.3.0: version "4.3.1" - resolved "https://registry.npmjs.org/use-debouncy/-/use-debouncy-4.3.1.tgz#a0d48ac20300ff96d4fbacc9149d14a82bb68907" + resolved "https://registry.yarnpkg.com/use-debouncy/-/use-debouncy-4.3.1.tgz#a0d48ac20300ff96d4fbacc9149d14a82bb68907" integrity sha512-K+qtK89KojRB2GbTGtmJRysSii+wVg540bYeW9YBF7jqtwoGjIpY3m71BP0NeZzOMCcbZ6ZodLw6QeN3ascTZg== use-deep-compare-effect@^1.8.1: version "1.8.1" - resolved "https://registry.npmjs.org/use-deep-compare-effect/-/use-deep-compare-effect-1.8.1.tgz#ef0ce3b3271edb801da1ec23bf0754ef4189d0c6" + resolved "https://registry.yarnpkg.com/use-deep-compare-effect/-/use-deep-compare-effect-1.8.1.tgz#ef0ce3b3271edb801da1ec23bf0754ef4189d0c6" integrity sha512-kbeNVZ9Zkc0RFGpfMN3MNfaKNvcLNyxOAAd9O4CBZ+kCBXXscn9s/4I+8ytUER4RDpEYs5+O6Rs4PqiZ+rHr5Q== dependencies: "@babel/runtime" "^7.12.5" dequal "^2.0.2" use-isomorphic-layout-effect@^1.1.1: - version "1.1.2" - resolved "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" - integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== + version "1.2.1" + resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.1.tgz#2f11a525628f56424521c748feabc2ffcc962fce" + integrity sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA== use-memo-one@^1.1.1: version "1.1.3" - resolved "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz#2fd2e43a2169eabc7496960ace8c79efef975e99" + resolved "https://registry.yarnpkg.com/use-memo-one/-/use-memo-one-1.1.3.tgz#2fd2e43a2169eabc7496960ace8c79efef975e99" integrity sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ== use-merge-value@^1: version "1.2.0" - resolved "https://registry.npmjs.org/use-merge-value/-/use-merge-value-1.2.0.tgz#45410846c23e490f404c9cbd17d67db9c8c0efcd" + resolved "https://registry.yarnpkg.com/use-merge-value/-/use-merge-value-1.2.0.tgz#45410846c23e490f404c9cbd17d67db9c8c0efcd" integrity sha512-DXgG0kkgJN45TcyoXL49vJnn55LehnrmoHc7MbKi+QDBvr8dsesqws8UlyIWGHMR+JXgxc1nvY+jDGMlycsUcw== -use-sync-external-store@1.2.0, use-sync-external-store@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" - integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== +use-sync-external-store@^1.2.2, use-sync-external-store@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz#55122e2a3edd2a6c106174c27485e0fd59bcfca0" + integrity sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A== util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +util-okam@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util-okam/-/util-okam-0.11.1.tgz#2bb241ed5b19c938082093f0a8a5988b2add105f" + integrity sha512-e2bG47F03vYx2MbA6znK6t6dwffnXGsVzh8BLpi0pcQ7dDRQf0zSAQ9IR7M+aoozALNibw8eCY53gEK8bBpSjg== + dependencies: + inherits "2.0.3" + util.promisify@~1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== dependencies: define-properties "^1.1.3" @@ -13707,38 +14670,50 @@ util.promisify@~1.0.0: has-symbols "^1.0.1" object.getownpropertydescriptors "^2.1.0" +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ== + dependencies: + inherits "2.0.1" + util@^0.10.4: version "0.10.4" - resolved "https://registry.npmjs.org/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== dependencies: inherits "2.0.3" util@^0.11.0: version "0.11.1" - resolved "https://registry.npmjs.org/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== dependencies: inherits "2.0.3" utila@~0.4: version "0.4.0" - resolved "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + uuid@^8.2.0: version "8.3.2" - resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== uuid@^9.0.0: version "9.0.1" - resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== uvu@^0.5.0: version "0.5.6" - resolved "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" + resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== dependencies: dequal "^2.0.0" @@ -13748,12 +14723,12 @@ uvu@^0.5.0: v8-compile-cache@2.3.0: version "2.3.0" - resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== validate-npm-package-license@^3.0.1: version "3.0.4" - resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: spdx-correct "^3.0.0" @@ -13761,31 +14736,31 @@ validate-npm-package-license@^3.0.1: validate-npm-package-name@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" integrity sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw== dependencies: builtins "^1.0.3" vanilla-jsoneditor@^0.16.1: version "0.16.1" - resolved "https://registry.npmjs.org/vanilla-jsoneditor/-/vanilla-jsoneditor-0.16.1.tgz#0408c02cc377dce72bd719439750cf24b581843e" + resolved "https://registry.yarnpkg.com/vanilla-jsoneditor/-/vanilla-jsoneditor-0.16.1.tgz#0408c02cc377dce72bd719439750cf24b581843e" integrity sha512-Wirg6DoCrJpYwMHxkwyvgQ16gr4kgH9zzueHSSSovzQDvlg/XSqpY/stVsI5lz1vqJW1RAtr0Ilyyg1AbokRXA== -vary@^1: +vary@^1, vary@~1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== vditor@^3.10.8: - version "3.10.8" - resolved "https://registry.yarnpkg.com/vditor/-/vditor-3.10.8.tgz#b7fa16c20bdc79f712786d7a200bcea006c6d192" - integrity sha512-u9npjvMuGJVk0QGbpqiGAmvgiR4QvMVpNQYrvFYZ/yWDtTFLZrHmLxuUbtswotR6KY10u5kVuaoSEoBGGWQGjQ== + version "3.11.1" + resolved "https://registry.yarnpkg.com/vditor/-/vditor-3.11.1.tgz#dca4f7b2798cf9333161c2a915be057dbb1d4699" + integrity sha512-7rjNSXYVyZG0mVZpUG2tfxwnoNtkcRCnwdSju+Zvpjf/r72iQa6kLpeThFMIKPuQ5CRnQQv6gnR3eNU6UGbC2Q== dependencies: diff-match-patch "^1.0.5" vfile-location@^4.0.0: version "4.1.0" - resolved "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz#69df82fb9ef0a38d0d02b90dd84620e120050dd0" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-4.1.0.tgz#69df82fb9ef0a38d0d02b90dd84620e120050dd0" integrity sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw== dependencies: "@types/unist" "^2.0.0" @@ -13793,7 +14768,7 @@ vfile-location@^4.0.0: vfile-message@^3.0.0: version "3.1.4" - resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz#15a50816ae7d7c2d1fa87090a7f9f96612b59dea" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.4.tgz#15a50816ae7d7c2d1fa87090a7f9f96612b59dea" integrity sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== dependencies: "@types/unist" "^2.0.0" @@ -13801,7 +14776,7 @@ vfile-message@^3.0.0: vfile@^5.0.0, vfile@^5.3.7: version "5.3.7" - resolved "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz#de0677e6683e3380fafc46544cfe603118826ab7" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.7.tgz#de0677e6683e3380fafc46544cfe603118826ab7" integrity sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g== dependencies: "@types/unist" "^2.0.0" @@ -13809,155 +14784,166 @@ vfile@^5.0.0, vfile@^5.3.7: unist-util-stringify-position "^3.0.0" vfile-message "^3.0.0" -vite@4.3.1: - version "4.3.1" - resolved "https://registry.npmjs.org/vite/-/vite-4.3.1.tgz#9badb1377f995632cdcf05f32103414db6fbb95a" - integrity sha512-EPmfPLAI79Z/RofuMvkIS0Yr091T2ReUoXQqc5ppBX/sjFRhHKiPPF/R46cTdoci/XgeQpB23diiJxq5w30vdg== +vite@4.5.2: + version "4.5.2" + resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.2.tgz#d6ea8610e099851dad8c7371599969e0f8b97e82" + integrity sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w== dependencies: - esbuild "^0.17.5" - postcss "^8.4.21" - rollup "^3.20.2" + esbuild "^0.18.10" + postcss "^8.4.27" + rollup "^3.27.1" optionalDependencies: fsevents "~2.3.2" vm-browserify@^1.0.1: version "1.1.2" - resolved "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== void-elements@3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== walker@^1.0.8: version "1.0.8" - resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== dependencies: makeerror "1.0.12" warning@^4.0.3: version "4.0.3" - resolved "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== dependencies: loose-envify "^1.0.0" wbuf@^1.1.0, wbuf@^1.7.3: version "1.7.3" - resolved "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== dependencies: minimalistic-assert "^1.0.0" web-namespaces@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== web-streams-polyfill@^3.0.3: - version "3.2.1" - resolved "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" - integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== + version "3.3.3" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" + integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== web-worker@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz#5d85a04a7fbc1e7db58f66595d7a3ac7c9c180da" - integrity sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA== + version "1.5.0" + resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.5.0.tgz#71b2b0fbcc4293e8f0aa4f6b8a3ffebff733dcc5" + integrity sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw== webidl-conversions@^3.0.0: version "3.0.1" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== +webpack-5-chain@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/webpack-5-chain/-/webpack-5-chain-8.0.1.tgz#dda9db48c19e4e01e535e84241131bcc777243d8" + integrity sha512-Tu1w80WA2Z+X6e7KzGy+cc0A0z+npVJA/fh55q2azMJ030gqz343Kx+yNAstDCeugsepmtDWY2J2IBRW/O+DEA== + dependencies: + deepmerge "^1.5.2" + javascript-stringify "^2.0.1" + whatwg-url@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" webidl-conversions "^3.0.0" -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== +which-boxed-primitive@^1.0.2, which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e" + integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" + is-bigint "^1.1.0" + is-boolean-object "^1.2.1" + is-number-object "^1.1.1" + is-string "^1.1.1" + is-symbol "^1.1.1" -which-builtin-type@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" - integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== +which-builtin-type@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e" + integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== dependencies: - function.prototype.name "^1.1.5" - has-tostringtag "^1.0.0" + call-bound "^1.0.2" + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" is-async-function "^2.0.0" - is-date-object "^1.0.5" - is-finalizationregistry "^1.0.2" + is-date-object "^1.1.0" + is-finalizationregistry "^1.1.0" is-generator-function "^1.0.10" - is-regex "^1.1.4" + is-regex "^1.2.1" is-weakref "^1.0.2" isarray "^2.0.5" - which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.9" - -which-collection@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" - integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== - dependencies: - is-map "^2.0.1" - is-set "^2.0.1" - is-weakmap "^2.0.1" - is-weakset "^2.0.1" + which-boxed-primitive "^1.1.0" + which-collection "^1.0.2" + which-typed-array "^1.1.16" -which-typed-array@^1.1.11, which-typed-array@^1.1.13, which-typed-array@^1.1.9: - version "1.1.13" - resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" - integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.4" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" +which-collection@^1.0.1, which-collection@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + +which-typed-array@^1.1.16, which-typed-array@^1.1.19: + version "1.1.19" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz#df03842e870b6b88e117524a4b364b6fc689f956" + integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + for-each "^0.3.5" + get-proto "^1.0.1" + gopd "^1.2.0" + has-tostringtag "^1.0.2" which@^1.2.12, which@^1.2.9: version "1.3.1" - resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" which@^2.0.1: version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" widest-line@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== dependencies: string-width "^2.1.1" window-size@0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" integrity sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg== wordwrap@0.0.2: version "0.0.2" - resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" integrity sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q== "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": @@ -13971,30 +14957,39 @@ wordwrap@0.0.2: wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: +wrap-ansi@^8.1.0: version "8.1.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: ansi-styles "^6.1.0" string-width "^5.0.1" strip-ansi "^7.0.1" +wrap-ansi@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.0.tgz#1a3dc8b70d85eeb8398ddfb1e4a02cd186e58b3e" + integrity sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== + dependencies: + ansi-styles "^6.2.1" + string-width "^7.0.0" + strip-ansi "^7.1.0" + wrappy@1: version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== write-file-atomic@^2.0.0: version "2.4.3" - resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== dependencies: graceful-fs "^4.1.11" @@ -14003,7 +14998,7 @@ write-file-atomic@^2.0.0: write-file-atomic@^4.0.2: version "4.0.2" - resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== dependencies: imurmurhash "^0.1.4" @@ -14011,19 +15006,19 @@ write-file-atomic@^4.0.2: xdg-basedir@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" integrity sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ== xml-lexer@^0.2.2: version "0.2.2" - resolved "https://registry.npmjs.org/xml-lexer/-/xml-lexer-0.2.2.tgz#518193a4aa334d58fc7d248b549079b89907e046" + resolved "https://registry.yarnpkg.com/xml-lexer/-/xml-lexer-0.2.2.tgz#518193a4aa334d58fc7d248b549079b89907e046" integrity sha512-G0i98epIwiUEiKmMcavmVdhtymW+pCAohMRgybyIME9ygfVu8QheIi+YoQh3ngiThsT0SQzJT4R0sKDEv8Ou0w== dependencies: eventemitter3 "^2.0.0" xml-reader@2.4.3: version "2.4.3" - resolved "https://registry.npmjs.org/xml-reader/-/xml-reader-2.4.3.tgz#9f810caf7c425a5aafb848b1c45103c9e71d7530" + resolved "https://registry.yarnpkg.com/xml-reader/-/xml-reader-2.4.3.tgz#9f810caf7c425a5aafb848b1c45103c9e71d7530" integrity sha512-xWldrIxjeAMAu6+HSf9t50ot1uL5M+BtOidRCWHXIeewvSeIpscWCsp4Zxjk8kHHhdqFBrfK8U0EJeCcnyQ/gA== dependencies: eventemitter3 "^2.0.0" @@ -14031,69 +15026,69 @@ xml-reader@2.4.3: xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" - resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== xtend@~2.1.1: version "2.1.2" - resolved "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" integrity sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ== dependencies: object-keys "~0.4.0" y18n@^3.2.1: version "3.2.2" - resolved "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== y18n@^4.0.0: version "4.0.3" - resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== y18n@^5.0.5: version "5.0.8" - resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^2.1.2: version "2.1.2" - resolved "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== yallist@^3.0.2: version "3.1.1" - resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@2.3.4: - version "2.3.4" - resolved "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2" - integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA== - yaml@^1.10.0: version "1.10.2" - resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yaml@^2.7.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.0.tgz#15f8c9866211bdc2d3781a0890e44d4fa1a5fff6" + integrity sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ== + yargs-parser@^20.2.3: version "20.2.9" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== yargs-parser@^21.1.1: version "21.1.1" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== yargs@^17.0.0, yargs@^17.5.1: version "17.7.2" - resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1" @@ -14106,7 +15101,7 @@ yargs@^17.0.0, yargs@^17.5.1: yargs@~3.10.0: version "3.10.0" - resolved "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" integrity sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A== dependencies: camelcase "^1.0.2" @@ -14116,17 +15111,27 @@ yargs@~3.10.0: yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +zod-validation-error@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/zod-validation-error/-/zod-validation-error-2.1.0.tgz#208eac75237dfed47c0018d2fe8fd03501bfc9ac" + integrity sha512-VJh93e2wb4c3tWtGgTa0OF/dTt/zoPCPzXq4V11ZjxmEAFaPi/Zss1xIZdEB5RD8GD00U0/iVXgqkF77RV7pdQ== + +zod@^3.22.4: + version "3.25.76" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.76.tgz#26841c3f6fd22a6a2760e7ccb719179768471e34" + integrity sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ== + zustand@^4.4.1: - version "4.4.6" - resolved "https://registry.npmjs.org/zustand/-/zustand-4.4.6.tgz#03c78e3e2686c47095c93714c0c600b72a6512bd" - integrity sha512-Rb16eW55gqL4W2XZpJh0fnrATxYEG3Apl2gfHTyDSE965x/zxslTikpNch0JgNjJA9zK6gEFW8Fl6d1rTZaqgg== + version "4.5.7" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.5.7.tgz#7d6bb2026a142415dd8be8891d7870e6dbe65f55" + integrity sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw== dependencies: - use-sync-external-store "1.2.0" + use-sync-external-store "^1.2.2" zwitch@^2.0.0, zwitch@^2.0.4: version "2.0.4" - resolved "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==