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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bi-sdk-react",
3
- "version": "0.0.55",
3
+ "version": "0.0.56",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "dist/umd/js/bi-sdk.umd.min.js",
@@ -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, useRef, useState } from "react";
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: null,
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 pagination =
30
- !pageSize || pageSize <= dataSource.length
31
- ? false
32
- : {
33
- total: dataSource.length,
34
- pageSize,
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={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
  };