amis 1.4.2-beta.11 → 1.4.2-beta.16

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 (200) hide show
  1. package/lib/Schema.d.ts +4 -3
  2. package/lib/Schema.js.map +1 -1
  3. package/lib/components/AssociatedSelection.js +2 -2
  4. package/lib/components/AssociatedSelection.js.map +2 -2
  5. package/lib/components/Checkbox.d.ts +20 -20
  6. package/lib/components/Collapse.d.ts +51 -23
  7. package/lib/components/Collapse.js +69 -11
  8. package/lib/components/Collapse.js.map +2 -2
  9. package/lib/components/CollapseGroup.d.ts +88 -0
  10. package/lib/components/CollapseGroup.js +81 -0
  11. package/lib/components/CollapseGroup.js.map +13 -0
  12. package/lib/components/Editor.d.ts +84 -84
  13. package/lib/components/GridNav.d.ts +52 -0
  14. package/lib/components/GridNav.js +123 -0
  15. package/lib/components/GridNav.js.map +13 -0
  16. package/lib/components/InputBox.d.ts +22 -21
  17. package/lib/components/InputBox.js +10 -2
  18. package/lib/components/InputBox.js.map +2 -2
  19. package/lib/components/ListGroup.d.ts +21 -21
  20. package/lib/components/PickerColumn.js +3 -3
  21. package/lib/components/PickerColumn.js.map +2 -2
  22. package/lib/components/ResultBox.d.ts +84 -84
  23. package/lib/components/ResultBox.js +10 -2
  24. package/lib/components/ResultBox.js.map +2 -2
  25. package/lib/components/Select.js +1 -1
  26. package/lib/components/Select.js.map +2 -2
  27. package/lib/components/Selection.js +1 -1
  28. package/lib/components/Selection.js.map +2 -2
  29. package/lib/components/Tabs.d.ts +20 -20
  30. package/lib/components/TabsTransfer.d.ts +84 -84
  31. package/lib/components/Toast.d.ts +86 -85
  32. package/lib/components/Toast.js +6 -3
  33. package/lib/components/Toast.js.map +2 -2
  34. package/lib/components/Transfer.d.ts +84 -84
  35. package/lib/components/TransferDropDown.d.ts +85 -84
  36. package/lib/components/TransferDropDown.js +2 -2
  37. package/lib/components/TransferDropDown.js.map +2 -2
  38. package/lib/components/TransferPicker.d.ts +4 -0
  39. package/lib/components/TransferPicker.js +2 -2
  40. package/lib/components/TransferPicker.js.map +2 -2
  41. package/lib/components/Tree.d.ts +115 -84
  42. package/lib/components/Tree.js +183 -30
  43. package/lib/components/Tree.js.map +2 -2
  44. package/lib/components/icons.js +2 -0
  45. package/lib/components/icons.js.map +2 -2
  46. package/lib/envOverwrite.d.ts +1 -1
  47. package/lib/envOverwrite.js +24 -9
  48. package/lib/envOverwrite.js.map +2 -2
  49. package/lib/factory.d.ts +11 -1
  50. package/lib/factory.js +31 -4
  51. package/lib/factory.js.map +2 -2
  52. package/lib/icons/download.js +7 -0
  53. package/lib/icons/drag-bar.js +10 -3
  54. package/lib/index.d.ts +2 -0
  55. package/lib/index.js +3 -1
  56. package/lib/index.js.map +2 -2
  57. package/lib/locale/en-US.js +1 -0
  58. package/lib/locale/en-US.js.map +2 -2
  59. package/lib/locale/zh-CN.js +1 -0
  60. package/lib/locale/zh-CN.js.map +2 -2
  61. package/lib/renderers/Collapse.d.ts +25 -20
  62. package/lib/renderers/Collapse.js +10 -73
  63. package/lib/renderers/Collapse.js.map +2 -2
  64. package/lib/renderers/CollapseGroup.d.ts +42 -0
  65. package/lib/renderers/CollapseGroup.js +33 -0
  66. package/lib/renderers/CollapseGroup.js.map +13 -0
  67. package/lib/renderers/Form/InputCity.d.ts +84 -84
  68. package/lib/renderers/Form/InputFile.d.ts +6 -0
  69. package/lib/renderers/Form/InputFile.js +18 -4
  70. package/lib/renderers/Form/InputFile.js.map +2 -2
  71. package/lib/renderers/Form/Item.js +2 -1
  72. package/lib/renderers/Form/Item.js.map +2 -2
  73. package/lib/renderers/Form/Select.d.ts +1 -0
  74. package/lib/renderers/Form/Select.js +16 -2
  75. package/lib/renderers/Form/Select.js.map +2 -2
  76. package/lib/renderers/Form/Transfer.js +15 -1
  77. package/lib/renderers/Form/Transfer.js.map +2 -2
  78. package/lib/renderers/Form/TransferPicker.d.ts +4 -0
  79. package/lib/renderers/Form/TransferPicker.js +17 -3
  80. package/lib/renderers/Form/TransferPicker.js.map +2 -2
  81. package/lib/renderers/Form/index.d.ts +5 -0
  82. package/lib/renderers/Form/index.js +4 -2
  83. package/lib/renderers/Form/index.js.map +2 -2
  84. package/lib/renderers/GridNav.d.ts +99 -0
  85. package/lib/renderers/GridNav.js +82 -0
  86. package/lib/renderers/GridNav.js.map +13 -0
  87. package/lib/renderers/Table/index.js +1 -1
  88. package/lib/renderers/Table/index.js.map +2 -2
  89. package/lib/store/formItem.js +44 -4
  90. package/lib/store/formItem.js.map +2 -2
  91. package/lib/store/table.d.ts +1 -0
  92. package/lib/store/table.js +35 -12
  93. package/lib/store/table.js.map +2 -2
  94. package/lib/themes/ang-ie11.css +272 -31
  95. package/lib/themes/ang.css +272 -31
  96. package/lib/themes/ang.css.map +1 -1
  97. package/lib/themes/antd-ie11.css +272 -31
  98. package/lib/themes/antd.css +272 -31
  99. package/lib/themes/antd.css.map +1 -1
  100. package/lib/themes/cxd-ie11.css +279 -38
  101. package/lib/themes/cxd.css +279 -38
  102. package/lib/themes/cxd.css.map +1 -1
  103. package/lib/themes/dark-ie11.css +272 -31
  104. package/lib/themes/dark.css +272 -31
  105. package/lib/themes/dark.css.map +1 -1
  106. package/lib/themes/default.css +279 -38
  107. package/lib/themes/default.css.map +1 -1
  108. package/lib/types.d.ts +1 -1
  109. package/lib/types.js.map +1 -1
  110. package/lib/utils/api.d.ts +1 -0
  111. package/lib/utils/api.js +77 -6
  112. package/lib/utils/api.js.map +2 -2
  113. package/lib/utils/helper.d.ts +6 -0
  114. package/lib/utils/helper.js +18 -1
  115. package/lib/utils/helper.js.map +2 -2
  116. package/package.json +1 -1
  117. package/schema.json +297 -55
  118. package/scss/base/_common.scss +3 -0
  119. package/scss/components/_anchor-nav.scss +1 -0
  120. package/scss/components/_collapse-group.scss +11 -0
  121. package/scss/components/_collapse.scss +33 -22
  122. package/scss/components/_grid-nav.scss +128 -0
  123. package/scss/components/_input-box.scss +1 -0
  124. package/scss/components/_nav.scss +1 -1
  125. package/scss/components/_picker-columns.scss +1 -0
  126. package/scss/components/_popover.scss +0 -4
  127. package/scss/components/_result-box.scss +1 -0
  128. package/scss/components/_spinner.scss +5 -4
  129. package/scss/components/_table.scss +6 -0
  130. package/scss/components/form/_combo.scss +4 -0
  131. package/scss/components/form/_file.scss +11 -0
  132. package/scss/components/form/_form.scss +48 -0
  133. package/scss/components/form/_tree.scss +42 -0
  134. package/scss/themes/_common.scss +3 -0
  135. package/scss/themes/_cxd-variables.scss +6 -7
  136. package/scss/themes/cxd.scss +1 -0
  137. package/sdk/ang-ie11.css +317 -32
  138. package/sdk/ang.css +312 -31
  139. package/sdk/antd-ie11.css +317 -32
  140. package/sdk/antd.css +312 -31
  141. package/sdk/charts.js +13 -13
  142. package/sdk/color-picker.js +65 -65
  143. package/sdk/cropperjs.js +2 -2
  144. package/sdk/cxd-ie11.css +323 -36
  145. package/sdk/cxd.css +319 -38
  146. package/sdk/dark-ie11.css +317 -32
  147. package/sdk/dark.css +312 -31
  148. package/sdk/exceljs.js +1 -1
  149. package/sdk/iconfont.svg +2513 -0
  150. package/sdk/iconfont.ttf +0 -0
  151. package/sdk/iconfont.woff +0 -0
  152. package/sdk/markdown.js +69 -69
  153. package/sdk/papaparse.js +1 -1
  154. package/sdk/renderers/Form/CityDB.js +1 -1
  155. package/sdk/rest.js +18 -18
  156. package/sdk/rich-text.js +62 -62
  157. package/sdk/sdk-ie11.css +323 -36
  158. package/sdk/sdk.css +319 -38
  159. package/sdk/sdk.js +1247 -1211
  160. package/sdk/thirds/hls.js/hls.js +1 -1
  161. package/sdk/thirds/mpegts.js/mpegts.js +1 -1
  162. package/sdk/tinymce.js +57 -57
  163. package/src/Schema.ts +5 -1
  164. package/src/components/AssociatedSelection.tsx +3 -1
  165. package/src/components/Collapse.tsx +144 -20
  166. package/src/components/CollapseGroup.tsx +130 -0
  167. package/src/components/GridNav.tsx +233 -0
  168. package/src/components/InputBox.tsx +10 -9
  169. package/src/components/PickerColumn.tsx +1 -1
  170. package/src/components/ResultBox.tsx +9 -9
  171. package/src/components/Select.tsx +1 -1
  172. package/src/components/Selection.tsx +1 -1
  173. package/src/components/Toast.tsx +23 -16
  174. package/src/components/TransferDropDown.tsx +4 -1
  175. package/src/components/TransferPicker.tsx +7 -0
  176. package/src/components/Tree.tsx +194 -8
  177. package/src/components/icons.tsx +2 -0
  178. package/src/envOverwrite.ts +20 -7
  179. package/src/factory.tsx +52 -6
  180. package/src/icons/download.svg +4 -0
  181. package/src/icons/drag-bar.svg +12 -6
  182. package/src/index.tsx +2 -0
  183. package/src/locale/en-US.ts +1 -0
  184. package/src/locale/zh-CN.ts +1 -0
  185. package/src/renderers/Collapse.tsx +70 -117
  186. package/src/renderers/CollapseGroup.tsx +80 -0
  187. package/src/renderers/Form/InputFile.tsx +36 -4
  188. package/src/renderers/Form/Item.tsx +2 -1
  189. package/src/renderers/Form/Select.tsx +22 -4
  190. package/src/renderers/Form/Transfer.tsx +16 -2
  191. package/src/renderers/Form/TransferPicker.tsx +25 -3
  192. package/src/renderers/Form/index.tsx +14 -1
  193. package/src/renderers/GridNav.tsx +204 -0
  194. package/src/renderers/Table/index.tsx +1 -2
  195. package/src/store/formItem.ts +94 -2
  196. package/src/store/table.ts +55 -14
  197. package/src/types.ts +1 -1
  198. package/src/utils/api.ts +93 -6
  199. package/src/utils/helper.ts +19 -0
  200. package/tsconfig-for-declaration.json +1 -1
@@ -202,6 +202,11 @@ export interface FormSchema extends BaseSchema {
202
202
  */
203
203
  mode?: 'normal' | 'inline' | 'horizontal';
204
204
 
205
+ /**
206
+ * 表单项显示为几列
207
+ */
208
+ columnCount?: number;
209
+
205
210
  /**
206
211
  * 如果是水平排版,这个属性可以细化水平排版的左右宽度占比。
207
212
  */
@@ -347,6 +352,7 @@ export default class Form extends React.Component<FormProps, object> {
347
352
  right: 10,
348
353
  offset: 2
349
354
  },
355
+ columnCount: 0,
350
356
  panelClassName: 'Panel--default',
351
357
  messages: {
352
358
  fetchFailed: 'fetchFailed',
@@ -367,6 +373,7 @@ export default class Form extends React.Component<FormProps, object> {
367
373
  'initFetch',
368
374
  'wrapWithPanel',
369
375
  'mode',
376
+ 'columnCount',
370
377
  'collapsable',
371
378
  'horizontal',
372
379
  'panelClassName',
@@ -1418,6 +1425,7 @@ export default class Form extends React.Component<FormProps, object> {
1418
1425
  debug,
1419
1426
  $path,
1420
1427
  store,
1428
+ columnCount,
1421
1429
  render
1422
1430
  } = this.props;
1423
1431
 
@@ -1429,7 +1437,12 @@ export default class Form extends React.Component<FormProps, object> {
1429
1437
 
1430
1438
  return (
1431
1439
  <WrapperComponent
1432
- className={cx(`Form`, `Form--${mode || 'normal'}`, className)}
1440
+ className={cx(
1441
+ `Form`,
1442
+ `Form--${mode || 'normal'}`,
1443
+ columnCount ? `Form--column Form--column-${columnCount}` : null,
1444
+ className
1445
+ )}
1433
1446
  onSubmit={this.handleFormSubmit}
1434
1447
  noValidate
1435
1448
  >
@@ -0,0 +1,204 @@
1
+ import React from 'react';
2
+ import {Renderer, RendererProps} from '../factory';
3
+ import {autobind, getPropValue} from '../utils/helper';
4
+ import {isPureVariable, resolveVariableAndFilter} from '../utils/tpl-builtin';
5
+ import {
6
+ BaseSchema,
7
+ SchemaTokenizeableString,
8
+ SchemaTpl,
9
+ SchemaUrlPath
10
+ } from '../Schema';
11
+ import {ActionSchema} from './Action';
12
+ import GridNav, {GridNavDirection, GridNavItem} from '../components/GridNav';
13
+ import {BadgeSchema} from '../components/Badge';
14
+ import handleAction from '../utils/handleAction';
15
+ import {validations} from '../utils/validations';
16
+
17
+ export interface ListItemSchema extends Omit<BaseSchema, 'type'> {
18
+ /**
19
+ * 单项点击事件
20
+ */
21
+ clickAction?: ActionSchema;
22
+
23
+ /**
24
+ * 跳转地址
25
+ */
26
+ link?: string;
27
+
28
+ /**
29
+ * 打开方式
30
+ */
31
+ blank?: string;
32
+
33
+ /**
34
+ * 图片地址
35
+ */
36
+ icon?: SchemaUrlPath;
37
+
38
+ /**
39
+ * 描述
40
+ */
41
+ text?: SchemaTpl;
42
+
43
+ /**
44
+ * 图标最大宽度比例 0-100
45
+ */
46
+ iconRatio?: number;
47
+
48
+ /**
49
+ * 角标
50
+ */
51
+ badge?: BadgeSchema;
52
+ }
53
+
54
+ /**
55
+ * List 列表展示控件。
56
+ * 文档:https://baidu.gitee.io/amis/docs/components/card
57
+ */
58
+ export interface ListSchema extends BaseSchema {
59
+ /**
60
+ * 指定为 List 列表展示控件。
61
+ */
62
+ type: 'grid-nav';
63
+
64
+ /**
65
+ * 列表项类名
66
+ */
67
+ itemClassName?: string;
68
+
69
+ /**
70
+ * 静态图片列表配置
71
+ */
72
+ options?: Array<ListItemSchema>;
73
+
74
+ /**
75
+ * 是否将列表项固定为正方形
76
+ */
77
+ square?: boolean;
78
+
79
+ /**
80
+ * 是否将列表项内容居中显示
81
+ */
82
+ center?: boolean;
83
+
84
+ /**
85
+ * 是否显示列表项边框
86
+ */
87
+ border?: boolean;
88
+
89
+ /**
90
+ * 列表项之间的间距,默认单位为px
91
+ */
92
+ gutter?: number;
93
+
94
+ /**
95
+ * 图标宽度占比, 1-100
96
+ */
97
+ iconRatio?: number;
98
+
99
+ /**
100
+ * 列表项内容排列的方向,可选值为 horizontal 、vertical
101
+ */
102
+ direction?: GridNavDirection;
103
+
104
+ /**
105
+ * 列数
106
+ */
107
+ columnNum?: number;
108
+
109
+ /**
110
+ * 数据源: 绑定当前环境变量
111
+ *
112
+ * @default ${items}
113
+ */
114
+ source?: SchemaTokenizeableString;
115
+ }
116
+
117
+ export interface Column {
118
+ type: string;
119
+ [propName: string]: any;
120
+ }
121
+
122
+ export interface ListProps
123
+ extends RendererProps,
124
+ Omit<ListSchema, 'type' | 'className'> {
125
+ handleClick: (item?: ListItemSchema) => void;
126
+ }
127
+
128
+ @Renderer({
129
+ type: 'grid-nav'
130
+ })
131
+ export default class List extends React.Component<ListProps, object> {
132
+ @autobind
133
+ handleClick(item: ListItemSchema) {
134
+ return (e: React.MouseEvent) => {
135
+ let action;
136
+ if (item.link) {
137
+ action = validations.isUrl({}, item.link)
138
+ ? {
139
+ type: 'button',
140
+ actionType: 'url',
141
+ url: item.link,
142
+ blank: item.blank
143
+ }
144
+ : {
145
+ type: 'button',
146
+ actionType: 'link',
147
+ link: item.link
148
+ };
149
+ } else {
150
+ action = item.clickAction!;
151
+ }
152
+ handleAction(e, action as ActionSchema, this.props);
153
+ };
154
+ }
155
+
156
+ render() {
157
+ const {itemClassName, source, data, options, classnames} = this.props;
158
+
159
+ let value = getPropValue(this.props);
160
+ let list: any = [];
161
+
162
+ if (typeof source === 'string' && isPureVariable(source)) {
163
+ list = resolveVariableAndFilter(source, data, '| raw') || undefined;
164
+ } else if (Array.isArray(value)) {
165
+ list = value;
166
+ } else if (Array.isArray(options)) {
167
+ list = options;
168
+ }
169
+
170
+ if (list && !Array.isArray(list)) {
171
+ list = [list];
172
+ }
173
+
174
+ if (!list?.length) {
175
+ return null;
176
+ }
177
+
178
+ return (
179
+ <GridNav {...this.props}>
180
+ {list.map((item: ListItemSchema, index: number) => (
181
+ <GridNavItem
182
+ key={index}
183
+ onClick={
184
+ item.clickAction || item.link ? this.handleClick(item) : undefined
185
+ }
186
+ className={itemClassName}
187
+ text={item.text}
188
+ icon={item.icon}
189
+ classnames={classnames}
190
+ badge={
191
+ item.badge
192
+ ? {
193
+ badge: item.badge,
194
+ data: data,
195
+ classnames
196
+ }
197
+ : undefined
198
+ }
199
+ />
200
+ ))}
201
+ </GridNav>
202
+ );
203
+ }
204
+ }
@@ -1441,7 +1441,7 @@ export default class Table extends React.Component<TableProps, object> {
1441
1441
  handleColumnToggle(columns: Array<IColumn>) {
1442
1442
  const {store} = this.props;
1443
1443
 
1444
- store.update({columns});
1444
+ store.updateColumns(columns);
1445
1445
  }
1446
1446
 
1447
1447
  renderAutoFilterForm(): React.ReactNode {
@@ -2155,7 +2155,6 @@ export default class Table extends React.Component<TableProps, object> {
2155
2155
  } = this.props;
2156
2156
  const __ = rest.translate;
2157
2157
  const env = rest.env;
2158
-
2159
2158
  const render = this.props.render;
2160
2159
 
2161
2160
  if (!store.columnsTogglable) {
@@ -617,12 +617,104 @@ export const FormItemStore = StoreNode.named('FormItemStore')
617
617
  return json;
618
618
  });
619
619
 
620
+ const tryDeferLoadLeftOptions: (
621
+ option: any,
622
+ api: Api,
623
+ data?: object,
624
+ config?: fetchOptions
625
+ ) => Promise<Payload | null> = flow(function* (
626
+ option: any,
627
+ api: string,
628
+ data: object,
629
+ config?: fetchOptions
630
+ ) {
631
+ if (
632
+ self.options.length != 1 ||
633
+ !Array.isArray(self.options[0].leftOptions)
634
+ ) {
635
+ return;
636
+ }
637
+
638
+ let leftOptions = self.options[0].leftOptions as any;
639
+
640
+ const indexes = findTreeIndex(leftOptions, item => item === option);
641
+ if (!indexes) {
642
+ return;
643
+ }
644
+
645
+ setOptions(
646
+ [
647
+ {
648
+ ...self.options[0],
649
+ leftOptions: spliceTree(leftOptions, indexes, 1, {
650
+ ...option,
651
+ loading: true
652
+ })
653
+ }
654
+ ],
655
+ undefined,
656
+ data
657
+ );
658
+
659
+ let json = yield fetchOptions(
660
+ api,
661
+ data,
662
+ {
663
+ ...config,
664
+ silent: true
665
+ },
666
+ false
667
+ );
668
+ if (!json) {
669
+ setOptions(
670
+ [
671
+ {
672
+ ...self.options[0],
673
+ leftOptions: spliceTree(leftOptions, indexes, 1, {
674
+ ...option,
675
+ loading: false,
676
+ error: true
677
+ })
678
+ }
679
+ ],
680
+ undefined,
681
+ data
682
+ );
683
+ return;
684
+ }
685
+
686
+ let options: Array<IOption> =
687
+ json.data?.options ||
688
+ json.data.items ||
689
+ json.data.rows ||
690
+ json.data ||
691
+ [];
692
+
693
+ setOptions(
694
+ [
695
+ {
696
+ ...self.options[0],
697
+ leftOptions: spliceTree(leftOptions, indexes, 1, {
698
+ ...option,
699
+ loading: false,
700
+ loaded: true,
701
+ children: options
702
+ })
703
+ }
704
+ ],
705
+ undefined,
706
+ data
707
+ );
708
+
709
+ return json;
710
+ });
711
+
620
712
  const deferLoadOptions: (
621
713
  option: any,
622
714
  api: Api,
623
715
  data?: object,
624
716
  config?: fetchOptions
625
- ) => Promise<Payload | null> = flow(function* getInitData(
717
+ ) => Promise<Payload | null> = flow(function* (
626
718
  option: any,
627
719
  api: string,
628
720
  data: object,
@@ -630,7 +722,7 @@ export const FormItemStore = StoreNode.named('FormItemStore')
630
722
  ) {
631
723
  const indexes = findTreeIndex(self.options, item => item === option);
632
724
  if (!indexes) {
633
- return;
725
+ return yield tryDeferLoadLeftOptions(option, api, data, config);
634
726
  }
635
727
 
636
728
  setOptions(
@@ -429,7 +429,7 @@ export const TableStore = iRendererStore
429
429
  }
430
430
 
431
431
  function getUnSelectedRows() {
432
- return self.rows.filter(item => !item.checked);
432
+ return flattenTree<IRow>(self.rows).filter((item: IRow) => !item.checked);
433
433
  }
434
434
 
435
435
  function getData(superData: any): any {
@@ -523,15 +523,6 @@ export const TableStore = iRendererStore
523
523
  );
524
524
  }
525
525
 
526
- function getActivedSearchableColumns() {
527
- return self.columns.filter(
528
- column =>
529
- column.searchable &&
530
- isObject(column.searchable) &&
531
- column.enableSearch
532
- );
533
- }
534
-
535
526
  return {
536
527
  get columnsData() {
537
528
  return getColumnsExceptBuiltinTypes();
@@ -613,7 +604,9 @@ export const TableStore = iRendererStore
613
604
  },
614
605
 
615
606
  get checkableRows() {
616
- return self.rows.filter(item => item.checkable);
607
+ return flattenTree<IRow>(self.rows).filter(
608
+ (item: IRow) => item.checkable
609
+ );
617
610
  },
618
611
 
619
612
  get expandableRows() {
@@ -765,6 +758,51 @@ export const TableStore = iRendererStore
765
758
  }
766
759
  }
767
760
 
761
+ function updateColumns(columns: Array<SColumn>) {
762
+ if (columns && Array.isArray(columns)) {
763
+ columns = columns.filter(column => column).concat();
764
+
765
+ if (!columns.length) {
766
+ columns.push({
767
+ type: 'text',
768
+ label: '空'
769
+ });
770
+ }
771
+
772
+ columns.unshift({
773
+ type: '__expandme',
774
+ toggable: false,
775
+ className: 'Table-expandCell'
776
+ });
777
+
778
+ columns.unshift({
779
+ type: '__checkme',
780
+ fixed: 'left',
781
+ toggable: false,
782
+ className: 'Table-checkCell'
783
+ });
784
+
785
+ columns.unshift({
786
+ type: '__dragme',
787
+ toggable: false,
788
+ className: 'Table-dragCell'
789
+ });
790
+
791
+ columns = columns.map((item, index) => ({
792
+ ...item,
793
+ index,
794
+ rawIndex: index - 3,
795
+ type: item.type || 'plain',
796
+ pristine: item.pristine || item,
797
+ toggled: item.toggled !== false,
798
+ breakpoint: item.breakpoint,
799
+ isPrimary: index === 3
800
+ }));
801
+
802
+ self.columns.replace(columns as any);
803
+ }
804
+ }
805
+
768
806
  function combineCell(arr: Array<SRow>, keys: Array<string>): Array<SRow> {
769
807
  if (!keys.length || !arr.length) {
770
808
  return arr;
@@ -987,9 +1025,10 @@ export const TableStore = iRendererStore
987
1025
 
988
1026
  function updateSelected(selected: Array<any>, valueField?: string) {
989
1027
  self.selectedRows.clear();
990
- self.rows.forEach(item => {
1028
+
1029
+ eachTree(self.rows, item => {
991
1030
  if (~selected.indexOf(item.pristine)) {
992
- self.selectedRows.push(item);
1031
+ self.selectedRows.push(item.id);
993
1032
  } else if (
994
1033
  find(
995
1034
  selected,
@@ -998,9 +1037,10 @@ export const TableStore = iRendererStore
998
1037
  a[valueField || 'value'] == item.pristine[valueField || 'value']
999
1038
  )
1000
1039
  ) {
1001
- self.selectedRows.push(item);
1040
+ self.selectedRows.push(item.id);
1002
1041
  }
1003
1042
  });
1043
+
1004
1044
  updateCheckDisable();
1005
1045
  }
1006
1046
 
@@ -1228,6 +1268,7 @@ export const TableStore = iRendererStore
1228
1268
 
1229
1269
  return {
1230
1270
  update,
1271
+ updateColumns,
1231
1272
  initRows,
1232
1273
  updateSelected,
1233
1274
  toggleAll,
package/src/types.ts CHANGED
@@ -31,7 +31,7 @@ export interface fetcherResult {
31
31
  }
32
32
 
33
33
  export interface fetchOptions {
34
- method?: 'get' | 'post' | 'put' | 'patch' | 'delete';
34
+ method?: 'get' | 'post' | 'put' | 'patch' | 'delete' | 'jsonp';
35
35
  successMessage?: string;
36
36
  errorMessage?: string;
37
37
  autoAppend?: boolean;
package/src/utils/api.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import omit from 'lodash/omit';
2
2
  import {Api, ApiObject, EventTrack, fetcherResult, Payload} from '../types';
3
3
  import {fetcherConfig} from '../factory';
4
- import {tokenize, dataMapping} from './tpl-builtin';
4
+ import {tokenize, dataMapping, escapeHtml} from './tpl-builtin';
5
5
  import {evalExpression} from './tpl';
6
6
  import {
7
7
  isObject,
@@ -11,11 +11,12 @@ import {
11
11
  qsstringify,
12
12
  cloneObject,
13
13
  createObject,
14
- qsparse
14
+ qsparse,
15
+ uuid
15
16
  } from './helper';
16
17
  import isPlainObject from 'lodash/isPlainObject';
17
18
 
18
- const rSchema = /(?:^|raw\:)(get|post|put|delete|patch|options|head):/i;
19
+ const rSchema = /(?:^|raw\:)(get|post|put|delete|patch|options|head|jsonp):/i;
19
20
 
20
21
  interface ApiCacheConfig extends ApiObject {
21
22
  cachedPromise: Promise<any>;
@@ -125,7 +126,7 @@ export function buildApi(
125
126
  }
126
127
 
127
128
  // get 类请求,把 data 附带到 url 上。
128
- if (api.method === 'get') {
129
+ if (api.method === 'get' || api.method === 'jsonp') {
129
130
  if (!~raw.indexOf('$') && !api.data && autoAppend) {
130
131
  api.query = api.data = data;
131
132
  } else if (
@@ -195,13 +196,28 @@ export function str2AsyncFunction(
195
196
  }
196
197
 
197
198
  export function responseAdaptor(ret: fetcherResult, api: ApiObject) {
198
- const data = ret.data;
199
+ let data = ret.data;
199
200
  let hasStatusField = true;
200
201
 
201
202
  if (!data) {
202
203
  throw new Error('Response is empty');
203
204
  }
204
205
 
206
+ if (typeof data === 'string') {
207
+ try {
208
+ data = JSON.parse(data);
209
+ if (typeof data === 'undefined') {
210
+ throw new Error('Response should be JSON');
211
+ }
212
+ } catch (e) {
213
+ const responseBrief =
214
+ typeof data === 'string'
215
+ ? escapeHtml((data as string).substring(0, 100))
216
+ : '';
217
+ throw new Error(`Response should be JSON\n ${responseBrief}`);
218
+ }
219
+ }
220
+
205
221
  // 兼容几种常见写法
206
222
  if (data.hasOwnProperty('errorCode')) {
207
223
  // 阿里 Java 规范
@@ -247,7 +263,7 @@ export function responseAdaptor(ret: fetcherResult, api: ApiObject) {
247
263
  }
248
264
 
249
265
  if (payload.ok && api.responseData) {
250
- payload.data = dataMapping(
266
+ const responseData = dataMapping(
251
267
  api.responseData,
252
268
 
253
269
  createObject(
@@ -261,6 +277,8 @@ export function responseAdaptor(ret: fetcherResult, api: ApiObject) {
261
277
  undefined,
262
278
  api.convertKeyToPath
263
279
  );
280
+ console.debug('responseData', responseData);
281
+ payload.data = responseData;
264
282
  }
265
283
 
266
284
  return payload;
@@ -303,6 +321,10 @@ export function wrapFetcher(
303
321
  api.data
304
322
  );
305
323
 
324
+ if (api.method?.toLocaleLowerCase() === 'jsonp') {
325
+ return wrapAdaptor(jsonpFetcher(api), api);
326
+ }
327
+
306
328
  if (typeof api.cache === 'number' && api.cache > 0) {
307
329
  const apiCache = getApiCache(api);
308
330
  return wrapAdaptor(
@@ -345,6 +367,71 @@ export function wrapAdaptor(promise: Promise<fetcherResult>, api: ApiObject) {
345
367
  : promise.then(ret => responseAdaptor(ret, api));
346
368
  }
347
369
 
370
+ export function jsonpFetcher(api: ApiObject): Promise<fetcherResult> {
371
+ return new Promise((resolve, reject) => {
372
+ let script: HTMLScriptElement | null = document.createElement('script');
373
+ let src = api.url;
374
+
375
+ script.async = true;
376
+
377
+ function remove() {
378
+ if (script) {
379
+ // @ts-ignore
380
+ script.onload = script.onreadystatechange = script.onerror = null;
381
+
382
+ if (script.parentNode) {
383
+ script.parentNode.removeChild(script);
384
+ }
385
+
386
+ script = null;
387
+ }
388
+ }
389
+
390
+ const jsonp = api.query?.callback || 'axiosJsonpCallback' + uuid();
391
+ const old = (window as any)[jsonp];
392
+
393
+ (window as any)[jsonp] = function (responseData: any) {
394
+ (window as any)[jsonp] = old;
395
+
396
+ const response = {
397
+ data: responseData,
398
+ status: 200,
399
+ headers: {}
400
+ };
401
+
402
+ resolve(response);
403
+ };
404
+
405
+ const additionalParams: any = {
406
+ _: new Date().getTime(),
407
+ _callback: jsonp
408
+ };
409
+
410
+ src += (src.indexOf('?') >= 0 ? '&' : '?') + qsstringify(additionalParams);
411
+
412
+ // @ts-ignore IE 为script.onreadystatechange
413
+ script.onload = script.onreadystatechange = function () {
414
+ // @ts-ignore
415
+ if (!script.readyState || /loaded|complete/.test(script.readyState)) {
416
+ remove();
417
+ }
418
+ };
419
+
420
+ script.onerror = function () {
421
+ remove();
422
+ const errResponse = {
423
+ status: 0,
424
+ headers: {}
425
+ };
426
+
427
+ reject(errResponse);
428
+ };
429
+
430
+ script.src = src;
431
+ document.head.appendChild(script);
432
+ });
433
+ }
434
+
348
435
  export function isApiOutdated(
349
436
  prevApi: Api | undefined,
350
437
  nextApi: Api | undefined,
@@ -1706,3 +1706,22 @@ export function isClickOnInput(e: React.MouseEvent<HTMLElement>) {
1706
1706
  }
1707
1707
  return false;
1708
1708
  }
1709
+
1710
+ /**
1711
+ * 遍历 schema
1712
+ * @param json
1713
+ * @param mapper
1714
+ */
1715
+ export function JSONTraverse(
1716
+ json: any,
1717
+ mapper: (value: any, key: string | number, host: Object) => any
1718
+ ) {
1719
+ Object.keys(json).forEach(key => {
1720
+ const value: any = json[key];
1721
+ if (isPlainObject(value) || Array.isArray(value)) {
1722
+ JSONTraverse(value, mapper);
1723
+ } else {
1724
+ mapper(value, key, json);
1725
+ }
1726
+ });
1727
+ }
@@ -3,7 +3,7 @@
3
3
  "outDir": "output/",
4
4
  "module": "commonjs",
5
5
  "target": "es5",
6
- "lib": ["es6", "dom", "ES2015"],
6
+ "lib": ["ES6", "DOM", "ES2015", "ES2021"],
7
7
  "sourceMap": true,
8
8
  "jsx": "react",
9
9
  "moduleResolution": "node",