From 2dc5045891129bf3f80aea2d27d48460002ced35 Mon Sep 17 00:00:00 2001 From: Wing-Kam Wong Date: Thu, 20 Oct 2022 13:18:50 +0800 Subject: [PATCH] feat(nc-gui): allow Auto-Select Field Types in Excel & JSON import --- .../nc-gui/components/dlg/QuickImport.vue | 2 +- .../utils/parsers/ExcelTemplateAdapter.ts | 143 +++++++++--------- .../utils/parsers/JSONTemplateAdapter.ts | 12 +- 3 files changed, 80 insertions(+), 77 deletions(-) diff --git a/packages/nc-gui/components/dlg/QuickImport.vue b/packages/nc-gui/components/dlg/QuickImport.vue index 00840a7e4a..85753d9865 100644 --- a/packages/nc-gui/components/dlg/QuickImport.vue +++ b/packages/nc-gui/components/dlg/QuickImport.vue @@ -454,7 +454,7 @@ const beforeUpload = (file: UploadFile) => { - + Auto-Select Field Types diff --git a/packages/nc-gui/utils/parsers/ExcelTemplateAdapter.ts b/packages/nc-gui/utils/parsers/ExcelTemplateAdapter.ts index 438c304fb0..6e49843bf8 100644 --- a/packages/nc-gui/utils/parsers/ExcelTemplateAdapter.ts +++ b/packages/nc-gui/utils/parsers/ExcelTemplateAdapter.ts @@ -114,86 +114,89 @@ export default class ExcelTemplateAdapter extends TemplateGenerator { column_name: cn, ref_column_name: cn, meta: {}, + uidt: UITypes.SingleLineText, } - const cellId = this.xlsx.utils.encode_cell({ - c: range.s.c + col, - r: columnNameRowExist, - }) - const cellProps = ws[cellId] || {} - column.uidt = excelTypeToUidt[cellProps.t] || UITypes.SingleLineText - - if (column.uidt === UITypes.SingleLineText) { - // check for long text - if (isMultiLineTextType(rows)) { - column.uidt = UITypes.LongText - } + if (this.config.autoSelectFieldTypes) { + const cellId = this.xlsx.utils.encode_cell({ + c: range.s.c + col, + r: columnNameRowExist, + }) + const cellProps = ws[cellId] || {} + column.uidt = excelTypeToUidt[cellProps.t] || UITypes.SingleLineText + + if (column.uidt === UITypes.SingleLineText) { + // check for long text + if (isMultiLineTextType(rows)) { + column.uidt = UITypes.LongText + } - if (isEmailType(rows)) { - column.uidt = UITypes.Email - } + if (isEmailType(rows)) { + column.uidt = UITypes.Email + } - if (isUrlType(rows)) { - column.uidt = UITypes.URL - } else { - const vals = rows - .slice(columnNameRowExist ? 1 : 0) - .map((r: any) => r[col]) - .filter((v: any) => v !== null && v !== undefined && v.toString().trim() !== '') - - const checkboxType = isCheckboxType(vals) - if (checkboxType.length === 1) { - column.uidt = UITypes.Checkbox + if (isUrlType(rows)) { + column.uidt = UITypes.URL } else { - // Single Select / Multi Select - Object.assign(column, extractMultiOrSingleSelectProps(vals)) + const vals = rows + .slice(columnNameRowExist ? 1 : 0) + .map((r: any) => r[col]) + .filter((v: any) => v !== null && v !== undefined && v.toString().trim() !== '') + + const checkboxType = isCheckboxType(vals) + if (checkboxType.length === 1) { + column.uidt = UITypes.Checkbox + } else { + // Single Select / Multi Select + Object.assign(column, extractMultiOrSingleSelectProps(vals)) + } } - } - } else if (column.uidt === UITypes.Number) { - if ( - rows.slice(1, this.config.maxRowsToParse).some((v: any) => { - return v && v[col] && parseInt(v[col]) !== +v[col] - }) - ) { - column.uidt = UITypes.Decimal - } - if ( - rows.slice(1, this.config.maxRowsToParse).every((v: any, i: any) => { - const cellId = this.xlsx.utils.encode_cell({ - c: range.s.c + col, - r: i + columnNameRowExist, + } else if (column.uidt === UITypes.Number) { + if ( + rows.slice(1, this.config.maxRowsToParse).some((v: any) => { + return v && v[col] && parseInt(v[col]) !== +v[col] }) + ) { + column.uidt = UITypes.Decimal + } + if ( + rows.slice(1, this.config.maxRowsToParse).every((v: any, i: any) => { + const cellId = this.xlsx.utils.encode_cell({ + c: range.s.c + col, + r: i + columnNameRowExist, + }) - const cellObj = ws[cellId] + const cellObj = ws[cellId] - return !cellObj || (cellObj.w && cellObj.w.startsWith('$')) - }) - ) { - column.uidt = UITypes.Currency - } - } else if (column.uidt === UITypes.DateTime) { - // TODO(import): centralise - // hold the possible date format found in the date - const dateFormat: Record = {} - if ( - rows.slice(1, this.config.maxRowsToParse).every((v: any, i: any) => { - const cellId = this.xlsx.utils.encode_cell({ - c: range.s.c + col, - r: i + columnNameRowExist, + return !cellObj || (cellObj.w && cellObj.w.startsWith('$')) }) - - const cellObj = ws[cellId] - const isDate = !cellObj || (cellObj.w && cellObj.w.split(' ').length === 1) - if (isDate && cellObj) { - dateFormat[getDateFormat(cellObj.w)] = (dateFormat[getDateFormat(cellObj.w)] || 0) + 1 - } - return isDate - }) - ) { - column.uidt = UITypes.Date - // take the date format with the max occurrence - column.meta.date_format = - Object.keys(dateFormat).reduce((x, y) => (dateFormat[x] > dateFormat[y] ? x : y)) || 'YYYY/MM/DD' + ) { + column.uidt = UITypes.Currency + } + } else if (column.uidt === UITypes.DateTime) { + // TODO(import): centralise + // hold the possible date format found in the date + const dateFormat: Record = {} + if ( + rows.slice(1, this.config.maxRowsToParse).every((v: any, i: any) => { + const cellId = this.xlsx.utils.encode_cell({ + c: range.s.c + col, + r: i + columnNameRowExist, + }) + + const cellObj = ws[cellId] + const isDate = !cellObj || (cellObj.w && cellObj.w.split(' ').length === 1) + if (isDate && cellObj) { + dateFormat[getDateFormat(cellObj.w)] = (dateFormat[getDateFormat(cellObj.w)] || 0) + 1 + } + return isDate + }) + ) { + column.uidt = UITypes.Date + // take the date format with the max occurrence + column.meta.date_format = + Object.keys(dateFormat).reduce((x, y) => (dateFormat[x] > dateFormat[y] ? x : y)) || 'YYYY/MM/DD' + } } } table.columns.push(column) diff --git a/packages/nc-gui/utils/parsers/JSONTemplateAdapter.ts b/packages/nc-gui/utils/parsers/JSONTemplateAdapter.ts index 7167eb993c..a3ea20a1e0 100644 --- a/packages/nc-gui/utils/parsers/JSONTemplateAdapter.ts +++ b/packages/nc-gui/utils/parsers/JSONTemplateAdapter.ts @@ -89,17 +89,17 @@ export default class JSONTemplateAdapter extends TemplateGenerator { } } else { const cn = path.join('_').replace(/\W/g, '_').trim() - const column: Record = { column_name: cn, ref_column_name: cn, + uidt: UITypes.SingleLineText, path, } - - column.uidt = jsonTypeToUidt[typeof firstRowVal] || UITypes.SingleLineText - - const colData = jsonData.map((r: any) => extractNestedData(r, path)) - Object.assign(column, getColumnUIDTAndMetas(colData, column.uidt)) + if (this.config.autoSelectFieldTypes) { + column.uidt = jsonTypeToUidt[typeof firstRowVal] || UITypes.SingleLineText + const colData = jsonData.map((r: any) => extractNestedData(r, path)) + Object.assign(column, getColumnUIDTAndMetas(colData, column.uidt)) + } columns.push(column) }