@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 CHANGED
@@ -1,3 +1,11 @@
1
+ # @hzab/data-model@1.7.0
2
+
3
+ feat: 本地数据支持排序查询列表数据
4
+
5
+ # @hzab/data-model@1.6.1
6
+
7
+ fix: array-data-modal getMap getListMap 修复;getListMap、getListResMap 逻辑优化
8
+
1
9
  # @hzab/data-model@1.6.0
2
10
 
3
11
  fix: 注释;通用函数抽离
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hzab/data-model",
3
- "version": "1.6.0",
3
+ "version": "1.7.0",
4
4
  "description": "data model",
5
5
  "main": "src",
6
6
  "scripts": {
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
- const { _list } = this;
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) => {
@@ -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
- if (this.getListResMap) {
154
- resultList = this.getListResMap(resultList);
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