From 23e504a67d23e0b4abb8071f75be320808f60835 Mon Sep 17 00:00:00 2001 From: 18alantom <2.alan.tom@gmail.com> Date: Mon, 21 Feb 2022 17:57:01 +0530 Subject: [PATCH] feat: code to generate templates --- src/dataImport.ts | 88 ++++++++++++++++++++++++++++++++++++++++ src/pages/DataImport.vue | 59 ++++++++++++++++++++------- src/types/model.ts | 26 ++++++++++++ 3 files changed, 159 insertions(+), 14 deletions(-) create mode 100644 src/types/model.ts diff --git a/src/dataImport.ts b/src/dataImport.ts index d4393d1a..30defe32 100644 --- a/src/dataImport.ts +++ b/src/dataImport.ts @@ -1,3 +1,6 @@ +import { Field, FieldType } from '@/types/model'; +import frappe from 'frappe'; + export const importable = [ 'SalesInvoice', 'PurchaseInvoice', @@ -7,3 +10,88 @@ export const importable = [ 'Supplier', 'Item', ]; + +interface TemplateField { + label: string; + fieldname: string; + required: boolean; +} + +type LabelFieldMap = { + [key: string]: string; +}; + +export function getTemplateFields(doctype: string): TemplateField[] { + const fields: TemplateField[] = []; + + // @ts-ignore + const primaryFields: Field[] = frappe.models[doctype].fields; + const tableTypes: string[] = []; + + primaryFields.forEach( + ({ label, fieldtype, childtype, fieldname, required }) => { + if (fieldtype === FieldType.Table && childtype) { + tableTypes.push(childtype); + } + + fields.push({ + label, + fieldname, + required: Boolean(required ?? false), + }); + } + ); + + tableTypes.forEach((childtype) => { + // @ts-ignore + const childFields: Field[] = frappe.models[childtype].fields; + childFields.forEach(({ label, fieldtype, fieldname, required }) => { + if (fieldtype === FieldType.Table) { + return; + } + + fields.push({ label, fieldname, required: Boolean(required ?? false) }); + }); + }); + + return fields; +} + +function getLabelFieldMap(templateFields: TemplateField[]): LabelFieldMap { + const map: LabelFieldMap = {}; + + templateFields.reduce((acc, tf) => { + const key = tf.label as string; + acc[key] = tf.fieldname; + return acc; + }, map); + + return map; +} + +function getTemplate(templateFields: TemplateField[]): string { + const labels = templateFields.map(({ label }) => `"${label}"`).join(','); + return [labels, ''].join('\n'); +} + +export class Importer { + doctype: string; + templateFields: TemplateField[]; + _map: LabelFieldMap; + _template: string; + + constructor(doctype: string) { + this.doctype = doctype; + this.templateFields = getTemplateFields(doctype); + this._map = getLabelFieldMap(this.templateFields); + this._template = getTemplate(this.templateFields); + } + + get map() { + return this._map; + } + + get template() { + return this._template; + } +} diff --git a/src/pages/DataImport.vue b/src/pages/DataImport.vue index 00a77122..24aba801 100644 --- a/src/pages/DataImport.vue +++ b/src/pages/DataImport.vue @@ -37,11 +37,7 @@ input-class="bg-gray-100 text-gray-900 text-base" class="w-1/4" :value="importType" - @change=" - (v) => { - importType = v; - } - " + @change="setImportType" />


- - +
@@ -68,17 +69,18 @@