From 1b2a508fbbd75fa66573d46e0b5f401c01d5238f Mon Sep 17 00:00:00 2001 From: Wing-Kam Wong Date: Tue, 18 Oct 2022 11:28:30 +0800 Subject: [PATCH] refactor(nc-gui): remove file name to adapter --- .../utils/parsers/CSVTemplateAdapter.ts | 17 ++-- .../utils/parsers/ExcelTemplateAdapter.ts | 86 +++++++++---------- .../utils/parsers/JSONTemplateAdapter.ts | 7 +- 3 files changed, 52 insertions(+), 58 deletions(-) diff --git a/packages/nc-gui/utils/parsers/CSVTemplateAdapter.ts b/packages/nc-gui/utils/parsers/CSVTemplateAdapter.ts index 43a9980346..3004a69be3 100644 --- a/packages/nc-gui/utils/parsers/CSVTemplateAdapter.ts +++ b/packages/nc-gui/utils/parsers/CSVTemplateAdapter.ts @@ -1,5 +1,5 @@ import { parse } from 'papaparse' -import { UploadFile } from 'ant-design-vue' +import type { UploadFile } from 'ant-design-vue' import { UITypes } from 'nocodb-sdk' import { extractMultiOrSingleSelectProps, @@ -12,26 +12,23 @@ import { export default class CSVTemplateAdapter { config: Record - fileName: string files: UploadFile[] detectedColumnTypes: Record> distinctValues: Record> headers: Record project: { - title: string tables: Record[] } + columnValues: Record - constructor(fileName: string, files: UploadFile[], parserConfig = {}) { + constructor(files: UploadFile[], parserConfig = {}) { this.config = { maxRowsToParse: 500, ...parserConfig, } - this.fileName = fileName // TODO: check usage this.files = files this.project = { - title: this.fileName, tables: [], } this.detectedColumnTypes = {} @@ -167,10 +164,10 @@ export default class CSVTemplateAdapter { let steppers = 0 parse(file.originFileObj as File, { worker: true, - step: function (row) { + step(row) { steppers += 1 if (row) { - if (steppers == 1) { + if (steppers === 1) { that.initTemplate(tableIdx, file.name!, row.data as []) } else { that.detectColumnType(row.data as []) @@ -181,9 +178,9 @@ export default class CSVTemplateAdapter { } } }, - complete: function () { + complete() { console.log('complete') - console.log('steppers: ' + steppers) + console.log(`steppers: ${steppers}`) that.updateTemplate(tableIdx) console.log(that.project.tables) // TODO: enable import button diff --git a/packages/nc-gui/utils/parsers/ExcelTemplateAdapter.ts b/packages/nc-gui/utils/parsers/ExcelTemplateAdapter.ts index 93d252867a..3ea18aeaab 100644 --- a/packages/nc-gui/utils/parsers/ExcelTemplateAdapter.ts +++ b/packages/nc-gui/utils/parsers/ExcelTemplateAdapter.ts @@ -22,13 +22,10 @@ export default class ExcelTemplateAdapter extends TemplateGenerator { maxRowsToParse: number } & Record - name: string - excelData: any project: { - title: string - tables: any[] + tables: Record[] } data: Record = {} @@ -37,19 +34,16 @@ export default class ExcelTemplateAdapter extends TemplateGenerator { xlsx: typeof import('xlsx') - constructor(name = '', data = {}, parserConfig = {}) { + constructor(data = {}, parserConfig = {}) { super() this.config = { maxRowsToParse: 500, ...parserConfig, } - this.name = name - this.excelData = data this.project = { - title: this.name, tables: [], } @@ -64,17 +58,22 @@ export default class ExcelTemplateAdapter extends TemplateGenerator { cellDates: true, } - if (this.name.slice(-3) === 'csv') { - this.wb = this.xlsx.read(new TextDecoder().decode(new Uint8Array(this.excelData)), { - type: 'string', - ...options, - }) - } else { - this.wb = this.xlsx.read(new Uint8Array(this.excelData), { - type: 'array', - ...options, - }) - } + // TODO: remove later + // if (this.name.slice(-3) === 'csv') { + // this.wb = this.xlsx.read(new TextDecoder().decode(new Uint8Array(this.excelData)), { + // type: 'string', + // ...options, + // }) + // } else { + // this.wb = this.xlsx.read(new Uint8Array(this.excelData), { + // type: 'array', + // ...options, + // }) + // } + this.wb = this.xlsx.read(new Uint8Array(this.excelData), { + type: 'array', + ...options, + }) } parse() { @@ -94,33 +93,33 @@ export default class ExcelTemplateAdapter extends TemplateGenerator { this.data[tn] = [] const ws: any = this.wb.Sheets[sheet] const range = this.xlsx.utils.decode_range(ws['!ref']) - let rows: any = this.xlsx.utils.sheet_to_json(ws, { header: 1, blankrows: false, defval: null }) - - if (this.name.slice(-3) !== 'csv') { - // fix precision bug & timezone offset issues introduced by xlsx - const basedate = new Date(1899, 11, 30, 0, 0, 0) - // number of milliseconds since base date - const dnthresh = basedate.getTime() + (new Date().getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000 - // number of milliseconds in a day - const day_ms = 24 * 60 * 60 * 1000 - // handle date1904 property - const fixImportedDate = (date: Date) => { - const parsed = this.xlsx.SSF.parse_date_code((date.getTime() - dnthresh) / day_ms, { - date1904: this.wb.Workbook.WBProps.date1904, - }) - return new Date(parsed.y, parsed.m, parsed.d, parsed.H, parsed.M, parsed.S) - } - // fix imported date - rows = rows.map((r: any) => - r.map((v: any) => { - return v instanceof Date ? fixImportedDate(v) : v - }), - ) - } + const rows: any = this.xlsx.utils.sheet_to_json(ws, { header: 1, blankrows: false, defval: null }) + + // TODO: remove later + // if (this.name.slice(-3) !== 'csv') { + // // fix precision bug & timezone offset issues introduced by xlsx + // const basedate = new Date(1899, 11, 30, 0, 0, 0) + // // number of milliseconds since base date + // const dnthresh = basedate.getTime() + (new Date().getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000 + // // number of milliseconds in a day + // const day_ms = 24 * 60 * 60 * 1000 + // // handle date1904 property + // const fixImportedDate = (date: Date) => { + // const parsed = this.xlsx.SSF.parse_date_code((date.getTime() - dnthresh) / day_ms, { + // date1904: this.wb.Workbook.WBProps.date1904, + // }) + // return new Date(parsed.y, parsed.m, parsed.d, parsed.H, parsed.M, parsed.S) + // } + // // fix imported date + // rows = rows.map((r: any) => + // r.map((v: any) => { + // return v instanceof Date ? fixImportedDate(v) : v + // }), + // ) + // } const columnNameRowExist = +rows[0].every((v: any) => v === null || typeof v === 'string') - // const colLen = Math.max() for (let col = 0; col < rows[0].length; col++) { let cn: string = ((columnNameRowExist && rows[0] && rows[0][col] && rows[0][col].toString().trim()) || `field_${col + 1}`) .replace(/[` ~!@#$%^&*()_|+\-=?;:'",.<>\{\}\[\]\\\/]/g, '_') @@ -193,6 +192,7 @@ export default class ExcelTemplateAdapter extends TemplateGenerator { column.uidt = UITypes.Currency } } else if (column.uidt === UITypes.DateTime) { + // TODO: centralise // hold the possible date format found in the date const dateFormat: Record = {} if ( diff --git a/packages/nc-gui/utils/parsers/JSONTemplateAdapter.ts b/packages/nc-gui/utils/parsers/JSONTemplateAdapter.ts index 1843e2fd75..ee3214489a 100644 --- a/packages/nc-gui/utils/parsers/JSONTemplateAdapter.ts +++ b/packages/nc-gui/utils/parsers/JSONTemplateAdapter.ts @@ -14,25 +14,22 @@ const extractNestedData: any = (obj: any, path: any) => path.reduce((val: any, k export default class JSONTemplateAdapter extends TemplateGenerator { config: Record - name: string data: Record _jsonData: string | Record jsonData: Record project: { - title: string tables: Record[] } + columns: object - constructor(name = 'test', data: object, parserConfig = {}) { + constructor(data: object, parserConfig = {}) { super() this.config = { maxRowsToParse: 500, ...parserConfig, } - this.name = name this._jsonData = data this.project = { - title: this.name, tables: [], } this.jsonData = []