@acrodata/gui
Version:
JSON powered GUI for configurable panels.
128 lines • 13.5 kB
JavaScript
import { Directive, Input, Pipe } from '@angular/core';
import * as i0 from "@angular/core";
/**
* Lightweight EJS template engine
*
* @param str template string
* @param data data passed to the template
* @returns
*
* ### Example
*
* ```ts
* const people = ['geddy', 'neil', 'alex'];
* const res = ejsTmpl('<%= people.join(", ") %>', {people: people});
* console.log(res);
* // => 'geddy, neil, alex'
* ```
*
*/
export function ejsTmpl(str, data) {
const fn = new Function('obj', 'var p=[],print=function(){p.push.apply(p,arguments);};' +
// Introduce the data as local variables using with(){}
'with(obj){p.push("' +
// Convert the template into pure JavaScript
str
.replace(/[\r\t\n]/g, ' ')
.split('<%')
.join('\t')
.replace(/((^|%>)[^\t]*)'/g, '$1\r')
.replace(/\t=(.*?)%>/g, '",$1,"')
.split('\t')
.join('");')
.split('%>')
.join('p.push("')
.split('\r')
.join('"') +
'");}return p.join("");');
// Provide some basic currying to the user
return data ? fn(data) : fn;
}
export class GuiEjsPipe {
transform(value, data = {}) {
return ejsTmpl(value, data);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GuiEjsPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: GuiEjsPipe, isStandalone: true, name: "ejs" }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GuiEjsPipe, decorators: [{
type: Pipe,
args: [{
name: 'ejs',
standalone: true,
}]
}] });
export class GuiFlexDirective {
constructor(el) {
this.el = el;
this.flex = 100;
}
ngOnInit() {
this.el.nativeElement.style.flex = `1 1 ${this.flex}%`;
this.el.nativeElement.style.maxWidth = `${this.flex}%`;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GuiFlexDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: GuiFlexDirective, isStandalone: true, selector: "[flex]", inputs: { flex: "flex" }, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GuiFlexDirective, decorators: [{
type: Directive,
args: [{
selector: '[flex]',
standalone: true,
}]
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { flex: [{
type: Input
}] } });
export function compareValues(a, b, operator) {
switch (operator) {
case '$eq':
return a === b;
case '$ne':
return a !== b;
case '$gt':
return (a ?? 0) > (b ?? 0);
case '$lt':
return (a ?? 0) < (b ?? 0);
case '$gte':
return (a ?? 0) >= (b ?? 0);
case '$lte':
return (a ?? 0) <= (b ?? 0);
case '$in':
return Array.isArray(b) && b.includes(a);
case '$nin':
return Array.isArray(b) && !b.includes(a);
default:
return false;
}
}
export function getValueByPath(obj, path) {
return path.split('.').reduce((acc, key) => {
return acc?.['children']?.[key] ? acc['children'][key] : acc?.[key];
}, obj);
}
export function getModelFromConfig(config = {}, model = {}) {
for (const [key, fieldCfg] of Object.entries(config)) {
if (model[key] != null) {
continue;
}
if (fieldCfg.default != null) {
model[key] = fieldCfg.default;
}
else {
if (fieldCfg.type === 'group' ||
fieldCfg.type === 'inline' ||
fieldCfg.type === 'menu' ||
fieldCfg.type === 'menuItem') {
model[key] = getModelFromConfig(fieldCfg.children, {});
}
else if (fieldCfg.type === 'tabs') {
model[key] = [];
}
else {
model[key] = null;
}
}
}
return model;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvZ3VpL2d1aS11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBVSxJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDOztBQUcxRjs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sVUFBVSxPQUFPLENBQUMsR0FBVyxFQUFFLElBQVM7SUFDNUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxRQUFRLENBQ3JCLEtBQUssRUFDTCx3REFBd0Q7UUFDdEQsdURBQXVEO1FBQ3ZELG9CQUFvQjtRQUNwQiw0Q0FBNEM7UUFDNUMsR0FBRzthQUNBLE9BQU8sQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDO2FBQ3pCLEtBQUssQ0FBQyxJQUFJLENBQUM7YUFDWCxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQ1YsT0FBTyxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQzthQUNuQyxPQUFPLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQzthQUNoQyxLQUFLLENBQUMsSUFBSSxDQUFDO2FBQ1gsSUFBSSxDQUFDLEtBQUssQ0FBQzthQUNYLEtBQUssQ0FBQyxJQUFJLENBQUM7YUFDWCxJQUFJLENBQUMsVUFBVSxDQUFDO2FBQ2hCLEtBQUssQ0FBQyxJQUFJLENBQUM7YUFDWCxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ1osd0JBQXdCLENBQzNCLENBQUM7SUFFRiwwQ0FBMEM7SUFDMUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQzlCLENBQUM7QUFNRCxNQUFNLE9BQU8sVUFBVTtJQUNyQixTQUFTLENBQUMsS0FBYSxFQUFFLElBQUksR0FBRyxFQUFFO1FBQ2hDLE9BQU8sT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM5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LENBQUM7WUFDdkIsU0FBUztRQUNYLENBQUM7UUFDRCxJQUFJLFFBQVEsQ0FBQyxPQUFPLElBQUksSUFBSSxFQUFFLENBQUM7WUFDN0IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7UUFDaEMsQ0FBQzthQUFNLENBQUM7WUFDTixJQUNFLFFBQVEsQ0FBQyxJQUFJLEtBQUssT0FBTztnQkFDekIsUUFBUSxDQUFDLElBQUksS0FBSyxRQUFRO2dCQUMxQixRQUFRLENBQUMsSUFBSSxLQUFLLE1BQU07Z0JBQ3hCLFFBQVEsQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUM1QixDQUFDO2dCQUNELEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsUUFBcUIsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN0RSxDQUFDO2lCQUFNLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztnQkFDcEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNsQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztZQUNwQixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIElucHV0LCBPbkluaXQsIFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEd1aURlZmF1bHRWYWx1ZSwgR3VpRmllbGRzLCBHdWlPcGVyYXRvciB9IGZyb20gJy4vaW50ZXJmYWNlJztcblxuLyoqXG4gKiBMaWdodHdlaWdodCBFSlMgdGVtcGxhdGUgZW5naW5lXG4gKlxuICogQHBhcmFtIHN0ciAgdGVtcGxhdGUgc3RyaW5nXG4gKiBAcGFyYW0gZGF0YSBkYXRhIHBhc3NlZCB0byB0aGUgdGVtcGxhdGVcbiAqIEByZXR1cm5zXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgcGVvcGxlID0gWydnZWRkeScsICduZWlsJywgJ2FsZXgnXTtcbiAqIGNvbnN0IHJlcyA9IGVqc1RtcGwoJzwlPSBwZW9wbGUuam9pbihcIiwgXCIpICU+Jywge3Blb3BsZTogcGVvcGxlfSk7XG4gKiBjb25zb2xlLmxvZyhyZXMpO1xuICogLy8gPT4gJ2dlZGR5LCBuZWlsLCBhbGV4J1xuICogYGBgXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gZWpzVG1wbChzdHI6IHN0cmluZywgZGF0YTogYW55KSB7XG4gIGNvbnN0IGZuID0gbmV3IEZ1bmN0aW9uKFxuICAgICdvYmonLFxuICAgICd2YXIgcD1bXSxwcmludD1mdW5jdGlvbigpe3AucHVzaC5hcHBseShwLGFyZ3VtZW50cyk7fTsnICtcbiAgICAgIC8vIEludHJvZHVjZSB0aGUgZGF0YSBhcyBsb2NhbCB2YXJpYWJsZXMgdXNpbmcgd2l0aCgpe31cbiAgICAgICd3aXRoKG9iail7cC5wdXNoKFwiJyArXG4gICAgICAvLyBDb252ZXJ0IHRoZSB0ZW1wbGF0ZSBpbnRvIHB1cmUgSmF2YVNjcmlwdFxuICAgICAgc3RyXG4gICAgICAgIC5yZXBsYWNlKC9bXFxyXFx0XFxuXS9nLCAnICcpXG4gICAgICAgIC5zcGxpdCgnPCUnKVxuICAgICAgICAuam9pbignXFx0JylcbiAgICAgICAgLnJlcGxhY2UoLygoXnwlPilbXlxcdF0qKScvZywgJyQxXFxyJylcbiAgICAgICAgLnJlcGxhY2UoL1xcdD0oLio/KSU+L2csICdcIiwkMSxcIicpXG4gICAgICAgIC5zcGxpdCgnXFx0JylcbiAgICAgICAgLmpvaW4oJ1wiKTsnKVxuICAgICAgICAuc3BsaXQoJyU+JylcbiAgICAgICAgLmpvaW4oJ3AucHVzaChcIicpXG4gICAgICAgIC5zcGxpdCgnXFxyJylcbiAgICAgICAgLmpvaW4oJ1wiJykgK1xuICAgICAgJ1wiKTt9cmV0dXJuIHAuam9pbihcIlwiKTsnXG4gICk7XG5cbiAgLy8gUHJvdmlkZSBzb21lIGJhc2ljIGN1cnJ5aW5nIHRvIHRoZSB1c2VyXG4gIHJldHVybiBkYXRhID8gZm4oZGF0YSkgOiBmbjtcbn1cblxuQFBpcGUoe1xuICBuYW1lOiAnZWpzJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgR3VpRWpzUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICB0cmFuc2Zvcm0odmFsdWU6IHN0cmluZywgZGF0YSA9IHt9KTogc3RyaW5nIHtcbiAgICByZXR1cm4gZWpzVG1wbCh2YWx1ZSwgZGF0YSk7XG4gIH1cbn1cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2ZsZXhdJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgR3VpRmxleERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGZsZXg6IG51bWJlciB8IHVuZGVmaW5lZCA9IDEwMDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5zdHlsZS5mbGV4ID0gYDEgMSAke3RoaXMuZmxleH0lYDtcbiAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc3R5bGUubWF4V2lkdGggPSBgJHt0aGlzLmZsZXh9JWA7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVWYWx1ZXMoYTogR3VpRGVmYXVsdFZhbHVlLCBiOiBHdWlEZWZhdWx0VmFsdWUsIG9wZXJhdG9yOiBHdWlPcGVyYXRvcikge1xuICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgY2FzZSAnJGVxJzpcbiAgICAgIHJldHVybiBhID09PSBiO1xuICAgIGNhc2UgJyRuZSc6XG4gICAgICByZXR1cm4gYSAhPT0gYjtcbiAgICBjYXNlICckZ3QnOlxuICAgICAgcmV0dXJuIChhID8/IDApID4gKGIgPz8gMCk7XG4gICAgY2FzZSAnJGx0JzpcbiAgICAgIHJldHVybiAoYSA/PyAwKSA8IChiID8/IDApO1xuICAgIGNhc2UgJyRndGUnOlxuICAgICAgcmV0dXJuIChhID8/IDApID49IChiID8/IDApO1xuICAgIGNhc2UgJyRsdGUnOlxuICAgICAgcmV0dXJuIChhID8/IDApIDw9IChiID8/IDApO1xuICAgIGNhc2UgJyRpbic6XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShiKSAmJiBiLmluY2x1ZGVzKGEpO1xuICAgIGNhc2UgJyRuaW4nOlxuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYikgJiYgIWIuaW5jbHVkZXMoYSk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVCeVBhdGgob2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBwYXRoOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHBhdGguc3BsaXQoJy4nKS5yZWR1Y2UoKGFjYzogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCwga2V5KSA9PiB7XG4gICAgcmV0dXJuIGFjYz8uWydjaGlsZHJlbiddPy5ba2V5XSA/IGFjY1snY2hpbGRyZW4nXVtrZXldIDogYWNjPy5ba2V5XTtcbiAgfSwgb2JqKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZGVsRnJvbUNvbmZpZyhjb25maWc6IEd1aUZpZWxkcyA9IHt9LCBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9KSB7XG4gIGZvciAoY29uc3QgW2tleSwgZmllbGRDZmddIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZykpIHtcbiAgICBpZiAobW9kZWxba2V5XSAhPSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGZpZWxkQ2ZnLmRlZmF1bHQgIT0gbnVsbCkge1xuICAgICAgbW9kZWxba2V5XSA9IGZpZWxkQ2ZnLmRlZmF1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChcbiAgICAgICAgZmllbGRDZmcudHlwZSA9PT0gJ2dyb3VwJyB8fFxuICAgICAgICBmaWVsZENmZy50eXBlID09PSAnaW5saW5lJyB8fFxuICAgICAgICBmaWVsZENmZy50eXBlID09PSAnbWVudScgfHxcbiAgICAgICAgZmllbGRDZmcudHlwZSA9PT0gJ21lbnVJdGVtJ1xuICAgICAgKSB7XG4gICAgICAgIG1vZGVsW2tleV0gPSBnZXRNb2RlbEZyb21Db25maWcoZmllbGRDZmcuY2hpbGRyZW4gYXMgR3VpRmllbGRzLCB7fSk7XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkQ2ZnLnR5cGUgPT09ICd0YWJzJykge1xuICAgICAgICBtb2RlbFtrZXldID0gW107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtb2RlbFtrZXldID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1vZGVsO1xufVxuIl19