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.
- package/lib/components/TabsTransfer.d.ts +22 -3
- package/lib/components/TabsTransfer.js +149 -42
- package/lib/components/TabsTransfer.js.map +2 -2
- package/lib/components/formula/Editor.js +4 -4
- package/lib/components/formula/Editor.js.map +2 -2
- package/lib/components/formula/VariableList.d.ts +63 -4
- package/lib/components/formula/VariableList.js +23 -8
- package/lib/components/formula/VariableList.js.map +2 -2
- package/lib/index.js +1 -1
- package/lib/renderers/Form/NestedSelect.d.ts +1 -1
- package/lib/renderers/Form/NestedSelect.js +7 -2
- package/lib/renderers/Form/NestedSelect.js.map +2 -2
- package/lib/renderers/Form/TabsTransfer.d.ts +6 -1
- package/lib/renderers/Form/TabsTransfer.js +155 -6
- package/lib/renderers/Form/TabsTransfer.js.map +2 -2
- package/lib/renderers/Form/TabsTransferPicker.d.ts +2 -2
- package/lib/renderers/Form/TabsTransferPicker.js +4 -4
- package/lib/renderers/Form/TabsTransferPicker.js.map +2 -2
- package/lib/renderers/Form/index.js +6 -2
- package/lib/renderers/Form/index.js.map +2 -2
- package/lib/renderers/Markdown.js +4 -3
- package/lib/renderers/Markdown.js.map +2 -2
- package/lib/themes/ang-ie11.css +92 -14
- package/lib/themes/ang.css +94 -14
- package/lib/themes/ang.css.map +1 -1
- package/lib/themes/antd-ie11.css +92 -14
- package/lib/themes/antd.css +94 -14
- package/lib/themes/antd.css.map +1 -1
- package/lib/themes/cxd-ie11.css +92 -14
- package/lib/themes/cxd.css +94 -14
- package/lib/themes/cxd.css.map +1 -1
- package/lib/themes/dark-ie11.css +92 -14
- package/lib/themes/dark.css +94 -14
- package/lib/themes/dark.css.map +1 -1
- package/lib/themes/default-ie11.css +92 -14
- package/lib/themes/default.css +94 -14
- package/lib/themes/default.css.map +1 -1
- package/package.json +1 -1
- package/schema.json +1 -1
- package/scss/_properties.scss +3 -0
- package/scss/components/_formula.scss +77 -12
- package/scss/components/form/_transfer.scss +21 -0
- package/sdk/ang-ie11.css +109 -14
- package/sdk/ang.css +111 -14
- package/sdk/antd-ie11.css +109 -14
- package/sdk/antd.css +111 -14
- package/sdk/barcode.js +51 -51
- package/sdk/charts.js +14 -14
- package/sdk/codemirror.js +7 -7
- package/sdk/color-picker.js +65 -65
- package/sdk/cropperjs.js +2 -2
- package/sdk/cxd-ie11.css +109 -14
- package/sdk/cxd.css +111 -14
- package/sdk/dark-ie11.css +109 -14
- package/sdk/dark.css +111 -14
- package/sdk/exceljs.js +1 -1
- package/sdk/markdown.js +69 -69
- package/sdk/papaparse.js +1 -1
- package/sdk/renderers/Form/CityDB.js +1 -1
- package/sdk/rest.js +17 -17
- package/sdk/rich-text.js +62 -62
- package/sdk/sdk-ie11.css +109 -14
- package/sdk/sdk.css +111 -14
- package/sdk/sdk.js +1268 -1268
- package/sdk/thirds/hls.js/hls.js +1 -1
- package/sdk/thirds/mpegts.js/mpegts.js +1 -1
- package/sdk/tinymce.js +57 -57
- package/src/components/TabsTransfer.tsx +253 -143
- package/src/components/formula/Editor.tsx +12 -5
- package/src/components/formula/VariableList.tsx +55 -21
- package/src/renderers/Form/NestedSelect.tsx +11 -2
- package/src/renderers/Form/TabsTransfer.tsx +174 -11
- package/src/renderers/Form/TabsTransferPicker.tsx +5 -10
- package/src/renderers/Form/index.tsx +37 -16
- 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
|
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 {
|
12
|
-
import {
|
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
|
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={
|
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 {
|
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
|
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={
|
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} =
|
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(
|
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
|
758
|
-
|
759
|
-
|
760
|
-
|
761
|
-
|
762
|
-
|
763
|
-
|
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(
|
877
|
+
const dispatcher = dispatchEvent(
|
878
|
+
'change',
|
879
|
+
createObject(data, {formData: store.data})
|
880
|
+
);
|
872
881
|
if (!dispatcher?.prevented) {
|
873
|
-
onChange &&
|
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(
|
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(
|
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
|
-
|
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
|
}
|