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.
Files changed (143) hide show
  1. package/lib/components/Radios.d.ts +10 -10
  2. package/lib/components/ResultBox.d.ts +44 -40
  3. package/lib/components/ResultBox.js +43 -7
  4. package/lib/components/ResultBox.js.map +2 -2
  5. package/lib/components/ResultTableList.js +16 -17
  6. package/lib/components/ResultTableList.js.map +2 -2
  7. package/lib/components/Select.d.ts +498 -294
  8. package/lib/components/Select.js +64 -12
  9. package/lib/components/Select.js.map +2 -2
  10. package/lib/components/TableSelection.d.ts +42 -40
  11. package/lib/components/TableSelection.js +7 -2
  12. package/lib/components/TableSelection.js.map +2 -2
  13. package/lib/components/TooltipWrapper.d.ts +1 -1
  14. package/lib/components/TooltipWrapper.js.map +2 -2
  15. package/lib/components/TransferDropDown.d.ts +43 -40
  16. package/lib/components/TransferDropDown.js +2 -2
  17. package/lib/components/TransferDropDown.js.map +2 -2
  18. package/lib/helper.css.map +1 -1
  19. package/lib/index.js +1 -1
  20. package/lib/locale/de-DE.js +1 -1
  21. package/lib/locale/de-DE.js.map +2 -2
  22. package/lib/locale/en-US.js +1 -1
  23. package/lib/locale/en-US.js.map +2 -2
  24. package/lib/renderers/CRUD.js +2 -2
  25. package/lib/renderers/CRUD.js.map +2 -2
  26. package/lib/renderers/Form/DiffEditor.d.ts +66 -20
  27. package/lib/renderers/Form/Editor.d.ts +66 -20
  28. package/lib/renderers/Form/Group.js +1 -1
  29. package/lib/renderers/Form/Group.js.map +2 -2
  30. package/lib/renderers/Form/InputImage.js.map +2 -2
  31. package/lib/renderers/Form/InputTag.d.ts +8 -0
  32. package/lib/renderers/Form/InputTag.js +2 -2
  33. package/lib/renderers/Form/InputTag.js.map +2 -2
  34. package/lib/renderers/Form/Options.js +7 -7
  35. package/lib/renderers/Form/Options.js.map +2 -2
  36. package/lib/renderers/Form/Select.d.ts +24 -0
  37. package/lib/renderers/Form/Select.js +5 -3
  38. package/lib/renderers/Form/Select.js.map +2 -2
  39. package/lib/renderers/Form/Transfer.d.ts +1 -0
  40. package/lib/renderers/Form/Transfer.js +4 -0
  41. package/lib/renderers/Form/Transfer.js.map +2 -2
  42. package/lib/renderers/Form/TreeSelect.d.ts +0 -1
  43. package/lib/renderers/Form/TreeSelect.js +1 -9
  44. package/lib/renderers/Form/TreeSelect.js.map +2 -2
  45. package/lib/renderers/Form/index.js +9 -4
  46. package/lib/renderers/Form/index.js.map +2 -2
  47. package/lib/renderers/QRCode.d.ts +16 -0
  48. package/lib/renderers/QRCode.js +25 -1
  49. package/lib/renderers/QRCode.js.map +2 -2
  50. package/lib/renderers/Table/exportExcel.js +51 -37
  51. package/lib/renderers/Table/exportExcel.js.map +2 -2
  52. package/lib/renderers/Table/index.d.ts +2 -0
  53. package/lib/renderers/Table/index.js +37 -5
  54. package/lib/renderers/Table/index.js.map +2 -2
  55. package/lib/renderers/Tpl.d.ts +4 -0
  56. package/lib/renderers/Tpl.js +6 -3
  57. package/lib/renderers/Tpl.js.map +2 -2
  58. package/lib/store/combo.d.ts +72 -22
  59. package/lib/store/form.d.ts +30 -9
  60. package/lib/store/form.js +28 -10
  61. package/lib/store/form.js.map +2 -2
  62. package/lib/store/formItem.d.ts +3 -1
  63. package/lib/store/formItem.js +3 -5
  64. package/lib/store/formItem.js.map +2 -2
  65. package/lib/store/table.d.ts +60 -18
  66. package/lib/themes/ang-ie11.css +94 -13
  67. package/lib/themes/ang.css +99 -13
  68. package/lib/themes/ang.css.map +1 -1
  69. package/lib/themes/antd-ie11.css +94 -13
  70. package/lib/themes/antd.css +99 -13
  71. package/lib/themes/antd.css.map +1 -1
  72. package/lib/themes/cxd-ie11.css +94 -13
  73. package/lib/themes/cxd.css +101 -13
  74. package/lib/themes/cxd.css.map +1 -1
  75. package/lib/themes/dark-ie11.css +94 -13
  76. package/lib/themes/dark.css +99 -13
  77. package/lib/themes/dark.css.map +1 -1
  78. package/lib/themes/default-ie11.css +94 -13
  79. package/lib/themes/default.css +101 -13
  80. package/lib/themes/default.css.map +1 -1
  81. package/lib/utils/helper.d.ts +1 -0
  82. package/lib/utils/helper.js +11 -1
  83. package/lib/utils/helper.js.map +2 -2
  84. package/package.json +1 -1
  85. package/schema.json +94 -28
  86. package/scss/_mixins.scss +1 -1
  87. package/scss/_properties.scss +11 -6
  88. package/scss/components/_result-box.scss +34 -2
  89. package/scss/components/form/_select.scss +88 -32
  90. package/scss/components/form/_selection.scss +9 -6
  91. package/scss/themes/_cxd-variables.scss +2 -0
  92. package/scss/themes/cxd.scss +0 -2
  93. package/sdk/ang-ie11.css +108 -13
  94. package/sdk/ang.css +113 -13
  95. package/sdk/antd-ie11.css +108 -13
  96. package/sdk/antd.css +113 -13
  97. package/sdk/barcode.js +51 -51
  98. package/sdk/charts.js +14 -14
  99. package/sdk/codemirror.js +7 -7
  100. package/sdk/color-picker.js +65 -65
  101. package/sdk/cropperjs.js +2 -2
  102. package/sdk/cxd-ie11.css +108 -13
  103. package/sdk/cxd.css +115 -13
  104. package/sdk/dark-ie11.css +108 -13
  105. package/sdk/dark.css +113 -13
  106. package/sdk/exceljs.js +1 -1
  107. package/sdk/helper.css.map +1 -1
  108. package/sdk/locale/de-DE.js +2 -2
  109. package/sdk/markdown.js +69 -69
  110. package/sdk/papaparse.js +1 -1
  111. package/sdk/renderers/Form/CityDB.js +1 -1
  112. package/sdk/rest.js +16 -16
  113. package/sdk/rich-text.js +62 -62
  114. package/sdk/sdk-ie11.css +108 -13
  115. package/sdk/sdk.css +115 -13
  116. package/sdk/sdk.js +1341 -1341
  117. package/sdk/thirds/hls.js/hls.js +1 -1
  118. package/sdk/thirds/mpegts.js/mpegts.js +1 -1
  119. package/sdk/tinymce.js +57 -57
  120. package/src/components/ResultBox.tsx +98 -12
  121. package/src/components/ResultTableList.tsx +32 -33
  122. package/src/components/Select.tsx +149 -17
  123. package/src/components/TableSelection.tsx +15 -8
  124. package/src/components/TooltipWrapper.tsx +20 -14
  125. package/src/components/TransferDropDown.tsx +9 -1
  126. package/src/locale/de-DE.ts +2 -2
  127. package/src/locale/en-US.ts +2 -2
  128. package/src/renderers/CRUD.tsx +2 -2
  129. package/src/renderers/Form/Group.tsx +1 -1
  130. package/src/renderers/Form/InputImage.tsx +4 -2
  131. package/src/renderers/Form/InputTag.tsx +14 -0
  132. package/src/renderers/Form/Options.tsx +7 -9
  133. package/src/renderers/Form/Select.tsx +41 -2
  134. package/src/renderers/Form/Transfer.tsx +6 -0
  135. package/src/renderers/Form/TreeSelect.tsx +14 -16
  136. package/src/renderers/Form/index.tsx +13 -2
  137. package/src/renderers/QRCode.tsx +50 -1
  138. package/src/renderers/Table/exportExcel.ts +30 -13
  139. package/src/renderers/Table/index.tsx +42 -6
  140. package/src/renderers/Tpl.tsx +11 -1
  141. package/src/store/form.ts +31 -24
  142. package/src/store/formItem.ts +65 -52
  143. 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>tr:last-child')!
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.header2}px`;
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};
@@ -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>{this.getContent()}</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
- getEnv(self).notify(
363
- 'success',
364
- self.msg,
365
- json.msgTimeout !== undefined
366
- ? {
367
- closeButton: true,
368
- timeout: json.msgTimeout
369
- }
370
- : undefined
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 = options && options.onFailed && options.onFailed(e.response || {});
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: (fields: Array<string>) => Promise<boolean> = flow(
552
- function* validateFields(fields: Array<string>) {
553
- const items = self.items.concat();
554
- let result: Array<boolean> = [];
555
- for (let i = 0, len = items.length; i < len; i++) {
556
- let item = items[i] as IFormItemStore;
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
- if (~fields.indexOf(item.name)) {
559
- result.push(yield item.validate(self.data));
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();
@@ -326,70 +326,83 @@ export const FormItemStore = StoreNode.named('FormItemStore')
326
326
  }
327
327
 
328
328
  let validateCancel: Function | null = null;
329
- const validate: (data: Object, hook?: any) => Promise<boolean> = flow(
330
- function* validate(data: Object, hook?: any) {
331
- if (self.validating && !isEffectiveApi(self.validateApi, data)) {
332
- return self.valid;
333
- }
334
-
335
- self.validating = true;
336
- clearError();
337
- if (hook) {
338
- yield hook();
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
- addError(
342
- doValidate(self.tmpValue, data, self.rules, self.messages, self.__)
343
- );
346
+ self.validating = true;
347
+ clearError();
348
+ if (hook) {
349
+ yield hook();
350
+ }
344
351
 
345
- if (!self.errors.length && isEffectiveApi(self.validateApi, data)) {
346
- if (validateCancel) {
347
- validateCancel();
348
- validateCancel = null;
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
- const json: Payload = yield getEnv(self).fetcher(
352
- self.validateApi,
353
- /** 如果配置validateApi,需要将用户最新输入同步到数据域内 */
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
- if (!json.ok && json.status === 422 && json.errors) {
363
- addError(
364
- String(
365
- json.errors || json.msg || `表单项「${self.name}」校验失败`
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
- self.validated = true;
385
+ self.validated = true;
372
386
 
373
- if (self.unique && self.form?.parentStore?.storeType === 'ComboStore') {
374
- const combo = self.form.parentStore as IComboStore;
375
- const group = combo.uniques.get(self.name) as IUniqueGroup;
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
- if (
378
- group.items.some(
379
- item =>
380
- item !== self &&
381
- self.tmpValue !== undefined &&
382
- item.value === self.tmpValue
383
- )
384
- ) {
385
- addError(self.__('Form.unique'));
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();
@@ -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
+ }