fix(all): CHART and IMAGE from GET HTTP calls.
This commit is contained in:
parent
55ff686a3f
commit
cf62b10196
8 changed files with 175 additions and 24410 deletions
|
@ -101,7 +101,7 @@ export class GuaribasConversation extends Model<GuaribasConversation> {
|
||||||
public text: string;
|
public text: string;
|
||||||
|
|
||||||
@ForeignKey(() => GuaribasUser)
|
@ForeignKey(() => GuaribasUser)
|
||||||
@Column(DataType.STRING(255))
|
@Column(DataType.INTEGER)
|
||||||
public startedByUserId: number;
|
public startedByUserId: number;
|
||||||
|
|
||||||
@BelongsTo(() => GuaribasUser)
|
@BelongsTo(() => GuaribasUser)
|
||||||
|
|
|
@ -115,7 +115,7 @@ export class DialogKeywords {
|
||||||
"--disable-accelerated-2d-canvas",
|
"--disable-accelerated-2d-canvas",
|
||||||
"--disable-gpu"],
|
"--disable-gpu"],
|
||||||
ignoreHTTPSErrors: true,
|
ignoreHTTPSErrors: true,
|
||||||
headless: false,
|
headless: true,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
const page = await this.browser.newPage();
|
const page = await this.browser.newPage();
|
||||||
|
@ -137,30 +137,65 @@ export class DialogKeywords {
|
||||||
* @param legends
|
* @param legends
|
||||||
* @see https://www.npmjs.com/package/plot
|
* @see https://www.npmjs.com/package/plot
|
||||||
*/
|
*/
|
||||||
public async chart(step, type, data, legends) {
|
public async chart(step, type, data, legends, transpose) {
|
||||||
|
|
||||||
const columns = [[]];
|
let table = [[]];
|
||||||
const legends_ = legends.split(';');
|
|
||||||
|
|
||||||
for (let i = 0; i < legends_.length; i++) {
|
if (legends) {
|
||||||
columns[i] = [legends_[i]];
|
|
||||||
columns[i] = columns[i].concat(data);
|
const legends_ = legends.split(';');
|
||||||
|
|
||||||
|
// Columns and data are merged like:
|
||||||
|
// columns: [
|
||||||
|
// ['data1', 30, 200, 100, 400, 150, 250],
|
||||||
|
// ['data2', 50, 20, 10, 40, 15, 25]
|
||||||
|
// ]
|
||||||
|
|
||||||
|
for (let i = 0; i < legends_.length; i++) {
|
||||||
|
table[i] = [legends_[i]];
|
||||||
|
table[i] = table[i].concat(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
table = SystemKeywords.JSONAsGBTable(data, false);
|
||||||
|
table.shift();
|
||||||
}
|
}
|
||||||
|
|
||||||
const definition = {
|
if (transpose) {
|
||||||
|
const transpose = (array) => {
|
||||||
|
return array.reduce((prev, next) => next.map((item, i) =>
|
||||||
|
(prev[i] || []).concat(next[i])
|
||||||
|
), []);
|
||||||
|
}
|
||||||
|
table = transpose(table);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
let definition = {
|
||||||
size: {
|
size: {
|
||||||
"height": 600,
|
"height": 420,
|
||||||
"width": 1200
|
"width": 680
|
||||||
},
|
},
|
||||||
data: {
|
data: {
|
||||||
columns: columns,
|
columns: table,
|
||||||
type: type
|
type: type
|
||||||
},
|
},
|
||||||
bar: {
|
bar: {
|
||||||
width: 200
|
ratio: 0.5
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// TODO: https://c3js.org/samples/timeseries.html
|
||||||
|
|
||||||
|
if (type === 'timeseries') {
|
||||||
|
definition['axis'][table[0]] = {
|
||||||
|
type: 'timeseries',
|
||||||
|
tick: {
|
||||||
|
format: '%Y-%m-%d'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const gbaiName = `${this.min.botId}.gbai`;
|
const gbaiName = `${this.min.botId}.gbai`;
|
||||||
const localName = Path.join('work', gbaiName, 'cache', `img${GBAdminService.getRndReadableIdentifier()}.jpg`);
|
const localName = Path.join('work', gbaiName, 'cache', `img${GBAdminService.getRndReadableIdentifier()}.jpg`);
|
||||||
|
|
||||||
|
|
|
@ -462,6 +462,11 @@ export class GBVMService extends GBService {
|
||||||
return `sys().convert(${$3})\n`;
|
return `sys().convert(${$3})\n`;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// TODO: AS CHART.
|
||||||
|
// code = code.replace(/(\w+)\s*\=\s*(.*)\s*as chart/gi, ($0, $1, $2) => {
|
||||||
|
// return `${$1} = sys().asImage(${$2})\n`;
|
||||||
|
// });
|
||||||
|
|
||||||
code = code.replace(/(\w+)\s*\=\s*(.*)\s*as image/gi, ($0, $1, $2) => {
|
code = code.replace(/(\w+)\s*\=\s*(.*)\s*as image/gi, ($0, $1, $2) => {
|
||||||
return `${$1} = sys().asImage(${$2})\n`;
|
return `${$1} = sys().asImage(${$2})\n`;
|
||||||
});
|
});
|
||||||
|
|
|
@ -40,6 +40,7 @@ import { DialogKeywords } from './DialogKeywords';
|
||||||
import { Tabulator } from 'tabulator-tables';
|
import { Tabulator } from 'tabulator-tables';
|
||||||
import { GBServer } from '../../../src/app';
|
import { GBServer } from '../../../src/app';
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
|
import { jar } from 'request-promise';
|
||||||
const Fs = require('fs');
|
const Fs = require('fs');
|
||||||
const Excel = require('exceljs');
|
const Excel = require('exceljs');
|
||||||
|
|
||||||
|
@ -181,6 +182,51 @@ export class SystemKeywords {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static JSONAsGBTable(data, headers) {
|
||||||
|
try {
|
||||||
|
let output = [];
|
||||||
|
let isObject = false;
|
||||||
|
|
||||||
|
if (Array.isArray(data)) {
|
||||||
|
isObject = Object.keys(data[0]) !== null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isObject || JSON.parse(data) !== null) {
|
||||||
|
|
||||||
|
let keys = Object.keys(data[0]);
|
||||||
|
|
||||||
|
|
||||||
|
if (headers) {
|
||||||
|
output[0] = [];
|
||||||
|
// Copies headers as the first element.
|
||||||
|
|
||||||
|
for (let i = 0; i < keys.length; i++) {
|
||||||
|
|
||||||
|
output[0][i] = keys[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
output.push({ 'gbarray': '0' }); ;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copies data from JSON format into simple array.
|
||||||
|
|
||||||
|
for (let i = 0; i < data.length; i++) {
|
||||||
|
output[i + 1] = [];
|
||||||
|
for (let j = 0; j < keys.length; j++) {
|
||||||
|
output[i + 1][j] = data[i][keys[j]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
GBLog.error(error);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param data
|
* @param data
|
||||||
|
@ -192,11 +238,19 @@ export class SystemKeywords {
|
||||||
* @see puppeteer.
|
* @see puppeteer.
|
||||||
*/
|
*/
|
||||||
private async renderTable(data, renderPDF, renderImage) {
|
private async renderTable(data, renderPDF, renderImage) {
|
||||||
|
|
||||||
if (!data[1]) {
|
if (!data[1]) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data = SystemKeywords.JSONAsGBTable(data, true);
|
||||||
|
|
||||||
|
// Detects if it is a collection with repeated
|
||||||
|
// headers.
|
||||||
|
|
||||||
|
|
||||||
const gbaiName = `${this.min.botId}.gbai`;
|
const gbaiName = `${this.min.botId}.gbai`;
|
||||||
const browser = await puppeteer.launch({ headless: false });
|
const browser = await puppeteer.launch({ headless: true });
|
||||||
const page = await browser.newPage();
|
const page = await browser.newPage();
|
||||||
|
|
||||||
// Includes the associated CSS related to current theme.
|
// Includes the associated CSS related to current theme.
|
||||||
|
@ -285,19 +339,30 @@ export class SystemKeywords {
|
||||||
|
|
||||||
public async asPDF(data, filename) {
|
public async asPDF(data, filename) {
|
||||||
let file = await this.renderTable(data, true, false);
|
let file = await this.renderTable(data, true, false);
|
||||||
return file['url'];
|
return file[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
public async asImage(data, filename) {
|
public async asImage(data, filename) {
|
||||||
let file = await this.renderTable(data, false, true);
|
let file = await this.renderTable(data, false, true);
|
||||||
return file['url'];
|
return file[0];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async executeSQL(data, sql, tableName) {
|
public async executeSQL(data, sql, tableName) {
|
||||||
const first = data.shift();
|
|
||||||
|
let objectMode = false;
|
||||||
|
if (Object.keys(data[0])) {
|
||||||
|
objectMode = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
let first;
|
||||||
|
if (!objectMode) {
|
||||||
|
first = data.shift();
|
||||||
|
}
|
||||||
data = alasql(sql, [data]);
|
data = alasql(sql, [data]);
|
||||||
data.unshift(first);
|
if (!objectMode) {
|
||||||
|
data.unshift(first);
|
||||||
|
}
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1290,21 +1355,17 @@ export class SystemKeywords {
|
||||||
options['responseType'] = 'stream';
|
options['responseType'] = 'stream';
|
||||||
options['encoding'] = null;
|
options['encoding'] = null;
|
||||||
}
|
}
|
||||||
const isAO = (val) => {
|
|
||||||
return val instanceof Array || val instanceof Object ? true : false;
|
|
||||||
}
|
|
||||||
let result = await request.get(options);
|
let result = await request.get(options);
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
if (isAO(result) && !streaming) {
|
|
||||||
GBLog.info(`[GET]: ${url} : ${result}`);
|
|
||||||
return JSON.parse(result);
|
return JSON.parse(result);
|
||||||
}
|
|
||||||
else {
|
} catch (error) {
|
||||||
GBLog.info(`[GET]: OK.`);
|
GBLog.info(`[GET]: OK.`);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -521,7 +521,7 @@ export class GBDeployer implements IGBDeployer {
|
||||||
GBLog.info(`Local is up to date: ${itemPath}...`);
|
GBLog.info(`Local is up to date: ${itemPath}...`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -134,7 +134,7 @@ async function ssr(url: string, useCache: boolean, cacheRefreshRate: number) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const browser = await puppeteer.launch({
|
const browser = await puppeteer.launch({
|
||||||
headless: false,
|
headless: true,
|
||||||
args: ["--single-process", "--no-zygote", "--no-sandbox", "--disable-features=site-per-process"]
|
args: ["--single-process", "--no-zygote", "--no-sandbox", "--disable-features=site-per-process"]
|
||||||
});
|
});
|
||||||
// browserWSEndpoint = await browserT.wsEndpoint();
|
// browserWSEndpoint = await browserT.wsEndpoint();
|
||||||
|
|
24424
packages/default.gbui/package-lock.json
generated
24424
packages/default.gbui/package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
@ -12,6 +12,7 @@
|
||||||
"botframework-directlinejs": "0.14.1",
|
"botframework-directlinejs": "0.14.1",
|
||||||
"botframework-webchat": "^4.13.0",
|
"botframework-webchat": "^4.13.0",
|
||||||
"deep-extend": "0.6.0",
|
"deep-extend": "0.6.0",
|
||||||
|
"eslint": "7.11.0",
|
||||||
"fetch": "1.1.0",
|
"fetch": "1.1.0",
|
||||||
"msal": "^1.4.11",
|
"msal": "^1.4.11",
|
||||||
"powerbi-client": "2.18.0",
|
"powerbi-client": "2.18.0",
|
||||||
|
@ -25,8 +26,7 @@
|
||||||
"react-transition-group": "^4.4.2",
|
"react-transition-group": "^4.4.2",
|
||||||
"rxjs": "^7.1.0",
|
"rxjs": "^7.1.0",
|
||||||
"url-join": "4.0.1",
|
"url-join": "4.0.1",
|
||||||
"webpack": "4.44.2",
|
"webpack": "4.44.2"
|
||||||
"eslint": "7.11.0"
|
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "react-scripts start",
|
"start": "react-scripts start",
|
||||||
|
|
Loading…
Add table
Reference in a new issue