@hzab/data-model 1.6.0 → 1.7.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/CHANGELOG.md +8 -0
- package/README.md +11 -0
- package/package.json +1 -1
- package/src/ArrayUtils.js +87 -2
- package/src/array-data-model.js +9 -6
- package/src/data-model.js +6 -9
package/CHANGELOG.md
CHANGED
package/README.md
CHANGED
|
@@ -182,6 +182,17 @@ function Demo({ orgId }) {
|
|
|
182
182
|
| opt.effectParams | Object | 否 | - | 动态的 params 数据,包含了 query |
|
|
183
183
|
| opt.effectQuery | Object | 否 | - | 动态的 query 数据 |
|
|
184
184
|
|
|
185
|
+
## array-data-model
|
|
186
|
+
|
|
187
|
+
- 参数通 DataModel
|
|
188
|
+
|
|
189
|
+
### query 配置
|
|
190
|
+
|
|
191
|
+
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|
|
192
|
+
| --------------------- | -------------------- | ---- | ------ | --------------------------------------------------------- |
|
|
193
|
+
| sortKey/orderByColumn | string/Array[string] | 否 | - | 排序字段,支持多维度排序,按照传入的顺序排优先级 |
|
|
194
|
+
| sortType/isAsc | string/Object | 否 | - | 排序规则,支持对象配置各字段排序规则 正序: asc 倒序: desc |
|
|
195
|
+
|
|
185
196
|
# 组件开发流程
|
|
186
197
|
|
|
187
198
|
- 在 config/webpack.config.js 中按需修改 library 配置的文件名
|
package/package.json
CHANGED
package/src/ArrayUtils.js
CHANGED
|
@@ -57,8 +57,11 @@ export class ArrayUtils {
|
|
|
57
57
|
* @param {*} query
|
|
58
58
|
*/
|
|
59
59
|
findListByQuery(query) {
|
|
60
|
-
const { pageNum = 1, pageSize = 10 } = query || {};
|
|
61
|
-
|
|
60
|
+
const { pageNum = 1, pageSize = 10, sortKey, sortType, orderByColumn, isAsc } = query || {};
|
|
61
|
+
// 排序
|
|
62
|
+
const _list = this.getSortList(sortKey || orderByColumn, sortType || isAsc);
|
|
63
|
+
|
|
64
|
+
// 分页
|
|
62
65
|
// 边界检查
|
|
63
66
|
if (pageNum < 1 || pageSize <= 0) {
|
|
64
67
|
return { list: [], pagination: { current: 1, total: 0 } };
|
|
@@ -76,6 +79,68 @@ export class ArrayUtils {
|
|
|
76
79
|
return { list: _list.slice(startIndex, endIndex), pagination: { current: pageNum, total: this.getCount() } };
|
|
77
80
|
}
|
|
78
81
|
|
|
82
|
+
/**
|
|
83
|
+
* 对目标数据进行多维度排序
|
|
84
|
+
* @param list
|
|
85
|
+
* @param {*} sortKey 排序的字段 支持 a.b.c 写法
|
|
86
|
+
* @param {*} sortType 排序方式 正序: asc 倒序: desc
|
|
87
|
+
* @returns
|
|
88
|
+
*/
|
|
89
|
+
getSortList(sortKey, sortType) {
|
|
90
|
+
const _list = _.cloneDeep(this._list);
|
|
91
|
+
if (!sortKey && !sortType) {
|
|
92
|
+
return _list;
|
|
93
|
+
}
|
|
94
|
+
const keys = Array.isArray(sortKey) ? sortKey : [sortKey];
|
|
95
|
+
_list.sort((a, b) => {
|
|
96
|
+
return this.compareData(a, b, { keys, sortType });
|
|
97
|
+
});
|
|
98
|
+
return _list;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* 根据传入的 keys 比较对象目标数据先后顺序
|
|
103
|
+
* @param dataA
|
|
104
|
+
* @param dataB
|
|
105
|
+
* @param opt
|
|
106
|
+
* @param opt.keys 数据 key 数组
|
|
107
|
+
* @param opt.keyIdx 当前数据下标
|
|
108
|
+
* @param opt.sortType 排序规则
|
|
109
|
+
* @returns
|
|
110
|
+
*/
|
|
111
|
+
compareData(dataA, dataB, opt = { keys, keyIdx: 0, sortType: "desc" }) {
|
|
112
|
+
const { keys, keyIdx = 0, sortType = "desc" } = opt;
|
|
113
|
+
const key = keys[keyIdx];
|
|
114
|
+
|
|
115
|
+
let direction = 1;
|
|
116
|
+
// 兼容 string 及 object 类型
|
|
117
|
+
let _sortType = sortType;
|
|
118
|
+
if (typeof _sortType === "object") {
|
|
119
|
+
_sortType = _sortType[key];
|
|
120
|
+
}
|
|
121
|
+
if (_sortType === "asc") {
|
|
122
|
+
direction = -1;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const valueA = _.get(dataA, key);
|
|
126
|
+
const valueB = _.get(dataB, key);
|
|
127
|
+
if (valueA < valueB) {
|
|
128
|
+
return -1 * direction;
|
|
129
|
+
}
|
|
130
|
+
if (valueA > valueB) {
|
|
131
|
+
return 1 * direction;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (keyIdx + 1 >= keys.length) {
|
|
135
|
+
return 0;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (valueA == valueB) {
|
|
139
|
+
// 继续使用次选排序规则排序
|
|
140
|
+
return this.compareData(dataA, dataB, { ...opt, keyIdx: keyIdx + 1 });
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
79
144
|
/**
|
|
80
145
|
* 获取完整列表
|
|
81
146
|
*/
|
|
@@ -99,6 +164,7 @@ export class ArrayUtils {
|
|
|
99
164
|
// TODO: id 去重
|
|
100
165
|
const item = _.cloneDeep(data);
|
|
101
166
|
this.setId(item);
|
|
167
|
+
this.setCreateTime(item);
|
|
102
168
|
this._list.push(item);
|
|
103
169
|
return STATE_CODE.SUC;
|
|
104
170
|
}
|
|
@@ -111,6 +177,7 @@ export class ArrayUtils {
|
|
|
111
177
|
// TODO: id 去重
|
|
112
178
|
const item = _.cloneDeep(data);
|
|
113
179
|
this.setId(item);
|
|
180
|
+
this.setCreateTime(item);
|
|
114
181
|
this._list.unshift(item);
|
|
115
182
|
return STATE_CODE.SUC;
|
|
116
183
|
}
|
|
@@ -131,6 +198,7 @@ export class ArrayUtils {
|
|
|
131
198
|
return STATE_CODE.NOT_FOUNT;
|
|
132
199
|
}
|
|
133
200
|
_list.splice(idx, 1, data);
|
|
201
|
+
this.setUpdateTime(data);
|
|
134
202
|
return STATE_CODE.SUC;
|
|
135
203
|
}
|
|
136
204
|
|
|
@@ -152,6 +220,7 @@ export class ArrayUtils {
|
|
|
152
220
|
Object.keys(data).forEach((key) => {
|
|
153
221
|
item[key] = data[key];
|
|
154
222
|
});
|
|
223
|
+
this.setUpdateTime(data);
|
|
155
224
|
return STATE_CODE.SUC;
|
|
156
225
|
}
|
|
157
226
|
|
|
@@ -186,6 +255,22 @@ export class ArrayUtils {
|
|
|
186
255
|
}
|
|
187
256
|
return item;
|
|
188
257
|
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* 设置创建时间
|
|
261
|
+
* @param {*} item
|
|
262
|
+
*/
|
|
263
|
+
setCreateTime(item) {
|
|
264
|
+
item.createTime = Date.now();
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* 设置更新时间
|
|
269
|
+
* @param {*} item
|
|
270
|
+
*/
|
|
271
|
+
setUpdateTime(item) {
|
|
272
|
+
item.createTime = Date.now();
|
|
273
|
+
}
|
|
189
274
|
}
|
|
190
275
|
|
|
191
276
|
export const hasId = (id) => {
|
package/src/array-data-model.js
CHANGED
|
@@ -121,6 +121,9 @@ class ArrayDataModel extends ArrayUtils {
|
|
|
121
121
|
|
|
122
122
|
return new Promise((resolve, reject) => {
|
|
123
123
|
let res = this.findItem(query);
|
|
124
|
+
if (this.getMap) {
|
|
125
|
+
res = this.getMap(res);
|
|
126
|
+
}
|
|
124
127
|
if (this.getResMap) {
|
|
125
128
|
res = this.getResMap(res);
|
|
126
129
|
}
|
|
@@ -144,15 +147,15 @@ class ArrayDataModel extends ArrayUtils {
|
|
|
144
147
|
let resultList = null;
|
|
145
148
|
if (this.getListFunc) {
|
|
146
149
|
resultList = await this.getListFunc(query);
|
|
147
|
-
if (this.getListResMap) {
|
|
148
|
-
resultList = this.getListResMap(resultList);
|
|
149
|
-
}
|
|
150
150
|
} else {
|
|
151
151
|
const getPro = this.findListByQuery(query);
|
|
152
152
|
resultList = await getPro;
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
153
|
+
}
|
|
154
|
+
if (this.getListMap) {
|
|
155
|
+
resultList.list = resultList.list.map((record) => this.getListMap(record));
|
|
156
|
+
}
|
|
157
|
+
if (this.getListResMap) {
|
|
158
|
+
resultList = this.getListResMap(resultList);
|
|
156
159
|
}
|
|
157
160
|
return resultList;
|
|
158
161
|
}
|
package/src/data-model.js
CHANGED
|
@@ -233,9 +233,6 @@ class DataModel {
|
|
|
233
233
|
let resultList = null;
|
|
234
234
|
if (this.getListFunc) {
|
|
235
235
|
resultList = await this.getListFunc(query);
|
|
236
|
-
if (this.getListResMap) {
|
|
237
|
-
resultList = this.getListResMap(resultList);
|
|
238
|
-
}
|
|
239
236
|
} else {
|
|
240
237
|
const getPro = new Promise((resolve, reject) => {
|
|
241
238
|
const apiUrl = this.getApiUrl(this.getListApi, q, ctx, { from: "getList" });
|
|
@@ -251,12 +248,6 @@ class DataModel {
|
|
|
251
248
|
response,
|
|
252
249
|
(res) => {
|
|
253
250
|
// data: { list: [], pagination: { current: 0, total: 1 } }
|
|
254
|
-
if (this.getListMap) {
|
|
255
|
-
res.list = res.list.map((record) => this.getListMap(record));
|
|
256
|
-
}
|
|
257
|
-
if (this.getListResMap) {
|
|
258
|
-
res = this.getListResMap(res);
|
|
259
|
-
}
|
|
260
251
|
resolve(res);
|
|
261
252
|
},
|
|
262
253
|
reject,
|
|
@@ -266,6 +257,12 @@ class DataModel {
|
|
|
266
257
|
});
|
|
267
258
|
resultList = await getPro;
|
|
268
259
|
}
|
|
260
|
+
if (this.getListMap) {
|
|
261
|
+
resultList.list = resultList.list.map((record) => this.getListMap(record));
|
|
262
|
+
}
|
|
263
|
+
if (this.getListResMap) {
|
|
264
|
+
resultList = this.getListResMap(resultList);
|
|
265
|
+
}
|
|
269
266
|
return resultList;
|
|
270
267
|
}
|
|
271
268
|
|