@nocobase/client 0.7.0-alpha.26 → 0.7.0-alpha.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/esm/block-provider/hooks/index.js +10 -2
  2. package/esm/block-provider/hooks/index.js.map +1 -1
  3. package/esm/collection-manager/hooks/useCollection.d.ts +1 -0
  4. package/esm/collection-manager/types.d.ts +1 -0
  5. package/esm/collection-manager/types.js.map +1 -1
  6. package/esm/locale/en_US.d.ts +4 -0
  7. package/esm/locale/en_US.js +6 -1
  8. package/esm/locale/en_US.js.map +1 -1
  9. package/esm/locale/index.d.ts +29 -7
  10. package/esm/locale/zh_CN.d.ts +25 -7
  11. package/esm/locale/zh_CN.js +25 -7
  12. package/esm/locale/zh_CN.js.map +1 -1
  13. package/esm/schema-component/antd/action/Action.Designer.js +6 -6
  14. package/esm/schema-component/antd/action/Action.Designer.js.map +1 -1
  15. package/esm/schema-component/antd/action/Action.Drawer.js +60 -3
  16. package/esm/schema-component/antd/action/Action.Drawer.js.map +1 -1
  17. package/esm/schema-component/antd/action/Action.js +36 -19
  18. package/esm/schema-component/antd/action/Action.js.map +1 -1
  19. package/esm/schema-component/antd/action/context.d.ts +2 -0
  20. package/esm/schema-component/antd/action/context.js.map +1 -1
  21. package/esm/schema-component/antd/action/hooks.d.ts +2 -0
  22. package/esm/schema-component/antd/filter/Filter.Action.Designer.js +1 -1
  23. package/esm/schema-component/antd/filter/Filter.Action.Designer.js.map +1 -1
  24. package/esm/schema-component/antd/filter/FilterGroup.js +12 -9
  25. package/esm/schema-component/antd/filter/FilterGroup.js.map +1 -1
  26. package/esm/schema-component/antd/filter/FilterItem.js +1 -1
  27. package/esm/schema-component/antd/filter/FilterItem.js.map +1 -1
  28. package/esm/schema-component/antd/form-v2/Form.js +27 -3
  29. package/esm/schema-component/antd/form-v2/Form.js.map +1 -1
  30. package/esm/schema-component/antd/grid/Grid.d.ts +2 -0
  31. package/esm/schema-component/antd/grid/Grid.js +10 -3
  32. package/esm/schema-component/antd/grid/Grid.js.map +1 -1
  33. package/esm/schema-component/antd/menu/Menu.Designer.js +35 -23
  34. package/esm/schema-component/antd/menu/Menu.Designer.js.map +1 -1
  35. package/esm/schema-component/antd/menu/Menu.js +3 -3
  36. package/esm/schema-component/antd/menu/Menu.js.map +1 -1
  37. package/esm/schema-component/antd/record-picker/ReadPrettyRecordPicker.js +3 -1
  38. package/esm/schema-component/antd/record-picker/ReadPrettyRecordPicker.js.map +1 -1
  39. package/esm/schema-component/antd/table/Table.Void.Designer.js +1 -1
  40. package/esm/schema-component/antd/table/Table.Void.Designer.js.map +1 -1
  41. package/esm/schema-component/antd/table-v2/Table.Column.Designer.js +2 -2
  42. package/esm/schema-component/antd/table-v2/Table.Column.Designer.js.map +1 -1
  43. package/esm/schema-component/antd/table-v2/TableBlockDesigner.js +2 -2
  44. package/esm/schema-component/antd/table-v2/TableBlockDesigner.js.map +1 -1
  45. package/esm/schema-component/antd/table-v2/TableSelectorDesigner.js +1 -1
  46. package/esm/schema-component/antd/table-v2/TableSelectorDesigner.js.map +1 -1
  47. package/esm/schema-component/antd/tabs/Tabs.Designer.js +13 -2
  48. package/esm/schema-component/antd/tabs/Tabs.Designer.js.map +1 -1
  49. package/esm/schema-component/common/dnd-context/index.js +2 -1
  50. package/esm/schema-component/common/dnd-context/index.js.map +1 -1
  51. package/esm/schema-initializer/buttons/BlockInitializers.js +1 -1
  52. package/esm/schema-initializer/buttons/BlockInitializers.js.map +1 -1
  53. package/esm/schema-initializer/buttons/CreateFormBlockInitializers.js +2 -1
  54. package/esm/schema-initializer/buttons/CreateFormBlockInitializers.js.map +1 -1
  55. package/esm/schema-initializer/buttons/FormItemInitializers.js +3 -13
  56. package/esm/schema-initializer/buttons/FormItemInitializers.js.map +1 -1
  57. package/esm/schema-initializer/buttons/ReadPrettyFormItemInitializers.js +3 -13
  58. package/esm/schema-initializer/buttons/ReadPrettyFormItemInitializers.js.map +1 -1
  59. package/esm/schema-initializer/buttons/RecordBlockInitializers.js +2 -1
  60. package/esm/schema-initializer/buttons/RecordBlockInitializers.js.map +1 -1
  61. package/esm/schema-settings/GeneralSchemaDesigner.js +17 -6
  62. package/esm/schema-settings/GeneralSchemaDesigner.js.map +1 -1
  63. package/esm/schema-templates/schemas/uiSchemaTemplates.js +67 -10
  64. package/esm/schema-templates/schemas/uiSchemaTemplates.js.map +1 -1
  65. package/esm/workflow/WorkflowCanvas.js +2 -2
  66. package/esm/workflow/WorkflowCanvas.js.map +1 -1
  67. package/esm/workflow/WorkflowLink.js +1 -1
  68. package/esm/workflow/WorkflowLink.js.map +1 -1
  69. package/esm/workflow/calculators.js +7 -5
  70. package/esm/workflow/calculators.js.map +1 -1
  71. package/esm/workflow/nodes/condition.d.ts +1 -1
  72. package/esm/workflow/nodes/condition.js +16 -13
  73. package/esm/workflow/nodes/condition.js.map +1 -1
  74. package/esm/workflow/nodes/create.d.ts +1 -0
  75. package/esm/workflow/nodes/index.js +4 -4
  76. package/esm/workflow/nodes/index.js.map +1 -1
  77. package/esm/workflow/nodes/parallel.js +8 -5
  78. package/esm/workflow/nodes/parallel.js.map +1 -1
  79. package/esm/workflow/nodes/query.js +1 -1
  80. package/esm/workflow/nodes/query.js.map +1 -1
  81. package/esm/workflow/nodes/update.d.ts +2 -1
  82. package/esm/workflow/nodes/update.js +12 -1
  83. package/esm/workflow/nodes/update.js.map +1 -1
  84. package/esm/workflow/schemas/collection.d.ts +1 -0
  85. package/esm/workflow/schemas/collection.js +3 -2
  86. package/esm/workflow/schemas/collection.js.map +1 -1
  87. package/esm/workflow/schemas/workflows.js +3 -2
  88. package/esm/workflow/schemas/workflows.js.map +1 -1
  89. package/esm/workflow/style.d.ts +1 -0
  90. package/esm/workflow/style.js +5 -4
  91. package/esm/workflow/style.js.map +1 -1
  92. package/esm/workflow/triggers/{model.d.ts → collection.d.ts} +5 -4
  93. package/esm/workflow/triggers/{model.js → collection.js} +23 -31
  94. package/esm/workflow/triggers/collection.js.map +1 -0
  95. package/esm/workflow/triggers/index.js +11 -8
  96. package/esm/workflow/triggers/index.js.map +1 -1
  97. package/lib/block-provider/hooks/index.js +9 -1
  98. package/lib/block-provider/hooks/index.js.map +1 -1
  99. package/lib/collection-manager/hooks/useCollection.d.ts +1 -0
  100. package/lib/collection-manager/types.d.ts +1 -0
  101. package/lib/collection-manager/types.js.map +1 -1
  102. package/lib/locale/en_US.d.ts +4 -0
  103. package/lib/locale/en_US.js +6 -1
  104. package/lib/locale/en_US.js.map +1 -1
  105. package/lib/locale/index.d.ts +29 -7
  106. package/lib/locale/zh_CN.d.ts +25 -7
  107. package/lib/locale/zh_CN.js +25 -7
  108. package/lib/locale/zh_CN.js.map +1 -1
  109. package/lib/schema-component/antd/action/Action.Designer.js +6 -6
  110. package/lib/schema-component/antd/action/Action.Designer.js.map +1 -1
  111. package/lib/schema-component/antd/action/Action.Drawer.js +59 -2
  112. package/lib/schema-component/antd/action/Action.Drawer.js.map +1 -1
  113. package/lib/schema-component/antd/action/Action.js +35 -18
  114. package/lib/schema-component/antd/action/Action.js.map +1 -1
  115. package/lib/schema-component/antd/action/context.d.ts +2 -0
  116. package/lib/schema-component/antd/action/context.js.map +1 -1
  117. package/lib/schema-component/antd/action/hooks.d.ts +2 -0
  118. package/lib/schema-component/antd/filter/Filter.Action.Designer.js +1 -1
  119. package/lib/schema-component/antd/filter/Filter.Action.Designer.js.map +1 -1
  120. package/lib/schema-component/antd/filter/FilterGroup.js +12 -9
  121. package/lib/schema-component/antd/filter/FilterGroup.js.map +1 -1
  122. package/lib/schema-component/antd/filter/FilterItem.js +1 -1
  123. package/lib/schema-component/antd/filter/FilterItem.js.map +1 -1
  124. package/lib/schema-component/antd/form-v2/Form.js +29 -5
  125. package/lib/schema-component/antd/form-v2/Form.js.map +1 -1
  126. package/lib/schema-component/antd/grid/Grid.d.ts +2 -0
  127. package/lib/schema-component/antd/grid/Grid.js +13 -4
  128. package/lib/schema-component/antd/grid/Grid.js.map +1 -1
  129. package/lib/schema-component/antd/menu/Menu.Designer.js +35 -23
  130. package/lib/schema-component/antd/menu/Menu.Designer.js.map +1 -1
  131. package/lib/schema-component/antd/menu/Menu.js +2 -2
  132. package/lib/schema-component/antd/menu/Menu.js.map +1 -1
  133. package/lib/schema-component/antd/record-picker/ReadPrettyRecordPicker.js +3 -1
  134. package/lib/schema-component/antd/record-picker/ReadPrettyRecordPicker.js.map +1 -1
  135. package/lib/schema-component/antd/table/Table.Void.Designer.js +1 -1
  136. package/lib/schema-component/antd/table/Table.Void.Designer.js.map +1 -1
  137. package/lib/schema-component/antd/table-v2/Table.Column.Designer.js +2 -2
  138. package/lib/schema-component/antd/table-v2/Table.Column.Designer.js.map +1 -1
  139. package/lib/schema-component/antd/table-v2/TableBlockDesigner.js +2 -2
  140. package/lib/schema-component/antd/table-v2/TableBlockDesigner.js.map +1 -1
  141. package/lib/schema-component/antd/table-v2/TableSelectorDesigner.js +1 -1
  142. package/lib/schema-component/antd/table-v2/TableSelectorDesigner.js.map +1 -1
  143. package/lib/schema-component/antd/tabs/Tabs.Designer.js +13 -2
  144. package/lib/schema-component/antd/tabs/Tabs.Designer.js.map +1 -1
  145. package/lib/schema-component/common/dnd-context/index.js +2 -1
  146. package/lib/schema-component/common/dnd-context/index.js.map +1 -1
  147. package/lib/schema-initializer/buttons/BlockInitializers.js +1 -1
  148. package/lib/schema-initializer/buttons/BlockInitializers.js.map +1 -1
  149. package/lib/schema-initializer/buttons/CreateFormBlockInitializers.js +2 -1
  150. package/lib/schema-initializer/buttons/CreateFormBlockInitializers.js.map +1 -1
  151. package/lib/schema-initializer/buttons/FormItemInitializers.js +3 -13
  152. package/lib/schema-initializer/buttons/FormItemInitializers.js.map +1 -1
  153. package/lib/schema-initializer/buttons/ReadPrettyFormItemInitializers.js +3 -13
  154. package/lib/schema-initializer/buttons/ReadPrettyFormItemInitializers.js.map +1 -1
  155. package/lib/schema-initializer/buttons/RecordBlockInitializers.js +2 -1
  156. package/lib/schema-initializer/buttons/RecordBlockInitializers.js.map +1 -1
  157. package/lib/schema-settings/GeneralSchemaDesigner.js +15 -4
  158. package/lib/schema-settings/GeneralSchemaDesigner.js.map +1 -1
  159. package/lib/schema-templates/schemas/uiSchemaTemplates.js +67 -10
  160. package/lib/schema-templates/schemas/uiSchemaTemplates.js.map +1 -1
  161. package/lib/workflow/WorkflowCanvas.js +2 -2
  162. package/lib/workflow/WorkflowCanvas.js.map +1 -1
  163. package/lib/workflow/WorkflowLink.js +1 -1
  164. package/lib/workflow/WorkflowLink.js.map +1 -1
  165. package/lib/workflow/calculators.js +7 -5
  166. package/lib/workflow/calculators.js.map +1 -1
  167. package/lib/workflow/nodes/condition.d.ts +1 -1
  168. package/lib/workflow/nodes/condition.js +13 -10
  169. package/lib/workflow/nodes/condition.js.map +1 -1
  170. package/lib/workflow/nodes/create.d.ts +1 -0
  171. package/lib/workflow/nodes/index.js +3 -3
  172. package/lib/workflow/nodes/index.js.map +1 -1
  173. package/lib/workflow/nodes/parallel.js +8 -5
  174. package/lib/workflow/nodes/parallel.js.map +1 -1
  175. package/lib/workflow/nodes/query.js +1 -1
  176. package/lib/workflow/nodes/query.js.map +1 -1
  177. package/lib/workflow/nodes/update.d.ts +2 -1
  178. package/lib/workflow/nodes/update.js +12 -1
  179. package/lib/workflow/nodes/update.js.map +1 -1
  180. package/lib/workflow/schemas/collection.d.ts +1 -0
  181. package/lib/workflow/schemas/collection.js +3 -2
  182. package/lib/workflow/schemas/collection.js.map +1 -1
  183. package/lib/workflow/schemas/workflows.js +3 -2
  184. package/lib/workflow/schemas/workflows.js.map +1 -1
  185. package/lib/workflow/style.d.ts +1 -0
  186. package/lib/workflow/style.js +6 -5
  187. package/lib/workflow/style.js.map +1 -1
  188. package/lib/workflow/triggers/{model.d.ts → collection.d.ts} +5 -4
  189. package/lib/workflow/triggers/{model.js → collection.js} +22 -30
  190. package/lib/workflow/triggers/collection.js.map +1 -0
  191. package/lib/workflow/triggers/index.js +10 -7
  192. package/lib/workflow/triggers/index.js.map +1 -1
  193. package/package.json +3 -3
  194. package/src/block-provider/hooks/index.ts +10 -2
  195. package/src/collection-manager/types.ts +1 -0
  196. package/src/locale/en_US.ts +8 -1
  197. package/src/locale/zh_CN.ts +27 -7
  198. package/src/schema-component/antd/action/Action.Designer.tsx +2 -2
  199. package/src/schema-component/antd/action/Action.Drawer.tsx +20 -3
  200. package/src/schema-component/antd/action/Action.tsx +19 -5
  201. package/src/schema-component/antd/action/context.tsx +2 -0
  202. package/src/schema-component/antd/filter/Filter.Action.Designer.tsx +1 -1
  203. package/src/schema-component/antd/filter/FilterGroup.tsx +14 -9
  204. package/src/schema-component/antd/filter/FilterItem.tsx +1 -1
  205. package/src/schema-component/antd/form-v2/Form.tsx +29 -3
  206. package/src/schema-component/antd/grid/Grid.tsx +31 -20
  207. package/src/schema-component/antd/menu/Menu.Designer.tsx +36 -26
  208. package/src/schema-component/antd/menu/Menu.tsx +12 -2
  209. package/src/schema-component/antd/record-picker/ReadPrettyRecordPicker.tsx +3 -1
  210. package/src/schema-component/antd/table/Table.Void.Designer.tsx +1 -1
  211. package/src/schema-component/antd/table-v2/Table.Column.Designer.tsx +1 -1
  212. package/src/schema-component/antd/table-v2/TableBlockDesigner.tsx +2 -2
  213. package/src/schema-component/antd/table-v2/TableSelectorDesigner.tsx +1 -1
  214. package/src/schema-component/antd/tabs/Tabs.Designer.tsx +1 -1
  215. package/src/schema-component/common/dnd-context/index.tsx +2 -1
  216. package/src/schema-initializer/buttons/BlockInitializers.tsx +1 -1
  217. package/src/schema-initializer/buttons/CreateFormBlockInitializers.tsx +4 -1
  218. package/src/schema-initializer/buttons/FormItemInitializers.tsx +5 -3
  219. package/src/schema-initializer/buttons/ReadPrettyFormItemInitializers.tsx +5 -3
  220. package/src/schema-initializer/buttons/RecordBlockInitializers.tsx +4 -1
  221. package/src/schema-settings/GeneralSchemaDesigner.tsx +20 -5
  222. package/src/schema-templates/schemas/uiSchemaTemplates.ts +23 -10
  223. package/src/workflow/WorkflowCanvas.tsx +2 -3
  224. package/src/workflow/WorkflowLink.tsx +1 -1
  225. package/src/workflow/calculators.tsx +10 -8
  226. package/src/workflow/nodes/condition.tsx +21 -38
  227. package/src/workflow/nodes/index.tsx +6 -4
  228. package/src/workflow/nodes/parallel.tsx +10 -7
  229. package/src/workflow/nodes/query.tsx +1 -1
  230. package/src/workflow/nodes/update.tsx +4 -1
  231. package/src/workflow/schemas/collection.ts +3 -3
  232. package/src/workflow/schemas/workflows.ts +3 -2
  233. package/src/workflow/style.tsx +4 -0
  234. package/src/workflow/triggers/{model.tsx → collection.tsx} +25 -25
  235. package/src/workflow/triggers/index.tsx +13 -6
  236. package/esm/workflow/triggers/model.js.map +0 -1
  237. package/lib/workflow/triggers/model.js.map +0 -1
@@ -318,6 +318,7 @@ export default {
318
318
 
319
319
  'Skip required validation': '跳过必填校验',
320
320
  'Form values': '表单值',
321
+ 'Fields values': '字段值',
321
322
  'When submitting the following fields, the saved values are': '提交以下字段时,保存的值为',
322
323
  'After successful submission': '提交成功后',
323
324
  'Then': '然后',
@@ -407,25 +408,24 @@ export default {
407
408
 
408
409
  // plugins/workflow
409
410
  'Workflow': '工作流',
410
- 'Configure workflow': '流程配置',
411
- 'Executions': '执行历史',
411
+ 'Execution History': '执行历史',
412
412
  'Trigger type': '触发方式',
413
413
  'Description': '描述',
414
414
  'Status': '状态',
415
415
  'Enabled': '启用',
416
416
  'Disabled': '禁用',
417
- 'Trigger configuration': '触发器配置',
418
417
  'Load failed': '加载失败',
419
418
 
420
- 'Model event': '数据表事件',
419
+ 'Trigger': '触发器',
420
+ 'Collection event': '数据表事件',
421
421
  'Trigger on': '触发时机',
422
422
  'After record added': '新增数据后',
423
423
  'After record updated': '更新数据后',
424
424
  'After record added or updated': '新增或更新数据后',
425
425
  'After record deleted': '删除数据后',
426
426
  'Changed fields': '发生变动的字段',
427
- 'Select the fields which changed will trigger the event only': '只有被选中的某个字段发生变动时才会触发。如果不选择,则表示任何字段变动时都会触发。新增或删除数据时,任意字段都被认为发生变动。',
428
- 'Match condition': '满足条件',
427
+ 'Triggered only if one of the selected fields changes. If unselected, it means that it will be triggered when any field changes. When record is added or deleted, any field is considered to have been changed.': '只有被选中的某个字段发生变动时才会触发。如果不选择,则表示任何字段变动时都会触发。新增或删除数据时,任意字段都被认为发生变动。',
428
+ 'Only triggers when match conditions': '满足以下条件才触发',
429
429
 
430
430
  'End': '结束',
431
431
 
@@ -445,7 +445,6 @@ export default {
445
445
  'Failed': '失败',
446
446
  'Canceled': '已取消',
447
447
 
448
- 'Node configuration': '配置节点',
449
448
  'This node contains branches, deleting will also be preformed to them, are you sure?': '节点包含分支,将同时删除其所有分支下的子节点,确定继续?',
450
449
 
451
450
  'Control': '流程控制',
@@ -456,8 +455,29 @@ export default {
456
455
  'Calculation': '运算',
457
456
  'Configure calculation': '配置运算',
458
457
  'Calculation result': '运算结果',
458
+ 'True': '真',
459
+ 'False': '假',
460
+
461
+ 'Condition': '条件判断',
462
+ 'Mode': '模式',
463
+ 'Continue when "Yes"': '“是”则继续',
464
+ 'Branch into "Yes" and "No"': '“是”和“否”分别继续',
465
+ 'Conditions': '条件配置',
466
+
467
+ 'Parallel branch': '分支',
468
+ 'All succeeded': '全部成功',
469
+ 'Any succeeded': '任意成功',
470
+ 'Continue after all branches succeeded': '全部分支都成功后才能继续',
471
+ 'Continue after any branch succeeded': '任意分支成功后就继续',
459
472
 
460
473
  'Create record': '新增数据',
461
474
  'Update record': '更新数据',
462
475
  'Query record': '查询数据',
476
+ 'Multiple records': '多条数据',
477
+ 'Please select collection first': '请先选择数据表',
478
+ 'Only update records matching conditions': '只更新满足条件的数据',
479
+ 'Fields that are not assigned a value will be set to the default value, and those that do not have a default value are set to null.': '未被赋值的字段将被设置为默认值,没有默认值的设置为空值。',
480
+ 'Unsaved changes': '未保存修改',
481
+ 'Are you sure you don\'t want to save?': '你确定不保存修改吗?',
482
+ 'Dragging': '拖拽中',
463
483
  }
@@ -11,7 +11,7 @@ export const ActionDesigner = (props) => {
11
11
  const { t } = useTranslation();
12
12
  const isPopupAction = ['create', 'update', 'view'].includes(fieldSchema['x-action'] || '');
13
13
  return (
14
- <GeneralSchemaDesigner {...props}>
14
+ <GeneralSchemaDesigner {...props} disableInitializer>
15
15
  <SchemaSettings.ModalItem
16
16
  title={t('Edit button')}
17
17
  schema={
@@ -65,7 +65,7 @@ export const ActionDesigner = (props) => {
65
65
  { label: t('Drawer'), value: 'drawer' },
66
66
  { label: t('Dialog'), value: 'modal' },
67
67
  ]}
68
- value={field.componentProps.openMode}
68
+ value={fieldSchema?.['x-component-props']?.['openMode']}
69
69
  onChange={(value) => {
70
70
  field.componentProps.openMode = value;
71
71
  fieldSchema['x-component-props']['openMode'] = value;
@@ -1,15 +1,17 @@
1
1
  import { css } from '@emotion/css';
2
2
  import { observer, RecursionField, useField, useFieldSchema } from '@formily/react';
3
- import { Drawer } from 'antd';
3
+ import { Drawer, Modal as AntdModal } from 'antd';
4
4
  import classNames from 'classnames';
5
5
  import React from 'react';
6
6
  import { createPortal } from 'react-dom';
7
+ import { useTranslation } from 'react-i18next';
7
8
  import { useActionContext } from './hooks';
8
9
  import { ComposedActionDrawer } from './types';
9
10
 
10
11
  export const ActionDrawer: ComposedActionDrawer = observer((props) => {
11
12
  const { footerNodeName = 'Action.Drawer.Footer', ...others } = props;
12
- const { visible, setVisible } = useActionContext();
13
+ const { t } = useTranslation();
14
+ const { visible, setVisible, formValueChanged, setFormValueChanged } = useActionContext();
13
15
  const schema = useFieldSchema();
14
16
  const field = useField();
15
17
  const footerSchema = schema.reduceProperties((buf, s) => {
@@ -18,6 +20,21 @@ export const ActionDrawer: ComposedActionDrawer = observer((props) => {
18
20
  }
19
21
  return buf;
20
22
  });
23
+
24
+ const closeHandler = () => {
25
+ if (!formValueChanged) {
26
+ setVisible(false);
27
+ return;
28
+ }
29
+ AntdModal.confirm({
30
+ title: t('Unsaved changes'),
31
+ content: t("Are you sure you don't want to save?"),
32
+ async onOk() {
33
+ setFormValueChanged(false);
34
+ setVisible(false);
35
+ },
36
+ });
37
+ };
21
38
  return (
22
39
  <>
23
40
  {createPortal(
@@ -32,7 +49,7 @@ export const ActionDrawer: ComposedActionDrawer = observer((props) => {
32
49
  {...others}
33
50
  destroyOnClose
34
51
  visible={visible}
35
- onClose={() => setVisible(false)}
52
+ onClose={closeHandler}
36
53
  className={classNames(
37
54
  others.className,
38
55
  css`
@@ -6,7 +6,7 @@ import React, { useState } from 'react';
6
6
  import { useActionContext } from '../..';
7
7
  import { Icon } from '../../../icon';
8
8
  import { SortableItem } from '../../common';
9
- import { useDesigner } from '../../hooks';
9
+ import { useCompile, useDesigner } from '../../hooks';
10
10
  import { useProps } from '../../hooks/useProps';
11
11
  import ActionContainer from './Action.Container';
12
12
  import { ActionDesigner } from './Action.Designer';
@@ -69,7 +69,7 @@ export const Action: ComposedAction = observer((props: any) => {
69
69
  const {
70
70
  popover,
71
71
  confirm,
72
- openMode,
72
+ // openMode,
73
73
  containerRefKey,
74
74
  component,
75
75
  useAction = useA,
@@ -80,14 +80,18 @@ export const Action: ComposedAction = observer((props: any) => {
80
80
  } = props;
81
81
  const { onClick } = useProps(props);
82
82
  const [visible, setVisible] = useState(false);
83
+ const [formValueChanged, setFormValueChanged] = useState(false);
83
84
  const Designer = useDesigner();
84
- const field = useField();
85
+ const field = useField<any>();
85
86
  const { run } = useAction();
86
87
  const fieldSchema = useFieldSchema();
88
+ const compile = useCompile();
87
89
  const designerProps = fieldSchema['x-designer-props'];
90
+ const openMode = fieldSchema?.['x-component-props']?.['openMode'];
88
91
  const renderButton = () => (
89
92
  <SortableItem
90
93
  {...others}
94
+ loading={field?.data?.loading}
91
95
  icon={<Icon type={icon} />}
92
96
  onClick={(e: React.MouseEvent) => {
93
97
  e.preventDefault();
@@ -109,12 +113,22 @@ export const Action: ComposedAction = observer((props: any) => {
109
113
  component={component || Button}
110
114
  className={classnames(className, actionDesignerCss)}
111
115
  >
112
- {field.title}
116
+ {compile(fieldSchema.title)}
113
117
  <Designer {...designerProps} />
114
118
  </SortableItem>
115
119
  );
116
120
  return (
117
- <ActionContext.Provider value={{ button: renderButton(), visible, setVisible, openMode, containerRefKey }}>
121
+ <ActionContext.Provider
122
+ value={{
123
+ button: renderButton(),
124
+ visible,
125
+ setVisible,
126
+ formValueChanged,
127
+ setFormValueChanged,
128
+ openMode,
129
+ containerRefKey,
130
+ }}
131
+ >
118
132
  {popover && <RecursionField basePath={field.address} onlyRenderProperties schema={fieldSchema} />}
119
133
  {!popover && renderButton()}
120
134
  {!popover && props.children}
@@ -8,4 +8,6 @@ export interface ActionContextProps {
8
8
  setVisible?: (v: boolean) => void;
9
9
  openMode?: 'drawer' | 'modal' | 'page';
10
10
  containerRefKey?: string;
11
+ formValueChanged?: boolean;
12
+ setFormValueChanged?: (v: boolean) => void;
11
13
  }
@@ -31,7 +31,7 @@ export const FilterActionDesigner = (props) => {
31
31
  const { t } = useTranslation();
32
32
  const nonfilterable = fieldSchema?.['x-component-props']?.nonfilterable || [];
33
33
  return (
34
- <GeneralSchemaDesigner {...props}>
34
+ <GeneralSchemaDesigner {...props} disableInitializer>
35
35
  <SchemaSettings.ItemGroup title={t('Filterable fields')}>
36
36
  {fields.map((field) => {
37
37
  const checked = !nonfilterable.includes(field.name);
@@ -23,15 +23,19 @@ export const FilterGroup = connect((props) => {
23
23
  return (
24
24
  <FilterLogicContext.Provider value={logic}>
25
25
  <div
26
- style={bordered ? {
27
- position: 'relative',
28
- border: '1px dashed #dedede',
29
- padding: 14,
30
- marginBottom: 8,
31
- } : {
32
- position: 'relative',
33
- marginBottom: 8,
34
- }}
26
+ style={
27
+ bordered
28
+ ? {
29
+ position: 'relative',
30
+ border: '1px dashed #dedede',
31
+ padding: 14,
32
+ marginBottom: 8,
33
+ }
34
+ : {
35
+ position: 'relative',
36
+ marginBottom: 8,
37
+ }
38
+ }
35
39
  >
36
40
  {remove && (
37
41
  <a>
@@ -40,6 +44,7 @@ export const FilterGroup = connect((props) => {
40
44
  position: 'absolute',
41
45
  right: 10,
42
46
  top: 10,
47
+ color: '#bfbfbf',
43
48
  }}
44
49
  onClick={() => remove()}
45
50
  />
@@ -49,7 +49,7 @@ export const FilterItem = observer((props: any) => {
49
49
  },
50
50
  })}
51
51
  <a>
52
- <CloseCircleOutlined onClick={() => remove()} />
52
+ <CloseCircleOutlined onClick={() => remove()} style={{ color: '#bfbfbf' }} />
53
53
  </a>
54
54
  </Space>
55
55
  </div>
@@ -1,8 +1,10 @@
1
1
  import { FormLayout } from '@formily/antd';
2
- import { createForm, Field } from '@formily/core';
2
+ import { createForm, Field, onFormInputChange } from '@formily/core';
3
3
  import { FieldContext, FormContext, observer, RecursionField, useField, useFieldSchema } from '@formily/react';
4
+ import { uid } from '@nocobase/utils';
4
5
  import { Spin } from 'antd';
5
- import React, { useMemo } from 'react';
6
+ import React, { useEffect, useMemo } from 'react';
7
+ import { useActionContext } from '..';
6
8
  import { useAttach, useComponent } from '../..';
7
9
  import { useProps } from '../../hooks/useProps';
8
10
 
@@ -53,13 +55,37 @@ const FormDecorator: React.FC<FormProps> = (props) => {
53
55
  };
54
56
 
55
57
  const WithForm = (props) => {
58
+ const { form } = props;
56
59
  const fieldSchema = useFieldSchema();
60
+ const { setFormValueChanged } = useActionContext();
61
+ useEffect(() => {
62
+ const id = uid();
63
+ form.addEffects(id, () => {
64
+ onFormInputChange((form) => {
65
+ setFormValueChanged(true);
66
+ });
67
+ });
68
+ return () => {
69
+ form.removeEffects(id);
70
+ };
71
+ }, []);
57
72
  return fieldSchema['x-decorator'] === 'Form' ? <FormDecorator {...props} /> : <FormComponent {...props} />;
58
73
  };
59
74
 
60
75
  const WithoutForm = (props) => {
61
76
  const fieldSchema = useFieldSchema();
62
- const form = useMemo(() => createForm(), []);
77
+ const { setFormValueChanged } = useActionContext();
78
+ const form = useMemo(
79
+ () =>
80
+ createForm({
81
+ effects() {
82
+ onFormInputChange((form) => {
83
+ setFormValueChanged(true);
84
+ });
85
+ },
86
+ }),
87
+ [],
88
+ );
63
89
  return fieldSchema['x-decorator'] === 'Form' ? (
64
90
  <FormDecorator form={form} {...props} />
65
91
  ) : (
@@ -9,6 +9,7 @@ import { DndContext } from '../../common/dnd-context';
9
9
 
10
10
  const GridRowContext = createContext(null);
11
11
  const GridColContext = createContext(null);
12
+ const GridContext = createContext<any>({});
12
13
 
13
14
  const ColDivider = (props) => {
14
15
  const { isOver, setNodeRef } = useDroppable({
@@ -147,6 +148,14 @@ const DndWrapper = (props) => {
147
148
  return <DndContext {...props.dndContext}>{props.children}</DndContext>;
148
149
  };
149
150
 
151
+ export const useGridContext = () => {
152
+ return useContext(GridContext);
153
+ };
154
+
155
+ export const useGridRowContext = () => {
156
+ return useContext(GridRowContext);
157
+ }
158
+
150
159
  export const Grid: any = observer((props: any) => {
151
160
  const field = useField();
152
161
  const fieldSchema = useFieldSchema();
@@ -154,26 +163,28 @@ export const Grid: any = observer((props: any) => {
154
163
  const addr = field.address.toString();
155
164
  const rows = useRowProperties();
156
165
  return (
157
- <div className={'nb-grid'} style={{ position: 'relative' }}>
158
- <DndWrapper dndContext={props.dndContext}>
159
- <RowDivider
160
- id={`${addr}_0`}
161
- data={{ wrapSchema: wrapRowSchema, insertAdjacent: 'afterBegin', schema: fieldSchema }}
162
- />
163
- {rows.map((schema, index) => {
164
- return (
165
- <React.Fragment key={schema.name}>
166
- <RecursionField name={schema.name} schema={schema} />
167
- <RowDivider
168
- id={`${addr}_${index + 1}`}
169
- data={{ wrapSchema: wrapRowSchema, insertAdjacent: 'afterEnd', schema }}
170
- />
171
- </React.Fragment>
172
- );
173
- })}
174
- </DndWrapper>
175
- {render()}
176
- </div>
166
+ <GridContext.Provider value={{ fieldSchema, renderSchemaInitializer: render }}>
167
+ <div className={'nb-grid'} style={{ position: 'relative' }}>
168
+ <DndWrapper dndContext={props.dndContext}>
169
+ <RowDivider
170
+ id={`${addr}_0`}
171
+ data={{ wrapSchema: wrapRowSchema, insertAdjacent: 'afterBegin', schema: fieldSchema }}
172
+ />
173
+ {rows.map((schema, index) => {
174
+ return (
175
+ <React.Fragment key={schema.name}>
176
+ <RecursionField name={schema.name} schema={schema} />
177
+ <RowDivider
178
+ id={`${addr}_${index + 1}`}
179
+ data={{ wrapSchema: wrapRowSchema, insertAdjacent: 'afterEnd', schema }}
180
+ />
181
+ </React.Fragment>
182
+ );
183
+ })}
184
+ </DndWrapper>
185
+ {render()}
186
+ </div>
187
+ </GridContext.Provider>
177
188
  );
178
189
  });
179
190
 
@@ -223,35 +223,43 @@ export const MenuDesigner = () => {
223
223
  });
224
224
  });
225
225
  };
226
+ const schema = {
227
+ type: 'object',
228
+ title: t('Edit menu item'),
229
+ properties: {
230
+ title: {
231
+ title: t('Menu item title'),
232
+ required: true,
233
+ 'x-decorator': 'FormItem',
234
+ 'x-component': 'Input',
235
+ 'x-component-props': {},
236
+ },
237
+ icon: {
238
+ title: t('Menu item icon'),
239
+ 'x-component': 'IconPicker',
240
+ 'x-decorator': 'FormItem',
241
+ },
242
+ },
243
+ };
244
+ const initialValues = {
245
+ title: field.title,
246
+ icon: field.componentProps.icon,
247
+ };
248
+ if (fieldSchema['x-component'] === 'Menu.URL') {
249
+ schema.properties['href'] = {
250
+ title: t('Link'),
251
+ 'x-component': 'Input',
252
+ 'x-decorator': 'FormItem',
253
+ };
254
+ initialValues['href'] = field.componentProps.href;
255
+ }
226
256
  return (
227
257
  <GeneralSchemaDesigner>
228
258
  <SchemaSettings.ModalItem
229
259
  title={t('Edit')}
230
- schema={
231
- {
232
- type: 'object',
233
- title: t('Edit menu item'),
234
- properties: {
235
- title: {
236
- title: t('Menu item title'),
237
- required: true,
238
- 'x-decorator': 'FormItem',
239
- 'x-component': 'Input',
240
- 'x-component-props': {},
241
- },
242
- icon: {
243
- title: t('Menu item icon'),
244
- 'x-component': 'IconPicker',
245
- 'x-decorator': 'FormItem',
246
- },
247
- },
248
- } as ISchema
249
- }
250
- initialValues={{
251
- title: field.title,
252
- icon: field.componentProps.icon,
253
- }}
254
- onSubmit={({ title, icon }) => {
260
+ schema={schema as ISchema}
261
+ initialValues={initialValues}
262
+ onSubmit={({ title, icon, href }) => {
255
263
  const schema = {
256
264
  ['x-uid']: fieldSchema['x-uid'],
257
265
  };
@@ -262,9 +270,11 @@ export const MenuDesigner = () => {
262
270
  refresh();
263
271
  }
264
272
  field.componentProps.icon = icon;
265
- schema['x-component-props'] = { icon };
273
+ field.componentProps.href = href;
274
+ schema['x-component-props'] = { icon, href };
266
275
  fieldSchema['x-component-props'] = fieldSchema['x-component-props'] || {};
267
276
  fieldSchema['x-component-props']['icon'] = icon;
277
+ fieldSchema['x-component-props']['href'] = href;
268
278
  dn.emit('patch', {
269
279
  schema,
270
280
  });
@@ -5,7 +5,7 @@ import {
5
5
  Schema,
6
6
  SchemaExpressionScopeContext,
7
7
  useField,
8
- useFieldSchema
8
+ useFieldSchema,
9
9
  } from '@formily/react';
10
10
  import { Menu as AntdMenu } from 'antd';
11
11
  import React, { createContext, useContext, useEffect, useState } from 'react';
@@ -386,7 +386,17 @@ Menu.URL = observer((props) => {
386
386
  >
387
387
  <SortableItem className={designerCss}>
388
388
  <Icon type={icon} />
389
- {field.title}
389
+ <span
390
+ className={css`
391
+ overflow: hidden;
392
+ text-overflow: ellipsis;
393
+ display: inline-block;
394
+ width: 100%;
395
+ vertical-align: middle;
396
+ `}
397
+ >
398
+ {field.title}
399
+ </span>
390
400
  <Designer />
391
401
  </SortableItem>
392
402
  </AntdMenu.Item>
@@ -7,6 +7,7 @@ import { BlockAssociationContext } from '../../../block-provider';
7
7
  import { CollectionProvider, useCollection } from '../../../collection-manager';
8
8
  import { RecordProvider } from '../../../record-provider';
9
9
  import { FormProvider } from '../../core';
10
+ import { useCompile } from '../../hooks';
10
11
  import { ActionContext } from '../action';
11
12
  import { useFieldNames } from './useFieldNames';
12
13
 
@@ -18,6 +19,7 @@ export const ReadPrettyRecordPicker: React.FC = observer((props: any) => {
18
19
  const { getField } = useCollection();
19
20
  const collectionField = getField(fieldSchema.name);
20
21
  const [record, setRecord] = useState({});
22
+ const compile = useCompile();
21
23
  return collectionField ? (
22
24
  <div>
23
25
  <BlockAssociationContext.Provider value={`${collectionField.collectionName}.${collectionField.name}`}>
@@ -34,7 +36,7 @@ export const ReadPrettyRecordPicker: React.FC = observer((props: any) => {
34
36
  setRecord(record);
35
37
  }}
36
38
  >
37
- {record?.[fieldNames?.label || 'label']}
39
+ {compile(record?.[fieldNames?.label || 'label'])}
38
40
  </a>
39
41
  </span>
40
42
  );
@@ -39,7 +39,7 @@ export const TableVoidDesigner = () => {
39
39
  onChange={(dragSort) => {
40
40
  field.decoratorProps.dragSort = dragSort;
41
41
  fieldSchema['x-decorator-props'].dragSort = dragSort;
42
- ctx.run({ ...ctx.params?.[0], sort: defaultSort });
42
+ ctx.run({ ...ctx.params?.[0], sort: 'sort' });
43
43
  dn.emit('patch', {
44
44
  schema: {
45
45
  ['x-uid']: fieldSchema['x-uid'],
@@ -32,7 +32,7 @@ export const TableColumnDesigner = (props) => {
32
32
  fieldSchema?.['x-component-props']?.['fieldNames'] || uiSchema?.['x-component-props']?.['fieldNames'];
33
33
  const options = useLabelFields(collectionField?.target);
34
34
  return (
35
- <GeneralSchemaDesigner>
35
+ <GeneralSchemaDesigner disableInitializer>
36
36
  <SchemaSettings.ModalItem
37
37
  title={t('Custom column title')}
38
38
  schema={
@@ -10,7 +10,7 @@ import { useSchemaTemplate } from '../../../schema-templates';
10
10
  import { useDesignable } from '../../hooks';
11
11
 
12
12
  export const TableBlockDesigner = () => {
13
- const { name, title } = useCollection();
13
+ const { name, title, sortable } = useCollection();
14
14
  const field = useField();
15
15
  const fieldSchema = useFieldSchema();
16
16
  const dataSource = useCollectionFilterOptions(name);
@@ -41,7 +41,7 @@ export const TableBlockDesigner = () => {
41
41
  onChange={(dragSort) => {
42
42
  field.decoratorProps.dragSort = dragSort;
43
43
  fieldSchema['x-decorator-props'].dragSort = dragSort;
44
- service.run({ ...service.params?.[0], sort: defaultSort });
44
+ service.run({ ...service.params?.[0], sort: 'sort' });
45
45
  dn.emit('patch', {
46
46
  schema: {
47
47
  ['x-uid']: fieldSchema['x-uid'],
@@ -34,7 +34,7 @@ export const TableSelectorDesigner = () => {
34
34
  const template = useSchemaTemplate();
35
35
  const { dragSort } = field.decoratorProps;
36
36
  return (
37
- <GeneralSchemaDesigner template={template} title={title || name}>
37
+ <GeneralSchemaDesigner template={template} title={title || name} disableInitializer>
38
38
  <SchemaSettings.ModalItem
39
39
  title={t('Set the data scope')}
40
40
  schema={
@@ -10,7 +10,7 @@ export const TabsDesigner = () => {
10
10
  const { dn } = useDesignable();
11
11
  const { t } = useTranslation();
12
12
  return (
13
- <GeneralSchemaDesigner>
13
+ <GeneralSchemaDesigner disableInitializer>
14
14
  <SchemaSettings.ModalItem
15
15
  title={t('Edit')}
16
16
  schema={
@@ -57,6 +57,7 @@ const useDragEnd = (props?: any) => {
57
57
  };
58
58
 
59
59
  export const DndContext = observer((props: Props) => {
60
+ const { t } = useTranslation();
60
61
  return (
61
62
  <DndKitContext collisionDetection={rectIntersection} {...props} onDragEnd={useDragEnd(props)}>
62
63
  <DragOverlay
@@ -65,7 +66,7 @@ export const DndContext = observer((props: Props) => {
65
66
  easing: 'cubic-bezier(0.18, 0.67, 0.6, 1.22)',
66
67
  }}
67
68
  >
68
- <span style={{ whiteSpace: 'nowrap' }}>拖拽中</span>
69
+ <span style={{ whiteSpace: 'nowrap' }}>{t('Dragging')}</span>
69
70
  </DragOverlay>
70
71
  {props.children}
71
72
  </DndKitContext>
@@ -9,7 +9,7 @@ export const BlockInitializers = {
9
9
  {
10
10
  key: 'dataBlocks',
11
11
  type: 'itemGroup',
12
- title: 'Data blocks',
12
+ title: '{{t("Data blocks")}}',
13
13
  children: [
14
14
  {
15
15
  key: 'table',
@@ -5,11 +5,14 @@ import { gridRowColWrap } from '../utils';
5
5
 
6
6
  export const CreateFormBlockInitializers = (props: any) => {
7
7
  const { t } = useTranslation();
8
+ const { insertPosition, component } = props;
8
9
  return (
9
10
  <SchemaInitializer.Button
10
11
  wrap={gridRowColWrap}
11
- title={t('Add block')}
12
+ title={component ? null : t('Add block')}
12
13
  icon={'PlusOutlined'}
14
+ insertPosition={insertPosition}
15
+ component={component}
13
16
  items={[
14
17
  {
15
18
  type: 'itemGroup',
@@ -6,6 +6,7 @@ import { gridRowColWrap, useFormItemInitializerFields } from '../utils';
6
6
  // 表单里配置字段
7
7
  export const FormItemInitializers = (props: any) => {
8
8
  const { t } = useTranslation();
9
+ const { insertPosition, component } = props;
9
10
  return (
10
11
  <SchemaInitializer.Button
11
12
  wrap={gridRowColWrap}
@@ -35,8 +36,9 @@ export const FormItemInitializers = (props: any) => {
35
36
  },
36
37
  },
37
38
  ]}
38
- >
39
- {t('Configure fields')}
40
- </SchemaInitializer.Button>
39
+ insertPosition={insertPosition}
40
+ component={component}
41
+ title={component ? null : t('Configure fields')}
42
+ />
41
43
  );
42
44
  };