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.
- package/lib/WithStore.js +1 -1
- package/lib/WithStore.js.map +2 -2
- package/lib/components/DatePicker.js +3 -1
- package/lib/components/DatePicker.js.map +2 -2
- package/lib/components/Progress.js +3 -4
- package/lib/components/Progress.js.map +2 -2
- 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/Tree.js +3 -1
- package/lib/components/Tree.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/helper.css +1 -1
- package/lib/helper.css.map +1 -1
- package/lib/index.js +1 -1
- package/lib/renderers/Date.js +6 -1
- package/lib/renderers/Date.js.map +2 -2
- 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/TreeSelect.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/renderers/Nav.d.ts +21 -20
- package/lib/renderers/Nav.js +8 -1
- package/lib/renderers/Nav.js.map +2 -2
- package/lib/renderers/Page.js +1 -1
- package/lib/renderers/Page.js.map +2 -2
- package/lib/renderers/Service.js +1 -1
- package/lib/renderers/Service.js.map +2 -2
- package/lib/renderers/Table/exportExcel.d.ts +6 -0
- package/lib/renderers/Table/exportExcel.js +288 -0
- package/lib/renderers/Table/exportExcel.js.map +13 -0
- package/lib/renderers/Table/index.d.ts +1 -1
- package/lib/renderers/Table/index.js +4 -251
- package/lib/renderers/Table/index.js.map +2 -2
- package/lib/themes/ang-ie11.css +112 -36
- package/lib/themes/ang.css +100 -21
- package/lib/themes/ang.css.map +1 -1
- package/lib/themes/antd-ie11.css +112 -36
- package/lib/themes/antd.css +100 -21
- package/lib/themes/antd.css.map +1 -1
- package/lib/themes/cxd-ie11.css +97 -21
- package/lib/themes/cxd.css +100 -21
- package/lib/themes/cxd.css.map +1 -1
- package/lib/themes/dark-ie11.css +112 -36
- package/lib/themes/dark.css +100 -21
- package/lib/themes/dark.css.map +1 -1
- package/lib/themes/default-ie11.css +97 -21
- package/lib/themes/default.css +100 -21
- package/lib/themes/default.css.map +1 -1
- package/lib/utils/api.js +35 -6
- package/lib/utils/api.js.map +2 -2
- package/package.json +1 -1
- package/schema.json +1 -1
- package/scss/_properties.scss +4 -0
- package/scss/components/_formula.scss +77 -12
- package/scss/components/_progress.scss +2 -7
- package/scss/components/form/_date.scss +1 -0
- package/scss/components/form/_transfer.scss +21 -0
- package/scss/helper/layout/_display.scss +1 -1
- package/sdk/ang-ie11.css +130 -36
- package/sdk/ang.css +118 -21
- package/sdk/antd-ie11.css +130 -36
- package/sdk/antd.css +118 -21
- 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 +115 -21
- package/sdk/cxd.css +118 -21
- package/sdk/dark-ie11.css +130 -36
- package/sdk/dark.css +118 -21
- package/sdk/exceljs.js +1 -1
- package/sdk/helper.css +1 -1
- package/sdk/helper.css.map +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 +115 -21
- package/sdk/sdk.css +118 -21
- package/sdk/sdk.js +1270 -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/WithStore.tsx +1 -1
- package/src/components/DatePicker.tsx +2 -1
- package/src/components/Progress.tsx +6 -4
- package/src/components/TabsTransfer.tsx +253 -143
- package/src/components/Tree.tsx +3 -1
- package/src/components/formula/Editor.tsx +12 -5
- package/src/components/formula/VariableList.tsx +55 -21
- package/src/renderers/Date.tsx +14 -1
- 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/TreeSelect.tsx +15 -12
- package/src/renderers/Form/index.tsx +37 -16
- package/src/renderers/Markdown.tsx +4 -5
- package/src/renderers/Nav.tsx +7 -1
- package/src/renderers/Page.tsx +9 -2
- package/src/renderers/Service.tsx +8 -2
- package/src/renderers/Table/exportExcel.ts +289 -0
- package/src/renderers/Table/index.tsx +5 -252
- package/src/utils/api.ts +42 -10
package/src/renderers/Date.tsx
CHANGED
@@ -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
|
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
|
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}
|
@@ -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 {
|
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
|
-
|
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(
|
456
|
-
|
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} =
|
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
|
}
|
package/src/renderers/Nav.tsx
CHANGED
@@ -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
|
}
|
package/src/renderers/Page.tsx
CHANGED
@@ -12,7 +12,12 @@ import {
|
|
12
12
|
FunctionPropertyNames
|
13
13
|
} from '../types';
|
14
14
|
import {filter, evalExpression} from '../utils/tpl';
|
15
|
-
import {
|
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 (
|
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 {
|
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 (
|
194
|
+
if (isObjectShallowModified(prevProps.defaultData, props.defaultData)) {
|
189
195
|
store.reInitData(props.defaultData);
|
190
196
|
}
|
191
197
|
|