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.
- package/README.md +2 -1
- package/lib/RootRenderer.js +4 -1
- package/lib/RootRenderer.js.map +2 -2
- package/lib/components/Badge.d.ts +13 -1
- package/lib/components/Badge.js +16 -2
- package/lib/components/Badge.js.map +2 -2
- package/lib/components/Checkbox.d.ts +1 -1
- package/lib/components/Checkbox.js +1 -1
- package/lib/components/Checkbox.js.map +2 -2
- package/lib/components/Drawer.js +1 -1
- package/lib/components/Drawer.js.map +2 -2
- package/lib/components/Modal.js +1 -1
- package/lib/components/Modal.js.map +2 -2
- package/lib/components/RichText.d.ts +0 -3
- package/lib/components/RichText.js +1 -22
- package/lib/components/RichText.js.map +2 -2
- package/lib/components/Select.d.ts +7 -0
- package/lib/components/Select.js.map +2 -2
- package/lib/components/Steps.d.ts +3 -3
- package/lib/components/Steps.js.map +1 -1
- package/lib/components/WithRemoteConfig.d.ts +8 -0
- package/lib/components/WithRemoteConfig.js +28 -2
- package/lib/components/WithRemoteConfig.js.map +2 -2
- package/lib/components/condition-builder/Field.js +0 -1
- package/lib/components/condition-builder/Field.js.map +2 -2
- package/lib/components/condition-builder/Value.js +2 -1
- package/lib/components/condition-builder/Value.js.map +2 -2
- package/lib/components/condition-builder/types.d.ts +5 -0
- package/lib/components/condition-builder/types.js.map +1 -1
- package/lib/env.d.ts +1 -1
- package/lib/env.js.map +1 -1
- package/lib/factory.d.ts +6 -2
- package/lib/factory.js +9 -4
- package/lib/factory.js.map +2 -2
- package/lib/index.d.ts +1 -0
- package/lib/index.js +2 -1
- package/lib/index.js.map +2 -2
- package/lib/locale/de-DE.js +1 -0
- package/lib/locale/de-DE.js.map +2 -2
- package/lib/locale/en-US.js +2 -1
- package/lib/locale/en-US.js.map +2 -2
- package/lib/locale/zh-CN.js +2 -1
- package/lib/locale/zh-CN.js.map +2 -2
- package/lib/renderers/Action.d.ts +6 -0
- package/lib/renderers/Action.js +9 -1
- package/lib/renderers/Action.js.map +2 -2
- package/lib/renderers/CRUD.d.ts +2 -2
- package/lib/renderers/CRUD.js +13 -21
- package/lib/renderers/CRUD.js.map +2 -2
- package/lib/renderers/Card.js +11 -11
- package/lib/renderers/Card.js.map +2 -2
- package/lib/renderers/Collapse.d.ts +1 -1
- package/lib/renderers/Collapse.js +5 -1
- package/lib/renderers/Collapse.js.map +2 -2
- package/lib/renderers/Copyable.js +30 -28
- package/lib/renderers/Copyable.js.map +2 -2
- package/lib/renderers/Dialog.d.ts +0 -252
- package/lib/renderers/Dialog.js +3 -2
- package/lib/renderers/Dialog.js.map +2 -2
- package/lib/renderers/Drawer.js +2 -1
- package/lib/renderers/Drawer.js.map +2 -2
- package/lib/renderers/DropDownButton.d.ts +4 -0
- package/lib/renderers/DropDownButton.js +2 -2
- package/lib/renderers/DropDownButton.js.map +2 -2
- package/lib/renderers/Form/ButtonGroupSelect.js +3 -0
- package/lib/renderers/Form/ButtonGroupSelect.js.map +2 -2
- package/lib/renderers/Form/Combo.d.ts +2 -0
- package/lib/renderers/Form/Combo.js +16 -1
- package/lib/renderers/Form/Combo.js.map +2 -2
- package/lib/renderers/Form/DiffEditor.d.ts +0 -2
- package/lib/renderers/Form/Editor.d.ts +0 -2
- package/lib/renderers/Form/Editor.js +1 -1
- package/lib/renderers/Form/Editor.js.map +2 -2
- package/lib/renderers/Form/InputExcel.d.ts +5 -0
- package/lib/renderers/Form/InputExcel.js +24 -3
- package/lib/renderers/Form/InputExcel.js.map +2 -2
- package/lib/renderers/Form/InputImage.d.ts +8 -0
- package/lib/renderers/Form/InputImage.js +2 -1
- package/lib/renderers/Form/InputImage.js.map +2 -2
- package/lib/renderers/Form/InputNumber.d.ts +19 -5
- package/lib/renderers/Form/InputNumber.js +69 -7
- package/lib/renderers/Form/InputNumber.js.map +2 -2
- package/lib/renderers/Form/InputRange.js +7 -2
- package/lib/renderers/Form/InputRange.js.map +2 -2
- package/lib/renderers/Form/InputTable.d.ts +23 -5
- package/lib/renderers/Form/InputTable.js +32 -3
- package/lib/renderers/Form/InputTable.js.map +2 -2
- package/lib/renderers/Form/NestedSelect.js +2 -3
- package/lib/renderers/Form/NestedSelect.js.map +2 -2
- package/lib/renderers/Form/Options.js +3 -1
- package/lib/renderers/Form/Options.js.map +2 -2
- package/lib/renderers/Form/index.js +0 -10
- package/lib/renderers/Form/index.js.map +2 -2
- package/lib/renderers/Form/wrapControl.js +3 -3
- package/lib/renderers/Form/wrapControl.js.map +2 -2
- package/lib/renderers/Json.js +5 -1
- package/lib/renderers/Json.js.map +2 -2
- package/lib/renderers/List.d.ts +5 -0
- package/lib/renderers/List.js +20 -14
- package/lib/renderers/List.js.map +2 -2
- package/lib/renderers/Page.d.ts +6 -0
- package/lib/renderers/Page.js +10 -2
- package/lib/renderers/Page.js.map +2 -2
- package/lib/renderers/Service.d.ts +10 -1
- package/lib/renderers/Service.js +85 -3
- package/lib/renderers/Service.js.map +2 -2
- package/lib/renderers/Steps.d.ts +4 -4
- package/lib/renderers/Steps.js +5 -2
- package/lib/renderers/Steps.js.map +2 -2
- package/lib/renderers/Table/TableBody.d.ts +5 -3
- package/lib/renderers/Table/TableBody.js +17 -11
- package/lib/renderers/Table/TableBody.js.map +2 -2
- package/lib/renderers/Table/TableCell.js +6 -2
- package/lib/renderers/Table/TableCell.js.map +2 -2
- package/lib/renderers/Table/TableContent.d.ts +3 -1
- package/lib/renderers/Table/TableContent.js +6 -2
- package/lib/renderers/Table/TableContent.js.map +2 -2
- package/lib/renderers/Table/TableRow.d.ts +1 -1
- package/lib/renderers/Table/TableRow.js +14 -13
- package/lib/renderers/Table/TableRow.js.map +2 -2
- package/lib/renderers/Table/index.d.ts +28 -3
- package/lib/renderers/Table/index.js +97 -54
- package/lib/renderers/Table/index.js.map +2 -2
- package/lib/schemaExtend.d.ts +1 -0
- package/lib/schemaExtend.js +59 -0
- package/lib/schemaExtend.js.map +13 -0
- package/lib/store/app.d.ts +0 -1
- package/lib/store/combo.d.ts +0 -2
- package/lib/store/crud.d.ts +3 -3
- package/lib/store/crud.js +41 -36
- package/lib/store/crud.js.map +2 -2
- package/lib/store/form.d.ts +0 -1
- package/lib/store/formItem.js +10 -6
- package/lib/store/formItem.js.map +2 -2
- package/lib/store/modal.d.ts +1 -1
- package/lib/store/modal.js +4 -0
- package/lib/store/modal.js.map +2 -2
- package/lib/store/root.d.ts +0 -1
- package/lib/store/service.d.ts +0 -1
- package/lib/store/service.js +0 -13
- package/lib/store/service.js.map +2 -2
- package/lib/store/table.d.ts +1 -2
- package/lib/store/table.js +44 -3
- package/lib/store/table.js.map +2 -2
- package/lib/themes/ang-ie11.css +278 -17
- package/lib/themes/ang.css +278 -17
- package/lib/themes/ang.css.map +1 -1
- package/lib/themes/antd-ie11.css +278 -17
- package/lib/themes/antd.css +278 -17
- package/lib/themes/antd.css.map +1 -1
- package/lib/themes/cxd-ie11.css +278 -17
- package/lib/themes/cxd.css +278 -17
- package/lib/themes/cxd.css.map +1 -1
- package/lib/themes/dark-ie11.css +278 -17
- package/lib/themes/dark.css +278 -17
- package/lib/themes/dark.css.map +1 -1
- package/lib/themes/default.css +278 -17
- package/lib/themes/default.css.map +1 -1
- package/lib/utils/api.js +12 -0
- package/lib/utils/api.js.map +2 -2
- package/lib/utils/attachmentAdpator.d.ts +7 -0
- package/lib/utils/attachmentAdpator.js +82 -0
- package/lib/utils/attachmentAdpator.js.map +13 -0
- package/lib/utils/helper.d.ts +2 -0
- package/lib/utils/helper.js +14 -1
- package/lib/utils/helper.js.map +2 -2
- package/lib/utils/resize-sensor.js +6 -0
- package/lib/utils/resize-sensor.js.map +2 -2
- package/lib/utils/tpl-builtin.d.ts +1 -0
- package/lib/utils/tpl-builtin.js +24 -8
- package/lib/utils/tpl-builtin.js.map +2 -2
- package/lib/utils/validations.js +62 -5
- package/lib/utils/validations.js.map +2 -2
- package/package.json +1 -1
- package/schema.json +369 -164
- package/scss/_properties.scss +6 -0
- package/scss/components/_badge.scss +15 -1
- package/scss/components/_list.scss +8 -0
- package/scss/components/_markdown.scss +266 -0
- package/scss/components/_spinner.scss +6 -2
- package/scss/components/_table.scss +4 -0
- package/scss/components/form/_form.scss +3 -17
- package/scss/components/form/_group.scss +4 -0
- package/scss/components/form/_nested-select.scss +4 -0
- package/scss/components/form/_number.scss +12 -1
- package/scss/themes/_common.scss +1 -0
- package/sdk/ang-ie11.css +324 -20
- package/sdk/ang.css +330 -20
- package/sdk/antd-ie11.css +324 -20
- package/sdk/antd.css +330 -20
- package/sdk/charts.js +15 -15
- package/sdk/color-picker.js +65 -69
- package/sdk/cropperjs.js +2 -2
- package/sdk/cxd-ie11.css +324 -20
- package/sdk/cxd.css +330 -20
- package/sdk/dark-ie11.css +324 -20
- package/sdk/dark.css +330 -20
- package/sdk/exceljs.js +1 -1
- package/sdk/locale/de-DE.js +1 -0
- package/sdk/markdown.js +69 -69
- package/sdk/papaparse.js +1 -1
- package/sdk/renderers/Form/CityDB.js +1 -1
- package/sdk/rest.js +27 -23
- package/sdk/rich-text.js +63 -63
- package/sdk/sdk-ie11.css +324 -20
- package/sdk/sdk.css +330 -20
- package/sdk/sdk.js +1146 -1138
- package/sdk/thirds/hls.js/hls.js +1 -1
- package/sdk/thirds/mpegts.js/mpegts.js +1 -1
- package/sdk/tinymce.js +57 -57
- package/src/RootRenderer.tsx +8 -3
- package/src/components/Badge.tsx +41 -6
- package/src/components/Checkbox.tsx +5 -2
- package/src/components/Drawer.tsx +3 -2
- package/src/components/Modal.tsx +3 -2
- package/src/components/RichText.tsx +2 -27
- package/src/components/Select.tsx +1 -0
- package/src/components/Steps.tsx +3 -3
- package/src/components/WithRemoteConfig.tsx +37 -2
- package/src/components/condition-builder/Field.tsx +1 -2
- package/src/components/condition-builder/Value.tsx +3 -0
- package/src/components/condition-builder/types.ts +6 -0
- package/src/env.tsx +1 -1
- package/src/factory.tsx +14 -4
- package/src/index.tsx +2 -0
- package/src/locale/de-DE.ts +1 -0
- package/src/locale/en-US.ts +2 -1
- package/src/locale/zh-CN.ts +2 -1
- package/src/renderers/Action.tsx +19 -1
- package/src/renderers/CRUD.tsx +15 -34
- package/src/renderers/Card.tsx +21 -15
- package/src/renderers/Collapse.tsx +5 -1
- package/src/renderers/Copyable.tsx +46 -44
- package/src/renderers/Dialog.tsx +3 -2
- package/src/renderers/Drawer.tsx +2 -1
- package/src/renderers/DropDownButton.tsx +8 -0
- package/src/renderers/Form/ButtonGroupSelect.tsx +3 -0
- package/src/renderers/Form/Combo.tsx +7 -0
- package/src/renderers/Form/Editor.tsx +19 -20
- package/src/renderers/Form/InputExcel.tsx +28 -3
- package/src/renderers/Form/InputImage.tsx +23 -8
- package/src/renderers/Form/InputNumber.tsx +113 -18
- package/src/renderers/Form/InputRange.tsx +5 -2
- package/src/renderers/Form/InputTable.tsx +88 -9
- package/src/renderers/Form/NestedSelect.tsx +1 -1
- package/src/renderers/Form/Options.tsx +3 -1
- package/src/renderers/Form/index.tsx +0 -15
- package/src/renderers/Form/wrapControl.tsx +2 -2
- package/src/renderers/Json.tsx +10 -1
- package/src/renderers/List.tsx +32 -19
- package/src/renderers/Page.tsx +19 -0
- package/src/renderers/Service.tsx +101 -3
- package/src/renderers/Steps.tsx +12 -9
- package/src/renderers/Table/TableBody.tsx +29 -10
- package/src/renderers/Table/TableCell.tsx +15 -1
- package/src/renderers/Table/TableContent.tsx +7 -1
- package/src/renderers/Table/TableRow.tsx +18 -17
- package/src/renderers/Table/index.tsx +117 -28
- package/src/schemaExtend.ts +66 -0
- package/src/store/crud.ts +34 -38
- package/src/store/formItem.ts +10 -6
- package/src/store/modal.ts +4 -0
- package/src/store/service.ts +0 -19
- package/src/store/table.ts +48 -0
- package/src/utils/api.ts +11 -0
- package/src/utils/attachmentAdpator.ts +90 -0
- package/src/utils/helper.ts +15 -0
- package/src/utils/resize-sensor.ts +7 -0
- package/src/utils/tpl-builtin.ts +36 -17
- package/src/utils/validations.ts +80 -12
@@ -35,6 +35,7 @@ import {HeadCellSearchDropDown} from './HeadCellSearchDropdown';
|
|
35
35
|
import {TableContent} from './TableContent';
|
36
36
|
import {
|
37
37
|
BaseSchema,
|
38
|
+
SchemaApi,
|
38
39
|
SchemaClassName,
|
39
40
|
SchemaObject,
|
40
41
|
SchemaTokenizeableString,
|
@@ -109,6 +110,26 @@ export type TableColumnObject = {
|
|
109
110
|
*/
|
110
111
|
width?: number | string;
|
111
112
|
|
113
|
+
/**
|
114
|
+
* 列对齐方式
|
115
|
+
*/
|
116
|
+
align?: 'left' | 'right' | 'center' | 'justify';
|
117
|
+
|
118
|
+
/**
|
119
|
+
* 列样式表
|
120
|
+
*/
|
121
|
+
className?: string;
|
122
|
+
|
123
|
+
/**
|
124
|
+
* 单元格样式表达式
|
125
|
+
*/
|
126
|
+
classNameExpr?: string;
|
127
|
+
|
128
|
+
/**
|
129
|
+
* 列头样式表
|
130
|
+
*/
|
131
|
+
labelClassName?: string;
|
132
|
+
|
112
133
|
/**
|
113
134
|
* todo
|
114
135
|
*/
|
@@ -252,6 +273,11 @@ export interface TableSchema extends BaseSchema {
|
|
252
273
|
* 是否可调整列宽
|
253
274
|
*/
|
254
275
|
resizable?: boolean;
|
276
|
+
|
277
|
+
/**
|
278
|
+
* 行样式表表达式
|
279
|
+
*/
|
280
|
+
rowClassNameExpr?: string;
|
255
281
|
}
|
256
282
|
|
257
283
|
export interface TableProps extends RendererProps {
|
@@ -321,6 +347,12 @@ export interface TableProps extends RendererProps {
|
|
321
347
|
reUseRow?: boolean;
|
322
348
|
}
|
323
349
|
|
350
|
+
type ExportExcelToolbar = SchemaNode & {
|
351
|
+
api?: SchemaApi;
|
352
|
+
columns?: string[];
|
353
|
+
filename?: string;
|
354
|
+
};
|
355
|
+
|
324
356
|
/**
|
325
357
|
* 将 url 转成绝对地址
|
326
358
|
*/
|
@@ -359,6 +391,7 @@ export default class Table extends React.Component<TableProps, object> {
|
|
359
391
|
'itemDraggableOn',
|
360
392
|
'checkOnItemClick',
|
361
393
|
'hideCheckToggler',
|
394
|
+
'itemAction',
|
362
395
|
'itemActions',
|
363
396
|
'combineNum',
|
364
397
|
'combineFromIndex',
|
@@ -656,8 +689,14 @@ export default class Table extends React.Component<TableProps, object> {
|
|
656
689
|
onAction(e, action, ctx);
|
657
690
|
}
|
658
691
|
|
659
|
-
handleCheck(item: IRow) {
|
660
|
-
|
692
|
+
handleCheck(item: IRow, value: boolean, shift?: boolean) {
|
693
|
+
const {store} = this.props;
|
694
|
+
if (shift) {
|
695
|
+
store.toggleShift(item);
|
696
|
+
} else {
|
697
|
+
item.toggle();
|
698
|
+
}
|
699
|
+
|
661
700
|
this.syncSelected();
|
662
701
|
}
|
663
702
|
|
@@ -1316,12 +1355,16 @@ export default class Table extends React.Component<TableProps, object> {
|
|
1316
1355
|
classnames: cx,
|
1317
1356
|
saveImmediately,
|
1318
1357
|
headingClassName,
|
1358
|
+
quickSaveApi,
|
1319
1359
|
translate: __
|
1320
1360
|
} = this.props;
|
1321
1361
|
|
1322
1362
|
if (
|
1323
1363
|
title ||
|
1324
|
-
(
|
1364
|
+
(quickSaveApi &&
|
1365
|
+
!saveImmediately &&
|
1366
|
+
store.modified &&
|
1367
|
+
!hideQuickSaveBtn) ||
|
1325
1368
|
store.moved
|
1326
1369
|
) {
|
1327
1370
|
return (
|
@@ -1527,6 +1570,11 @@ export default class Table extends React.Component<TableProps, object> {
|
|
1527
1570
|
props.style.width = column.pristine.width;
|
1528
1571
|
}
|
1529
1572
|
|
1573
|
+
if (column.pristine.align) {
|
1574
|
+
props.style = props.style || {};
|
1575
|
+
props.style.textAlign = column.pristine.align;
|
1576
|
+
}
|
1577
|
+
|
1530
1578
|
const resizeLine = (
|
1531
1579
|
<div
|
1532
1580
|
className={cx('Table-content-colDragLine')}
|
@@ -1538,18 +1586,20 @@ export default class Table extends React.Component<TableProps, object> {
|
|
1538
1586
|
return (
|
1539
1587
|
<th
|
1540
1588
|
{...props}
|
1541
|
-
className={cx(
|
1542
|
-
|
1543
|
-
column.
|
1544
|
-
|
1545
|
-
|
1546
|
-
|
1547
|
-
'TableCell--filterable': column.filterable,
|
1548
|
-
'Table-operationCell': column.type === 'operation'
|
1549
|
-
}
|
1550
|
-
)}
|
1589
|
+
className={cx(props ? (props as any).className : '', {
|
1590
|
+
'TableCell--sortable': column.sortable,
|
1591
|
+
'TableCell--searchable': column.searchable,
|
1592
|
+
'TableCell--filterable': column.filterable,
|
1593
|
+
'Table-operationCell': column.type === 'operation'
|
1594
|
+
})}
|
1551
1595
|
>
|
1552
|
-
<div
|
1596
|
+
<div
|
1597
|
+
className={cx(
|
1598
|
+
`${ns}TableCell--title`,
|
1599
|
+
column.pristine.className,
|
1600
|
+
column.pristine.labelClassName
|
1601
|
+
)}
|
1602
|
+
>
|
1553
1603
|
{column.label ? render('tpl', column.label) : null}
|
1554
1604
|
|
1555
1605
|
{column.remark
|
@@ -1778,7 +1828,8 @@ export default class Table extends React.Component<TableProps, object> {
|
|
1778
1828
|
checkOnItemClick,
|
1779
1829
|
buildItemProps,
|
1780
1830
|
rowClassNameExpr,
|
1781
|
-
rowClassName
|
1831
|
+
rowClassName,
|
1832
|
+
itemAction
|
1782
1833
|
} = this.props;
|
1783
1834
|
const hideHeader = store.filteredColumns.every(column => !column.label);
|
1784
1835
|
const columnsGroup = store.columnGroup;
|
@@ -1839,6 +1890,7 @@ export default class Table extends React.Component<TableProps, object> {
|
|
1839
1890
|
store.combineNum > 0 ? 'Table-table--withCombine' : '',
|
1840
1891
|
tableClassName
|
1841
1892
|
)}
|
1893
|
+
itemAction={itemAction}
|
1842
1894
|
classnames={cx}
|
1843
1895
|
render={render}
|
1844
1896
|
renderCell={this.renderCell}
|
@@ -1965,7 +2017,7 @@ export default class Table extends React.Component<TableProps, object> {
|
|
1965
2017
|
);
|
1966
2018
|
}
|
1967
2019
|
|
1968
|
-
renderExportExcel(toolbar:
|
2020
|
+
renderExportExcel(toolbar: ExportExcelToolbar) {
|
1969
2021
|
const {
|
1970
2022
|
store,
|
1971
2023
|
env,
|
@@ -1989,8 +2041,8 @@ export default class Table extends React.Component<TableProps, object> {
|
|
1989
2041
|
let tmpStore;
|
1990
2042
|
let filename = 'data';
|
1991
2043
|
// 支持配置 api 远程获取
|
1992
|
-
if (typeof toolbar === 'object' &&
|
1993
|
-
const res = await env.fetcher(
|
2044
|
+
if (typeof toolbar === 'object' && toolbar.api) {
|
2045
|
+
const res = await env.fetcher(toolbar.api, data);
|
1994
2046
|
if (!res.data) {
|
1995
2047
|
env.notify('warning', __('placeholder.noData'));
|
1996
2048
|
return;
|
@@ -2008,8 +2060,8 @@ export default class Table extends React.Component<TableProps, object> {
|
|
2008
2060
|
rows = store.rows;
|
2009
2061
|
}
|
2010
2062
|
|
2011
|
-
if (typeof toolbar === 'object' &&
|
2012
|
-
filename = filter(
|
2063
|
+
if (typeof toolbar === 'object' && toolbar.filename) {
|
2064
|
+
filename = filter(toolbar.filename, data, '| raw');
|
2013
2065
|
}
|
2014
2066
|
|
2015
2067
|
if (rows.length === 0) {
|
@@ -2023,7 +2075,17 @@ export default class Table extends React.Component<TableProps, object> {
|
|
2023
2075
|
});
|
2024
2076
|
worksheet.views = [{state: 'frozen', xSplit: 0, ySplit: 1}];
|
2025
2077
|
|
2026
|
-
const
|
2078
|
+
const filteredColumns = toolbar.columns
|
2079
|
+
? columns.filter(column => {
|
2080
|
+
const filterColumnsNames = toolbar.columns!;
|
2081
|
+
if (filterColumnsNames.indexOf(column.name) !== -1) {
|
2082
|
+
return true;
|
2083
|
+
}
|
2084
|
+
return false;
|
2085
|
+
})
|
2086
|
+
: columns;
|
2087
|
+
|
2088
|
+
const firstRowLabels = filteredColumns.map(column => {
|
2027
2089
|
return column.label;
|
2028
2090
|
});
|
2029
2091
|
const firstRow = worksheet.getRow(1);
|
@@ -2038,14 +2100,15 @@ export default class Table extends React.Component<TableProps, object> {
|
|
2038
2100
|
column: firstRowLabels.length
|
2039
2101
|
}
|
2040
2102
|
};
|
2103
|
+
// 用于 mapping source 的情况
|
2104
|
+
const remoteMappingCache: any = {};
|
2041
2105
|
// 数据从第二行开始
|
2042
2106
|
let rowIndex = 1;
|
2043
2107
|
for (const row of rows) {
|
2044
2108
|
rowIndex += 1;
|
2045
2109
|
const sheetRow = worksheet.getRow(rowIndex);
|
2046
2110
|
let columIndex = 0;
|
2047
|
-
const
|
2048
|
-
for (const column of cols) {
|
2111
|
+
for (const column of filteredColumns) {
|
2049
2112
|
columIndex += 1;
|
2050
2113
|
const name = column.name!;
|
2051
2114
|
const value = getVariable(row.data, name);
|
@@ -2071,7 +2134,7 @@ export default class Table extends React.Component<TableProps, object> {
|
|
2071
2134
|
}
|
2072
2135
|
|
2073
2136
|
const type = (column as BaseSchema).type || 'plain';
|
2074
|
-
if (type === 'image') {
|
2137
|
+
if (type === 'image' && value) {
|
2075
2138
|
try {
|
2076
2139
|
const imageData = await toDataURL(value);
|
2077
2140
|
const imageDimensions = await getImageDimensions(imageData);
|
@@ -2131,7 +2194,30 @@ export default class Table extends React.Component<TableProps, object> {
|
|
2131
2194
|
};
|
2132
2195
|
} else if (type === 'mapping') {
|
2133
2196
|
// 拷贝自 Mapping.tsx
|
2134
|
-
|
2197
|
+
let map = (column as MappingSchema).map;
|
2198
|
+
const source = (column as MappingSchema).source;
|
2199
|
+
if (source) {
|
2200
|
+
let sourceValue = source;
|
2201
|
+
if (isPureVariable(source)) {
|
2202
|
+
sourceValue = resolveVariableAndFilter(
|
2203
|
+
source as string,
|
2204
|
+
data,
|
2205
|
+
'| raw'
|
2206
|
+
);
|
2207
|
+
}
|
2208
|
+
|
2209
|
+
const mapKey = JSON.stringify(source);
|
2210
|
+
if (mapKey in remoteMappingCache) {
|
2211
|
+
map = remoteMappingCache[mapKey];
|
2212
|
+
} else {
|
2213
|
+
const res = await env.fetcher(sourceValue, data);
|
2214
|
+
if (res.data) {
|
2215
|
+
remoteMappingCache[mapKey] = res.data;
|
2216
|
+
map = res.data;
|
2217
|
+
}
|
2218
|
+
}
|
2219
|
+
}
|
2220
|
+
|
2135
2221
|
if (
|
2136
2222
|
typeof value !== 'undefined' &&
|
2137
2223
|
map &&
|
@@ -2144,9 +2230,10 @@ export default class Table extends React.Component<TableProps, object> {
|
|
2144
2230
|
: value === false && map['0']
|
2145
2231
|
? map['0']
|
2146
2232
|
: map['*']); // 兼容平台旧用法:即 value 为 true 时映射 1 ,为 false 时映射 0
|
2147
|
-
sheetRow.getCell(columIndex).value =
|
2233
|
+
sheetRow.getCell(columIndex).value =
|
2234
|
+
removeHTMLTag(viewValue);
|
2148
2235
|
} else {
|
2149
|
-
sheetRow.getCell(columIndex).value = value;
|
2236
|
+
sheetRow.getCell(columIndex).value = removeHTMLTag(value);
|
2150
2237
|
}
|
2151
2238
|
} else {
|
2152
2239
|
if ((column as TplSchema).tpl) {
|
@@ -2419,7 +2506,8 @@ export default class Table extends React.Component<TableProps, object> {
|
|
2419
2506
|
prefixRow,
|
2420
2507
|
locale,
|
2421
2508
|
affixRow,
|
2422
|
-
translate
|
2509
|
+
translate,
|
2510
|
+
itemAction
|
2423
2511
|
} = this.props;
|
2424
2512
|
|
2425
2513
|
// 理论上来说 store.rows 应该也行啊
|
@@ -2432,6 +2520,7 @@ export default class Table extends React.Component<TableProps, object> {
|
|
2432
2520
|
store.combineNum > 0 ? 'Table-table--withCombine' : '',
|
2433
2521
|
tableClassName
|
2434
2522
|
)}
|
2523
|
+
itemAction={itemAction}
|
2435
2524
|
classnames={cx}
|
2436
2525
|
columns={store.filteredColumns}
|
2437
2526
|
columnsGroup={store.columnGroup}
|
@@ -0,0 +1,66 @@
|
|
1
|
+
/**
|
2
|
+
* 扩展 Schema,目前用于实现 input-kv
|
3
|
+
*/
|
4
|
+
import {Schema} from './types';
|
5
|
+
import {addSchemaFilter} from './factory';
|
6
|
+
import {isObject} from './utils/helper';
|
7
|
+
|
8
|
+
// input-kv 实际上是 combo 的一种扩展
|
9
|
+
addSchemaFilter(function (schema: Schema, renderer, props?: any) {
|
10
|
+
if (schema && schema.type === 'input-kv') {
|
11
|
+
return {
|
12
|
+
...schema,
|
13
|
+
multiple: true,
|
14
|
+
pipeIn: (value: any) => {
|
15
|
+
if (!isObject(value)) {
|
16
|
+
return [];
|
17
|
+
}
|
18
|
+
const arr: Array<any> = [];
|
19
|
+
Object.keys(value).forEach(key => {
|
20
|
+
const valueType = typeof value[key];
|
21
|
+
arr.push({
|
22
|
+
key: key || '',
|
23
|
+
value:
|
24
|
+
valueType === 'string' ||
|
25
|
+
valueType === 'number' ||
|
26
|
+
valueType === 'boolean'
|
27
|
+
? value[key]
|
28
|
+
: JSON.stringify(value[key])
|
29
|
+
});
|
30
|
+
});
|
31
|
+
return arr;
|
32
|
+
},
|
33
|
+
pipeOut: (value: any) => {
|
34
|
+
if (!Array.isArray(value)) {
|
35
|
+
return value;
|
36
|
+
}
|
37
|
+
const obj: any = {};
|
38
|
+
value.forEach((item: any) => {
|
39
|
+
const key: string = item.key || '';
|
40
|
+
let value: any = item.value;
|
41
|
+
try {
|
42
|
+
value = JSON.parse(value);
|
43
|
+
} catch (e) {}
|
44
|
+
obj[key] = value;
|
45
|
+
});
|
46
|
+
return obj;
|
47
|
+
},
|
48
|
+
items: [
|
49
|
+
{
|
50
|
+
placeholder: schema.keyPlaceholder ?? 'Key',
|
51
|
+
type: 'input-text',
|
52
|
+
unique: true,
|
53
|
+
name: 'key',
|
54
|
+
required: true
|
55
|
+
},
|
56
|
+
{
|
57
|
+
placeholder: schema.valuePlaceholder ?? 'Value',
|
58
|
+
type: schema.valueType || 'input-text',
|
59
|
+
name: 'value'
|
60
|
+
}
|
61
|
+
]
|
62
|
+
};
|
63
|
+
}
|
64
|
+
|
65
|
+
return schema;
|
66
|
+
});
|
package/src/store/crud.ts
CHANGED
@@ -482,6 +482,39 @@ export const CRUDStore = ServiceStore.named('CRUDStore')
|
|
482
482
|
self.reInitData(data);
|
483
483
|
};
|
484
484
|
|
485
|
+
const exportAsCSV = async (
|
486
|
+
options: {loadDataOnce?: boolean; api?: Api; data?: any} = {}
|
487
|
+
) => {
|
488
|
+
let items = options.loadDataOnce ? self.data.itemsRaw : self.data.items;
|
489
|
+
|
490
|
+
if (options.api) {
|
491
|
+
const env = getEnv(self);
|
492
|
+
const res = await env.fetcher(options.api, options.data);
|
493
|
+
if (!res.data) {
|
494
|
+
return;
|
495
|
+
}
|
496
|
+
if (Array.isArray(res.data)) {
|
497
|
+
items = res.data;
|
498
|
+
} else {
|
499
|
+
items = res.data.rows || res.data.items;
|
500
|
+
}
|
501
|
+
}
|
502
|
+
|
503
|
+
import('papaparse').then((papaparse: any) => {
|
504
|
+
const csvText = papaparse.unparse(items);
|
505
|
+
if (csvText) {
|
506
|
+
const blob = new Blob(
|
507
|
+
// 加上 BOM 这样 Excel 打开的时候就不会乱码
|
508
|
+
[new Uint8Array([0xef, 0xbb, 0xbf]), csvText],
|
509
|
+
{
|
510
|
+
type: 'text/plain;charset=utf-8'
|
511
|
+
}
|
512
|
+
);
|
513
|
+
saveAs(blob, 'data.csv');
|
514
|
+
}
|
515
|
+
});
|
516
|
+
};
|
517
|
+
|
485
518
|
return {
|
486
519
|
setPristineQuery,
|
487
520
|
updateQuery,
|
@@ -495,44 +528,7 @@ export const CRUDStore = ServiceStore.named('CRUDStore')
|
|
495
528
|
setUnSelectedItems,
|
496
529
|
setInnerModalOpened,
|
497
530
|
initFromScope,
|
498
|
-
|
499
|
-
let items = options.loadDataOnce ? self.data.itemsRaw : self.data.items;
|
500
|
-
|
501
|
-
if (!options.loadDataOnce && options.api) {
|
502
|
-
const json = await self.fetchData(
|
503
|
-
options.api,
|
504
|
-
{
|
505
|
-
...self.query,
|
506
|
-
page: undefined,
|
507
|
-
perPage: undefined,
|
508
|
-
op: 'export-csv'
|
509
|
-
},
|
510
|
-
{
|
511
|
-
autoAppend: true
|
512
|
-
}
|
513
|
-
);
|
514
|
-
if (
|
515
|
-
json.ok &&
|
516
|
-
(Array.isArray(json.data.items) || Array.isArray(json.data.rows))
|
517
|
-
) {
|
518
|
-
items = json.data.items || json.data.rows;
|
519
|
-
}
|
520
|
-
}
|
521
|
-
|
522
|
-
import('papaparse').then((papaparse: any) => {
|
523
|
-
const csvText = papaparse.unparse(items);
|
524
|
-
if (csvText) {
|
525
|
-
const blob = new Blob(
|
526
|
-
// 加上 BOM 这样 Excel 打开的时候就不会乱码
|
527
|
-
[new Uint8Array([0xef, 0xbb, 0xbf]), csvText],
|
528
|
-
{
|
529
|
-
type: 'text/plain;charset=utf-8'
|
530
|
-
}
|
531
|
-
);
|
532
|
-
saveAs(blob, 'data.csv');
|
533
|
-
}
|
534
|
-
});
|
535
|
-
}
|
531
|
+
exportAsCSV
|
536
532
|
};
|
537
533
|
});
|
538
534
|
|
package/src/store/formItem.ts
CHANGED
@@ -285,13 +285,17 @@ export const FormItemStore = StoreNode.named('FormItemStore')
|
|
285
285
|
isRequired: self.required
|
286
286
|
};
|
287
287
|
|
288
|
-
//
|
289
|
-
//
|
290
|
-
|
288
|
+
// todo 这个弄个配置由渲染器自己来决定
|
289
|
+
// 暂时先这样
|
290
|
+
if (~['input-text', 'textarea'].indexOf(self.type)) {
|
291
|
+
if (typeof minLength === 'number') {
|
292
|
+
rules.minLength = minLength;
|
293
|
+
}
|
291
294
|
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
+
if (typeof maxLength === 'number') {
|
296
|
+
rules.maxLength = maxLength;
|
297
|
+
}
|
298
|
+
}
|
295
299
|
|
296
300
|
if (isObjectShallowModified(rules, self.rules)) {
|
297
301
|
self.rules = rules;
|
package/src/store/modal.ts
CHANGED
package/src/store/service.ts
CHANGED
@@ -140,24 +140,6 @@ export const ServiceStore = iRendererStore
|
|
140
140
|
}
|
141
141
|
});
|
142
142
|
|
143
|
-
const fetchWSData = (ws: string, afterDataFetch: (data: any) => any) => {
|
144
|
-
const env = getEnv(self);
|
145
|
-
|
146
|
-
env.wsFetcher(
|
147
|
-
ws,
|
148
|
-
(data: any) => {
|
149
|
-
self.updateData(data, undefined, false);
|
150
|
-
setHasRemoteData();
|
151
|
-
// 因为 WebSocket 只会获取纯数据,所以没有 msg 之类的
|
152
|
-
afterDataFetch({ok: true, data: data});
|
153
|
-
},
|
154
|
-
(error: any) => {
|
155
|
-
updateMessage(error, true);
|
156
|
-
env.notify('error', error);
|
157
|
-
}
|
158
|
-
);
|
159
|
-
};
|
160
|
-
|
161
143
|
const setHasRemoteData = () => {
|
162
144
|
self.hasRemoteData = true;
|
163
145
|
};
|
@@ -505,7 +487,6 @@ export const ServiceStore = iRendererStore
|
|
505
487
|
markBusying,
|
506
488
|
fetchInitData,
|
507
489
|
fetchData,
|
508
|
-
fetchWSData,
|
509
490
|
reInitData,
|
510
491
|
updateMessage,
|
511
492
|
clearMessage,
|
package/src/store/table.ts
CHANGED
@@ -984,11 +984,16 @@ export const TableStore = iRendererStore
|
|
984
984
|
}
|
985
985
|
}
|
986
986
|
|
987
|
+
// 记录最近一次点击的多选框,主要用于 shift 多选时判断上一个选的是什么
|
988
|
+
let lastCheckedRow: any = null;
|
989
|
+
|
987
990
|
function toggle(row: IRow) {
|
988
991
|
if (!row.checkable) {
|
989
992
|
return;
|
990
993
|
}
|
991
994
|
|
995
|
+
lastCheckedRow = row;
|
996
|
+
|
992
997
|
const idx = self.selectedRows.indexOf(row);
|
993
998
|
|
994
999
|
if (self.multiple) {
|
@@ -1000,6 +1005,48 @@ export const TableStore = iRendererStore
|
|
1000
1005
|
}
|
1001
1006
|
}
|
1002
1007
|
|
1008
|
+
// 按住 shift 的时候点击选项
|
1009
|
+
function toggleShift(row: IRow) {
|
1010
|
+
// 如果是同一个或非 multiple 模式下就和不用 shift 一样
|
1011
|
+
if (!lastCheckedRow || row === lastCheckedRow || !self.multiple) {
|
1012
|
+
toggle(row);
|
1013
|
+
return;
|
1014
|
+
}
|
1015
|
+
|
1016
|
+
const maxLength = self.maxKeepItemSelectionLength;
|
1017
|
+
const checkableRows = self.checkableRows;
|
1018
|
+
const lastCheckedRowIndex = checkableRows.findIndex(
|
1019
|
+
row => row === lastCheckedRow
|
1020
|
+
);
|
1021
|
+
const rowIndex = checkableRows.findIndex(rowItem => row === rowItem);
|
1022
|
+
const minIndex =
|
1023
|
+
lastCheckedRowIndex > rowIndex ? rowIndex : lastCheckedRowIndex;
|
1024
|
+
const maxIndex =
|
1025
|
+
lastCheckedRowIndex > rowIndex ? lastCheckedRowIndex : rowIndex;
|
1026
|
+
|
1027
|
+
const rows = checkableRows.slice(minIndex, maxIndex);
|
1028
|
+
rows.push(row); // 将当前行也加入进行判断
|
1029
|
+
for (const rowItem of rows) {
|
1030
|
+
const idx = self.selectedRows.indexOf(rowItem);
|
1031
|
+
if (idx === -1) {
|
1032
|
+
// 如果上一个是选中状态,则将之间的所有 check 都变成可选
|
1033
|
+
if (lastCheckedRow.checked) {
|
1034
|
+
if (maxLength && self.selectedRows.length < maxLength) {
|
1035
|
+
self.selectedRows.push(rowItem);
|
1036
|
+
} else {
|
1037
|
+
self.selectedRows.push(rowItem);
|
1038
|
+
}
|
1039
|
+
}
|
1040
|
+
} else {
|
1041
|
+
if (!lastCheckedRow.checked) {
|
1042
|
+
self.selectedRows.splice(idx, 1);
|
1043
|
+
}
|
1044
|
+
}
|
1045
|
+
}
|
1046
|
+
|
1047
|
+
lastCheckedRow = row;
|
1048
|
+
}
|
1049
|
+
|
1003
1050
|
function updateCheckDisable() {
|
1004
1051
|
if (!self.data) {
|
1005
1052
|
return;
|
@@ -1134,6 +1181,7 @@ export const TableStore = iRendererStore
|
|
1134
1181
|
updateSelected,
|
1135
1182
|
toggleAll,
|
1136
1183
|
toggle,
|
1184
|
+
toggleShift,
|
1137
1185
|
toggleExpandAll,
|
1138
1186
|
toggleExpanded,
|
1139
1187
|
collapseAllAtDepth,
|
package/src/utils/api.ts
CHANGED
@@ -22,6 +22,8 @@ interface ApiCacheConfig extends ApiObject {
|
|
22
22
|
|
23
23
|
const apiCaches: Array<ApiCacheConfig> = [];
|
24
24
|
|
25
|
+
const isIE = !!(document as any).documentMode;
|
26
|
+
|
25
27
|
export function normalizeApi(
|
26
28
|
api: Api,
|
27
29
|
defaultMethod: string = 'get'
|
@@ -293,6 +295,15 @@ export function wrapFetcher(
|
|
293
295
|
api
|
294
296
|
);
|
295
297
|
}
|
298
|
+
// IE 下 get 请求会被缓存,所以自动加个时间戳
|
299
|
+
if (isIE && api && api.method?.toLocaleLowerCase() === 'get') {
|
300
|
+
const timeStamp = `_t=${Date.now()}`;
|
301
|
+
if (api.url.indexOf('?') === -1) {
|
302
|
+
api.url = api.url + `?${timeStamp}`;
|
303
|
+
} else {
|
304
|
+
api.url = api.url + `&${timeStamp}`;
|
305
|
+
}
|
306
|
+
}
|
296
307
|
return wrapAdaptor(fn(api), api);
|
297
308
|
};
|
298
309
|
}
|