From 3e1320212908f5c9fda8c7b0c2104564c3d80586 Mon Sep 17 00:00:00 2001 From: Rodrigo Rodriguez Date: Mon, 12 Apr 2021 10:07:59 -0300 Subject: [PATCH] fix(basic.gblib): SET MAX LINES now available to user larger files. --- .../basic.gblib/services/DialogKeywords.ts | 18 ++++++++++-- packages/basic.gblib/services/GBVMService.ts | 9 +++++- .../basic.gblib/services/SystemKeywords.ts | 28 +++++++++++++------ packages/core.gbapp/services/GBMinService.ts | 4 ++- 4 files changed, 46 insertions(+), 13 deletions(-) diff --git a/packages/basic.gblib/services/DialogKeywords.ts b/packages/basic.gblib/services/DialogKeywords.ts index 762ad59a..77e650d6 100644 --- a/packages/basic.gblib/services/DialogKeywords.ts +++ b/packages/basic.gblib/services/DialogKeywords.ts @@ -34,7 +34,7 @@ import { BotAdapter, TurnContext } from 'botbuilder'; import { WaterfallDialog, WaterfallStepContext } from 'botbuilder-dialogs'; -import { GBLog, GBMinInstance } from 'botlib'; +import { GBDialogStep, GBLog, GBMinInstance } from 'botlib'; import urlJoin = require('url-join'); import { GBServer } from '../../../src/app'; import { GBDeployer } from '../../core.gbapp/services/GBDeployer'; @@ -62,9 +62,9 @@ export class DialogKeywords { * When creating this keyword facade, a bot instance is * specified among the deployer service. */ - constructor(min: GBMinInstance, deployer: GBDeployer) { + constructor(min: GBMinInstance, deployer: GBDeployer, step: GBDialogStep) { this.min = min; - this.internalSys = new SystemKeywords(min, deployer); + this.internalSys = new SystemKeywords(min, deployer, step); } /** @@ -162,6 +162,18 @@ export class DialogKeywords { await this.min.userProfile.set(step.context, user); } + /** + * Defines the maximum lines to scan in spreedsheets. + * + * @example SET MAX LINES 5000 + * + */ + public async setMaxLines(step, count) { + const user = await this.min.userProfile.get(step.context, {}); + user.basicOptions.maxLines = count; + await this.min.userProfile.set(step.context, user); + } + /** * Returns the name of the user acquired by WhatsApp API. */ diff --git a/packages/basic.gblib/services/GBVMService.ts b/packages/basic.gblib/services/GBVMService.ts index af6a4ffe..7ad7238d 100644 --- a/packages/basic.gblib/services/GBVMService.ts +++ b/packages/basic.gblib/services/GBVMService.ts @@ -244,6 +244,10 @@ export class GBVMService extends GBService { return `setLanguage (step, ${$3})\n`; }); + code = code.replace(/(set max lines)(\s*)(.*)/gi, ($0, $1, $2, $3) => { + return `setMaxLines (step, ${$3})\n`; + }); + code = code.replace(/set\s(.*)/gi, ($0, $1, $2) => { return `sys().set (${$1})`; }); @@ -442,6 +446,9 @@ export class GBVMService extends GBService { code = code.replace(/("[^"]*"|'[^']*')|\bsetLanguage\b/gi, ($0, $1) => { return $1 === undefined ? 'this.setLanguage' : $1; }); + code = code.replace(/("[^"]*"|'[^']*')|\bsetMaxLines\b/gi, ($0, $1) => { + return $1 === undefined ? 'this.setMaxLines' : $1; + }); code = code.replace(/("[^"]*"|'[^']*')|\btransfer\b/gi, ($0, $1) => { return $1 === undefined ? 'this.transfer' : $1; }); @@ -707,7 +714,7 @@ export class GBVMService extends GBService { // Creates a class DialogKeywords which is the *this* pointer // in BASIC. - const sandbox: DialogKeywords = new DialogKeywords(min, deployer); + const sandbox: DialogKeywords = new DialogKeywords(min, deployer, step); // Injects the .gbdialog generated code into the VM. diff --git a/packages/basic.gblib/services/SystemKeywords.ts b/packages/basic.gblib/services/SystemKeywords.ts index 0f49a7f3..d3070955 100644 --- a/packages/basic.gblib/services/SystemKeywords.ts +++ b/packages/basic.gblib/services/SystemKeywords.ts @@ -30,7 +30,7 @@ | | \*****************************************************************************/ 'use strict'; -import { GBLog, GBMinInstance } from 'botlib'; +import { GBDialogStep, GBLog, GBMinInstance } from 'botlib'; import { CollectionUtil } from 'pragmatismo-io-framework'; import * as request from 'request-promise-native'; import urlJoin = require('url-join'); @@ -60,11 +60,17 @@ export class SystemKeywords { */ private readonly deployer: GBDeployer; + /** + * Reference to the deployer service. + */ + private readonly step: GBDialogStep; + /** * When creating this keyword facade, a bot instance is * specified among the deployer service. */ - constructor(min: GBMinInstance, deployer: GBDeployer) { + constructor(min: GBMinInstance, deployer: GBDeployer, step: GBDialogStep) { + this.step = step; this.min = min; this.deployer = deployer; } @@ -285,6 +291,14 @@ export class SystemKeywords { throw `File '${file}' has a FIND call with more than 1 arguments. Check the .gbdialog associated.`; } + const user = await this.min.userProfile.get(this.step.context, {}); + let maxLines = 100; + if (user.basicOptions && user.basicOptions.maxLines) { + if (user.basicOptions.maxLines.toString().toLowerCase() !== "default") { + maxLines = Number.parseInt(user.basicOptions.maxLines).valueOf(); + } + } + // Creates workbook session that will be discarded. const filter = args[0].split('='); @@ -295,7 +309,7 @@ export class SystemKeywords { .get(); let results = await client - .api(`${baseUrl}/drive/items/${document.id}/workbook/worksheets('${sheets.value[0].name}')/range(address='A1:Z2000')`) + .api(`${baseUrl}/drive/items/${document.id}/workbook/worksheets('${sheets.value[0].name}')/range(address='A1:Z${maxLines}')`) .get(); // Increments columnIndex by looping until find a column match. @@ -304,8 +318,6 @@ export class SystemKeywords { const header = results.text[0]; for (; columnIndex < header.length; columnIndex++) { - GBLog.info(`FIND DEBUG header: ${header[columnIndex]} columnName: ${columnName}`); - if (header[columnIndex].toLowerCase() === columnName.toLowerCase()) { break; } @@ -324,15 +336,15 @@ export class SystemKeywords { let result = results.text[foundIndex][columnIndex]; - GBLog.info(`FIND DEBUG result on foundIndex: ${foundIndex} columnIndex: ${columnIndex}: ${result}`); - // Filter results action. if (result && result.toLowerCase() === value.toLowerCase()) { let row = {}; const xlRow = results.text[foundIndex]; for (let colIndex = 0; colIndex < xlRow.length; colIndex++) { - row[header[colIndex]] = xlRow[colIndex]; + const propertyName = header[colIndex]; + GBLog.info(`xxxxxxxxxx ${propertyName}`); + row[propertyName] = xlRow[colIndex]; } row['line'] = foundIndex + 1; table.push(row); diff --git a/packages/core.gbapp/services/GBMinService.ts b/packages/core.gbapp/services/GBMinService.ts index 1a113abe..bd8ad5a0 100644 --- a/packages/core.gbapp/services/GBMinService.ts +++ b/packages/core.gbapp/services/GBMinService.ts @@ -513,7 +513,7 @@ export class GBMinService { // Sends all information to the .gbui web client. if (theme === undefined) { - theme = 'default.gbtheme'; + theme = `${instance.botId}.gbtheme`; } res.send( JSON.stringify({ @@ -751,6 +751,8 @@ export class GBMinService { user.subjects = []; user.cb = undefined; user.welcomed = false; + user.basicOptions = { maxLines: 100 }; + firstTime = true; // Sends loadInstance event to .gbui clients and loads FAQ.