zmdms-webui 1.3.1 → 1.3.2

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.
Files changed (47) hide show
  1. package/dist/es/dynamicsetting/interface.d.ts +11 -3
  2. package/dist/es/node_modules/@ant-design/icons/es/components/AntdIcon.js +1 -2
  3. package/dist/es/node_modules/@ant-design/icons/es/icons/ArrowsAltOutlined.js +5 -2
  4. package/dist/es/node_modules/@ant-design/icons/es/icons/CaretDownOutlined.js +5 -2
  5. package/dist/es/node_modules/@ant-design/icons/es/icons/CaretUpOutlined.js +5 -2
  6. package/dist/es/node_modules/@ant-design/icons/es/icons/CheckCircleOutlined.js +5 -2
  7. package/dist/es/node_modules/@ant-design/icons/es/icons/CheckOutlined.js +5 -2
  8. package/dist/es/node_modules/@ant-design/icons/es/icons/CloseOutlined.js +5 -2
  9. package/dist/es/node_modules/@ant-design/icons/es/icons/CopyOutlined.js +5 -2
  10. package/dist/es/node_modules/@ant-design/icons/es/icons/DoubleRightOutlined.js +5 -2
  11. package/dist/es/node_modules/@ant-design/icons/es/icons/DownOutlined.js +5 -2
  12. package/dist/es/node_modules/@ant-design/icons/es/icons/DownloadOutlined.js +5 -2
  13. package/dist/es/node_modules/@ant-design/icons/es/icons/ExclamationCircleOutlined.js +5 -2
  14. package/dist/es/node_modules/@ant-design/icons/es/icons/LoadingOutlined.js +5 -2
  15. package/dist/es/node_modules/@ant-design/icons/es/icons/LogoutOutlined.js +5 -2
  16. package/dist/es/node_modules/@ant-design/icons/es/icons/MenuOutlined.js +5 -2
  17. package/dist/es/node_modules/@ant-design/icons/es/icons/MinusCircleOutlined.js +5 -2
  18. package/dist/es/node_modules/@ant-design/icons/es/icons/MinusOutlined.js +5 -2
  19. package/dist/es/node_modules/@ant-design/icons/es/icons/MinusSquareOutlined.js +5 -2
  20. package/dist/es/node_modules/@ant-design/icons/es/icons/PicRightOutlined.js +5 -2
  21. package/dist/es/node_modules/@ant-design/icons/es/icons/PlusOutlined.js +5 -2
  22. package/dist/es/node_modules/@ant-design/icons/es/icons/PlusSquareOutlined.js +5 -2
  23. package/dist/es/node_modules/@ant-design/icons/es/icons/QuestionCircleOutlined.js +5 -2
  24. package/dist/es/node_modules/@ant-design/icons/es/icons/SearchOutlined.js +5 -2
  25. package/dist/es/node_modules/@ant-design/icons/es/icons/SettingOutlined.js +5 -2
  26. package/dist/es/node_modules/@ant-design/icons/es/icons/ShrinkOutlined.js +5 -2
  27. package/dist/es/node_modules/@ant-design/icons/es/icons/SwapOutlined.js +5 -2
  28. package/dist/es/node_modules/@ant-design/icons/es/icons/UploadOutlined.js +5 -2
  29. package/dist/es/node_modules/@ant-design/icons/es/icons/UserOutlined.js +5 -2
  30. package/dist/es/node_modules/@ant-design/icons/es/icons/VerticalAlignBottomOutlined.js +5 -2
  31. package/dist/es/node_modules/@ant-design/icons/es/utils.js +1 -1
  32. package/dist/es/table/components/EnhanceBodyCell.js +26 -6
  33. package/dist/es/table/components/FilterDropdown.js +218 -0
  34. package/dist/es/table/components/PopoverIcon.js +3 -0
  35. package/dist/es/table/components/TitleOperation.js +5 -5
  36. package/dist/es/table/components/table-header-operation/CopyColumn.js +18 -0
  37. package/dist/es/table/components/{FillDown.js → table-header-operation/FillDown.js} +2 -2
  38. package/dist/es/table/hooks.js +19 -14
  39. package/dist/es/table/index.css +1 -1
  40. package/dist/es/table/interface.d.ts +75 -3
  41. package/dist/es/table/table.js +33 -25
  42. package/dist/es/table/useColumns.js +236 -54
  43. package/dist/es/table/utils.js +290 -7
  44. package/dist/index.dark.css +1 -1
  45. package/dist/index.default.css +1 -1
  46. package/package.json +2 -2
  47. package/dist/es/table/components/CopyIcon.js +0 -15
@@ -1,4 +1,5 @@
1
- import { __spreadArray, __assign } from '../_virtual/_tslib.js';
1
+ import { __spreadArray, __assign, __awaiter, __generator } from '../_virtual/_tslib.js';
2
+ import { filterHandle } from './components/FilterDropdown.js';
2
3
  import { message } from 'antd';
3
4
 
4
5
  // 递归处理columns
@@ -50,6 +51,7 @@ function recursionColumns(columns, currentDynamicList, newColumns, columnsIndexs
50
51
  ? columnsIndexs.concat([currentIndex])
51
52
  : [currentIndex]);
52
53
  }
54
+ newColumn.__dynamicItem__ = item;
53
55
  newColumns.push(newColumn);
54
56
  }
55
57
  });
@@ -99,17 +101,26 @@ function getTableColumns(columns, currentDynamicList) {
99
101
  if (preColumns.length === 0 &&
100
102
  middleColumns.length === 0 &&
101
103
  afterColumns.length === 0) {
102
- return columns;
104
+ return {
105
+ columns: columns,
106
+ };
103
107
  }
104
- return __spreadArray(__spreadArray(__spreadArray([], preColumns, true), middleColumns, true), afterColumns, true);
108
+ return {
109
+ columns: __spreadArray(__spreadArray(__spreadArray([], preColumns, true), middleColumns, true), afterColumns, true),
110
+ };
105
111
  }
106
- return columns;
112
+ return {
113
+ // 根据动态列配置获取到的最新列配置信息
114
+ columns: columns,
115
+ };
107
116
  }
108
117
  // 复制整列方法
109
- function copyColData(key, dataSource) {
118
+ function copyColData(key, options) {
110
119
  var _a, _b;
120
+ var dataSource = options.dataSource, filterConfig = options.filterConfig;
111
121
  if (Array.isArray(dataSource)) {
112
- var result = dataSource.map(function (item) {
122
+ var newDataSource = getFilterRecords(dataSource, filterConfig);
123
+ var result = newDataSource.map(function (item) {
113
124
  if (typeof key === "string") {
114
125
  return item[key];
115
126
  }
@@ -145,6 +156,278 @@ function copyColData(key, dataSource) {
145
156
  message.info("\u590D\u5236\u5931\u8D25\uFF01\u8BF7\u624B\u5DE5\u590D\u5236\n ".concat(str));
146
157
  }
147
158
  }
159
+ }
160
+ /**
161
+ * 根据过滤规则,将过滤的数据整理出来
162
+ * @param records [{}, {}]
163
+ * @param filterKeys { key1: ['search1', 'search2'], key2: [] }
164
+ * @returns
165
+ */
166
+ function getFilterRecords(records, filterKeys) {
167
+ if (!filterKeys) {
168
+ return records;
169
+ }
170
+ var keys = Object.keys(filterKeys);
171
+ if (keys.length === 0) {
172
+ return records;
173
+ }
174
+ return records.filter(function (record) {
175
+ var isPass = true;
176
+ var _loop_1 = function (i) {
177
+ var key = keys[i];
178
+ var values = filterKeys[key];
179
+ // 如果有过滤条件的话,
180
+ if (Array.isArray(values) && values.length > 0) {
181
+ var findValueIndex = values.findIndex(function (value) {
182
+ return filterHandle(value, record, key);
183
+ });
184
+ // 如果数据没有在过滤条件中找到,那么这条数据需要过滤掉
185
+ if (findValueIndex === -1) {
186
+ isPass = false;
187
+ return "break";
188
+ }
189
+ }
190
+ };
191
+ for (var i = 0; i < keys.length; i++) {
192
+ var state_1 = _loop_1(i);
193
+ if (state_1 === "break")
194
+ break;
195
+ }
196
+ return isPass;
197
+ });
198
+ }
199
+ /**
200
+ * 处理粘贴板数据
201
+ * @param e 粘贴事件对象
202
+ * @param options.maxRow 粘贴数据最多可以粘贴多少行(因为表格可能都没那么多行给粘贴,必定会导致数据错误。内部分页也是同样的问题)
203
+ */
204
+ function parsePasteData(e, options) {
205
+ var _a, _b, _c, _d, _e;
206
+ return __awaiter(this, void 0, void 0, function () {
207
+ var text, verticalTextList, maxRow;
208
+ return __generator(this, function (_f) {
209
+ switch (_f.label) {
210
+ case 0:
211
+ text = null;
212
+ if (!((_a = e === null || e === void 0 ? void 0 : e.clipboardData) === null || _a === void 0 ? void 0 : _a.getData)) return [3 /*break*/, 1];
213
+ text = (_c = (_b = e === null || e === void 0 ? void 0 : e.clipboardData) === null || _b === void 0 ? void 0 : _b.getData) === null || _c === void 0 ? void 0 : _c.call(_b, "text/plain");
214
+ return [3 /*break*/, 7];
215
+ case 1:
216
+ if (!navigator.clipboard) return [3 /*break*/, 6];
217
+ _f.label = 2;
218
+ case 2:
219
+ _f.trys.push([2, 4, , 5]);
220
+ return [4 /*yield*/, navigator.clipboard.readText()];
221
+ case 3:
222
+ text = _f.sent();
223
+ return [3 /*break*/, 5];
224
+ case 4:
225
+ _f.sent();
226
+ console.error("无法读取粘贴板数据!");
227
+ return [3 /*break*/, 5];
228
+ case 5: return [3 /*break*/, 7];
229
+ case 6:
230
+ console.error("浏览器不支持读取粘贴板数据!或者你调用该方法时,是否没有传入正确的粘贴事件对象!");
231
+ _f.label = 7;
232
+ case 7:
233
+ verticalTextList = [];
234
+ if (text) {
235
+ if (text.indexOf("\r\n") !== -1) {
236
+ verticalTextList = text.split("\r\n");
237
+ }
238
+ else if (text.indexOf("\r") !== -1) {
239
+ verticalTextList = text.split("\r");
240
+ }
241
+ else if (text.indexOf("\n") !== -1) {
242
+ verticalTextList = text.split("\n");
243
+ }
244
+ }
245
+ maxRow = options.maxRow;
246
+ // 如果粘贴板存在数据
247
+ if (verticalTextList.length > 0) {
248
+ // 只有传入了,才截取
249
+ // 如果开启了内部分页,那么源数据跟展示数据可能会差异更大
250
+ // 这里需要截取下每页显示最大条数的逻辑。
251
+ // 防止粘贴过来的数据行,实际超出了当前展示数据的页数。
252
+ // 如果觉得这个功能是不好的,可以注释这段
253
+ if (maxRow != null) {
254
+ verticalTextList = verticalTextList.slice(0, maxRow);
255
+ }
256
+ // 如果觉得这个功能是不好的,可以注释这段
257
+ // 去掉最后的空字符
258
+ if (((_e = (_d = verticalTextList[verticalTextList.length - 1]).trim) === null || _e === void 0 ? void 0 : _e.call(_d)) === "") {
259
+ verticalTextList.pop();
260
+ }
261
+ // 如果只有一个数据,并且没有横向的分隔符。说明就是单纯的复制,不需要后续处理
262
+ if (verticalTextList.length === 1 &&
263
+ verticalTextList[0].indexOf("\t") === -1) {
264
+ return [2 /*return*/, []];
265
+ }
266
+ }
267
+ return [2 /*return*/, verticalTextList];
268
+ }
269
+ });
270
+ });
271
+ }
272
+ /**
273
+ * 获取当前节点的下N个column节点(因为这块有嵌套表头等关系,所以处理逻辑相对复杂)
274
+ * @param column 最起始的节点
275
+ * @param columns 所有的节点
276
+ * @param nextNumber 从起始节点往下走几个节点
277
+ */
278
+ function getNextColumn(column, columns, nextNumber) {
279
+ // 得到当前的列配置信息
280
+ var __dynamicItem__ = (column || {}).__dynamicItem__;
281
+ // 记录路径
282
+ var indexs = (__dynamicItem__ || {}).indexs;
283
+ // 从第一个节点开始往后走
284
+ var startNumber = 1;
285
+ var nextIndexs = indexs;
286
+ // 能否找到这个新的索引对应的column配置?
287
+ // 这里可能找不到,如果找不到的话。需要前面进1
288
+ var newColumn = null;
289
+ // 如果没走到地方,就继续走
290
+ while (startNumber <= nextNumber) {
291
+ // 是否跳出查找?
292
+ var isBreak = false;
293
+ // 直接在最末尾的索引加1得到新的nextIndexs
294
+ // eslint-disable-next-line no-loop-func
295
+ nextIndexs = nextIndexs.map(function (number, index) {
296
+ return index === nextIndexs.length - 1 ? number + 1 : number;
297
+ });
298
+ newColumn = null;
299
+ while (!newColumn) {
300
+ // 先根据nextIndexs生成新得newColumn
301
+ // eslint-disable-next-line no-loop-func
302
+ nextIndexs.forEach(function (number, index) {
303
+ var _a;
304
+ if (index === 0) {
305
+ newColumn = columns[number];
306
+ }
307
+ else {
308
+ newColumn = (_a = newColumn === null || newColumn === void 0 ? void 0 : newColumn.children) === null || _a === void 0 ? void 0 : _a[number];
309
+ }
310
+ });
311
+ // 如果存在
312
+ if (newColumn) {
313
+ // 如果newColumn有子元素,那么需要继续往下遍历
314
+ if (newColumn.children) {
315
+ nextIndexs.push(0);
316
+ newColumn = null;
317
+ }
318
+ }
319
+ else {
320
+ // 如果不存在。那么需要删除最后一位。然后再往删完后得最后一位加1
321
+ // 如果只有最后一位了,那么不能删除需要跳出循环
322
+ if (nextIndexs.length === 1) {
323
+ // 并且最外层的循环,也没有走下去的必要了。因为超过了表格最长的列了
324
+ isBreak = true;
325
+ break;
326
+ }
327
+ nextIndexs = nextIndexs.slice(0, nextIndexs.length - 1);
328
+ nextIndexs[nextIndexs.length - 1] =
329
+ nextIndexs[nextIndexs.length - 1] + 1;
330
+ }
331
+ }
332
+ if (isBreak) {
333
+ break;
334
+ }
335
+ // 继续往后走
336
+ startNumber++;
337
+ }
338
+ return newColumn;
339
+ }
340
+ /**
341
+ * 将数据从某个单元格开始插入到表格数据中
342
+ */
343
+ function startColumnInsertTableData(options) {
344
+ var verticalTextList = options.verticalTextList, startColumn = options.startColumn, columns = options.columns, startIndex = options.startIndex, startDataIndex = options.startDataIndex, rowKey = options.rowKey, realDataSource = options.realDataSource, currentDataSource = options.currentDataSource;
345
+ // 影响的数据源的关系表
346
+ /**
347
+ * 粘贴的数据可能是这种结构
348
+ * [['value1', 'value2'], ['value1', 'value2']]
349
+ * 一维代表行
350
+ * 二维代表列
351
+ * 记录粘贴数据
352
+ * obj[key] 的值 为 影响的数据key
353
+ * obj[key][key] 最后的key 为 影响的数据key在实际数据中映射的数据行
354
+ * obj[key][key] 的值 为 实际的值
355
+ * 这样设计的原因:如果做了过滤的话,实际数据可能跟页面展示数据不一致
356
+ * 所以要明确告知影响的实际行是哪一行
357
+ * {
358
+ * key1: {
359
+ * 1: 'value1',
360
+ * 2: 'value2',
361
+ * },
362
+ * key2: {
363
+ * 1: 'value1',
364
+ * 2: 'value2',
365
+ * },
366
+ * }
367
+ */
368
+ var pasteConfig = {};
369
+ // 拷贝一份源数据
370
+ var dataSource = realDataSource.map(function (item) { return (__assign({}, item)); });
371
+ // 开始遍历粘贴数据,回填到数据表中
372
+ verticalTextList.forEach(function (verticalTextItem, verticalTextIndex) {
373
+ // 实际影响的行
374
+ var updateIndex = startIndex + verticalTextIndex;
375
+ // 可能有横向的分割
376
+ var landscapeTextList = verticalTextItem.split("\t");
377
+ landscapeTextList.forEach(function (landscapeTextItem, landscapeTextIndex) {
378
+ var _a;
379
+ var currentColumn = null; // 当前列配置
380
+ var currentDataIndex = null; // 当前修改的key
381
+ // 如果二维里面的数据,不止一个。那么还有横向的扩展
382
+ // 如果横向扩展超出了列规则,还需要做限制
383
+ if (landscapeTextIndex > 0) {
384
+ currentColumn = getNextColumn(startColumn, columns, landscapeTextIndex);
385
+ currentDataIndex = (currentColumn === null || currentColumn === void 0 ? void 0 : currentColumn.key) || (currentColumn === null || currentColumn === void 0 ? void 0 : currentColumn.dataIndex);
386
+ }
387
+ else {
388
+ currentColumn = startColumn;
389
+ currentDataIndex = startDataIndex;
390
+ }
391
+ // 如果没有找到对应的列
392
+ if (!currentColumn) {
393
+ return;
394
+ }
395
+ if (!pasteConfig[currentDataIndex]) {
396
+ pasteConfig[currentDataIndex] = {};
397
+ }
398
+ // 为了代码健壮性,这里还是做下判断,实际数据中肯定是存在的。
399
+ if (currentDataSource[updateIndex]) {
400
+ // 找到真实数据中的行
401
+ if (typeof rowKey === "string") {
402
+ var rowKeyValue_1 = currentDataSource[updateIndex][rowKey];
403
+ // 记录影响的真实数据信息
404
+ var realIndex = (_a = dataSource === null || dataSource === void 0 ? void 0 : dataSource.findIndex) === null || _a === void 0 ? void 0 : _a.call(dataSource, function (dataItem) { return dataItem[rowKey] === rowKeyValue_1; });
405
+ if (realIndex !== -1) {
406
+ // 修改真实数据源
407
+ // TODO: 这里需要做数据规则验证
408
+ // currentColumn
409
+ // currentDataIndex
410
+ if (currentColumn.editable || currentColumn.isPaste) {
411
+ dataSource[realIndex][currentDataIndex] = landscapeTextItem;
412
+ }
413
+ // 记录真实数据源的修改信息(里面可能有些数据没有修改成功,因为可能有的单元格不能修改)
414
+ pasteConfig[currentDataIndex][realIndex] = landscapeTextItem;
415
+ }
416
+ }
417
+ else {
418
+ console.error("你传入的‘rowKey’不是一个字符串,请传入一个字符串来表示唯一key");
419
+ }
420
+ }
421
+ });
422
+ });
423
+ return {
424
+ /** 粘贴规则 */
425
+ pasteConfig: pasteConfig,
426
+ /** 粘贴后的数据 */
427
+ newDataSource: dataSource,
428
+ /** 原始数据 */
429
+ oldDataSource: realDataSource,
430
+ };
148
431
  }
149
432
 
150
- export { copyColData, getTableColumns };
433
+ export { copyColData, getFilterRecords, getNextColumn, getTableColumns, parsePasteData, startColumnInsertTableData };