bi-sdk-react 0.0.55 → 0.0.56
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/dist/es/js/bi-sdk.es.js +24 -24
- package/dist/types/components/example.d.ts +8 -4
- package/dist/types/components/hooks/datasource.d.ts +2 -1
- package/dist/types/components/plugins/@antd/item-props/TableProps.d.ts +9 -0
- package/dist/types/components/plugins/@antd/items/TableRender.d.ts +9 -1
- package/dist/umd/js/bi-sdk.umd.min.js +12 -12
- package/package.json +1 -1
- package/src/components/example.ts +9 -10
- package/src/components/hooks/datasource.ts +5 -4
- package/src/components/plugins/@antd/index.ts +5 -7
- package/src/components/plugins/@antd/item-props/TableProps.tsx +86 -0
- package/src/components/plugins/@antd/items/TableRender.tsx +95 -21
package/package.json
CHANGED
|
@@ -539,22 +539,21 @@ return {
|
|
|
539
539
|
{
|
|
540
540
|
type: "b-table",
|
|
541
541
|
name: "数据表格",
|
|
542
|
+
datasource: {
|
|
543
|
+
source: "custom",
|
|
544
|
+
custom:
|
|
545
|
+
'[\r\n {\r\n "name": "汉族",\r\n "count": 1204\r\n },\r\n {\r\n "name": "少数民族",\r\n "count": 80\r\n }\r\n]',
|
|
546
|
+
},
|
|
542
547
|
props: {
|
|
543
548
|
title: "民族分布",
|
|
544
549
|
size: "small",
|
|
545
550
|
bordered: true,
|
|
546
551
|
showHeader: true,
|
|
552
|
+
showSizeChanger: true,
|
|
553
|
+
showQuickJumper: true,
|
|
554
|
+
hideOnSinglePage: true,
|
|
555
|
+
showTotal: true,
|
|
547
556
|
pageSize: 10,
|
|
548
|
-
dataSource: [
|
|
549
|
-
{
|
|
550
|
-
name: "汉族",
|
|
551
|
-
count: 1204,
|
|
552
|
-
},
|
|
553
|
-
{
|
|
554
|
-
name: "少数民族",
|
|
555
|
-
count: 80,
|
|
556
|
-
},
|
|
557
|
-
],
|
|
558
557
|
columns: [
|
|
559
558
|
{
|
|
560
559
|
title: "民族",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useContext, useEffect,
|
|
1
|
+
import { useContext, useEffect, useState } from "react";
|
|
2
2
|
import { PageContext } from "../context/PageContext";
|
|
3
3
|
import { SchemaItemType } from "../typing";
|
|
4
4
|
|
|
@@ -7,9 +7,10 @@ export type Signal = string | number;
|
|
|
7
7
|
type Props = {
|
|
8
8
|
item: SchemaItemType;
|
|
9
9
|
signal?: Signal;
|
|
10
|
+
query?: Record<string, any>;
|
|
10
11
|
};
|
|
11
12
|
|
|
12
|
-
export const useDatasource = ({ item, signal }: Props): any => {
|
|
13
|
+
export const useDatasource = ({ item, signal, query }: Props): any => {
|
|
13
14
|
const { fetch, getVars, setItemData } = useContext(PageContext);
|
|
14
15
|
const [datasource, setDatasource] = useState<any>(null);
|
|
15
16
|
useEffect(() => {
|
|
@@ -44,7 +45,7 @@ export const useDatasource = ({ item, signal }: Props): any => {
|
|
|
44
45
|
}
|
|
45
46
|
const vars = getVars(item.id || "");
|
|
46
47
|
fetch
|
|
47
|
-
.dataset(item?.datasource.dataset.id, vars)
|
|
48
|
+
.dataset(item?.datasource.dataset.id, { ...vars, ...query })
|
|
48
49
|
.then((res) => {
|
|
49
50
|
setDatasource(res || null);
|
|
50
51
|
setItemData?.(item.id || "", res || null);
|
|
@@ -60,7 +61,7 @@ export const useDatasource = ({ item, signal }: Props): any => {
|
|
|
60
61
|
setItemData?.(item.id || "", null);
|
|
61
62
|
break;
|
|
62
63
|
}
|
|
63
|
-
}, [item?.datasource, signal]);
|
|
64
|
+
}, [item?.datasource, signal, query]);
|
|
64
65
|
|
|
65
66
|
return datasource;
|
|
66
67
|
};
|
|
@@ -140,19 +140,17 @@ export const TablePlugin: PluginType = {
|
|
|
140
140
|
source: "custom",
|
|
141
141
|
datasourceId: null,
|
|
142
142
|
scriptId: null,
|
|
143
|
-
custom:
|
|
143
|
+
custom: "[{\"name\":\"苹果\",\"count\":12},{\"name\":\"华为\",\"count\":803},{\"name\":\"OPPO\",\"count\":654},{\"name\":\"vivo\",\"count\":719}]",
|
|
144
144
|
},
|
|
145
145
|
props: {
|
|
146
146
|
size: "default",
|
|
147
147
|
bordered: true,
|
|
148
148
|
showHeader: true,
|
|
149
|
+
showSizeChanger: true,
|
|
150
|
+
showQuickJumper: true,
|
|
151
|
+
hideOnSinglePage: true,
|
|
152
|
+
showTotal: true,
|
|
149
153
|
pageSize: 10,
|
|
150
|
-
dataSource: [
|
|
151
|
-
{ name: "苹果", count: 12 },
|
|
152
|
-
{ name: "华为", count: 803 },
|
|
153
|
-
{ name: "OPPO", count: 654 },
|
|
154
|
-
{ name: "vivo", count: 719 },
|
|
155
|
-
],
|
|
156
154
|
columns: [
|
|
157
155
|
{ title: "品牌", dataIndex: "name" },
|
|
158
156
|
{ title: "日销量(件)", dataIndex: "count" },
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
Modal,
|
|
12
12
|
Input,
|
|
13
13
|
type TableProps as AntTableProps,
|
|
14
|
+
Select,
|
|
14
15
|
} from "antd";
|
|
15
16
|
import type { PropEditorProps } from "./types";
|
|
16
17
|
import {
|
|
@@ -31,6 +32,15 @@ export type TableColumnModel = {
|
|
|
31
32
|
export type TableModel = {
|
|
32
33
|
pageSize?: number;
|
|
33
34
|
columns: TableColumnModel[];
|
|
35
|
+
dataKey?: string;
|
|
36
|
+
showSizeChanger?: boolean;
|
|
37
|
+
showQuickJumper?: boolean;
|
|
38
|
+
hideOnSinglePage?: boolean;
|
|
39
|
+
showTotal?: boolean;
|
|
40
|
+
headerCellClassNames?: string[];
|
|
41
|
+
bodyCellClassNames?: string[];
|
|
42
|
+
paginationRootClassNames?: string[];
|
|
43
|
+
paginationItemClassNames?: string[];
|
|
34
44
|
} & Pick<AntTableProps, "bordered" | "showHeader" | "size">;
|
|
35
45
|
|
|
36
46
|
export const TableProps: React.FC<PropEditorProps<TableModel>> = ({
|
|
@@ -88,6 +98,13 @@ export const TableProps: React.FC<PropEditorProps<TableModel>> = ({
|
|
|
88
98
|
return (
|
|
89
99
|
<div>
|
|
90
100
|
<Form labelCol={{ span: 12 }} wrapperCol={{ span: 12 }}>
|
|
101
|
+
<Form.Item label="数据键" tooltip="数据键用于指定数据来源中的数据项,例如:'data.items'">
|
|
102
|
+
<Input
|
|
103
|
+
size="small"
|
|
104
|
+
value={model.dataKey}
|
|
105
|
+
onChange={(e) => trigger("dataKey", e.target.value)}
|
|
106
|
+
/>
|
|
107
|
+
</Form.Item>
|
|
91
108
|
<Form.Item label="大小">
|
|
92
109
|
<Radio.Group
|
|
93
110
|
size="small"
|
|
@@ -113,6 +130,34 @@ export const TableProps: React.FC<PropEditorProps<TableModel>> = ({
|
|
|
113
130
|
onChange={(v) => trigger("showHeader", v)}
|
|
114
131
|
/>
|
|
115
132
|
</Form.Item>
|
|
133
|
+
<Form.Item label="显示分页大小选择器">
|
|
134
|
+
<Switch
|
|
135
|
+
size="small"
|
|
136
|
+
checked={!!model.showSizeChanger}
|
|
137
|
+
onChange={(v) => trigger("showSizeChanger", v)}
|
|
138
|
+
/>
|
|
139
|
+
</Form.Item>
|
|
140
|
+
<Form.Item label="显示快速跳转">
|
|
141
|
+
<Switch
|
|
142
|
+
size="small"
|
|
143
|
+
checked={!!model.showQuickJumper}
|
|
144
|
+
onChange={(v) => trigger("showQuickJumper", v)}
|
|
145
|
+
/>
|
|
146
|
+
</Form.Item>
|
|
147
|
+
<Form.Item label="隐藏单页分页">
|
|
148
|
+
<Switch
|
|
149
|
+
size="small"
|
|
150
|
+
checked={!!model.hideOnSinglePage}
|
|
151
|
+
onChange={(v) => trigger("hideOnSinglePage", v)}
|
|
152
|
+
/>
|
|
153
|
+
</Form.Item>
|
|
154
|
+
<Form.Item label="显示分页总数">
|
|
155
|
+
<Switch
|
|
156
|
+
size="small"
|
|
157
|
+
checked={!!model.showTotal}
|
|
158
|
+
onChange={(v) => trigger("showTotal", v)}
|
|
159
|
+
/>
|
|
160
|
+
</Form.Item>
|
|
116
161
|
<Form.Item label="分页大小">
|
|
117
162
|
<InputNumber
|
|
118
163
|
size="small"
|
|
@@ -133,6 +178,47 @@ export const TableProps: React.FC<PropEditorProps<TableModel>> = ({
|
|
|
133
178
|
<Button size="small" onClick={addColumn} block>
|
|
134
179
|
添加列
|
|
135
180
|
</Button>
|
|
181
|
+
<Divider style={{marginTop: 10}}>样式设置</Divider>
|
|
182
|
+
<Form.Item label="表头单元格类名" layout="vertical">
|
|
183
|
+
<Select
|
|
184
|
+
mode="tags"
|
|
185
|
+
size="small"
|
|
186
|
+
value={(model.headerCellClassNames || [])}
|
|
187
|
+
onChange={(e) =>
|
|
188
|
+
trigger("headerCellClassNames", e)
|
|
189
|
+
}
|
|
190
|
+
/>
|
|
191
|
+
</Form.Item>
|
|
192
|
+
<Form.Item label="表格单元格类名" layout="vertical">
|
|
193
|
+
<Select
|
|
194
|
+
mode="tags"
|
|
195
|
+
size="small"
|
|
196
|
+
value={(model.bodyCellClassNames || [])}
|
|
197
|
+
onChange={(e) =>
|
|
198
|
+
trigger("bodyCellClassNames", e)
|
|
199
|
+
}
|
|
200
|
+
/>
|
|
201
|
+
</Form.Item>
|
|
202
|
+
<Form.Item label="分页根类名" layout="vertical">
|
|
203
|
+
<Select
|
|
204
|
+
mode="tags"
|
|
205
|
+
size="small"
|
|
206
|
+
value={(model.paginationRootClassNames || [])}
|
|
207
|
+
onChange={(e) =>
|
|
208
|
+
trigger("paginationRootClassNames", e)
|
|
209
|
+
}
|
|
210
|
+
/>
|
|
211
|
+
</Form.Item>
|
|
212
|
+
<Form.Item label="分页项类名" layout="vertical">
|
|
213
|
+
<Select
|
|
214
|
+
mode="tags"
|
|
215
|
+
size="small"
|
|
216
|
+
value={(model.paginationItemClassNames || [])}
|
|
217
|
+
onChange={(e) =>
|
|
218
|
+
trigger("paginationItemClassNames", e)
|
|
219
|
+
}
|
|
220
|
+
/>
|
|
221
|
+
</Form.Item>
|
|
136
222
|
<Modal
|
|
137
223
|
title="编辑列"
|
|
138
224
|
open={editVisible}
|
|
@@ -1,45 +1,54 @@
|
|
|
1
|
-
import { Table, type TableProps } from "antd";
|
|
2
|
-
import React, { useContext, useEffect } from "react";
|
|
1
|
+
import { PaginationProps, Table, type TableProps } from "antd";
|
|
2
|
+
import React, { useContext, useEffect, useMemo, useState } from "react";
|
|
3
3
|
import { PageContext } from "../../../context/PageContext";
|
|
4
4
|
import { HtmlBaseProps } from "../../../typing";
|
|
5
|
+
import { useDatasource } from "../../../hooks/datasource";
|
|
5
6
|
|
|
6
7
|
export type TableRenderProps = {
|
|
7
|
-
dataSource?: any[];
|
|
8
8
|
columns?: any[];
|
|
9
|
+
dataKey?: string;
|
|
9
10
|
pageSize?: number;
|
|
10
11
|
bordered?: boolean;
|
|
11
12
|
size?: TableProps["size"];
|
|
12
13
|
showHeader?: boolean;
|
|
13
14
|
item: any;
|
|
15
|
+
showSizeChanger?: boolean;
|
|
16
|
+
showQuickJumper?: boolean;
|
|
17
|
+
hideOnSinglePage?: boolean;
|
|
18
|
+
showTotal?: boolean;
|
|
19
|
+
headerCellClassNames?: string[];
|
|
20
|
+
bodyCellClassNames?: string[];
|
|
21
|
+
paginationRootClassNames?: string[];
|
|
22
|
+
paginationItemClassNames?: string[];
|
|
14
23
|
} & HtmlBaseProps;
|
|
15
24
|
|
|
16
25
|
export const TableRender: React.FC<TableRenderProps> = ({
|
|
17
26
|
id,
|
|
18
27
|
item,
|
|
19
|
-
dataSource = [],
|
|
20
28
|
columns = [],
|
|
29
|
+
dataKey = "",
|
|
21
30
|
pageSize = 10,
|
|
22
31
|
bordered = true,
|
|
23
32
|
size,
|
|
24
33
|
showHeader = true,
|
|
34
|
+
showSizeChanger = true,
|
|
35
|
+
showQuickJumper = true,
|
|
36
|
+
hideOnSinglePage = true,
|
|
37
|
+
showTotal = true,
|
|
25
38
|
style = {},
|
|
26
39
|
className,
|
|
40
|
+
headerCellClassNames = [],
|
|
41
|
+
bodyCellClassNames = [],
|
|
42
|
+
paginationRootClassNames = [],
|
|
43
|
+
paginationItemClassNames = [],
|
|
27
44
|
}) => {
|
|
28
45
|
const { initCallback } = useContext(PageContext);
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
size,
|
|
36
|
-
showSizeChanger: true,
|
|
37
|
-
showQuickJumper: true,
|
|
38
|
-
hideOnSinglePage: true,
|
|
39
|
-
pageSizeOptions: ["10", "20", "30", "40"],
|
|
40
|
-
showTotal: (total: number, range: [number, number]) =>
|
|
41
|
-
`共 ${total} 条记录,显示第 ${range[0]}-${range[1]} 条`,
|
|
42
|
-
};
|
|
46
|
+
const [page, setPage] = useState<{
|
|
47
|
+
current: number;
|
|
48
|
+
pageSize: number;
|
|
49
|
+
}>({ current: 1, pageSize });
|
|
50
|
+
|
|
51
|
+
const dataSource = useDatasource({ item, query: page });
|
|
43
52
|
const realColumns = columns.map((item: any) => ({
|
|
44
53
|
...item,
|
|
45
54
|
render:
|
|
@@ -69,7 +78,7 @@ export const TableRender: React.FC<TableRenderProps> = ({
|
|
|
69
78
|
const module = undefined;
|
|
70
79
|
const exports = undefined;
|
|
71
80
|
${item.customRender}
|
|
72
|
-
|
|
81
|
+
`,
|
|
73
82
|
);
|
|
74
83
|
return (safeEval as any)(
|
|
75
84
|
console,
|
|
@@ -82,15 +91,68 @@ export const TableRender: React.FC<TableRenderProps> = ({
|
|
|
82
91
|
Boolean,
|
|
83
92
|
text,
|
|
84
93
|
record,
|
|
85
|
-
index
|
|
94
|
+
index,
|
|
86
95
|
);
|
|
87
96
|
},
|
|
88
97
|
}));
|
|
89
98
|
|
|
99
|
+
const data = useMemo(() => {
|
|
100
|
+
if (!dataKey || dataKey.trim() === "") {
|
|
101
|
+
return dataSource || [];
|
|
102
|
+
}
|
|
103
|
+
const keys = dataKey.split(".");
|
|
104
|
+
let result = dataSource || [];
|
|
105
|
+
for (const key of keys) {
|
|
106
|
+
if (result[key]) {
|
|
107
|
+
result = result[key];
|
|
108
|
+
} else {
|
|
109
|
+
result = [];
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return result || [];
|
|
114
|
+
}, [dataKey, dataSource]);
|
|
115
|
+
|
|
116
|
+
const pagination = useMemo(
|
|
117
|
+
() =>
|
|
118
|
+
!pageSize || pageSize >= (data || []).length
|
|
119
|
+
? false
|
|
120
|
+
: ({
|
|
121
|
+
total: (data || []).length,
|
|
122
|
+
current: page.current,
|
|
123
|
+
pageSize: page.pageSize,
|
|
124
|
+
size,
|
|
125
|
+
showSizeChanger,
|
|
126
|
+
showQuickJumper,
|
|
127
|
+
hideOnSinglePage,
|
|
128
|
+
pageSizeOptions: ["10", "20", "30", "40"],
|
|
129
|
+
showTotal: showTotal
|
|
130
|
+
? (total: number, range: [number, number]) =>
|
|
131
|
+
`共 ${total} 条记录,显示第 ${range[0]}-${range[1]} 条`
|
|
132
|
+
: undefined,
|
|
133
|
+
locale: {
|
|
134
|
+
items_per_page: "/ 页",
|
|
135
|
+
jump_to: "跳转至第",
|
|
136
|
+
page: "页",
|
|
137
|
+
},
|
|
138
|
+
onChange: (page: number, pageSize: number) => {
|
|
139
|
+
setPage({ current: page, pageSize });
|
|
140
|
+
},
|
|
141
|
+
onShowSizeChange: (current: number, size: number) => {
|
|
142
|
+
setPage({ current, pageSize: size });
|
|
143
|
+
},
|
|
144
|
+
} as PaginationProps),
|
|
145
|
+
[data, page, pageSize, size, showSizeChanger, showQuickJumper, hideOnSinglePage, showTotal],
|
|
146
|
+
);
|
|
147
|
+
|
|
90
148
|
const callback = () => {
|
|
91
149
|
console.log("callback table");
|
|
92
150
|
};
|
|
93
151
|
|
|
152
|
+
useEffect(() => {
|
|
153
|
+
setPage({ current: 1, pageSize });
|
|
154
|
+
}, [pageSize]);
|
|
155
|
+
|
|
94
156
|
useEffect(() => {
|
|
95
157
|
initCallback({ id: item.id, callback });
|
|
96
158
|
}, []);
|
|
@@ -98,7 +160,7 @@ export const TableRender: React.FC<TableRenderProps> = ({
|
|
|
98
160
|
return (
|
|
99
161
|
<Table
|
|
100
162
|
id={id}
|
|
101
|
-
dataSource={
|
|
163
|
+
dataSource={data || []}
|
|
102
164
|
columns={realColumns as any}
|
|
103
165
|
pagination={pagination as any}
|
|
104
166
|
bordered={bordered}
|
|
@@ -107,6 +169,18 @@ export const TableRender: React.FC<TableRenderProps> = ({
|
|
|
107
169
|
rowKey={(_, index) => String(index)}
|
|
108
170
|
style={{ padding: 1, ...style }}
|
|
109
171
|
className={className}
|
|
172
|
+
classNames={{
|
|
173
|
+
header: {
|
|
174
|
+
cell: (headerCellClassNames || []).join(" "),
|
|
175
|
+
},
|
|
176
|
+
body: {
|
|
177
|
+
cell: (bodyCellClassNames || []).join(" "),
|
|
178
|
+
},
|
|
179
|
+
pagination: {
|
|
180
|
+
root: (paginationRootClassNames || []).join(" "),
|
|
181
|
+
item: (paginationItemClassNames || []).join(" "),
|
|
182
|
+
},
|
|
183
|
+
}}
|
|
110
184
|
/>
|
|
111
185
|
);
|
|
112
186
|
};
|