diff --git a/CHANGELOG.md b/CHANGELOG.md
index d8b9a3c671..3f2ee38c2f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,297 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## [v1.6.20](https://github.com/nocobase/nocobase/compare/v1.6.19...v1.6.20) - 2025-04-14
+
+### 🎉 New Features
+
+- **[Departments]** Make Department, Attachment URL, and Workflow response message plugins free ([#6663](https://github.com/nocobase/nocobase/pull/6663)) by @chenos
+
+### 🐛 Bug Fixes
+
+- **[client]**
+ - The filter form should not display the "Unsaved changes" prompt ([#6657](https://github.com/nocobase/nocobase/pull/6657)) by @zhangzhonghe
+
+ - "allow multiple" option not working for relation field ([#6661](https://github.com/nocobase/nocobase/pull/6661)) by @katherinehhh
+
+ - In the filter form, when the filter button is clicked, if there are fields that have not passed validation, the filtering is still triggered ([#6659](https://github.com/nocobase/nocobase/pull/6659)) by @zhangzhonghe
+
+ - Switching to the group menu should not jump to a page that has already been hidden in menu ([#6654](https://github.com/nocobase/nocobase/pull/6654)) by @zhangzhonghe
+
+- **[File storage: S3(Pro)]**
+ - Organize language by @jiannx
+
+ - Individual baseurl and public settings, improve S3 pro storage config UX by @jiannx
+
+- **[Migration manager]** the skip auto backup option becomes invalid if environment variable popup appears during migration by @gchust
+
+## [v1.6.19](https://github.com/nocobase/nocobase/compare/v1.6.18...v1.6.19) - 2025-04-14
+
+### 🐛 Bug Fixes
+
+- **[client]**
+ - Fix the issue of preview images being obscured ([#6651](https://github.com/nocobase/nocobase/pull/6651)) by @zhangzhonghe
+
+ - In the form block, the default value of the field configuration will first be displayed as the original variable string and then disappear ([#6649](https://github.com/nocobase/nocobase/pull/6649)) by @zhangzhonghe
+
+## [v1.6.18](https://github.com/nocobase/nocobase/compare/v1.6.17...v1.6.18) - 2025-04-11
+
+### 🚀 Improvements
+
+- **[client]**
+ - Add default type fallback API for `Variable.Input` ([#6644](https://github.com/nocobase/nocobase/pull/6644)) by @mytharcher
+
+ - Optimize prompts for unconfigured pages ([#6641](https://github.com/nocobase/nocobase/pull/6641)) by @zhangzhonghe
+
+- **[Workflow: Delay node]** Support to use variable for duration ([#6621](https://github.com/nocobase/nocobase/pull/6621)) by @mytharcher
+
+- **[Workflow: Custom action event]** Add refresh settings for trigger workflow button by @mytharcher
+
+### 🐛 Bug Fixes
+
+- **[client]**
+ - subtable description overlapping with add new button ([#6646](https://github.com/nocobase/nocobase/pull/6646)) by @katherinehhh
+
+ - dashed underline caused by horizontal form layout in modal ([#6639](https://github.com/nocobase/nocobase/pull/6639)) by @katherinehhh
+
+- **[File storage: S3(Pro)]** Fix missing await for next call. by @jiannx
+
+- **[Email manager]** Fix missing await for next call. by @jiannx
+
+## [v1.6.17](https://github.com/nocobase/nocobase/compare/v1.6.16...v1.6.17) - 2025-04-09
+
+### 🚀 Improvements
+
+- **[utils]** Add duration extension for dayjs ([#6630](https://github.com/nocobase/nocobase/pull/6630)) by @mytharcher
+
+- **[client]**
+ - Support to search field in Filter component ([#6627](https://github.com/nocobase/nocobase/pull/6627)) by @mytharcher
+
+ - Add `trim` API for `Input` and `Variable.TextArea` ([#6624](https://github.com/nocobase/nocobase/pull/6624)) by @mytharcher
+
+- **[Error handler]** Support custom title in AppError component. ([#6409](https://github.com/nocobase/nocobase/pull/6409)) by @sheldon66
+
+- **[IP restriction]** Update IP restriction message content. by @sheldon66
+
+- **[File storage: S3(Pro)]** Support global variables in storage configuration by @mytharcher
+
+### 🐛 Bug Fixes
+
+- **[client]**
+ - rule with 'any' condition does not take effect when condition list is empty ([#6628](https://github.com/nocobase/nocobase/pull/6628)) by @katherinehhh
+
+ - data issue with Gantt block in tree collection ([#6617](https://github.com/nocobase/nocobase/pull/6617)) by @katherinehhh
+
+ - The relationship fields in the filter form report an error after the page is refreshed because x-data-source is not carried ([#6619](https://github.com/nocobase/nocobase/pull/6619)) by @zhangzhonghe
+
+ - variable parse failure when URL parameters contain Chinese characters ([#6618](https://github.com/nocobase/nocobase/pull/6618)) by @katherinehhh
+
+- **[Users]** Issue with parsing the user profile form schema ([#6635](https://github.com/nocobase/nocobase/pull/6635)) by @2013xile
+
+- **[Mobile]** single-select field with 'contains' filter on mobile does not support multiple selection ([#6629](https://github.com/nocobase/nocobase/pull/6629)) by @katherinehhh
+
+- **[Action: Export records]** missing filter params when exporting data after changing pagination ([#6633](https://github.com/nocobase/nocobase/pull/6633)) by @katherinehhh
+
+- **[Email manager]** fix email management permission cannot view email list by @jiannx
+
+- **[File storage: S3(Pro)]** Throw error to user when upload logo to S3 Pro storage (set to default) by @mytharcher
+
+- **[Workflow: Approval]** Fix `updatedAt` changed after migration by @mytharcher
+
+- **[Migration manager]** migration log creation time is displayed incorrectly in some environments by @gchust
+
+## [v1.6.16](https://github.com/nocobase/nocobase/compare/v1.6.15...v1.6.16) - 2025-04-03
+
+### 🐛 Bug Fixes
+
+- **[client]**
+ - x-disabled property not taking effect on form fields ([#6610](https://github.com/nocobase/nocobase/pull/6610)) by @katherinehhh
+
+ - field label display issue to prevent truncation by colon ([#6599](https://github.com/nocobase/nocobase/pull/6599)) by @katherinehhh
+
+- **[database]** When deleting one-to-many records, both `filter` and `filterByTk` are passed and `filter` includes an association field, the `filterByTk` is ignored ([#6606](https://github.com/nocobase/nocobase/pull/6606)) by @2013xile
+
+## [v1.6.15](https://github.com/nocobase/nocobase/compare/v1.6.14...v1.6.15) - 2025-04-01
+
+### 🚀 Improvements
+
+- **[database]**
+ - Add trim option for text field ([#6603](https://github.com/nocobase/nocobase/pull/6603)) by @mytharcher
+
+ - Add trim option for string field ([#6565](https://github.com/nocobase/nocobase/pull/6565)) by @mytharcher
+
+- **[File manager]** Add trim option for text fields of storages collection ([#6604](https://github.com/nocobase/nocobase/pull/6604)) by @mytharcher
+
+- **[Workflow]** Improve code ([#6589](https://github.com/nocobase/nocobase/pull/6589)) by @mytharcher
+
+- **[Workflow: Approval]** Support to use block template for approval process form by @mytharcher
+
+### 🐛 Bug Fixes
+
+- **[database]** Avoid "datetimeNoTz" field changes when value not changed in updating record ([#6588](https://github.com/nocobase/nocobase/pull/6588)) by @mytharcher
+
+- **[client]**
+ - association field (select) displaying N/A when exposing related collection fields ([#6582](https://github.com/nocobase/nocobase/pull/6582)) by @katherinehhh
+
+ - Fix `disabled` property not works when `SchemaInitializerItem` has `items` ([#6597](https://github.com/nocobase/nocobase/pull/6597)) by @mytharcher
+
+ - cascade issue: 'The value of xxx cannot be in array format' when deleting and re-selecting ([#6585](https://github.com/nocobase/nocobase/pull/6585)) by @katherinehhh
+
+- **[Collection field: Many to many (array)]** Issue of filtering by fields in an association collection with a many to many (array) field ([#6596](https://github.com/nocobase/nocobase/pull/6596)) by @2013xile
+
+- **[Public forms]** View permissions include list and get ([#6607](https://github.com/nocobase/nocobase/pull/6607)) by @chenos
+
+- **[Authentication]** token assignment in `AuthProvider` ([#6593](https://github.com/nocobase/nocobase/pull/6593)) by @2013xile
+
+- **[Workflow]** Fix sync option display incorrectly ([#6595](https://github.com/nocobase/nocobase/pull/6595)) by @mytharcher
+
+- **[Block: Map]** map management validation should not pass with space input ([#6575](https://github.com/nocobase/nocobase/pull/6575)) by @katherinehhh
+
+- **[Workflow: Approval]**
+ - Fix client variables to use in approval form by @mytharcher
+
+ - Fix branch mode when `endOnReject` configured as `true` by @mytharcher
+
+## [v1.6.14](https://github.com/nocobase/nocobase/compare/v1.6.13...v1.6.14) - 2025-03-29
+
+### 🐛 Bug Fixes
+
+- **[Calendar]** missing data on boundary dates in weekly calendar view ([#6587](https://github.com/nocobase/nocobase/pull/6587)) by @katherinehhh
+
+- **[Auth: OIDC]** Incorrect redirection occurs when the callback path is the string 'null' by @2013xile
+
+- **[Workflow: Approval]** Fix approval node configuration is incorrect after schema changed by @mytharcher
+
+## [v1.6.13](https://github.com/nocobase/nocobase/compare/v1.6.12...v1.6.13) - 2025-03-28
+
+### 🚀 Improvements
+
+- **[Async task manager]** optimize import/export buttons in Pro ([#6531](https://github.com/nocobase/nocobase/pull/6531)) by @chenos
+
+- **[Action: Export records Pro]** optimize import/export buttons in Pro by @katherinehhh
+
+- **[Migration manager]** allow skip automatic backup and restore for migration by @gchust
+
+### 🐛 Bug Fixes
+
+- **[client]** linkage conflict between same-named association fields in different sub-tables within the same form ([#6577](https://github.com/nocobase/nocobase/pull/6577)) by @katherinehhh
+
+- **[Action: Batch edit]** Click the batch edit button, configure the pop-up window, and then open it again, the pop-up window is blank ([#6578](https://github.com/nocobase/nocobase/pull/6578)) by @zhangzhonghe
+
+## [v1.6.12](https://github.com/nocobase/nocobase/compare/v1.6.11...v1.6.12) - 2025-03-27
+
+### 🐛 Bug Fixes
+
+- **[Block: Multi-step form]**
+ - the submit button has the same color in its default and highlighted by @jiannx
+
+ - fixed the bug that form reset is invalid when the field is associated with other field by @jiannx
+
+- **[Workflow: Approval]** Fix approval form values to submit by @mytharcher
+
+## [v1.6.11](https://github.com/nocobase/nocobase/compare/v1.6.10...v1.6.11) - 2025-03-27
+
+### 🚀 Improvements
+
+- **[client]**
+ - Optimize 502 error message ([#6547](https://github.com/nocobase/nocobase/pull/6547)) by @chenos
+
+ - Only support plain text file to preview ([#6563](https://github.com/nocobase/nocobase/pull/6563)) by @mytharcher
+
+- **[Collection field: Sequence]** support setting sequence as the title field for calendar block ([#6562](https://github.com/nocobase/nocobase/pull/6562)) by @katherinehhh
+
+- **[Workflow: Approval]** Support to skip validator in settings by @mytharcher
+
+### 🐛 Bug Fixes
+
+- **[client]**
+ - issue with date field display in data scope filtering ([#6564](https://github.com/nocobase/nocobase/pull/6564)) by @katherinehhh
+
+ - The 'Ellipsis overflow content' option requires a page refresh for the toggle state to take effect ([#6520](https://github.com/nocobase/nocobase/pull/6520)) by @zhangzhonghe
+
+ - Unable to open another modal within a modal ([#6535](https://github.com/nocobase/nocobase/pull/6535)) by @zhangzhonghe
+
+- **[API documentation]** API document page cannot scroll ([#6566](https://github.com/nocobase/nocobase/pull/6566)) by @zhangzhonghe
+
+- **[Workflow]** Make sure workflow key is generated before save ([#6567](https://github.com/nocobase/nocobase/pull/6567)) by @mytharcher
+
+- **[Workflow: Post-action event]** Multiple records in bulk action should trigger multiple times ([#6559](https://github.com/nocobase/nocobase/pull/6559)) by @mytharcher
+
+- **[Authentication]** Localization issue for fields of sign up page ([#6556](https://github.com/nocobase/nocobase/pull/6556)) by @2013xile
+
+- **[Public forms]** issue with public form page title displaying 'Loading...' ([#6569](https://github.com/nocobase/nocobase/pull/6569)) by @katherinehhh
+
+## [v1.6.10](https://github.com/nocobase/nocobase/compare/v1.6.9...v1.6.10) - 2025-03-25
+
+### 🐛 Bug Fixes
+
+- **[client]**
+ - Unable to use 'Current User' variable when adding a link page ([#6536](https://github.com/nocobase/nocobase/pull/6536)) by @zhangzhonghe
+
+ - field assignment with null value is ineffective ([#6549](https://github.com/nocobase/nocobase/pull/6549)) by @katherinehhh
+
+ - `yarn doc` command error ([#6540](https://github.com/nocobase/nocobase/pull/6540)) by @gchust
+
+ - Remove the 'Allow multiple selection' option from dropdown single-select fields in filter forms ([#6515](https://github.com/nocobase/nocobase/pull/6515)) by @zhangzhonghe
+
+ - Relational field's data range linkage is not effective ([#6530](https://github.com/nocobase/nocobase/pull/6530)) by @zhangzhonghe
+
+- **[Collection: Tree]** Migration issue for plugin-collection-tree ([#6537](https://github.com/nocobase/nocobase/pull/6537)) by @2013xile
+
+- **[Action: Custom request]** Unable to download UTF-8 encoded files ([#6541](https://github.com/nocobase/nocobase/pull/6541)) by @2013xile
+
+## [v1.6.9](https://github.com/nocobase/nocobase/compare/v1.6.8...v1.6.9) - 2025-03-23
+
+### 🐛 Bug Fixes
+
+- **[client]** action button transparency causing setting display issue on hover ([#6529](https://github.com/nocobase/nocobase/pull/6529)) by @katherinehhh
+
+## [v1.6.8](https://github.com/nocobase/nocobase/compare/v1.6.7...v1.6.8) - 2025-03-22
+
+### 🐛 Bug Fixes
+
+- **[server]** The upgrade command may cause workflow errors ([#6524](https://github.com/nocobase/nocobase/pull/6524)) by @gchust
+
+- **[client]** the height of the subtable in the form is set along with the form height ([#6518](https://github.com/nocobase/nocobase/pull/6518)) by @katherinehhh
+
+- **[Authentication]**
+ - X-Authenticator missing ([#6526](https://github.com/nocobase/nocobase/pull/6526)) by @chenos
+
+ - Trim authenticator options ([#6527](https://github.com/nocobase/nocobase/pull/6527)) by @2013xile
+
+- **[Block: Map]** map block key management issue causing request failures due to invisible characters ([#6521](https://github.com/nocobase/nocobase/pull/6521)) by @katherinehhh
+
+- **[Backup manager]** Restoration may cause workflow execution errors by @gchust
+
+- **[WeCom]** Resolve environment variables and secrets when retrieving notification configuration. by @2013xile
+
+## [v1.6.7](https://github.com/nocobase/nocobase/compare/v1.6.6...v1.6.7) - 2025-03-20
+
+### 🚀 Improvements
+
+- **[Workflow: mailer node]** Add secure field config description. ([#6510](https://github.com/nocobase/nocobase/pull/6510)) by @sheldon66
+
+- **[Notification: Email]** Add secure field config description. ([#6501](https://github.com/nocobase/nocobase/pull/6501)) by @sheldon66
+
+- **[Calendar]** Calendar plugin with optional settings to enable or disable quick event creation ([#6391](https://github.com/nocobase/nocobase/pull/6391)) by @Cyx649312038
+
+### 🐛 Bug Fixes
+
+- **[client]** time field submission error in Chinese locale (invalid input syntax for type time) ([#6511](https://github.com/nocobase/nocobase/pull/6511)) by @katherinehhh
+
+- **[File manager]** Unable to access files stored in COS ([#6512](https://github.com/nocobase/nocobase/pull/6512)) by @chenos
+
+- **[Block: Map]** secret key fields not triggering validation in map management ([#6509](https://github.com/nocobase/nocobase/pull/6509)) by @katherinehhh
+
+- **[WEB client]** The path in the route management table is different from the actual path ([#6483](https://github.com/nocobase/nocobase/pull/6483)) by @zhangzhonghe
+
+- **[Action: Export records Pro]** Unable to export attachments by @chenos
+
+- **[Workflow: Approval]**
+ - Fix null user caused crash by @mytharcher
+
+ - Fix error thrown when add query node result by @mytharcher
+
## [v1.6.6](https://github.com/nocobase/nocobase/compare/v1.6.5...v1.6.6) - 2025-03-18
### 🎉 New Features
diff --git a/CHANGELOG.zh-CN.md b/CHANGELOG.zh-CN.md
index 5861cd0756..7bb43bdfb4 100644
--- a/CHANGELOG.zh-CN.md
+++ b/CHANGELOG.zh-CN.md
@@ -5,6 +5,297 @@
格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/),
并且本项目遵循 [语义化版本](https://semver.org/spec/v2.0.0.html)。
+## [v1.6.20](https://github.com/nocobase/nocobase/compare/v1.6.19...v1.6.20) - 2025-04-14
+
+### 🎉 新特性
+
+- **[部门]** 商业插件部门、附件 URL、工作流响应消息改为免费提供 ([#6663](https://github.com/nocobase/nocobase/pull/6663)) by @chenos
+
+### 🐛 修复
+
+- **[client]**
+ - 筛选表单不应该显示“未保存修改”提示 ([#6657](https://github.com/nocobase/nocobase/pull/6657)) by @zhangzhonghe
+
+ - 筛选表单中关系字段的“允许多选”设置项不生效 ([#6661](https://github.com/nocobase/nocobase/pull/6661)) by @katherinehhh
+
+ - 筛选表单中,当点击筛选按钮时,如果有字段未校验通过,依然会触发筛选的问题 ([#6659](https://github.com/nocobase/nocobase/pull/6659)) by @zhangzhonghe
+
+ - 切换到分组菜单时,不应该跳转到已经在菜单中被隐藏的页面 ([#6654](https://github.com/nocobase/nocobase/pull/6654)) by @zhangzhonghe
+
+- **[文件存储:S3 (Pro)]**
+ - 整理语言文案 by @jiannx
+
+ - baseurl 和 public 设置不再互相关联,改进 S3 pro 存储的配置交互体验 by @jiannx
+
+- **[迁移管理]** 迁移时若弹出环境变量弹窗,跳过自动备份选项会失效 by @gchust
+
+## [v1.6.19](https://github.com/nocobase/nocobase/compare/v1.6.18...v1.6.19) - 2025-04-14
+
+### 🐛 修复
+
+- **[client]**
+ - 修复预览图片被遮挡的问题 ([#6651](https://github.com/nocobase/nocobase/pull/6651)) by @zhangzhonghe
+
+ - 表单区块中,字段配置的默认值会先显示为原始变量字符串然后再消失 ([#6649](https://github.com/nocobase/nocobase/pull/6649)) by @zhangzhonghe
+
+## [v1.6.18](https://github.com/nocobase/nocobase/compare/v1.6.17...v1.6.18) - 2025-04-11
+
+### 🚀 优化
+
+- **[client]**
+ - 为 `Variable.Input` 组件增加默认退避类型的 API ([#6644](https://github.com/nocobase/nocobase/pull/6644)) by @mytharcher
+
+ - 优化未配置页面时的提示 ([#6641](https://github.com/nocobase/nocobase/pull/6641)) by @zhangzhonghe
+
+- **[工作流:延时节点]** 支持延迟时间使用变量 ([#6621](https://github.com/nocobase/nocobase/pull/6621)) by @mytharcher
+
+- **[工作流:自定义操作事件]** 为触发工作流按钮增加刷新配置项 by @mytharcher
+
+### 🐛 修复
+
+- **[client]**
+ - 子表格中描述信息与操作按钮遮挡 ([#6646](https://github.com/nocobase/nocobase/pull/6646)) by @katherinehhh
+
+ - 弹窗表单在 horizontal 布局下初始宽度计算错误,导致出现提示和 下划虚线 ([#6639](https://github.com/nocobase/nocobase/pull/6639)) by @katherinehhh
+
+- **[文件存储:S3 (Pro)]** 修复next调用缺少await by @jiannx
+
+- **[邮件管理]** 修复next调用缺少await by @jiannx
+
+## [v1.6.17](https://github.com/nocobase/nocobase/compare/v1.6.16...v1.6.17) - 2025-04-09
+
+### 🚀 优化
+
+- **[utils]** 为 dayjs 包增加时长扩展 ([#6630](https://github.com/nocobase/nocobase/pull/6630)) by @mytharcher
+
+- **[client]**
+ - 支持筛选组件中对字段进行搜索 ([#6627](https://github.com/nocobase/nocobase/pull/6627)) by @mytharcher
+
+ - 为 `Input` 和 `Variable.TextArea` 组件增加 `trim` API ([#6624](https://github.com/nocobase/nocobase/pull/6624)) by @mytharcher
+
+- **[错误处理器]** 在 AppError 组件中支持自定义标题。 ([#6409](https://github.com/nocobase/nocobase/pull/6409)) by @sheldon66
+
+- **[IP 限制]** 更新 IP 限制消息内容。 by @sheldon66
+
+- **[文件存储:S3 (Pro)]** 支持存储引擎的配置中使用全局变量 by @mytharcher
+
+### 🐛 修复
+
+- **[client]**
+ - 联动规则条件设置为任意且无条件内容时属性设置不生效 ([#6628](https://github.com/nocobase/nocobase/pull/6628)) by @katherinehhh
+
+ - 树表使用甘特图区块时数据显示异常 ([#6617](https://github.com/nocobase/nocobase/pull/6617)) by @katherinehhh
+
+ - 筛选表单中的关系字段在刷新页面后,由于没有携带 x-data-source 而报错 ([#6619](https://github.com/nocobase/nocobase/pull/6619)) by @zhangzhonghe
+
+ - 链接中中文参数变量值解析失败 ([#6618](https://github.com/nocobase/nocobase/pull/6618)) by @katherinehhh
+
+- **[用户]** 用户个人资料表单 schema 的解析问题 ([#6635](https://github.com/nocobase/nocobase/pull/6635)) by @2013xile
+
+- **[移动端]** 下拉单选字段在移动端设置筛选符为包含时组件未支持多选 ([#6629](https://github.com/nocobase/nocobase/pull/6629)) by @katherinehhh
+
+- **[操作:导出记录]** 筛选数据后切换分页再导出时筛选参数丢失 ([#6633](https://github.com/nocobase/nocobase/pull/6633)) by @katherinehhh
+
+- **[邮件管理]** 邮件管理权限无法查看邮件列表 by @jiannx
+
+- **[文件存储:S3 (Pro)]** 当用户上传 logo 失败时提示错误(设置为默认存储的 S3 Pro) by @mytharcher
+
+- **[工作流:审批]** 修复更新时间在迁移后变化 by @mytharcher
+
+- **[迁移管理]** 部分服务器环境下迁移日志创建日期显示不正确 by @gchust
+
+## [v1.6.16](https://github.com/nocobase/nocobase/compare/v1.6.15...v1.6.16) - 2025-04-03
+
+### 🐛 修复
+
+- **[client]**
+ - 表单字段设置不可编辑不起作用 ([#6610](https://github.com/nocobase/nocobase/pull/6610)) by @katherinehhh
+
+ - 表单字段标题因冒号导致的截断问题 ([#6599](https://github.com/nocobase/nocobase/pull/6599)) by @katherinehhh
+
+- **[database]** 删除一对多记录时,同时传递 `filter` 和 `filterByTk` 参数,`filter` 包含关系字段时,`filterByTk` 参数失效 ([#6606](https://github.com/nocobase/nocobase/pull/6606)) by @2013xile
+
+## [v1.6.15](https://github.com/nocobase/nocobase/compare/v1.6.14...v1.6.15) - 2025-04-01
+
+### 🚀 优化
+
+- **[database]**
+ - 为多行文本类型字段增加去除首尾空白字符的选项 ([#6603](https://github.com/nocobase/nocobase/pull/6603)) by @mytharcher
+
+ - 为单行文本增加自动去除首尾空白字符的选项 ([#6565](https://github.com/nocobase/nocobase/pull/6565)) by @mytharcher
+
+- **[文件管理器]** 为存储引擎表的文本字段增加去除首尾空白字符的选项 ([#6604](https://github.com/nocobase/nocobase/pull/6604)) by @mytharcher
+
+- **[工作流]** 优化代码 ([#6589](https://github.com/nocobase/nocobase/pull/6589)) by @mytharcher
+
+- **[工作流:审批]** 支持审批表单使用区块模板 by @mytharcher
+
+### 🐛 修复
+
+- **[database]** 避免“日期时间(无时区)”字段在值未变动的更新时触发值改变 ([#6588](https://github.com/nocobase/nocobase/pull/6588)) by @mytharcher
+
+- **[client]**
+ - 关系字段(select)放出关系表字段时默认显示 N/A ([#6582](https://github.com/nocobase/nocobase/pull/6582)) by @katherinehhh
+
+ - 修复 `SchemaInitializerItem` 配置了 `items` 时 `disabled` 属性无效的问题 ([#6597](https://github.com/nocobase/nocobase/pull/6597)) by @mytharcher
+
+ - 级联组件删除后重新选择时出现 'The value of xxx cannot be in array format' ([#6585](https://github.com/nocobase/nocobase/pull/6585)) by @katherinehhh
+
+- **[数据表字段:多对多 (数组)]** 主表筛选带有多对多(数组)字段的关联表中的字段报错的问题 ([#6596](https://github.com/nocobase/nocobase/pull/6596)) by @2013xile
+
+- **[公开表单]** 查看权限包括 list 和 get ([#6607](https://github.com/nocobase/nocobase/pull/6607)) by @chenos
+
+- **[用户认证]** `AuthProvider` 中的 token 赋值 ([#6593](https://github.com/nocobase/nocobase/pull/6593)) by @2013xile
+
+- **[工作流]** 修复同步选项展示问题 ([#6595](https://github.com/nocobase/nocobase/pull/6595)) by @mytharcher
+
+- **[区块:地图]** 地图管理必填校验不应通过空格输入 ([#6575](https://github.com/nocobase/nocobase/pull/6575)) by @katherinehhh
+
+- **[工作流:审批]**
+ - 修复审批表单中的前端变量 by @mytharcher
+
+ - 修复分支模式下配置拒绝则结束时的流程问题 by @mytharcher
+
+## [v1.6.14](https://github.com/nocobase/nocobase/compare/v1.6.13...v1.6.14) - 2025-03-29
+
+### 🐛 修复
+
+- **[日历]** 日历区块以周为视图时,边界日期不显示数据 ([#6587](https://github.com/nocobase/nocobase/pull/6587)) by @katherinehhh
+
+- **[认证:OIDC]** 回调路径是字符串'null'时导致跳转不正确 by @2013xile
+
+- **[工作流:审批]** 修复审批节点界面配置变更后数据未同步的问题 by @mytharcher
+
+## [v1.6.13](https://github.com/nocobase/nocobase/compare/v1.6.12...v1.6.13) - 2025-03-28
+
+### 🚀 优化
+
+- **[异步任务管理器]** 优化 Pro 导入导出按钮异步逻辑 ([#6531](https://github.com/nocobase/nocobase/pull/6531)) by @chenos
+
+- **[操作:导出记录 Pro]** 优化 Pro 导入导出按钮 by @katherinehhh
+
+- **[迁移管理]** 允许执行迁移时跳过自动备份还原 by @gchust
+
+### 🐛 修复
+
+- **[client]** 同一表单中不同关系字段的同名关系字段的联动互相影响 ([#6577](https://github.com/nocobase/nocobase/pull/6577)) by @katherinehhh
+
+- **[操作:批量编辑]** 点击批量编辑按钮,配置完弹窗再打开,弹窗是空白的 ([#6578](https://github.com/nocobase/nocobase/pull/6578)) by @zhangzhonghe
+
+## [v1.6.12](https://github.com/nocobase/nocobase/compare/v1.6.11...v1.6.12) - 2025-03-27
+
+### 🐛 修复
+
+- **[区块:分步表单]**
+ - 提交按钮默认和高亮情况下颜色一样 by @jiannx
+
+ - 修复当字段与其他表单字段存在关联时,表单重置无效 by @jiannx
+
+- **[工作流:审批]** 修复审批表单提交值的问题 by @mytharcher
+
+## [v1.6.11](https://github.com/nocobase/nocobase/compare/v1.6.10...v1.6.11) - 2025-03-27
+
+### 🚀 优化
+
+- **[client]**
+ - 优化 502 错误提示 ([#6547](https://github.com/nocobase/nocobase/pull/6547)) by @chenos
+
+ - 仅支持纯文本文件预览 ([#6563](https://github.com/nocobase/nocobase/pull/6563)) by @mytharcher
+
+- **[数据表字段:自动编码]** 支持使用 sequence 作为日历区块的标题字段 ([#6562](https://github.com/nocobase/nocobase/pull/6562)) by @katherinehhh
+
+- **[工作流:审批]** 支持审批处理按钮跳过表单验证的设置 by @mytharcher
+
+### 🐛 修复
+
+- **[client]**
+ - 数据范围中筛选日期字段显示异常 ([#6564](https://github.com/nocobase/nocobase/pull/6564)) by @katherinehhh
+
+ - 选项“省略超出长度的内容”需要刷新页面,开关的状态才生效 ([#6520](https://github.com/nocobase/nocobase/pull/6520)) by @zhangzhonghe
+
+ - 在弹窗中无法再次打开弹窗 ([#6535](https://github.com/nocobase/nocobase/pull/6535)) by @zhangzhonghe
+
+- **[API 文档]** API 文档页面不能滚动 ([#6566](https://github.com/nocobase/nocobase/pull/6566)) by @zhangzhonghe
+
+- **[工作流]** 确保创建工作流之前 key 已生成 ([#6567](https://github.com/nocobase/nocobase/pull/6567)) by @mytharcher
+
+- **[工作流:操作后事件]** 多行记录的批量操作需要触发多次 ([#6559](https://github.com/nocobase/nocobase/pull/6559)) by @mytharcher
+
+- **[用户认证]** 注册页面字段的本地化问题 ([#6556](https://github.com/nocobase/nocobase/pull/6556)) by @2013xile
+
+- **[公开表单]** 公开表单页面标题不应该显示 Loading... ([#6569](https://github.com/nocobase/nocobase/pull/6569)) by @katherinehhh
+
+## [v1.6.10](https://github.com/nocobase/nocobase/compare/v1.6.9...v1.6.10) - 2025-03-25
+
+### 🐛 修复
+
+- **[client]**
+ - 添加链接页面时,无法使用“当前用户”变量 ([#6536](https://github.com/nocobase/nocobase/pull/6536)) by @zhangzhonghe
+
+ - 字段赋值对字段进行“空值”赋值无效 ([#6549](https://github.com/nocobase/nocobase/pull/6549)) by @katherinehhh
+
+ - `yarn doc` 命令报错 ([#6540](https://github.com/nocobase/nocobase/pull/6540)) by @gchust
+
+ - 筛选表单中,移除下拉单选字段的“允许多选”选项 ([#6515](https://github.com/nocobase/nocobase/pull/6515)) by @zhangzhonghe
+
+ - 关系字段的数据范围联动不生效 ([#6530](https://github.com/nocobase/nocobase/pull/6530)) by @zhangzhonghe
+
+- **[数据表:树]** 树表插件的迁移脚本问题 ([#6537](https://github.com/nocobase/nocobase/pull/6537)) by @2013xile
+
+- **[操作:自定义请求]** 无法下载utf8编码的文件 ([#6541](https://github.com/nocobase/nocobase/pull/6541)) by @2013xile
+
+## [v1.6.9](https://github.com/nocobase/nocobase/compare/v1.6.8...v1.6.9) - 2025-03-23
+
+### 🐛 修复
+
+- **[client]** 操作按钮透明状态导致 hover 时按钮 setting 显示异常 ([#6529](https://github.com/nocobase/nocobase/pull/6529)) by @katherinehhh
+
+## [v1.6.8](https://github.com/nocobase/nocobase/compare/v1.6.7...v1.6.8) - 2025-03-22
+
+### 🐛 修复
+
+- **[server]** Upgrade 命令可能造成工作流报错 ([#6524](https://github.com/nocobase/nocobase/pull/6524)) by @gchust
+
+- **[client]** 表单中的子表格高度会随主表单高度一同设置 ([#6518](https://github.com/nocobase/nocobase/pull/6518)) by @katherinehhh
+
+- **[用户认证]**
+ - X-Authenticator 缺失 ([#6526](https://github.com/nocobase/nocobase/pull/6526)) by @chenos
+
+ - 移除认证器配置项前后的空格、换行符 ([#6527](https://github.com/nocobase/nocobase/pull/6527)) by @2013xile
+
+- **[区块:地图]** 地图区块 密钥管理中不可见字符导致的密钥请求失败的问题 ([#6521](https://github.com/nocobase/nocobase/pull/6521)) by @katherinehhh
+
+- **[备份管理器]** 还原过程中可能引起工作流执行报错 by @gchust
+
+- **[企业微信]** 获取通知配置时需要解析环境变量和密钥 by @2013xile
+
+## [v1.6.7](https://github.com/nocobase/nocobase/compare/v1.6.6...v1.6.7) - 2025-03-20
+
+### 🚀 优化
+
+- **[工作流:邮件发送节点]** 增加安全字段配置描述。 ([#6510](https://github.com/nocobase/nocobase/pull/6510)) by @sheldon66
+
+- **[通知:电子邮件]** 增加安全字段配置描述。 ([#6501](https://github.com/nocobase/nocobase/pull/6501)) by @sheldon66
+
+- **[日历]** 日历插件添加开启或关闭快速创建事件可选设置 ([#6391](https://github.com/nocobase/nocobase/pull/6391)) by @Cyx649312038
+
+### 🐛 修复
+
+- **[client]** 时间字段在中文语言下提交时报错 invalid input syntax for type time ([#6511](https://github.com/nocobase/nocobase/pull/6511)) by @katherinehhh
+
+- **[文件管理器]** COS 存储的文件无法访问 ([#6512](https://github.com/nocobase/nocobase/pull/6512)) by @chenos
+
+- **[区块:地图]** 地图管理中密钥必填校验失败 ([#6509](https://github.com/nocobase/nocobase/pull/6509)) by @katherinehhh
+
+- **[WEB 客户端]** 路由管理表格中的路径与实际路径不一样 ([#6483](https://github.com/nocobase/nocobase/pull/6483)) by @zhangzhonghe
+
+- **[操作:导出记录 Pro]** 无法导出附件 by @chenos
+
+- **[工作流:审批]**
+ - 修复空用户造成页面崩溃 by @mytharcher
+
+ - 修复审批人界面配置添加查询节点时的页面崩溃 by @mytharcher
+
## [v1.6.6](https://github.com/nocobase/nocobase/compare/v1.6.5...v1.6.6) - 2025-03-18
### 🎉 新特性
diff --git a/LICENSE.txt b/LICENSE.txt
index b3c87c1e83..babf2bf053 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -1,4 +1,4 @@
-Updated Date: February 20, 2025
+Updated Date: April 1, 2025
NocoBase License Agreement
@@ -88,7 +88,7 @@ Except for Third-Party Open Source Software, the Company owns all copyrights, tr
6.6 Can sell plugins developed for Software in the Marketplace.
-6.7 The User with an Enterprise Edition License can sell Upper Layer Application to their clients.
+6.7 The User with a Professional or Enterprise Edition License can sell Upper Layer Application to their clients.
6.8 Not restricted by the AGPL-3.0 agreement.
@@ -106,9 +106,9 @@ Except for Third-Party Open Source Software, the Company owns all copyrights, tr
7.4 It is not allowed to provide any form of no-code, zero-code, low-code platform SaaS products to the public using the original or modified Software.
-7.5 It is not allowed for the User withot an Enterprise Edition license to sell Upper Layer Application to clients without a Commercial license.
+7.5 It is not allowed for the User withot a Professional or Enterprise Edition license to sell Upper Layer Application to clients without a Commercial license.
-7.6 It is not allowed for the User with an Enterprise Edition license to sell Upper Layer Application to clients without a Commercial license with access to further development and configuration.
+7.6 It is not allowed for the User with a Professional or Enterprise Edition license to sell Upper Layer Application to clients without a Commercial license with access to further development and configuration.
7.7 It is not allowed to publicly sell plugins developed for Software outside of the Marketplace.
diff --git a/README.ja-JP.md b/README.ja-JP.md
index 2fff33bddd..49e5c1be42 100644
--- a/README.ja-JP.md
+++ b/README.ja-JP.md
@@ -2,14 +2,10 @@
https://github.com/user-attachments/assets/cf08bfe5-e6e6-453c-8b96-350a6a8bed17
-## ご協力ありがとうございます!
+
-
-
-## リリースノート
-
-リリースノートは[ブログ](https://www.nocobase.com/ja/blog/timeline)で随時更新され、週ごとにまとめて公開しています。
+
## NocoBaseはなに?
@@ -28,6 +24,16 @@ https://docs-cn.nocobase.com/
コミュニティ:
https://forum.nocobase.com/
+チュートリアル:
+https://www.nocobase.com/ja/tutorials
+
+顧客のストーリー:
+https://www.nocobase.com/ja/blog/tags/customer-stories
+
+## リリースノート
+
+リリースノートは[ブログ](https://www.nocobase.com/ja/blog/timeline)で随時更新され、週ごとにまとめて公開しています。
+
## 他の製品との違い
### 1. データモデル駆動
diff --git a/README.md b/README.md
index 1314bec051..a2cfdb2bc4 100644
--- a/README.md
+++ b/README.md
@@ -2,19 +2,14 @@ English | [中文](./README.zh-CN.md) | [日本語](./README.ja-JP.md)
https://github.com/user-attachments/assets/a50c100a-4561-4e06-b2d2-d48098659ec0
-## We'd love your support!
-
+
-
-
-## Release Notes
-
-Our [blog](https://www.nocobase.com/en/blog/timeline) is regularly updated with release notes and provides a weekly summary.
+
## What is NocoBase
-NocoBase is a scalability-first, open-source no-code development platform.
+NocoBase is an extensibility-first, open-source no-code development platform.
Instead of investing years of time and millions of dollars in research and development, deploy NocoBase in a few minutes and you'll have a private, controllable, and extremely scalable no-code development platform!
Homepage:
@@ -29,6 +24,17 @@ https://docs.nocobase.com/
Forum:
https://forum.nocobase.com/
+Tutorials:
+https://www.nocobase.com/en/tutorials
+
+Use Cases:
+https://www.nocobase.com/en/blog/tags/customer-stories
+
+
+## Release Notes
+
+Our [blog](https://www.nocobase.com/en/blog/timeline) is regularly updated with release notes and provides a weekly summary.
+
## Distinctive features
### 1. Data model-driven
diff --git a/README.zh-CN.md b/README.zh-CN.md
index 66e9c281d7..728695efc7 100644
--- a/README.zh-CN.md
+++ b/README.zh-CN.md
@@ -2,13 +2,10 @@
https://github.com/nocobase/nocobase/assets/1267426/29623e45-9a48-4598-bb9e-9dd173ade553
-## 感谢支持
+
-
-
-## 发布日志
-我们的[博客](https://www.nocobase.com/cn/blog/timeline)会及时更新发布日志,并每周进行汇总。
+
## NocoBase 是什么
@@ -27,6 +24,15 @@ https://docs-cn.nocobase.com/
社区:
https://forum.nocobase.com/
+教程:
+https://www.nocobase.com/cn/tutorials
+
+用户故事:
+https://www.nocobase.com/cn/blog/tags/customer-stories
+
+## 发布日志
+我们的[博客](https://www.nocobase.com/cn/blog/timeline)会及时更新发布日志,并每周进行汇总。
+
## 与众不同之处
### 1. 数据模型驱动
diff --git a/lerna.json b/lerna.json
index 9f7e584b89..1c020ae68f 100644
--- a/lerna.json
+++ b/lerna.json
@@ -1,5 +1,5 @@
{
- "version": "1.6.6",
+ "version": "1.6.20",
"npmClient": "yarn",
"useWorkspaces": true,
"npmClientArgs": ["--ignore-engines"],
diff --git a/packages/core/acl/package.json b/packages/core/acl/package.json
index 14318a4306..fd51012a13 100644
--- a/packages/core/acl/package.json
+++ b/packages/core/acl/package.json
@@ -1,13 +1,13 @@
{
"name": "@nocobase/acl",
- "version": "1.6.6",
+ "version": "1.6.20",
"description": "",
"license": "AGPL-3.0",
"main": "./lib/index.js",
"types": "./lib/index.d.ts",
"dependencies": {
- "@nocobase/resourcer": "1.6.6",
- "@nocobase/utils": "1.6.6",
+ "@nocobase/resourcer": "1.6.20",
+ "@nocobase/utils": "1.6.20",
"minimatch": "^5.1.1"
},
"repository": {
diff --git a/packages/core/actions/package.json b/packages/core/actions/package.json
index 76f69b1c68..bea716ae5b 100644
--- a/packages/core/actions/package.json
+++ b/packages/core/actions/package.json
@@ -1,14 +1,14 @@
{
"name": "@nocobase/actions",
- "version": "1.6.6",
+ "version": "1.6.20",
"description": "",
"license": "AGPL-3.0",
"main": "./lib/index.js",
"types": "./lib/index.d.ts",
"dependencies": {
- "@nocobase/cache": "1.6.6",
- "@nocobase/database": "1.6.6",
- "@nocobase/resourcer": "1.6.6"
+ "@nocobase/cache": "1.6.20",
+ "@nocobase/database": "1.6.20",
+ "@nocobase/resourcer": "1.6.20"
},
"repository": {
"type": "git",
diff --git a/packages/core/app/package.json b/packages/core/app/package.json
index 6be8b6ecf7..bc58bcd6d0 100644
--- a/packages/core/app/package.json
+++ b/packages/core/app/package.json
@@ -1,17 +1,17 @@
{
"name": "@nocobase/app",
- "version": "1.6.6",
+ "version": "1.6.20",
"description": "",
"license": "AGPL-3.0",
"main": "./lib/index.js",
"types": "./lib/index.d.ts",
"dependencies": {
- "@nocobase/database": "1.6.6",
- "@nocobase/preset-nocobase": "1.6.6",
- "@nocobase/server": "1.6.6"
+ "@nocobase/database": "1.6.20",
+ "@nocobase/preset-nocobase": "1.6.20",
+ "@nocobase/server": "1.6.20"
},
"devDependencies": {
- "@nocobase/client": "1.6.6"
+ "@nocobase/client": "1.6.20"
},
"repository": {
"type": "git",
diff --git a/packages/core/app/src/__tests__/commands.test.ts b/packages/core/app/src/__tests__/commands.test.ts
index f300d4cbda..946df74d9c 100644
--- a/packages/core/app/src/__tests__/commands.test.ts
+++ b/packages/core/app/src/__tests__/commands.test.ts
@@ -7,7 +7,7 @@
* For more information, please refer to: https://www.nocobase.com/agreement.
*/
-import { mockDatabase } from '@nocobase/database';
+import { createMockDatabase, mockDatabase } from '@nocobase/database';
import { uid } from '@nocobase/utils';
import axios from 'axios';
import execa from 'execa';
@@ -64,7 +64,7 @@ const createDatabase = async () => {
if (process.env.DB_DIALECT === 'sqlite') {
return 'nocobase';
}
- const db = mockDatabase();
+ const db = await createMockDatabase();
const name = `d_${uid()}`;
await db.sequelize.query(`CREATE DATABASE ${name}`);
await db.close();
diff --git a/packages/core/auth/package.json b/packages/core/auth/package.json
index 8ecfb5bec7..41029ecf8f 100644
--- a/packages/core/auth/package.json
+++ b/packages/core/auth/package.json
@@ -1,16 +1,16 @@
{
"name": "@nocobase/auth",
- "version": "1.6.6",
+ "version": "1.6.20",
"description": "",
"license": "AGPL-3.0",
"main": "./lib/index.js",
"types": "./lib/index.d.ts",
"dependencies": {
- "@nocobase/actions": "1.6.6",
- "@nocobase/cache": "1.6.6",
- "@nocobase/database": "1.6.6",
- "@nocobase/resourcer": "1.6.6",
- "@nocobase/utils": "1.6.6",
+ "@nocobase/actions": "1.6.20",
+ "@nocobase/cache": "1.6.20",
+ "@nocobase/database": "1.6.20",
+ "@nocobase/resourcer": "1.6.20",
+ "@nocobase/utils": "1.6.20",
"@types/jsonwebtoken": "^8.5.8",
"jsonwebtoken": "^8.5.1"
},
diff --git a/packages/core/build/package.json b/packages/core/build/package.json
index cc0bbe18a1..42a41bce84 100644
--- a/packages/core/build/package.json
+++ b/packages/core/build/package.json
@@ -1,6 +1,6 @@
{
"name": "@nocobase/build",
- "version": "1.6.6",
+ "version": "1.6.20",
"description": "Library build tool based on rollup.",
"main": "lib/index.js",
"types": "./lib/index.d.ts",
@@ -17,7 +17,7 @@
"@lerna/project": "4.0.0",
"@rsbuild/plugin-babel": "^1.0.3",
"@rsdoctor/rspack-plugin": "^0.4.8",
- "@rspack/core": "1.1.1",
+ "@rspack/core": "1.3.2",
"@svgr/webpack": "^8.1.0",
"@types/gulp": "^4.0.13",
"@types/lerna__package": "5.1.0",
diff --git a/packages/core/build/src/buildPlugin.ts b/packages/core/build/src/buildPlugin.ts
index f851f37ed8..9b7f228072 100644
--- a/packages/core/build/src/buildPlugin.ts
+++ b/packages/core/build/src/buildPlugin.ts
@@ -347,6 +347,7 @@ export async function buildPluginClient(cwd: string, userConfig: UserConfig, sou
umdNamedDefine: true,
},
},
+ amd: {},
resolve: {
tsConfig: path.join(process.cwd(), 'tsconfig.json'),
extensions: ['.js', '.jsx', '.ts', '.tsx', '.json', '.less', '.css'],
diff --git a/packages/core/cache/package.json b/packages/core/cache/package.json
index b3158707d4..9a62423999 100644
--- a/packages/core/cache/package.json
+++ b/packages/core/cache/package.json
@@ -1,6 +1,6 @@
{
"name": "@nocobase/cache",
- "version": "1.6.6",
+ "version": "1.6.20",
"description": "",
"license": "AGPL-3.0",
"main": "./lib/index.js",
diff --git a/packages/core/cli/package.json b/packages/core/cli/package.json
index b0d32d7757..d4158c9467 100644
--- a/packages/core/cli/package.json
+++ b/packages/core/cli/package.json
@@ -1,6 +1,6 @@
{
"name": "@nocobase/cli",
- "version": "1.6.6",
+ "version": "1.6.20",
"description": "",
"license": "AGPL-3.0",
"main": "./src/index.js",
@@ -8,7 +8,7 @@
"nocobase": "./bin/index.js"
},
"dependencies": {
- "@nocobase/app": "1.6.6",
+ "@nocobase/app": "1.6.20",
"@types/fs-extra": "^11.0.1",
"@umijs/utils": "3.5.20",
"chalk": "^4.1.1",
@@ -25,7 +25,7 @@
"tsx": "^4.19.0"
},
"devDependencies": {
- "@nocobase/devtools": "1.6.6"
+ "@nocobase/devtools": "1.6.20"
},
"repository": {
"type": "git",
diff --git a/packages/core/cli/src/util.js b/packages/core/cli/src/util.js
index f48dbd4c1d..1c760cd4ba 100644
--- a/packages/core/cli/src/util.js
+++ b/packages/core/cli/src/util.js
@@ -460,6 +460,16 @@ exports.initEnv = function initEnv() {
process.env.SOCKET_PATH = generateGatewayPath();
fs.mkdirpSync(dirname(process.env.SOCKET_PATH), { force: true, recursive: true });
fs.mkdirpSync(process.env.PM2_HOME, { force: true, recursive: true });
+ const pkgs = [
+ '@nocobase/plugin-multi-app-manager',
+ '@nocobase/plugin-departments',
+ '@nocobase/plugin-field-attachment-url',
+ '@nocobase/plugin-workflow-response-message',
+ ];
+ for (const pkg of pkgs) {
+ const pkgDir = resolve(process.cwd(), 'storage/plugins', pkg);
+ fs.existsSync(pkgDir) && fs.rmdirSync(pkgDir, { recursive: true, force: true });
+ }
};
exports.generatePlugins = function () {
diff --git a/packages/core/client/package.json b/packages/core/client/package.json
index 79535b243b..38e0b87fe3 100644
--- a/packages/core/client/package.json
+++ b/packages/core/client/package.json
@@ -1,6 +1,6 @@
{
"name": "@nocobase/client",
- "version": "1.6.6",
+ "version": "1.6.20",
"license": "AGPL-3.0",
"main": "lib/index.js",
"module": "es/index.mjs",
@@ -27,9 +27,9 @@
"@formily/reactive-react": "^2.2.27",
"@formily/shared": "^2.2.27",
"@formily/validator": "^2.2.27",
- "@nocobase/evaluators": "1.6.6",
- "@nocobase/sdk": "1.6.6",
- "@nocobase/utils": "1.6.6",
+ "@nocobase/evaluators": "1.6.20",
+ "@nocobase/sdk": "1.6.20",
+ "@nocobase/utils": "1.6.20",
"ahooks": "^3.7.2",
"antd": "5.12.8",
"antd-style": "3.7.1",
diff --git a/packages/core/client/src/acl/ACLProvider.tsx b/packages/core/client/src/acl/ACLProvider.tsx
index 6dfa112361..09eaf964ad 100644
--- a/packages/core/client/src/acl/ACLProvider.tsx
+++ b/packages/core/client/src/acl/ACLProvider.tsx
@@ -74,6 +74,7 @@ export const ACLRolesCheckProvider = (props) => {
url: 'roles:check',
},
{
+ manual: !api.auth.token,
onSuccess(data) {
if (!data?.data?.snippets.includes('ui.*')) {
setDesignable(false);
diff --git a/packages/core/client/src/api-client/APIClient.ts b/packages/core/client/src/api-client/APIClient.ts
index 1cbbcdacdd..f85c766e10 100644
--- a/packages/core/client/src/api-client/APIClient.ts
+++ b/packages/core/client/src/api-client/APIClient.ts
@@ -139,7 +139,19 @@ export class APIClient extends APIClientSDK {
if (typeof error?.response?.data === 'string') {
const tempElement = document.createElement('div');
tempElement.innerHTML = error?.response?.data;
- return [{ message: tempElement.textContent || tempElement.innerText }];
+ let message = tempElement.textContent || tempElement.innerText;
+ if (message.includes('Error occurred while trying')) {
+ message = 'The application may be starting up. Please try again later.';
+ return [{ code: 'APP_WARNING', message }];
+ }
+ if (message.includes('502 Bad Gateway')) {
+ message = 'The application may be starting up. Please try again later.';
+ return [{ code: 'APP_WARNING', message }];
+ }
+ return [{ message }];
+ }
+ if (error?.response?.data?.error) {
+ return [error?.response?.data?.error];
}
return (
error?.response?.data?.errors ||
diff --git a/packages/core/client/src/application/Application.tsx b/packages/core/client/src/application/Application.tsx
index c441f1ae92..efe709fa21 100644
--- a/packages/core/client/src/application/Application.tsx
+++ b/packages/core/client/src/application/Application.tsx
@@ -350,23 +350,9 @@ export class Application {
setTimeout(() => resolve(null), 1000);
});
}
- const toError = (error) => {
- if (typeof error?.response?.data === 'string') {
- const tempElement = document.createElement('div');
- tempElement.innerHTML = error?.response?.data;
- return { message: tempElement.textContent || tempElement.innerText };
- }
- if (error?.response?.data?.error) {
- return error?.response?.data?.error;
- }
- if (error?.response?.data?.errors?.[0]) {
- return error?.response?.data?.errors?.[0];
- }
- return { message: error?.message };
- };
this.error = {
code: 'LOAD_ERROR',
- ...toError(error),
+ ...this.apiClient.toErrMessages(error)?.[0],
};
console.error(error, this.error);
}
diff --git a/packages/core/client/src/application/components/defaultComponents.tsx b/packages/core/client/src/application/components/defaultComponents.tsx
index aeb2c475b9..31801e97ed 100644
--- a/packages/core/client/src/application/components/defaultComponents.tsx
+++ b/packages/core/client/src/application/components/defaultComponents.tsx
@@ -11,10 +11,11 @@ import React, { FC } from 'react';
import { MainComponent } from './MainComponent';
const Loading: FC = () => Loading...
;
-const AppError: FC<{ error: Error }> = ({ error }) => {
+const AppError: FC<{ error: Error & { title?: string } }> = ({ error }) => {
+ const title = error?.title || 'App Error';
return (
-
App Error
+
{title}
{error?.message}
{process.env.__TEST__ && error?.stack}
diff --git a/packages/core/client/src/application/schema-initializer/components/SchemaInitializerItem.tsx b/packages/core/client/src/application/schema-initializer/components/SchemaInitializerItem.tsx
index 436fc54f37..dfdedad636 100644
--- a/packages/core/client/src/application/schema-initializer/components/SchemaInitializerItem.tsx
+++ b/packages/core/client/src/application/schema-initializer/components/SchemaInitializerItem.tsx
@@ -63,7 +63,7 @@ export const SchemaInitializerItem = memo(
className: className,
label: children || compile(title),
onClick: (info) => {
- if (info.key !== name) return;
+ if (disabled || info.key !== name) return;
if (closeInitializerMenuWhenClick) {
setVisible?.(false);
}
@@ -73,10 +73,10 @@ export const SchemaInitializerItem = memo(
children: childrenItems,
},
];
- }, [name, style, className, children, title, onClick, icon, childrenItems]);
+ }, [name, disabled, style, className, children, title, onClick, icon, childrenItems]);
if (items && items.length > 0) {
- return ;
+ return ;
}
return (
{
const filedSchema = useFieldSchema();
@@ -35,7 +35,7 @@ export const FilterFormBlockProvider = withDynamicSchemaProps((props) => {
}}
>
false}>
-
+
diff --git a/packages/core/client/src/block-provider/hooks/index.ts b/packages/core/client/src/block-provider/hooks/index.ts
index e304a5ddaf..1b82601e71 100644
--- a/packages/core/client/src/block-provider/hooks/index.ts
+++ b/packages/core/client/src/block-provider/hooks/index.ts
@@ -167,7 +167,7 @@ export function useCollectValuesToSubmit() {
if (parsedValue !== null && parsedValue !== undefined) {
assignedValues[key] = transformVariableValue(parsedValue, { targetCollectionField: collectionField });
}
- } else if (value != null && value !== '') {
+ } else if (value !== '') {
assignedValues[key] = value;
}
});
@@ -338,7 +338,7 @@ export const useAssociationCreateActionProps = () => {
if (parsedValue) {
assignedValues[key] = transformVariableValue(parsedValue, { targetCollectionField: collectionField });
}
- } else if (value != null && value !== '') {
+ } else if (value !== '') {
assignedValues[key] = value;
}
});
@@ -522,9 +522,11 @@ export const useFilterBlockActionProps = () => {
const { doFilter } = useDoFilter();
const actionField = useField();
actionField.data = actionField.data || {};
+ const form = useForm();
return {
async onClick() {
+ await form.submit();
actionField.data.loading = true;
await doFilter();
actionField.data.loading = false;
@@ -605,7 +607,7 @@ export const useCustomizeUpdateActionProps = () => {
if (parsedValue) {
assignedValues[key] = transformVariableValue(parsedValue, { targetCollectionField: collectionField });
}
- } else if (value != null && value !== '') {
+ } else if (value !== '') {
assignedValues[key] = value;
}
});
@@ -708,7 +710,7 @@ export const useCustomizeBulkUpdateActionProps = () => {
if (parsedValue) {
assignedValues[key] = transformVariableValue(parsedValue, { targetCollectionField: collectionField });
}
- } else if (value != null && value !== '') {
+ } else if (value !== '') {
assignedValues[key] = value;
}
});
@@ -930,7 +932,7 @@ export const useUpdateActionProps = () => {
if (parsedValue) {
assignedValues[key] = transformVariableValue(parsedValue, { targetCollectionField: collectionField });
}
- } else if (value != null && value !== '') {
+ } else if (value !== '') {
assignedValues[key] = value;
}
});
diff --git a/packages/core/client/src/collection-manager/interfaces/input.ts b/packages/core/client/src/collection-manager/interfaces/input.ts
index ac5897adb7..40d131e5be 100644
--- a/packages/core/client/src/collection-manager/interfaces/input.ts
+++ b/packages/core/client/src/collection-manager/interfaces/input.ts
@@ -62,6 +62,12 @@ export class InputFieldInterface extends CollectionFieldInterface {
hasDefaultValue = true;
properties = {
...defaultProps,
+ trim: {
+ type: 'boolean',
+ 'x-content': '{{t("Automatically remove heading and tailing spaces")}}',
+ 'x-decorator': 'FormItem',
+ 'x-component': 'Checkbox',
+ },
layout: {
type: 'void',
title: '{{t("Index")}}',
diff --git a/packages/core/client/src/collection-manager/interfaces/properties/operators.ts b/packages/core/client/src/collection-manager/interfaces/properties/operators.ts
index ce0b6d411f..80b4e31527 100644
--- a/packages/core/client/src/collection-manager/interfaces/properties/operators.ts
+++ b/packages/core/client/src/collection-manager/interfaces/properties/operators.ts
@@ -129,12 +129,12 @@ export const enumType = [
label: '{{t("is")}}',
value: '$eq',
selected: true,
- schema: { 'x-component': 'Select' },
+ schema: { 'x-component': 'Select', 'x-component-props': { mode: null } },
},
{
label: '{{t("is not")}}',
value: '$ne',
- schema: { 'x-component': 'Select' },
+ schema: { 'x-component': 'Select', 'x-component-props': { mode: null } },
},
{
label: '{{t("is any of")}}',
diff --git a/packages/core/client/src/collection-manager/interfaces/textarea.ts b/packages/core/client/src/collection-manager/interfaces/textarea.ts
index 2ccebbdeb6..19f48bc4c1 100644
--- a/packages/core/client/src/collection-manager/interfaces/textarea.ts
+++ b/packages/core/client/src/collection-manager/interfaces/textarea.ts
@@ -31,6 +31,12 @@ export class TextareaFieldInterface extends CollectionFieldInterface {
titleUsable = true;
properties = {
...defaultProps,
+ trim: {
+ type: 'boolean',
+ 'x-content': '{{t("Automatically remove heading and tailing spaces")}}',
+ 'x-decorator': 'FormItem',
+ 'x-component': 'Checkbox',
+ },
};
schemaInitialize(schema: ISchema, { block }) {
if (['Table', 'Kanban'].includes(block)) {
diff --git a/packages/core/client/src/common/SelectWithTitle.tsx b/packages/core/client/src/common/SelectWithTitle.tsx
index 4bd43648a3..b3e0be59a8 100644
--- a/packages/core/client/src/common/SelectWithTitle.tsx
+++ b/packages/core/client/src/common/SelectWithTitle.tsx
@@ -18,7 +18,14 @@ export interface SelectWithTitleProps {
onChange?: (...args: any[]) => void;
}
-export function SelectWithTitle({ title, defaultValue, onChange, options, fieldNames }: SelectWithTitleProps) {
+export function SelectWithTitle({
+ title,
+ defaultValue,
+ onChange,
+ options,
+ fieldNames,
+ ...others
+}: SelectWithTitleProps) {
const [open, setOpen] = useState(false);
const timerRef = useRef
(null);
return (
@@ -36,6 +43,7 @@ export function SelectWithTitle({ title, defaultValue, onChange, options, fieldN
>
{title}
{
const dynamicProps = useDynamicComponentProps(uiSchema?.['x-use-component-props'], props);
useEffect(() => {
- // There seems to be a bug in formily where after setting a field to readPretty, switching to editable,
- // then back to readPretty, and refreshing the page, the field remains in editable state. The expected state is readPretty.
- // This code is meant to fix this issue.
+ /**
+ * There seems to be a bug in formily where after setting a field to readPretty, switching to editable,
+ * then back to readPretty, and refreshing the page, the field remains in editable state. The expected state is readPretty.
+ * This code is meant to fix this issue.
+ */
if (fieldSchema['x-read-pretty'] === true && !field.readPretty) {
field.readPretty = true;
}
+
+ /**
+ * This solves the issue: After creating a form and setting a field to "read-only", the field remains editable when refreshing the page and reopening the dialog.
+ *
+ * Note: This might be a bug in Formily
+ * When both x-disabled and x-read-pretty exist in the Schema:
+ * - If x-disabled appears before x-read-pretty in the Schema JSON, the disabled state becomes ineffective
+ * - The reason is that during field instance initialization, field.disabled is set before field.readPretty, which causes the pattern value to be changed to 'editable'
+ * - This issue is related to the order of JSON fields, which might return different orders in different environments (databases), thus making the issue inconsistent to reproduce
+ *
+ * Reference to Formily source code:
+ * 1. Setting readPretty may cause pattern to be changed to 'editable': https://github.com/alibaba/formily/blob/d4bb96c40e7918210b1bd7d57b8fadee0cfe4b26/packages/core/src/models/BaseField.ts#L208-L224
+ * 2. The execution order of the each method depends on the order of JSON fields: https://github.com/alibaba/formily/blob/123d536b6076196e00b4e02ee160d72480359f54/packages/json-schema/src/schema.ts#L486-L519
+ */
+ if (fieldSchema['x-disabled'] === true) {
+ field.disabled = true;
+ }
}, [field, fieldSchema]);
if (!uiSchema) return null;
- return ;
+ const mergedProps = { ...props, ...dynamicProps };
+
+ // Prevent displaying the variable string first, then the variable value
+ if (isVariable(mergedProps.value) && mergedProps.value === fieldSchema.default) {
+ mergedProps.value = undefined;
+ }
+
+ return ;
};
export const CollectionField = connect((props) => {
diff --git a/packages/core/client/src/formily/NocoBaseRecursionField.tsx b/packages/core/client/src/formily/NocoBaseRecursionField.tsx
index c2c75af9bb..cf0d00c880 100644
--- a/packages/core/client/src/formily/NocoBaseRecursionField.tsx
+++ b/packages/core/client/src/formily/NocoBaseRecursionField.tsx
@@ -48,6 +48,7 @@ interface INocoBaseRecursionFieldProps extends IRecursionFieldProps {
* Whether to use Formily Field class - performance will be reduced but provides better compatibility with Formily
*/
isUseFormilyField?: boolean;
+ parentSchema?: Schema;
}
const CollectionFieldUISchemaContext = React.createContext({});
@@ -266,6 +267,7 @@ export const NocoBaseRecursionField: ReactFC = Rea
values,
isUseFormilyField = true,
uiSchema,
+ parentSchema,
} = props;
const basePath = useBasePath(props);
const newFieldSchemaRef = useRef(null);
@@ -279,6 +281,14 @@ export const NocoBaseRecursionField: ReactFC = Rea
const fieldSchema: Schema = newFieldSchemaRef.current || oldFieldSchema;
+ // Establish connection with the Schema tree
+ if (!fieldSchema.parent && parentSchema) {
+ fieldSchema.parent = parentSchema;
+ if (!fieldSchema.parent?.properties?.[fieldSchema.name] && fieldSchema.name) {
+ _.set(fieldSchema.parent, `properties.${fieldSchema.name}`, fieldSchema);
+ }
+ }
+
const refresh = useCallback(() => {
const parent = fieldSchema.parent;
newFieldSchemaRef.current = new Schema(fieldSchema.toJSON(), parent);
diff --git a/packages/core/client/src/locale/de-DE.json b/packages/core/client/src/locale/de-DE.json
index 1f0df5805f..6ba834ee1b 100644
--- a/packages/core/client/src/locale/de-DE.json
+++ b/packages/core/client/src/locale/de-DE.json
@@ -884,5 +884,7 @@
"If selected, the page will display Tab pages.": "Wenn ausgewählt, zeigt die Seite Tab-Seiten an.",
"If selected, the route will be displayed in the menu.": "Wenn ausgewählt, wird die Route im Menü angezeigt.",
"Are you sure you want to hide this tab?": "Sind Sie sicher, dass Sie diesen Tab ausblenden möchten?",
- "After hiding, this tab will no longer appear in the tab bar. To show it again, you need to go to the route management page to set it.": "Nach dem Ausblenden wird dieser Tab nicht mehr in der Tableiste angezeigt. Um ihn wieder anzuzeigen, müssen Sie zur Routenverwaltungsseite gehen, um ihn einzustellen."
+ "After hiding, this tab will no longer appear in the tab bar. To show it again, you need to go to the route management page to set it.": "Nach dem Ausblenden wird dieser Tab nicht mehr in der Tableiste angezeigt. Um ihn wieder anzuzeigen, müssen Sie zur Routenverwaltungsseite gehen, um ihn einzustellen.",
+ "No pages yet, please configure first": "Noch keine Seiten, bitte zuerst konfigurieren",
+ "Click the \"UI Editor\" icon in the upper right corner to enter the UI Editor mode": "Klicken Sie auf das \"UI-Editor\"-Symbol in der oberen rechten Ecke, um den UI-Editor-Modus zu betreten"
}
diff --git a/packages/core/client/src/locale/en-US.json b/packages/core/client/src/locale/en-US.json
index f80a244aa7..d0867f786e 100644
--- a/packages/core/client/src/locale/en-US.json
+++ b/packages/core/client/src/locale/en-US.json
@@ -884,5 +884,7 @@
"If selected, the page will display Tab pages.": "If selected, the page will display Tab pages.",
"If selected, the route will be displayed in the menu.": "If selected, the route will be displayed in the menu.",
"Are you sure you want to hide this tab?": "Are you sure you want to hide this tab?",
- "After hiding, this tab will no longer appear in the tab bar. To show it again, you need to go to the route management page to set it.": "After hiding, this tab will no longer appear in the tab bar. To show it again, you need to go to the route management page to set it."
+ "After hiding, this tab will no longer appear in the tab bar. To show it again, you need to go to the route management page to set it.": "After hiding, this tab will no longer appear in the tab bar. To show it again, you need to go to the route management page to set it.",
+ "No pages yet, please configure first": "No pages yet, please configure first",
+ "Click the \"UI Editor\" icon in the upper right corner to enter the UI Editor mode": "Click the \"UI Editor\" icon in the upper right corner to enter the UI Editor mode"
}
diff --git a/packages/core/client/src/locale/es-ES.json b/packages/core/client/src/locale/es-ES.json
index 3a3a45d646..ffc6ef06aa 100644
--- a/packages/core/client/src/locale/es-ES.json
+++ b/packages/core/client/src/locale/es-ES.json
@@ -801,5 +801,7 @@
"If selected, the page will display Tab pages.": "Si se selecciona, la página mostrará páginas de pestañas.",
"If selected, the route will be displayed in the menu.": "Si se selecciona, la ruta se mostrará en el menú.",
"Are you sure you want to hide this tab?": "¿Estás seguro de que quieres ocultar esta pestaña?",
- "After hiding, this tab will no longer appear in the tab bar. To show it again, you need to go to the route management page to set it.": "Después de ocultar, esta pestaña ya no aparecerá en la barra de pestañas. Para mostrarla de nuevo, deberás ir a la página de gestión de rutas para configurarla."
+ "After hiding, this tab will no longer appear in the tab bar. To show it again, you need to go to the route management page to set it.": "Después de ocultar, esta pestaña ya no aparecerá en la barra de pestañas. Para mostrarla de nuevo, deberás ir a la página de gestión de rutas para configurarla.",
+ "No pages yet, please configure first": "Aún no hay páginas, por favor configura primero",
+ "Click the \"UI Editor\" icon in the upper right corner to enter the UI Editor mode": "Haga clic en el icono \"Editor de UI\" en la esquina superior derecha para entrar en el modo de Editor de UI."
}
diff --git a/packages/core/client/src/locale/fr-FR.json b/packages/core/client/src/locale/fr-FR.json
index c5d0ee72d0..ed716f81fe 100644
--- a/packages/core/client/src/locale/fr-FR.json
+++ b/packages/core/client/src/locale/fr-FR.json
@@ -821,5 +821,7 @@
"If selected, the page will display Tab pages.": "Si sélectionné, la page affichera des onglets.",
"If selected, the route will be displayed in the menu.": "Si sélectionné, la route sera affichée dans le menu.",
"Are you sure you want to hide this tab?": "Êtes-vous sûr de vouloir masquer cet onglet ?",
- "After hiding, this tab will no longer appear in the tab bar. To show it again, you need to go to the route management page to set it.": "Après avoir masqué, cette tab ne sera plus affichée dans la barre de tab. Pour la montrer à nouveau, vous devez vous rendre sur la page de gestion des routes pour la configurer."
+ "After hiding, this tab will no longer appear in the tab bar. To show it again, you need to go to the route management page to set it.": "Après avoir masqué, cette tab ne sera plus affichée dans la barre de tab. Pour la montrer à nouveau, vous devez vous rendre sur la page de gestion des routes pour la configurer.",
+ "No pages yet, please configure first": "Pas encore de pages, veuillez configurer d'abord",
+ "Click the \"UI Editor\" icon in the upper right corner to enter the UI Editor mode": "Cliquez sur l'icône \"Éditeur d'interface utilisateur\" dans le coin supérieur droit pour entrer en mode Éditeur d'interface utilisateur"
}
diff --git a/packages/core/client/src/locale/it-IT.json b/packages/core/client/src/locale/it-IT.json
index a9818450e7..74b1d739f8 100644
--- a/packages/core/client/src/locale/it-IT.json
+++ b/packages/core/client/src/locale/it-IT.json
@@ -1,861 +1,1086 @@
-{
- "Display <1><0>100><1>201><2>502><3>1003>1> items per page": "Visualizza <1><0>100><1>201><2>502><3>1003>1> articoli per pagina",
- "Meet <1><0>All0><1>Any1>1> conditions in the group": "Soddisfa<1><0>Tutte0><1>Qualsiasi1>1>condizioni nel gruppo",
- "Open in<1><0>Modal0><1>Drawer1><2>Window2>1>": "Apri in<1><0>Modale0><1>Cassetto1><2>Finestra2>1>",
- "{{count}} filter items": "{{Count}} filtri elementi",
- "{{count}} more items": "{{Count}} altri elementi",
- "Total {{count}} items": "{{count}} elementi totali",
- "Today": "Oggi",
- "Yesterday": "Ieri",
- "Tomorrow": "Domani",
- "Month": "Mese",
- "Week": "Settimana",
- "This week": "Questa settimana",
- "This month": "Questo mese",
- "This year": "Quest'anno",
- "Next year": "Anno prossimo",
- "Last week": "Settimana scorsa",
- "Next week": "Prossima settimana",
- "Last month": "Mese scorso",
- "Next month": "Mese prossimo",
- "Last quarter": "Ultimo trimestre",
- "This quarter": "Questo trimestre",
- "Next quarter": "Prossimo trimestre",
- "Last year": "Anno scorso",
- "Last 7 days": "Ultimi 7 giorni",
- "Last 30 days": "Ultimi 30 giorni",
- "Last 90 days": "Ultimi 90 giorni",
- "Next 7 days": "Prossimi 7 giorni",
- "Next 30 days": "Prossimi 30 giorni",
- "Next 90 days": "Prossimi 90 giorni",
- "Work week": "Settimana lavorativa",
- "Day": "Giorno",
- "Agenda": "Agenda",
- "Date": "Data",
- "Time": "Tempo",
- "Event": "Evento",
- "None": "Nessuno",
- "Unconnected": "Non collegato",
- "System settings": "Impostazioni di sistema",
- "System title": "Titolo del sistema",
- "Settings": "Impostazioni",
- "Logo": "Logo",
- "Add menu item": "Aggiungi voce di menu",
- "Page": "Pagina",
- "Name": "Nome",
- "Icon": "Icona",
- "Group": "Gruppo",
- "Link": "Collegamento",
- "Save conditions": "Salva condizioni",
- "Edit menu item": "Modifica voce di menu",
- "Move to": "Passa a",
- "Insert left": "Inserisci a sinistra",
- "Insert right": "Inserire a destra",
- "Insert inner": "Inserire dentro",
- "Delete": "Eliminare",
- "Disassociate": "Dissociare",
- "Disassociate record": "Dissociare il record",
- "Are you sure you want to disassociate it?": "Sei sicuro di voler dissociare?",
- "UI editor": "Editor UI",
- "Collection": "Raccolta",
- "Collection selector": "Selettore di raccolta",
- "Providing certain collections as options for users, typically used in polymorphic or inheritance scenarios": "Fornire alcune raccolte come opzioni per gli utenti, in genere utilizzati negli scenari polimorfici o ereditari",
- "Collections & Fields": "Raccolte e campi",
- "All collections": "Tutte le raccolte",
- "Add category": "Aggiungi categoria",
- "Enable child collections": "Abilita raccolte figlie",
- "Allow adding records to the current collection": "Consenti l'aggiunta di record alla raccolta corrente",
- "Delete category": "Elimina categoria",
- "Edit category": "Modifica categoria",
- "Collection category": "Categoria raccolta",
- "Collection template": "Modello raccolta",
- "Sort": "Ordina",
- "Categories": "Categorie",
- "Visible": "Visibile",
- "Read only": "Solo lettura",
- "Easy reading": "Lettura facile",
- "Hidden": "Nascosto",
- "Hidden(reserved value)": "Nascosto (valore riservato)",
- "Not required": "Non richiesto",
- "Value": "Valore",
- "Disabled": "Disabilitato",
- "Enabled": "Abilitato",
- "Problematic": "Problematico",
- "Setting": "Impostazioni",
- "On": "Acceso",
- "Off": "Spento",
- "Empty": "Vuoto",
- "Linkage rule": "Regola di collegamento",
- "Linkage rules": "Regole di collegamento",
- "Condition": "Condizione",
- "Properties": "Proprietà",
- "Add linkage rule": "Aggiungi regola di collegamento",
- "Add property": "Aggiungi proprietà",
- "Category name": "Nome della categoria",
- "Roles & Permissions": "Ruoli e autorizzazioni",
- "Edit profile": "Modifica profilo",
- "Change password": "Cambia password",
- "Old password": "Vecchia password",
- "New password": "Nuova password",
- "Switch role": "Cambia ruolo",
- "Super admin": "Super Admin",
- "Language": "Lingua",
- "Allow sign up": "Consenti iscrizione",
- "Enable SMS authentication": "Abilita autenticazione SMS",
- "Sign out": "Disconnessione",
- "Cancel": "Annulla",
- "Submit": "Invia",
- "Close": "Chiudi",
- "Set the data scope": "Imposta l'ambito dei dati",
- "Set data loading mode": "Imposta modalità di caricamento dei dati",
- "Load all data when filter is empty": "Carica tutti i dati quando il filtro è vuoto",
- "Do not load data when filter is empty": "Non caricare i dati quando il filtro è vuoto",
- "Data loading mode": "Modalità di caricamento dei dati",
- "Data blocks": "Blocchi dati",
- "Filter blocks": "Blocchi filtro",
- "Table": "Tabella",
- "Table OID(Inheritance)": "Tabella OID (eredità)",
- "Form": "Modulo",
- "List": "Elenco",
- "Grid Card": "Scheda griglia",
- "pixels": "pixel",
- "Screen size": "Dimensione dello schermo",
- "Display title": "Visualizza titolo",
- "Set the count of columns displayed in a row": "Imposta il conteggio delle colonne visualizzate in una riga",
- "Column": "Colonna",
- "Phone device": "Telefono",
- "Tablet device": "Tablet",
- "Desktop device": "Desktop",
- "Large screen device": "Schermo di grandi dimensioni",
- "Collapse": "Comprimi",
- "Select data source": "Seleziona origine dati",
- "Calendar": "Calendario",
- "Delete events": "Elimina eventi",
- "This event": "Questo evento",
- "This and following events": "Questo e seguenti eventi",
- "All events": "Tutti gli eventi",
- "Delete this event?": "Eliminare questo evento?",
- "Delete Event": "Elimina evento",
- "Kanban": "Kanban",
- "Gantt": "Gantt",
- "Create gantt block": "Crea blocco Gantt",
- "Progress field": "Campo avanzamento",
- "Time scale": "Scala del tempo",
- "Hour": "Ora",
- "Quarter of day": "Quarto del giorno",
- "Half of day": "Metà del giorno",
- "Year": "Anno",
- "QuarterYear": "Quarto dell' anno",
- "Select grouping field": "Seleziona il campo di raggruppamento",
- "Media": "Media",
- "Markdown": "Markdown",
- "Wysiwyg": "Wysiwyg",
- "Chart blocks": "Blocchi grafici",
- "Column chart": "Grafico a colonne",
- "Bar chart": "Grafico a barre",
- "Line chart": "Grafico a linee",
- "Pie chart": "Grafico a torta",
- "Area chart": "Grafico ad area",
- "Other chart": "Altro grafico",
- "Other blocks": "Altri blocchi",
- "In configuration": "In configurazione",
- "Chart title": "Titolo grafico",
- "Chart type": "Tipo grafico",
- "Chart config": "Configurazione grafico",
- "Templates": "Modelli",
- "Select template": "Seleziona modello",
- "Action logs": "Registri eventi",
- "Create template": "Crea modello",
- "Edit markdown": "Modifica Markdown",
- "Add block": "Aggiungi blocco",
- "Add new": "Aggiungi nuovo",
- "Add record": "Aggiungi record",
- "Add child": "Aggiungi figlio",
- "Collapse all": "Comprimi tutto",
- "Expand all": "Espandi tutto",
- "Expand/Collapse": "Espandi/Comprimi",
- "Default collapse": "Comprimi di default",
- "Tree table": "Tabella ad albero",
- "Custom field display name": "Nome visualizzato campo personalizzato ",
- "Display fields": "Visualizza campi",
- "Edit record": "Modifica record",
- "Delete menu item": "Elimina voce di menu",
- "Add page": "Aggiungi pagina",
- "Add group": "Aggiungi gruppo",
- "Add link": "Aggiungi link",
- "Insert above": "Inserisci sopra",
- "Insert below": "Inserisci sotto",
- "Save": "Salva",
- "Delete block": "Elimina blocco",
- "Are you sure you want to delete it?": "Sei sicuro di volerlo eliminare?",
- "This is a demo text, **supports Markdown syntax**.": "Questo è un testo demo, ** supporta la sintassi di Markdown **.",
- "Filter": "Filtro",
- "Connect data blocks": "Collega blocchi di dati",
- "Action type": "Tipo di operazione",
- "Actions": "Operazioni",
- "Insert": "Inserisci",
- "Insert if not exists": "Inserisci se non esiste",
- "Insert if not exists, or update": "Inserisci se non esiste o aggiorna",
- "Determine whether a record exists by the following fields": "Determina se un record esiste dai seguenti campi",
- "Update": "Aggiorna",
- "Update record": "Aggiorna record",
- "View": "Visualizza",
- "View record": "Visualizza record",
- "Refresh": "Refresh",
- "Data changes": "Modifiche ai dati",
- "Field name": "Nome campo",
- "Before change": "Prima delle modifiche",
- "After change": "Dopo le modifiche",
- "Delete record": "Elimina record",
- "Delete collection": "Elimina raccolta",
- "Create collection": "Crea raccolta",
- "Collection display name": "Nome visualizzato raccolta",
- "Collection name": "Nome raccolta",
- "Inherits": "Eredita",
- "Primary key, unique identifier, self growth": "Chiave primaria, identificatore univoco, auto-incremento",
- "Store the creation user of each record": "Memorizza l'utente della creazione di ogni record",
- "Store the last update user of each record": "Memorizza l'ultimo utente di aggiornamento di ogni record",
- "Store the creation time of each record": "Memorizza l'orario di creazione di ogni record",
- "Store the last update time of each record": "Memorizza l'ultimo orario di aggiornamento di ogni record",
- "More options": "Più opzioni",
- "Records can be sorted": "I record possono essere ordinati",
- "Calendar collection": "Raccolta calendario",
- "General collection": "Raccolta generale",
- "Connect to database view": "Connetti alla vista del database",
- "Sync from database": "Sincronizza dal database",
- "Source collections": "Sorgente raccolte",
- "Field source": "Sorgente campo",
- "Preview": "Anteprima",
- "Randomly generated and can be modified. Support letters, numbers and underscores, must start with an letter.": "Generato casualmente e può essere modificato. Supporta lettere, numeri e underscore, deve iniziare con una lettera.",
- "Edit": "Modifica",
- "Edit collection": "Modifica raccolta",
- "Configure fields": "Configura campi",
- "Configure columns": "Configura colonne",
- "Edit field": "Modifica campo",
- "Override": "Forza",
- "Override field": "Forza campo",
- "Configure fields of {{title}}": "Configura campi di {{title}}",
- "Association fields filter": "Filtro associazione campi",
- "PK & FK fields": "Campi PK e FK",
- "Association fields": "Campi associazione",
- "Choices fields": "Campi scelte",
- "System fields": "Campi di sistema",
- "General fields": "Campi generali",
- "Inherited fields": "Campi ereditati",
- "Parent collection fields": "Campi raccolta padre",
- "Basic": "Di base",
- "Single line text": "Testo a riga singola",
- "Long text": "Testo lungo",
- "Phone": "Telefono",
- "Email": "E-mail",
- "Number": "Numero",
- "Integer": "Intero",
- "Percent": "Percentuale",
- "Password": "Password",
- "Advanced type": "Avanzato",
- "Formula": "Formula",
- "Formula description": "Calcola un valore in ciascun record in base ad altri campi nello stesso record.",
- "Choices": "Scelte",
- "Checkbox": "Casella di controllo",
- "Single select": "Selezione singola",
- "Multiple select": "Selezione multipla",
- "Radio group": "Gruppo radio",
- "Checkbox group": "Gruppo cassella di controllo",
- "China region": "Regione cinese",
- "Date & Time": "Data e ora",
- "Datetime": "DateTime",
- "Relation": "Relazione",
- "Link to": "Collegamento a",
- "Link to description": "Utilizzato per creare relazioni tra raccolte in modo rapido e compatibile con gli scenari più comuni. Adatto per un uso da non sviluppatore. Se presente come campo, è una selezione a discesa utilizzata per selezionare i record dalla raccolta di destinazione. Una volta creato, genererà contemporaneamente i campi associati dell'attuale raccolta nella raccolta di destinazione.",
- "Sub-table": "Sotto-tabella",
- "Sub-details": "Sotto-dettagli",
- "Sub-form(Popover)": "Sotto-modulo (Popover)",
- "System info": "Informazioni di sistema",
- "Created at": "Creato il",
- "Last updated at": "Ultimo aggiornamento il",
- "Created by": "Creato da",
- "Last updated by": "Ultimo aggiornamento da",
- "Add field": "Aggiungi campo",
- "Field display name": "Nome visualizzato campo",
- "Field type": "Tipo campo",
- "Field interface": "Interfaccia campo",
- "Date format": "Formato data",
- "Year/Month/Day": "Anno/Mese/Giorno",
- "Year-Month-Day": "Anno-Mese-Giorno",
- "Day/Month/Year": "Giorno/Mese/Anno",
- "Show time": "Mostra orario",
- "Time format": "Formato tempo",
- "12 hour": "12 ore",
- "24 hour": "24 ore",
- "Relationship type": "Tipo di relazione",
- "Inverse relationship type": "Tipo di relazione inversa",
- "Source collection": "Raccolta sorgente",
- "Source key": "Chiave sorgente",
- "Target collection": "Raccolta di destinazione",
- "Through collection": "Attraverso la raccolta",
- "Target key": "Chiave di destinazione",
- "Foreign key": "Chiave esterna",
- "One to one": "Uno a uno",
- "One to many": "Uno a molti",
- "Many to one": "Molti a uno",
- "Many to many": "Molti a molti",
- "Foreign key 1": "Chiave esterna 1",
- "Foreign key 2": "Chiave esterna 2",
- "One to one description": "Usato per creare relazioni one-to-one. Ad esempio, un utente ha un profilo.",
- "One to many description": "Utilizzato per creare una relazione da uno a molti. Ad esempio, un paese avrà molte città e una città può essere solo in un paese. Se presente come campo, è una sotto-tabella che mostra i record della raccolta associata. Se creato, un campo molti-a-uno viene generato automaticamente nella raccolta associata.",
- "Many to one description": "Utilizzato per creare relazioni molti-a-uno. Ad esempio, una città può appartenere a un solo paese e un paese può avere molte città. Se presente come campo, è una selezione a discesa utilizzata per selezionare il record dalla raccolta associata. Una volta creato, un campo da uno a molti viene generato automaticamente nella raccolta associata.",
- "Many to many description": "Utilizzato per creare relazioni molti-a-molti. Ad esempio, uno studente avrà molti insegnanti e un insegnante avrà molti studenti. Se presente come campo, è una selezione a discesa utilizzata per selezionare i record dalla raccolta associata.",
- "Generated automatically if left blank": "Generato automaticamente se lasciato vuoto",
- "Display association fields": "Visualizza campi di associazione",
- "Display field title": "Visualizza titolo campo",
- "Field component": "Componente campo",
- "Allow multiple": "Consenti multipli",
- "Quick upload": "Caricamento rapido",
- "Select file": "Seleziona file",
- "Subtable": "Sotto-tabella",
- "Sub-form": "Sotto-modulo",
- "Field mode": "Modalità campo",
- "Allow add new data": "Consenti aggiunta nuovi dati",
- "Record picker": "Record Picker",
- "Toggles the subfield mode": "Attiva la modalità Subfield",
- "Selector mode": "Modalità selettore",
- "Subtable mode": "Modalità sotto-tabella",
- "Subform mode": "Modalità sotto-modulo",
- "Edit block title": "Modifica titolo blocco",
- "Block title": "Titolo blocco",
- "Pattern": "Modello",
- "Operator": "Operatore",
- "Editable": "Modificabile",
- "Readonly": "Solo lettura",
- "Easy-reading": "Lettura facile",
- "Add filter": "Aggiungi filtro",
- "Add filter group": "Aggiungi gruppo di filtri",
- "Comparision": "Confronto",
- "is": "è",
- "is not": "non lo è",
- "contains": "contiene",
- "does not contain": "non contiene",
- "starts with": "inizia con",
- "not starts with": "non inizia con",
- "ends with": "termina con",
- "not ends with": "non termina con",
- "is empty": "è vuoto",
- "is not empty": "non è vuoto",
- "Edit chart": "Modifica grafico",
- "Add text": "Aggiungi testo",
- "Filterable fields": "Campi filtrabili",
- "Edit button": "Modifica pulsante",
- "Hide": "Nascondi",
- "Enable actions": "Abilita operazioni",
- "Import": "Importa",
- "Export": "Esporta",
- "Customize": "Personalizza",
- "Custom": "Personalizzato",
- "Function": "Funzione",
- "Popup form": "Modulo Popup",
- "Flexible popup": "Popup flessibile",
- "Configure actions": "Configura operazioni",
- "Display order number": "Visualizza numero ordinamento",
- "Enable drag and drop sorting": "Abilita l'ordinamento con drag and drop",
- "Triggered when the row is clicked": "Attivato quando si fa clic sulla riga",
- "Add tab": "Aggiungi scheda",
- "Disable tabs": "Disabilita le schede",
- "Details": "Dettagli",
- "Edit form": "Modifica modulo",
- "Create form": "Crea modulo",
- "Form (Edit)": "Modulo (modifica)",
- "Form (Add new)": "Modulo (aggiungi nuovo)",
- "Edit tab": "Modifica scheda",
- "Relationship blocks": "Blocchi di relazione",
- "Select record": "Seleziona Record",
- "Display name": "Visualizza nome",
- "Select icon": "Seleziona icona",
- "Custom column name": "Nome colonna personalizzato",
- "Edit description": "Modifica descrizione",
- "Required": "Richiesto",
- "Unique": "Unico",
- "Primary": "Primario",
- "Auto increment": "Incremento automatico",
- "Label field": "Campo etichetta",
- "Default is the ID field": "L'impostazione predefinita è il campo ID",
- "Set default sorting rules": "Imposta le regole di ordinamento predefinite",
- "Set validation rules": "Imposta le regole di convalida",
- "Max length": "Lunghezza massima",
- "Min length": "Lunghezza minima",
- "Maximum": "Massimo",
- "Minimum": "Minimo",
- "Max length must greater than min length": "La lunghezza massima deve essere maggiore della lunghezza minima",
- "Min length must less than max length": "La lunghezza minima deve essere inferiore della lunghezza massima",
- "Maximum must greater than minimum": "Il massimo deve essere maggiore del minimo",
- "Minimum must less than maximum": "Il minimo deve essere minore del massimo",
- "Validation rule": "Regola di convalida",
- "Add validation rule": "Aggiungi regola di convalida",
- "Format": "Formato",
- "Regular expression": "Espressione regolare",
- "Error message": "Messaggio di errore",
- "Length": "Lunghezza",
- "The field value cannot be greater than ": "Il valore del campo non può essere maggiore di",
- "The field value cannot be less than ": "Il valore del campo non può essere inferiore a",
- "The field value is not an integer number": "Il valore del campo non è un numero intero",
- "Set default value": "Imposta valore predefinito",
- "Default value": "Valore predefinito",
- "is before": "è prima",
- "is after": "è dopo",
- "is on or after": "a partire dal",
- "is on or before": "entro il",
- "is between": "è tra",
- "Upload": "Upload",
- "Select level": "Seleziona livello",
- "Province": "Provincia",
- "City": "Città",
- "Area": "Zona",
- "Street": "Strada",
- "Village": "Villaggio",
- "Must select to the last level": "Deve selezionare all'ultimo livello",
- "Move {{title}} to": "Sposta {{title}} a",
- "Target position": "Posizione di destinazione",
- "After": "Dopo",
- "Before": "Prima",
- "Add {{type}} before \"{{title}}\"": "Aggiungi {{type}} prima di \"{{title}}\"",
- "Add {{type}} after \"{{title}}\"": "Aggiungi {{type}} dopo \"{{title}}\"",
- "Add {{type}} in \"{{title}}\"": "Aggiungi {{type}} in \"{{title}}\"",
- "Original name": "Nome originale",
- "Custom name": "Nome personalizzato",
- "Custom Title": "Titolo personalizzato",
- "Options": "Opzioni",
- "Option value": "Valore opzione",
- "Option label": "Etichetta opzione",
- "Color": "Colore",
- "Background Color": "Colore sfondo",
- "Text Align": "Allineamento testo",
- "Add option": "Aggiungi opzione",
- "Related collection": "Raccolta correlata",
- "Allow linking to multiple records": "Consenti il collegamento a più record",
- "Allow uploading multiple files": "Consenti il caricamento di più file",
- "Configure calendar": "Configura calendario",
- "Title field": "Campo titolo",
- "Custom title": "Titolo personalizzato",
- "Daily": "Quotidiano",
- "Weekly": "Settimanale",
- "Monthly": "Mensile",
- "Yearly": "Annuale",
- "Repeats": "Ripeti",
- "Show lunar": "Mostra lunare",
- "Start date field": "Campo data di inizio",
- "End date field": "Campo data di fine",
- "Navigate": "Naviga",
- "Title": "Titolo",
- "Description": "Descrizione",
- "Select view": "Seleziona vista",
- "Reset": "Reset",
- "Importable fields": "Campi importabili",
- "Exportable fields": "Campi esportabili",
- "Saved successfully": "Salvataggio riuscito",
- "Nickname": "Soprannome",
- "Sign in": "Registrazione",
- "Sign in via account": "Accedi tramite account",
- "Sign in via phone": "Accedi via telefono",
- "Create an account": "Crea un account",
- "Sign up": "Iscrizione",
- "Confirm password": "Conferma password",
- "Log in with an existing account": "Accedi con account esistente",
- "Signed up successfully. It will jump to the login page.": "Registrazione riuscita. Reindirizzamento alla pagina di accesso.",
- "Password mismatch": "Password non corretta",
- "Users": "Utenti",
- "Verification code": "Codice di verifica",
- "Send code": "Invia codice",
- "Retry after {{count}} seconds": "Riprova dopo {{count}} secondi",
- "Roles": "Ruoli",
- "Add role": "Aggiungi ruolo",
- "Role name": "Nome ruolo",
- "Configure": "Configura",
- "Configure permissions": "Configura permessi",
- "Edit role": "Modifica ruolo",
- "Action permissions": "Permessi su operazioni",
- "Menu permissions": "Permessi su menu",
- "Menu item name": "Nome voce di menu",
- "Allow access": "Consenti accesso",
- "Action name": "Nome operazione",
- "Allow action": "Consenti operazione",
- "Action scope": "Ambito operazione",
- "Operate on new data": "Operare su nuovi dati",
- "Operate on existing data": "Operare su dati esistenti",
- "Yes": "Si",
- "No": "No",
- "Red": "Rosso",
- "Magenta": "Magenta",
- "Volcano": "Vulcano",
- "Orange": "Arancione",
- "Gold": "Oro",
- "Lime": "Lime",
- "Green": "Verde",
- "Cyan": "Ciano",
- "Blue": "Blu",
- "Geek blue": "Geek Blue",
- "Purple": "Viola",
- "Default": "Predefinito",
- "Add card": "Aggiungi scheda",
- "edit title": "modifica titolo",
- "Turn pages": "Volta pagine",
- "Others": "Altri",
- "Other records": "Altri record",
- "Save as template": "Salva come modello",
- "Save as block template": "Salva come modello blocco",
- "Block templates": "Modelli blocco",
- "Block template": "Modello blocco",
- "Convert reference to duplicate": "Converti il riferimento a duplicato",
- "Template name": "Nome modello",
- "Block type": "Tipo blocco",
- "No blocks to connect": "Nessun blocco per connettersi",
- "Action column": "Colonna operazioni",
- "Records per page": "Record per pagina",
- "(Fields only)": "(Solo campi)",
- "Button title": "Titolo pulsante",
- "Button icon": "Icona pulsante",
- "Submitted successfully": "Invio riuscito",
- "Operation succeeded": "L'operazione è riuscita",
- "Operation failed": "Operazione non riuscita",
- "Open mode": "Modalità aperta",
- "Popup size": "Dimensione popup",
- "Small": "Piccolo",
- "Middle": "Medio",
- "Large": "Grande",
- "Size": "Misura",
- "Oversized": "Oversize",
- "Auto": "Auto",
- "Object Fit": "Adattato all'oggetto",
- "Cover": "Cover",
- "Fill": "Riempi",
- "Contain": "Contiene",
- "Scale Down": "Ridimensiona",
- "Menu item title": "Titolo voce di menu",
- "Menu item icon": "Icona voce di menu",
- "Target": "Destinazione",
- "Position": "Posizione",
- "Insert before": "Inserire prima",
- "Insert after": "Inserire dopo",
- "UI Editor": "Editor UI",
- "ASC": "Asc",
- "DESC": "Desc",
- "Add sort field": "Aggiungi campo di ordinamento",
- "ID": "ID",
- "Identifier for program usage. Support letters, numbers and underscores, must start with an letter.": "Identificatore per l'utilizzo del programma. Supporta lettere, numeri e underscore, deve iniziare con una lettera.",
- "Drawer": "Cassetto",
- "Dialog": "Dialogo",
- "Delete action": "Elimina operazione",
- "Custom column title": "Titolo colonna personalizzata",
- "Column title": "Titolo colonna",
- "Original title: ": "Titolo originale: ",
- "Delete table column": "Elimina colonna della tabella",
- "Skip required validation": "Salta convalida richiesta",
- "Form values": "Valori modulo",
- "Fields values": "Valori campi",
- "The field has been deleted": "Il campo è stato eliminato",
- "When submitting the following fields, the saved values are": "Quando si inviano i seguenti campi, i valori salvati sono",
- "After successful submission": "Dopo un invio riuscito",
- "Then": "Poi",
- "Stay on current page": "Resta sulla pagina corrente",
- "Redirect to": "Reindirizza a",
- "Save action": "Salva operazione",
- "Exists": "Esiste",
- "Add condition": "Aggiungi condizione",
- "Add condition group": "Aggiungi gruppo di condizioni",
- "exists": "esiste",
- "not exists": "non esiste",
- "Style": "Stile",
- "=": "=",
- "≠": "≠",
- ">": ">",
- "≥": "≥",
- "<": "<",
- "≤": "≤",
- "Role UID": "Ruolo UID",
- "Precision": "Precisione",
- "Formula mode": "Modalità formula",
- "Expression": "Espressione",
- "Input +, -, *, /, ( ) to calculate, input @ to open field variables.": "Input +, -, *, /, () per calcolare, input @ per aprire le variabili campo.",
- "Formula error.": "Errore formula.",
- "Rich Text": "Testo ricco",
- "Junction collection": "Raccolta giunzione",
- "Leave it blank, unless you need a custom intermediate table": "Lascialo vuoto, a meno che tu non abbia bisogno di una tabella intermedia personalizzata",
- "Fields": "Campi",
- "Edit field title": "Modifica titolo campo",
- "Field title": "Titolo campo",
- "Original field title: ": "Titolo campo originale:",
- "Edit tooltip": "Modifica suggerimento",
- "Delete field": "Elimina campo",
- "Select collection": "Seleziona raccolta",
- "Blank block": "Blocco vuoto",
- "Duplicate template": "Modello duplicato",
- "Reference template": "Modello di riferimento",
- "Create calendar block": "Crea blocco calendario",
- "Create kanban block": "Crea blocco kanban",
- "Grouping field": "Campo di raggruppamento",
- "Single select and radio fields can be used as the grouping field": "I campi di selezione singoli e radio possono essere utilizzati come campo di raggruppamento",
- "Tab name": "Nome della scheda",
- "Current record blocks": "Blocchi record attuale",
- "Popup message": "Messaggio popup",
- "Delete role": "Elimina il ruolo",
- "Role display name": "Nome visualizzato ruolo",
- "Default role": "Ruolo predefinito",
- "All collections use general action permissions by default; permission configured individually will override the default one.": "Tutte le raccolte utilizzano i permessi di operazioni generali per impostazione predefinita; I permessi configurati individualmente sovrascriveranno quelli predefiniti.",
- "Allows configuration of the whole system, including UI, collections, permissions, etc.": "Consente la configurazione dell'intero sistema, tra cui interfaccia utente, raccolte, permessi, ecc.",
- "New menu items are allowed to be accessed by default.": "È possibile accedere a nuove voci di menu per impostazione predefinita.",
- "Global permissions": "Permessi globali",
- "General permissions": "Permessi generali",
- "Global action permissions": "Permessi operazioni globali",
- "General action permissions": "Permessi operazioni generali",
- "Plugin settings permissions": "Permessi impostazioni plugin",
- "Allow to desgin pages": "Consenti progettazione pagine",
- "Allow to manage plugins": "Consenti gestione plugin",
- "Allow to configure plugins": "Consenti configurazione plugin",
- "Allows to configure interface": "Consente di configurare l'interfaccia",
- "Allows to install, activate, disable plugins": "Consente di installare, attivare, disabilitare i plugin",
- "Allows to configure plugins": "Consente di configurare i plugin",
- "Action display name": "Nome visualizzato operazione",
- "Allow": "Permetti",
- "Data scope": "Ambito dei dati",
- "Action on new records": "Operazione su nuovi record",
- "Action on existing records": "Operazione su record esistenti",
- "All records": "Tutti i record",
- "Own records": "Record propri",
- "Permission policy": "Policy di autorizzazione",
- "Individual": "Individuale",
- "General": "Generale",
- "Accessible": "Accessibile",
- "Configure permission": "Configura permesso",
- "Action permission": "Permesso operazione",
- "Field permission": "Permesso campo",
- "Scope name": "Nome ambito",
- "Unsaved changes": "Modifiche non salvate",
- "Are you sure you don't want to save?": "Sei sicuro di non voler salvare?",
- "Dragging": "Trascina",
- "Popup": "Popup",
- "Trigger workflow": "Trigger flusso di lavoro",
- "Request API": "Richiesta API",
- "Assign field values": "Assegna valori del campo",
- "Constant value": "Valore costante",
- "Dynamic value": "Valore dinamico",
- "Current user": "Utente attuale",
- "Current role": "Ruolo attuale",
- "Current record": "Record attuale",
- "Current collection": "Raccolta attuale",
- "Other collections": "Altre raccolte",
- "Current popup record": "Record popup attuale",
- "Parent popup record": "Record popup padre",
- "Associated records": "Record associati",
- "Parent record": "Record padre",
- "Current time": "Ora attuale",
- "System variables": "Variabili di sistema",
- "Date variables": "Variabili della data",
- "Message popup close method": "Metodo di chiusura popup di messaggio",
- "Automatic close": "Chiudi automaticamente",
- "Manually close": "Chiudi manualmente",
- "After successful update": "Dopo un aggiornamento riuscito",
- "Save record": "Salva record",
- "Updated successfully": "Aggiornamento riuscito",
- "After successful save": "Dopo un salvataggio riuscito",
- "After clicking the custom button, the following field values will be assigned according to the following form.": "Dopo aver fatto clic sul pulsante personalizza, i seguenti valori verranno assegnati in base al seguente modulo.",
- "After clicking the custom button, the following fields of the current record will be saved according to the following form.": "Dopo aver fatto clic sul pulsante personalizza, i seguenti campi del record corrente verranno salvati in base al seguente modulo.",
- "Button background color": "Colore sfondo del pulsante",
- "Highlight": "Evidenziato",
- "Danger red": "Rosso pericolo",
- "Custom request": "Richiesta personalizzata",
- "Request settings": "Impostazioni richiesta",
- "Request URL": "URL richiesta",
- "Request method": "Metodo richiesta",
- "Request query parameters": "Parametri richiesta query",
- "Request headers": "Intestazioni richiesta",
- "Request body": "Corpo richiesta",
- "Request success": "Successo richiesta",
- "Invalid JSON format": "Formato JSON non valido",
- "After successful request": "Dopo una richiesta riuscita",
- "Add exportable field": "Aggiungi campo esportabile",
- "Audit logs": "Registri audit",
- "Record ID": "ID record",
- "User": "Utente",
- "Field": "Campo",
- "Select": "Seleziona",
- "Select field": "Seleziona campo",
- "Field value changes": "Modifiche valore del campo",
- "One to one (has one)": "Uno a uno (ne ha uno)",
- "One to one (belongs to)": "Uno a uno (appartiene a)",
- "Use the same time zone (GMT) for all users": "Usa lo stesso fuso orario (GMT) per tutti gli utenti",
- "Province/city/area name": "Nome provincia/città/area",
- "Enabled languages": "Lingue abilitate",
- "View all plugins": "Visualizza tutti i plugin",
- "Print": "Stampa",
- "Done": "Fatto",
- "Sign up successfully, and automatically jump to the sign in page": "Iscriviti correttamente e reindirizza automaticamente alla pagina di accesso",
- "File manager": "File Manager",
- "ACL": "ACL",
- "Collection manager": "Responsabile della raccolta",
- "Plugin manager": "Plugin Manager",
- "Local": "Locale",
- "Built-in": "Incorporato",
- "Marketplace": "Marketplace",
- "Add plugin": "Aggiungi plugin",
- "Plugin source": "Sorgente plugin",
- "Upgrade": "Aggiornamento",
- "Plugin dependencies check failed": "Controllo delle dipendenze del plugin non riuscito",
- "More details": "Maggiori dettagli",
- "Upload new version": "Carica nuova versione",
- "Version": "Versione",
- "Npm package": "Pacchetto Npm",
- "Npm package name": "Nome pacchetto Npm",
- "Upload plugin": "Carica plugin",
- "Official plugin": "Plugin ufficiale",
- "Add type": "Aggiungi tipo",
- "Changelog": "Changelog",
- "Dependencies check": "Controllo delle dipendenze",
- "Update plugin": "Aggiorna plugin",
- "Installing": "Installazione",
- "The deletion was successful.": "Cancellazione riuscita.",
- "Plugin Zip File": "File zip plugin",
- "Compressed file url": "URL file compresso",
- "Last updated": "Ultimo aggiornamento",
- "PackageName": "Nome pacchetto",
- "DisplayName": "Nome da visualizzare",
- "Readme": "Readme",
- "Dependencies compatibility check": "Controllo compatibilità delle dipendenze",
- "Plugin dependencies check failed, you should change the dependent version to meet the version requirements.": "Controllo delle dipendenze del plugin non riuscito, è necessario modificare la versione dipendente per soddisfare i requisiti della versione.",
- "Version range": "Range versione",
- "Plugin's version": "Versione plugin",
- "Result": "Risultato",
- "No CHANGELOG.md file": "Nessun file Changelog.md",
- "No README.md file": "Nessun file readme.md",
- "Homepage": "Homepage",
- "Drag and drop the file here or click to upload, file size should not exceed 30M": "Trascina e rilascia il file qui o fai clic per caricare, la dimensione del file non deve superare i 30M",
- "Dependencies check failed, can't enable.": "Il controllo delle dipendenze non è riuscito, impossibile abilitare.",
- "Plugin starting...": "Avvio plugin...",
- "Plugin stopping...": "Interruzione plugin ...",
- "Are you sure to delete this plugin?": "Sei sicuro di eliminare questo plugin?",
- "Are you sure to disable this plugin?": "Sei sicuro di disabilitare questo plugin?",
- "re-download file": "ri-scarica file",
- "Not enabled": "Non abilitato",
- "Search plugin": "Ricerca plugin",
- "Author": "Autore",
- "Plugin loading failed. Please check the server logs.": "Il caricamento del plugin non è riuscito. Si prega di controllare i registri del server.",
- "Coming soon...": "Prossimamente...",
- "All plugin settings": "Tutte le impostazioni del plugin",
- "Bookmark": "Segnalibro",
- "Manage all settings": "Gestisci tutte le impostazioni",
- "Create inverse field in the target collection": "Crea campo inverso nella raccolta di destinazione",
- "Inverse field name": "Nome campo inverso",
- "Inverse field display name": "Nome visualizzato campo inverso",
- "Bulk update": "Aggiornamento di massa",
- "After successful bulk update": "Dopo un aggiornamento di massa riuscito",
- "Bulk edit": "Modifica di massa",
- "Data will be updated": "I dati verranno aggiornati",
- "Selected": "Selezionato",
- "All": "Tutto",
- "Update selected data?": "Aggiornare i dati selezionati?",
- "Update all data?": "Aggiornare tutti i dati?",
- "Remains the same": "Rimane lo stesso",
- "Changed to": "Cambiato in",
- "Clear": "Cancella",
- "Add attach": "Aggiungi allegato",
- "Please select the records to be updated": "Si prega di selezionare i record da aggiornare",
- "Selector": "Selettore",
- "Inner": "Interno",
- "Search and select collection": "Cerca e seleziona la raccolta",
- "Please fill in the iframe URL": "Si prega di compilare l'URL iFrame",
- "Fix block": "Fissa blocco",
- "Plugin name": "Nome plugin",
- "Plugin tab name": "Nome scheda plugin",
- "AutoGenId": "Campo ID generato automaticamente",
- "CreatedBy": "Creato da",
- "UpdatedBy": "Aggiornato da",
- "CreatedAt": "Creato il",
- "UpdatedAt": "Aggiornato il",
- "Column width": "Larghezza colonna",
- "Sortable": "Ordinabile",
- "Enable link": "Abilita link",
- "This is likely a NocoBase internals bug. Please open an issue at <1>here1>": "Questo sembra un bug interno di NocoBase. Si prega di aprire un ticket <1>qui1>",
- "Render Failed": "Rendering non riuscito",
- "App error": "Errore app",
- "Feedback": "Feedback",
- "Try again": "Riprova",
- "Download logs": "Download registri",
- "Data template": "Modello dati",
- "Duplicate": "Duplica",
- "Duplicating": "Duplicazione",
- "Duplicate mode": "Modalità duplicazione",
- "Quick duplicate": "Duplicazione veloce",
- "Duplicate and continue": "Duplica e continua",
- "Please configure the duplicate fields": "Si prega di configurare i campi duplicati",
- "Add": "Aggiungi",
- "Add new mode": "Modalità aggiungi nuovo",
- "Quick add": "Aggiunta rapida",
- "Modal add": "Aggiunta modale",
- "Save mode": "Modalità salvataggio",
- "First or create": "Prima o crea",
- "Update or create": "Aggiorna o crea",
- "Find by the following fields": "Trova dai seguenti campi",
- "Create": "Crea",
- "Current form": "Modulo corrente",
- "Current object": "Oggetto corrente",
- "Linkage with form fields": "Collegamento con i campi del modulo",
- "Allow add new, update and delete actions": "Consenti operazioni aggiungi nuovo, aggiorna ed elimina",
- "Date display format": "Formato di visualizzazione della data",
- "Assign data scope for the template": "Assegna l'ambito dei dati per il modello",
- "Table selected records": "Tabella record selezionati",
- "Tag": "Etichetta",
- "Tag color field": "Campo colore etichetta",
- "Sync successfully": "Sincronizzazione riuscita",
- "Sync from form fields": "Sincronizzazione dai campi del modulo",
- "Select all": "Seleziona tutto",
- "Restart": "Ricomincia",
- "Restart application": "Riavvia applicazione",
- "Cascade Select": "Seleziona in cascata",
- "Execute": "Esegui",
- "Please use a valid SELECT or WITH AS statement": "Si prega di utilizzare un' istruzione SELECT o WITH AS valida",
- "Please confirm the SQL statement first": "Si prega di confermare prima l'istruzione SQL",
- "Automatically drop objects that depend on the collection (such as views), and in turn all objects that depend on those objects": "Elimina automaticamente gli oggetti che dipendono dalla raccolta (come le viste) e, a loro volta, tutti gli oggetti che dipendono da tali oggetti",
- "Sign in with another account": "Accedi con un altro account",
- "Return to the main application": "Torna alla applicazione principale",
- "Permission deined": "Permesso negato",
- "loading": "caricamento",
- "name is required": "nome richiesto",
- "data source": "sorgente dati",
- "Data source": "Sorgente dati",
- "DataSource": "Sorgente Dati",
- "The {{type}} \"{{name}}\" may have been deleted. Please remove this {{blockType}}.": "Il {{type}} \"{{name}}\" potrebbe essere stato eliminato. Si prega di rimuovere {{blockType}}.",
- "Preset fields": "Campi preimpostati",
- "Home page": "Home page",
- "Handbook": "Manuale",
- "License": "Licenza",
- "Generic properties": "Proprietà generiche",
- "Specific properties": "Proprietà specifiche",
- "Used for drag and drop sorting scenarios, supporting grouping sorting": "Utilizzato per scenari con drag and drop, supporta ordinamento raggruppato",
- "Grouped sorting": "Ordinamento raggruppato",
- "When a field is selected for grouping, it will be grouped first before sorting.": "Quando viene selezionato un campo per il raggruppamento, verrà raggruppato prima dell'ordinamento.",
- "Departments": "Dipartimenti",
- "Main department": "Dipartimento principale",
- "Department name": "Nome del dipartimento",
- "Superior department": "Dipartimento superiore",
- "Owners": "Proprietari",
- "Plugin settings": "Impostazioni plugin",
- "Menu": "Menu",
- "Drag and drop sorting field": "Campi ordinamento drag and drop",
- "This variable has been deprecated and can be replaced with \"Current form\"": "Questa variabile è stata deprecata e può essere sostituita con \"Current form\"",
- "The value of this variable is derived from the query string of the page URL. This variable can only be used normally when the page has a query string.": "Il valore di questa variabile deriva dalla stringa di ricerca nell'URL della pagina. Questa variabile può essere utilizzata normalmente solo quando la pagina ha una stringa di ricerca.",
- "URL search params": "Parametri di ricerca URL",
- "Expand All": "Espandi tutto",
- "Search": "Ricerca",
- "Clear default value": "Cancella il valore predefinito",
- "Open in new window": "Apri in una nuova finestra",
- "Sorry, the page you visited does not exist.": "Spiacente, la pagina che hai visitato non esiste.",
- "is none of": "non è nessuno di",
- "is any of": "è uno di",
- "Plugin dependency version mismatch": "Mancata corrispondenza della versione della dipendenza del plugin",
- "The current dependency version of the plugin does not match the version of the application and may not work properly. Are you sure you want to continue enabling the plugin?": "L'attuale versione della dipendenza del plugin non corrisponde alla versione dell'applicazione e potrebbe non funzionare correttamente. Sei sicuro di voler continuare a abilitare il plugin?",
- "Allow multiple selection": "Consenti selezione multipla",
- "Parent object": "Oggetto padre",
- "Skip getting the total number of table records during paging to speed up loading. It is recommended to enable this option for data tables with a large amount of data": "Ometti calcolo del numero totale di record della tabella durante l'impaginazione per accelerare il caricamento. Si consiglia di abilitare questa opzione per tabelle con grandi quantità di dati",
- "Enable secondary confirmation": "Abilita conferma secondaria",
- "Notification": "Notifica",
- "Ellipsis overflow content": "Contenuto Ellipsis overflow",
- "Hide column": "Nascondi colonna",
- "In configuration mode, the entire column becomes transparent. In non-configuration mode, the entire column will be hidden. Even if the entire column is hidden, its configured default values and other settings will still take effect.": "In modalità di configurazione, l'intera colonna diventa trasparente. In modalità non di configurazione, l'intera colonna verrà nascosta. Anche se l'intera colonna è nascosta, i suoi valori predefiniti configurati e le altre impostazioni avranno comunque effetto."
-}
+{
+ "Display <1><0>100><1>201><2>502><3>1003>1> items per page": "Visualizza <1><0>100><1>201><2>502><3>1003>1> articoli per pagina",
+ "Meet <1><0>All0><1>Any1>1> conditions in the group": "Soddisfa<1><0>Tutte0><1>Qualsiasi1>1>condizioni nel gruppo",
+ "Open in<1><0>Modal0><1>Drawer1><2>Window2>1>": "Apri in<1><0>Modale0><1>Cassetto1><2>Finestra2>1>",
+ "{{count}} filter items": "{{Count}} filtri elementi",
+ "{{count}} more items": "{{Count}} altri elementi",
+ "Total {{count}} items": "{{count}} elementi totali",
+ "Today": "Oggi",
+ "Yesterday": "Ieri",
+ "Tomorrow": "Domani",
+ "Month": "Mese",
+ "Week": "Settimana",
+ "This week": "Questa settimana",
+ "This month": "Questo mese",
+ "This year": "Quest'anno",
+ "Next year": "Anno prossimo",
+ "Last week": "Settimana scorsa",
+ "Next week": "Prossima settimana",
+ "Last month": "Mese scorso",
+ "Next month": "Mese prossimo",
+ "Last quarter": "Ultimo trimestre",
+ "This quarter": "Questo trimestre",
+ "Next quarter": "Prossimo trimestre",
+ "Last year": "Anno scorso",
+ "Last 7 days": "Ultimi 7 giorni",
+ "Last 30 days": "Ultimi 30 giorni",
+ "Last 90 days": "Ultimi 90 giorni",
+ "Next 7 days": "Prossimi 7 giorni",
+ "Next 30 days": "Prossimi 30 giorni",
+ "Next 90 days": "Prossimi 90 giorni",
+ "Work week": "Settimana lavorativa",
+ "Day": "Giorno",
+ "Agenda": "Agenda",
+ "Date": "Data",
+ "Time": "Tempo",
+ "Event": "Evento",
+ "None": "Nessuno",
+ "Unconnected": "Non collegato",
+ "System settings": "Impostazioni di sistema",
+ "System title": "Titolo del sistema",
+ "Settings": "Impostazioni",
+ "Logo": "Logo",
+ "Add menu item": "Aggiungi voce di menu",
+ "Page": "Pagina",
+ "Name": "Nome",
+ "Icon": "Icona",
+ "Group": "Gruppo",
+ "Link": "Collegamento",
+ "Save conditions": "Salva condizioni",
+ "Edit menu item": "Modifica voce di menu",
+ "Move to": "Passa a",
+ "Insert left": "Inserisci a sinistra",
+ "Insert right": "Inserire a destra",
+ "Insert inner": "Inserire dentro",
+ "Delete": "Eliminare",
+ "Disassociate": "Dissociare",
+ "Disassociate record": "Dissociare record",
+ "Are you sure you want to disassociate it?": "Sei sicuro di voler dissociare?",
+ "UI editor": "Editor UI",
+ "Collection": "Raccolta",
+ "Collection selector": "Selettore di raccolta",
+ "Providing certain collections as options for users, typically used in polymorphic or inheritance scenarios": "Fornire alcune raccolte come opzioni per gli utenti, in genere utilizzati negli scenari polimorfici o ereditari",
+ "Collections & Fields": "Raccolte e campi",
+ "All collections": "Tutte le raccolte",
+ "Add category": "Aggiungi categoria",
+ "Enable child collections": "Abilita raccolte figlie",
+ "Allow adding records to the current collection": "Consenti l'aggiunta di record alla raccolta corrente",
+ "Delete category": "Elimina categoria",
+ "Edit category": "Modifica categoria",
+ "Collection category": "Categoria raccolta",
+ "Collection template": "Modello raccolta",
+ "Sort": "Ordina",
+ "Categories": "Categorie",
+ "Visible": "Visibile",
+ "Read only": "Solo lettura",
+ "Easy reading": "Lettura facile",
+ "Hidden": "Nascosto",
+ "Hidden(reserved value)": "Nascosto (valore riservato)",
+ "Not required": "Non richiesto",
+ "Value": "Valore",
+ "Disabled": "Disabilitato",
+ "Enabled": "Abilitato",
+ "Problematic": "Con problemi",
+ "Setting": "Impostazioni",
+ "On": "Acceso",
+ "Off": "Spento",
+ "Empty": "Vuoto",
+ "Linkage rule": "Regola di collegamento",
+ "Linkage rules": "Regole di collegamento",
+ "Condition": "Condizione",
+ "Properties": "Proprietà",
+ "Add linkage rule": "Aggiungi regola di collegamento",
+ "Add property": "Aggiungi proprietà",
+ "Category name": "Nome della categoria",
+ "Roles & Permissions": "Ruoli e autorizzazioni",
+ "Edit profile": "Modifica profilo",
+ "Change password": "Cambia password",
+ "Old password": "Vecchia password",
+ "New password": "Nuova password",
+ "Switch role": "Cambia ruolo",
+ "Super admin": "Super Admin",
+ "Language": "Lingua",
+ "Allow sign up": "Consenti iscrizione",
+ "Enable SMS authentication": "Abilita autenticazione SMS",
+ "Sign out": "Disconnessione",
+ "Cancel": "Annulla",
+ "Submit": "Invia",
+ "Close": "Chiudi",
+ "Set the data scope": "Imposta l'ambito dei dati",
+ "Set data loading mode": "Imposta modalità di caricamento dei dati",
+ "Load all data when filter is empty": "Carica tutti i dati quando il filtro è vuoto",
+ "Do not load data when filter is empty": "Non caricare i dati quando il filtro è vuoto",
+ "Data loading mode": "Modalità di caricamento dei dati",
+ "Data blocks": "Blocchi dati",
+ "Filter blocks": "Blocchi filtro",
+ "Table": "Tabella",
+ "Table OID(Inheritance)": "Tabella OID (eredità)",
+ "Form": "Modulo",
+ "List": "Elenco",
+ "Grid Card": "Scheda griglia",
+ "pixels": "pixel",
+ "Screen size": "Dimensione dello schermo",
+ "Display title": "Visualizza titolo",
+ "Set the count of columns displayed in a row": "Imposta conteggio delle colonne visualizzate in una riga",
+ "Column": "Colonna",
+ "Phone device": "Telefono",
+ "Tablet device": "Tablet",
+ "Desktop device": "Desktop",
+ "Large screen device": "Schermo di grandi dimensioni",
+ "Collapse": "Comprimi",
+ "Select data source": "Seleziona origine dati",
+ "Calendar": "Calendario",
+ "Delete events": "Elimina eventi",
+ "This event": "Questo evento",
+ "This and following events": "Questo e seguenti eventi",
+ "All events": "Tutti gli eventi",
+ "Delete this event?": "Eliminare questo evento?",
+ "Delete Event": "Elimina evento",
+ "Kanban": "Kanban",
+ "Gantt": "Gantt",
+ "Create gantt block": "Crea blocco Gantt",
+ "Progress field": "Campo avanzamento",
+ "Time scale": "Scala del tempo",
+ "Hour": "Ora",
+ "Quarter of day": "Quarto del giorno",
+ "Half of day": "Metà del giorno",
+ "Year": "Anno",
+ "QuarterYear": "Quarto dell' anno",
+ "Select grouping field": "Seleziona campo di raggruppamento",
+ "Media": "Media",
+ "Markdown": "Markdown",
+ "Wysiwyg": "Wysiwyg",
+ "Chart blocks": "Blocchi grafici",
+ "Column chart": "Grafico a colonne",
+ "Bar chart": "Grafico a barre",
+ "Line chart": "Grafico a linee",
+ "Pie chart": "Grafico a torta",
+ "Area chart": "Grafico ad area",
+ "Other chart": "Altro grafico",
+ "Other blocks": "Altri blocchi",
+ "In configuration": "In configurazione",
+ "Chart title": "Titolo grafico",
+ "Chart type": "Tipo grafico",
+ "Chart config": "Configurazione grafico",
+ "Templates": "Modelli",
+ "Select template": "Seleziona modello",
+ "Action logs": "Registri eventi",
+ "Create template": "Crea modello",
+ "Edit markdown": "Modifica Markdown",
+ "Add block": "Aggiungi blocco",
+ "Add new": "Aggiungi nuovo",
+ "Add record": "Aggiungi record",
+ "Add child": "Aggiungi figlio",
+ "Collapse all": "Comprimi tutto",
+ "Expand all": "Espandi tutto",
+ "Expand/Collapse": "Espandi/Comprimi",
+ "Default collapse": "Comprimi di default",
+ "Tree table": "Tabella struttura ad albero",
+ "Custom field display name": "Nome visualizzato campo personalizzato ",
+ "Display fields": "Visualizza campi",
+ "Edit record": "Modifica record",
+ "Delete menu item": "Elimina voce di menu",
+ "Add page": "Aggiungi pagina",
+ "Add group": "Aggiungi gruppo",
+ "Add link": "Aggiungi link",
+ "Insert above": "Inserisci sopra",
+ "Insert below": "Inserisci sotto",
+ "Save": "Salva",
+ "Delete block": "Elimina blocco",
+ "Are you sure you want to delete it?": "Sei sicuro di volerlo eliminare?",
+ "This is a demo text, **supports Markdown syntax**.": "Questo è un testo demo, ** supporta la sintassi di Markdown **.",
+ "Filter": "Filtro",
+ "Connect data blocks": "Collega blocchi di dati",
+ "Action type": "Tipo di azione",
+ "Actions": "Azioni",
+ "Insert": "Inserisci",
+ "Insert if not exists": "Inserisci se non esiste",
+ "Insert if not exists, or update": "Inserisci se non esiste o aggiorna",
+ "Determine whether a record exists by the following fields": "Determina se un record esiste dai seguenti campi",
+ "Update": "Aggiorna",
+ "Update record": "Aggiorna record",
+ "View": "Visualizza",
+ "View record": "Visualizza record",
+ "Refresh": "Refresh",
+ "Data changes": "Modifiche ai dati",
+ "Field name": "Nome campo",
+ "Before change": "Prima delle modifiche",
+ "After change": "Dopo le modifiche",
+ "Delete record": "Elimina record",
+ "Delete collection": "Elimina raccolta",
+ "Create collection": "Crea raccolta",
+ "Collection display name": "Nome visualizzato raccolta",
+ "Collection name": "Nome raccolta",
+ "Inherits": "Eredita",
+ "Primary key, unique identifier, self growth": "Chiave primaria, identificatore univoco, auto-incremento",
+ "Store the creation user of each record": "Memorizza l'utente della creazione di ogni record",
+ "Store the last update user of each record": "Memorizza l'ultimo utente di aggiornamento di ogni record",
+ "Store the creation time of each record": "Memorizza l'orario di creazione di ogni record",
+ "Store the last update time of each record": "Memorizza l'ultimo orario di aggiornamento di ogni record",
+ "More options": "Più opzioni",
+ "Records can be sorted": "I record possono essere ordinati",
+ "Calendar collection": "Raccolta calendario",
+ "General collection": "Raccolta generale",
+ "Connect to database view": "Connetti alla vista del database",
+ "Sync from database": "Sincronizza dal database",
+ "Source collections": "Sorgente raccolte",
+ "Field source": "Sorgente campo",
+ "Preview": "Anteprima",
+ "Randomly generated and can be modified. Support letters, numbers and underscores, must start with an letter.": "Generato casualmente e può essere modificato. Supporta lettere, numeri e underscore, deve iniziare con una lettera.",
+ "Edit": "Modifica",
+ "Edit collection": "Modifica raccolta",
+ "Configure fields": "Configura campi",
+ "Configure columns": "Configura colonne",
+ "Edit field": "Modifica campo",
+ "Override": "Forza",
+ "Override field": "Forza campo",
+ "Configure fields of {{title}}": "Configura campi di {{title}}",
+ "Association fields filter": "Filtro associazione campi",
+ "PK & FK fields": "Campi PK e FK",
+ "Association fields": "Campi associazione",
+ "Choices fields": "Campi scelte",
+ "System fields": "Campi di sistema",
+ "General fields": "Campi generali",
+ "Inherited fields": "Campi ereditati",
+ "Parent collection fields": "Campi raccolta padre",
+ "Basic": "Di base",
+ "Single line text": "Testo a riga singola",
+ "Long text": "Testo lungo",
+ "Phone": "Telefono",
+ "Email": "E-mail",
+ "Number": "Numero",
+ "Integer": "Intero",
+ "Percent": "Percentuale",
+ "Password": "Password",
+ "Advanced type": "Avanzato",
+ "Choices": "Scelte",
+ "Checkbox": "Casella di controllo",
+ "Single select": "Selezione singola",
+ "Multiple select": "Selezione multipla",
+ "Radio group": "Gruppo radio",
+ "Checkbox group": "Gruppo cassella di controllo",
+ "China region": "Regione cinese",
+ "Date & Time": "Data e ora",
+ "Datetime": "DateTime",
+ "Relation": "Relazione",
+ "Link to": "Collegamento a",
+ "Link to description": "Utilizzato per creare relazioni tra raccolte in modo rapido e compatibile con gli scenari più comuni. Adatto per un uso da non sviluppatore. Se presente come campo, è una selezione a discesa utilizzata per selezionare i record dalla raccolta di destinazione. Una volta creato, genererà contemporaneamente i campi associati dell'attuale raccolta nella raccolta di destinazione.",
+ "Sub-table": "Sotto-tabella",
+ "Sub-details": "Sotto-dettagli",
+ "Sub-form(Popover)": "Sotto-modulo (Popover)",
+ "System info": "Informazioni di sistema",
+ "Created at": "Creato il",
+ "Last updated at": "Ultimo aggiornamento il",
+ "Created by": "Creato da",
+ "Last updated by": "Ultimo aggiornamento da",
+ "Add field": "Aggiungi campo",
+ "Field display name": "Nome visualizzato campo",
+ "Field type": "Tipo campo",
+ "Field interface": "Interfaccia campo",
+ "Date format": "Formato data",
+ "Year/Month/Day": "Anno/Mese/Giorno",
+ "Year-Month-Day": "Anno-Mese-Giorno",
+ "Day/Month/Year": "Giorno/Mese/Anno",
+ "Show time": "Mostra orario",
+ "Time format": "Formato tempo",
+ "12 hour": "12 ore",
+ "24 hour": "24 ore",
+ "Relationship type": "Tipo di relazione",
+ "Inverse relationship type": "Tipo di relazione inversa",
+ "Source collection": "Raccolta sorgente",
+ "Source key": "Chiave sorgente",
+ "Target collection": "Raccolta di destinazione",
+ "Through collection": "Attraverso la raccolta",
+ "Target key": "Chiave di destinazione",
+ "Foreign key": "Chiave esterna",
+ "One to one": "Uno a uno",
+ "One to many": "Uno a molti",
+ "Many to one": "Molti a uno",
+ "Many to many": "Molti a molti",
+ "Foreign key 1": "Chiave esterna 1",
+ "Foreign key 2": "Chiave esterna 2",
+ "One to one description": "Usato per creare relazioni one-to-one. Ad esempio, un utente ha un profilo.",
+ "One to many description": "Utilizzato per creare una relazione da uno a molti. Ad esempio, un paese avrà molte città e una città può essere solo in un paese. Se presente come campo, è una sotto-tabella che mostra i record della raccolta associata. Se creato, un campo molti-a-uno viene generato automaticamente nella raccolta associata.",
+ "Many to one description": "Utilizzato per creare relazioni molti-a-uno. Ad esempio, una città può appartenere a un solo paese e un paese può avere molte città. Se presente come campo, è una selezione a discesa utilizzata per selezionare il record dalla raccolta associata. Una volta creato, un campo da uno a molti viene generato automaticamente nella raccolta associata.",
+ "Many to many description": "Utilizzato per creare relazioni molti-a-molti. Ad esempio, uno studente avrà molti insegnanti e un insegnante avrà molti studenti. Se presente come campo, è una selezione a discesa utilizzata per selezionare i record dalla raccolta associata.",
+ "Generated automatically if left blank": "Generato automaticamente se lasciato vuoto",
+ "Display association fields": "Visualizza campi di associazione",
+ "Display field title": "Visualizza titolo campo",
+ "Field component": "Componente campo",
+ "Allow multiple": "Consenti multipli",
+ "Quick upload": "Caricamento rapido",
+ "Select file": "Seleziona file",
+ "Subtable": "Sotto-tabella",
+ "Sub-form": "Sotto-modulo",
+ "Field mode": "Modalità campo",
+ "Allow add new data": "Consenti aggiunta nuovi dati",
+ "Record picker": "Record Picker",
+ "Toggles the subfield mode": "Attiva la modalità Subfield",
+ "Selector mode": "Modalità selettore",
+ "Subtable mode": "Modalità sotto-tabella",
+ "Subform mode": "Modalità sotto-modulo",
+ "Block title": "Titolo blocco",
+ "Pattern": "Modello",
+ "Operator": "Operatore",
+ "Editable": "Modificabile",
+ "Readonly": "Solo lettura",
+ "Easy-reading": "Lettura facile",
+ "Add filter": "Aggiungi filtro",
+ "Add filter group": "Aggiungi gruppo di filtri",
+ "Comparision": "Confronto",
+ "is": "è",
+ "is not": "non lo è",
+ "contains": "contiene",
+ "does not contain": "non contiene",
+ "starts with": "inizia con",
+ "not starts with": "non inizia con",
+ "ends with": "termina con",
+ "not ends with": "non termina con",
+ "is empty": "è vuoto",
+ "is not empty": "non è vuoto",
+ "Edit chart": "Modifica grafico",
+ "Filterable fields": "Campi filtrabili",
+ "Edit button": "Modifica pulsante",
+ "Hide": "Nascondi",
+ "Enable actions": "Abilita azioni",
+ "Import": "Importa",
+ "Export": "Esporta",
+ "Customize": "Personalizza",
+ "Custom": "Personalizzato",
+ "Function": "Funzione",
+ "Popup form": "Modulo Popup",
+ "Flexible popup": "Popup flessibile",
+ "Configure actions": "Configura azioni",
+ "Display order number": "Visualizza numero ordinamento",
+ "Enable drag and drop sorting": "Abilita l'ordinamento con drag and drop",
+ "Triggered when the row is clicked": "Attivato quando si fa clic sulla riga",
+ "Add tab": "Aggiungi scheda",
+ "Disable tabs": "Disabilita schede",
+ "Details": "Dettagli",
+ "Edit form": "Modifica modulo",
+ "Create form": "Crea modulo",
+ "Form (Edit)": "Modulo (modifica)",
+ "Form (Add new)": "Modulo (aggiungi nuovo)",
+ "Edit tab": "Modifica scheda",
+ "Relationship blocks": "Blocchi di relazione",
+ "Select record": "Seleziona Record",
+ "Display name": "Visualizza nome",
+ "Select icon": "Seleziona icona",
+ "Custom column name": "Nome colonna personalizzato",
+ "Edit description": "Modifica descrizione",
+ "Required": "Richiesto",
+ "Unique": "Univoco",
+ "Primary": "Primario",
+ "Auto increment": "Incremento automatico",
+ "Label field": "Campo etichetta",
+ "Default is the ID field": "L'impostazione predefinita è il campo ID",
+ "Set default sorting rules": "Imposta regole di ordinamento predefinite",
+ "Set validation rules": "Imposta regole di convalida",
+ "Max length": "Lunghezza massima",
+ "Min length": "Lunghezza minima",
+ "Maximum": "Massimo",
+ "Minimum": "Minimo",
+ "Max length must greater than min length": "La lunghezza massima deve essere maggiore della lunghezza minima",
+ "Min length must less than max length": "La lunghezza minima deve essere inferiore della lunghezza massima",
+ "Maximum must greater than minimum": "Il massimo deve essere maggiore del minimo",
+ "Minimum must less than maximum": "Il minimo deve essere minore del massimo",
+ "Validation rule": "Regola di convalida",
+ "Add validation rule": "Aggiungi regola di convalida",
+ "Format": "Formato",
+ "Regular expression": "Espressione regolare",
+ "Error message": "Messaggio di errore",
+ "Length": "Lunghezza",
+ "The field value cannot be greater than ": "Il valore del campo non può essere maggiore di",
+ "The field value cannot be less than ": "Il valore del campo non può essere inferiore a",
+ "The field value is not an integer number": "Il valore del campo non è un numero intero",
+ "Set default value": "Imposta valore predefinito",
+ "Default value": "Valore predefinito",
+ "is before": "è prima",
+ "is after": "è dopo",
+ "is on or after": "a partire dal",
+ "is on or before": "entro il",
+ "is between": "è tra",
+ "Upload": "Upload",
+ "Select level": "Seleziona livello",
+ "Province": "Provincia",
+ "City": "Città",
+ "Area": "Zona",
+ "Street": "Strada",
+ "Village": "Villaggio",
+ "Must select to the last level": "Deve selezionare all'ultimo livello",
+ "Move {{title}} to": "Sposta {{title}} a",
+ "Target position": "Posizione di destinazione",
+ "After": "Dopo",
+ "Before": "Prima",
+ "Add {{type}} before \"{{title}}\"": "Aggiungi {{type}} prima di \"{{title}}\"",
+ "Add {{type}} after \"{{title}}\"": "Aggiungi {{type}} dopo \"{{title}}\"",
+ "Add {{type}} in \"{{title}}\"": "Aggiungi {{type}} in \"{{title}}\"",
+ "Original name": "Nome originale",
+ "Custom name": "Nome personalizzato",
+ "Custom Title": "Titolo personalizzato",
+ "Options": "Opzioni",
+ "Option value": "Valore opzione",
+ "Option label": "Etichetta opzione",
+ "Color": "Colore",
+ "Background Color": "Colore sfondo",
+ "Text Align": "Allineamento testo",
+ "Add option": "Aggiungi opzione",
+ "Related collection": "Raccolta correlata",
+ "Allow linking to multiple records": "Consenti collegamento a più record",
+ "Configure calendar": "Configura calendario",
+ "Title field": "Campo titolo",
+ "Custom title": "Titolo personalizzato",
+ "Daily": "Quotidiano",
+ "Weekly": "Settimanale",
+ "Monthly": "Mensile",
+ "Yearly": "Annuale",
+ "Repeats": "Ripeti",
+ "Show lunar": "Mostra lunare",
+ "Start date field": "Campo data di inizio",
+ "End date field": "Campo data di fine",
+ "Navigate": "Naviga",
+ "Title": "Titolo",
+ "Description": "Descrizione",
+ "Select view": "Seleziona vista",
+ "Reset": "Reset",
+ "Importable fields": "Campi importabili",
+ "Exportable fields": "Campi esportabili",
+ "Saved successfully": "Salvataggio riuscito",
+ "Nickname": "Soprannome",
+ "Sign in": "Registrazione",
+ "Sign in via account": "Accedi tramite account",
+ "Sign in via phone": "Accedi via telefono",
+ "Create an account": "Crea un account",
+ "Sign up": "Iscrizione",
+ "Confirm password": "Conferma password",
+ "Log in with an existing account": "Accedi con account esistente",
+ "Signed up successfully. It will jump to the login page.": "Registrazione riuscita. Reindirizzamento alla pagina di accesso.",
+ "Password mismatch": "Password non corretta",
+ "Users": "Utenti",
+ "Verification code": "Codice di verifica",
+ "Send code": "Invia codice",
+ "Retry after {{count}} seconds": "Riprova dopo {{count}} secondi",
+ "Roles": "Ruoli",
+ "Add role": "Aggiungi ruolo",
+ "Role name": "Nome ruolo",
+ "Configure": "Configura",
+ "Configure permissions": "Configura permessi",
+ "Edit role": "Modifica ruolo",
+ "Action permissions": "Permessi su azioni",
+ "Menu permissions": "Permessi su menu",
+ "Menu item name": "Nome voce di menu",
+ "Allow access": "Consenti accesso",
+ "Action name": "Nome azione",
+ "Allow action": "Consenti azione",
+ "Action scope": "Ambito azione",
+ "Operate on new data": "Operare su nuovi dati",
+ "Operate on existing data": "Operare su dati esistenti",
+ "Yes": "Si",
+ "No": "No",
+ "Red": "Rosso",
+ "Magenta": "Magenta",
+ "Volcano": "Vulcano",
+ "Orange": "Arancione",
+ "Gold": "Oro",
+ "Lime": "Lime",
+ "Green": "Verde",
+ "Cyan": "Ciano",
+ "Blue": "Blu",
+ "Geek blue": "Geek Blue",
+ "Purple": "Viola",
+ "Default": "Predefinito",
+ "Add card": "Aggiungi scheda",
+ "edit title": "modifica titolo",
+ "Turn pages": "Volta pagine",
+ "Others": "Altri",
+ "Other records": "Altri record",
+ "Save as template": "Salva come modello",
+ "Save as block template": "Salva come modello blocco",
+ "Block templates": "Modelli blocco",
+ "Block template": "Modello blocco",
+ "Convert reference to duplicate": "Converti riferimento a duplicato",
+ "Template name": "Nome modello",
+ "Block type": "Tipo blocco",
+ "No blocks to connect": "Nessun blocco per connettersi",
+ "Action column": "Colonna azioni",
+ "Records per page": "Record per pagina",
+ "(Fields only)": "(Solo campi)",
+ "Button title": "Titolo pulsante",
+ "Button icon": "Icona pulsante",
+ "Submitted successfully": "Invio riuscito",
+ "Operation succeeded": "L'operazione è riuscita",
+ "Operation failed": "Operazione non riuscita",
+ "Open mode": "Modalità aperta",
+ "Popup size": "Dimensione popup",
+ "Small": "Piccolo",
+ "Middle": "Medio",
+ "Large": "Grande",
+ "Size": "Misura",
+ "Oversized": "Oversize",
+ "Auto": "Auto",
+ "Object Fit": "Adattato all'oggetto",
+ "Cover": "Cover",
+ "Fill": "Riempi",
+ "Contain": "Contiene",
+ "Scale Down": "Ridimensiona",
+ "Menu item title": "Titolo voce di menu",
+ "Menu item icon": "Icona voce di menu",
+ "Target": "Destinazione",
+ "Position": "Posizione",
+ "Insert before": "Inserire prima",
+ "Insert after": "Inserire dopo",
+ "UI Editor": "Editor UI",
+ "ASC": "Asc",
+ "DESC": "Desc",
+ "Add sort field": "Aggiungi campo di ordinamento",
+ "ID": "ID",
+ "Identifier for program usage. Support letters, numbers and underscores, must start with an letter.": "Identificatore per l'utilizzo del programma. Supporta lettere, numeri e underscore, deve iniziare con una lettera.",
+ "Drawer": "Cassetto",
+ "Dialog": "Dialogo",
+ "Delete action": "Elimina azione",
+ "Custom column title": "Titolo colonna personalizzata",
+ "Column title": "Titolo colonna",
+ "Original title: ": "Titolo originale: ",
+ "Delete table column": "Elimina colonna della tabella",
+ "Skip required validation": "Salta convalida richiesta",
+ "Form values": "Valori modulo",
+ "Fields values": "Valori campi",
+ "The field has been deleted": "Il campo è stato eliminato",
+ "When submitting the following fields, the saved values are": "Quando si inviano i seguenti campi, i valori salvati sono",
+ "After successful submission": "Dopo un invio riuscito",
+ "Then": "Poi",
+ "Stay on current page": "Resta sulla pagina corrente",
+ "Redirect to": "Reindirizza a",
+ "Save action": "Salva azione",
+ "Exists": "Esiste",
+ "Add condition": "Aggiungi condizione",
+ "Add condition group": "Aggiungi gruppo di condizioni",
+ "exists": "esiste",
+ "not exists": "non esiste",
+ "Style": "Stile",
+ "=": "=",
+ "≠": "≠",
+ ">": ">",
+ "≥": "≥",
+ "<": "<",
+ "≤": "≤",
+ "Role UID": "Ruolo UID",
+ "Precision": "Precisione",
+ "Expression": "Espressione",
+ "Rich Text": "Testo ricco",
+ "Junction collection": "Raccolta giunzione",
+ "Leave it blank, unless you need a custom intermediate table": "Lascialo vuoto, a meno che tu non abbia bisogno di una tabella intermedia personalizzata",
+ "Fields": "Campi",
+ "Edit field title": "Modifica titolo campo",
+ "Field title": "Titolo campo",
+ "Original field title: ": "Titolo campo originale:",
+ "Edit tooltip": "Modifica suggerimento",
+ "Delete field": "Elimina campo",
+ "Select collection": "Seleziona raccolta",
+ "Blank block": "Blocco vuoto",
+ "Duplicate template": "Modello duplicato",
+ "Reference template": "Modello di riferimento",
+ "Create calendar block": "Crea blocco calendario",
+ "Create kanban block": "Crea blocco kanban",
+ "Grouping field": "Campo di raggruppamento",
+ "Single select and radio fields can be used as the grouping field": "I campi di selezione singoli e radio possono essere utilizzati come campo di raggruppamento",
+ "Tab name": "Nome della scheda",
+ "Current record blocks": "Blocchi record attuale",
+ "Popup message": "Messaggio popup",
+ "Delete role": "Elimina ruolo",
+ "Role display name": "Nome visualizzato ruolo",
+ "Default role": "Ruolo predefinito",
+ "All collections use general action permissions by default; permission configured individually will override the default one.": "Tutte le raccolte utilizzano i permessi di operazioni generali per impostazione predefinita; I permessi configurati individualmente sovrascriveranno quelli predefiniti.",
+ "Allows configuration of the whole system, including UI, collections, permissions, etc.": "Consente la configurazione dell'intero sistema, tra cui interfaccia utente, raccolte, permessi, ecc.",
+ "New menu items are allowed to be accessed by default.": "È possibile accedere a nuove voci di menu per impostazione predefinita.",
+ "Global permissions": "Permessi globali",
+ "General permissions": "Permessi generali",
+ "Global action permissions": "Permessi operazioni globali",
+ "General action permissions": "Permessi operazioni generali",
+ "Plugin settings permissions": "Permessi impostazioni plugin",
+ "Allow to desgin pages": "Consenti progettazione pagine",
+ "Allow to manage plugins": "Consenti gestione plugin",
+ "Allow to configure plugins": "Consenti configurazione plugin",
+ "Allows to configure interface": "Consente di configurare l'interfaccia",
+ "Allows to install, activate, disable plugins": "Consente di installare, attivare, disabilitare i plugin",
+ "Allows to configure plugins": "Consente di configurare i plugin",
+ "Action display name": "Nome visualizzato azione",
+ "Allow": "Permetti",
+ "Data scope": "Ambito dei dati",
+ "Action on new records": "Azione su nuovi record",
+ "Action on existing records": "Azione su record esistenti",
+ "All records": "Tutti i record",
+ "Own records": "Record propri",
+ "Permission policy": "Policy di autorizzazione",
+ "Individual": "Individuale",
+ "General": "Generale",
+ "Accessible": "Accessibile",
+ "Configure permission": "Configura permesso",
+ "Action permission": "Permesso azione",
+ "Field permission": "Permesso campo",
+ "Scope name": "Nome ambito",
+ "Unsaved changes": "Modifiche non salvate",
+ "Are you sure you don't want to save?": "Sei sicuro di non voler salvare?",
+ "Dragging": "Trascina",
+ "Popup": "Popup",
+ "Trigger workflow": "Trigger workflow",
+ "Request API": "Richiesta API",
+ "Assign field values": "Assegna valori del campo",
+ "Constant value": "Valore costante",
+ "Dynamic value": "Valore dinamico",
+ "Current user": "Utente attuale",
+ "Current role": "Ruolo attuale",
+ "Current record": "Record attuale",
+ "Current collection": "Raccolta attuale",
+ "Other collections": "Altre raccolte",
+ "Current popup record": "Record popup attuale",
+ "Parent popup record": "Record popup padre",
+ "Associated records": "Record associati",
+ "Parent record": "Record padre",
+ "Current time": "Ora attuale",
+ "System variables": "Variabili di sistema",
+ "Date variables": "Variabili della data",
+ "Message popup close method": "Metodo di chiusura popup di messaggio",
+ "Automatic close": "Chiudi automaticamente",
+ "Manually close": "Chiudi manualmente",
+ "After successful update": "Dopo un aggiornamento riuscito",
+ "Save record": "Salva record",
+ "Updated successfully": "Aggiornamento riuscito",
+ "After successful save": "Dopo un salvataggio riuscito",
+ "After clicking the custom button, the following field values will be assigned according to the following form.": "Dopo aver fatto clic sul pulsante personalizza, i seguenti valori verranno assegnati in base al seguente modulo.",
+ "After clicking the custom button, the following fields of the current record will be saved according to the following form.": "Dopo aver fatto clic sul pulsante personalizza, i seguenti campi del record corrente verranno salvati in base al seguente modulo.",
+ "Button background color": "Colore sfondo del pulsante",
+ "Highlight": "Evidenziato",
+ "Danger red": "Rosso pericolo",
+ "Custom request": "Richiesta personalizzata",
+ "Request settings": "Impostazioni richiesta",
+ "Request URL": "URL richiesta",
+ "Request method": "Metodo richiesta",
+ "Request query parameters": "Parametri richiesta query",
+ "Request headers": "Intestazioni richiesta",
+ "Request body": "Corpo richiesta",
+ "Request success": "Successo richiesta",
+ "Invalid JSON format": "Formato JSON non valido",
+ "After successful request": "Dopo una richiesta riuscita",
+ "Add exportable field": "Aggiungi campo esportabile",
+ "Audit logs": "Registri audit",
+ "Record ID": "ID record",
+ "User": "Utente",
+ "Field": "Campo",
+ "Select": "Seleziona",
+ "Select field": "Seleziona campo",
+ "Field value changes": "Modifiche valore del campo",
+ "One to one (has one)": "Uno a uno (ne ha uno)",
+ "One to one (belongs to)": "Uno a uno (appartiene a)",
+ "Use the same time zone (GMT) for all users": "Usa lo stesso fuso orario (GMT) per tutti gli utenti",
+ "Province/city/area name": "Nome provincia/città/area",
+ "Enabled languages": "Lingue abilitate",
+ "View all plugins": "Visualizza tutti i plugin",
+ "Print": "Stampa",
+ "Done": "Fatto",
+ "Sign up successfully, and automatically jump to the sign in page": "Iscriviti correttamente e reindirizza automaticamente alla pagina di accesso",
+ "File manager": "File Manager",
+ "ACL": "ACL",
+ "Collection manager": "Responsabile della raccolta",
+ "Plugin manager": "Plugin Manager",
+ "Local": "Locale",
+ "Built-in": "Incorporato",
+ "Marketplace": "Marketplace",
+ "Add plugin": "Aggiungi plugin",
+ "Plugin source": "Sorgente plugin",
+ "Upgrade": "Aggiornamento",
+ "Plugin dependencies check failed": "Controllo delle dipendenze del plugin non riuscito",
+ "More details": "Maggiori dettagli",
+ "Upload new version": "Carica nuova versione",
+ "Version": "Versione",
+ "Npm package": "Pacchetto Npm",
+ "Npm package name": "Nome pacchetto Npm",
+ "Upload plugin": "Carica plugin",
+ "Official plugin": "Plugin ufficiale",
+ "Add type": "Aggiungi tipo",
+ "Changelog": "Changelog",
+ "Dependencies check": "Controllo delle dipendenze",
+ "Update plugin": "Aggiorna plugin",
+ "Installing": "Installazione",
+ "The deletion was successful.": "Cancellazione riuscita.",
+ "Plugin Zip File": "File zip plugin",
+ "Compressed file url": "URL file compresso",
+ "Last updated": "Ultimo aggiornamento",
+ "PackageName": "Nome pacchetto",
+ "DisplayName": "Nome da visualizzare",
+ "Readme": "Readme",
+ "Dependencies compatibility check": "Controllo compatibilità delle dipendenze",
+ "Plugin dependencies check failed, you should change the dependent version to meet the version requirements.": "Controllo delle dipendenze del plugin non riuscito, è necessario modificare la versione dipendente per soddisfare i requisiti della versione.",
+ "Version range": "Range versione",
+ "Plugin's version": "Versione plugin",
+ "Result": "Risultato",
+ "No CHANGELOG.md file": "Nessun file Changelog.md",
+ "No README.md file": "Nessun file readme.md",
+ "Homepage": "Homepage",
+ "Drag and drop the file here or click to upload, file size should not exceed 30M": "Trascina e rilascia il file qui o fai clic per caricare, la dimensione del file non deve superare i 30M",
+ "Dependencies check failed, can't enable.": "Il controllo delle dipendenze non è riuscito, impossibile abilitare.",
+ "Plugin starting...": "Avvio plugin...",
+ "Plugin stopping...": "Interruzione plugin ...",
+ "Are you sure to delete this plugin?": "Sei sicuro di eliminare questo plugin?",
+ "Are you sure to disable this plugin?": "Sei sicuro di disabilitare questo plugin?",
+ "re-download file": "ri-scarica file",
+ "Not enabled": "Non abilitato",
+ "Search plugin": "Ricerca plugin",
+ "Author": "Autore",
+ "Plugin loading failed. Please check the server logs.": "Il caricamento del plugin non è riuscito. Si prega di controllare i registri del server.",
+ "Coming soon...": "Prossimamente...",
+ "All plugin settings": "Tutte le impostazioni del plugin",
+ "Bookmark": "Segnalibro",
+ "Manage all settings": "Gestisci tutte le impostazioni",
+ "Create inverse field in the target collection": "Crea campo inverso nella raccolta di destinazione",
+ "Inverse field name": "Nome campo inverso",
+ "Inverse field display name": "Nome visualizzato campo inverso",
+ "Bulk update": "Aggiornamento di massa",
+ "After successful bulk update": "Dopo un aggiornamento di massa riuscito",
+ "Bulk edit": "Modifica di massa",
+ "Data will be updated": "I dati verranno aggiornati",
+ "Selected": "Selezionato",
+ "All": "Tutto",
+ "Update selected data?": "Aggiornare i dati selezionati?",
+ "Update all data?": "Aggiornare tutti i dati?",
+ "Remains the same": "Rimane lo stesso",
+ "Changed to": "Cambiato in",
+ "Clear": "Cancella",
+ "Add attach": "Aggiungi allegato",
+ "Please select the records to be updated": "Si prega di selezionare i record da aggiornare",
+ "Selector": "Selettore",
+ "Inner": "Interno",
+ "Search and select collection": "Cerca e seleziona la raccolta",
+ "Please fill in the iframe URL": "Si prega di compilare l'URL iFrame",
+ "Fix block": "Fissa blocco",
+ "Plugin name": "Nome plugin",
+ "Plugin tab name": "Nome scheda plugin",
+ "Column width": "Larghezza colonna",
+ "Sortable": "Ordinabile",
+ "Enable link": "Abilita link",
+ "This is likely a NocoBase internals bug. Please open an issue at <1>here1>": "Questo sembra un bug interno di NocoBase. Si prega di aprire un ticket <1>qui1>",
+ "Render Failed": "Rendering non riuscito",
+ "App error": "Errore app",
+ "Feedback": "Feedback",
+ "Try again": "Riprova",
+ "Download logs": "Download registri",
+ "Data template": "Modello dati",
+ "Duplicate": "Duplica",
+ "Duplicating": "Duplicazione",
+ "Duplicate mode": "Modalità duplicazione",
+ "Quick duplicate": "Duplicazione veloce",
+ "Duplicate and continue": "Duplica e continua",
+ "Please configure the duplicate fields": "Si prega di configurare i campi duplicati",
+ "Add": "Aggiungi",
+ "Add new mode": "Modalità aggiungi nuovo",
+ "Quick add": "Aggiunta rapida",
+ "Modal add": "Aggiunta modale",
+ "Save mode": "Modalità salvataggio",
+ "First or create": "Prima o crea",
+ "Update or create": "Aggiorna o crea",
+ "Find by the following fields": "Trova dai seguenti campi",
+ "Create": "Crea",
+ "Current form": "Modulo corrente",
+ "Current object": "Oggetto corrente",
+ "Linkage with form fields": "Collegamento con i campi del modulo",
+ "Allow add new, update and delete actions": "Consenti azioni aggiungi nuovo, aggiorna ed elimina",
+ "Date display format": "Formato di visualizzazione della data",
+ "Table selected records": "Tabella record selezionati",
+ "Tag": "Etichetta",
+ "Tag color field": "Campo colore etichetta",
+ "Sync successfully": "Sincronizzazione riuscita",
+ "Sync from form fields": "Sincronizzazione dai campi del modulo",
+ "Select all": "Seleziona tutto",
+ "Restart": "Ricomincia",
+ "Restart application": "Riavvia applicazione",
+ "Cascade Select": "Seleziona in cascata",
+ "Execute": "Esegui",
+ "Please use a valid SELECT or WITH AS statement": "Si prega di utilizzare un' istruzione SELECT o WITH AS valida",
+ "Please confirm the SQL statement first": "Si prega di confermare prima l'istruzione SQL",
+ "Automatically drop objects that depend on the collection (such as views), and in turn all objects that depend on those objects": "Elimina automaticamente gli oggetti che dipendono dalla raccolta (come le viste) e, a loro volta, tutti gli oggetti che dipendono da tali oggetti",
+ "Sign in with another account": "Accedi con un altro account",
+ "Return to the main application": "Torna alla applicazione principale",
+ "loading": "caricamento",
+ "name is required": "nome richiesto",
+ "data source": "sorgente dati",
+ "Data source": "Sorgente dati",
+ "DataSource": "Sorgente Dati",
+ "The {{type}} \"{{name}}\" may have been deleted. Please remove this {{blockType}}.": "Il {{type}} \"{{name}}\" potrebbe essere stato eliminato. Si prega di rimuovere {{blockType}}.",
+ "Preset fields": "Campi preimpostati",
+ "Home page": "Home page",
+ "Handbook": "Manuale",
+ "License": "Licenza",
+ "Generic properties": "Proprietà generiche",
+ "Specific properties": "Proprietà specifiche",
+ "Used for drag and drop sorting scenarios, supporting grouping sorting": "Utilizzato per scenari con drag and drop, supporta ordinamento raggruppato",
+ "Grouped sorting": "Ordinamento raggruppato",
+ "When a field is selected for grouping, it will be grouped first before sorting.": "Quando viene selezionato un campo per il raggruppamento, verrà raggruppato prima dell'ordinamento.",
+ "Departments": "Dipartimenti",
+ "Main department": "Dipartimento principale",
+ "Department name": "Nome del dipartimento",
+ "Superior department": "Dipartimento superiore",
+ "Owners": "Proprietari",
+ "Plugin settings": "Impostazioni plugin",
+ "Menu": "Menu",
+ "Drag and drop sorting field": "Campi ordinamento drag and drop",
+ "This variable has been deprecated and can be replaced with \"Current form\"": "Questa variabile è stata deprecata e può essere sostituita con \"Current form\"",
+ "The value of this variable is derived from the query string of the page URL. This variable can only be used normally when the page has a query string.": "Il valore di questa variabile deriva dalla stringa di ricerca nell'URL della pagina. Questa variabile può essere utilizzata normalmente solo quando la pagina ha una stringa di ricerca.",
+ "URL search params": "Parametri di ricerca URL",
+ "Expand All": "Espandi tutto",
+ "Search": "Ricerca",
+ "Clear default value": "Cancella valore predefinito",
+ "Open in new window": "Apri in una nuova finestra",
+ "Sorry, the page you visited does not exist.": "Spiacente, la pagina che hai visitato non esiste.",
+ "is none of": "non è nessuno di",
+ "is any of": "è uno di",
+ "Plugin dependency version mismatch": "Mancata corrispondenza della versione della dipendenza del plugin",
+ "The current dependency version of the plugin does not match the version of the application and may not work properly. Are you sure you want to continue enabling the plugin?": "L'attuale versione della dipendenza del plugin non corrisponde alla versione dell'applicazione e potrebbe non funzionare correttamente. Sei sicuro di voler continuare a abilitare il plugin?",
+ "Allow multiple selection": "Consenti selezione multipla",
+ "Parent object": "Oggetto padre",
+ "Skip getting the total number of table records during paging to speed up loading. It is recommended to enable this option for data tables with a large amount of data": "Ometti calcolo del numero totale di record della tabella durante l'impaginazione per accelerare il caricamento. Si consiglia di abilitare questa opzione per tabelle con grandi quantità di dati",
+ "Enable secondary confirmation": "Abilita conferma secondaria",
+ "Notification": "Notifica",
+ "Ellipsis overflow content": "Contenuto Ellipsis overflow",
+ "Hide column": "Nascondi colonna",
+ "In configuration mode, the entire column becomes transparent. In non-configuration mode, the entire column will be hidden. Even if the entire column is hidden, its configured default values and other settings will still take effect.": "In modalità di configurazione, l'intera colonna diventa trasparente. In modalità non di configurazione, l'intera colonna verrà nascosta. Anche se l'intera colonna è nascosta, i suoi valori predefiniti configurati e le altre impostazioni avranno comunque effetto.",
+ "Page number": "Numero di pagina",
+ "Page size": "Numero di voci per pagina",
+ "Enable": "Abilita",
+ "Disable": "Disabilita",
+ "Tab": "Scheda",
+ "Calculation engine": "Motore di calcolo",
+ "Expression collection": "Raccolta espressioni",
+ "Tree collection": "Raccolta struttura ad albero",
+ "Parent ID": "ID record padre",
+ "Parent": "Record padre",
+ "Children": "Record figlio",
+ "Confirm": "Conferma",
+ "Block": "Blocco",
+ "Unnamed": "Senza nome",
+ "SQL collection": "Raccolta dati SQL",
+ "Configure field": "Configura campo",
+ "Username": "Nome utente",
+ "Null": "Null",
+ "Boolean": "Booleano",
+ "String": "Stringa",
+ "Syntax references": "Riferimenti sintassi",
+ "Math.js comes with a large set of built-in functions and constants, and offers an integrated solution to work with different data types.": "Math.js include un ampio set di funzioni e costanti integrate e offre una soluzione integrata per lavorare con diversi tipi di dati.",
+ "Formula.js supports most Microsoft Excel formula functions.": "Formula.js supporta la maggior parte delle funzioni delle formule di Microsoft Excel.",
+ "String template": "Modello stringa",
+ "Simple string replacement, can be used to interpolate variables in a string.": "Sostituzione semplice di stringhe, può essere utilizzata per interpolare variabili in una stringa.",
+ "https://docs.nocobase.com/handbook/calculation-engines/formula": "https://docs-cn.nocobase.com/handbook/calculation-engines/formula",
+ "https://docs.nocobase.com/handbook/calculation-engines/mathjs": "https://docs-cn.nocobase.com/handbook/calculation-engines/mathjs",
+ "Display when unchecked": "Visualizza quando deselezionato",
+ "Allow dissociate": "Consenti dissociazione",
+ "Edit block title & description": "Modifica titolo e descrizione blocco",
+ "Add Markdown": "Aggiungi Markdown",
+ "Must be 1-50 characters in length (excluding @.<>\"'/)": "Deve essere lungo 1-50 caratteri (esclusi @.<>\"'/)",
+ "Data source permissions": "Permessi origine dati",
+ "Now": "Adesso",
+ "Access control": "Controllo accessi",
+ "Remove": "Rimuovi",
+ "Docs": "Documenti",
+ "Enable page header": "Abilita intestazione pagina",
+ "Display page title": "Visualizza titolo pagina",
+ "Edit page title": "Modifica titolo pagina",
+ "Enable page tabs": "Abilita schede pagina",
+ "Constant": "Costante",
+ "Select a variable": "Seleziona una variabile",
+ "Double click to choose entire object": "Doppio clic per scegliere l'intero oggetto",
+ "True": "Vero",
+ "False": "Falso",
+ "Prettify": "Formatta",
+ "Theme": "Tema",
+ "Default theme": "Tema predefinito",
+ "Compact theme": "Tema compatto",
+ "Download": "Scarica",
+ "File type is not supported for previewing, please download it to preview.": "Il tipo di file non è supportato per l'anteprima, scaricalo per visualizzarlo.",
+ "Click or drag file to this area to upload": "Clicca o trascina il file in quest'area per caricarlo",
+ "Support for a single or bulk upload.": "Supporta il caricamento singolo o in blocco.",
+ "File size should not exceed {{size}}.": "La dimensione del file non deve superare {{size}}.",
+ "File size exceeds the limit": "La dimensione del file supera il limite",
+ "File type is not allowed": "Il tipo di file non è consentito",
+ "Incomplete uploading files need to be resolved": "I caricamenti incompleti dei file devono essere completati",
+ "Default title for each record": "Titolo predefinito per ogni record",
+ "If collection inherits, choose inherited collections as templates": "Se la raccolta eredita, scegli le raccolte ereditate come modelli",
+ "Select an existing piece of data as the initialization data for the form": "Seleziona un dato esistente come dati di inizializzazione per il modulo",
+ "Only the selected fields will be used as the initialization data for the form": "Solo i campi selezionati verranno utilizzati come dati di inizializzazione per il modulo",
+ "Template Data": "Dati modello",
+ "Data fields": "Campi dati",
+ "Add template": "Aggiungi modello",
+ "Enable form data template": "Abilita modello dati modulo",
+ "Form data templates": "Modelli dati modulo",
+ "No configuration available.": "Nessuna configurazione disponibile.",
+ "Reload application": "Ricarica applicazione",
+ "The application is reloading, please do not close the page.": "L'applicazione si sta ricaricando, non chiudere la pagina.",
+ "Application reloading": "Ricaricamento applicazione",
+ "Allows to clear cache, reboot application": "Consente di cancellare la cache, riavviare l'applicazione",
+ "The will interrupt service, it may take a few seconds to restart. Are you sure to continue?": "Il riavvio interromperà il servizio, potrebbero essere necessari alcuni secondi. Sei sicuro di continuare?",
+ "Clear cache": "Cancella cache",
+ "Quick create": "Creazione rapida",
+ "Dropdown": "Menu a discesa",
+ "Pop-up": "Popup",
+ "Direct duplicate": "Duplicazione diretta",
+ "Copy into the form and continue to fill in": "Copia nel modulo e continua a compilare",
+ "Failed to load plugin": "Caricamento plugin fallito",
+ "Date range limit": "Limite intervallo date",
+ "MinDate": "Data minima",
+ "MaxDate": "Data massima",
+ "Please select time or variable": "Seleziona ora o variabile",
+ "Filter out a single piece or a group of records as a template": "Filtra un singolo dato o un gruppo di record come modello",
+ "The title field is used to identify the template record": "Il campo titolo è utilizzato per identificare il record modello",
+ "Template fields": "Campi modello",
+ "The selected fields will automatically populate the form": "I campi selezionati popoleranno automaticamente il modulo",
+ "UnSelect all": "Deseleziona tutto",
+ "Secondary confirmation": "Conferma secondaria",
+ "Perform the {{title}}": "Esegui {{title}}",
+ "Are you sure you want to perform the {{title}} action?": "Sei sicuro di voler eseguire l'azione {{title}}?",
+ "Permission denied": "Permesso negato",
+ "Allow add new": "Consenti aggiunta",
+ "Data model": "Modello dati",
+ "Security": "Sicurezza",
+ "Action": "Azione",
+ "System": "Sistema",
+ "Other": "Altro",
+ "Allow selection of existing records": "Consenti selezione di record esistenti",
+ "Data Model": "Modello dati",
+ "Blocks": "Blocchi",
+ "Users & permissions": "Utenti e permessi",
+ "System management": "Gestione sistema",
+ "System & security": "Sistema e sicurezza",
+ "Workflow": "Workflow",
+ "Third party services": "Servizi di terze parti",
+ "Data model tools": "Strumenti modello dati",
+ "Data sources": "Origini dati",
+ "Collections": "Raccolte",
+ "Collection fields": "Campi raccolta",
+ "Authentication": "Autenticazione",
+ "Logging and monitoring": "Registrazione e monitoraggio",
+ "Main": "Principale",
+ "Index": "Indice",
+ "Field values must be unique.": "I valori dei campi devono essere univoci.",
+ "Alphabet": "Alfabeto",
+ "Accuracy": "Precisione",
+ "Millisecond": "Millisecondo",
+ "Second": "Secondo",
+ "Unix Timestamp": "Timestamp Unix",
+ "Field value do not meet the requirements": "Il valore del campo non soddisfa i requisiti",
+ "Field value size is": "La dimensione del valore del campo è",
+ "Unit conversion": "Conversione unità",
+ "Separator": "Separatore",
+ "Prefix": "Prefisso",
+ "Suffix": "Suffisso",
+ "Record unique key": "Chiave univoca record",
+ "Filter target key": "Chiave target filtro",
+ "If a collection lacks a primary key, you must configure a unique record key to locate row records within a block, failure to configure this will prevent the creation of data blocks for the collection.": "Se una raccolta non ha una chiave primaria, devi configurare un record come chiave univoca per individuare i record di ogni riga all'interno di un blocco, la mancata configurazione impedirà la creazione di blocchi di dati per la raccolta.",
+ "Filter data based on the specific field, with the requirement that the field value must be unique.": "Filtra i dati in base a un campo specifico, con il requisito che il valore del campo deve essere univoco.",
+ "Multiply by": "Moltiplica per",
+ "Divide by": "Dividi per",
+ "Scientifix notation": "Notazione scientifica",
+ "Normal": "Normale",
+ "Automatically generate default values": "Genera automaticamente valori predefiniti",
+ "Refresh data on close": "Refresh dei dati alla chiusura",
+ "Refresh data on action": "Refresh dei dati su azione",
+ "Unknown field type": "Tipo di campo sconosciuto",
+ "The following field types are not compatible and do not support output and display": "I seguenti tipi di campo non sono compatibili e non supportano l'output e la visualizzazione",
+ "Not fixed": "Non fissato",
+ "Left fixed": "Fissato a sinistra",
+ "Right fixed": "Fissato a destra",
+ "Fixed": "Colonna fissa",
+ "Set block height": "Imposta altezza del blocco",
+ "Specify height": "Specifica altezza",
+ "Full height": "Altezza completa",
+ "Please configure the URL": "Configura l'URL",
+ "URL": "URL",
+ "Search parameters": "Parametri di ricerca URL",
+ "Do not concatenate search params in the URL": "Non concatenare i parametri di ricerca nell'URL",
+ "Edit link": "Modifica link",
+ "Add parameter": "Aggiungi parametro",
+ "Use simple pagination mode": "Usa modalità di paginazione semplice",
+ "Set Template Engine": "Imposta motore template",
+ "Template engine": "Motore template",
+ "The current user only has the UI configuration permission, but don't have view permission for collection \"{{name}}\"": "L'utente corrente ha solo il permesso di configurazione dell'interfaccia utente, ma non ha il permesso di visualizzazione per la raccolta \"{{name}}\"",
+ "Default value to current time": "Imposta il valore predefinito del campo all'ora corrente",
+ "Automatically update timestamp on update": "Aggiorna automaticamente il timestamp all'aggiornamento",
+ "Default value to current server time": "Imposta il valore predefinito del campo all'ora corrente del server",
+ "Automatically update timestamp to the current server time on update": "Aggiorna automaticamente il timestamp all'ora corrente del server all'aggiornamento",
+ "Datetime (with time zone)": "Data e ora (con fuso orario)",
+ "Datetime (without time zone)": "Data e ora (senza fuso orario)",
+ "DateOnly": "Solo data",
+ "Content": "Contenuto",
+ "Perform the Update record": "Esegui aggiornamento record",
+ "Are you sure you want to perform the Update record action?": "Sei sicuro di voler eseguire l'azione di aggiornamento record?",
+ "Perform the Custom request": "Esegui richiesta personalizzata",
+ "Are you sure you want to perform the Custom request action": "Sei sicuro di voler eseguire l'azione di richiesta personalizzata?",
+ "Perform the Refresh": "Esegui refresh",
+ "Are you sure you want to perform the Refresh action?": "Sei sicuro di voler eseguire l'azione di refresh?",
+ "Perform the Submit": "Esegui l'invio",
+ "Are you sure you want to perform the Submit action?": "Sei sicuro di voler eseguire l'azione di invio?",
+ "Perform the Trigger workflow": "Esegui il trigger del workflow",
+ "Are you sure you want to perform the Trigger workflow action?": "Sei sicuro di voler eseguire l'azione di trigger del workflow?",
+ "Picker": "Selettore",
+ "Quarter": "Trimestre",
+ "Switching the picker, the value and default value will be cleared": "Cambiando il selettore, il valore e il valore predefinito verranno cancellati",
+ "Stay on the current popup or page": "Rimani nel popup o nella pagina corrente",
+ "Return to the previous popup or page": "Torna al popup o alla pagina precedente",
+ "Action after successful submission": "Azione dopo l'invio riuscito",
+ "Allow disassociation": "Consenti la dissociazione",
+ "Layout": "Layout",
+ "Vertical": "Verticale",
+ "Horizontal": "Orizzontale",
+ "Edit group title": "Modifica titolo del gruppo",
+ "Title position": "Posizione titolo",
+ "Dashed": "Tratteggiato",
+ "Left": "Sinistra",
+ "Center": "Centro",
+ "Right": "Destra",
+ "Divider line color": "Colore linea di divisione",
+ "Label align": "Allineamento etichetta",
+ "Label width": "Larghezza etichetta",
+ "When the Label exceeds the width": "Quando l'etichetta supera la larghezza",
+ "Line break": "A capo",
+ "Ellipsis": "Ellipsis",
+ "Set block layout": "Imposta layout del blocco",
+ "Add & Update": "Aggiungi e aggiorna",
+ "Table size": "Dimensione della tabella",
+ "Plugin": "Plugin",
+ "Bulk enable": "Abilitazione in blocco",
+ "Search plugin...": "Cerca plugin...",
+ "Package name": "Nome pacchetto",
+ "Associate": "Associa",
+ "Please add or select record": "Aggiungi o seleziona record",
+ "No data": "Nessun dato",
+ "Fields can only be used correctly if they are defined with an interface.": "I campi possono essere utilizzati correttamente solo se sono definiti con un'interfaccia.",
+ "Unauthenticated. Please sign in to continue.": "Non autenticato. Accedi per continuare.",
+ "User not found. Please sign in again to continue.": "Impossibile trovare l'utente. Accedi nuovamente per continuare.",
+ "Your session has expired. Please sign in again.": "La tua sessione è scaduta. Accedi nuovamente.",
+ "User password changed, please signin again.": "La password dell'utente è stata modificata, accedi di nuovo.",
+ "Show file name": "Mostra nome del file",
+ "Outlined": "Contornato",
+ "Filled": "Riempito",
+ "Two tone": "Due toni",
+ "Desktop routes": "Percorsi desktop",
+ "Route permissions": "Permessi percorso",
+ "New routes are allowed to be accessed by default": "I nuovi percorsi sono accessibili per impostazione predefinita",
+ "Route name": "Nome percorso",
+ "Mobile routes": "Percorsi mobile",
+ "Show in menu": "Mostra nel menu",
+ "Hide in menu": "Nascondi nel menu",
+ "Path": "Percorso",
+ "Type": "Tipo",
+ "Access": "Accesso",
+ "Routes": "Percorsi",
+ "Add child route": "Aggiungi percorso figlio",
+ "Delete routes": "Elimina percorsi",
+ "Delete route": "Elimina percorso",
+ "Are you sure you want to hide these routes in menu?": "Sei sicuro di voler nascondere questi percorsi nel menu?",
+ "Are you sure you want to show these routes in menu?": "Sei sicuro di voler mostrare questi percorsi nel menu?",
+ "Are you sure you want to hide this menu?": "Sei sicuro di voler nascondere questo menu?",
+ "After hiding, this menu will no longer appear in the menu bar. To show it again, you need to go to the route management page to configure it.": "Dopo averlo nascosto, questo menu non apparirà più nella barra dei menu. Per mostrarlo di nuovo, devi andare alla pagina di gestione dei percorsi per configurarlo.",
+ "If selected, the page will display Tab pages.": "Se selezionato, la pagina visualizzerà le pagine schede.",
+ "If selected, the route will be displayed in the menu.": "Se selezionato, il percorso verrà visualizzato nel menu.",
+ "Are you sure you want to hide this tab?": "Sei sicuro di voler nascondere questa scheda?",
+ "After hiding, this tab will no longer appear in the tab bar. To show it again, you need to go to the route management page to set it.": "Dopo averla nascosta, questa scheda non apparirà più nella barra delle schede. Per mostrarla di nuovo, devi andare alla pagina di gestione dei percorsi per configurarlo.",
+ "No pages yet, please configure first": "Nessuna pagina ancora, si prega di configurare prima",
+ "Click the \"UI Editor\" icon in the upper right corner to enter the UI Editor mode": "Cliquez sur l'icône \"Éditeur d'interface utilisateur\" dans le coin supérieur droit pour entrer en mode Éditeur d'interface utilisateur"
+}
diff --git a/packages/core/client/src/locale/ja-JP.json b/packages/core/client/src/locale/ja-JP.json
index 7013d30af2..a90eba9463 100644
--- a/packages/core/client/src/locale/ja-JP.json
+++ b/packages/core/client/src/locale/ja-JP.json
@@ -1039,5 +1039,7 @@
"If selected, the page will display Tab pages.": "選択されている場合、ページはタブページを表示します。",
"If selected, the route will be displayed in the menu.": "選択されている場合、ルートはメニューに表示されます。",
"Are you sure you want to hide this tab?": "このタブを非表示にしますか?",
- "After hiding, this tab will no longer appear in the tab bar. To show it again, you need to go to the route management page to set it.": "非表示にすると、このタブはタブバーに表示されなくなります。再表示するには、ルート管理ページで設定する必要があります。"
+ "After hiding, this tab will no longer appear in the tab bar. To show it again, you need to go to the route management page to set it.": "非表示にすると、このタブはタブバーに表示されなくなります。再表示するには、ルート管理ページで設定する必要があります。",
+ "No pages yet, please configure first": "まだページがありません。最初に設定してください",
+ "Click the \"UI Editor\" icon in the upper right corner to enter the UI Editor mode": "ユーザーインターフェースエディターモードに入るには、右上隅の「UIエディタ」アイコンをクリックしてください"
}
diff --git a/packages/core/client/src/locale/ko-KR.json b/packages/core/client/src/locale/ko-KR.json
index 9e17f29876..8294df8e6b 100644
--- a/packages/core/client/src/locale/ko-KR.json
+++ b/packages/core/client/src/locale/ko-KR.json
@@ -912,5 +912,7 @@
"If selected, the page will display Tab pages.": "선택되면 페이지는 탭 페이지를 표시합니다.",
"If selected, the route will be displayed in the menu.": "선택되면 라우트는 메뉴에 표시됩니다.",
"Are you sure you want to hide this tab?": "이 탭을 숨기시겠습니까?",
- "After hiding, this tab will no longer appear in the tab bar. To show it again, you need to go to the route management page to set it.": "숨기면 이 탭은 탭 바에 더 이상 표시되지 않습니다. 다시 표시하려면 라우트 관리 페이지에서 설정해야 합니다."
+ "After hiding, this tab will no longer appear in the tab bar. To show it again, you need to go to the route management page to set it.": "숨기면 이 탭은 탭 바에 더 이상 표시되지 않습니다. 다시 표시하려면 라우트 관리 페이지에서 설정해야 합니다.",
+ "No pages yet, please configure first": "아직 페이지가 없습니다. 먼저 설정하십시오",
+ "Click the \"UI Editor\" icon in the upper right corner to enter the UI Editor mode": "사용자 인터페이스 편집기 모드에 들어가려면 오른쪽 상단의 \"UI 편집기\" 아이콘을 클릭하십시오"
}
diff --git a/packages/core/client/src/locale/pt-BR.json b/packages/core/client/src/locale/pt-BR.json
index 1bacded113..96025c52d5 100644
--- a/packages/core/client/src/locale/pt-BR.json
+++ b/packages/core/client/src/locale/pt-BR.json
@@ -778,5 +778,7 @@
"If selected, the page will display Tab pages.": "Se selecionado, a página exibirá páginas de abas.",
"If selected, the route will be displayed in the menu.": "Se selecionado, a rota será exibida no menu.",
"Are you sure you want to hide this tab?": "Tem certeza de que deseja ocultar esta guia?",
- "After hiding, this tab will no longer appear in the tab bar. To show it again, you need to go to the route management page to set it.": "Depois de ocultar, esta guia não aparecerá mais na barra de guias. Para mostrá-la novamente, você precisa ir à página de gerenciamento de rotas para configurá-la."
+ "After hiding, this tab will no longer appear in the tab bar. To show it again, you need to go to the route management page to set it.": "Depois de ocultar, esta guia não aparecerá mais na barra de guias. Para mostrá-la novamente, você precisa ir à página de gerenciamento de rotas para configurá-la.",
+ "No pages yet, please configure first": "Ainda não há páginas, por favor configure primeiro",
+ "Click the \"UI Editor\" icon in the upper right corner to enter the UI Editor mode": "Cliquez sur l'icône \"Éditeur d'interface utilisateur\" dans le coin supérieur droit pour entrer en mode Éditeur d'interface utilisateur"
}
diff --git a/packages/core/client/src/locale/ru-RU.json b/packages/core/client/src/locale/ru-RU.json
index c85a74cdd1..af31e21e6a 100644
--- a/packages/core/client/src/locale/ru-RU.json
+++ b/packages/core/client/src/locale/ru-RU.json
@@ -607,5 +607,7 @@
"If selected, the page will display Tab pages.": "Если выбран, страница будет отображать страницы с вкладками.",
"If selected, the route will be displayed in the menu.": "Если выбран, маршрут будет отображаться в меню.",
"Are you sure you want to hide this tab?": "Вы уверены, что хотите скрыть эту вкладку?",
- "After hiding, this tab will no longer appear in the tab bar. To show it again, you need to go to the route management page to set it.": "После скрытия этой вкладки она больше не будет отображаться во вкладке. Чтобы снова отобразить ее, вам нужно будет перейти на страницу управления маршрутами, чтобы установить ее."
+ "After hiding, this tab will no longer appear in the tab bar. To show it again, you need to go to the route management page to set it.": "После скрытия этой вкладки она больше не будет отображаться во вкладке. Чтобы снова отобразить ее, вам нужно будет перейти на страницу управления маршрутами, чтобы установить ее.",
+ "No pages yet, please configure first": "Пока нет страниц, пожалуйста, настройте сначала",
+ "Click the \"UI Editor\" icon in the upper right corner to enter the UI Editor mode": "Нажмите на значок \"Редактор пользовательского интерфейса\" в правом верхнем углу, чтобы войти в режим редактора пользовательского интерфейса"
}
diff --git a/packages/core/client/src/locale/tr-TR.json b/packages/core/client/src/locale/tr-TR.json
index 3845bc75a0..a5572c47fc 100644
--- a/packages/core/client/src/locale/tr-TR.json
+++ b/packages/core/client/src/locale/tr-TR.json
@@ -605,5 +605,7 @@
"If selected, the page will display Tab pages.": "Seçildiğinde, sayfa Tab sayfalarını görüntüleyecektir.",
"If selected, the route will be displayed in the menu.": "Seçildiğinde, yol menüde görüntülenecektir.",
"Are you sure you want to hide this tab?": "Bu sekmeyi gizlemek istediğinizden emin misiniz?",
- "After hiding, this tab will no longer appear in the tab bar. To show it again, you need to go to the route management page to set it.": "Gizlendikten sonra, bu sekme artık sekme çubuğunda görünmeyecek. Onu tekrar göstermek için, rotayı yönetim sayfasına gidip ayarlamanız gerekiyor."
+ "After hiding, this tab will no longer appear in the tab bar. To show it again, you need to go to the route management page to set it.": "Gizlendikten sonra, bu sekme artık sekme çubuğunda görünmeyecek. Onu tekrar göstermek için, rotayı yönetim sayfasına gidip ayarlamanız gerekiyor.",
+ "No pages yet, please configure first": "Henüz sayfa yok, lütfen önce yapılandırın",
+ "Click the \"UI Editor\" icon in the upper right corner to enter the UI Editor mode": "Kullanıcı arayüzü düzenleyici moduna girmek için sağ üst köşedeki \"Kullanıcı Arayüzü Düzenleyici\" simgesine tıklayın"
}
diff --git a/packages/core/client/src/locale/uk-UA.json b/packages/core/client/src/locale/uk-UA.json
index c381200d65..19f6c8dcd9 100644
--- a/packages/core/client/src/locale/uk-UA.json
+++ b/packages/core/client/src/locale/uk-UA.json
@@ -821,5 +821,7 @@
"If selected, the page will display Tab pages.": "Якщо вибрано, сторінка відобразить сторінки з вкладками.",
"If selected, the route will be displayed in the menu.": "Якщо вибрано, маршрут буде відображений в меню.",
"Are you sure you want to hide this tab?": "Ви впевнені, що хочете приховати цю вкладку?",
- "After hiding, this tab will no longer appear in the tab bar. To show it again, you need to go to the route management page to set it.": "Після приховування цієї вкладки вона більше не з'явиться в панелі вкладок. Щоб знову показати її, вам потрібно перейти на сторінку керування маршрутами, щоб налаштувати її."
+ "After hiding, this tab will no longer appear in the tab bar. To show it again, you need to go to the route management page to set it.": "Після приховування цієї вкладки вона більше не з'явиться в панелі вкладок. Щоб знову показати її, вам потрібно перейти на сторінку керування маршрутами, щоб налаштувати її.",
+ "No pages yet, please configure first": "Ще немає сторінок, будь ласка, спочатку налаштуйте",
+ "Click the \"UI Editor\" icon in the upper right corner to enter the UI Editor mode": "Натисніть на значок \"Редактор користувацького інтерфейсу\" в правому верхньому куті, щоб увійти в режим редактора користувацького інтерфейсу."
}
diff --git a/packages/core/client/src/locale/zh-CN.json b/packages/core/client/src/locale/zh-CN.json
index ee7937d066..f0fb2ebbe9 100644
--- a/packages/core/client/src/locale/zh-CN.json
+++ b/packages/core/client/src/locale/zh-CN.json
@@ -258,6 +258,7 @@
"Parent collection fields": "父表字段",
"Basic": "基本类型",
"Single line text": "单行文本",
+ "Automatically remove heading and tailing spaces": "自动去除首尾空白字符",
"Long text": "多行文本",
"Phone": "手机号码",
"Email": "电子邮箱",
@@ -1080,5 +1081,7 @@
"If selected, the page will display Tab pages.": "如果选中,该页面将显示标签页。",
"If selected, the route will be displayed in the menu.": "如果选中,该路由将显示在菜单中。",
"Are you sure you want to hide this tab?": "你确定要隐藏该标签页吗?",
- "After hiding, this tab will no longer appear in the tab bar. To show it again, you need to go to the route management page to set it.": "隐藏后,该标签将不再显示在标签栏中。要想再次显示它,你需要到路由管理页面进行设置。"
+ "After hiding, this tab will no longer appear in the tab bar. To show it again, you need to go to the route management page to set it.": "隐藏后,该标签将不再显示在标签栏中。要想再次显示它,你需要到路由管理页面进行设置。",
+ "No pages yet, please configure first": "暂无页面,请先配置",
+ "Click the \"UI Editor\" icon in the upper right corner to enter the UI Editor mode": "点击右上角的“界面配置”图标,进入界面配置模式"
}
diff --git a/packages/core/client/src/locale/zh-TW.json b/packages/core/client/src/locale/zh-TW.json
index fd825c88cf..1d5fec8a40 100644
--- a/packages/core/client/src/locale/zh-TW.json
+++ b/packages/core/client/src/locale/zh-TW.json
@@ -912,6 +912,7 @@
"If selected, the page will display Tab pages.": "如果選中,該頁面將顯示標籤頁。",
"If selected, the route will be displayed in the menu.": "如果選中,該路由將顯示在菜單中。",
"Are you sure you want to hide this tab?": "你確定要隱藏這個標籤嗎?",
- "After hiding, this tab will no longer appear in the tab bar. To show it again, you need to go to the route management page to set it.": "隱藏後,這個標籤將不再出現在標籤欄中。要再次顯示它,你需要到路由管理頁面進行設置。"
+ "After hiding, this tab will no longer appear in the tab bar. To show it again, you need to go to the route management page to set it.": "隱藏後,這個標籤將不再出現在標籤欄中。要再次顯示它,你需要到路由管理頁面進行設置。",
+ "No pages yet, please configure first": "尚未配置頁面,請先配置",
+ "Click the \"UI Editor\" icon in the upper right corner to enter the UI Editor mode": "點擊右上角的 \"介面設定\" 圖示進入介面設定模式"
}
-
diff --git a/packages/core/client/src/modules/blocks/data-blocks/list/__e2e__/schemaInitializer.test.ts b/packages/core/client/src/modules/blocks/data-blocks/list/__e2e__/schemaInitializer.test.ts
index 3c7db0668b..ab2db6a9c0 100644
--- a/packages/core/client/src/modules/blocks/data-blocks/list/__e2e__/schemaInitializer.test.ts
+++ b/packages/core/client/src/modules/blocks/data-blocks/list/__e2e__/schemaInitializer.test.ts
@@ -40,6 +40,7 @@ test.describe('where list block can be added', () => {
await page.getByLabel('schema-initializer-Grid-').nth(1).hover();
await page.getByRole('menuitem', { name: 'Role name' }).click();
await page.mouse.move(300, 0);
+ await page.reload();
await expect(page.getByLabel('block-item-CollectionField-').getByText('Root')).toBeVisible();
await expect(page.getByLabel('block-item-CollectionField-').getByText('Admin')).toBeVisible();
await expect(page.getByLabel('block-item-CollectionField-').getByText('Member')).toBeVisible();
diff --git a/packages/core/client/src/modules/blocks/filter-blocks/FilterCollectionField.tsx b/packages/core/client/src/modules/blocks/filter-blocks/FilterCollectionField.tsx
index 2f075ecaf3..3a8d26d7ef 100644
--- a/packages/core/client/src/modules/blocks/filter-blocks/FilterCollectionField.tsx
+++ b/packages/core/client/src/modules/blocks/filter-blocks/FilterCollectionField.tsx
@@ -94,9 +94,13 @@ export const FilterCollectionFieldInternalField: React.FC = (props: Props) => {
// @ts-ignore
field.dataSource = uiSchema.enum;
const originalProps =
- compile({ ...(operator?.schema?.['x-component-props'] || {}), ...(uiSchema['x-component-props'] || {}) }) || {};
+ compile({
+ ...(operator?.schema?.['x-component-props'] || {}),
+ ...(uiSchema['x-component-props'] || {}),
+ ...(fieldSchema?.['x-component-props'] || {}),
+ }) || {};
- field.componentProps = merge(originalProps, field.componentProps || {}, dynamicProps || {});
+ field.componentProps = merge(field.componentProps || {}, originalProps, dynamicProps || {});
}, [uiSchemaOrigin]);
if (!uiSchemaOrigin) return null;
diff --git a/packages/core/client/src/modules/fields/component/Input/inputComponentSettings.tsx b/packages/core/client/src/modules/fields/component/Input/inputComponentSettings.tsx
index 8f53455a71..d86283a3f2 100644
--- a/packages/core/client/src/modules/fields/component/Input/inputComponentSettings.tsx
+++ b/packages/core/client/src/modules/fields/component/Input/inputComponentSettings.tsx
@@ -8,6 +8,7 @@
*/
import { useField, useFieldSchema } from '@formily/react';
+import _ from 'lodash';
import { useTranslation } from 'react-i18next';
import { useBlockContext, useOpenModeContext } from '../../../../';
import { SchemaSettings } from '../../../../application/schema-settings/SchemaSettings';
@@ -45,11 +46,12 @@ export const ellipsisSettingsItem: SchemaSettingsItemType = {
tableFieldInstanceList.forEach((fieldInstance) => {
fieldInstance.componentProps.ellipsis = checked;
});
- schema['x-component-props']['ellipsis'] = checked;
} else {
formField.componentProps.ellipsis = checked;
}
+ _.set(schema, 'x-component-props.ellipsis', checked);
+
await dn.emit('patch', {
schema: {
'x-uid': schema['x-uid'],
diff --git a/packages/core/client/src/modules/fields/component/Select/selectComponentFieldSettings.tsx b/packages/core/client/src/modules/fields/component/Select/selectComponentFieldSettings.tsx
index dc3ff40a10..8daaabe25d 100644
--- a/packages/core/client/src/modules/fields/component/Select/selectComponentFieldSettings.tsx
+++ b/packages/core/client/src/modules/fields/component/Select/selectComponentFieldSettings.tsx
@@ -126,6 +126,10 @@ export const getAllowMultiple = (params?: { title: string }) => {
return {
name: 'allowMultiple',
type: 'switch',
+ useVisible() {
+ const isAssociationField = useIsAssociationField();
+ return isAssociationField;
+ },
useComponentProps() {
const { t } = useTranslation();
const field = useField();
diff --git a/packages/core/client/src/modules/menu/LinkMenuItem.tsx b/packages/core/client/src/modules/menu/LinkMenuItem.tsx
index 8217f7de14..aace433ec4 100644
--- a/packages/core/client/src/modules/menu/LinkMenuItem.tsx
+++ b/packages/core/client/src/modules/menu/LinkMenuItem.tsx
@@ -14,6 +14,14 @@ import React, { useCallback, useContext } from 'react';
import { useTranslation } from 'react-i18next';
import { Router } from 'react-router-dom';
import { SchemaInitializerItem } from '../../application';
+import {
+ CollectionManagerProvider,
+ useCollectionManager,
+} from '../../data-source/collection/CollectionManagerProvider';
+import {
+ DataSourceManagerProvider,
+ useDataSourceManager,
+} from '../../data-source/data-source/DataSourceManagerProvider';
import { useGlobalTheme } from '../../global-theme';
import { NocoBaseDesktopRouteType } from '../../route-switch/antd/admin-layout/convertRoutesToSchema';
import {
@@ -34,6 +42,8 @@ export const LinkMenuItem = () => {
const { urlSchema, paramsSchema } = useURLAndHTMLSchema();
const parentRoute = useParentRoute();
const { createRoute } = useNocoBaseRoutes();
+ const dm = useDataSourceManager();
+ const cm = useCollectionManager();
const handleClick = useCallback(async () => {
const values = await FormDialog(
@@ -41,31 +51,35 @@ export const LinkMenuItem = () => {
() => {
const history = createMemoryHistory();
return (
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
);
},
theme,
diff --git a/packages/core/client/src/nocobase-buildin-plugin/index.tsx b/packages/core/client/src/nocobase-buildin-plugin/index.tsx
index b9d61e9123..c53173b30a 100644
--- a/packages/core/client/src/nocobase-buildin-plugin/index.tsx
+++ b/packages/core/client/src/nocobase-buildin-plugin/index.tsx
@@ -74,9 +74,9 @@ const useErrorProps = (app: Application, error: any) => {
}
};
-const AppError: FC<{ error: Error; app: Application }> = observer(
+const AppError: FC<{ error: Error & { title?: string }; app: Application }> = observer(
({ app, error }) => {
- const props = useErrorProps(app, error);
+ const props = getProps(app);
return (
= observer(
transform: translate(0, -50%);
`}
status="error"
- title={app.i18n.t('App error')}
+ title={error?.title || app.i18n.t('App error', { ns: 'client' })}
subTitle={app.i18n.t(error?.message)}
+ {...props}
extra={[
window.location.reload()}>
{app.i18n.t('Try again')}
@@ -124,6 +125,14 @@ const getProps = (app: Application) => {
};
}
+ if (app.error.code === 'APP_WARNING') {
+ return {
+ status: 'warning',
+ title: 'App warning',
+ subTitle: app.error?.message,
+ };
+ }
+
if (app.error.code === 'APP_INITIALIZING') {
return {
status: 'info',
diff --git a/packages/core/client/src/route-switch/antd/admin-layout/__tests__/findFirstPageRoute.test.tsx b/packages/core/client/src/route-switch/antd/admin-layout/__tests__/findFirstPageRoute.test.tsx
new file mode 100644
index 0000000000..5bfd4554d1
--- /dev/null
+++ b/packages/core/client/src/route-switch/antd/admin-layout/__tests__/findFirstPageRoute.test.tsx
@@ -0,0 +1,212 @@
+/**
+ * This file is part of the NocoBase (R) project.
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
+ * Authors: NocoBase Team.
+ *
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
+ * For more information, please refer to: https://www.nocobase.com/agreement.
+ */
+
+import { findFirstPageRoute, NocoBaseDesktopRouteType } from '..';
+import { NocoBaseDesktopRoute } from '../convertRoutesToSchema';
+
+describe('findFirstPageRoute', () => {
+ // 基本测试:空路由数组
+ it('should return undefined for empty routes array', () => {
+ const result = findFirstPageRoute([]);
+ expect(result).toBeUndefined();
+ });
+
+ // 基本测试:undefined 路由数组
+ it('should return undefined for undefined routes', () => {
+ const result = findFirstPageRoute(undefined);
+ expect(result).toBeUndefined();
+ });
+
+ // 测试:只有一个页面路由
+ it('should find the first page route when there is only one page', () => {
+ const routes: NocoBaseDesktopRoute[] = [
+ {
+ id: 1,
+ schemaUid: 'page1',
+ type: NocoBaseDesktopRouteType.page,
+ title: 'Page 1',
+ },
+ ];
+
+ const result = findFirstPageRoute(routes);
+ expect(result).toEqual(routes[0]);
+ });
+
+ // 测试:多个页面路由
+ it('should find the first page route when there are multiple pages', () => {
+ const routes: NocoBaseDesktopRoute[] = [
+ {
+ id: 1,
+ schemaUid: 'page1',
+ type: NocoBaseDesktopRouteType.page,
+ title: 'Page 1',
+ },
+ {
+ id: 2,
+ schemaUid: 'page2',
+ type: NocoBaseDesktopRouteType.page,
+ title: 'Page 2',
+ },
+ ];
+
+ const result = findFirstPageRoute(routes);
+ expect(result).toEqual(routes[0]);
+ });
+
+ // 测试:不同类型的路由混合
+ it('should find the first page route among mixed route types', () => {
+ const routes: NocoBaseDesktopRoute[] = [
+ {
+ id: 1,
+ schemaUid: 'link1',
+ type: NocoBaseDesktopRouteType.link,
+ title: 'Link 1',
+ },
+ {
+ id: 2,
+ schemaUid: 'page1',
+ type: NocoBaseDesktopRouteType.page,
+ title: 'Page 1',
+ },
+ ];
+
+ const result = findFirstPageRoute(routes);
+ expect(result).toEqual(routes[1]);
+ });
+
+ // 测试:隐藏的菜单项
+ it('should ignore hidden menu items', () => {
+ const routes: NocoBaseDesktopRoute[] = [
+ {
+ id: 1,
+ schemaUid: 'page1',
+ type: NocoBaseDesktopRouteType.page,
+ title: 'Page 1',
+ hideInMenu: true,
+ },
+ {
+ id: 2,
+ schemaUid: 'page2',
+ type: NocoBaseDesktopRouteType.page,
+ title: 'Page 2',
+ },
+ ];
+
+ const result = findFirstPageRoute(routes);
+ expect(result).toEqual(routes[1]);
+ });
+
+ // 测试:嵌套路由
+ it('should find page route in nested group', () => {
+ const routes: NocoBaseDesktopRoute[] = [
+ {
+ id: 1,
+ type: NocoBaseDesktopRouteType.group,
+ title: 'Group 1',
+ children: [
+ {
+ id: 11,
+ schemaUid: 'page1',
+ type: NocoBaseDesktopRouteType.page,
+ title: 'Page 1',
+ },
+ ],
+ },
+ ];
+
+ const result = findFirstPageRoute(routes);
+ expect(result).toEqual(routes[0].children[0]);
+ });
+
+ // 测试:多层嵌套路由
+ it('should find page route in deeply nested groups', () => {
+ const routes: NocoBaseDesktopRoute[] = [
+ {
+ id: 1,
+ type: NocoBaseDesktopRouteType.group,
+ title: 'Group 1',
+ children: [
+ {
+ id: 11,
+ type: NocoBaseDesktopRouteType.group,
+ title: 'Group 1-1',
+ children: [
+ {
+ id: 111,
+ schemaUid: 'page1',
+ type: NocoBaseDesktopRouteType.page,
+ title: 'Page 1',
+ },
+ ],
+ },
+ ],
+ },
+ ];
+
+ const result = findFirstPageRoute(routes);
+ expect(result).toEqual(routes[0].children[0].children[0]);
+ });
+
+ // 测试:复杂路由结构
+ it('should find the first visible page in a complex route structure', () => {
+ const routes: NocoBaseDesktopRoute[] = [
+ {
+ id: 1,
+ type: NocoBaseDesktopRouteType.group,
+ title: 'Group 1',
+ hideInMenu: true,
+ children: [
+ {
+ id: 11,
+ schemaUid: 'page1',
+ type: NocoBaseDesktopRouteType.page,
+ title: 'Page 1',
+ },
+ ],
+ },
+ {
+ id: 2,
+ type: NocoBaseDesktopRouteType.group,
+ title: 'Group 2',
+ children: [
+ {
+ id: 21,
+ schemaUid: 'page2',
+ type: NocoBaseDesktopRouteType.page,
+ title: 'Page 2',
+ },
+ ],
+ },
+ ];
+
+ const result = findFirstPageRoute(routes);
+ expect(result).toEqual(routes[1].children[0]);
+ });
+
+ // 测试:空组
+ it('should skip empty groups and find page in next group', () => {
+ const routes: NocoBaseDesktopRoute[] = [
+ {
+ id: 1,
+ type: NocoBaseDesktopRouteType.group,
+ title: 'Empty Group',
+ children: [],
+ },
+ {
+ id: 2,
+ schemaUid: 'page1',
+ type: NocoBaseDesktopRouteType.page,
+ title: 'Page 1',
+ },
+ ];
+
+ const result = findFirstPageRoute(routes);
+ expect(result).toEqual(routes[1]);
+ });
+});
diff --git a/packages/core/client/src/route-switch/antd/admin-layout/index.tsx b/packages/core/client/src/route-switch/antd/admin-layout/index.tsx
index 1cd340913f..bc3fe20fb4 100644
--- a/packages/core/client/src/route-switch/antd/admin-layout/index.tsx
+++ b/packages/core/client/src/route-switch/antd/admin-layout/index.tsx
@@ -7,13 +7,14 @@
* For more information, please refer to: https://www.nocobase.com/agreement.
*/
-import { EllipsisOutlined } from '@ant-design/icons';
+import { EllipsisOutlined, HighlightOutlined } from '@ant-design/icons';
import ProLayout, { RouteContext, RouteContextType } from '@ant-design/pro-layout';
import { HeaderViewProps } from '@ant-design/pro-layout/es/components/Header';
import { css } from '@emotion/css';
-import { Popover, Tooltip } from 'antd';
+import { Popover, Result, Tooltip } from 'antd';
import React, { createContext, FC, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';
import ReactDOM from 'react-dom';
+import { useTranslation } from 'react-i18next';
import { Link, Navigate, Outlet, useLocation, useNavigate } from 'react-router-dom';
import {
ACLRolesCheckProvider,
@@ -197,12 +198,34 @@ const pageContentStyle: React.CSSProperties = {
overflowY: 'auto',
};
+const ShowTipWhenNoPages = () => {
+ const { allAccessRoutes } = useAllAccessDesktopRoutes();
+ const { designable } = useDesignable();
+ const { token } = useToken();
+ const { t } = useTranslation();
+ const location = useLocation();
+
+ // Check if there are any pages
+ if (allAccessRoutes.length === 0 && !designable && ['/admin', '/admin/'].includes(location.pathname)) {
+ return (
+ }
+ title={t('No pages yet, please configure first')}
+ subTitle={t(`Click the "UI Editor" icon in the upper right corner to enter the UI Editor mode`)}
+ />
+ );
+ }
+
+ return null;
+};
+
export const LayoutContent = () => {
/* Use the "nb-subpages-slot-without-header-and-side" class name to locate the position of the subpages */
return (
);
@@ -588,27 +611,11 @@ export const InternalAdminLayout = () => {
);
};
-function getDefaultPageUid(routes: NocoBaseDesktopRoute[]) {
- // Find the first route of type "page"
- for (const route of routes) {
- if (route.type === NocoBaseDesktopRouteType.page) {
- return route.schemaUid;
- }
-
- if (route.children?.length) {
- const result = getDefaultPageUid(route.children);
- if (result) {
- return result;
- }
- }
- }
-}
-
const NavigateToDefaultPage: FC = (props) => {
const { allAccessRoutes } = useAllAccessDesktopRoutes();
const location = useLocationNoUpdate();
- const defaultPageUid = getDefaultPageUid(allAccessRoutes);
+ const defaultPageUid = findFirstPageRoute(allAccessRoutes)?.schemaUid;
return (
<>
@@ -718,36 +725,6 @@ export function findRouteBySchemaUid(schemaUid: string, treeArray: any[]) {
return null;
}
-const MenuItemIcon: FC<{ icon: string; title: string }> = (props) => {
- const { inHeader } = useContext(headerContext);
-
- return (
-
- {(value: RouteContextType) => {
- const { collapsed } = value;
-
- if (collapsed && !inHeader) {
- return props.icon ? (
-
- ) : (
-
- {props.title.charAt(0)}
-
- );
- }
-
- return props.icon ? : null;
- }}
-
- );
-};
-
const MenuDesignerButton: FC<{ testId: string }> = (props) => {
const { render: renderInitializer } = useSchemaInitializerRender(menuItemInitializer);
@@ -869,16 +846,17 @@ function findRouteById(id: string, treeArray: any[]) {
return null;
}
-function findFirstPageRoute(routes: NocoBaseDesktopRoute[]) {
+export function findFirstPageRoute(routes: NocoBaseDesktopRoute[]) {
if (!routes) return;
- for (const route of routes) {
+ for (const route of routes.filter((item) => !item.hideInMenu)) {
if (route.type === NocoBaseDesktopRouteType.page) {
return route;
}
- if (route.children?.length) {
- return findFirstPageRoute(route.children);
+ if (route.type === NocoBaseDesktopRouteType.group && route.children?.length) {
+ const result = findFirstPageRoute(route.children);
+ if (result) return result;
}
}
}
diff --git a/packages/core/client/src/schema-component/antd/action/Action.Link.tsx b/packages/core/client/src/schema-component/antd/action/Action.Link.tsx
index 6c67782876..6656bca46d 100644
--- a/packages/core/client/src/schema-component/antd/action/Action.Link.tsx
+++ b/packages/core/client/src/schema-component/antd/action/Action.Link.tsx
@@ -17,7 +17,12 @@ import { ComposedAction } from './types';
export const ActionLink: ComposedAction = withDynamicSchemaProps(
observer((props: any) => {
return (
-
+
);
}),
{ displayName: 'ActionLink' },
diff --git a/packages/core/client/src/schema-component/antd/action/Action.Modal.tsx b/packages/core/client/src/schema-component/antd/action/Action.Modal.tsx
index 09562cb54d..2411b32ed9 100644
--- a/packages/core/client/src/schema-component/antd/action/Action.Modal.tsx
+++ b/packages/core/client/src/schema-component/antd/action/Action.Modal.tsx
@@ -9,7 +9,7 @@
import { css } from '@emotion/css';
import { observer, useField, useFieldSchema } from '@formily/react';
-import { Modal, ModalProps } from 'antd';
+import { Modal, ModalProps, Skeleton } from 'antd';
import classNames from 'classnames';
import React, { FC, startTransition, useEffect, useState } from 'react';
import { ErrorBoundary, FallbackProps } from 'react-error-boundary';
@@ -53,7 +53,6 @@ const ActionModalContent: FC<{ footerNodeName: string; field: any; schema: any }
if (!deferredVisible) {
return null;
}
-
return (
{
+ if (visible) {
+ const timer = setTimeout(() => setReady(true), delay);
+ return () => clearTimeout(timer);
+ } else {
+ setReady(false);
+ }
+ }, [visible]);
+ return ready;
+}
+
export const InternalActionModal: React.FC> = observer(
(props) => {
const { footerNodeName = 'Action.Modal.Footer', width, zIndex: _zIndex, ...others } = props;
@@ -90,6 +102,7 @@ export const InternalActionModal: React.FC> = obse
}
const zIndex = getZIndex('modal', _zIndex || parentZIndex, props.level || 0);
+ const ready = useDelayedVisible(visible, 200); // 200ms 与 Modal 动画时间一致
return (
@@ -154,7 +167,11 @@ export const InternalActionModal: React.FC> = obse
)
}
>
-
+ {ready ? (
+
+ ) : (
+
+ )}
diff --git a/packages/core/client/src/schema-component/antd/action/Action.tsx b/packages/core/client/src/schema-component/antd/action/Action.tsx
index cb7657877a..968cb2ad16 100644
--- a/packages/core/client/src/schema-component/antd/action/Action.tsx
+++ b/packages/core/client/src/schema-component/antd/action/Action.tsx
@@ -247,7 +247,6 @@ const InternalAction: React.FC = observer(function Com(prop
const aclCtx = useACLActionParamsContext();
const { run, element, disabled: disableAction } = useAction?.(actionCallback) || ({} as any);
const disabled = form.disabled || field.disabled || field.data?.disabled || propsDisabled || disableAction;
-
const buttonStyle = useMemo(() => {
return {
...style,
@@ -538,6 +537,7 @@ const RenderButtonInner = observer(
Designer: React.ElementType;
designerProps: any;
title: string;
+ isLink?: boolean;
}) => {
const {
designable,
@@ -558,6 +558,7 @@ const RenderButtonInner = observer(
Designer,
designerProps,
title,
+ isLink,
...others
} = props;
const debouncedClick = useCallback(
@@ -582,7 +583,8 @@ const RenderButtonInner = observer(
}
const actionTitle = title || field?.title;
-
+ const { opacity, ...restButtonStyle } = buttonStyle;
+ const linkStyle = isLink && opacity ? { opacity } : undefined;
return (
: icon}
+ icon={typeof icon === 'string' ? : icon}
disabled={disabled}
- style={buttonStyle}
+ style={isLink ? restButtonStyle : buttonStyle}
onClick={process.env.__E2E__ ? handleButtonClick : debouncedClick} // E2E 中的点击操作都是很快的,如果加上 debounce 会导致 E2E 测试失败
component={tarComponent || Button}
className={classnames(componentCls, hashId, className, 'nb-action')}
type={type === 'danger' ? undefined : type}
>
- {actionTitle && {actionTitle} }
+ {actionTitle && (
+
+ {actionTitle}
+
+ )}
);
diff --git a/packages/core/client/src/schema-component/antd/association-field/AssociationFieldProvider.tsx b/packages/core/client/src/schema-component/antd/association-field/AssociationFieldProvider.tsx
index 190a5e6f23..740d66fd5f 100644
--- a/packages/core/client/src/schema-component/antd/association-field/AssociationFieldProvider.tsx
+++ b/packages/core/client/src/schema-component/antd/association-field/AssociationFieldProvider.tsx
@@ -14,6 +14,7 @@ import React, { useEffect, useMemo, useState } from 'react';
import { useAPIClient, useRequest } from '../../../api-client';
import { useCollectionManager } from '../../../data-source/collection';
import { markRecordAsNew } from '../../../data-source/collection-record/isNewRecord';
+import { getDataSourceHeaders } from '../../../data-source/utils';
import { useKeepAlive } from '../../../route-switch/antd/admin-layout/KeepAlive';
import { useSchemaComponentContext } from '../../hooks';
import { AssociationFieldContext } from './context';
@@ -67,9 +68,11 @@ export const AssociationFieldProvider = observer(
if (_.isUndefined(ids) || _.isNil(ids) || _.isNaN(ids)) {
return Promise.reject(null);
}
+
return api.request({
resource: collectionField.target,
action: Array.isArray(ids) ? 'list' : 'get',
+ headers: getDataSourceHeaders(cm?.dataSource?.key),
params: {
filter: {
[targetKey]: ids,
diff --git a/packages/core/client/src/schema-component/antd/association-field/AssociationSelect.tsx b/packages/core/client/src/schema-component/antd/association-field/AssociationSelect.tsx
index 57debf2402..ed9969a523 100644
--- a/packages/core/client/src/schema-component/antd/association-field/AssociationSelect.tsx
+++ b/packages/core/client/src/schema-component/antd/association-field/AssociationSelect.tsx
@@ -14,22 +14,28 @@ import { uid } from '@formily/shared';
import { Space, message } from 'antd';
import { isEqual } from 'lodash';
import { isFunction } from 'mathjs';
-import React, { useEffect, useState, useContext } from 'react';
+import React, { useContext, useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import {
ClearCollectionFieldContext,
NocoBaseRecursionField,
RecordProvider,
+ SchemaComponentContext,
useAPIClient,
useCollectionRecordData,
- SchemaComponentContext,
+ useCollectionManager_deprecated,
} from '../../../';
-import { Action } from '../action';
+import { VariablePopupRecordProvider } from '../../../modules/variable/variablesProvider/VariablePopupRecordProvider';
import { isVariable } from '../../../variables/utils/isVariable';
import { getInnermostKeyAndValue } from '../../common/utils/uitls';
+import { Action } from '../action';
import { RemoteSelect, RemoteSelectProps } from '../remote-select';
import useServiceOptions, { useAssociationFieldContext } from './hooks';
-import { VariablePopupRecordProvider } from '../../../modules/variable/variablesProvider/VariablePopupRecordProvider';
+
+const removeIfKeyEmpty = (obj, filterTargetKey) => {
+ if (!obj || typeof obj !== 'object' || !filterTargetKey || Array.isArray(obj)) return obj;
+ return !obj[filterTargetKey] ? null : obj;
+};
export const AssociationFieldAddNewer = (props) => {
const schemaComponentCtxValue = useContext(SchemaComponentContext);
@@ -69,6 +75,11 @@ export const filterAnalyses = (filters): any[] => {
return results;
};
+function getFieldPath(str) {
+ const lastIndex = str.lastIndexOf('.');
+ return lastIndex === -1 ? str : str.slice(0, lastIndex);
+}
+
const InternalAssociationSelect = observer(
(props: AssociationSelectProps) => {
const { objectValue = true, addMode: propsAddMode, ...rest } = props;
@@ -88,6 +99,9 @@ const InternalAssociationSelect = observer(
const resource = api.resource(collectionField.target);
const recordData = useCollectionRecordData();
const schemaComponentCtxValue = useContext(SchemaComponentContext);
+ const { getCollection } = useCollectionManager_deprecated();
+ const associationCollection = getCollection(collectionField.target);
+ const { filterTargetKey } = associationCollection;
useEffect(() => {
const initValue = isVariable(field.value) ? undefined : field.value;
@@ -100,11 +114,14 @@ const InternalAssociationSelect = observer(
//支持深层次子表单
onFieldInputValueChange('*', (fieldPath: any) => {
const linkageFields = filterAnalyses(field.componentProps?.service?.params?.filter) || [];
+ const linageFieldEntire = getFieldPath(fieldPath.address.entire);
+ const targetFieldEntire = getFieldPath(field.address.entire);
if (
linkageFields.includes(fieldPath?.props?.name) &&
field.value &&
isEqual(fieldPath?.indexes, field?.indexes) &&
- fieldPath?.props?.name !== field.props.name
+ fieldPath?.props?.name !== field.props.name &&
+ (!field?.indexes?.length || isEqual(linageFieldEntire, targetFieldEntire))
) {
field.setValue(null);
setInnerValue(null);
@@ -151,7 +168,6 @@ const InternalAssociationSelect = observer(
);
};
- console.log(fieldSchema);
return (
@@ -160,7 +176,7 @@ const InternalAssociationSelect = observer(
{...rest}
size={'middle'}
objectValue={objectValue}
- value={value || innerValue}
+ value={removeIfKeyEmpty(value || innerValue, filterTargetKey)}
service={service}
onChange={(value) => {
const val = value?.length !== 0 ? value : null;
diff --git a/packages/core/client/src/schema-component/antd/association-field/InternalCascadeSelect.tsx b/packages/core/client/src/schema-component/antd/association-field/InternalCascadeSelect.tsx
index 1d1be90a8c..b59dec00ad 100644
--- a/packages/core/client/src/schema-component/antd/association-field/InternalCascadeSelect.tsx
+++ b/packages/core/client/src/schema-component/antd/association-field/InternalCascadeSelect.tsx
@@ -13,6 +13,8 @@ import { FormProvider, connect, createSchemaField, observer, useField, useFieldS
import { uid } from '@formily/shared';
import { Select as AntdSelect, Input, Space, Spin, Tag } from 'antd';
import dayjs from 'dayjs';
+import { css } from '@emotion/css';
+import { debounce } from 'lodash';
import React, { useCallback, useEffect, useMemo, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { useAPIClient, useCollectionManager_deprecated } from '../../../';
@@ -152,7 +154,11 @@ const CascadeSelect = connect((props) => {
} else {
associationField.value = option;
}
- onChange?.(options);
+ if (options.length === 1 && !options[0].value) {
+ onChange?.(null);
+ } else {
+ onChange?.(options);
+ }
};
const onDropdownVisibleChange = async (visible, selectedValue, index) => {
@@ -238,28 +244,38 @@ export const InternalCascadeSelect = observer(
const fieldSchema = useFieldSchema();
const { loading, data: formData } = useDataBlockRequest() || {};
const initialValue = formData?.data?.[fieldSchema.name];
+
+ const handleFormValuesChange = debounce((form) => {
+ if (collectionField.interface === 'm2o') {
+ // 对 m2o 类型字段,提取最后一个非 null 值
+ const value = extractLastNonNullValueObjects(form.values?.[fieldSchema.name]);
+ setTimeout(() => {
+ form.setValuesIn(fieldSchema.name, value);
+ field.value = value;
+ });
+ } else {
+ // 对 select_array 类型字段,过滤掉空对象
+ const value = extractLastNonNullValueObjects(form.values?.select_array).filter(
+ (v) => v && Object.keys(v).length > 0,
+ );
+ setTimeout(() => {
+ field.value = value;
+ });
+ }
+ }, 300);
+
useEffect(() => {
const id = uid();
selectForm.addEffects(id, () => {
onFormValuesChange((form) => {
- if (collectionField.interface === 'm2o') {
- const value = extractLastNonNullValueObjects(form.values?.[fieldSchema.name]);
- setTimeout(() => {
- form.setValuesIn(fieldSchema.name, value);
- field.value = value;
- });
- } else {
- const value = extractLastNonNullValueObjects(form.values?.select_array).filter(
- (v) => v && Object.keys(v).length > 0,
- );
- setTimeout(() => {
- field.value = value;
- });
- }
+ handleFormValuesChange(form);
});
});
+
return () => {
selectForm.removeEffects(id);
+ // 清除防抖定时器
+ handleFormValuesChange.cancel();
};
}, []);
@@ -282,6 +298,24 @@ export const InternalCascadeSelect = observer(
items: {
type: 'void',
'x-component': 'Space',
+ 'x-component-props': {
+ style: {
+ width: '100%',
+ display: 'flex',
+ },
+ className: css`
+ .ant-formily-item-control {
+ max-width: 100% !important;
+ }
+ .ant-space-item:nth-child(1) {
+ flex: 0.1;
+ }
+
+ .ant-space-item:nth-child(2) {
+ flex: 3;
+ }
+ `,
+ },
properties: {
sort: {
type: 'void',
diff --git a/packages/core/client/src/schema-component/antd/association-field/SubTable.tsx b/packages/core/client/src/schema-component/antd/association-field/SubTable.tsx
index 38209fca61..53225b028c 100644
--- a/packages/core/client/src/schema-component/antd/association-field/SubTable.tsx
+++ b/packages/core/client/src/schema-component/antd/association-field/SubTable.tsx
@@ -256,8 +256,7 @@ export const SubTable: any = observer(
{field.editable && (
() {
};
}
+// 用于获取关系字段请求数据时所需的一些参数
export default function useServiceOptions(props) {
const { action = 'list', service, useOriginalFilter } = props;
const fieldSchema = useFieldSchema();
diff --git a/packages/core/client/src/schema-component/antd/collection-select/__tests__/collection-select.test.tsx b/packages/core/client/src/schema-component/antd/collection-select/__tests__/collection-select.test.tsx
index 3a69dc4335..54f4849a7f 100644
--- a/packages/core/client/src/schema-component/antd/collection-select/__tests__/collection-select.test.tsx
+++ b/packages/core/client/src/schema-component/antd/collection-select/__tests__/collection-select.test.tsx
@@ -54,7 +54,7 @@ describe('CollectionSelect', () => {
role="button"
>