amis 1.9.1-beta.19 → 1.9.1-beta.23
Sign up to get free protection for your applications and to get access to all the features.
- package/lib/components/Radios.d.ts +10 -10
- package/lib/components/ResultBox.d.ts +44 -40
- package/lib/components/ResultBox.js +43 -7
- package/lib/components/ResultBox.js.map +2 -2
- package/lib/components/ResultTableList.js +16 -17
- package/lib/components/ResultTableList.js.map +2 -2
- package/lib/components/Select.d.ts +498 -294
- package/lib/components/Select.js +64 -12
- package/lib/components/Select.js.map +2 -2
- package/lib/components/TableSelection.d.ts +42 -40
- package/lib/components/TableSelection.js +7 -2
- package/lib/components/TableSelection.js.map +2 -2
- package/lib/components/TooltipWrapper.d.ts +1 -1
- package/lib/components/TooltipWrapper.js.map +2 -2
- package/lib/components/TransferDropDown.d.ts +43 -40
- package/lib/components/TransferDropDown.js +2 -2
- package/lib/components/TransferDropDown.js.map +2 -2
- package/lib/helper.css.map +1 -1
- package/lib/index.js +1 -1
- package/lib/locale/de-DE.js +1 -1
- package/lib/locale/de-DE.js.map +2 -2
- package/lib/locale/en-US.js +1 -1
- package/lib/locale/en-US.js.map +2 -2
- package/lib/renderers/CRUD.js +2 -2
- package/lib/renderers/CRUD.js.map +2 -2
- package/lib/renderers/Form/DiffEditor.d.ts +66 -20
- package/lib/renderers/Form/Editor.d.ts +66 -20
- package/lib/renderers/Form/Group.js +1 -1
- package/lib/renderers/Form/Group.js.map +2 -2
- package/lib/renderers/Form/InputImage.js.map +2 -2
- package/lib/renderers/Form/InputTag.d.ts +8 -0
- package/lib/renderers/Form/InputTag.js +2 -2
- package/lib/renderers/Form/InputTag.js.map +2 -2
- package/lib/renderers/Form/Options.js +7 -7
- package/lib/renderers/Form/Options.js.map +2 -2
- package/lib/renderers/Form/Select.d.ts +24 -0
- package/lib/renderers/Form/Select.js +5 -3
- package/lib/renderers/Form/Select.js.map +2 -2
- package/lib/renderers/Form/Transfer.d.ts +1 -0
- package/lib/renderers/Form/Transfer.js +4 -0
- package/lib/renderers/Form/Transfer.js.map +2 -2
- package/lib/renderers/Form/TreeSelect.d.ts +0 -1
- package/lib/renderers/Form/TreeSelect.js +1 -9
- package/lib/renderers/Form/TreeSelect.js.map +2 -2
- package/lib/renderers/Form/index.js +9 -4
- package/lib/renderers/Form/index.js.map +2 -2
- package/lib/renderers/QRCode.d.ts +16 -0
- package/lib/renderers/QRCode.js +25 -1
- package/lib/renderers/QRCode.js.map +2 -2
- package/lib/renderers/Table/exportExcel.js +51 -37
- package/lib/renderers/Table/exportExcel.js.map +2 -2
- package/lib/renderers/Table/index.d.ts +2 -0
- package/lib/renderers/Table/index.js +37 -5
- package/lib/renderers/Table/index.js.map +2 -2
- package/lib/renderers/Tpl.d.ts +4 -0
- package/lib/renderers/Tpl.js +6 -3
- package/lib/renderers/Tpl.js.map +2 -2
- package/lib/store/combo.d.ts +72 -22
- package/lib/store/form.d.ts +30 -9
- package/lib/store/form.js +28 -10
- package/lib/store/form.js.map +2 -2
- package/lib/store/formItem.d.ts +3 -1
- package/lib/store/formItem.js +3 -5
- package/lib/store/formItem.js.map +2 -2
- package/lib/store/table.d.ts +60 -18
- package/lib/themes/ang-ie11.css +94 -13
- package/lib/themes/ang.css +99 -13
- package/lib/themes/ang.css.map +1 -1
- package/lib/themes/antd-ie11.css +94 -13
- package/lib/themes/antd.css +99 -13
- package/lib/themes/antd.css.map +1 -1
- package/lib/themes/cxd-ie11.css +94 -13
- package/lib/themes/cxd.css +101 -13
- package/lib/themes/cxd.css.map +1 -1
- package/lib/themes/dark-ie11.css +94 -13
- package/lib/themes/dark.css +99 -13
- package/lib/themes/dark.css.map +1 -1
- package/lib/themes/default-ie11.css +94 -13
- package/lib/themes/default.css +101 -13
- package/lib/themes/default.css.map +1 -1
- package/lib/utils/helper.d.ts +1 -0
- package/lib/utils/helper.js +11 -1
- package/lib/utils/helper.js.map +2 -2
- package/package.json +1 -1
- package/schema.json +94 -28
- package/scss/_mixins.scss +1 -1
- package/scss/_properties.scss +11 -6
- package/scss/components/_result-box.scss +34 -2
- package/scss/components/form/_select.scss +88 -32
- package/scss/components/form/_selection.scss +9 -6
- package/scss/themes/_cxd-variables.scss +2 -0
- package/scss/themes/cxd.scss +0 -2
- package/sdk/ang-ie11.css +108 -13
- package/sdk/ang.css +113 -13
- package/sdk/antd-ie11.css +108 -13
- package/sdk/antd.css +113 -13
- 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 +108 -13
- package/sdk/cxd.css +115 -13
- package/sdk/dark-ie11.css +108 -13
- package/sdk/dark.css +113 -13
- package/sdk/exceljs.js +1 -1
- package/sdk/helper.css.map +1 -1
- package/sdk/locale/de-DE.js +2 -2
- package/sdk/markdown.js +69 -69
- package/sdk/papaparse.js +1 -1
- package/sdk/renderers/Form/CityDB.js +1 -1
- package/sdk/rest.js +16 -16
- package/sdk/rich-text.js +62 -62
- package/sdk/sdk-ie11.css +108 -13
- package/sdk/sdk.css +115 -13
- package/sdk/sdk.js +1341 -1341
- 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/ResultBox.tsx +98 -12
- package/src/components/ResultTableList.tsx +32 -33
- package/src/components/Select.tsx +149 -17
- package/src/components/TableSelection.tsx +15 -8
- package/src/components/TooltipWrapper.tsx +20 -14
- package/src/components/TransferDropDown.tsx +9 -1
- package/src/locale/de-DE.ts +2 -2
- package/src/locale/en-US.ts +2 -2
- package/src/renderers/CRUD.tsx +2 -2
- package/src/renderers/Form/Group.tsx +1 -1
- package/src/renderers/Form/InputImage.tsx +4 -2
- package/src/renderers/Form/InputTag.tsx +14 -0
- package/src/renderers/Form/Options.tsx +7 -9
- package/src/renderers/Form/Select.tsx +41 -2
- package/src/renderers/Form/Transfer.tsx +6 -0
- package/src/renderers/Form/TreeSelect.tsx +14 -16
- package/src/renderers/Form/index.tsx +13 -2
- package/src/renderers/QRCode.tsx +50 -1
- package/src/renderers/Table/exportExcel.ts +30 -13
- package/src/renderers/Table/index.tsx +42 -6
- package/src/renderers/Tpl.tsx +11 -1
- package/src/store/form.ts +31 -24
- package/src/store/formItem.ts +65 -52
- package/src/utils/helper.ts +11 -1
@@ -1081,11 +1081,11 @@ export default class Table extends React.Component<TableProps, object> {
|
|
1081
1081
|
} = (this.heights = {});
|
1082
1082
|
|
1083
1083
|
heights.header = table
|
1084
|
-
.querySelector('thead
|
1085
|
-
.getBoundingClientRect().height;
|
1086
|
-
heights.header2 = table
|
1087
|
-
.querySelector('thead>tr:first-child')!
|
1084
|
+
.querySelector('thead')!
|
1088
1085
|
.getBoundingClientRect().height;
|
1086
|
+
// heights.header2 = table
|
1087
|
+
// .querySelector('thead>tr:first-child')!
|
1088
|
+
// .getBoundingClientRect().height;
|
1089
1089
|
|
1090
1090
|
forEach(
|
1091
1091
|
table.querySelectorAll('thead>tr:last-child>th'),
|
@@ -1132,7 +1132,7 @@ export default class Table extends React.Component<TableProps, object> {
|
|
1132
1132
|
table.querySelectorAll('thead>tr:first-child>th'),
|
1133
1133
|
(item: HTMLElement) => {
|
1134
1134
|
const width = widths2[item.getAttribute('data-index') as string];
|
1135
|
-
item.style.cssText += `width: ${width}px; height: ${heights.
|
1135
|
+
item.style.cssText += `width: ${width}px; height: ${heights.header}px`;
|
1136
1136
|
totalWidth2 += width;
|
1137
1137
|
}
|
1138
1138
|
);
|
@@ -2797,6 +2797,42 @@ export default class Table extends React.Component<TableProps, object> {
|
|
2797
2797
|
storeType: TableStore.name,
|
2798
2798
|
name: 'table'
|
2799
2799
|
})
|
2800
|
-
export class TableRenderer extends Table {
|
2800
|
+
export class TableRenderer extends Table {
|
2801
|
+
receive(values: any, subPath?: string) {
|
2802
|
+
const scoped = this.context as IScopedContext;
|
2803
|
+
const parents = scoped?.parent?.getComponents();
|
2804
|
+
|
2805
|
+
/**
|
2806
|
+
* 因为Table在scope上注册,导致getComponentByName查询组件时会优先找到Table,和CRUD联动的动作都会失效
|
2807
|
+
* 这里先做兼容处理,把动作交给上层的CRUD处理
|
2808
|
+
*/
|
2809
|
+
if (Array.isArray(parents) && parents.length) {
|
2810
|
+
// CRUD的name会透传给Table,这样可以保证找到CRUD
|
2811
|
+
const crud = parents.find(cmpt => cmpt?.props?.name === this.props?.name);
|
2812
|
+
|
2813
|
+
return crud?.receive?.(values, subPath);
|
2814
|
+
}
|
2815
|
+
|
2816
|
+
if (subPath) {
|
2817
|
+
return scoped.send(subPath, values);
|
2818
|
+
}
|
2819
|
+
}
|
2820
|
+
|
2821
|
+
reload(subPath?: string, query?: any, ctx?: any) {
|
2822
|
+
const scoped = this.context as IScopedContext;
|
2823
|
+
const parents = scoped?.parent?.getComponents();
|
2824
|
+
|
2825
|
+
if (Array.isArray(parents) && parents.length) {
|
2826
|
+
// CRUD的name会透传给Table,这样可以保证找到CRUD
|
2827
|
+
const crud = parents.find(cmpt => cmpt?.props?.name === this.props?.name);
|
2828
|
+
|
2829
|
+
return crud?.reload?.(subPath, query, ctx);
|
2830
|
+
}
|
2831
|
+
|
2832
|
+
if (subPath) {
|
2833
|
+
return scoped.reload(subPath, ctx);
|
2834
|
+
}
|
2835
|
+
}
|
2836
|
+
}
|
2801
2837
|
|
2802
2838
|
export {TableCell};
|
package/src/renderers/Tpl.tsx
CHANGED
@@ -40,6 +40,11 @@ export interface TplSchema extends BaseSchema {
|
|
40
40
|
* 角标
|
41
41
|
*/
|
42
42
|
badge?: BadgeSchema;
|
43
|
+
|
44
|
+
/**
|
45
|
+
* 是否设置外层DOM节点的title属性为文本内容
|
46
|
+
*/
|
47
|
+
showNativeTitle?: boolean;
|
43
48
|
}
|
44
49
|
|
45
50
|
export interface TplProps extends RendererProps, TplSchema {
|
@@ -117,17 +122,22 @@ export class Tpl extends React.Component<TplProps, object> {
|
|
117
122
|
inline,
|
118
123
|
classnames: cx,
|
119
124
|
style,
|
125
|
+
showNativeTitle,
|
120
126
|
data
|
121
127
|
} = this.props;
|
122
128
|
const Component = wrapperComponent || (inline ? 'span' : 'div');
|
129
|
+
const content = this.getContent();
|
123
130
|
|
124
131
|
return (
|
125
132
|
<Component
|
126
133
|
ref={this.htmlRef}
|
127
134
|
className={cx('TplField', className)}
|
128
135
|
style={buildStyle(style, data)}
|
136
|
+
{...(showNativeTitle
|
137
|
+
? {title: typeof content === 'string' ? content : ''}
|
138
|
+
: {})}
|
129
139
|
>
|
130
|
-
<span>{
|
140
|
+
<span>{content}</span>
|
131
141
|
</Component>
|
132
142
|
);
|
133
143
|
}
|
package/src/store/form.ts
CHANGED
@@ -9,6 +9,7 @@ import {
|
|
9
9
|
Instance
|
10
10
|
} from 'mobx-state-tree';
|
11
11
|
import debounce from 'lodash/debounce';
|
12
|
+
import find from 'lodash/find';
|
12
13
|
import {ServiceStore} from './service';
|
13
14
|
import {FormItemStore, IFormItemStore, SFormItemStore} from './formItem';
|
14
15
|
import {Api, ApiObject, fetchOptions, Payload} from '../types';
|
@@ -326,7 +327,6 @@ export const FormStore = ServiceStore.named('FormStore')
|
|
326
327
|
}
|
327
328
|
|
328
329
|
if (!json.ok) {
|
329
|
-
|
330
330
|
if (json.status === 422 && json.errors) {
|
331
331
|
setFormItemErrors(json.errors);
|
332
332
|
|
@@ -359,22 +359,23 @@ export const FormStore = ServiceStore.named('FormStore')
|
|
359
359
|
);
|
360
360
|
if (!ret?.dispatcher?.prevented) {
|
361
361
|
self.msg &&
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
362
|
+
getEnv(self).notify(
|
363
|
+
'success',
|
364
|
+
self.msg,
|
365
|
+
json.msgTimeout !== undefined
|
366
|
+
? {
|
367
|
+
closeButton: true,
|
368
|
+
timeout: json.msgTimeout
|
369
|
+
}
|
370
|
+
: undefined
|
371
|
+
);
|
372
372
|
}
|
373
373
|
return json.data;
|
374
374
|
}
|
375
375
|
} catch (e) {
|
376
376
|
self.markSaving(false);
|
377
|
-
let ret =
|
377
|
+
let ret =
|
378
|
+
options && options.onFailed && options.onFailed(e.response || {});
|
378
379
|
if (ret?.then) {
|
379
380
|
ret = yield ret;
|
380
381
|
}
|
@@ -486,7 +487,7 @@ export const FormStore = ServiceStore.named('FormStore')
|
|
486
487
|
if (dispatcher?.then) {
|
487
488
|
dispatcher = yield dispatcher;
|
488
489
|
}
|
489
|
-
if (!dispatcher?.prevented){
|
490
|
+
if (!dispatcher?.prevented) {
|
490
491
|
msg && env.notify('error', msg);
|
491
492
|
}
|
492
493
|
throw new Error(msg);
|
@@ -548,20 +549,26 @@ export const FormStore = ServiceStore.named('FormStore')
|
|
548
549
|
return self.valid;
|
549
550
|
});
|
550
551
|
|
551
|
-
const validateFields: (
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
552
|
+
const validateFields: (
|
553
|
+
fields: Array<string | {name: string; rules: {[propName: string]: any}}>
|
554
|
+
) => Promise<boolean> = flow(function* validateFields(
|
555
|
+
fields: Array<string | {name: string; rules: {[propName: string]: any}}>
|
556
|
+
) {
|
557
|
+
const items = self.items.concat();
|
558
|
+
const normalizedfields = fields.map(field =>
|
559
|
+
typeof field === 'string' ? {name: field, rules: {}} : field
|
560
|
+
);
|
561
|
+
let result: Array<boolean> = [];
|
562
|
+
for (let i = 0, len = items.length; i < len; i++) {
|
563
|
+
let item = items[i] as IFormItemStore;
|
564
|
+
const field = find(normalizedfields, field => field.name === item.name);
|
557
565
|
|
558
|
-
|
559
|
-
|
560
|
-
}
|
566
|
+
if (field) {
|
567
|
+
result.push(yield item.validate(self.data, undefined, field.rules));
|
561
568
|
}
|
562
|
-
return result.every(item => item);
|
563
569
|
}
|
564
|
-
|
570
|
+
return result.every(item => item);
|
571
|
+
});
|
565
572
|
|
566
573
|
function clearErrors() {
|
567
574
|
const items = self.items.concat();
|
package/src/store/formItem.ts
CHANGED
@@ -326,70 +326,83 @@ export const FormItemStore = StoreNode.named('FormItemStore')
|
|
326
326
|
}
|
327
327
|
|
328
328
|
let validateCancel: Function | null = null;
|
329
|
-
const validate: (
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
329
|
+
const validate: (
|
330
|
+
data: Object,
|
331
|
+
hook?: any,
|
332
|
+
/**
|
333
|
+
* customRules主要是为了支持action.require的验证方式
|
334
|
+
* 这样可以基于不同的action实现不同的校验规则
|
335
|
+
*/
|
336
|
+
customRules?: {[propName: string]: any}
|
337
|
+
) => Promise<boolean> = flow(function* validate(
|
338
|
+
data: Object,
|
339
|
+
hook?: any,
|
340
|
+
customRules?: {[propName: string]: any}
|
341
|
+
) {
|
342
|
+
if (self.validating && !isEffectiveApi(self.validateApi, data)) {
|
343
|
+
return self.valid;
|
344
|
+
}
|
340
345
|
|
341
|
-
|
342
|
-
|
343
|
-
|
346
|
+
self.validating = true;
|
347
|
+
clearError();
|
348
|
+
if (hook) {
|
349
|
+
yield hook();
|
350
|
+
}
|
344
351
|
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
352
|
+
addError(
|
353
|
+
doValidate(
|
354
|
+
self.tmpValue,
|
355
|
+
data,
|
356
|
+
customRules ? str2rules(customRules) : self.rules,
|
357
|
+
self.messages,
|
358
|
+
self.__
|
359
|
+
)
|
360
|
+
);
|
350
361
|
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
createObject(data, {[self.name]: self.tmpValue}),
|
355
|
-
{
|
356
|
-
cancelExecutor: (executor: Function) =>
|
357
|
-
(validateCancel = executor)
|
358
|
-
}
|
359
|
-
);
|
362
|
+
if (!self.errors.length && isEffectiveApi(self.validateApi, data)) {
|
363
|
+
if (validateCancel) {
|
364
|
+
validateCancel();
|
360
365
|
validateCancel = null;
|
366
|
+
}
|
361
367
|
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
)
|
368
|
+
const json: Payload = yield getEnv(self).fetcher(
|
369
|
+
self.validateApi,
|
370
|
+
/** 如果配置validateApi,需要将用户最新输入同步到数据域内 */
|
371
|
+
createObject(data, {[self.name]: self.tmpValue}),
|
372
|
+
{
|
373
|
+
cancelExecutor: (executor: Function) => (validateCancel = executor)
|
368
374
|
}
|
375
|
+
);
|
376
|
+
validateCancel = null;
|
377
|
+
|
378
|
+
if (!json.ok && json.status === 422 && json.errors) {
|
379
|
+
addError(
|
380
|
+
String(json.errors || json.msg || `表单项「${self.name}」校验失败`)
|
381
|
+
);
|
369
382
|
}
|
383
|
+
}
|
370
384
|
|
371
|
-
|
385
|
+
self.validated = true;
|
372
386
|
|
373
|
-
|
374
|
-
|
375
|
-
|
387
|
+
if (self.unique && self.form?.parentStore?.storeType === 'ComboStore') {
|
388
|
+
const combo = self.form.parentStore as IComboStore;
|
389
|
+
const group = combo.uniques.get(self.name) as IUniqueGroup;
|
376
390
|
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
}
|
391
|
+
if (
|
392
|
+
group.items.some(
|
393
|
+
item =>
|
394
|
+
item !== self &&
|
395
|
+
self.tmpValue !== undefined &&
|
396
|
+
item.value === self.tmpValue
|
397
|
+
)
|
398
|
+
) {
|
399
|
+
addError(self.__('Form.unique'));
|
387
400
|
}
|
388
|
-
|
389
|
-
self.validating = false;
|
390
|
-
return self.valid;
|
391
401
|
}
|
392
|
-
|
402
|
+
|
403
|
+
self.validating = false;
|
404
|
+
return self.valid;
|
405
|
+
});
|
393
406
|
|
394
407
|
function setError(msg: string | Array<string>, tag: string = 'builtin') {
|
395
408
|
clearError();
|
package/src/utils/helper.ts
CHANGED
@@ -20,7 +20,7 @@ import {
|
|
20
20
|
keyToPath,
|
21
21
|
isPureVariable,
|
22
22
|
resolveVariable,
|
23
|
-
resolveVariableAndFilter
|
23
|
+
resolveVariableAndFilter
|
24
24
|
} from 'amis-formula';
|
25
25
|
import {isObservable} from 'mobx';
|
26
26
|
|
@@ -937,6 +937,9 @@ export function everyTree<T extends TreeItem>(
|
|
937
937
|
paths: Array<T> = [],
|
938
938
|
indexes: Array<number> = []
|
939
939
|
): boolean {
|
940
|
+
if (!Array.isArray(tree)) {
|
941
|
+
return false;
|
942
|
+
}
|
940
943
|
return tree.every((item, index) => {
|
941
944
|
const value: any = iterator(item, index, level, paths, indexes);
|
942
945
|
|
@@ -1618,3 +1621,10 @@ export function repeatCount(count: number, iterator: (index: number) => any) {
|
|
1618
1621
|
|
1619
1622
|
return result;
|
1620
1623
|
}
|
1624
|
+
|
1625
|
+
export function isNumeric(value: any): boolean {
|
1626
|
+
if (typeof value === 'number') {
|
1627
|
+
return true;
|
1628
|
+
}
|
1629
|
+
return /^[-+]?(?:\d*[.])?\d+$/.test(value);
|
1630
|
+
}
|