amis 1.8.0-beta.16 → 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 (75) hide show
  1. package/lib/components/TabsTransfer.d.ts +22 -3
  2. package/lib/components/TabsTransfer.js +149 -42
  3. package/lib/components/TabsTransfer.js.map +2 -2
  4. package/lib/components/formula/Editor.js +4 -4
  5. package/lib/components/formula/Editor.js.map +2 -2
  6. package/lib/components/formula/VariableList.d.ts +63 -4
  7. package/lib/components/formula/VariableList.js +23 -8
  8. package/lib/components/formula/VariableList.js.map +2 -2
  9. package/lib/index.js +1 -1
  10. package/lib/renderers/Form/NestedSelect.d.ts +1 -1
  11. package/lib/renderers/Form/NestedSelect.js +7 -2
  12. package/lib/renderers/Form/NestedSelect.js.map +2 -2
  13. package/lib/renderers/Form/TabsTransfer.d.ts +6 -1
  14. package/lib/renderers/Form/TabsTransfer.js +155 -6
  15. package/lib/renderers/Form/TabsTransfer.js.map +2 -2
  16. package/lib/renderers/Form/TabsTransferPicker.d.ts +2 -2
  17. package/lib/renderers/Form/TabsTransferPicker.js +4 -4
  18. package/lib/renderers/Form/TabsTransferPicker.js.map +2 -2
  19. package/lib/renderers/Form/index.js +6 -2
  20. package/lib/renderers/Form/index.js.map +2 -2
  21. package/lib/renderers/Markdown.js +4 -3
  22. package/lib/renderers/Markdown.js.map +2 -2
  23. package/lib/themes/ang-ie11.css +92 -14
  24. package/lib/themes/ang.css +94 -14
  25. package/lib/themes/ang.css.map +1 -1
  26. package/lib/themes/antd-ie11.css +92 -14
  27. package/lib/themes/antd.css +94 -14
  28. package/lib/themes/antd.css.map +1 -1
  29. package/lib/themes/cxd-ie11.css +92 -14
  30. package/lib/themes/cxd.css +94 -14
  31. package/lib/themes/cxd.css.map +1 -1
  32. package/lib/themes/dark-ie11.css +92 -14
  33. package/lib/themes/dark.css +94 -14
  34. package/lib/themes/dark.css.map +1 -1
  35. package/lib/themes/default-ie11.css +92 -14
  36. package/lib/themes/default.css +94 -14
  37. package/lib/themes/default.css.map +1 -1
  38. package/package.json +1 -1
  39. package/schema.json +1 -1
  40. package/scss/_properties.scss +3 -0
  41. package/scss/components/_formula.scss +77 -12
  42. package/scss/components/form/_transfer.scss +21 -0
  43. package/sdk/ang-ie11.css +109 -14
  44. package/sdk/ang.css +111 -14
  45. package/sdk/antd-ie11.css +109 -14
  46. package/sdk/antd.css +111 -14
  47. package/sdk/barcode.js +51 -51
  48. package/sdk/charts.js +14 -14
  49. package/sdk/codemirror.js +7 -7
  50. package/sdk/color-picker.js +65 -65
  51. package/sdk/cropperjs.js +2 -2
  52. package/sdk/cxd-ie11.css +109 -14
  53. package/sdk/cxd.css +111 -14
  54. package/sdk/dark-ie11.css +109 -14
  55. package/sdk/dark.css +111 -14
  56. package/sdk/exceljs.js +1 -1
  57. package/sdk/markdown.js +69 -69
  58. package/sdk/papaparse.js +1 -1
  59. package/sdk/renderers/Form/CityDB.js +1 -1
  60. package/sdk/rest.js +17 -17
  61. package/sdk/rich-text.js +62 -62
  62. package/sdk/sdk-ie11.css +109 -14
  63. package/sdk/sdk.css +111 -14
  64. package/sdk/sdk.js +1268 -1268
  65. package/sdk/thirds/hls.js/hls.js +1 -1
  66. package/sdk/thirds/mpegts.js/mpegts.js +1 -1
  67. package/sdk/tinymce.js +57 -57
  68. package/src/components/TabsTransfer.tsx +253 -143
  69. package/src/components/formula/Editor.tsx +12 -5
  70. package/src/components/formula/VariableList.tsx +55 -21
  71. package/src/renderers/Form/NestedSelect.tsx +11 -2
  72. package/src/renderers/Form/TabsTransfer.tsx +174 -11
  73. package/src/renderers/Form/TabsTransferPicker.tsx +5 -10
  74. package/src/renderers/Form/index.tsx +37 -16
  75. package/src/renderers/Markdown.tsx +4 -5
@@ -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}
@@ -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
  }