amis 1.8.0-beta.13 → 1.8.0-beta.17

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 (120) hide show
  1. package/lib/WithStore.js +1 -1
  2. package/lib/WithStore.js.map +2 -2
  3. package/lib/components/DatePicker.js +3 -1
  4. package/lib/components/DatePicker.js.map +2 -2
  5. package/lib/components/Progress.js +3 -4
  6. package/lib/components/Progress.js.map +2 -2
  7. package/lib/components/TabsTransfer.d.ts +22 -3
  8. package/lib/components/TabsTransfer.js +149 -42
  9. package/lib/components/TabsTransfer.js.map +2 -2
  10. package/lib/components/Tree.js +3 -1
  11. package/lib/components/Tree.js.map +2 -2
  12. package/lib/components/formula/Editor.js +4 -4
  13. package/lib/components/formula/Editor.js.map +2 -2
  14. package/lib/components/formula/VariableList.d.ts +63 -4
  15. package/lib/components/formula/VariableList.js +23 -8
  16. package/lib/components/formula/VariableList.js.map +2 -2
  17. package/lib/helper.css +1 -1
  18. package/lib/helper.css.map +1 -1
  19. package/lib/index.js +1 -1
  20. package/lib/renderers/Date.js +6 -1
  21. package/lib/renderers/Date.js.map +2 -2
  22. package/lib/renderers/Form/NestedSelect.d.ts +1 -1
  23. package/lib/renderers/Form/NestedSelect.js +7 -2
  24. package/lib/renderers/Form/NestedSelect.js.map +2 -2
  25. package/lib/renderers/Form/TabsTransfer.d.ts +6 -1
  26. package/lib/renderers/Form/TabsTransfer.js +155 -6
  27. package/lib/renderers/Form/TabsTransfer.js.map +2 -2
  28. package/lib/renderers/Form/TabsTransferPicker.d.ts +2 -2
  29. package/lib/renderers/Form/TabsTransferPicker.js +4 -4
  30. package/lib/renderers/Form/TabsTransferPicker.js.map +2 -2
  31. package/lib/renderers/Form/TreeSelect.js.map +2 -2
  32. package/lib/renderers/Form/index.js +6 -2
  33. package/lib/renderers/Form/index.js.map +2 -2
  34. package/lib/renderers/Markdown.js +4 -3
  35. package/lib/renderers/Markdown.js.map +2 -2
  36. package/lib/renderers/Nav.d.ts +21 -20
  37. package/lib/renderers/Nav.js +8 -1
  38. package/lib/renderers/Nav.js.map +2 -2
  39. package/lib/renderers/Page.js +1 -1
  40. package/lib/renderers/Page.js.map +2 -2
  41. package/lib/renderers/Service.js +1 -1
  42. package/lib/renderers/Service.js.map +2 -2
  43. package/lib/renderers/Table/exportExcel.d.ts +6 -0
  44. package/lib/renderers/Table/exportExcel.js +288 -0
  45. package/lib/renderers/Table/exportExcel.js.map +13 -0
  46. package/lib/renderers/Table/index.d.ts +1 -1
  47. package/lib/renderers/Table/index.js +4 -251
  48. package/lib/renderers/Table/index.js.map +2 -2
  49. package/lib/themes/ang-ie11.css +112 -36
  50. package/lib/themes/ang.css +100 -21
  51. package/lib/themes/ang.css.map +1 -1
  52. package/lib/themes/antd-ie11.css +112 -36
  53. package/lib/themes/antd.css +100 -21
  54. package/lib/themes/antd.css.map +1 -1
  55. package/lib/themes/cxd-ie11.css +97 -21
  56. package/lib/themes/cxd.css +100 -21
  57. package/lib/themes/cxd.css.map +1 -1
  58. package/lib/themes/dark-ie11.css +112 -36
  59. package/lib/themes/dark.css +100 -21
  60. package/lib/themes/dark.css.map +1 -1
  61. package/lib/themes/default-ie11.css +97 -21
  62. package/lib/themes/default.css +100 -21
  63. package/lib/themes/default.css.map +1 -1
  64. package/lib/utils/api.js +35 -6
  65. package/lib/utils/api.js.map +2 -2
  66. package/package.json +1 -1
  67. package/schema.json +1 -1
  68. package/scss/_properties.scss +4 -0
  69. package/scss/components/_formula.scss +77 -12
  70. package/scss/components/_progress.scss +2 -7
  71. package/scss/components/form/_date.scss +1 -0
  72. package/scss/components/form/_transfer.scss +21 -0
  73. package/scss/helper/layout/_display.scss +1 -1
  74. package/sdk/ang-ie11.css +130 -36
  75. package/sdk/ang.css +118 -21
  76. package/sdk/antd-ie11.css +130 -36
  77. package/sdk/antd.css +118 -21
  78. package/sdk/barcode.js +51 -51
  79. package/sdk/charts.js +14 -14
  80. package/sdk/codemirror.js +7 -7
  81. package/sdk/color-picker.js +65 -65
  82. package/sdk/cropperjs.js +2 -2
  83. package/sdk/cxd-ie11.css +115 -21
  84. package/sdk/cxd.css +118 -21
  85. package/sdk/dark-ie11.css +130 -36
  86. package/sdk/dark.css +118 -21
  87. package/sdk/exceljs.js +1 -1
  88. package/sdk/helper.css +1 -1
  89. package/sdk/helper.css.map +1 -1
  90. package/sdk/markdown.js +69 -69
  91. package/sdk/papaparse.js +1 -1
  92. package/sdk/renderers/Form/CityDB.js +1 -1
  93. package/sdk/rest.js +17 -17
  94. package/sdk/rich-text.js +62 -62
  95. package/sdk/sdk-ie11.css +115 -21
  96. package/sdk/sdk.css +118 -21
  97. package/sdk/sdk.js +1270 -1268
  98. package/sdk/thirds/hls.js/hls.js +1 -1
  99. package/sdk/thirds/mpegts.js/mpegts.js +1 -1
  100. package/sdk/tinymce.js +57 -57
  101. package/src/WithStore.tsx +1 -1
  102. package/src/components/DatePicker.tsx +2 -1
  103. package/src/components/Progress.tsx +6 -4
  104. package/src/components/TabsTransfer.tsx +253 -143
  105. package/src/components/Tree.tsx +3 -1
  106. package/src/components/formula/Editor.tsx +12 -5
  107. package/src/components/formula/VariableList.tsx +55 -21
  108. package/src/renderers/Date.tsx +14 -1
  109. package/src/renderers/Form/NestedSelect.tsx +11 -2
  110. package/src/renderers/Form/TabsTransfer.tsx +174 -11
  111. package/src/renderers/Form/TabsTransferPicker.tsx +5 -10
  112. package/src/renderers/Form/TreeSelect.tsx +15 -12
  113. package/src/renderers/Form/index.tsx +37 -16
  114. package/src/renderers/Markdown.tsx +4 -5
  115. package/src/renderers/Nav.tsx +7 -1
  116. package/src/renderers/Page.tsx +9 -2
  117. package/src/renderers/Service.tsx +8 -2
  118. package/src/renderers/Table/exportExcel.ts +289 -0
  119. package/src/renderers/Table/index.tsx +5 -252
  120. package/src/utils/api.ts +42 -10
@@ -105,6 +105,8 @@ export class DateField extends React.Component<DateProps, DateState> {
105
105
 
106
106
  const value = getPropValue(this.props);
107
107
 
108
+ // 主要是给 fromNow 用的
109
+ let date;
108
110
  if (value) {
109
111
  let ISODate = moment(value, moment.ISO_8601);
110
112
  let NormalDate = moment(value, valueFormat);
@@ -114,6 +116,10 @@ export class DateField extends React.Component<DateProps, DateState> {
114
116
  : NormalDate.isValid()
115
117
  ? NormalDate.format(format)
116
118
  : false;
119
+
120
+ if (viewValue) {
121
+ date = viewValue as string;
122
+ }
117
123
  }
118
124
 
119
125
  if (fromNow) {
@@ -126,7 +132,14 @@ export class DateField extends React.Component<DateProps, DateState> {
126
132
  viewValue
127
133
  );
128
134
 
129
- return <span className={cx('DateField', className)}>{viewValue}</span>;
135
+ return (
136
+ <span
137
+ className={cx('DateField', className)}
138
+ title={fromNow ? date : undefined}
139
+ >
140
+ {viewValue}
141
+ </span>
142
+ );
130
143
  }
131
144
  }
132
145
 
@@ -62,7 +62,7 @@ export interface NestedSelectControlSchema extends FormOptionsControl {
62
62
  onlyChildren?: boolean;
63
63
 
64
64
  /**
65
- * 单选时只允许选择叶子节点
65
+ * 只允许选择叶子节点
66
66
  */
67
67
  onlyLeaf?: boolean;
68
68
 
@@ -300,11 +300,20 @@ export default class NestedSelectControl extends React.Component<
300
300
  withChildren,
301
301
  onlyChildren,
302
302
  cascade,
303
- options
303
+ options,
304
+ onlyLeaf
304
305
  } = this.props;
305
306
  const {stack} = this.state;
306
307
 
307
308
  let valueField = this.props.valueField || 'value';
309
+
310
+ if (
311
+ onlyLeaf
312
+ && !Array.isArray(option)
313
+ && option.children
314
+ ) {
315
+ return;
316
+ }
308
317
 
309
318
  if (
310
319
  !Array.isArray(option) &&
@@ -1,15 +1,19 @@
1
- import {
2
- OptionsControlProps,
3
- OptionsControl,
4
- FormOptionsControl
5
- } from './Options';
1
+ import {OptionsControlProps, OptionsControl} from './Options';
6
2
  import React from 'react';
7
- import {Api} from '../../types';
3
+ import find from 'lodash/find';
8
4
  import Spinner from '../../components/Spinner';
9
5
  import {BaseTransferRenderer, TransferControlSchema} from './Transfer';
10
6
  import TabsTransfer from '../../components/TabsTransfer';
11
- import {SchemaApi, SchemaObject} from '../../Schema';
12
- import {autobind, createObject} from '../../utils/helper';
7
+ import {Option, optionValueCompare} from '../../components/Select';
8
+ import {
9
+ autobind,
10
+ string2regExp,
11
+ filterTree,
12
+ createObject,
13
+ findTreeIndex,
14
+ getTree,
15
+ spliceTree
16
+ } from '../../utils/helper';
13
17
  import {BaseSelection, ItemRenderStates} from '../../components/Selection';
14
18
 
15
19
  /**
@@ -32,10 +36,170 @@ export interface TabsTransferProps
32
36
  | 'descriptionClassName'
33
37
  > {}
34
38
 
39
+ export class BaseTabsTransferRenderer<
40
+ T extends OptionsControlProps = TabsTransferProps
41
+ > extends BaseTransferRenderer<T> {
42
+ @autobind
43
+ async handleTabSearch(
44
+ term: string,
45
+ option: Option,
46
+ cancelExecutor: Function
47
+ ) {
48
+ const {options, labelField, valueField, env, data} = this.props;
49
+ const {searchApi} = option;
50
+
51
+ if (searchApi) {
52
+ try {
53
+ const payload = await env.fetcher(
54
+ searchApi,
55
+ createObject(data, {term}),
56
+ {
57
+ cancelExecutor
58
+ }
59
+ );
60
+
61
+ if (!payload.ok) {
62
+ throw new Error(payload.msg || '搜索请求异常');
63
+ }
64
+
65
+ const result =
66
+ payload.data.options || payload.data.items || payload.data;
67
+ if (!Array.isArray(result)) {
68
+ throw new Error('CRUD.invalidArray');
69
+ }
70
+
71
+ return result.map(item => {
72
+ let resolved: any = null;
73
+ const value = item[valueField || 'value'];
74
+
75
+ // 只有 value 值有意义的时候,再去找;否则直接返回
76
+ if (Array.isArray(options) && value !== null && value !== undefined) {
77
+ resolved = find(options, optionValueCompare(value, valueField));
78
+ }
79
+
80
+ return resolved || item;
81
+ });
82
+ } catch (e) {
83
+ if (!env.isCancel(e)) {
84
+ env.notify('error', e.message);
85
+ }
86
+
87
+ return [];
88
+ }
89
+ } else if (term) {
90
+ const regexp = string2regExp(term);
91
+
92
+ return filterTree(
93
+ options,
94
+ (option: Option) => {
95
+ return !!(
96
+ (Array.isArray(option.children) && option.children.length) ||
97
+ (option[(valueField as string) || 'value'] &&
98
+ (regexp.test(option[(labelField as string) || 'label']) ||
99
+ regexp.test(option[(valueField as string) || 'value'])))
100
+ );
101
+ },
102
+ 0,
103
+ true
104
+ );
105
+ } else {
106
+ return options;
107
+ }
108
+ }
109
+
110
+ @autobind
111
+ async handleChange(value: Array<Option> | Option, optionModified?: boolean) {
112
+ const {
113
+ onChange,
114
+ joinValues,
115
+ delimiter,
116
+ valueField,
117
+ extractValue,
118
+ options,
119
+ dispatchEvent,
120
+ setOptions,
121
+ translate: __
122
+ } = this.props;
123
+ let newValue: any = value;
124
+ let newOptions = options.concat();
125
+ const UN_MATCH_RESULT = 'UN_MATCH_RESULT';
126
+
127
+ if (Array.isArray(value)) {
128
+ newValue = value.map(item => {
129
+ const indexes = findTreeIndex(
130
+ options,
131
+ optionValueCompare(
132
+ item[(valueField as string) || 'value'],
133
+ (valueField as string) || 'value'
134
+ )
135
+ );
136
+
137
+ // 这里主要是把查询出来的没有匹配的搜索的结果(一般是DEFFER时)聚合在一个分类下
138
+ if (!indexes) {
139
+ const searchIndexes = findTreeIndex(
140
+ newOptions,
141
+ item => item.value === UN_MATCH_RESULT
142
+ );
143
+ if (!searchIndexes) {
144
+ newOptions.push({
145
+ label: __('searchResult'),
146
+ value: UN_MATCH_RESULT,
147
+ visible: false,
148
+ children: [item]
149
+ });
150
+ } else {
151
+ const origin = getTree(newOptions, searchIndexes);
152
+ if (origin?.children) {
153
+ origin.children.push(item);
154
+ newOptions = spliceTree(newOptions, searchIndexes, 1, {
155
+ ...origin,
156
+ ...item
157
+ });
158
+ }
159
+ }
160
+ } else if (optionModified) {
161
+ const origin = getTree(newOptions, indexes);
162
+ newOptions = spliceTree(newOptions, indexes, 1, {
163
+ ...origin,
164
+ ...item
165
+ });
166
+ }
167
+
168
+ return joinValues || extractValue
169
+ ? item[(valueField as string) || 'value']
170
+ : item;
171
+ });
172
+
173
+ if (joinValues) {
174
+ newValue = newValue.join(delimiter || ',');
175
+ }
176
+ } else if (value) {
177
+ newValue =
178
+ joinValues || extractValue
179
+ ? value[(valueField as string) || 'value']
180
+ : value;
181
+ }
182
+
183
+ (newOptions.length > options.length || optionModified) &&
184
+ setOptions(newOptions, true);
185
+
186
+ // 触发渲染器事件
187
+ const rendererEvent = await dispatchEvent('change', {
188
+ value: newValue,
189
+ options
190
+ });
191
+ if (rendererEvent?.prevented) {
192
+ return;
193
+ }
194
+
195
+ onChange(newValue);
196
+ }
197
+ }
198
+
35
199
  @OptionsControl({
36
200
  type: 'tabs-transfer'
37
201
  })
38
- export class TabsTransferRenderer extends BaseTransferRenderer<TabsTransferProps> {
202
+ export class TabsTransferRenderer extends BaseTabsTransferRenderer<TabsTransferProps> {
39
203
  @autobind
40
204
  optionItemRender(option: any, states: ItemRenderStates) {
41
205
  const {menuTpl, render, data} = this.props;
@@ -64,7 +228,6 @@ export class TabsTransferRenderer extends BaseTransferRenderer<TabsTransferProps
64
228
  selectedOptions,
65
229
  sortable,
66
230
  loading,
67
- searchable,
68
231
  searchResultMode,
69
232
  showArrow,
70
233
  deferLoad,
@@ -84,7 +247,7 @@ export class TabsTransferRenderer extends BaseTransferRenderer<TabsTransferProps
84
247
  option2value={this.option2value}
85
248
  sortable={sortable}
86
249
  searchResultMode={searchResultMode}
87
- onSearch={searchable ? this.handleSearch : undefined}
250
+ onSearch={this.handleTabSearch}
88
251
  showArrow={showArrow}
89
252
  onDeferLoad={deferLoad}
90
253
  onLeftDeferLoad={leftDeferLoad}
@@ -1,15 +1,11 @@
1
- import {
2
- OptionsControlProps,
3
- OptionsControl,
4
- FormOptionsControl
5
- } from './Options';
1
+ import {OptionsControlProps, OptionsControl} from './Options';
6
2
  import React from 'react';
7
3
  import Spinner from '../../components/Spinner';
8
- import {BaseTransferRenderer} from './Transfer';
9
- import {SchemaApi, SchemaObject} from '../../Schema';
4
+ import {BaseTabsTransferRenderer} from './TabsTransfer';
10
5
  import TabsTransferPicker from '../../components/TabsTransferPicker';
11
6
  import {TabsTransferControlSchema} from './TabsTransfer';
12
7
  import {autobind, createObject} from '../../utils/helper';
8
+ import {Option, optionValueCompare} from '../../components/Select';
13
9
  import {BaseSelection, ItemRenderStates} from '../../components/Selection';
14
10
 
15
11
  /**
@@ -35,7 +31,7 @@ export interface TabsTransferProps
35
31
  @OptionsControl({
36
32
  type: 'tabs-transfer-picker'
37
33
  })
38
- export class TabsTransferPickerRenderer extends BaseTransferRenderer<TabsTransferProps> {
34
+ export class TabsTransferPickerRenderer extends BaseTabsTransferRenderer<TabsTransferProps> {
39
35
  @autobind
40
36
  optionItemRender(option: any, states: ItemRenderStates) {
41
37
  const {menuTpl, render, data} = this.props;
@@ -64,7 +60,6 @@ export class TabsTransferPickerRenderer extends BaseTransferRenderer<TabsTransfe
64
60
  selectedOptions,
65
61
  sortable,
66
62
  loading,
67
- searchable,
68
63
  searchResultMode,
69
64
  showArrow,
70
65
  deferLoad,
@@ -86,7 +81,7 @@ export class TabsTransferPickerRenderer extends BaseTransferRenderer<TabsTransfe
86
81
  option2value={this.option2value}
87
82
  sortable={sortable}
88
83
  searchResultMode={searchResultMode}
89
- onSearch={searchable ? this.handleSearch : undefined}
84
+ onSearch={this.handleTabSearch}
90
85
  showArrow={showArrow}
91
86
  onDeferLoad={deferLoad}
92
87
  selectTitle={selectTitle}
@@ -18,7 +18,12 @@ import {Api} from '../../types';
18
18
  import {isEffectiveApi} from '../../utils/api';
19
19
  import Spinner from '../../components/Spinner';
20
20
  import ResultBox from '../../components/ResultBox';
21
- import {autobind, getTreeAncestors, isMobile, createObject} from '../../utils/helper';
21
+ import {
22
+ autobind,
23
+ getTreeAncestors,
24
+ isMobile,
25
+ createObject
26
+ } from '../../utils/helper';
22
27
  import {findDOMNode} from 'react-dom';
23
28
  import {normalizeOptions} from '../../components/Select';
24
29
  import {Action} from '../../types';
@@ -127,7 +132,7 @@ export default class TreeSelectControl extends React.Component<
127
132
  pathSeparator: '/'
128
133
  };
129
134
 
130
- treeRef: any
135
+ treeRef: any;
131
136
 
132
137
  container: React.RefObject<HTMLDivElement> = React.createRef();
133
138
 
@@ -417,13 +422,8 @@ export default class TreeSelectControl extends React.Component<
417
422
 
418
423
  @autobind
419
424
  handleResultChange(value: Array<Option>) {
420
- const {
421
- joinValues,
422
- extractValue,
423
- delimiter,
424
- valueField,
425
- multiple
426
- } = this.props;
425
+ const {joinValues, extractValue, delimiter, valueField, multiple} =
426
+ this.props;
427
427
 
428
428
  let newValue: any = Array.isArray(value) ? value.concat() : [];
429
429
 
@@ -452,9 +452,12 @@ export default class TreeSelectControl extends React.Component<
452
452
  async resultChangeEvent(value: any) {
453
453
  const {onChange, dispatchEvent, data} = this.props;
454
454
 
455
- const rendererEvent = await dispatchEvent('change', createObject(data, {
456
- value
457
- }));
455
+ const rendererEvent = await dispatchEvent(
456
+ 'change',
457
+ createObject(data, {
458
+ value
459
+ })
460
+ );
458
461
 
459
462
  if (rendererEvent?.prevented) {
460
463
  return;
@@ -626,7 +626,8 @@ export default class Form extends React.Component<FormProps, object> {
626
626
  }
627
627
 
628
628
  async onInit() {
629
- const {onInit, store, persistData, submitOnInit, dispatchEvent} = this.props;
629
+ const {onInit, store, persistData, submitOnInit, dispatchEvent} =
630
+ this.props;
630
631
  if (!isAlive(store)) {
631
632
  return;
632
633
  }
@@ -659,7 +660,10 @@ export default class Form extends React.Component<FormProps, object> {
659
660
  persistData && store.getLocalPersistData();
660
661
 
661
662
  // 派发init事件,参数为初始化数据
662
- const dispatcher = dispatchEvent('inited', createObject(this.props.data, {formData: data}));
663
+ const dispatcher = dispatchEvent(
664
+ 'inited',
665
+ createObject(this.props.data, {formData: data})
666
+ );
663
667
  if (!dispatcher?.prevented) {
664
668
  onInit && onInit(data, this.props);
665
669
  }
@@ -754,14 +758,16 @@ export default class Form extends React.Component<FormProps, object> {
754
758
  const {store, dispatchEvent, data} = this.props;
755
759
 
756
760
  this.flush();
757
- return store.validate(this.hooks['validate'] || [], forceValidate).then((result: boolean) => {
758
- if (result) {
759
- dispatchEvent('validateSucc', data);
760
- } else {
761
- dispatchEvent('validateFail', data);
762
- }
763
- return result;
764
- });
761
+ return store
762
+ .validate(this.hooks['validate'] || [], forceValidate)
763
+ .then((result: boolean) => {
764
+ if (result) {
765
+ dispatchEvent('validateSucc', data);
766
+ } else {
767
+ dispatchEvent('validateFail', data);
768
+ }
769
+ return result;
770
+ });
765
771
  }
766
772
 
767
773
  clearErrors() {
@@ -792,7 +798,7 @@ export default class Form extends React.Component<FormProps, object> {
792
798
  fn,
793
799
  this.hooks['validate'] || [],
794
800
  __(messages && messages.validateFailed),
795
- validateErrCb,
801
+ validateErrCb
796
802
  );
797
803
  }
798
804
 
@@ -859,7 +865,7 @@ export default class Form extends React.Component<FormProps, object> {
859
865
  formItemDispatchEvent(dispatchEvent: any) {
860
866
  return (type: string, data: any) => {
861
867
  dispatchEvent(type, data);
862
- }
868
+ };
863
869
  }
864
870
 
865
871
  emitChange(submit: boolean) {
@@ -868,9 +874,17 @@ export default class Form extends React.Component<FormProps, object> {
868
874
  if (!isAlive(store)) {
869
875
  return;
870
876
  }
871
- const dispatcher = dispatchEvent('change', createObject(data, {formData: store.data}));
877
+ const dispatcher = dispatchEvent(
878
+ 'change',
879
+ createObject(data, {formData: store.data})
880
+ );
872
881
  if (!dispatcher?.prevented) {
873
- onChange && onChange(store.data, difference(store.data, store.pristine), this.props);
882
+ onChange &&
883
+ onChange(
884
+ store.data,
885
+ difference(store.data, store.pristine),
886
+ this.props
887
+ );
874
888
  }
875
889
 
876
890
  store.clearRestError();
@@ -1026,7 +1040,10 @@ export default class Form extends React.Component<FormProps, object> {
1026
1040
  errorMessage: saveFailed,
1027
1041
  onSuccess: (result: Payload) => {
1028
1042
  // result为提交接口返回的内容
1029
- dispatchEvent('submitSucc', createObject(this.props.data, {result}));
1043
+ dispatchEvent(
1044
+ 'submitSucc',
1045
+ createObject(this.props.data, {result})
1046
+ );
1030
1047
  if (
1031
1048
  !isEffectiveApi(finnalAsyncApi, store.data) ||
1032
1049
  store.data[finishedField || 'finished']
@@ -1041,7 +1058,10 @@ export default class Form extends React.Component<FormProps, object> {
1041
1058
  );
1042
1059
  },
1043
1060
  onFailed: (result: Payload) => {
1044
- dispatchEvent('submitFail', createObject(this.props.data, {error: result}));
1061
+ dispatchEvent(
1062
+ 'submitFail',
1063
+ createObject(this.props.data, {error: result})
1064
+ );
1045
1065
  }
1046
1066
  })
1047
1067
  .then(async response => {
@@ -1634,6 +1654,7 @@ export default class Form extends React.Component<FormProps, object> {
1634
1654
  type: 'form',
1635
1655
  storeType: FormStore.name,
1636
1656
  isolateScope: true,
1657
+ storeExtendsData: (props: any) => props.inheritData,
1637
1658
  shouldSyncSuperStore: (store, props, prevProps) => {
1638
1659
  // 如果是 QuickEdit,让 store 同步 __super 数据。
1639
1660
  if (
@@ -64,11 +64,10 @@ export class Markdown extends React.Component<MarkdownProps, MarkdownState> {
64
64
 
65
65
  componentDidUpdate(prevProps: MarkdownProps) {
66
66
  const props = this.props;
67
- if (
68
- props.src &&
69
- isApiOutdated(prevProps.src, props.src, prevProps.data, props.data)
70
- ) {
71
- this.updateContent();
67
+ if (props.src) {
68
+ if (isApiOutdated(prevProps.src, props.src, prevProps.data, props.data)) {
69
+ this.updateContent();
70
+ }
72
71
  } else {
73
72
  this.updateContent();
74
73
  }
@@ -230,6 +230,7 @@ export interface NavigationProps
230
230
  onSelect?: (item: Link) => void | false;
231
231
  onToggle?: (item: Link, forceFold?: boolean) => void;
232
232
  onDragUpdate?: (dropInfo: IDropInfo) => void;
233
+ onOrderChange?: (res: Link[]) => void;
233
234
  togglerClassName?: string;
234
235
  links?: Array<Link>;
235
236
  loading?: boolean;
@@ -858,6 +859,7 @@ const ConditionBuilderWithRemoteOptions = withRemoteConfig({
858
859
  }
859
860
  }
860
861
  this.props.updateConfig(links, 'update');
862
+ this.props.onOrderChange!(links);
861
863
  await this.saveOrder(
862
864
  mapTree(links, (link: Link) => {
863
865
  // 清除内部加的字段
@@ -871,6 +873,10 @@ const ConditionBuilderWithRemoteOptions = withRemoteConfig({
871
873
  );
872
874
  }
873
875
 
876
+ /**
877
+ * @description 在接口存在的时候,调用接口保存排序结果
878
+ * @param links 排序后的结果
879
+ */
874
880
  async saveOrder(links: Links) {
875
881
  const {saveOrderApi, env, data, reload} = this.props;
876
882
  if (saveOrderApi && isEffectiveApi(saveOrderApi)) {
@@ -880,7 +886,7 @@ const ConditionBuilderWithRemoteOptions = withRemoteConfig({
880
886
  {method: 'post'}
881
887
  );
882
888
  reload();
883
- } else {
889
+ } else if (!this.props.onOrderChange) {
884
890
  env.alert('NAV saveOrderApi is required!');
885
891
  }
886
892
  }
@@ -12,7 +12,12 @@ import {
12
12
  FunctionPropertyNames
13
13
  } from '../types';
14
14
  import {filter, evalExpression} from '../utils/tpl';
15
- import {isVisible, autobind, bulkBindFunctions} from '../utils/helper';
15
+ import {
16
+ isVisible,
17
+ autobind,
18
+ bulkBindFunctions,
19
+ isObjectShallowModified
20
+ } from '../utils/helper';
16
21
  import {ScopedContext, IScopedContext} from '../Scoped';
17
22
  import Alert from '../components/Alert2';
18
23
  import {isApiOutdated, isEffectiveApi} from '../utils/api';
@@ -422,7 +427,9 @@ export default class Page extends React.Component<PageProps> {
422
427
  JSON.stringify(props.cssVars) !== JSON.stringify(prevProps.cssVars)
423
428
  ) {
424
429
  this.updateVarStyle();
425
- } else if (props.defaultData !== prevProps.defaultData) {
430
+ } else if (
431
+ isObjectShallowModified(prevProps.defaultData, props.defaultData)
432
+ ) {
426
433
  store.reInitData(props.defaultData);
427
434
  }
428
435
  }
@@ -14,7 +14,13 @@ import {
14
14
  str2AsyncFunction
15
15
  } from '../utils/api';
16
16
  import {Spinner} from '../components';
17
- import {autobind, isEmpty, isVisible, qsstringify} from '../utils/helper';
17
+ import {
18
+ autobind,
19
+ isEmpty,
20
+ isObjectShallowModified,
21
+ isVisible,
22
+ qsstringify
23
+ } from '../utils/helper';
18
24
  import {
19
25
  BaseSchema,
20
26
  SchemaApi,
@@ -185,7 +191,7 @@ export default class Service extends React.Component<ServiceProps> {
185
191
  this.socket = this.fetchWSData(props.ws, store.data);
186
192
  }
187
193
 
188
- if (props.defaultData !== prevProps.defaultData) {
194
+ if (isObjectShallowModified(prevProps.defaultData, props.defaultData)) {
189
195
  store.reInitData(props.defaultData);
190
196
  }
191
197