@hzab/form-render 1.7.16-alpha.0 → 1.7.16

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": "@hzab/form-render",
3
- "version": "1.7.16-alpha.0",
3
+ "version": "1.7.16",
4
4
  "description": "",
5
5
  "main": "src",
6
6
  "scripts": {
@@ -1,57 +1,57 @@
1
- import { useState } from "react";
2
- import { Input, AutoComplete } from "antd";
3
-
4
- import { getSearchTips } from "../../servers";
5
-
6
- import "./index.less";
7
-
8
- const cityCode = "0571";
9
-
10
- function Search(props) {
11
- const [loading, setLoading] = useState(false);
12
- const [tips, setTips] = useState([]);
13
-
14
- function onSelect(value, option) {
15
- const { lng: _lng, lat: _lat } = option || {};
16
- props.setPoint && props.setPoint(_lng, _lat, { changeCenter: true });
17
- }
18
-
19
- function onSearch(search) {
20
- if (!search) {
21
- setTips([]);
22
- return;
23
- }
24
- setLoading(true);
25
- getSearchTips(search, props.cityCode || cityCode)
26
- .then((res) => {
27
- setTips(
28
- res?.map((it) => ({
29
- ...it,
30
- label: it.name,
31
- // 解决回显为 id 的问题
32
- value: it.name,
33
- })),
34
- );
35
- setLoading(false);
36
- })
37
- .catch((err) => {
38
- setLoading(false);
39
- });
40
- }
41
-
42
- return (
43
- <AutoComplete
44
- className="location-map-search"
45
- options={tips}
46
- onSelect={onSelect}
47
- onSearch={_.debounce(onSearch, 500)}
48
- onClear={() => {
49
- setTips([]);
50
- }}
51
- >
52
- <Input.Search allowClear loading={loading} placeholder="请输入" />
53
- </AutoComplete>
54
- );
55
- }
56
-
57
- export default Search;
1
+ import { useState } from "react";
2
+ import { Input, AutoComplete } from "antd";
3
+
4
+ import { getSearchTips } from "../../servers";
5
+
6
+ import "./index.less";
7
+
8
+ const cityCode = "0571";
9
+
10
+ function Search(props) {
11
+ const [loading, setLoading] = useState(false);
12
+ const [tips, setTips] = useState([]);
13
+
14
+ function onSelect(value, option) {
15
+ const { lng: _lng, lat: _lat } = option || {};
16
+ props.setPoint && props.setPoint(_lng, _lat, { changeCenter: true });
17
+ }
18
+
19
+ function onSearch(search) {
20
+ if (!search) {
21
+ setTips([]);
22
+ return;
23
+ }
24
+ setLoading(true);
25
+ getSearchTips(search, props.cityCode || cityCode)
26
+ .then((res) => {
27
+ setTips(
28
+ res?.map((it) => ({
29
+ ...it,
30
+ label: it.name,
31
+ // 解决回显为 id 的问题
32
+ value: it.name,
33
+ })),
34
+ );
35
+ setLoading(false);
36
+ })
37
+ .catch((err) => {
38
+ setLoading(false);
39
+ });
40
+ }
41
+
42
+ return (
43
+ <AutoComplete
44
+ className="location-map-search"
45
+ options={tips}
46
+ onSelect={onSelect}
47
+ onSearch={_.debounce(onSearch, 500)}
48
+ onClear={() => {
49
+ setTips([]);
50
+ }}
51
+ >
52
+ <Input.Search allowClear loading={loading} placeholder="请输入" />
53
+ </AutoComplete>
54
+ );
55
+ }
56
+
57
+ export default Search;
@@ -1,221 +1,221 @@
1
- import _ from "lodash";
2
-
3
- export interface ITabTableDataOpt extends optT {
4
- /**
5
- * 展示 tab 的层级
6
- */
7
- tabLevel?: number;
8
- /**
9
- * 当前处理的层级
10
- */
11
- _level?: number;
12
- fieldNames?: {
13
- label?: string;
14
- value?: string;
15
- children?: string;
16
- };
17
- }
18
- /**
19
- * 处理数据,按需设置 tab、table 数据
20
- * @param treeData 树数据数组
21
- * @param opt 配置项
22
- * @returns
23
- */
24
- export function getTabTableData(_treeData = [], opt: ITabTableDataOpt = {}) {
25
- const treeData = _.cloneDeep(_treeData);
26
- const { tabLevel = 0, _level = 0, fieldNames } = opt || {};
27
- const { value, children } = fieldNames || {};
28
- let resList = [];
29
- // 当前层级小于 tabLevel,视为当前层级渲染为 tab
30
- const isTab = _level < tabLevel;
31
-
32
- // 当前层级渲染为 tab,直接 push 到 resList 中
33
- if (isTab) {
34
- resList.push({
35
- level: _level,
36
- defaultActiveKey: treeData[0]?.[value],
37
- tabList: treeData,
38
- });
39
- // 继续处理子集数据
40
- treeData?.forEach((it) => {
41
- if (it[children]?.length > 0) {
42
- it[children] = getTabTableData(it[children], {
43
- ...opt,
44
- _level: _level + 1,
45
- });
46
- }
47
- });
48
- } else {
49
- // 非 tab 层级,处理 table 渲染数据(handleTreeToArray 自动处理子集)
50
- resList.push({
51
- level: _level,
52
- tableData: handleTreeToArray(treeData, {
53
- ...opt,
54
- level: undefined,
55
- }),
56
- });
57
- }
58
- return resList;
59
- }
60
-
61
- /**
62
- * 处理树形数据,把树形数据方向转为多维数组,便于渲染
63
- * @param params
64
- * @returns
65
- 如:
66
- [{key:1, children:[{key:11},{key:12}]}, {key:2, children:[{key:21, children:[{key:211}]},{key:22},{key:23}]}]
67
- 结果数组:
68
- [1, 11, ]
69
- [ , 12, ]
70
- [2, 21, 211]
71
- [ , 22, ]
72
- [ , 23, ]
73
- */
74
- export function handleTreeToArray(treeData = [], opt: any = {}) {
75
- const { resList, maxCol } = transformTreeData(treeData, opt);
76
- resList?.forEach((row) => {
77
- fillArrByPush(maxCol, row);
78
- });
79
- return resList;
80
- }
81
-
82
- export type optT = {
83
- resList?: Array<any>;
84
- preCol?: number;
85
- //是否合并叶子节点
86
- mergeLeaf?: boolean;
87
- // 最后一列是否合并到一个单元格
88
- mergeFullLeaf?: boolean;
89
- // 当前递归的层级
90
- level?: number;
91
- fieldNames?: {
92
- value?: string;
93
- label?: string;
94
- children?: string;
95
- };
96
- };
97
-
98
- /**
99
- * 处理树形数据,把树形数据方向转为多维数组,便于渲染
100
- * @param params
101
- * @returns
102
- 如:
103
- [{key:1, children:[{key:11},{key:12}]}, {key:2, children:[{key:21, children:[{key:211}]},{key:22},{key:23}]}]
104
- 结果数组:
105
- [1, 11, ]
106
- [ , 12, ]
107
- [2, 21, 211]
108
- [ , 22, ]
109
- [ , 23, ]
110
- */
111
- export function transformTreeData(treeData = [], opt: optT = {}) {
112
- const { resList = [], preCol = 0, mergeLeaf, mergeFullLeaf, level = 0, fieldNames } = opt || {};
113
- const { value = "value", children = "children", label = "label" } = fieldNames || {};
114
- let maxCol = preCol + 1;
115
- // 统计当前项包含的最大行数(当前项的行数等于所有子项行数之和),用于合并行的值
116
- let maxRow = 0;
117
-
118
- const leafIndexList = [];
119
- const leafItemList = [];
120
-
121
- // 是否有子项
122
- let hasChildren = false;
123
- treeData?.forEach((it, i) => {
124
- if (it && Array.isArray(it[children]) && it[children].length > 0) {
125
- hasChildren = true;
126
- } else {
127
- // 保存当前层级的叶子节点,用于叶子节点合并
128
- leafIndexList.push(i);
129
- leafItemList.push(it);
130
- }
131
- });
132
-
133
- let lastRowIdx = resList.length > 0 ? resList.length - 1 : 0;
134
- // 合并不存在 children 的层级,mergeFullLeaf === true && hasChildren === false && level > 0 时,合并当前数据
135
- if (mergeFullLeaf === true && !hasChildren && level > 0) {
136
- resList[lastRowIdx].push([...treeData?.map((it) => ({ ...it, label: it[label], value: it[value] }))]);
137
- return {
138
- resList,
139
- maxCol,
140
- // 合并之后视为 1 行
141
- maxRow: 1,
142
- };
143
- }
144
-
145
- // 合并当前层级的叶子节点,非叶子节点忽略
146
- if (mergeLeaf === true && leafIndexList.length > 0) {
147
- // treeData 中删除当前层级其他叶子节点
148
- for (let i = leafIndexList.length - 1; i >= 0; i--) {
149
- const idx = leafIndexList[i];
150
- treeData.splice(idx, 1);
151
- }
152
- // 所有叶子节点放在尾部
153
- treeData.push({
154
- _type_: "leafList",
155
- leafList: leafItemList?.map((it) => ({ ...it, label: it[label], value: it[value] })),
156
- });
157
- }
158
-
159
- treeData?.forEach((it, i) => {
160
- let item = null;
161
- if (it._type_ === "leafList") {
162
- // 合并当前层级的叶子节点
163
- item = it.leafList;
164
- } else {
165
- item = { ...it, value: it[value], label: it[label] };
166
- }
167
- const childList = item[children] || [];
168
- const childLen = childList?.length;
169
- // 当 mergeFullLeaf !== true && children 长度大于1时,子项下标大于 0 的项需要另起一行,同时补充之前空的列。
170
- if (i > 0) {
171
- resList.push(fillArrByPush(preCol, [], { content: false }));
172
- }
173
- lastRowIdx = resList.length > 0 ? resList.length - 1 : 0;
174
- // 解决首次进来第一行数组空的问题
175
- if (!resList[lastRowIdx]) {
176
- resList[lastRowIdx] = [];
177
- }
178
- resList[lastRowIdx].push(item);
179
- if (childLen > 0) {
180
- const res = transformTreeData(childList, {
181
- ...opt,
182
- resList,
183
- preCol: preCol + 1,
184
- level: level + 1,
185
- });
186
- if (maxCol < res.maxCol) {
187
- maxCol = res.maxCol;
188
- }
189
- // 当前的最大行数加上子项的行数
190
- maxRow = maxRow + res.maxRow;
191
- // 每项的最大行数为子项的最大行数之和
192
- item._maxRow = res.maxRow;
193
- } else {
194
- item._maxRow = 1;
195
- maxRow += 1;
196
- }
197
- });
198
-
199
- return {
200
- resList,
201
- maxCol,
202
- maxRow,
203
- };
204
- }
205
-
206
- /**
207
- * 填充数组
208
- * @param len
209
- * @param arr
210
- * @param opt
211
- * @returns
212
- */
213
- export function fillArrByPush(len, arr = [], opt: any = {}) {
214
- const { content } = opt || {};
215
- if (arr.length < len) {
216
- for (let i = arr.length; i < len; i++) {
217
- arr.push(content);
218
- }
219
- }
220
- return arr;
221
- }
1
+ import _ from "lodash";
2
+
3
+ export interface ITabTableDataOpt extends optT {
4
+ /**
5
+ * 展示 tab 的层级
6
+ */
7
+ tabLevel?: number;
8
+ /**
9
+ * 当前处理的层级
10
+ */
11
+ _level?: number;
12
+ fieldNames?: {
13
+ label?: string;
14
+ value?: string;
15
+ children?: string;
16
+ };
17
+ }
18
+ /**
19
+ * 处理数据,按需设置 tab、table 数据
20
+ * @param treeData 树数据数组
21
+ * @param opt 配置项
22
+ * @returns
23
+ */
24
+ export function getTabTableData(_treeData = [], opt: ITabTableDataOpt = {}) {
25
+ const treeData = _.cloneDeep(_treeData);
26
+ const { tabLevel = 0, _level = 0, fieldNames } = opt || {};
27
+ const { value, children } = fieldNames || {};
28
+ let resList = [];
29
+ // 当前层级小于 tabLevel,视为当前层级渲染为 tab
30
+ const isTab = _level < tabLevel;
31
+
32
+ // 当前层级渲染为 tab,直接 push 到 resList 中
33
+ if (isTab) {
34
+ resList.push({
35
+ level: _level,
36
+ defaultActiveKey: treeData[0]?.[value],
37
+ tabList: treeData,
38
+ });
39
+ // 继续处理子集数据
40
+ treeData?.forEach((it) => {
41
+ if (it[children]?.length > 0) {
42
+ it[children] = getTabTableData(it[children], {
43
+ ...opt,
44
+ _level: _level + 1,
45
+ });
46
+ }
47
+ });
48
+ } else {
49
+ // 非 tab 层级,处理 table 渲染数据(handleTreeToArray 自动处理子集)
50
+ resList.push({
51
+ level: _level,
52
+ tableData: handleTreeToArray(treeData, {
53
+ ...opt,
54
+ level: undefined,
55
+ }),
56
+ });
57
+ }
58
+ return resList;
59
+ }
60
+
61
+ /**
62
+ * 处理树形数据,把树形数据方向转为多维数组,便于渲染
63
+ * @param params
64
+ * @returns
65
+ 如:
66
+ [{key:1, children:[{key:11},{key:12}]}, {key:2, children:[{key:21, children:[{key:211}]},{key:22},{key:23}]}]
67
+ 结果数组:
68
+ [1, 11, ]
69
+ [ , 12, ]
70
+ [2, 21, 211]
71
+ [ , 22, ]
72
+ [ , 23, ]
73
+ */
74
+ export function handleTreeToArray(treeData = [], opt: any = {}) {
75
+ const { resList, maxCol } = transformTreeData(treeData, opt);
76
+ resList?.forEach((row) => {
77
+ fillArrByPush(maxCol, row);
78
+ });
79
+ return resList;
80
+ }
81
+
82
+ export type optT = {
83
+ resList?: Array<any>;
84
+ preCol?: number;
85
+ //是否合并叶子节点
86
+ mergeLeaf?: boolean;
87
+ // 最后一列是否合并到一个单元格
88
+ mergeFullLeaf?: boolean;
89
+ // 当前递归的层级
90
+ level?: number;
91
+ fieldNames?: {
92
+ value?: string;
93
+ label?: string;
94
+ children?: string;
95
+ };
96
+ };
97
+
98
+ /**
99
+ * 处理树形数据,把树形数据方向转为多维数组,便于渲染
100
+ * @param params
101
+ * @returns
102
+ 如:
103
+ [{key:1, children:[{key:11},{key:12}]}, {key:2, children:[{key:21, children:[{key:211}]},{key:22},{key:23}]}]
104
+ 结果数组:
105
+ [1, 11, ]
106
+ [ , 12, ]
107
+ [2, 21, 211]
108
+ [ , 22, ]
109
+ [ , 23, ]
110
+ */
111
+ export function transformTreeData(treeData = [], opt: optT = {}) {
112
+ const { resList = [], preCol = 0, mergeLeaf, mergeFullLeaf, level = 0, fieldNames } = opt || {};
113
+ const { value = "value", children = "children", label = "label" } = fieldNames || {};
114
+ let maxCol = preCol + 1;
115
+ // 统计当前项包含的最大行数(当前项的行数等于所有子项行数之和),用于合并行的值
116
+ let maxRow = 0;
117
+
118
+ const leafIndexList = [];
119
+ const leafItemList = [];
120
+
121
+ // 是否有子项
122
+ let hasChildren = false;
123
+ treeData?.forEach((it, i) => {
124
+ if (it && Array.isArray(it[children]) && it[children].length > 0) {
125
+ hasChildren = true;
126
+ } else {
127
+ // 保存当前层级的叶子节点,用于叶子节点合并
128
+ leafIndexList.push(i);
129
+ leafItemList.push(it);
130
+ }
131
+ });
132
+
133
+ let lastRowIdx = resList.length > 0 ? resList.length - 1 : 0;
134
+ // 合并不存在 children 的层级,mergeFullLeaf === true && hasChildren === false && level > 0 时,合并当前数据
135
+ if (mergeFullLeaf === true && !hasChildren && level > 0) {
136
+ resList[lastRowIdx].push([...treeData?.map((it) => ({ ...it, label: it[label], value: it[value] }))]);
137
+ return {
138
+ resList,
139
+ maxCol,
140
+ // 合并之后视为 1 行
141
+ maxRow: 1,
142
+ };
143
+ }
144
+
145
+ // 合并当前层级的叶子节点,非叶子节点忽略
146
+ if (mergeLeaf === true && leafIndexList.length > 0) {
147
+ // treeData 中删除当前层级其他叶子节点
148
+ for (let i = leafIndexList.length - 1; i >= 0; i--) {
149
+ const idx = leafIndexList[i];
150
+ treeData.splice(idx, 1);
151
+ }
152
+ // 所有叶子节点放在尾部
153
+ treeData.push({
154
+ _type_: "leafList",
155
+ leafList: leafItemList?.map((it) => ({ ...it, label: it[label], value: it[value] })),
156
+ });
157
+ }
158
+
159
+ treeData?.forEach((it, i) => {
160
+ let item = null;
161
+ if (it._type_ === "leafList") {
162
+ // 合并当前层级的叶子节点
163
+ item = it.leafList;
164
+ } else {
165
+ item = { ...it, value: it[value], label: it[label] };
166
+ }
167
+ const childList = item[children] || [];
168
+ const childLen = childList?.length;
169
+ // 当 mergeFullLeaf !== true && children 长度大于1时,子项下标大于 0 的项需要另起一行,同时补充之前空的列。
170
+ if (i > 0) {
171
+ resList.push(fillArrByPush(preCol, [], { content: false }));
172
+ }
173
+ lastRowIdx = resList.length > 0 ? resList.length - 1 : 0;
174
+ // 解决首次进来第一行数组空的问题
175
+ if (!resList[lastRowIdx]) {
176
+ resList[lastRowIdx] = [];
177
+ }
178
+ resList[lastRowIdx].push(item);
179
+ if (childLen > 0) {
180
+ const res = transformTreeData(childList, {
181
+ ...opt,
182
+ resList,
183
+ preCol: preCol + 1,
184
+ level: level + 1,
185
+ });
186
+ if (maxCol < res.maxCol) {
187
+ maxCol = res.maxCol;
188
+ }
189
+ // 当前的最大行数加上子项的行数
190
+ maxRow = maxRow + res.maxRow;
191
+ // 每项的最大行数为子项的最大行数之和
192
+ item._maxRow = res.maxRow;
193
+ } else {
194
+ item._maxRow = 1;
195
+ maxRow += 1;
196
+ }
197
+ });
198
+
199
+ return {
200
+ resList,
201
+ maxCol,
202
+ maxRow,
203
+ };
204
+ }
205
+
206
+ /**
207
+ * 填充数组
208
+ * @param len
209
+ * @param arr
210
+ * @param opt
211
+ * @returns
212
+ */
213
+ export function fillArrByPush(len, arr = [], opt: any = {}) {
214
+ const { content } = opt || {};
215
+ if (arr.length < len) {
216
+ for (let i = arr.length; i < len; i++) {
217
+ arr.push(content);
218
+ }
219
+ }
220
+ return arr;
221
+ }