From 241596b51f542b17ceb0b6b465e71a0b86c7f39c Mon Sep 17 00:00:00 2001 From: rodrigorodriguez Date: Thu, 23 Feb 2023 11:51:59 -0300 Subject: [PATCH] fix(default.gbui): #263 Loads menu.xlsx as subject.json alternative. --- packages/kb.gbapp/services/KBService.ts | 86 +++++++++++++++++++++++-- 1 file changed, 81 insertions(+), 5 deletions(-) diff --git a/packages/kb.gbapp/services/KBService.ts b/packages/kb.gbapp/services/KBService.ts index ef4825d5e..239857e8e 100644 --- a/packages/kb.gbapp/services/KBService.ts +++ b/packages/kb.gbapp/services/KBService.ts @@ -635,9 +635,10 @@ export class KBService implements IGBKBService { // Imports subjects tree into database and return it. const subjectFile = urlJoin(localPath, 'subjects.json'); + const menuFile = urlJoin(localPath, 'menu.xlsx'); - if (Fs.existsSync(subjectFile)) { - await this.importSubjectFile(packageStorage.packageId, subjectFile, instance); + if (Fs.existsSync(subjectFile) || Fs.existsSync(menuFile)) { + await this.importSubjectFile(packageStorage.packageId, subjectFile, menuFile, instance); } // Import tabular files in the tabular directory. @@ -828,8 +829,83 @@ export class KBService implements IGBKBService { }); } - public async importSubjectFile(packageId: number, filename: string, instance: IGBInstance): Promise { - const subjectsLoaded = JSON.parse(Fs.readFileSync(filename, 'utf8')); + public async importSubjectFile( + packageId: number, + filename: string, + menuFile: string, + instance: IGBInstance + ): Promise { + let subjectsLoaded; + if (menuFile) { + // Loads menu.xlsx and finds worksheet. + + const workbook = new Excel.Workbook(); + const data = await workbook.xlsx.readFile(menuFile); + let worksheet: any; + for (let t = 0; t < data.worksheets.length; t++) { + worksheet = data.worksheets[t]; + if (worksheet) { + break; + } + } + + const MAX_LEVEL = 4; // Max column level to reach menu items in plan. + // Iterates over all items. + + let rows = worksheet._rows; + rows.length = 24; + let lastLevel = 0; + let subjects = { children: [] }; + let childrenNode = subjects.children; + let activeObj = null; + + let activeChildrenGivenLevel = [childrenNode]; + + await asyncPromise.eachSeries(rows, async row => { + if (!row) return; + let menu; + + // Detect menu level by skipping blank cells on left. + + let level; + for (level = 0; level < MAX_LEVEL; level++) { + menu = row._cells[level]; + if (menu && menu.text) { + break; + } + } + + // Tree hierarchy calculation. + + if (level > lastLevel) { + childrenNode = activeObj.children; + } else if (level < lastLevel) { + childrenNode = activeChildrenGivenLevel[level]; + } + + /// Keeps the record of last subroots for each level, to + // changel levels greater than one (return to main menu), + // can exists between leaf nodes and roots. + + activeChildrenGivenLevel[level] = childrenNode; + + // Insert the object into JSON. + + activeObj = { + title: menu, + description: row._cells[level + 1], + id: menu, + children: [] + }; + activeChildrenGivenLevel[level].push(activeObj); + + lastLevel = level; + }); + + subjectsLoaded = subjects; + } else { + subjectsLoaded = JSON.parse(Fs.readFileSync(filename, 'utf8')); + } const doIt = async (subjects: GuaribasSubject[], parentSubjectId: number) => { return asyncPromise.eachSeries(subjects, async item => { @@ -852,7 +928,7 @@ export class KBService implements IGBKBService { }); }; - return doIt(subjectsLoaded.children, undefined); + /publish gbkbreturn doIt(subjectsLoaded.children, undefined); } public async undeployKbFromStorage(instance: IGBInstance, deployer: GBDeployer, packageId: number) {