amis 1.4.1 → 1.4.2-beta.1

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 (239) hide show
  1. package/README.md +1 -1
  2. package/lib/Schema.d.ts +17 -0
  3. package/lib/Schema.js.map +1 -1
  4. package/lib/components/Alert.js +3 -1
  5. package/lib/components/Alert.js.map +2 -2
  6. package/lib/components/Badge.d.ts +2 -2
  7. package/lib/components/Badge.js +12 -6
  8. package/lib/components/Badge.js.map +2 -2
  9. package/lib/components/Collapse.js +1 -1
  10. package/lib/components/Collapse.js.map +2 -2
  11. package/lib/components/DatePicker.js +1 -1
  12. package/lib/components/DatePicker.js.map +2 -2
  13. package/lib/components/DateRangePicker.js +1 -1
  14. package/lib/components/DateRangePicker.js.map +2 -2
  15. package/lib/components/InputBox.js +1 -1
  16. package/lib/components/InputBox.js.map +2 -2
  17. package/lib/components/Link.d.ts +91 -0
  18. package/lib/components/Link.js +44 -0
  19. package/lib/components/Link.js.map +13 -0
  20. package/lib/components/MonthRangePicker.js +1 -1
  21. package/lib/components/MonthRangePicker.js.map +2 -2
  22. package/lib/components/RichText.js +17 -53
  23. package/lib/components/RichText.js.map +2 -2
  24. package/lib/components/Select.js +3 -0
  25. package/lib/components/Select.js.map +2 -2
  26. package/lib/components/SparkLine.d.ts +85 -84
  27. package/lib/components/SparkLine.js +2 -2
  28. package/lib/components/SparkLine.js.map +2 -2
  29. package/lib/components/Toast.js +2 -2
  30. package/lib/components/Toast.js.map +2 -2
  31. package/lib/components/Tree.js +5 -3
  32. package/lib/components/Tree.js.map +2 -2
  33. package/lib/components/icons.js +12 -0
  34. package/lib/components/icons.js.map +2 -2
  35. package/lib/icons/clock.js +10 -0
  36. package/lib/icons/status-close.js +11 -0
  37. package/lib/icons/status-fail.js +11 -0
  38. package/lib/icons/status-info.js +10 -0
  39. package/lib/icons/status-success.js +11 -0
  40. package/lib/icons/status-warning.js +10 -0
  41. package/lib/index.js +1 -1
  42. package/lib/locale/de-DE.js +2 -0
  43. package/lib/locale/de-DE.js.map +2 -2
  44. package/lib/locale/en-US.js +2 -0
  45. package/lib/locale/en-US.js.map +2 -2
  46. package/lib/locale/zh-CN.js +3 -1
  47. package/lib/locale/zh-CN.js.map +2 -2
  48. package/lib/renderers/Action.d.ts +7 -0
  49. package/lib/renderers/Action.js.map +2 -2
  50. package/lib/renderers/CRUD.js +21 -6
  51. package/lib/renderers/CRUD.js.map +2 -2
  52. package/lib/renderers/Collapse.js +2 -2
  53. package/lib/renderers/Collapse.js.map +2 -2
  54. package/lib/renderers/Dialog.js +0 -3
  55. package/lib/renderers/Dialog.js.map +2 -2
  56. package/lib/renderers/Drawer.js +0 -3
  57. package/lib/renderers/Drawer.js.map +2 -2
  58. package/lib/renderers/DropDownButton.d.ts +5 -1
  59. package/lib/renderers/DropDownButton.js +8 -6
  60. package/lib/renderers/DropDownButton.js.map +2 -2
  61. package/lib/renderers/Form/Checkbox.d.ts +5 -0
  62. package/lib/renderers/Form/Checkbox.js +4 -0
  63. package/lib/renderers/Form/Checkbox.js.map +2 -2
  64. package/lib/renderers/Form/Combo.js +2 -2
  65. package/lib/renderers/Form/Combo.js.map +2 -2
  66. package/lib/renderers/Form/InputFile.js +2 -2
  67. package/lib/renderers/Form/InputFile.js.map +2 -2
  68. package/lib/renderers/Form/InputImage.js +5 -3
  69. package/lib/renderers/Form/InputImage.js.map +2 -2
  70. package/lib/renderers/Form/Options.js +6 -3
  71. package/lib/renderers/Form/Options.js.map +2 -2
  72. package/lib/renderers/Form/Picker.js +2 -2
  73. package/lib/renderers/Form/Picker.js.map +2 -2
  74. package/lib/renderers/Form/wrapControl.js +2 -2
  75. package/lib/renderers/Form/wrapControl.js.map +2 -2
  76. package/lib/renderers/IFrame.js +2 -2
  77. package/lib/renderers/IFrame.js.map +2 -2
  78. package/lib/renderers/Image.d.ts +1 -0
  79. package/lib/renderers/Image.js +15 -1
  80. package/lib/renderers/Image.js.map +2 -2
  81. package/lib/renderers/Link.d.ts +16 -3
  82. package/lib/renderers/Link.js +16 -13
  83. package/lib/renderers/Link.js.map +2 -2
  84. package/lib/renderers/Log.d.ts +2 -2
  85. package/lib/renderers/Log.js +7 -1
  86. package/lib/renderers/Log.js.map +2 -2
  87. package/lib/renderers/Nav.d.ts +62 -36
  88. package/lib/renderers/Nav.js +248 -90
  89. package/lib/renderers/Nav.js.map +2 -2
  90. package/lib/renderers/SparkLine.d.ts +4 -0
  91. package/lib/renderers/SparkLine.js.map +2 -2
  92. package/lib/renderers/Table/ColumnToggler.d.ts +113 -0
  93. package/lib/renderers/Table/ColumnToggler.js +216 -0
  94. package/lib/renderers/Table/ColumnToggler.js.map +13 -0
  95. package/lib/renderers/Table/ItemActionsWrapper.d.ts +11 -0
  96. package/lib/renderers/Table/ItemActionsWrapper.js +31 -0
  97. package/lib/renderers/Table/ItemActionsWrapper.js.map +13 -0
  98. package/lib/renderers/Table/TableBody.d.ts +4 -0
  99. package/lib/renderers/Table/TableCell.js +3 -1
  100. package/lib/renderers/Table/TableCell.js.map +2 -2
  101. package/lib/renderers/Table/index.d.ts +14 -1
  102. package/lib/renderers/Table/index.js +116 -36
  103. package/lib/renderers/Table/index.js.map +2 -2
  104. package/lib/store/table.d.ts +257 -1
  105. package/lib/store/table.js +41 -6
  106. package/lib/store/table.js.map +2 -2
  107. package/lib/themes/ang-ie11.css +393 -90
  108. package/lib/themes/ang.css +393 -90
  109. package/lib/themes/ang.css.map +1 -1
  110. package/lib/themes/antd-ie11.css +393 -90
  111. package/lib/themes/antd.css +393 -90
  112. package/lib/themes/antd.css.map +1 -1
  113. package/lib/themes/cxd-ie11.css +904 -263
  114. package/lib/themes/cxd.css +904 -263
  115. package/lib/themes/cxd.css.map +1 -1
  116. package/lib/themes/dark-ie11.css +393 -90
  117. package/lib/themes/dark.css +393 -90
  118. package/lib/themes/dark.css.map +1 -1
  119. package/lib/themes/default.css +904 -263
  120. package/lib/themes/default.css.map +1 -1
  121. package/lib/utils/api.js +4 -4
  122. package/lib/utils/api.js.map +2 -2
  123. package/lib/utils/handleAction.d.ts +7 -0
  124. package/lib/utils/handleAction.js +30 -0
  125. package/lib/utils/handleAction.js.map +13 -0
  126. package/lib/utils/helper.d.ts +1 -1
  127. package/lib/utils/helper.js +3 -3
  128. package/lib/utils/helper.js.map +2 -2
  129. package/lib/utils/tpl-builtin.d.ts +1 -1
  130. package/lib/utils/tpl-builtin.js +25 -15
  131. package/lib/utils/tpl-builtin.js.map +2 -2
  132. package/package.json +1 -1
  133. package/schema.json +322 -261
  134. package/scss/_properties.scss +39 -4
  135. package/scss/_utilities.scss +4 -0
  136. package/scss/components/_button.scss +4 -5
  137. package/scss/components/_collapse.scss +26 -8
  138. package/scss/components/_column-toggler.scss +234 -0
  139. package/scss/components/_dropdown.scss +2 -1
  140. package/scss/components/_images.scss +2 -1
  141. package/scss/components/_link.scss +6 -0
  142. package/scss/components/_nav.scss +231 -223
  143. package/scss/components/_page.scss +5 -4
  144. package/scss/components/_progress.scss +2 -0
  145. package/scss/components/_steps.scss +1 -1
  146. package/scss/components/_table.scss +25 -1
  147. package/scss/components/form/_color.scss +1 -0
  148. package/scss/components/form/_date-range.scss +2 -0
  149. package/scss/components/form/_date.scss +2 -0
  150. package/scss/components/form/_fieldset.scss +1 -2
  151. package/scss/components/form/_file.scss +5 -4
  152. package/scss/components/form/_image.scss +7 -2
  153. package/scss/components/form/_list.scss +1 -0
  154. package/scss/components/form/_location.scss +1 -1
  155. package/scss/components/form/_text.scss +13 -0
  156. package/scss/components/form/_textarea.scss +10 -0
  157. package/scss/components/form/_transfer.scss +2 -0
  158. package/scss/themes/_common.scss +2 -0
  159. package/scss/themes/_cxd-colors.scss +56 -0
  160. package/scss/themes/_cxd-variables.scss +215 -90
  161. package/scss/themes/cxd.scss +366 -0
  162. package/sdk/ang-ie11.css +569 -235
  163. package/sdk/ang.css +512 -151
  164. package/sdk/antd-ie11.css +558 -224
  165. package/sdk/antd.css +512 -151
  166. package/sdk/charts.js +13 -13
  167. package/sdk/color-picker.js +67 -67
  168. package/sdk/cropperjs.js +2 -2
  169. package/sdk/cxd-ie11.css +1506 -870
  170. package/sdk/cxd.css +1064 -324
  171. package/sdk/dark-ie11.css +569 -235
  172. package/sdk/dark.css +512 -151
  173. package/sdk/exceljs.js +1 -1
  174. package/sdk/ie11-patch.css +1 -0
  175. package/sdk/locale/de-DE.js +2 -0
  176. package/sdk/markdown.js +69 -69
  177. package/sdk/papaparse.js +1 -1
  178. package/sdk/renderers/Form/CityDB.js +1 -1
  179. package/sdk/rest.js +22 -22
  180. package/sdk/rich-text.js +62 -62
  181. package/sdk/sdk-ie11.css +1506 -870
  182. package/sdk/sdk.css +1064 -324
  183. package/sdk/sdk.js +1138 -1118
  184. package/sdk/thirds/hls.js/hls.js +1 -1
  185. package/sdk/thirds/mpegts.js/mpegts.js +1 -1
  186. package/sdk/tinymce.js +57 -57
  187. package/src/Schema.ts +18 -0
  188. package/src/components/Alert.tsx +3 -1
  189. package/src/components/Badge.tsx +36 -24
  190. package/src/components/Collapse.tsx +14 -9
  191. package/src/components/DatePicker.tsx +1 -1
  192. package/src/components/DateRangePicker.tsx +23 -11
  193. package/src/components/InputBox.tsx +1 -1
  194. package/src/components/Link.tsx +94 -0
  195. package/src/components/MonthRangePicker.tsx +10 -2
  196. package/src/components/RichText.tsx +17 -57
  197. package/src/components/Select.tsx +3 -0
  198. package/src/components/SparkLine.tsx +4 -1
  199. package/src/components/Toast.tsx +5 -5
  200. package/src/components/Tree.tsx +6 -8
  201. package/src/components/icons.tsx +13 -0
  202. package/src/icons/clock.svg +1 -0
  203. package/src/icons/status-close.svg +10 -0
  204. package/src/icons/status-fail.svg +10 -0
  205. package/src/icons/status-info.svg +8 -0
  206. package/src/icons/status-success.svg +10 -0
  207. package/src/icons/status-warning.svg +8 -0
  208. package/src/locale/de-DE.ts +2 -0
  209. package/src/locale/en-US.ts +2 -0
  210. package/src/locale/zh-CN.ts +3 -1
  211. package/src/renderers/Action.tsx +5 -0
  212. package/src/renderers/CRUD.tsx +31 -26
  213. package/src/renderers/Collapse.tsx +1 -1
  214. package/src/renderers/Dialog.tsx +0 -4
  215. package/src/renderers/Drawer.tsx +0 -4
  216. package/src/renderers/DropDownButton.tsx +19 -14
  217. package/src/renderers/Form/Checkbox.tsx +8 -0
  218. package/src/renderers/Form/Combo.tsx +2 -3
  219. package/src/renderers/Form/InputFile.tsx +2 -1
  220. package/src/renderers/Form/InputImage.tsx +5 -2
  221. package/src/renderers/Form/Options.tsx +16 -5
  222. package/src/renderers/Form/Picker.tsx +3 -2
  223. package/src/renderers/Form/wrapControl.tsx +2 -2
  224. package/src/renderers/IFrame.tsx +2 -1
  225. package/src/renderers/Image.tsx +10 -0
  226. package/src/renderers/Link.tsx +36 -11
  227. package/src/renderers/Log.tsx +16 -3
  228. package/src/renderers/Nav.tsx +255 -100
  229. package/src/renderers/SparkLine.tsx +5 -0
  230. package/src/renderers/Table/ColumnToggler.tsx +544 -0
  231. package/src/renderers/Table/ItemActionsWrapper.tsx +44 -0
  232. package/src/renderers/Table/TableCell.tsx +16 -1
  233. package/src/renderers/Table/index.tsx +179 -47
  234. package/src/store/table.ts +57 -6
  235. package/src/utils/api.ts +13 -4
  236. package/src/utils/handleAction.ts +41 -0
  237. package/src/utils/helper.ts +4 -4
  238. package/src/utils/tpl-builtin.ts +48 -17
  239. package/sdk.zip +0 -0
@@ -5,6 +5,7 @@ import {SchemaNode, Action, Schema} from '../../types';
5
5
  import forEach from 'lodash/forEach';
6
6
  import {filter} from '../../utils/tpl';
7
7
  import DropDownButton from '../DropDownButton';
8
+ import './ColumnToggler';
8
9
  import Checkbox from '../../components/Checkbox';
9
10
  import Button from '../../components/Button';
10
11
  import {TableStore, ITableStore, IColumn, IRow} from '../../store/table';
@@ -16,7 +17,9 @@ import {
16
17
  autobind,
17
18
  isArrayChildrenModified,
18
19
  getVariable,
19
- removeHTMLTag
20
+ removeHTMLTag,
21
+ eachTree,
22
+ isObject
20
23
  } from '../../utils/helper';
21
24
  import {
22
25
  isPureVariable,
@@ -50,6 +53,9 @@ import {TableBody} from './TableBody';
50
53
  import {TplSchema} from '../Tpl';
51
54
  import {MappingSchema} from '../Mapping';
52
55
  import {isAlive, getSnapshot} from 'mobx-state-tree';
56
+ import ItemActionsWrapper from './ItemActionsWrapper';
57
+ import ColumnToggler from './ColumnToggler';
58
+ import {BadgeSchema} from '../../components/Badge';
53
59
 
54
60
  /**
55
61
  * 表格列,不指定类型时默认为文本类型。
@@ -98,7 +104,7 @@ export type TableColumnObject = {
98
104
  /**
99
105
  * 是否可快速搜索
100
106
  */
101
- searchable?: boolean;
107
+ searchable?: boolean | SchemaObject;
102
108
 
103
109
  /**
104
110
  * 配置是否默认展示
@@ -278,6 +284,16 @@ export interface TableSchema extends BaseSchema {
278
284
  * 行样式表表达式
279
285
  */
280
286
  rowClassNameExpr?: string;
287
+
288
+ /**
289
+ * 行角标
290
+ */
291
+ itemBadge?: BadgeSchema;
292
+
293
+ /**
294
+ * 开启查询区域,会根据列元素的searchable属性值,自动生成查询条件表单
295
+ */
296
+ autoGenerateFilter?: boolean;
281
297
  }
282
298
 
283
299
  export interface TableProps extends RendererProps {
@@ -345,6 +361,7 @@ export interface TableProps extends RendererProps {
345
361
  popOverContainer?: any;
346
362
  canAccessSuperData?: boolean;
347
363
  reUseRow?: boolean;
364
+ itemBadge?: BadgeSchema;
348
365
  }
349
366
 
350
367
  type ExportExcelToolbar = SchemaNode & {
@@ -404,7 +421,8 @@ export default class Table extends React.Component<TableProps, object> {
404
421
  'popOverContainer',
405
422
  'headerToolbarClassName',
406
423
  'toolbarClassName',
407
- 'footerToolbarClassName'
424
+ 'footerToolbarClassName',
425
+ 'itemBadge'
408
426
  ];
409
427
  static defaultProps: Partial<TableProps> = {
410
428
  className: '',
@@ -477,6 +495,8 @@ export default class Table extends React.Component<TableProps, object> {
477
495
  this.handleMouseMove = this.handleMouseMove.bind(this);
478
496
  this.handleMouseLeave = this.handleMouseLeave.bind(this);
479
497
  this.subFormRef = this.subFormRef.bind(this);
498
+ this.handleColumnToggle = this.handleColumnToggle.bind(this);
499
+ this.renderAutoFilterForm = this.renderAutoFilterForm.bind(this);
480
500
 
481
501
  const {
482
502
  store,
@@ -655,8 +675,12 @@ export default class Table extends React.Component<TableProps, object> {
655
675
  ) {
656
676
  Table.syncRows(store, props, prevProps) && this.syncSelected();
657
677
  } else if (isArrayChildrenModified(prevProps.selected!, props.selected!)) {
678
+ const prevSelectedRows = store.selectedRows
679
+ .map(item => item.id)
680
+ .join(',');
658
681
  store.updateSelected(props.selected || [], props.valueField);
659
- this.syncSelected();
682
+ const selectedRows = store.selectedRows.map(item => item.id).join(',');
683
+ prevSelectedRows !== selectedRows && this.syncSelected();
660
684
  }
661
685
 
662
686
  this.updateTableInfoLazy();
@@ -1111,7 +1135,7 @@ export default class Table extends React.Component<TableProps, object> {
1111
1135
 
1112
1136
  handleMouseMove(e: React.MouseEvent<any>) {
1113
1137
  const tr: HTMLElement = (e.target as HTMLElement).closest(
1114
- 'tr[data-index]'
1138
+ 'tr[data-id]'
1115
1139
  ) as HTMLElement;
1116
1140
 
1117
1141
  if (!tr) {
@@ -1129,20 +1153,20 @@ export default class Table extends React.Component<TableProps, object> {
1129
1153
  return;
1130
1154
  }
1131
1155
 
1132
- const index = parseInt(tr.getAttribute('data-index') as string, 10);
1156
+ const id = tr.getAttribute('data-id') as string;
1157
+ const row = store.hoverRow;
1133
1158
 
1134
- if (store.hoverIndex === index) {
1159
+ if (row?.id === id) {
1135
1160
  return;
1136
1161
  }
1137
- store.rows.forEach((item, key) => item.setIsHover(index === key));
1162
+ eachTree<IRow>(store.rows, (item: IRow) => item.setIsHover(item.id === id));
1138
1163
  }
1139
1164
 
1140
1165
  handleMouseLeave() {
1141
1166
  const store = this.props.store;
1167
+ const row = store.hoverRow;
1142
1168
 
1143
- if (~store.hoverIndex) {
1144
- store.rows[store.hoverIndex].setIsHover(false);
1145
- }
1169
+ row?.setIsHover(false);
1146
1170
  }
1147
1171
 
1148
1172
  draggingTr: HTMLTableRowElement;
@@ -1346,6 +1370,111 @@ export default class Table extends React.Component<TableProps, object> {
1346
1370
  document.removeEventListener('mouseup', this.handleColResizeMouseUp);
1347
1371
  }
1348
1372
 
1373
+ handleColumnToggle(columns: Array<IColumn>) {
1374
+ const {store} = this.props;
1375
+
1376
+ store.update({columns});
1377
+ }
1378
+
1379
+ renderAutoFilterForm(): React.ReactNode {
1380
+ const {
1381
+ render,
1382
+ store,
1383
+ onSearchableFromReset,
1384
+ onSearchableFromSubmit,
1385
+ onSearchableFromInit,
1386
+ classnames: cx,
1387
+ translate: __
1388
+ } = this.props;
1389
+ const searchableColumns = store.searchableColumns;
1390
+ const activedSearchableColumns = store.activedSearchableColumns;
1391
+
1392
+ if (!searchableColumns.length) {
1393
+ return null;
1394
+ }
1395
+
1396
+ const groupedSearchableColumns: Array<Record<string, any>> = [
1397
+ {body: [], md: 4},
1398
+ {body: [], md: 4},
1399
+ {body: [], md: 4}
1400
+ ];
1401
+
1402
+ activedSearchableColumns.forEach((column, index) => {
1403
+ groupedSearchableColumns[index % 3].body.push({
1404
+ ...column.searchable,
1405
+ name: column.searchable?.name ?? column.name,
1406
+ label: column.searchable?.label ?? column.label,
1407
+ mode: 'horizontal'
1408
+ });
1409
+ });
1410
+
1411
+ return render(
1412
+ 'searchable-form',
1413
+ {
1414
+ type: 'form',
1415
+ api: null,
1416
+ title: '',
1417
+ mode: 'normal',
1418
+ submitText: __('search'),
1419
+ body: [
1420
+ {
1421
+ type: 'grid',
1422
+ columns: groupedSearchableColumns
1423
+ }
1424
+ ],
1425
+ actions: [
1426
+ {
1427
+ type: 'dropdown-button',
1428
+ label: __('Table.searchFields'),
1429
+ className: cx('Table-searchableForm-dropdown', 'mr-2'),
1430
+ level: 'link',
1431
+ trigger: 'click',
1432
+ size: 'sm',
1433
+ align: 'right',
1434
+ buttons: searchableColumns.map(column => {
1435
+ return {
1436
+ type: 'checkbox',
1437
+ className: cx('Table-searchableForm-checkbox'),
1438
+ name: `__search_${column.searchable?.name ?? column.name}`,
1439
+ option: column.searchable?.label ?? column.label,
1440
+ value: column.enableSearch,
1441
+ badge: {
1442
+ offset: [-10, 5],
1443
+ visibleOn: `${
1444
+ column.toggable && !column.toggled && column.enableSearch
1445
+ }`
1446
+ },
1447
+ onChange: (value: boolean) => {
1448
+ column.setEnableSearch(value);
1449
+ }
1450
+ };
1451
+ })
1452
+ },
1453
+ {
1454
+ type: 'submit',
1455
+ label: __('search'),
1456
+ level: 'primary',
1457
+ className: 'w-18'
1458
+ },
1459
+ {
1460
+ type: 'reset',
1461
+ label: __('reset'),
1462
+ className: 'w-18'
1463
+ }
1464
+ ]
1465
+ },
1466
+ {
1467
+ key: 'searchable-form',
1468
+ panelClassName: cx('Table-searchableForm'),
1469
+ actionsClassName: cx('Table-searchableForm-footer'),
1470
+ onReset: onSearchableFromReset,
1471
+ onSubmit: onSearchableFromSubmit,
1472
+ onInit: onSearchableFromInit,
1473
+ formStore: undefined
1474
+ }
1475
+ );
1476
+ }
1477
+
1349
1478
  renderHeading() {
1350
1479
  let {
1351
1480
  title,
@@ -1435,7 +1564,8 @@ export default class Table extends React.Component<TableProps, object> {
1435
1564
  render,
1436
1565
  classPrefix: ns,
1437
1566
  resizable,
1438
- classnames: cx
1567
+ classnames: cx,
1568
+ autoGenerateFilter
1439
1569
  } = this.props;
1440
1570
 
1441
1571
  if (column.type === '__checkme') {
@@ -1482,7 +1612,7 @@ export default class Table extends React.Component<TableProps, object> {
1482
1612
 
1483
1613
  let affix = null;
1484
1614
 
1485
- if (column.searchable && column.name) {
1615
+ if (column.searchable && column.name && !autoGenerateFilter) {
1486
1616
  affix = (
1487
1617
  <HeadCellSearchDropDown
1488
1618
  {...this.props}
@@ -1635,7 +1765,8 @@ export default class Table extends React.Component<TableProps, object> {
1635
1765
  classnames: cx,
1636
1766
  checkOnItemClick,
1637
1767
  popOverContainer,
1638
- canAccessSuperData
1768
+ canAccessSuperData,
1769
+ itemBadge
1639
1770
  } = this.props;
1640
1771
 
1641
1772
  if (column.name && item.rowSpans[column.name] === 0) {
@@ -1723,7 +1854,13 @@ export default class Table extends React.Component<TableProps, object> {
1723
1854
  quickEditFormRef: this.subFormRef,
1724
1855
  prefix,
1725
1856
  onImageEnlarge: this.handleImageEnlarge,
1726
- canAccessSuperData
1857
+ canAccessSuperData,
1858
+ row: item,
1859
+ itemBadge,
1860
+ showBadge:
1861
+ !props.isHead &&
1862
+ itemBadge &&
1863
+ store.firstToggledColumnIndex === props.colIndex
1727
1864
  };
1728
1865
  delete subProps.label;
1729
1866
 
@@ -1958,23 +2095,29 @@ export default class Table extends React.Component<TableProps, object> {
1958
2095
  }
1959
2096
 
1960
2097
  return (
1961
- <DropDownButton
2098
+ <ColumnToggler
1962
2099
  {...rest}
1963
- tooltip={__('Table.columnsVisibility')}
2100
+ {...(isObject(config) ? config : {})}
2101
+ tooltip={config?.tooltip || __('Table.columnsVisibility')}
1964
2102
  tooltipContainer={
1965
2103
  env && env.getModalContainer ? env.getModalContainer : undefined
1966
2104
  }
1967
- align={config ? config.align : 'left'}
2105
+ align={config?.align ?? 'left'}
1968
2106
  isActived={store.hasColumnHidden()}
1969
2107
  classnames={cx}
1970
2108
  classPrefix={ns}
1971
2109
  key="columns-toggable"
1972
- size="sm"
1973
- label={<Icon icon="columns" className="icon m-r-none" />}
2110
+ size={config?.size || 'sm'}
2111
+ label={
2112
+ config?.label || <Icon icon="columns" className="icon m-r-none" />
2113
+ }
2114
+ draggable={config?.draggable}
2115
+ columns={store.columnsData}
2116
+ onColumnToggle={this.handleColumnToggle}
1974
2117
  >
1975
2118
  {store.toggableColumns.map(column => (
1976
2119
  <li
1977
- className={cx('DropDown-menuItem')}
2120
+ className={cx('ColumnToggler-menuItem')}
1978
2121
  key={column.index}
1979
2122
  onClick={column.toggleToggle}
1980
2123
  >
@@ -1983,7 +2126,7 @@ export default class Table extends React.Component<TableProps, object> {
1983
2126
  </Checkbox>
1984
2127
  </li>
1985
2128
  ))}
1986
- </DropDownButton>
2129
+ </ColumnToggler>
1987
2130
  );
1988
2131
  }
1989
2132
 
@@ -2450,27 +2593,9 @@ export default class Table extends React.Component<TableProps, object> {
2450
2593
  if (!finalActions.length) {
2451
2594
  return null;
2452
2595
  }
2453
- const rowIndex = store.hoverIndex;
2454
- const heights = this.heights;
2455
- let height = 40;
2456
- let top = 0;
2457
-
2458
- if (heights && heights[rowIndex]) {
2459
- height = heights[rowIndex];
2460
- top += heights.header;
2461
- for (let i = rowIndex - 1; i >= 0; i--) {
2462
- top += heights[i];
2463
- }
2464
- }
2465
2596
 
2466
2597
  return (
2467
- <div
2468
- className={cx('Table-itemActions-wrap')}
2469
- style={{
2470
- top,
2471
- height
2472
- }}
2473
- >
2598
+ <ItemActionsWrapper store={store} classnames={cx}>
2474
2599
  <div className={cx('Table-itemActions')}>
2475
2600
  {finalActions.map((action, index) =>
2476
2601
  render(
@@ -2481,14 +2606,14 @@ export default class Table extends React.Component<TableProps, object> {
2481
2606
  },
2482
2607
  {
2483
2608
  key: index,
2484
- item: store.rows[rowIndex],
2485
- data: store.rows[rowIndex].locals,
2486
- rowIndex
2609
+ item: store.hoverRow,
2610
+ data: store.hoverRow!.locals,
2611
+ rowIndex: store.hoverRow!.index
2487
2612
  }
2488
2613
  )
2489
2614
  )}
2490
2615
  </div>
2491
- </div>
2616
+ </ItemActionsWrapper>
2492
2617
  );
2493
2618
  }
2494
2619
 
@@ -2551,7 +2676,13 @@ export default class Table extends React.Component<TableProps, object> {
2551
2676
  }
2552
2677
 
2553
2678
  render() {
2554
- const {className, store, classnames: cx, affixColumns} = this.props;
2679
+ const {
2680
+ className,
2681
+ store,
2682
+ classnames: cx,
2683
+ affixColumns,
2684
+ autoGenerateFilter
2685
+ } = this.props;
2555
2686
 
2556
2687
  this.renderedToolbars = []; // 用来记录哪些 toolbar 已经渲染了,已经渲染了就不重复渲染了。
2557
2688
  const heading = this.renderHeading();
@@ -2569,6 +2700,7 @@ export default class Table extends React.Component<TableProps, object> {
2569
2700
  'Table--unsaved': !!store.modified || !!store.moved
2570
2701
  })}
2571
2702
  >
2703
+ {autoGenerateFilter ? this.renderAutoFilterForm() : null}
2572
2704
  {header}
2573
2705
  {heading}
2574
2706
  <div
@@ -2602,7 +2734,7 @@ export default class Table extends React.Component<TableProps, object> {
2602
2734
  : null}
2603
2735
  </div>
2604
2736
  {this.renderTableContent()}
2605
- {~store.hoverIndex ? this.renderItemActions() : null}
2737
+ {store.hoverRow ? this.renderItemActions() : null}
2606
2738
  </div>
2607
2739
  {this.renderAffixHeader(tableClassName)}
2608
2740
  {footer}
@@ -45,6 +45,7 @@ export const Column = types
45
45
  checkdisable: false,
46
46
  isPrimary: false,
47
47
  searchable: types.maybe(types.frozen()),
48
+ enableSearch: true,
48
49
  sortable: false,
49
50
  filterable: types.optional(types.frozen(), undefined),
50
51
  fixed: '',
@@ -66,8 +67,13 @@ export const Column = types
66
67
 
67
68
  table.persistSaveToggledColumns();
68
69
  },
70
+
69
71
  setToggled(value: boolean) {
70
72
  self.toggled = value;
73
+ },
74
+
75
+ setEnableSearch(value: boolean) {
76
+ self.enableSearch = value;
71
77
  }
72
78
  }));
73
79
 
@@ -292,6 +298,10 @@ export const TableStore = iRendererStore
292
298
  keepItemSelectionOnPageChange: false
293
299
  })
294
300
  .views(self => {
301
+ function getColumnsExceptBuiltinTypes() {
302
+ return self.columns.filter(item => !/^__/.test(item.type));
303
+ }
304
+
295
305
  function getForms() {
296
306
  return self.formsRef.map(item => ({
297
307
  store: getStoreById(item.id) as IFormStore,
@@ -414,8 +424,8 @@ export const TableStore = iRendererStore
414
424
  return getMovedRows().length;
415
425
  }
416
426
 
417
- function getHoverIndex(): number {
418
- return self.rows.findIndex(item => item.isHover);
427
+ function getHovedRow(): IRow | undefined {
428
+ return flattenTree<IRow>(self.rows).find((item: IRow) => item.isHover);
419
429
  }
420
430
 
421
431
  function getUnSelectedRows() {
@@ -499,11 +509,46 @@ export const TableStore = iRendererStore
499
509
  });
500
510
  }
501
511
 
512
+ function getFirstToggledColumnIndex() {
513
+ const column = self.columns.find(
514
+ column => !/^__/.test(column.type) && column.toggled
515
+ );
516
+
517
+ return column == null ? null : column.index;
518
+ }
519
+
520
+ function getSearchableColumns() {
521
+ return self.columns.filter(
522
+ column => column.searchable && isObject(column.searchable)
523
+ );
524
+ }
525
+
526
+ function getActivedSearchableColumns() {
527
+ return self.columns.filter(
528
+ column =>
529
+ column.searchable &&
530
+ isObject(column.searchable) &&
531
+ column.enableSearch
532
+ );
533
+ }
534
+
502
535
  return {
536
+ get columnsData() {
537
+ return getColumnsExceptBuiltinTypes();
538
+ },
539
+
503
540
  get forms() {
504
541
  return getForms();
505
542
  },
506
543
 
544
+ get searchableColumns() {
545
+ return getSearchableColumns();
546
+ },
547
+
548
+ get activedSearchableColumns() {
549
+ return getSearchableColumns().filter(column => column.enableSearch);
550
+ },
551
+
507
552
  get filteredColumns() {
508
553
  return getFilteredColumns();
509
554
  },
@@ -583,8 +628,8 @@ export const TableStore = iRendererStore
583
628
  return getMovedRows();
584
629
  },
585
630
 
586
- get hoverIndex() {
587
- return getHoverIndex();
631
+ get hoverRow() {
632
+ return getHovedRow();
588
633
  },
589
634
 
590
635
  get disabledHeadCheckbox() {
@@ -598,6 +643,10 @@ export const TableStore = iRendererStore
598
643
  return maxLength === selectedLength;
599
644
  },
600
645
 
646
+ get firstToggledColumnIndex() {
647
+ return getFirstToggledColumnIndex();
648
+ },
649
+
601
650
  getData,
602
651
 
603
652
  get columnGroup() {
@@ -1031,8 +1080,10 @@ export const TableStore = iRendererStore
1031
1080
  if (idx === -1) {
1032
1081
  // 如果上一个是选中状态,则将之间的所有 check 都变成可选
1033
1082
  if (lastCheckedRow.checked) {
1034
- if (maxLength && self.selectedRows.length < maxLength) {
1035
- self.selectedRows.push(rowItem);
1083
+ if (maxLength) {
1084
+ if (self.selectedRows.length < maxLength) {
1085
+ self.selectedRows.push(rowItem);
1086
+ }
1036
1087
  } else {
1037
1088
  self.selectedRows.push(rowItem);
1038
1089
  }
package/src/utils/api.ts CHANGED
@@ -82,7 +82,9 @@ export function buildApi(
82
82
  );
83
83
  api.url =
84
84
  tokenize(api.url.substring(0, idx + 1), data, '| url_encode') +
85
- qsstringify((api.query = dataMapping(params, data))) +
85
+ qsstringify(
86
+ (api.query = dataMapping(params, data, undefined, api.convertKeyToPath))
87
+ ) +
86
88
  (~hashIdx ? api.url.substring(hashIdx) : '');
87
89
  } else {
88
90
  api.url = tokenize(api.url, data, '| url_encode');
@@ -93,7 +95,12 @@ export function buildApi(
93
95
  }
94
96
 
95
97
  if (api.data) {
96
- api.body = api.data = dataMapping(api.data, data);
98
+ api.body = api.data = dataMapping(
99
+ api.data,
100
+ data,
101
+ undefined,
102
+ api.convertKeyToPath
103
+ );
97
104
  } else if (api.method === 'post' || api.method === 'put') {
98
105
  api.body = api.data = cloneObject(data);
99
106
  }
@@ -138,7 +145,7 @@ export function buildApi(
138
145
  }
139
146
 
140
147
  if (api.headers) {
141
- api.headers = dataMapping(api.headers, data);
148
+ api.headers = dataMapping(api.headers, data, undefined, false);
142
149
  }
143
150
 
144
151
  if (api.requestAdaptor && typeof api.requestAdaptor === 'string') {
@@ -248,7 +255,9 @@ export function responseAdaptor(ret: fetcherResult, api: ApiObject) {
248
255
  items: payload.data
249
256
  }
250
257
  : payload.data) || {}
251
- )
258
+ ),
259
+ undefined,
260
+ api.convertKeyToPath
252
261
  );
253
262
  }
254
263
 
@@ -0,0 +1,41 @@
1
+ /**
2
+ * 后续好多地方可能都要支持 action,所以提取公共功能
3
+ */
4
+
5
+ import {RendererProps} from '../factory';
6
+ import {ActionSchema, AjaxActionSchema} from '../renderers/Action';
7
+ import {normalizeApi, str2function} from './api';
8
+
9
+ export default function handleAction(
10
+ e: React.MouseEvent<any>,
11
+ action: ActionSchema,
12
+ props: RendererProps,
13
+ data?: any
14
+ ) {
15
+ // https://reactjs.org/docs/legacy-event-pooling.html
16
+ e.persist();
17
+
18
+ const onAction = props.onAction;
19
+ let onClick: any = action.onClick;
20
+
21
+ if (typeof onClick === 'string') {
22
+ onClick = str2function(onClick, 'event', 'props');
23
+ }
24
+ const result: any = onClick && onClick(e, props);
25
+
26
+ if (e.isDefaultPrevented() || result === false || !onAction) {
27
+ return;
28
+ }
29
+
30
+ e.preventDefault();
31
+
32
+ // download 是一种 ajax 的简写
33
+ if (action.actionType === 'download') {
34
+ action.actionType = 'ajax';
35
+ const api = normalizeApi((action as AjaxActionSchema).api);
36
+ api.responseType = 'blob';
37
+ (action as AjaxActionSchema).api = api;
38
+ }
39
+
40
+ onAction(e, action, data || props.data);
41
+ }
@@ -181,7 +181,8 @@ export function getVariable(
181
181
  export function setVariable(
182
182
  data: {[propName: string]: any},
183
183
  key: string,
184
- value: any
184
+ value: any,
185
+ convertKeyToPath?: boolean
185
186
  ) {
186
187
  data = data || {};
187
188
 
@@ -190,7 +191,7 @@ export function setVariable(
190
191
  return;
191
192
  }
192
193
 
193
- const parts = keyToPath(key);
194
+ const parts = convertKeyToPath !== false ? keyToPath(key) : [key];
194
195
  const last = parts.pop() as string;
195
196
 
196
197
  while (parts.length) {
@@ -507,7 +508,6 @@ export function isDisabled(
507
508
  );
508
509
  }
509
510
 
510
-
511
511
  export function hasAbility(
512
512
  schema: any,
513
513
  ability: string,
@@ -1618,7 +1618,7 @@ export function detectPropValueChanged<
1618
1618
 
1619
1619
  // 去掉字符串中的 html 标签,不完全准确但效率比较高
1620
1620
  export function removeHTMLTag(str: string) {
1621
- return str.replace(/<\/?[^>]+(>|$)/g, '');
1621
+ return typeof str === 'string' ? str.replace(/<\/?[^>]+(>|$)/g, '') : str;
1622
1622
  }
1623
1623
 
1624
1624
  /**