amis 1.9.1-beta.12 → 1.9.1-beta.18

Sign up to get free protection for your applications and to get access to all the features.
Files changed (133) hide show
  1. package/README.md +1 -1
  2. package/lib/components/Select.js +2 -2
  3. package/lib/components/Select.js.map +2 -2
  4. package/lib/components/formula/Editor.d.ts +44 -40
  5. package/lib/components/formula/Editor.js +16 -5
  6. package/lib/components/formula/Editor.js.map +2 -2
  7. package/lib/components/formula/Picker.d.ts +88 -41
  8. package/lib/components/formula/Picker.js +50 -24
  9. package/lib/components/formula/Picker.js.map +2 -2
  10. package/lib/components/table/HeadCellFilter.js +4 -1
  11. package/lib/components/table/HeadCellFilter.js.map +2 -2
  12. package/lib/components/table/HeadCellSort.js +30 -24
  13. package/lib/components/table/HeadCellSort.js.map +2 -2
  14. package/lib/components/table/index.d.ts +6 -3
  15. package/lib/components/table/index.js +72 -86
  16. package/lib/components/table/index.js.map +2 -2
  17. package/lib/index.js +1 -1
  18. package/lib/locale/zh-CN.js +1 -1
  19. package/lib/locale/zh-CN.js.map +2 -2
  20. package/lib/renderers/Action.d.ts +21 -4
  21. package/lib/renderers/Action.js +44 -20
  22. package/lib/renderers/Action.js.map +2 -2
  23. package/lib/renderers/Breadcrumb.js +2 -2
  24. package/lib/renderers/Breadcrumb.js.map +2 -2
  25. package/lib/renderers/CRUD.js +3 -0
  26. package/lib/renderers/CRUD.js.map +2 -2
  27. package/lib/renderers/Form/InputFormula.d.ts +6 -2
  28. package/lib/renderers/Form/InputFormula.js +4 -3
  29. package/lib/renderers/Form/InputFormula.js.map +2 -2
  30. package/lib/renderers/Form/InputTree.d.ts +4 -0
  31. package/lib/renderers/Form/InputTree.js +2 -2
  32. package/lib/renderers/Form/InputTree.js.map +2 -2
  33. package/lib/renderers/Form/Picker.d.ts +1 -1
  34. package/lib/renderers/Form/Picker.js +38 -23
  35. package/lib/renderers/Form/Picker.js.map +2 -2
  36. package/lib/renderers/Form/wrapControl.js +10 -10
  37. package/lib/renderers/Form/wrapControl.js.map +2 -2
  38. package/lib/renderers/Service.js +0 -1
  39. package/lib/renderers/Service.js.map +2 -2
  40. package/lib/renderers/Steps.d.ts +2 -2
  41. package/lib/renderers/Steps.js +1 -1
  42. package/lib/renderers/Steps.js.map +2 -2
  43. package/lib/renderers/Table/index.js +2 -1
  44. package/lib/renderers/Table/index.js.map +2 -2
  45. package/lib/renderers/Table-v2/HeadCellSearchDropdown.d.ts +1 -1
  46. package/lib/renderers/Table-v2/HeadCellSearchDropdown.js +38 -24
  47. package/lib/renderers/Table-v2/HeadCellSearchDropdown.js.map +2 -2
  48. package/lib/renderers/Table-v2/index.d.ts +10 -4
  49. package/lib/renderers/Table-v2/index.js +109 -58
  50. package/lib/renderers/Table-v2/index.js.map +2 -2
  51. package/lib/renderers/Tabs.d.ts +6 -2
  52. package/lib/renderers/Tabs.js +21 -0
  53. package/lib/renderers/Tabs.js.map +2 -2
  54. package/lib/store/table-v2.d.ts +210 -4
  55. package/lib/store/table-v2.js +82 -5
  56. package/lib/store/table-v2.js.map +2 -2
  57. package/lib/themes/ang-ie11.css +59 -17
  58. package/lib/themes/ang.css +54 -12
  59. package/lib/themes/ang.css.map +1 -1
  60. package/lib/themes/antd-ie11.css +59 -17
  61. package/lib/themes/antd.css +54 -12
  62. package/lib/themes/antd.css.map +1 -1
  63. package/lib/themes/cxd-ie11.css +210 -168
  64. package/lib/themes/cxd.css +55 -13
  65. package/lib/themes/cxd.css.map +1 -1
  66. package/lib/themes/dark-ie11.css +59 -17
  67. package/lib/themes/dark.css +54 -12
  68. package/lib/themes/dark.css.map +1 -1
  69. package/lib/themes/default-ie11.css +210 -168
  70. package/lib/themes/default.css +55 -13
  71. package/lib/themes/default.css.map +1 -1
  72. package/lib/types.d.ts +1 -1
  73. package/lib/types.js.map +1 -1
  74. package/lib/utils/formula.js +4 -3
  75. package/lib/utils/formula.js.map +2 -2
  76. package/package.json +2 -2
  77. package/schema.json +22 -14
  78. package/scss/components/_formula.scss +45 -4
  79. package/scss/components/_modal.scss +1 -1
  80. package/scss/components/form/_checks.scss +47 -44
  81. package/scss/components/form/_icon-picker.scss +10 -6
  82. package/scss/components/form/_select.scss +3 -2
  83. package/scss/components/form/_switch.scss +1 -0
  84. package/scss/components/form/_text.scss +2 -0
  85. package/scss/themes/_cxd-variables.scss +1 -1
  86. package/sdk/ang-ie11.css +66 -17
  87. package/sdk/ang.css +61 -12
  88. package/sdk/antd-ie11.css +66 -17
  89. package/sdk/antd.css +61 -12
  90. package/sdk/barcode.js +51 -51
  91. package/sdk/charts.js +14 -14
  92. package/sdk/codemirror.js +7 -7
  93. package/sdk/color-picker.js +65 -65
  94. package/sdk/cropperjs.js +2 -2
  95. package/sdk/cxd-ie11.css +217 -168
  96. package/sdk/cxd.css +62 -13
  97. package/sdk/dark-ie11.css +66 -17
  98. package/sdk/dark.css +61 -12
  99. package/sdk/exceljs.js +1 -1
  100. package/sdk/markdown.js +69 -69
  101. package/sdk/papaparse.js +1 -1
  102. package/sdk/renderers/Form/CityDB.js +1 -1
  103. package/sdk/rest.js +16 -16
  104. package/sdk/rich-text.js +62 -62
  105. package/sdk/sdk-ie11.css +217 -168
  106. package/sdk/sdk.css +62 -13
  107. package/sdk/sdk.js +1342 -1338
  108. package/sdk/thirds/hls.js/hls.js +1 -1
  109. package/sdk/thirds/mpegts.js/mpegts.js +1 -1
  110. package/sdk/tinymce.js +57 -57
  111. package/src/components/Select.tsx +3 -6
  112. package/src/components/formula/Editor.tsx +51 -23
  113. package/src/components/formula/Picker.tsx +68 -12
  114. package/src/components/table/HeadCellFilter.tsx +4 -1
  115. package/src/components/table/HeadCellSort.tsx +1 -1
  116. package/src/components/table/index.tsx +66 -90
  117. package/src/locale/zh-CN.ts +1 -1
  118. package/src/renderers/Action.tsx +64 -19
  119. package/src/renderers/Breadcrumb.tsx +11 -12
  120. package/src/renderers/CRUD.tsx +2 -0
  121. package/src/renderers/Form/InputFormula.tsx +11 -3
  122. package/src/renderers/Form/InputTree.tsx +7 -0
  123. package/src/renderers/Form/Picker.tsx +11 -1
  124. package/src/renderers/Form/wrapControl.tsx +10 -10
  125. package/src/renderers/Service.tsx +0 -1
  126. package/src/renderers/Steps.tsx +5 -5
  127. package/src/renderers/Table/index.tsx +9 -7
  128. package/src/renderers/Table-v2/HeadCellSearchDropdown.tsx +14 -9
  129. package/src/renderers/Table-v2/index.tsx +130 -58
  130. package/src/renderers/Tabs.tsx +33 -3
  131. package/src/store/table-v2.ts +104 -7
  132. package/src/types.ts +2 -1
  133. package/src/utils/formula.ts +5 -3
@@ -25,6 +25,7 @@ import {evalExpression, filter} from '../../utils/tpl';
25
25
  import {isEffectiveApi} from '../../utils/api';
26
26
  import Checkbox from '../../components/Checkbox';
27
27
  import {BadgeSchema} from '../../components/Badge';
28
+ import {Icon} from '../../components/icons';
28
29
  import {TableStoreV2, ITableStore, IColumn, IRow} from '../../store/table-v2';
29
30
 
30
31
  import {HeadCellSearchDropDown} from './HeadCellSearchDropdown';
@@ -383,10 +384,8 @@ export default class TableRenderer extends React.Component<
383
384
 
384
385
  onSelect &&
385
386
  onSelect(
386
- null,
387
- false,
388
- store.selectedRowKeys.map(item => item),
389
- store.selectedRows.map(item => item.data)
387
+ store.selectedRows.map(item => item.data),
388
+ store.unSelectedRows.map(item => item.data)
390
389
  );
391
390
  }
392
391
 
@@ -431,11 +430,11 @@ export default class TableRenderer extends React.Component<
431
430
  // selectedRowKeysExpr比selectedRowKeys优先级高
432
431
  if (props.rowSelection && props.rowSelection.selectedRowKeysExpr) {
433
432
  rows.forEach((row: any, index: number) => {
434
- const flag = filter(props.rowSelection.selectedRowKeysExpr, {
433
+ const flag = evalExpression(props.rowSelection.selectedRowKeysExpr, {
435
434
  record: row,
436
435
  rowIndex: index
437
436
  });
438
- if (flag === 'true') {
437
+ if (flag) {
439
438
  selectedRowKeys.push(row[props?.rowSelection?.keyField || 'key']);
440
439
  }
441
440
  });
@@ -450,11 +449,11 @@ export default class TableRenderer extends React.Component<
450
449
  let expandedRowKeys: Array<string | number> = [];
451
450
  if (props.expandable && props.expandable.expandedRowKeysExpr) {
452
451
  rows.forEach((row: any, index: number) => {
453
- const flag = filter(props.expandable.expandedRowKeysExpr, {
452
+ const flag = evalExpression(props.expandable.expandedRowKeysExpr, {
454
453
  record: row,
455
454
  rowIndex: index
456
455
  });
457
- if (flag === 'true') {
456
+ if (flag) {
458
457
  expandedRowKeys.push(row[props?.expandable?.keyField || 'key']);
459
458
  }
460
459
  });
@@ -1019,19 +1018,16 @@ export default class TableRenderer extends React.Component<
1019
1018
 
1020
1019
  @autobind
1021
1020
  async handleSelected(
1022
- record: any,
1023
- value: boolean,
1024
1021
  selectedRows: Array<any>,
1025
- selectedRowKeys: Array<string | number>
1022
+ selectedRowKeys: Array<string | number>,
1023
+ unSelectedRows: Array<string | number>
1026
1024
  ) {
1027
1025
  const {dispatchEvent, data, rowSelection, onSelect, store} = this.props;
1028
1026
  const rendererEvent = await dispatchEvent(
1029
- 'selected',
1027
+ 'selectedChange',
1030
1028
  createObject(data, {
1031
- record,
1032
- value,
1033
- selectedRows,
1034
- selectedRowKeys
1029
+ selectedItems: selectedRows,
1030
+ unSelectedItems: unSelectedRows
1035
1031
  })
1036
1032
  );
1037
1033
 
@@ -1040,24 +1036,17 @@ export default class TableRenderer extends React.Component<
1040
1036
  }
1041
1037
 
1042
1038
  store.updateSelected(selectedRowKeys, rowSelection.keyField);
1043
- onSelect && onSelect(record, value, selectedRows, selectedRowKeys);
1039
+ onSelect && onSelect(selectedRows, unSelectedRows);
1044
1040
  }
1045
1041
 
1046
1042
  @autobind
1047
- async handleSelectedAll(
1048
- value: boolean,
1049
- selectedRowKeys: Array<string | number>,
1050
- selectedRows: Array<any>,
1051
- changeRows: Array<any>
1052
- ) {
1053
- const {dispatchEvent, data, rowSelection, onSelectAll, store} = this.props;
1043
+ async handleSort(payload: SortProps) {
1044
+ const {dispatchEvent, data, onSort} = this.props;
1054
1045
  const rendererEvent = await dispatchEvent(
1055
- 'selectedAll',
1046
+ 'columnSort',
1056
1047
  createObject(data, {
1057
- value,
1058
- selectedRowKeys,
1059
- selectedRows,
1060
- changeRows
1048
+ orderBy: payload.orderBy,
1049
+ orderDir: payload.order
1061
1050
  })
1062
1051
  );
1063
1052
 
@@ -1065,64 +1054,88 @@ export default class TableRenderer extends React.Component<
1065
1054
  return rendererEvent?.prevented;
1066
1055
  }
1067
1056
 
1068
- store.updateSelected(selectedRowKeys, rowSelection.keyField);
1069
- onSelectAll &&
1070
- onSelectAll(value, selectedRowKeys, selectedRows, selectedRowKeys);
1057
+ onSort && onSort(payload);
1071
1058
  }
1072
1059
 
1073
1060
  @autobind
1074
- async handleSort(payload: SortProps) {
1075
- const {dispatchEvent, data, onSort} = this.props;
1061
+ async handleFilter(payload: {
1062
+ filterName: string,
1063
+ filterValue: string
1064
+ }) {
1065
+ const {dispatchEvent, data, onFilter} = this.props;
1076
1066
  const rendererEvent = await dispatchEvent(
1077
- 'columnSort',
1078
- createObject(data, {
1079
- ...payload
1080
- })
1067
+ 'columnFilter',
1068
+ createObject(data, payload)
1081
1069
  );
1082
1070
 
1083
1071
  if (rendererEvent?.prevented) {
1084
1072
  return rendererEvent?.prevented;
1085
1073
  }
1086
1074
 
1087
- onSort && onSort(payload);
1075
+ onFilter && onFilter(payload);
1088
1076
  }
1089
1077
 
1090
1078
  @autobind
1091
- async handleFilter(payload: any) {
1092
- const {dispatchEvent, data, onFilter} = this.props;
1079
+ async handleRowClick(event: React.ChangeEvent<any>, rowItem: any, rowIndex?: number) {
1080
+ const {dispatchEvent, data, onRow} = this.props;
1081
+
1093
1082
  const rendererEvent = await dispatchEvent(
1094
- 'columnFilter',
1095
- createObject(data, {
1096
- payload
1097
- })
1083
+ 'rowClick',
1084
+ createObject(data, {rowItem})
1098
1085
  );
1099
1086
 
1100
1087
  if (rendererEvent?.prevented) {
1101
1088
  return rendererEvent?.prevented;
1102
1089
  }
1103
1090
 
1104
- onFilter && onFilter(payload);
1091
+ if (rowItem && onRow) {
1092
+ onRow.onRowClick && onRow.onRowClick(event, rowItem, rowIndex);
1093
+ }
1094
+ }
1095
+
1096
+ @autobind
1097
+ async handleOrderChange(oldIndex: number, newIndex: number, levels: Array<string>) {
1098
+ const {store} = this.props;
1099
+ const rowItem = store.getRowByIndex(oldIndex, levels);
1100
+
1101
+ store.exchange(oldIndex, newIndex, rowItem);
1105
1102
  }
1106
1103
 
1107
1104
  @autobind
1108
- async handleDragOver(dataSource: Array<any>) {
1109
- const {dispatchEvent, data, onDrag} = this.props;
1105
+ async handleSaveOrder() {
1106
+ const {store, onSaveOrder, data, dispatchEvent} = this.props;
1107
+
1108
+ const movedItems = store.movedRows.map(item => item.data);
1109
+ const items = store.rows.map(item => item.getDataWithModifiedChilden());
1110
+
1110
1111
  const rendererEvent = await dispatchEvent(
1111
- 'dragOver',
1112
- createObject(data, {
1113
- dataSource
1114
- })
1112
+ 'orderChange',
1113
+ createObject(data, {movedItems})
1115
1114
  );
1116
1115
 
1117
1116
  if (rendererEvent?.prevented) {
1118
- return rendererEvent?.prevented;
1117
+ return;
1118
+ }
1119
+
1120
+ if (!onSaveOrder || !store.movedRows.length) {
1121
+ return;
1119
1122
  }
1120
1123
 
1121
- onDrag && onDrag(dataSource);
1124
+ onSaveOrder(
1125
+ movedItems,
1126
+ items
1127
+ );
1128
+ }
1129
+
1130
+ @autobind
1131
+ reset() {
1132
+ const {store} = this.props;
1133
+
1134
+ store.reset();
1122
1135
  }
1123
1136
 
1124
1137
  doAction(action: Action, args: any, throwErrors: boolean): any {
1125
- const {store, rowSelection} = this.props;
1138
+ const {store, rowSelection, data} = this.props;
1126
1139
 
1127
1140
  const actionType = action?.actionType as string;
1128
1141
  const keyField = rowSelection?.keyField;
@@ -1135,7 +1148,15 @@ export default class TableRenderer extends React.Component<
1135
1148
  store.updateSelected([], keyField);
1136
1149
  break;
1137
1150
  case 'select':
1138
- store.updateSelected(args?.selectedRowKeys, keyField);
1151
+ const dataSource = store.getData(data);
1152
+ const selected: Array<any> = [];
1153
+ dataSource.items.forEach((item: any, rowIndex: number) => {
1154
+ const flag = evalExpression(args?.selectedRowKeysExpr, {record: item, rowIndex});
1155
+ if (flag) {
1156
+ selected.push(item[keyField]);
1157
+ }
1158
+ });
1159
+ store.updateSelected(selected, keyField);
1139
1160
  break;
1140
1161
  default:
1141
1162
  break;
@@ -1158,6 +1179,7 @@ export default class TableRenderer extends React.Component<
1158
1179
  placeholder,
1159
1180
  rowClassNameExpr,
1160
1181
  itemActions,
1182
+ onRow,
1161
1183
  store,
1162
1184
  ...rest
1163
1185
  } = this.props;
@@ -1310,23 +1332,73 @@ export default class TableRenderer extends React.Component<
1310
1332
  loading={this.renderSchema('loading', loading)}
1311
1333
  placeholder={this.renderSchema('placeholder', placeholder)}
1312
1334
  onSelect={this.handleSelected}
1313
- onSelectAll={this.handleSelectedAll}
1335
+ onSelectAll={this.handleSelected}
1314
1336
  onSort={this.handleSort}
1315
1337
  onFilter={this.handleFilter}
1316
- onDrag={this.handleDragOver}
1338
+ onDrag={this.handleOrderChange}
1317
1339
  itemActions={itemActionsConfig}
1340
+ onRow={{
1341
+ ...onRow,
1342
+ onRowClick: this.handleRowClick
1343
+ }}
1318
1344
  ></Table>
1319
1345
  );
1320
1346
  }
1321
1347
 
1348
+ renderHeading() {
1349
+ let {
1350
+ store,
1351
+ classnames: cx,
1352
+ headingClassName,
1353
+ translate: __
1354
+ } = this.props;
1355
+
1356
+ if (store.moved) {
1357
+ return (
1358
+ <div className={cx('Table-heading', headingClassName)} key="heading">
1359
+ {
1360
+ store.moved ? (
1361
+ <span>
1362
+ {__('Table.moved', {
1363
+ moved: store.moved
1364
+ })}
1365
+ <button
1366
+ type="button"
1367
+ className={cx('Button Button--xs Button--success m-l-sm')}
1368
+ onClick={this.handleSaveOrder}
1369
+ >
1370
+ <Icon icon="check" className="icon m-r-xs" />
1371
+ {__('Form.submit')}
1372
+ </button>
1373
+ <button
1374
+ type="button"
1375
+ className={cx('Button Button--xs Button--danger m-l-sm')}
1376
+ onClick={this.reset}
1377
+ >
1378
+ <Icon icon="close" className="icon m-r-xs" />
1379
+ {__('Table.discard')}
1380
+ </button>
1381
+ </span>
1382
+ ) : null
1383
+ }
1384
+ </div>
1385
+ );
1386
+ }
1387
+
1388
+ return null;
1389
+ }
1390
+
1322
1391
  render() {
1323
1392
  const {classnames: cx} = this.props;
1324
1393
 
1325
1394
  this.renderedToolbars = []; // 用来记录哪些 toolbar 已经渲染了
1395
+
1396
+ const heading = this.renderHeading();
1326
1397
 
1327
1398
  return (
1328
1399
  <div className={cx('Table-render-wrapper')}>
1329
1400
  {this.renderActions('header')}
1401
+ {heading}
1330
1402
  {this.renderTable()}
1331
1403
  </div>
1332
1404
  );
@@ -18,7 +18,8 @@ import {
18
18
  BaseSchema,
19
19
  SchemaClassName,
20
20
  SchemaCollection,
21
- SchemaIcon
21
+ SchemaIcon,
22
+ SchemaExpression
22
23
  } from '../Schema';
23
24
  import {ActionSchema} from './Action';
24
25
  import {filter} from '../utils/tpl';
@@ -194,11 +195,16 @@ export interface TabsSchema extends BaseSchema {
194
195
  * 自定义增加按钮文案
195
196
  */
196
197
  addBtnText?: string;
198
+
199
+ /**
200
+ * 默认激活的选项卡,hash值或索引值,支持使用表达式
201
+ */
202
+ activeKey?: SchemaExpression;
197
203
  }
198
204
 
199
205
  export interface TabsProps
200
206
  extends RendererProps,
201
- Omit<TabsSchema, 'className' | 'contentClassName'> {
207
+ Omit<TabsSchema, 'className' | 'contentClassName' | 'activeKey'> {
202
208
  activeKey?: string | number;
203
209
  location?: any;
204
210
  tabRender?: (tab: TabSchema, props: TabsProps, index: number) => JSX.Element;
@@ -327,6 +333,8 @@ export default class Tabs extends React.Component<TabsProps, TabsState> {
327
333
  componentDidUpdate(preProps: TabsProps, prevState: any) {
328
334
  const props = this.props;
329
335
  let localTabs = this.state.localTabs;
336
+ const prevActiveKey = tokenize(preProps.defaultActiveKey, preProps.data);
337
+ const activeKey = tokenize(props.defaultActiveKey, props.data);
330
338
 
331
339
  // 响应外部修改 tabs
332
340
  const isTabsModified = isObjectShallowModified(
@@ -409,6 +417,26 @@ export default class Tabs extends React.Component<TabsProps, TabsState> {
409
417
  prevKey: undefined,
410
418
  activeKey: (this.activeKey = activeKey)
411
419
  });
420
+ } else if (prevActiveKey !== activeKey) {
421
+ if (activeKey == null) {
422
+ return;
423
+ }
424
+
425
+ let newActivedKey = null;
426
+ const tab = find(localTabs, item => item.hash === activeKey);
427
+
428
+ if (tab) {
429
+ newActivedKey = tab.hash;
430
+ } else if (typeof activeKey === 'number' && localTabs[activeKey]) {
431
+ newActivedKey = activeKey;
432
+ }
433
+
434
+ if (newActivedKey) {
435
+ this.setState({
436
+ prevKey: prevActiveKey,
437
+ activeKey: (this.activeKey = newActivedKey)
438
+ });
439
+ }
412
440
  }
413
441
 
414
442
  this.autoJumpToNeighbour(this.activeKey);
@@ -578,7 +606,9 @@ export default class Tabs extends React.Component<TabsProps, TabsState> {
578
606
  }
579
607
  });
580
608
  // 获取激活元素项
581
- const tab = localTabs?.find((item, index) => key === (item.hash ? item.hash : index));
609
+ const tab = localTabs?.find(
610
+ (item, index) => key === (item.hash ? item.hash : index)
611
+ );
582
612
 
583
613
  const rendererEvent = await dispatchEvent(
584
614
  'change',
@@ -23,7 +23,8 @@ import {
23
23
  isObject,
24
24
  immutableExtends,
25
25
  isEmpty,
26
- extendObject
26
+ extendObject,
27
+ findTree
27
28
  } from '../utils/helper';
28
29
  import {normalizeApiResponseData} from '../utils/api';
29
30
  import {Api, Payload, fetchOptions, ApiObject} from '../types';
@@ -71,6 +72,7 @@ export const Row = types
71
72
  .model('Row', {
72
73
  storeType: 'Row',
73
74
  id: types.identifier,
75
+ parentId: '',
74
76
  key: types.string,
75
77
  pristine: types.frozen({} as any), // 原始数据
76
78
  data: types.frozen({} as any),
@@ -100,6 +102,10 @@ export const Row = types
100
102
  );
101
103
  },
102
104
 
105
+ get moved() {
106
+ return self.index !== self.newIndex;
107
+ },
108
+
103
109
  get locals(): any {
104
110
  let children: Array<any> | null = null;
105
111
  if (self.children.length) {
@@ -120,6 +126,20 @@ export const Row = types
120
126
  }
121
127
  : self.data
122
128
  );
129
+ },
130
+
131
+ getDataWithModifiedChilden() {
132
+ let data = {
133
+ ...self.data
134
+ };
135
+
136
+ if (data.children && self.children) {
137
+ data.children = self.children.map(item =>
138
+ item.getDataWithModifiedChilden()
139
+ );
140
+ }
141
+
142
+ return data;
123
143
  }
124
144
  }))
125
145
  .actions(self => ({
@@ -161,6 +181,10 @@ export const Row = types
161
181
  change(values: object, savePristine?: boolean) {
162
182
  self.data = immutableExtends(self.data, values);
163
183
  savePristine && (self.pristine = self.data);
184
+ },
185
+ reset() {
186
+ self.newIndex = self.index;
187
+ self.data = self.pristine;
164
188
  }
165
189
  }));
166
190
 
@@ -250,10 +274,26 @@ export const TableStoreV2 = ServiceStore.named('TableStoreV2')
250
274
  });
251
275
  }
252
276
 
277
+ function getRowByIndex(rowIndex: number, levels?: Array<string>): IRow {
278
+ if (levels && levels.length > 0) {
279
+ const index = +(levels.shift() || 0);
280
+ return getRowByIndex(index, levels);
281
+ }
282
+ return self.rows[rowIndex];
283
+ }
284
+
253
285
  function isSelected(row: IRow): boolean {
254
286
  return !!~self.selectedRows.indexOf(row);
255
287
  }
256
288
 
289
+ function getMovedRows() {
290
+ return flattenTree(self.rows).filter((item: IRow) => item.moved);
291
+ }
292
+
293
+ function getMoved() {
294
+ return getMovedRows().length;
295
+ }
296
+
257
297
  return {
258
298
  get toggable() {
259
299
  return getToggable();
@@ -287,6 +327,10 @@ export const TableStoreV2 = ServiceStore.named('TableStoreV2')
287
327
  return self.expandedRowKeys.map(item => item);
288
328
  },
289
329
 
330
+ get unSelectedRows() {
331
+ return getUnSelectedRows();
332
+ },
333
+
290
334
  // 是否隐藏了某列
291
335
  hasColumnHidden() {
292
336
  return hasColumnHidden();
@@ -294,7 +338,21 @@ export const TableStoreV2 = ServiceStore.named('TableStoreV2')
294
338
 
295
339
  getData,
296
340
 
297
- isSelected
341
+ getRowById(id: string) {
342
+ return findTree(self.rows, item => item.id === id);
343
+ },
344
+
345
+ isSelected,
346
+
347
+ getRowByIndex,
348
+
349
+ get moved() {
350
+ return getMoved();
351
+ },
352
+
353
+ get movedRows() {
354
+ return getMovedRows();
355
+ },
298
356
  };
299
357
  })
300
358
  .actions(self => {
@@ -333,6 +391,31 @@ export const TableStoreV2 = ServiceStore.named('TableStoreV2')
333
391
  }
334
392
  }
335
393
 
394
+ function exchange(fromIndex: number, toIndex: number, item?: IRow) {
395
+ item = item || self.rows[fromIndex];
396
+
397
+ if (item.parentId) {
398
+ const parent: IRow = self.getRowById(item.parentId) as any;
399
+ const offset = parent.children.indexOf(item) - fromIndex;
400
+ toIndex += offset;
401
+ fromIndex += offset;
402
+
403
+ const newRows = parent.children.concat();
404
+ newRows.splice(fromIndex, 1);
405
+ newRows.splice(toIndex, 0, item);
406
+ newRows.forEach((item, index) => (item.newIndex = index));
407
+ parent.children.replace(newRows);
408
+ return;
409
+ }
410
+
411
+ const newRows = self.rows.concat();
412
+ newRows.splice(fromIndex, 1);
413
+ newRows.splice(toIndex, 0, item);
414
+
415
+ newRows.forEach((item, index) => (item.newIndex = index));
416
+ self.rows.replace(newRows);
417
+ }
418
+
336
419
  function persistSaveToggledColumns() {
337
420
  const key =
338
421
  location.pathname +
@@ -600,6 +683,22 @@ export const TableStoreV2 = ServiceStore.named('TableStoreV2')
600
683
  }
601
684
  });
602
685
 
686
+ function reset() {
687
+ self.rows.forEach(item => item.reset());
688
+ let rows = self.rows.concat();
689
+ eachTree(rows, item => {
690
+ if (item.children) {
691
+ let rows = item.children.concat().sort((a, b) => a.index - b.index);
692
+ rows.forEach(item => item.reset());
693
+ item.children.replace(rows);
694
+ }
695
+ });
696
+ rows.forEach(item => item.reset());
697
+ rows = rows.sort((a, b) => a.index - b.index);
698
+ self.rows.replace(rows);
699
+ self.dragging = false;
700
+ }
701
+
603
702
  return {
604
703
  update,
605
704
  persistSaveToggledColumns,
@@ -609,6 +708,8 @@ export const TableStoreV2 = ServiceStore.named('TableStoreV2')
609
708
  updateSelected,
610
709
  updateSelectedAll,
611
710
  updateExpanded,
711
+ exchange,
712
+ reset,
612
713
 
613
714
  // events
614
715
  afterCreate() {
@@ -631,11 +732,7 @@ export const TableStoreV2 = ServiceStore.named('TableStoreV2')
631
732
  }
632
733
  }, 200);
633
734
  },
634
- saveRemote,
635
-
636
- getRowByIndex(rowIndex: number) {
637
- return self.rows[rowIndex];
638
- }
735
+ saveRemote
639
736
  };
640
737
  });
641
738
 
package/src/types.ts CHANGED
@@ -113,7 +113,8 @@ export interface Action extends Button {
113
113
  | 'collapse'
114
114
  | 'step-submit'
115
115
  | 'selectAll'
116
- | 'changeTabKey';
116
+ | 'changeTabKey'
117
+ | 'click';
117
118
  api?: Api;
118
119
  asyncApi?: Api;
119
120
  payload?: any;
@@ -210,12 +210,14 @@ export function registerFormulaExec(execMode: string, formulaExec: Function) {
210
210
 
211
211
  // 用于判断是否优先使用value。
212
212
  export function isExpression(expression: any): boolean {
213
- if (!isString(expression)) {
213
+ if (!expression || !isString(expression)) {
214
214
  // 非字符串类型,比如:Object、Array类型、boolean、number类型
215
215
  return false;
216
216
  }
217
- // 备注: "\\${xxx}"不作为表达式,至少含一个${xxx}才算是表达式
218
- return /(?<!\\)(\${).+(\})/.test(expression);
217
+ // 备注1: "\\${xxx}"不作为表达式,至少含一个${xxx}才算是表达式
218
+
219
+ // 备注2: safari 不支持 /(?<!\\)(\${).+(\})/.test(expression)
220
+ return /(^|[^\\])\$\{.+\}/.test(expression);
219
221
  }
220
222
 
221
223
  // 用于判断是否需要执行表达式: