@ticatec/batch-data-uploader 0.0.10 → 0.0.12

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.
@@ -2,24 +2,25 @@ import BaseTemplate from "./BaseTemplate";
2
2
  import type DataColumn from "./DataColumn";
3
3
  import type { DataColumn as TableColumn } from "@ticatec/uniface-element/DataTable";
4
4
  export default abstract class BaseEncodingTemplate extends BaseTemplate {
5
+ private hintColumn;
5
6
  private validColumn;
6
7
  protected constructor(columns: Array<DataColumn>, rowOffset?: number);
7
- /**
8
- * 检查一行的数据是否合法
9
- * @param row
10
- * @protected
11
- */
12
- protected abstract isDataValid(row: any): boolean;
13
8
  /**
14
9
  *
15
10
  * @param rows
16
11
  * @protected
17
12
  */
18
13
  protected abstract encodeData(rows: Array<any>): Promise<Array<any>>;
14
+ /**
15
+ * 检查数据
16
+ * @param row
17
+ * @protected
18
+ */
19
+ protected abstract validateData(row: any): Promise<any>;
19
20
  /**
20
21
  * 数据集是否有效
21
22
  */
22
- abstract get valid(): boolean;
23
+ get valid(): boolean;
23
24
  /**
24
25
  * 从服务器抓取数据,然后根据主键进行数据合并
25
26
  * @param rows
@@ -4,16 +4,29 @@ import i18nKeys from "./i18n_resources/i18nKeys";
4
4
  const ValidData = `<span style="color: #76FF03">${getI18nText(i18nKeys.textValid)}</span>`;
5
5
  const InvalidData = `<span style="color: #ff3e00">${getI18nText(i18nKeys.textInvalid)}</span>`;
6
6
  export default class BaseEncodingTemplate extends BaseTemplate {
7
+ hintColumn = {
8
+ text: getI18nText(i18nKeys.labelHint),
9
+ field: "hint",
10
+ width: 150,
11
+ resizable: true
12
+ };
7
13
  validColumn = {
8
14
  text: getI18nText(i18nKeys.labelValid),
15
+ field: "valid",
9
16
  width: 90,
10
17
  align: 'center',
11
18
  escapeHTML: true,
12
- formatter: row => this.isDataValid(row) ? ValidData : InvalidData
19
+ formatter: valid => valid ? ValidData : InvalidData
13
20
  };
14
21
  constructor(columns, rowOffset = 1) {
15
22
  super(columns, rowOffset);
16
23
  }
24
+ /**
25
+ * 数据集是否有效
26
+ */
27
+ get valid() {
28
+ return this._list.filter(row => !row.valid).length == 0;
29
+ }
17
30
  /**
18
31
  * 从服务器抓取数据,然后根据主键进行数据合并
19
32
  * @param rows
@@ -23,12 +36,16 @@ export default class BaseEncodingTemplate extends BaseTemplate {
23
36
  let list = await this.encodeData(this.extractData(rows));
24
37
  rows.forEach((item, idx) => {
25
38
  if (list[idx]) {
26
- rows[idx] = { ...item, ...list[idx] };
39
+ let data = list[idx];
40
+ item.data = { ...item.data, ...data };
41
+ let result = this.validateData(data);
42
+ item.valid = result.valid;
43
+ item.hint = result.hint;
27
44
  }
28
45
  });
29
46
  return rows;
30
47
  }
31
48
  get columns() {
32
- return [...this._columns, this.validColumn];
49
+ return [...super.columns, this.hintColumn, this.validColumn];
33
50
  }
34
51
  }
@@ -41,4 +41,8 @@ export default abstract class BaseTemplate {
41
41
  * 获取数据
42
42
  */
43
43
  get list(): Array<any>;
44
+ /**
45
+ * 获取实际的数据列表
46
+ */
47
+ get dataList(): Array<any>;
44
48
  }
@@ -34,14 +34,20 @@ export default class BaseTemplate {
34
34
  const rows = [];
35
35
  for (let rowIndex = range.s.r + this.rowOffset; rowIndex <= range.e.r; rowIndex++) {
36
36
  const rowObject = {};
37
+ let dummyCount = 0;
37
38
  for (let i = 0; i < this._columns.length; i++) {
38
39
  const colDef = this._columns[i];
39
- const cellAddress = { r: rowIndex, c: i };
40
- const cellRef = XLSX.utils.encode_cell(cellAddress);
41
- const cell = sheet[cellRef];
42
- const rawValue = cell?.v;
43
- const formattedValue = colDef.parser ? colDef.parser(rawValue) : rawValue;
44
- utils.setNestedValue(rowObject, colDef.field, formattedValue);
40
+ if (colDef.dummy) {
41
+ dummyCount++;
42
+ }
43
+ else {
44
+ const cellAddress = { r: rowIndex, c: i - dummyCount };
45
+ const cellRef = XLSX.utils.encode_cell(cellAddress);
46
+ const cell = sheet[cellRef];
47
+ const rawValue = cell?.v;
48
+ const formattedValue = colDef.parser ? colDef.parser(rawValue) : rawValue;
49
+ utils.setNestedValue(rowObject, colDef.field, formattedValue);
50
+ }
45
51
  }
46
52
  rows.push(this.wrapData(rowObject));
47
53
  }
@@ -56,7 +62,8 @@ export default class BaseTemplate {
56
62
  let result = {};
57
63
  for (let col of this._columns) {
58
64
  if (col.visible != false && col.ignore != false) {
59
- utils.setNestedValue(result, col.field, utils.getNestedValue(item.data, col.field));
65
+ let data = item.data;
66
+ utils.setNestedValue(result, col.field, utils.getNestedValue(data, col.field));
60
67
  }
61
68
  }
62
69
  return result;
@@ -69,13 +76,13 @@ export default class BaseTemplate {
69
76
  * @protected
70
77
  */
71
78
  wrapData(data) {
72
- return data;
79
+ return { data };
73
80
  }
74
81
  /**
75
82
  * 获取表格的列定义
76
83
  */
77
84
  get columns() {
78
- return this._columns.map(col => ({ ...col }));
85
+ return this._columns.map(col => ({ ...col, field: `data.${col.field}` }));
79
86
  }
80
87
  /**
81
88
  * 获取数据
@@ -83,4 +90,10 @@ export default class BaseTemplate {
83
90
  get list() {
84
91
  return [...this._list];
85
92
  }
93
+ /**
94
+ * 获取实际的数据列表
95
+ */
96
+ get dataList() {
97
+ return this._list.map(row => row.data);
98
+ }
86
99
  }
@@ -71,7 +71,7 @@ export default class BaseUploadTemplate extends BaseTemplate {
71
71
  * 获取表格的列定义
72
72
  */
73
73
  get columns() {
74
- return [...this._columns.map(col => ({ ...col, field: `data.${col.field}` })), statusColumn];
74
+ return [...super.columns, statusColumn];
75
75
  }
76
76
  /**
77
77
  * 导出处理异常的数据
@@ -13,4 +13,8 @@ export default interface DataColumn extends TableColumn {
13
13
  * 解析函数
14
14
  */
15
15
  parser?: ParserText;
16
+ /**
17
+ * 伪列,不解析,仅用于回显
18
+ */
19
+ dummy?: boolean;
16
20
  }
@@ -30,7 +30,7 @@
30
30
  label: getI18nText(i18nKeys.button.confirm),
31
31
  type: 'primary',
32
32
  handler: ()=> {
33
- confirmCallback?.(template.list);
33
+ confirmCallback?.(template.dataList);
34
34
  closeHandler?.();
35
35
  }
36
36
  }
@@ -51,6 +51,7 @@
51
51
  actions = [btnConfirm, ...actions]
52
52
  }
53
53
  } catch (ex) {
54
+ console.error(ex);
54
55
  window.Toast.show(getI18nText(i18nKeys.parseFailure, {name: excelFile.name}));
55
56
  } finally {
56
57
  window.Indicator.hide();
@@ -21,6 +21,7 @@ declare const langRes: {
21
21
  labelValid: string;
22
22
  textValid: string;
23
23
  textInvalid: string;
24
+ labelHint: string;
24
25
  };
25
26
  };
26
27
  export default langRes;
@@ -20,7 +20,8 @@ const langRes = {
20
20
  labelStatus: "Status",
21
21
  labelValid: "Validity",
22
22
  textValid: "Yes",
23
- textInvalid: "No"
23
+ textInvalid: "No",
24
+ labelHint: "Hint"
24
25
  }
25
26
  };
26
27
  export default langRes;
@@ -21,6 +21,10 @@ declare const i18nKeys: {
21
21
  key: string;
22
22
  text: string;
23
23
  };
24
+ labelHint: {
25
+ key: string;
26
+ text: string;
27
+ };
24
28
  labelStatus: {
25
29
  key: string;
26
30
  text: string;
@@ -22,6 +22,10 @@ const i18nKeys = {
22
22
  key: 'batchUploading.labelValid',
23
23
  text: langRes.batchUploading.labelValid
24
24
  },
25
+ labelHint: {
26
+ key: 'batchUploading.labelValid',
27
+ text: langRes.batchUploading.labelHint
28
+ },
25
29
  labelStatus: {
26
30
  key: 'batchUploading.labelStatus',
27
31
  text: langRes.batchUploading.labelStatus
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ticatec/batch-data-uploader",
3
- "version": "0.0.10",
3
+ "version": "0.0.12",
4
4
  "description": "A reusable Svelte component for batch uploading Excel data with support for error handling, multi-language, and preprocessing.",
5
5
  "scripts": {
6
6
  "dev": "vite dev",