amis-core 3.5.2 → 3.6.0

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 (285) hide show
  1. package/esm/Root.js +1 -1
  2. package/esm/RootRenderer.d.ts +1 -1
  3. package/esm/RootRenderer.js +2 -2
  4. package/esm/SchemaRenderer.js +1 -1
  5. package/esm/Scoped.d.ts +2 -0
  6. package/esm/Scoped.js +49 -7
  7. package/esm/StatusScoped.js +1 -1
  8. package/esm/WithRootStore.js +1 -1
  9. package/esm/WithStore.js +27 -12
  10. package/esm/actions/Action.js +30 -22
  11. package/esm/actions/AjaxAction.js +2 -2
  12. package/esm/actions/BreakAction.js +1 -1
  13. package/esm/actions/BroadcastAction.js +1 -1
  14. package/esm/actions/CmptAction.js +31 -32
  15. package/esm/actions/ContinueAction.js +1 -1
  16. package/esm/actions/CopyAction.js +3 -3
  17. package/esm/actions/CustomAction.js +1 -1
  18. package/esm/actions/DialogAction.js +1 -1
  19. package/esm/actions/DrawerAction.js +1 -1
  20. package/esm/actions/EmailAction.js +1 -1
  21. package/esm/actions/LinkAction.js +5 -5
  22. package/esm/actions/LoopAction.js +1 -1
  23. package/esm/actions/PageAction.js +1 -1
  24. package/esm/actions/ParallelAction.js +1 -1
  25. package/esm/actions/StatusAction.js +1 -1
  26. package/esm/actions/SwitchAction.js +1 -1
  27. package/esm/actions/ToastAction.js +3 -3
  28. package/esm/components/CustomStyle.js +1 -1
  29. package/esm/components/ErrorBoundary.d.ts +20 -0
  30. package/esm/components/ErrorBoundary.js +41 -0
  31. package/esm/components/LazyComponent.js +1 -1
  32. package/esm/components/Overlay.js +1 -1
  33. package/esm/components/PopOver.d.ts +4 -0
  34. package/esm/components/PopOver.js +66 -3
  35. package/esm/env.d.ts +9 -0
  36. package/esm/env.js +1 -1
  37. package/esm/envOverwrite.d.ts +1 -1
  38. package/esm/envOverwrite.js +15 -35
  39. package/esm/factory.js +1 -1
  40. package/esm/index.d.ts +2 -1
  41. package/esm/index.js +5 -4
  42. package/esm/locale.js +1 -1
  43. package/esm/polyfills.js +1 -1
  44. package/esm/renderers/Form.d.ts +10 -4
  45. package/esm/renderers/Form.js +64 -32
  46. package/esm/renderers/Item.d.ts +54 -0
  47. package/esm/renderers/Item.js +1 -1
  48. package/esm/renderers/Options.d.ts +5 -1
  49. package/esm/renderers/Options.js +11 -9
  50. package/esm/renderers/Placeholder.js +1 -1
  51. package/esm/renderers/builtin.js +1 -1
  52. package/esm/renderers/register.js +1 -1
  53. package/esm/renderers/wrapControl.js +10 -17
  54. package/esm/store/app.js +1 -1
  55. package/esm/store/combo.d.ts +1154 -48
  56. package/esm/store/combo.js +10 -3
  57. package/esm/store/crud.d.ts +9 -1
  58. package/esm/store/crud.js +50 -15
  59. package/esm/store/form.d.ts +480 -20
  60. package/esm/store/form.js +1 -1
  61. package/esm/store/formItem.d.ts +23 -1
  62. package/esm/store/formItem.js +103 -15
  63. package/esm/store/iRenderer.js +1 -1
  64. package/esm/store/index.js +1 -1
  65. package/esm/store/list.js +1 -1
  66. package/esm/store/manager.js +1 -1
  67. package/esm/store/modal.js +1 -1
  68. package/esm/store/node.js +1 -1
  69. package/esm/store/pagination.js +1 -1
  70. package/esm/store/root.js +1 -1
  71. package/esm/store/service.js +1 -1
  72. package/esm/store/status.js +1 -1
  73. package/esm/store/table.d.ts +1078 -42
  74. package/esm/store/table.js +64 -6
  75. package/esm/store/table2.js +1 -4
  76. package/esm/theme.js +1 -1
  77. package/esm/types.d.ts +8 -2
  78. package/esm/utils/Animation.js +1 -1
  79. package/esm/utils/ColorScale.js +1 -1
  80. package/esm/utils/DataSchema.js +1 -1
  81. package/esm/utils/DataScope.js +1 -1
  82. package/esm/utils/RootClose.js +1 -1
  83. package/esm/utils/SimpleMap.js +1 -1
  84. package/esm/utils/api.js +1 -1
  85. package/esm/utils/arraySlice.js +1 -1
  86. package/esm/utils/attachmentAdpator.js +3 -1
  87. package/esm/utils/autobind.js +1 -1
  88. package/esm/utils/columnsSplit.js +1 -1
  89. package/esm/utils/dataMapping.js +1 -1
  90. package/esm/utils/date.js +1 -1
  91. package/esm/utils/debug.js +1 -1
  92. package/esm/utils/decodeEntity.js +1 -1
  93. package/esm/utils/dom.js +1 -1
  94. package/esm/utils/errors.js +1 -1
  95. package/esm/utils/escapeHtml.js +1 -1
  96. package/esm/utils/filter-schema.d.ts +2 -1
  97. package/esm/utils/filter-schema.js +14 -5
  98. package/esm/utils/filter.js +1 -1
  99. package/esm/utils/formatDuration.js +1 -1
  100. package/esm/utils/formula.js +1 -1
  101. package/esm/utils/getVariable.js +1 -1
  102. package/esm/utils/grammar.js +1 -1
  103. package/esm/utils/handleAction.js +1 -1
  104. package/esm/utils/helper.d.ts +2 -2
  105. package/esm/utils/helper.js +37 -29
  106. package/esm/utils/highlight.js +1 -1
  107. package/esm/utils/icon.js +1 -1
  108. package/esm/utils/image.js +1 -1
  109. package/esm/utils/isPureVariable.js +1 -1
  110. package/esm/utils/json-schema-2-amis-schema.js +1 -1
  111. package/esm/utils/keyToPath.js +1 -1
  112. package/esm/utils/makeSorter.js +1 -1
  113. package/esm/utils/math.js +8 -5
  114. package/esm/utils/memoryParse.js +1 -1
  115. package/esm/utils/normalizeLink.js +1 -1
  116. package/esm/utils/normalizeOptions.js +1 -1
  117. package/esm/utils/object.js +15 -1
  118. package/esm/utils/offset.js +1 -1
  119. package/esm/utils/offsetParent.js +1 -1
  120. package/esm/utils/optionValueCompare.js +1 -1
  121. package/esm/utils/position.js +1 -1
  122. package/esm/utils/prettyBytes.js +1 -1
  123. package/esm/utils/renderer-event.d.ts +7 -0
  124. package/esm/utils/renderer-event.js +30 -18
  125. package/esm/utils/replaceText.js +1 -1
  126. package/esm/utils/resize-sensor.js +1 -1
  127. package/esm/utils/resolveCondition.js +1 -1
  128. package/esm/utils/resolveVariable.js +1 -1
  129. package/esm/utils/resolveVariableAndFilter.js +1 -1
  130. package/esm/utils/resolveVariableAndFilterForAsync.js +1 -1
  131. package/esm/utils/scrollPosition.js +1 -1
  132. package/esm/utils/string2regExp.js +1 -1
  133. package/esm/utils/stripNumber.js +1 -1
  134. package/esm/utils/style-helper.js +12 -15
  135. package/esm/utils/style.js +3 -2
  136. package/esm/utils/toNumber.js +1 -1
  137. package/esm/utils/tokenize.js +1 -1
  138. package/esm/utils/tpl-builtin.js +1 -1
  139. package/esm/utils/tpl-lodash.js +1 -1
  140. package/esm/utils/tpl.js +1 -1
  141. package/esm/utils/uncontrollable.js +1 -1
  142. package/esm/utils/validations.js +1 -1
  143. package/lib/Root.js +1 -1
  144. package/lib/RootRenderer.d.ts +1 -1
  145. package/lib/RootRenderer.js +2 -2
  146. package/lib/SchemaRenderer.js +1 -1
  147. package/lib/Scoped.d.ts +2 -0
  148. package/lib/Scoped.js +48 -6
  149. package/lib/StatusScoped.js +1 -1
  150. package/lib/WithRootStore.js +1 -1
  151. package/lib/WithStore.js +26 -11
  152. package/lib/actions/Action.js +29 -21
  153. package/lib/actions/AjaxAction.js +2 -2
  154. package/lib/actions/BreakAction.js +1 -1
  155. package/lib/actions/BroadcastAction.js +1 -1
  156. package/lib/actions/CmptAction.js +31 -32
  157. package/lib/actions/ContinueAction.js +1 -1
  158. package/lib/actions/CopyAction.js +3 -3
  159. package/lib/actions/CustomAction.js +1 -1
  160. package/lib/actions/DialogAction.js +1 -1
  161. package/lib/actions/DrawerAction.js +1 -1
  162. package/lib/actions/EmailAction.js +1 -1
  163. package/lib/actions/LinkAction.js +5 -5
  164. package/lib/actions/LoopAction.js +1 -1
  165. package/lib/actions/PageAction.js +1 -1
  166. package/lib/actions/ParallelAction.js +1 -1
  167. package/lib/actions/StatusAction.js +1 -1
  168. package/lib/actions/SwitchAction.js +1 -1
  169. package/lib/actions/ToastAction.js +3 -3
  170. package/lib/components/CustomStyle.js +1 -1
  171. package/lib/components/ErrorBoundary.d.ts +20 -0
  172. package/lib/components/ErrorBoundary.js +52 -0
  173. package/lib/components/LazyComponent.js +1 -1
  174. package/lib/components/Overlay.js +1 -1
  175. package/lib/components/PopOver.d.ts +4 -0
  176. package/lib/components/PopOver.js +64 -1
  177. package/lib/env.d.ts +9 -0
  178. package/lib/env.js +1 -1
  179. package/lib/envOverwrite.d.ts +1 -1
  180. package/lib/envOverwrite.js +18 -34
  181. package/lib/factory.js +1 -1
  182. package/lib/index.d.ts +2 -1
  183. package/lib/index.js +6 -3
  184. package/lib/locale.js +1 -1
  185. package/lib/polyfills.js +1 -1
  186. package/lib/renderers/Form.d.ts +10 -4
  187. package/lib/renderers/Form.js +64 -32
  188. package/lib/renderers/Item.d.ts +54 -0
  189. package/lib/renderers/Item.js +1 -1
  190. package/lib/renderers/Options.d.ts +5 -1
  191. package/lib/renderers/Options.js +11 -9
  192. package/lib/renderers/Placeholder.js +1 -1
  193. package/lib/renderers/builtin.js +1 -1
  194. package/lib/renderers/register.js +1 -1
  195. package/lib/renderers/wrapControl.js +10 -17
  196. package/lib/store/app.js +1 -1
  197. package/lib/store/combo.d.ts +1154 -49
  198. package/lib/store/combo.js +10 -3
  199. package/lib/store/crud.d.ts +9 -1
  200. package/lib/store/crud.js +50 -15
  201. package/lib/store/form.d.ts +480 -21
  202. package/lib/store/form.js +1 -1
  203. package/lib/store/formItem.d.ts +23 -1
  204. package/lib/store/formItem.js +104 -15
  205. package/lib/store/iRenderer.js +1 -1
  206. package/lib/store/index.js +1 -1
  207. package/lib/store/list.js +1 -1
  208. package/lib/store/manager.js +1 -1
  209. package/lib/store/modal.js +1 -1
  210. package/lib/store/node.js +1 -1
  211. package/lib/store/pagination.js +1 -1
  212. package/lib/store/root.js +1 -1
  213. package/lib/store/service.js +1 -1
  214. package/lib/store/status.js +1 -1
  215. package/lib/store/table.d.ts +1078 -43
  216. package/lib/store/table.js +63 -5
  217. package/lib/store/table2.js +1 -4
  218. package/lib/theme.js +1 -1
  219. package/lib/types.d.ts +8 -2
  220. package/lib/utils/Animation.js +1 -1
  221. package/lib/utils/ColorScale.js +1 -1
  222. package/lib/utils/DataSchema.js +1 -1
  223. package/lib/utils/DataScope.js +1 -1
  224. package/lib/utils/RootClose.js +1 -1
  225. package/lib/utils/SimpleMap.js +1 -1
  226. package/lib/utils/api.js +1 -1
  227. package/lib/utils/arraySlice.js +1 -1
  228. package/lib/utils/attachmentAdpator.js +3 -1
  229. package/lib/utils/autobind.js +1 -1
  230. package/lib/utils/columnsSplit.js +1 -1
  231. package/lib/utils/dataMapping.js +1 -1
  232. package/lib/utils/date.js +1 -1
  233. package/lib/utils/debug.js +1 -1
  234. package/lib/utils/decodeEntity.js +1 -1
  235. package/lib/utils/dom.js +1 -1
  236. package/lib/utils/errors.js +1 -1
  237. package/lib/utils/escapeHtml.js +1 -1
  238. package/lib/utils/filter-schema.d.ts +2 -1
  239. package/lib/utils/filter-schema.js +14 -4
  240. package/lib/utils/filter.js +1 -1
  241. package/lib/utils/formatDuration.js +1 -1
  242. package/lib/utils/formula.js +1 -1
  243. package/lib/utils/getVariable.js +1 -1
  244. package/lib/utils/grammar.js +1 -1
  245. package/lib/utils/handleAction.js +1 -1
  246. package/lib/utils/helper.d.ts +2 -2
  247. package/lib/utils/helper.js +36 -28
  248. package/lib/utils/highlight.js +1 -1
  249. package/lib/utils/icon.js +1 -1
  250. package/lib/utils/image.js +1 -1
  251. package/lib/utils/isPureVariable.js +1 -1
  252. package/lib/utils/json-schema-2-amis-schema.js +1 -1
  253. package/lib/utils/keyToPath.js +1 -1
  254. package/lib/utils/makeSorter.js +1 -1
  255. package/lib/utils/math.js +8 -5
  256. package/lib/utils/memoryParse.js +1 -1
  257. package/lib/utils/normalizeLink.js +1 -1
  258. package/lib/utils/normalizeOptions.js +1 -1
  259. package/lib/utils/object.js +15 -1
  260. package/lib/utils/offset.js +1 -1
  261. package/lib/utils/offsetParent.js +1 -1
  262. package/lib/utils/optionValueCompare.js +1 -1
  263. package/lib/utils/position.js +1 -1
  264. package/lib/utils/prettyBytes.js +1 -1
  265. package/lib/utils/renderer-event.d.ts +7 -0
  266. package/lib/utils/renderer-event.js +30 -18
  267. package/lib/utils/replaceText.js +1 -1
  268. package/lib/utils/resize-sensor.js +1 -1
  269. package/lib/utils/resolveCondition.js +1 -1
  270. package/lib/utils/resolveVariable.js +1 -1
  271. package/lib/utils/resolveVariableAndFilter.js +1 -1
  272. package/lib/utils/resolveVariableAndFilterForAsync.js +1 -1
  273. package/lib/utils/scrollPosition.js +1 -1
  274. package/lib/utils/string2regExp.js +1 -1
  275. package/lib/utils/stripNumber.js +1 -1
  276. package/lib/utils/style-helper.js +12 -15
  277. package/lib/utils/style.js +3 -2
  278. package/lib/utils/toNumber.js +1 -1
  279. package/lib/utils/tokenize.js +1 -1
  280. package/lib/utils/tpl-builtin.js +1 -1
  281. package/lib/utils/tpl-lodash.js +1 -1
  282. package/lib/utils/tpl.js +1 -1
  283. package/lib/utils/uncontrollable.js +1 -1
  284. package/lib/utils/validations.js +1 -1
  285. package/package.json +3 -3
@@ -0,0 +1,52 @@
1
+ /**
2
+ * amis-core v3.6.0
3
+ * Copyright 2018-2023 fex
4
+ */
5
+
6
+ 'use strict';
7
+
8
+ Object.defineProperty(exports, '__esModule', { value: true });
9
+
10
+ var tslib = require('tslib');
11
+ var React = require('react');
12
+
13
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
14
+
15
+ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
16
+
17
+ var __react_jsx__ = require('react');
18
+ var _J$X_ = (__react_jsx__["default"] || __react_jsx__).createElement;
19
+ (__react_jsx__["default"] || __react_jsx__).Fragment;
20
+ var ErrorBoundary = /** @class */ (function (_super) {
21
+ tslib.__extends(ErrorBoundary, _super);
22
+ function ErrorBoundary(props) {
23
+ var _this = _super.call(this, props) || this;
24
+ _this.state = { hasError: false };
25
+ return _this;
26
+ }
27
+ ErrorBoundary.prototype.componentDidCatch = function (error, errorInfo) {
28
+ var customErrorMsg = this.props.customErrorMsg;
29
+ if (customErrorMsg) {
30
+ console.warn(customErrorMsg);
31
+ }
32
+ console.warn('错误对象:', error);
33
+ console.warn('错误信息:', errorInfo);
34
+ this.setState({
35
+ hasError: true
36
+ });
37
+ };
38
+ ErrorBoundary.prototype.render = function () {
39
+ var fallback = this.props.fallback;
40
+ if (this.state.hasError) {
41
+ if (fallback) {
42
+ return fallback();
43
+ }
44
+ // 默认渲染错误信息
45
+ return (_J$X_("div", { className: "renderer-error-boundary" }, "\u6E32\u67D3\u53D1\u751F\u9519\u8BEF\uFF0C\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F\u8BF7\u67E5\u770B\u63A7\u5236\u53F0\u8F93\u51FA\u3002"));
46
+ }
47
+ return this.props.children;
48
+ };
49
+ return ErrorBoundary;
50
+ }(React__default["default"].Component));
51
+
52
+ exports["default"] = ErrorBoundary;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * amis-core v3.5.2
2
+ * amis-core v3.6.0
3
3
  * Copyright 2018-2023 fex
4
4
  */
5
5
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- * amis-core v3.5.2
2
+ * amis-core v3.6.0
3
3
  * Copyright 2018-2023 fex
4
4
  */
5
5
 
@@ -46,9 +46,13 @@ export declare class PopOver extends React.PureComponent<PopOverProps, PopOverSt
46
46
  };
47
47
  parent: HTMLElement;
48
48
  wrapperRef: React.RefObject<HTMLDivElement>;
49
+ isRootClosed: boolean;
49
50
  componentDidMount(): void;
50
51
  componentDidUpdate(): void;
51
52
  componentWillUnmount(): void;
53
+ handleRootMouseDownCapture(e: MouseEvent): void;
54
+ handleRootMouseUpCapture(e: MouseEvent): void;
55
+ handleRootMouseUp(e: MouseEvent): void;
52
56
  mayUpdateOffset(): void;
53
57
  render(): React.JSX.Element;
54
58
  }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * amis-core v3.5.2
2
+ * amis-core v3.6.0
3
3
  * Copyright 2018-2023 fex
4
4
  */
5
5
 
@@ -66,6 +66,7 @@ var PopOver = /** @class */ (function (_super) {
66
66
  yOffset: 0
67
67
  };
68
68
  _this.wrapperRef = React__default["default"].createRef();
69
+ _this.isRootClosed = false;
69
70
  return _this;
70
71
  }
71
72
  PopOver.prototype.componentDidMount = function () {
@@ -80,6 +81,14 @@ var PopOver = /** @class */ (function (_super) {
80
81
  capture: false
81
82
  });
82
83
  }
84
+ // 从弹窗中处理复制过来的,如果要修改,请同步修改
85
+ // 因为 overlay 功能其实是用 postion: fixed 来实现的
86
+ // 目的是加一个蒙层监听蒙层点击然后关闭弹窗。意图就是 closeOnOutside
87
+ // 但是如果上层有个 translateZ 之类的样式就会影响 fixed 的定位,导致功能失效
88
+ // 所以这里兜底加了个 closeOnOutside 的功能
89
+ document.body.addEventListener('mousedown', this.handleRootMouseDownCapture, true);
90
+ document.body.addEventListener('mouseup', this.handleRootMouseUpCapture, true);
91
+ document.body.addEventListener('mouseup', this.handleRootMouseUp);
83
92
  };
84
93
  PopOver.prototype.componentDidUpdate = function () {
85
94
  this.mayUpdateOffset();
@@ -89,6 +98,42 @@ var PopOver = /** @class */ (function (_super) {
89
98
  if (this.wrapperRef && this.wrapperRef.current) {
90
99
  this.wrapperRef.current.removeEventListener('touchmove', helper.preventDefault);
91
100
  }
101
+ document.body.removeEventListener('mouseup', this.handleRootMouseUp);
102
+ document.body.removeEventListener('mousedown', this.handleRootMouseDownCapture, true);
103
+ document.body.removeEventListener('mouseup', this.handleRootMouseUpCapture, true);
104
+ };
105
+ PopOver.prototype.handleRootMouseDownCapture = function (e) {
106
+ var target = e.target;
107
+ var _a = this.props, closeOnOutside = _a.overlay, ns = _a.classPrefix;
108
+ var isLeftButton = (e.button === 1 && window.event !== null) || e.button === 0;
109
+ this.isRootClosed = !!(isLeftButton &&
110
+ closeOnOutside &&
111
+ target &&
112
+ this.wrapperRef.current &&
113
+ ((!this.wrapperRef.current.contains(target) &&
114
+ !target.closest('[role=dialog]')) ||
115
+ (target.matches(".".concat(ns, "Modal")) && target === this.wrapperRef.current))); // 干脆过滤掉来自弹框里面的点击
116
+ };
117
+ PopOver.prototype.handleRootMouseUpCapture = function (e) {
118
+ // mousedown 的时候不在弹窗里面,则不需要判断了
119
+ if (!this.isRootClosed) {
120
+ return;
121
+ }
122
+ // 再判断 mouseup 的时候是不是在弹窗里面
123
+ this.handleRootMouseDownCapture(e);
124
+ };
125
+ PopOver.prototype.handleRootMouseUp = function (e) {
126
+ var onHide = this.props.onHide;
127
+ if (this.isRootClosed && !e.defaultPrevented) {
128
+ // 因为原来 overlay 是不会让别的部分还有点击事件的,所以这里要阻止默认事件
129
+ // 参考:https://stackoverflow.com/questions/8643739/cancel-click-event-in-the-mouseup-event-handler
130
+ var captureClick_1 = function (e) {
131
+ e.stopPropagation();
132
+ window.removeEventListener('click', captureClick_1, true);
133
+ };
134
+ window.addEventListener('click', captureClick_1, true);
135
+ onHide === null || onHide === void 0 ? void 0 : onHide();
136
+ }
92
137
  };
93
138
  PopOver.prototype.mayUpdateOffset = function () {
94
139
  var offset;
@@ -127,6 +172,24 @@ var PopOver = /** @class */ (function (_super) {
127
172
  overlay: false,
128
173
  placement: 'auto'
129
174
  };
175
+ tslib.__decorate([
176
+ helper.autobind,
177
+ tslib.__metadata("design:type", Function),
178
+ tslib.__metadata("design:paramtypes", [MouseEvent]),
179
+ tslib.__metadata("design:returntype", void 0)
180
+ ], PopOver.prototype, "handleRootMouseDownCapture", null);
181
+ tslib.__decorate([
182
+ helper.autobind,
183
+ tslib.__metadata("design:type", Function),
184
+ tslib.__metadata("design:paramtypes", [MouseEvent]),
185
+ tslib.__metadata("design:returntype", void 0)
186
+ ], PopOver.prototype, "handleRootMouseUpCapture", null);
187
+ tslib.__decorate([
188
+ helper.autobind,
189
+ tslib.__metadata("design:type", Function),
190
+ tslib.__metadata("design:paramtypes", [MouseEvent]),
191
+ tslib.__metadata("design:returntype", void 0)
192
+ ], PopOver.prototype, "handleRootMouseUp", null);
130
193
  return PopOver;
131
194
  }(React__default["default"].PureComponent));
132
195
  var PopOver$1 = theme.themeable(PopOver);
package/lib/env.d.ts CHANGED
@@ -16,6 +16,7 @@ export interface WsObject {
16
16
  body?: any;
17
17
  }
18
18
  export interface RendererEnv {
19
+ forceSilenceInsideError?: boolean;
19
20
  session?: string;
20
21
  fetcher: (api: Api, data?: any, options?: object) => Promise<Payload>;
21
22
  isCancel: (val: any) => boolean;
@@ -63,6 +64,14 @@ export interface RendererEnv {
63
64
  */
64
65
  affixOffsetBottom?: number;
65
66
  richTextToken: string;
67
+ /**
68
+ * 默认的选址组件提供商,目前支持仅 baidu
69
+ */
70
+ locationPickerVendor?: string;
71
+ /**
72
+ * 选址组件的 ak
73
+ */
74
+ locationPickerAK?: string;
66
75
  loadRenderer: (schema: Schema, path: string, reRender: Function) => Promise<React.ElementType> | React.ElementType | JSX.Element | void;
67
76
  loadChartExtends?: () => void | Promise<void>;
68
77
  loadTinymcePlugin?: (tinymce: any) => void | Promise<void>;
package/lib/env.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * amis-core v3.5.2
2
+ * amis-core v3.6.0
3
3
  * Copyright 2018-2023 fex
4
4
  */
5
5
 
@@ -1,4 +1,4 @@
1
1
  /**
2
2
  * @file 用于在移动端或不同语言环境下使用不同配置
3
3
  */
4
- export declare const envOverwrite: (schema: any, locale?: string) => void;
4
+ export declare const envOverwrite: (schema: any, locale?: string) => any;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * amis-core v3.5.2
2
+ * amis-core v3.6.0
3
3
  * Copyright 2018-2023 fex
4
4
  */
5
5
 
@@ -7,8 +7,12 @@
7
7
 
8
8
  Object.defineProperty(exports, '__esModule', { value: true });
9
9
 
10
- var tslib = require('tslib');
11
10
  var helper = require('./utils/helper.js');
11
+ var isPlainObject = require('lodash/isPlainObject');
12
+
13
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
14
+
15
+ var isPlainObject__default = /*#__PURE__*/_interopDefaultLegacy(isPlainObject);
12
16
 
13
17
  /**
14
18
  * @file 用于在移动端或不同语言环境下使用不同配置
@@ -19,41 +23,21 @@ var isMobile = ((_b = (_a = window).matchMedia) === null || _b === void 0 ? void
19
23
  : false;
20
24
  // 这里不能用 addSchemaFilter 是因为还需要更深层的替换,比如 select 里的 options
21
25
  var envOverwrite = function (schema, locale) {
22
- var e_1, _a, e_2, _b;
23
- if (locale) {
24
- var schemaNodes = helper.findObjectsWithKey(schema, locale);
25
- try {
26
- for (var schemaNodes_1 = tslib.__values(schemaNodes), schemaNodes_1_1 = schemaNodes_1.next(); !schemaNodes_1_1.done; schemaNodes_1_1 = schemaNodes_1.next()) {
27
- var schemaNode = schemaNodes_1_1.value;
28
- Object.assign(schemaNode, schemaNode[locale]);
29
- delete schemaNode[locale];
30
- }
31
- }
32
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
33
- finally {
34
- try {
35
- if (schemaNodes_1_1 && !schemaNodes_1_1.done && (_a = schemaNodes_1.return)) _a.call(schemaNodes_1);
36
- }
37
- finally { if (e_1) throw e_1.error; }
26
+ return helper.JSONValueMap(schema, function (value) {
27
+ if (!isPlainObject__default["default"](value)) {
28
+ return value;
38
29
  }
39
- }
40
- if (isMobile) {
41
- var schemaNodes = helper.findObjectsWithKey(schema, 'mobile');
42
- try {
43
- for (var schemaNodes_2 = tslib.__values(schemaNodes), schemaNodes_2_1 = schemaNodes_2.next(); !schemaNodes_2_1.done; schemaNodes_2_1 = schemaNodes_2.next()) {
44
- var schemaNode = schemaNodes_2_1.value;
45
- Object.assign(schemaNode, schemaNode['mobile']);
46
- delete schemaNode['mobile'];
47
- }
30
+ if (locale && value[locale]) {
31
+ var newValue = Object.assign({}, value, value[locale]);
32
+ delete newValue[locale];
33
+ return newValue;
48
34
  }
49
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
50
- finally {
51
- try {
52
- if (schemaNodes_2_1 && !schemaNodes_2_1.done && (_b = schemaNodes_2.return)) _b.call(schemaNodes_2);
53
- }
54
- finally { if (e_2) throw e_2.error; }
35
+ else if (isMobile && value.mobile) {
36
+ var newValue = Object.assign({}, value, value.mobile);
37
+ delete newValue.mobile;
38
+ return newValue;
55
39
  }
56
- }
40
+ }, true);
57
41
  };
58
42
 
59
43
  exports.envOverwrite = envOverwrite;
package/lib/factory.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * amis-core v3.5.2
2
+ * amis-core v3.6.0
3
3
  * Copyright 2018-2023 fex
4
4
  */
5
5
 
package/lib/index.d.ts CHANGED
@@ -39,6 +39,7 @@ import type { FilterContext } from 'amis-formula';
39
39
  import LazyComponent from './components/LazyComponent';
40
40
  import Overlay from './components/Overlay';
41
41
  import PopOver from './components/PopOver';
42
+ import ErrorBoundary from './components/ErrorBoundary';
42
43
  import { FormRenderer } from './renderers/Form';
43
44
  import type { FormHorizontal, FormSchemaBase } from './renderers/Form';
44
45
  import { enableDebug, disableDebug } from './utils/index';
@@ -49,5 +50,5 @@ import type { IItem } from './store/list';
49
50
  import CustomStyle from './components/CustomStyle';
50
51
  import { StatusScoped } from './StatusScoped';
51
52
  export declare const version = "__buildVersion";
52
- export { clearStoresCache, updateEnv, Renderer, RendererProps, RenderOptions, RendererEnv, EnvContext, RegisterStore, FormItem, FormItemWrap, FormItemProps, OptionsControl, FormRenderer, FormHorizontal, utils, getRendererByName, registerRenderer, unRegisterRenderer, getRenderers, registerFormItem, getFormItemByName, registerOptionsControl, resolveRenderer, filterSchema, Scoped, ScopedContext, IScopedContext, StatusScoped, setDefaultTheme, theme, themeable, ThemeProps, getTheme, classPrefix, getClassPrefix, classnames, makeClassnames, getDefaultLocale, setDefaultLocale, registerLocale, makeTranslator, extendLocale, removeLocaleData, localeable, LocaleProps, TranslateFn, ClassNamesFn, parse, lexer, Evaluator, AsyncEvaluator, FilterContext, filters, getFilters, registerFilter, extendsFilters, registerFunction, evaluate, evaluateForAsync, LazyComponent, Overlay, PopOver, addSchemaFilter, OptionsControlProps, FormOptionsControl, FormControlProps, FormBaseControl, extendDefaultEnv, addRootWrapper, RendererConfig, styleMap, RENDERER_TRANSMISSION_OMIT_PROPS, ScopedComponentType, IItem, IColumn, IRow, IColumn2, IRow2, OnEventProps, FormSchemaBase, filterTarget, CustomStyle, enableDebug, disableDebug };
53
+ export { clearStoresCache, updateEnv, Renderer, RendererProps, RenderOptions, RendererEnv, EnvContext, RegisterStore, FormItem, FormItemWrap, FormItemProps, OptionsControl, FormRenderer, FormHorizontal, utils, getRendererByName, registerRenderer, unRegisterRenderer, getRenderers, registerFormItem, getFormItemByName, registerOptionsControl, resolveRenderer, filterSchema, Scoped, ScopedContext, IScopedContext, StatusScoped, setDefaultTheme, theme, themeable, ThemeProps, getTheme, classPrefix, getClassPrefix, classnames, makeClassnames, getDefaultLocale, setDefaultLocale, registerLocale, makeTranslator, extendLocale, removeLocaleData, localeable, LocaleProps, TranslateFn, ClassNamesFn, parse, lexer, Evaluator, AsyncEvaluator, FilterContext, filters, getFilters, registerFilter, extendsFilters, registerFunction, evaluate, evaluateForAsync, LazyComponent, Overlay, PopOver, ErrorBoundary, addSchemaFilter, OptionsControlProps, FormOptionsControl, FormControlProps, FormBaseControl, extendDefaultEnv, addRootWrapper, RendererConfig, styleMap, RENDERER_TRANSMISSION_OMIT_PROPS, ScopedComponentType, IItem, IColumn, IRow, IColumn2, IRow2, OnEventProps, FormSchemaBase, filterTarget, CustomStyle, enableDebug, disableDebug };
53
54
  export declare function render(schema: Schema, props?: RootRenderProps, options?: RenderOptions, pathPrefix?: string): JSX.Element;
package/lib/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * amis-core v3.5.2
2
+ * amis-core v3.6.0
3
3
  * Copyright 2018-2023 fex
4
4
  */
5
5
 
@@ -104,6 +104,7 @@ var amisFormula = require('amis-formula');
104
104
  var LazyComponent = require('./components/LazyComponent.js');
105
105
  var Overlay = require('./components/Overlay.js');
106
106
  var PopOver = require('./components/PopOver.js');
107
+ var ErrorBoundary = require('./components/ErrorBoundary.js');
107
108
  var Form = require('./renderers/Form.js');
108
109
  var SchemaRenderer = require('./SchemaRenderer.js');
109
110
  var CustomStyle = require('./components/CustomStyle.js');
@@ -132,7 +133,7 @@ var _J$X_ = (__react_jsx__["default"] || __react_jsx__).createElement;
132
133
  (__react_jsx__["default"] || __react_jsx__).Fragment;
133
134
  var classPrefix = theme.getClassPrefix();
134
135
  // @ts-ignore
135
- var version = '3.5.2';
136
+ var version = '3.6.0';
136
137
  function render(schema, props, options, pathPrefix) {
137
138
  if (props === void 0) { props = {}; }
138
139
  if (options === void 0) { options = {}; }
@@ -191,7 +192,7 @@ function AMISRenderer(_a) {
191
192
  props.mobileUI = env$1.isMobile();
192
193
  }
193
194
  // 根据环境覆盖 schema,这个要在最前面做,不然就无法覆盖 validations
194
- envOverwrite.envOverwrite(schema, locale$1);
195
+ schema = envOverwrite.envOverwrite(schema, locale$1);
195
196
  schema = replaceText.replaceText(schema, options.replaceText, env$1.replaceTextIgnoreKeys);
196
197
  return (_J$X_(env.EnvContext.Provider, { value: env$1 },
197
198
  _J$X_(Root["default"], tslib.__assign({}, props, { schema: schema, pathPrefix: pathPrefix, rootStore: store, env: env$1, theme: theme$1, locale: locale$1, translate: translate }))));
@@ -258,6 +259,7 @@ exports.ServerError = errors.ServerError;
258
259
  exports.escapeHtml = escapeHtml.escapeHtml;
259
260
  exports.filterClassNameObject = filterSchema.filterClassNameObject;
260
261
  exports.getExprProperties = filterSchema.getExprProperties;
262
+ exports.hasExprPropertiesChanged = filterSchema.hasExprPropertiesChanged;
261
263
  exports.formatDuration = formatDuration.formatDuration;
262
264
  exports.FormulaExec = formula.FormulaExec;
263
265
  exports.formulaExec = formula.formulaExec;
@@ -530,6 +532,7 @@ Object.defineProperty(exports, 'registerFunction', {
530
532
  exports.LazyComponent = LazyComponent["default"];
531
533
  exports.Overlay = Overlay["default"];
532
534
  exports.PopOver = PopOver["default"];
535
+ exports.ErrorBoundary = ErrorBoundary["default"];
533
536
  exports.FormRenderer = Form.FormRenderer;
534
537
  exports.RENDERER_TRANSMISSION_OMIT_PROPS = SchemaRenderer.RENDERER_TRANSMISSION_OMIT_PROPS;
535
538
  exports.CustomStyle = CustomStyle["default"];
package/lib/locale.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * amis-core v3.5.2
2
+ * amis-core v3.6.0
3
3
  * Copyright 2018-2023 fex
4
4
  */
5
5
 
package/lib/polyfills.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * amis-core v3.5.2
2
+ * amis-core v3.6.0
3
3
  * Copyright 2018-2023 fex
4
4
  */
5
5
 
@@ -265,6 +265,7 @@ export interface FormProps extends RendererProps, Omit<FormSchemaBase, 'mode' |
265
265
  onFailed?: (reason: string, errors: any) => any;
266
266
  onFinished: (values: object, action: any) => any;
267
267
  onValidate: (values: object, form: any) => any;
268
+ onValidChange?: (valid: boolean, props: any) => void;
268
269
  messages: {
269
270
  fetchSuccess?: string;
270
271
  fetchFailed?: string;
@@ -315,8 +316,7 @@ export default class Form extends React.Component<FormProps, object> {
315
316
  [propName: string]: Array<() => Promise<any>>;
316
317
  };
317
318
  asyncCancel: () => void;
318
- disposeOnValidate: () => void;
319
- disposeRulesValidate: () => void;
319
+ toDispose: Array<() => void>;
320
320
  shouldLoadInitApi: boolean;
321
321
  timer: ReturnType<typeof setTimeout>;
322
322
  mounted: boolean;
@@ -326,6 +326,12 @@ export default class Form extends React.Component<FormProps, object> {
326
326
  componentDidMount(): void;
327
327
  componentDidUpdate(prevProps: FormProps): void;
328
328
  componentWillUnmount(): void;
329
+ /** 获取表单联合校验的规则 */
330
+ getNormalizedRules(): {
331
+ message: any;
332
+ rule: string;
333
+ name?: string | string[] | undefined;
334
+ }[];
329
335
  dispatchInited(value: any): Promise<any>;
330
336
  blockRouting(): any;
331
337
  beforePageUnload(e: any): any;
@@ -335,7 +341,7 @@ export default class Form extends React.Component<FormProps, object> {
335
341
  silentReload(target?: string, query?: any): void;
336
342
  initInterval(value: any): any;
337
343
  isValidated(): boolean;
338
- validate(forceValidate?: boolean, throwErrors?: boolean): Promise<boolean>;
344
+ validate(forceValidate?: boolean, throwErrors?: boolean, toastErrors?: boolean): Promise<boolean>;
339
345
  setErrors(errors: {
340
346
  [propName: string]: string;
341
347
  }, tag?: string): void;
@@ -349,7 +355,7 @@ export default class Form extends React.Component<FormProps, object> {
349
355
  removeHook(fn: () => any, type?: string): void;
350
356
  handleChange(value: any, name: string, submit: boolean, changePristine?: boolean): void;
351
357
  formItemDispatchEvent(type: string, data: any): any;
352
- emitChange(submit: boolean): Promise<void>;
358
+ emitChange(submit: boolean, skipIfNothingChanges?: boolean): Promise<void>;
353
359
  handleBulkChange(values: Object, submit: boolean): void;
354
360
  handleFormSubmit(e: React.UIEvent<any>): any;
355
361
  handleReset(action: any): (data: any) => void;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * amis-core v3.5.2
2
+ * amis-core v3.6.0
3
3
  * Copyright 2018-2023 fex
4
4
  */
5
5
 
@@ -56,7 +56,7 @@ require('uncontrollable');
56
56
  require('hoist-non-react-statics');
57
57
  require('../utils/validations.js');
58
58
  require('../utils/resolveCondition.js');
59
- require('mobx');
59
+ var mobx = require('mobx');
60
60
  require('../utils/Animation.js');
61
61
 
62
62
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
@@ -74,6 +74,7 @@ var Form = /** @class */ (function (_super) {
74
74
  function Form(props) {
75
75
  var _this = _super.call(this, props) || this;
76
76
  _this.hooks = {};
77
+ _this.toDispose = [];
77
78
  _this.shouldLoadInitApi = false;
78
79
  _this.lazyEmitChange = debounce__default["default"](_this.emitChange.bind(_this), 250, {
79
80
  trailing: true,
@@ -117,16 +118,23 @@ var Form = /** @class */ (function (_super) {
117
118
  return form.items.forEach(function (item) { return item.unique && item.syncOptions(undefined, form.data); });
118
119
  });
119
120
  }
121
+ // withStore 里面与上层数据会做同步
122
+ // 这个时候变更的数据没有同步 onChange 出去,出现数据不一致的问题。
123
+ // https://github.com/baidu/amis/issues/8773
124
+ _this.toDispose.push(mobx.reaction(function () { return store.initedAt; }, function () {
125
+ store.inited && _this.emitChange(!!_this.props.submitOnChange, true);
126
+ }));
120
127
  return _this;
121
128
  }
122
129
  Form.prototype.componentDidMount = function () {
123
130
  var _this = this;
124
131
  var _a, _b;
125
- var _c = this.props, initApi = _c.initApi, initFetch = _c.initFetch, initFetchOn = _c.initFetchOn, initAsyncApi = _c.initAsyncApi, initFinishedField = _c.initFinishedField, initCheckInterval = _c.initCheckInterval, store = _c.store, _d = _c.messages, fetchSuccess = _d.fetchSuccess, fetchFailed = _d.fetchFailed, onValidate = _c.onValidate, promptPageLeave = _c.promptPageLeave, env = _c.env, rules = _c.rules;
132
+ var _c = this.props, initApi = _c.initApi, initFetch = _c.initFetch, initFetchOn = _c.initFetchOn, initAsyncApi = _c.initAsyncApi, initFinishedField = _c.initFinishedField, initCheckInterval = _c.initCheckInterval, store = _c.store, _d = _c.messages, fetchSuccess = _d.fetchSuccess, fetchFailed = _d.fetchFailed, onValidate = _c.onValidate, onValidChange = _c.onValidChange, promptPageLeave = _c.promptPageLeave, env = _c.env;
133
+ var rules = this.getNormalizedRules();
126
134
  this.mounted = true;
127
135
  if (onValidate) {
128
136
  var finalValidate_1 = helper.promisify(onValidate);
129
- this.disposeOnValidate = this.addHook(function () { return tslib.__awaiter(_this, void 0, void 0, function () {
137
+ this.toDispose.push(this.addHook(function () { return tslib.__awaiter(_this, void 0, void 0, function () {
130
138
  var result;
131
139
  return tslib.__generator(this, function (_a) {
132
140
  switch (_a.label) {
@@ -156,10 +164,14 @@ var Form = /** @class */ (function (_super) {
156
164
  return [2 /*return*/];
157
165
  }
158
166
  });
159
- }); });
167
+ }); }));
160
168
  }
161
- if (Array.isArray(rules) && rules.length) {
162
- this.disposeRulesValidate = this.addHook(function () {
169
+ // 表单校验结果发生变化时,触发 onValidChange
170
+ if (onValidChange) {
171
+ this.toDispose.push(mobx.reaction(function () { return store.valid; }, function (valid) { return onValidChange(valid, _this.props); }));
172
+ }
173
+ if (rules.length) {
174
+ this.toDispose.push(this.addHook(function () {
163
175
  if (!store.valid) {
164
176
  return;
165
177
  }
@@ -167,7 +179,7 @@ var Form = /** @class */ (function (_super) {
167
179
  return !tpl.evalExpression(item.rule, store.data) &&
168
180
  store.addRestError(item.message, item.name);
169
181
  });
170
- });
182
+ }));
171
183
  }
172
184
  if (api.isEffectiveApi(initApi, store.data, initFetch, initFetchOn)) {
173
185
  store
@@ -215,11 +227,23 @@ var Form = /** @class */ (function (_super) {
215
227
  // this.lazyHandleChange.flush();
216
228
  this.lazyEmitChange.cancel();
217
229
  this.asyncCancel && this.asyncCancel();
218
- this.disposeOnValidate && this.disposeOnValidate();
219
- this.disposeRulesValidate && this.disposeRulesValidate();
230
+ this.toDispose.forEach(function (fn) { return fn(); });
231
+ this.toDispose = [];
220
232
  window.removeEventListener('beforeunload', this.beforePageUnload);
221
233
  (_a = this.unBlockRouting) === null || _a === void 0 ? void 0 : _a.call(this);
222
234
  };
235
+ /** 获取表单联合校验的规则 */
236
+ Form.prototype.getNormalizedRules = function () {
237
+ var _a = this.props, rules = _a.rules, __ = _a.translate;
238
+ if (!Array.isArray(rules) || rules.length < 1) {
239
+ return [];
240
+ }
241
+ return rules
242
+ .map(function (item) { return (tslib.__assign(tslib.__assign({}, item), (!item.message || typeof item.message !== 'string'
243
+ ? { message: __('Form.rules.message') }
244
+ : {}))); })
245
+ .filter(function (item) { return item.rule && typeof item.rule === 'string'; });
246
+ };
223
247
  Form.prototype.dispatchInited = function (value) {
224
248
  var _a;
225
249
  return tslib.__awaiter(this, void 0, void 0, function () {
@@ -367,22 +391,27 @@ var Form = /** @class */ (function (_super) {
367
391
  Form.prototype.isValidated = function () {
368
392
  return this.props.store.validated;
369
393
  };
370
- Form.prototype.validate = function (forceValidate, throwErrors) {
394
+ Form.prototype.validate = function (forceValidate, throwErrors, toastErrors) {
371
395
  if (throwErrors === void 0) { throwErrors = false; }
372
- var _a = this.props, store = _a.store, dispatchEvent = _a.dispatchEvent, data = _a.data, messages = _a.messages, __ = _a.translate;
373
- this.flush();
374
- return store
375
- .validate(this.hooks['validate'] || [], forceValidate, throwErrors, typeof (messages === null || messages === void 0 ? void 0 : messages.validateFailed) === 'string'
376
- ? __(tpl.filter(messages.validateFailed, store.data))
377
- : undefined)
378
- .then(function (result) {
379
- if (result) {
380
- dispatchEvent('validateSucc', data);
381
- }
382
- else {
383
- dispatchEvent('validateError', data);
384
- }
385
- return result;
396
+ if (toastErrors === void 0) { toastErrors = true; }
397
+ return tslib.__awaiter(this, void 0, void 0, function () {
398
+ var _a, store, dispatchEvent, data, messages, __, result;
399
+ return tslib.__generator(this, function (_b) {
400
+ switch (_b.label) {
401
+ case 0:
402
+ _a = this.props, store = _a.store, dispatchEvent = _a.dispatchEvent, data = _a.data, messages = _a.messages, __ = _a.translate;
403
+ this.flush();
404
+ return [4 /*yield*/, store.validate(this.hooks['validate'] || [], forceValidate, throwErrors, toastErrors === false
405
+ ? ''
406
+ : typeof (messages === null || messages === void 0 ? void 0 : messages.validateFailed) === 'string'
407
+ ? __(tpl.filter(messages.validateFailed, store.data))
408
+ : undefined)];
409
+ case 1:
410
+ result = _b.sent();
411
+ dispatchEvent(result ? 'validateSucc' : 'validateError', data);
412
+ return [2 /*return*/, result];
413
+ }
414
+ });
386
415
  });
387
416
  };
388
417
  Form.prototype.setErrors = function (errors, tag) {
@@ -466,9 +495,10 @@ var Form = /** @class */ (function (_super) {
466
495
  var dispatchEvent = this.props.dispatchEvent;
467
496
  return dispatchEvent(type, data);
468
497
  };
469
- Form.prototype.emitChange = function (submit) {
498
+ Form.prototype.emitChange = function (submit, skipIfNothingChanges) {
499
+ if (skipIfNothingChanges === void 0) { skipIfNothingChanges = false; }
470
500
  return tslib.__awaiter(this, void 0, void 0, function () {
471
- var _a, onChange, store, submitOnChange, dispatchEvent, data, changeProps, dispatcher;
501
+ var _a, onChange, store, submitOnChange, dispatchEvent, data, diff, changeProps, dispatcher;
472
502
  return tslib.__generator(this, function (_b) {
473
503
  switch (_b.label) {
474
504
  case 0:
@@ -476,11 +506,11 @@ var Form = /** @class */ (function (_super) {
476
506
  if (!mobxStateTree.isAlive(store)) {
477
507
  return [2 /*return*/];
478
508
  }
479
- changeProps = [
480
- store.data,
481
- helper.difference(store.data, store.pristine),
482
- this.props
483
- ];
509
+ diff = helper.difference(store.data, store.pristine);
510
+ if (skipIfNothingChanges && !Object.keys(diff).length) {
511
+ return [2 /*return*/];
512
+ }
513
+ changeProps = [store.data, diff, this.props];
484
514
  return [4 /*yield*/, dispatchEvent('change', object.createObject(data, store.data))];
485
515
  case 1:
486
516
  dispatcher = _b.sent();
@@ -1157,6 +1187,8 @@ var Form = /** @class */ (function (_super) {
1157
1187
  'onChange',
1158
1188
  'onFailed',
1159
1189
  'onFinished',
1190
+ 'onValidate',
1191
+ 'onValidChange',
1160
1192
  'onSaved',
1161
1193
  'canAccessSuperData',
1162
1194
  'lazyChange',