amis 1.3.4 → 1.4.0

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 (270) hide show
  1. package/README.md +2 -1
  2. package/lib/RootRenderer.js +4 -1
  3. package/lib/RootRenderer.js.map +2 -2
  4. package/lib/components/Badge.d.ts +13 -1
  5. package/lib/components/Badge.js +16 -2
  6. package/lib/components/Badge.js.map +2 -2
  7. package/lib/components/Checkbox.d.ts +1 -1
  8. package/lib/components/Checkbox.js +1 -1
  9. package/lib/components/Checkbox.js.map +2 -2
  10. package/lib/components/Drawer.js +1 -1
  11. package/lib/components/Drawer.js.map +2 -2
  12. package/lib/components/Modal.js +1 -1
  13. package/lib/components/Modal.js.map +2 -2
  14. package/lib/components/RichText.d.ts +0 -3
  15. package/lib/components/RichText.js +1 -22
  16. package/lib/components/RichText.js.map +2 -2
  17. package/lib/components/Select.d.ts +7 -0
  18. package/lib/components/Select.js.map +2 -2
  19. package/lib/components/Steps.d.ts +3 -3
  20. package/lib/components/Steps.js.map +1 -1
  21. package/lib/components/WithRemoteConfig.d.ts +8 -0
  22. package/lib/components/WithRemoteConfig.js +28 -2
  23. package/lib/components/WithRemoteConfig.js.map +2 -2
  24. package/lib/components/condition-builder/Field.js +0 -1
  25. package/lib/components/condition-builder/Field.js.map +2 -2
  26. package/lib/components/condition-builder/Value.js +2 -1
  27. package/lib/components/condition-builder/Value.js.map +2 -2
  28. package/lib/components/condition-builder/types.d.ts +5 -0
  29. package/lib/components/condition-builder/types.js.map +1 -1
  30. package/lib/env.d.ts +1 -1
  31. package/lib/env.js.map +1 -1
  32. package/lib/factory.d.ts +6 -2
  33. package/lib/factory.js +9 -4
  34. package/lib/factory.js.map +2 -2
  35. package/lib/index.d.ts +1 -0
  36. package/lib/index.js +2 -1
  37. package/lib/index.js.map +2 -2
  38. package/lib/locale/de-DE.js +1 -0
  39. package/lib/locale/de-DE.js.map +2 -2
  40. package/lib/locale/en-US.js +2 -1
  41. package/lib/locale/en-US.js.map +2 -2
  42. package/lib/locale/zh-CN.js +2 -1
  43. package/lib/locale/zh-CN.js.map +2 -2
  44. package/lib/renderers/Action.d.ts +6 -0
  45. package/lib/renderers/Action.js +9 -1
  46. package/lib/renderers/Action.js.map +2 -2
  47. package/lib/renderers/CRUD.d.ts +2 -2
  48. package/lib/renderers/CRUD.js +13 -21
  49. package/lib/renderers/CRUD.js.map +2 -2
  50. package/lib/renderers/Card.js +11 -11
  51. package/lib/renderers/Card.js.map +2 -2
  52. package/lib/renderers/Collapse.d.ts +1 -1
  53. package/lib/renderers/Collapse.js +5 -1
  54. package/lib/renderers/Collapse.js.map +2 -2
  55. package/lib/renderers/Copyable.js +30 -28
  56. package/lib/renderers/Copyable.js.map +2 -2
  57. package/lib/renderers/Dialog.d.ts +0 -252
  58. package/lib/renderers/Dialog.js +3 -2
  59. package/lib/renderers/Dialog.js.map +2 -2
  60. package/lib/renderers/Drawer.js +2 -1
  61. package/lib/renderers/Drawer.js.map +2 -2
  62. package/lib/renderers/DropDownButton.d.ts +4 -0
  63. package/lib/renderers/DropDownButton.js +2 -2
  64. package/lib/renderers/DropDownButton.js.map +2 -2
  65. package/lib/renderers/Form/ButtonGroupSelect.js +3 -0
  66. package/lib/renderers/Form/ButtonGroupSelect.js.map +2 -2
  67. package/lib/renderers/Form/Combo.d.ts +2 -0
  68. package/lib/renderers/Form/Combo.js +16 -1
  69. package/lib/renderers/Form/Combo.js.map +2 -2
  70. package/lib/renderers/Form/DiffEditor.d.ts +0 -2
  71. package/lib/renderers/Form/Editor.d.ts +0 -2
  72. package/lib/renderers/Form/Editor.js +1 -1
  73. package/lib/renderers/Form/Editor.js.map +2 -2
  74. package/lib/renderers/Form/InputExcel.d.ts +5 -0
  75. package/lib/renderers/Form/InputExcel.js +24 -3
  76. package/lib/renderers/Form/InputExcel.js.map +2 -2
  77. package/lib/renderers/Form/InputImage.d.ts +8 -0
  78. package/lib/renderers/Form/InputImage.js +2 -1
  79. package/lib/renderers/Form/InputImage.js.map +2 -2
  80. package/lib/renderers/Form/InputNumber.d.ts +19 -5
  81. package/lib/renderers/Form/InputNumber.js +69 -7
  82. package/lib/renderers/Form/InputNumber.js.map +2 -2
  83. package/lib/renderers/Form/InputRange.js +7 -2
  84. package/lib/renderers/Form/InputRange.js.map +2 -2
  85. package/lib/renderers/Form/InputTable.d.ts +23 -5
  86. package/lib/renderers/Form/InputTable.js +32 -3
  87. package/lib/renderers/Form/InputTable.js.map +2 -2
  88. package/lib/renderers/Form/NestedSelect.js +2 -3
  89. package/lib/renderers/Form/NestedSelect.js.map +2 -2
  90. package/lib/renderers/Form/Options.js +3 -1
  91. package/lib/renderers/Form/Options.js.map +2 -2
  92. package/lib/renderers/Form/index.js +0 -10
  93. package/lib/renderers/Form/index.js.map +2 -2
  94. package/lib/renderers/Form/wrapControl.js +3 -3
  95. package/lib/renderers/Form/wrapControl.js.map +2 -2
  96. package/lib/renderers/Json.js +5 -1
  97. package/lib/renderers/Json.js.map +2 -2
  98. package/lib/renderers/List.d.ts +5 -0
  99. package/lib/renderers/List.js +20 -14
  100. package/lib/renderers/List.js.map +2 -2
  101. package/lib/renderers/Page.d.ts +6 -0
  102. package/lib/renderers/Page.js +10 -2
  103. package/lib/renderers/Page.js.map +2 -2
  104. package/lib/renderers/Service.d.ts +10 -1
  105. package/lib/renderers/Service.js +85 -3
  106. package/lib/renderers/Service.js.map +2 -2
  107. package/lib/renderers/Steps.d.ts +4 -4
  108. package/lib/renderers/Steps.js +5 -2
  109. package/lib/renderers/Steps.js.map +2 -2
  110. package/lib/renderers/Table/TableBody.d.ts +5 -3
  111. package/lib/renderers/Table/TableBody.js +17 -11
  112. package/lib/renderers/Table/TableBody.js.map +2 -2
  113. package/lib/renderers/Table/TableCell.js +6 -2
  114. package/lib/renderers/Table/TableCell.js.map +2 -2
  115. package/lib/renderers/Table/TableContent.d.ts +3 -1
  116. package/lib/renderers/Table/TableContent.js +6 -2
  117. package/lib/renderers/Table/TableContent.js.map +2 -2
  118. package/lib/renderers/Table/TableRow.d.ts +1 -1
  119. package/lib/renderers/Table/TableRow.js +14 -13
  120. package/lib/renderers/Table/TableRow.js.map +2 -2
  121. package/lib/renderers/Table/index.d.ts +28 -3
  122. package/lib/renderers/Table/index.js +97 -54
  123. package/lib/renderers/Table/index.js.map +2 -2
  124. package/lib/schemaExtend.d.ts +1 -0
  125. package/lib/schemaExtend.js +59 -0
  126. package/lib/schemaExtend.js.map +13 -0
  127. package/lib/store/app.d.ts +0 -1
  128. package/lib/store/combo.d.ts +0 -2
  129. package/lib/store/crud.d.ts +3 -3
  130. package/lib/store/crud.js +41 -36
  131. package/lib/store/crud.js.map +2 -2
  132. package/lib/store/form.d.ts +0 -1
  133. package/lib/store/formItem.js +10 -6
  134. package/lib/store/formItem.js.map +2 -2
  135. package/lib/store/modal.d.ts +1 -1
  136. package/lib/store/modal.js +4 -0
  137. package/lib/store/modal.js.map +2 -2
  138. package/lib/store/root.d.ts +0 -1
  139. package/lib/store/service.d.ts +0 -1
  140. package/lib/store/service.js +0 -13
  141. package/lib/store/service.js.map +2 -2
  142. package/lib/store/table.d.ts +1 -2
  143. package/lib/store/table.js +44 -3
  144. package/lib/store/table.js.map +2 -2
  145. package/lib/themes/ang-ie11.css +278 -17
  146. package/lib/themes/ang.css +278 -17
  147. package/lib/themes/ang.css.map +1 -1
  148. package/lib/themes/antd-ie11.css +278 -17
  149. package/lib/themes/antd.css +278 -17
  150. package/lib/themes/antd.css.map +1 -1
  151. package/lib/themes/cxd-ie11.css +278 -17
  152. package/lib/themes/cxd.css +278 -17
  153. package/lib/themes/cxd.css.map +1 -1
  154. package/lib/themes/dark-ie11.css +278 -17
  155. package/lib/themes/dark.css +278 -17
  156. package/lib/themes/dark.css.map +1 -1
  157. package/lib/themes/default.css +278 -17
  158. package/lib/themes/default.css.map +1 -1
  159. package/lib/utils/api.js +12 -0
  160. package/lib/utils/api.js.map +2 -2
  161. package/lib/utils/attachmentAdpator.d.ts +7 -0
  162. package/lib/utils/attachmentAdpator.js +82 -0
  163. package/lib/utils/attachmentAdpator.js.map +13 -0
  164. package/lib/utils/helper.d.ts +2 -0
  165. package/lib/utils/helper.js +14 -1
  166. package/lib/utils/helper.js.map +2 -2
  167. package/lib/utils/resize-sensor.js +6 -0
  168. package/lib/utils/resize-sensor.js.map +2 -2
  169. package/lib/utils/tpl-builtin.d.ts +1 -0
  170. package/lib/utils/tpl-builtin.js +24 -8
  171. package/lib/utils/tpl-builtin.js.map +2 -2
  172. package/lib/utils/validations.js +62 -5
  173. package/lib/utils/validations.js.map +2 -2
  174. package/package.json +1 -1
  175. package/schema.json +369 -164
  176. package/scss/_properties.scss +6 -0
  177. package/scss/components/_badge.scss +15 -1
  178. package/scss/components/_list.scss +8 -0
  179. package/scss/components/_markdown.scss +266 -0
  180. package/scss/components/_spinner.scss +6 -2
  181. package/scss/components/_table.scss +4 -0
  182. package/scss/components/form/_form.scss +3 -17
  183. package/scss/components/form/_group.scss +4 -0
  184. package/scss/components/form/_nested-select.scss +4 -0
  185. package/scss/components/form/_number.scss +12 -1
  186. package/scss/themes/_common.scss +1 -0
  187. package/sdk/ang-ie11.css +324 -20
  188. package/sdk/ang.css +330 -20
  189. package/sdk/antd-ie11.css +324 -20
  190. package/sdk/antd.css +330 -20
  191. package/sdk/charts.js +15 -15
  192. package/sdk/color-picker.js +65 -69
  193. package/sdk/cropperjs.js +2 -2
  194. package/sdk/cxd-ie11.css +324 -20
  195. package/sdk/cxd.css +330 -20
  196. package/sdk/dark-ie11.css +324 -20
  197. package/sdk/dark.css +330 -20
  198. package/sdk/exceljs.js +1 -1
  199. package/sdk/locale/de-DE.js +1 -0
  200. package/sdk/markdown.js +69 -69
  201. package/sdk/papaparse.js +1 -1
  202. package/sdk/renderers/Form/CityDB.js +1 -1
  203. package/sdk/rest.js +27 -23
  204. package/sdk/rich-text.js +63 -63
  205. package/sdk/sdk-ie11.css +324 -20
  206. package/sdk/sdk.css +330 -20
  207. package/sdk/sdk.js +1146 -1138
  208. package/sdk/thirds/hls.js/hls.js +1 -1
  209. package/sdk/thirds/mpegts.js/mpegts.js +1 -1
  210. package/sdk/tinymce.js +57 -57
  211. package/src/RootRenderer.tsx +8 -3
  212. package/src/components/Badge.tsx +41 -6
  213. package/src/components/Checkbox.tsx +5 -2
  214. package/src/components/Drawer.tsx +3 -2
  215. package/src/components/Modal.tsx +3 -2
  216. package/src/components/RichText.tsx +2 -27
  217. package/src/components/Select.tsx +1 -0
  218. package/src/components/Steps.tsx +3 -3
  219. package/src/components/WithRemoteConfig.tsx +37 -2
  220. package/src/components/condition-builder/Field.tsx +1 -2
  221. package/src/components/condition-builder/Value.tsx +3 -0
  222. package/src/components/condition-builder/types.ts +6 -0
  223. package/src/env.tsx +1 -1
  224. package/src/factory.tsx +14 -4
  225. package/src/index.tsx +2 -0
  226. package/src/locale/de-DE.ts +1 -0
  227. package/src/locale/en-US.ts +2 -1
  228. package/src/locale/zh-CN.ts +2 -1
  229. package/src/renderers/Action.tsx +19 -1
  230. package/src/renderers/CRUD.tsx +15 -34
  231. package/src/renderers/Card.tsx +21 -15
  232. package/src/renderers/Collapse.tsx +5 -1
  233. package/src/renderers/Copyable.tsx +46 -44
  234. package/src/renderers/Dialog.tsx +3 -2
  235. package/src/renderers/Drawer.tsx +2 -1
  236. package/src/renderers/DropDownButton.tsx +8 -0
  237. package/src/renderers/Form/ButtonGroupSelect.tsx +3 -0
  238. package/src/renderers/Form/Combo.tsx +7 -0
  239. package/src/renderers/Form/Editor.tsx +19 -20
  240. package/src/renderers/Form/InputExcel.tsx +28 -3
  241. package/src/renderers/Form/InputImage.tsx +23 -8
  242. package/src/renderers/Form/InputNumber.tsx +113 -18
  243. package/src/renderers/Form/InputRange.tsx +5 -2
  244. package/src/renderers/Form/InputTable.tsx +88 -9
  245. package/src/renderers/Form/NestedSelect.tsx +1 -1
  246. package/src/renderers/Form/Options.tsx +3 -1
  247. package/src/renderers/Form/index.tsx +0 -15
  248. package/src/renderers/Form/wrapControl.tsx +2 -2
  249. package/src/renderers/Json.tsx +10 -1
  250. package/src/renderers/List.tsx +32 -19
  251. package/src/renderers/Page.tsx +19 -0
  252. package/src/renderers/Service.tsx +101 -3
  253. package/src/renderers/Steps.tsx +12 -9
  254. package/src/renderers/Table/TableBody.tsx +29 -10
  255. package/src/renderers/Table/TableCell.tsx +15 -1
  256. package/src/renderers/Table/TableContent.tsx +7 -1
  257. package/src/renderers/Table/TableRow.tsx +18 -17
  258. package/src/renderers/Table/index.tsx +117 -28
  259. package/src/schemaExtend.ts +66 -0
  260. package/src/store/crud.ts +34 -38
  261. package/src/store/formItem.ts +10 -6
  262. package/src/store/modal.ts +4 -0
  263. package/src/store/service.ts +0 -19
  264. package/src/store/table.ts +48 -0
  265. package/src/utils/api.ts +11 -0
  266. package/src/utils/attachmentAdpator.ts +90 -0
  267. package/src/utils/helper.ts +15 -0
  268. package/src/utils/resize-sensor.ts +7 -0
  269. package/src/utils/tpl-builtin.ts +36 -17
  270. package/src/utils/validations.ts +80 -12
@@ -7,7 +7,12 @@ import {filter, evalExpression} from '../utils/tpl';
7
7
  import cx from 'classnames';
8
8
  import Scoped, {ScopedContext, IScopedContext} from '../Scoped';
9
9
  import {observer} from 'mobx-react';
10
- import {isApiOutdated, isEffectiveApi} from '../utils/api';
10
+ import {
11
+ buildApi,
12
+ isApiOutdated,
13
+ isEffectiveApi,
14
+ str2AsyncFunction
15
+ } from '../utils/api';
11
16
  import {Spinner} from '../components';
12
17
  import {autobind, isEmpty, isVisible, qsstringify} from '../utils/helper';
13
18
  import {
@@ -40,6 +45,11 @@ export interface ServiceSchema extends BaseSchema {
40
45
  */
41
46
  ws?: string;
42
47
 
48
+ /**
49
+ * 通过调用外部函数来获取数据
50
+ */
51
+ dataProvider?: string | Function;
52
+
43
53
  /**
44
54
  * 内容区域
45
55
  */
@@ -111,6 +121,8 @@ export default class Service extends React.Component<ServiceProps> {
111
121
  // 主要是用于关闭 socket
112
122
  socket: any;
113
123
 
124
+ dataProviderUnsubscribe?: Function;
125
+
114
126
  static defaultProps: Partial<ServiceProps> = {
115
127
  messages: {
116
128
  fetchFailed: 'fetchFailed'
@@ -130,6 +142,8 @@ export default class Service extends React.Component<ServiceProps> {
130
142
  this.initInterval = this.initInterval.bind(this);
131
143
  this.afterDataFetch = this.afterDataFetch.bind(this);
132
144
  this.afterSchemaFetch = this.afterSchemaFetch.bind(this);
145
+ this.runDataProvider = this.runDataProvider.bind(this);
146
+ this.dataProviderSetData = this.dataProviderSetData.bind(this);
133
147
  }
134
148
 
135
149
  componentDidMount() {
@@ -168,12 +182,21 @@ export default class Service extends React.Component<ServiceProps> {
168
182
  if (this.socket) {
169
183
  this.socket.close();
170
184
  }
171
- this.socket = store.fetchWSData(props.ws, this.afterDataFetch);
185
+ this.socket = this.fetchWSData(props.ws, store.data);
186
+ }
187
+
188
+ if (props.defaultData !== prevProps.defaultData) {
189
+ store.reInitData(props.defaultData);
190
+ }
191
+
192
+ if (props.dataProvider !== prevProps.dataProvider) {
193
+ this.runDataProvider();
172
194
  }
173
195
  }
174
196
 
175
197
  componentWillUnmount() {
176
198
  this.mounted = false;
199
+ this.runDataProviderUnsubscribe();
177
200
  clearTimeout(this.timer);
178
201
  if (this.socket && this.socket.close) {
179
202
  this.socket.close();
@@ -189,6 +212,7 @@ export default class Service extends React.Component<ServiceProps> {
189
212
  ws,
190
213
  initFetch,
191
214
  initFetchOn,
215
+ dataProvider,
192
216
  store,
193
217
  messages: {fetchSuccess, fetchFailed}
194
218
  } = this.props;
@@ -212,8 +236,82 @@ export default class Service extends React.Component<ServiceProps> {
212
236
  }
213
237
 
214
238
  if (ws) {
215
- this.socket = store.fetchWSData(ws, this.afterDataFetch);
239
+ this.socket = this.fetchWSData(ws, store.data);
216
240
  }
241
+
242
+ if (dataProvider) {
243
+ this.runDataProvider();
244
+ }
245
+ }
246
+
247
+ // 使用外部函数获取数据
248
+ async runDataProvider() {
249
+ this.runDataProviderUnsubscribe();
250
+ const {dataProvider, store} = this.props;
251
+ let dataProviderFunc = dataProvider;
252
+
253
+ if (typeof dataProvider === 'string' && dataProvider) {
254
+ dataProviderFunc = str2AsyncFunction(dataProvider, 'data', 'setData')!;
255
+ }
256
+ if (typeof dataProviderFunc === 'function') {
257
+ const unsubscribe = await dataProviderFunc(
258
+ store.data,
259
+ this.dataProviderSetData
260
+ );
261
+ if (typeof unsubscribe === 'function') {
262
+ this.dataProviderUnsubscribe = unsubscribe;
263
+ }
264
+ }
265
+ }
266
+
267
+ // 运行销毁外部函数的方法
268
+ runDataProviderUnsubscribe() {
269
+ if (typeof this.dataProviderUnsubscribe === 'function') {
270
+ try {
271
+ this.dataProviderUnsubscribe();
272
+ } catch (error) {
273
+ console.error(error);
274
+ }
275
+ }
276
+ }
277
+
278
+ // 外部函数回调更新数据
279
+ dataProviderSetData(data: any) {
280
+ if (!this.mounted) {
281
+ return;
282
+ }
283
+ const {store} = this.props;
284
+ store.updateData(data, undefined, false);
285
+ store.setHasRemoteData();
286
+ }
287
+
288
+ // 使用 websocket 获取使用,因为有异步所以放这里而不是 store 实现
289
+ fetchWSData(ws: string | Api, data: any) {
290
+ const {env, store} = this.props;
291
+ const wsApi = buildApi(ws, data);
292
+
293
+ env.wsFetcher(
294
+ wsApi,
295
+ (data: any) => {
296
+ let returndata = data;
297
+ if ('status' in data && 'data' in data) {
298
+ returndata = data.data;
299
+ if (data.status !== 0) {
300
+ store.updateMessage(data.msg, true);
301
+ env.notify('error', data.msg);
302
+ return;
303
+ }
304
+ }
305
+ store.updateData(returndata, undefined, false);
306
+ store.setHasRemoteData();
307
+ // 因为 WebSocket 只会获取纯数据,所以没有 msg 之类的
308
+ this.afterDataFetch({ok: true, data: returndata});
309
+ },
310
+ (error: any) => {
311
+ store.updateMessage(error, true);
312
+ env.notify('error', error);
313
+ }
314
+ );
217
315
  }
218
316
 
219
317
  afterDataFetch(result: any) {
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import {Renderer, RendererProps} from '../factory';
3
- import {BaseSchema} from '../Schema';
3
+ import {BaseSchema, SchemaCollection} from '../Schema';
4
4
  import Steps, {StepStatus} from '../components/Steps';
5
5
  import {
6
6
  RemoteOptionsProps,
@@ -14,12 +14,12 @@ export type StepSchema = {
14
14
  /**
15
15
  * 标题
16
16
  */
17
- title: string;
17
+ title: string | SchemaCollection;
18
18
 
19
19
  /**
20
20
  * 子标题
21
21
  */
22
- subTitle?: string;
22
+ subTitle?: string | SchemaCollection;
23
23
 
24
24
  /**
25
25
  * 图标
@@ -31,7 +31,7 @@ export type StepSchema = {
31
31
  /**
32
32
  * 描述
33
33
  */
34
- description?: string;
34
+ description?: string | SchemaCollection;
35
35
  } & Omit<BaseSchema, 'type'>;
36
36
 
37
37
  export interface StepsSchema extends BaseSchema {
@@ -82,7 +82,8 @@ export function StepsCmpt(props: StepsProps) {
82
82
  mode,
83
83
  data,
84
84
  source,
85
- config
85
+ config,
86
+ render
86
87
  } = props;
87
88
 
88
89
  const stepsRow =
@@ -90,7 +91,9 @@ export function StepsCmpt(props: StepsProps) {
90
91
  config ||
91
92
  steps ||
92
93
  [];
93
-
94
+ const resolveRender = (val?: string | SchemaCollection) => typeof val === 'string'
95
+ ? filter(val, data)
96
+ : val && render('inner', val);
94
97
  const value = getPropValue(props) ?? 0;
95
98
  const resolveValue =
96
99
  typeof value === 'string' && isNaN(+value)
@@ -105,9 +108,9 @@ export function StepsCmpt(props: StepsProps) {
105
108
  return {
106
109
  ...step,
107
110
  status: stepStatus,
108
- title: filter(step.title, data),
109
- subTitle: filter(step.subTitle || step.value, data),
110
- description: filter(step.description, data)
111
+ title: resolveRender(step.title),
112
+ subTitle: resolveRender(step.subTitle),
113
+ description: resolveRender(step.description)
111
114
  }
112
115
  });
113
116
 
@@ -8,6 +8,7 @@ import {observer} from 'mobx-react';
8
8
  import {trace, reaction} from 'mobx';
9
9
  import {createObject, flattenTree} from '../../utils/helper';
10
10
  import {LocaleProps} from '../../locale';
11
+ import {ActionSchema} from '../Action';
11
12
 
12
13
  export interface TableBodyProps extends LocaleProps {
13
14
  className?: string;
@@ -23,7 +24,7 @@ export interface TableBodyProps extends LocaleProps {
23
24
  item: IRow,
24
25
  props: any
25
26
  ) => React.ReactNode;
26
- onCheck: (item: IRow) => void;
27
+ onCheck: (item: IRow, value: boolean, shift?: boolean) => void;
27
28
  onQuickChange?: (
28
29
  item: IRow,
29
30
  values: object,
@@ -41,8 +42,10 @@ export interface TableBodyProps extends LocaleProps {
41
42
  data?: any;
42
43
  prefixRow?: Array<any>;
43
44
  affixRow?: Array<any>;
45
+ itemAction?: ActionSchema;
44
46
  }
45
47
 
48
+ @observer
46
49
  export class TableBody extends React.Component<TableBodyProps> {
47
50
  renderRows(
48
51
  rows: Array<any>,
@@ -62,7 +65,8 @@ export class TableBody extends React.Component<TableBodyProps> {
62
65
  onQuickChange,
63
66
  footable,
64
67
  ignoreFootableContent,
65
- footableColumns
68
+ footableColumns,
69
+ itemAction
66
70
  } = this.props;
67
71
 
68
72
  return rows.map((item: IRow, rowIndex: number) => {
@@ -71,6 +75,7 @@ export class TableBody extends React.Component<TableBodyProps> {
71
75
  const doms = [
72
76
  <TableRow
73
77
  {...itemProps}
78
+ itemAction={itemAction}
74
79
  classnames={cx}
75
80
  checkOnItemClick={checkOnItemClick}
76
81
  key={item.id}
@@ -100,6 +105,7 @@ export class TableBody extends React.Component<TableBodyProps> {
100
105
  doms.push(
101
106
  <TableRow
102
107
  {...itemProps}
108
+ itemAction={itemAction}
103
109
  classnames={cx}
104
110
  checkOnItemClick={checkOnItemClick}
105
111
  key={`foot-${item.id}`}
@@ -123,7 +129,7 @@ export class TableBody extends React.Component<TableBodyProps> {
123
129
  />
124
130
  );
125
131
  }
126
- } else if (item.children.length) {
132
+ } else if (item.children.length && item.expanded) {
127
133
  // 嵌套表格
128
134
  doms.push(
129
135
  ...this.renderRows(item.children, columns, {
@@ -136,7 +142,11 @@ export class TableBody extends React.Component<TableBodyProps> {
136
142
  });
137
143
  }
138
144
 
139
- renderSummaryRow(items?: Array<any>) {
145
+ renderSummaryRow(
146
+ position: 'prefix' | 'affix',
147
+ items?: Array<any>,
148
+ rowIndex?: number
149
+ ) {
140
150
  const {columns, render, data, classnames: cx, rows} = this.props;
141
151
 
142
152
  if (!(Array.isArray(items) && items.length)) {
@@ -177,7 +187,10 @@ export class TableBody extends React.Component<TableBodyProps> {
177
187
  });
178
188
 
179
189
  return (
180
- <tr className={cx('Table-tr', 'is-summary')}>
190
+ <tr
191
+ className={cx('Table-tr', 'is-summary')}
192
+ key={`summary-${position}-${rowIndex || 0}`}
193
+ >
181
194
  {result.map((item, index) => {
182
195
  const Com = item.isHead ? 'th' : 'td';
183
196
  return (
@@ -196,11 +209,17 @@ export class TableBody extends React.Component<TableBodyProps> {
196
209
  );
197
210
  }
198
211
 
199
- renderSummary(items?: Array<any>) {
212
+ renderSummary(position: 'prefix' | 'affix', items?: Array<any>) {
200
213
  return Array.isArray(items)
201
214
  ? items.some(i => Array.isArray(i))
202
- ? items.map(i => this.renderSummaryRow(Array.isArray(i) ? i : [i]))
203
- : this.renderSummaryRow(items)
215
+ ? items.map((i, rowIndex) =>
216
+ this.renderSummaryRow(
217
+ position,
218
+ Array.isArray(i) ? i : [i],
219
+ rowIndex
220
+ )
221
+ )
222
+ : this.renderSummaryRow(position, items)
204
223
  : null;
205
224
  }
206
225
 
@@ -221,9 +240,9 @@ export class TableBody extends React.Component<TableBodyProps> {
221
240
  <tbody className={className}>
222
241
  {rows.length ? (
223
242
  <>
224
- {this.renderSummary(prefixRow)}
243
+ {this.renderSummary('prefix', prefixRow)}
225
244
  {this.renderRows(rows, columns, rowsProps)}
226
- {this.renderSummary(affixRow)}
245
+ {this.renderSummary('affix', affixRow)}
227
246
  </>
228
247
  ) : null}
229
248
  </tbody>
@@ -5,6 +5,7 @@ import Copyable from '../Copyable';
5
5
  import PopOverable from '../PopOver';
6
6
  import {observer} from 'mobx-react';
7
7
  import omit = require('lodash/omit');
8
+ import {filter} from '../../utils/tpl';
8
9
 
9
10
  export interface TableCellProps extends RendererProps {
10
11
  wrapperComponent?: React.ReactType;
@@ -27,7 +28,9 @@ export class TableCell extends React.Component<RendererProps> {
27
28
 
28
29
  render() {
29
30
  let {
31
+ classnames: cx,
30
32
  className,
33
+ classNameExpr,
31
34
  render,
32
35
  style,
33
36
  wrapperComponent: Component,
@@ -36,6 +39,7 @@ export class TableCell extends React.Component<RendererProps> {
36
39
  data,
37
40
  children,
38
41
  width,
42
+ align,
39
43
  innerClassName,
40
44
  label,
41
45
  tabIndex,
@@ -90,6 +94,13 @@ export class TableCell extends React.Component<RendererProps> {
90
94
  }
91
95
  }
92
96
 
97
+ if (align) {
98
+ style = {
99
+ ...style,
100
+ textAlign: align
101
+ };
102
+ }
103
+
93
104
  if (!Component) {
94
105
  return body as JSX.Element;
95
106
  }
@@ -102,7 +113,10 @@ export class TableCell extends React.Component<RendererProps> {
102
113
  <Component
103
114
  rowSpan={rowSpan > 1 ? rowSpan : undefined}
104
115
  style={style}
105
- className={className}
116
+ className={cx(
117
+ className,
118
+ column.classNameExpr ? filter(column.classNameExpr, data) : null
119
+ )}
106
120
  tabIndex={tabIndex}
107
121
  onKeyUp={onKeyUp}
108
122
  >
@@ -4,6 +4,8 @@ import {IColumn, IRow} from '../../store/table';
4
4
  import {SchemaNode, Action} from '../../types';
5
5
  import {TableBody} from './TableBody';
6
6
  import {LocaleProps} from '../../locale';
7
+ import {observer} from 'mobx-react';
8
+ import {ActionSchema} from '../Action';
7
9
 
8
10
  export interface TableContentProps extends LocaleProps {
9
11
  className?: string;
@@ -30,7 +32,7 @@ export interface TableContentProps extends LocaleProps {
30
32
  item: IRow,
31
33
  props: any
32
34
  ) => React.ReactNode;
33
- onCheck: (item: IRow) => void;
35
+ onCheck: (item: IRow, value: boolean, shift?: boolean) => void;
34
36
  onQuickChange?: (
35
37
  item: IRow,
36
38
  values: object,
@@ -47,8 +49,10 @@ export interface TableContentProps extends LocaleProps {
47
49
  data?: any;
48
50
  prefixRow?: Array<any>;
49
51
  affixRow?: Array<any>;
52
+ itemAction?: ActionSchema;
50
53
  }
51
54
 
55
+ @observer
52
56
  export class TableContent extends React.Component<TableContentProps> {
53
57
  render() {
54
58
  const {
@@ -77,6 +81,7 @@ export class TableContent extends React.Component<TableContentProps> {
77
81
  prefixRow,
78
82
  locale,
79
83
  translate,
84
+ itemAction,
80
85
  affixRow
81
86
  } = this.props;
82
87
 
@@ -130,6 +135,7 @@ export class TableContent extends React.Component<TableContentProps> {
130
135
  </tbody>
131
136
  ) : (
132
137
  <TableBody
138
+ itemAction={itemAction}
133
139
  classnames={cx}
134
140
  render={render}
135
141
  renderCell={renderCell}
@@ -4,6 +4,7 @@ import {IRow, IColumn} from '../../store/table';
4
4
  import {RendererProps} from '../../factory';
5
5
  import {Action} from '../Action';
6
6
  import {reaction} from 'mobx';
7
+ import {isClickOnInput} from '../../utils/helper';
7
8
 
8
9
  interface TableRowProps extends Pick<RendererProps, 'render'> {
9
10
  onCheck: (item: IRow) => void;
@@ -33,23 +34,18 @@ export class TableRow extends React.Component<TableRowProps> {
33
34
  this.handleAction = this.handleAction.bind(this);
34
35
  this.handleQuickChange = this.handleQuickChange.bind(this);
35
36
  this.handleChange = this.handleChange.bind(this);
36
- this.handleClick = this.handleClick.bind(this);
37
+ this.handleItemClick = this.handleItemClick.bind(this);
37
38
  }
38
39
 
39
- handleClick(e: React.MouseEvent<HTMLTableRowElement>) {
40
- const target: HTMLElement = e.target as HTMLElement;
41
- const ns = this.props.classPrefix;
42
- let formItem;
43
-
44
- if (
45
- !e.currentTarget.contains(target) ||
46
- ~['INPUT', 'TEXTAREA'].indexOf(target.tagName) ||
47
- ((formItem = target.closest(`button, a, [data-role="form-item"]`)) &&
48
- e.currentTarget.contains(formItem))
49
- ) {
40
+ // 定义点击一行的行为,通过 itemAction配置
41
+ handleItemClick(e: React.MouseEvent<HTMLTableRowElement>) {
42
+ if (isClickOnInput(e)) {
50
43
  return;
51
44
  }
52
-
45
+ const {itemAction, onAction, item} = this.props;
46
+ if (itemAction) {
47
+ onAction && onAction(e, itemAction, item?.data);
48
+ }
53
49
  this.props.onCheck(this.props.item);
54
50
  }
55
51
 
@@ -108,11 +104,10 @@ export class TableRow extends React.Component<TableRowProps> {
108
104
  render,
109
105
  classnames: cx,
110
106
  parent,
107
+ itemAction,
111
108
  ...rest
112
109
  } = this.props;
113
110
 
114
- // console.log('TableRow');
115
-
116
111
  if (footableMode) {
117
112
  if (!item.expanded) {
118
113
  return null;
@@ -122,12 +117,15 @@ export class TableRow extends React.Component<TableRowProps> {
122
117
  <tr
123
118
  data-id={item.id}
124
119
  data-index={item.newIndex}
125
- onClick={checkOnItemClick ? this.handleClick : undefined}
120
+ onClick={
121
+ checkOnItemClick || itemAction ? this.handleItemClick : undefined
122
+ }
126
123
  className={cx(itemClassName, {
127
124
  'is-hovered': item.isHover,
128
125
  'is-checked': item.checked,
129
126
  'is-modified': item.modified,
130
127
  'is-moved': item.moved,
128
+ [`Table-tr--hasItemAction`]: itemAction, // 就是为了加鼠标效果
131
129
  [`Table-tr--odd`]: itemIndex % 2 === 0,
132
130
  [`Table-tr--even`]: itemIndex % 2 === 1
133
131
  })}
@@ -183,7 +181,9 @@ export class TableRow extends React.Component<TableRowProps> {
183
181
 
184
182
  return (
185
183
  <tr
186
- onClick={checkOnItemClick ? this.handleClick : undefined}
184
+ onClick={
185
+ checkOnItemClick || itemAction ? this.handleItemClick : undefined
186
+ }
187
187
  data-index={item.depth === 1 ? item.newIndex : undefined}
188
188
  data-id={item.id}
189
189
  className={cx(
@@ -195,6 +195,7 @@ export class TableRow extends React.Component<TableRowProps> {
195
195
  'is-moved': item.moved,
196
196
  'is-expanded': item.expanded,
197
197
  'is-expandable': item.expandable,
198
+ [`Table-tr--hasItemAction`]: itemAction,
198
199
  [`Table-tr--odd`]: itemIndex % 2 === 0,
199
200
  [`Table-tr--even`]: itemIndex % 2 === 1
200
201
  },