Browse Source

refactor(nc-gui): remove file name to adapter

pull/4135/head
Wing-Kam Wong 2 years ago
parent
commit
1b2a508fbb
  1. 17
      packages/nc-gui/utils/parsers/CSVTemplateAdapter.ts
  2. 86
      packages/nc-gui/utils/parsers/ExcelTemplateAdapter.ts
  3. 7
      packages/nc-gui/utils/parsers/JSONTemplateAdapter.ts

17
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<string, any>
fileName: string
files: UploadFile[]
detectedColumnTypes: Record<number, Record<string, number>>
distinctValues: Record<number, Set<string>>
headers: Record<number, string[]>
project: {
title: string
tables: Record<string, any>[]
}
columnValues: Record<number, []>
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

86
packages/nc-gui/utils/parsers/ExcelTemplateAdapter.ts

@ -22,13 +22,10 @@ export default class ExcelTemplateAdapter extends TemplateGenerator {
maxRowsToParse: number
} & Record<string, any>
name: string
excelData: any
project: {
title: string
tables: any[]
tables: Record<string, any>[]
}
data: Record<string, any> = {}
@ -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<string, number> = {}
if (

7
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<string, any>
name: string
data: Record<string, any>
_jsonData: string | Record<string, any>
jsonData: Record<string, any>
project: {
title: string
tables: Record<string, any>[]
}
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 = []

Loading…
Cancel
Save