UNPKG

stimulsoft-forms

Version:
592 lines 92.4 kB
import { Injectable } from "@angular/core"; import { Subject } from "rxjs"; import { StiFormElement } from "../elements/base/StiFormElement"; import { StiLabelElement } from "../elements/StiLabelElement"; import { StiTableElement } from "../elements/StiTableElement"; import { StiLabelColumnItem } from "../elements/table/columns/StiLabelColumnItem"; import { StiColumnItem } from "../elements/table/StiColumnItem"; import { StiTotalsFieldItem } from "../elements/table/StiTotalsFieldItem"; import { StiRowLabel } from "../elements/table/StiRowLabel"; import { StiStaticHelperService } from "./sti-static-helper.service"; import * as i0 from "@angular/core"; import * as i1 from "./model.service"; import * as i2 from "./mouse.service"; export class StiExpressionService { static { this.MOUSE_DELTA = 3; } getExpressionString(startItem) { let expressionObject = { previewString: "", startObject: null, lastCaretOffset: 1 }; expressionObject.startObject = startItem; if (typeof startItem.object == "string") { if (startItem.object.length == 1) { expressionObject.previewString = startItem.object; } else { let string = ""; if (startItem.object.toLowerCase() == "value") { string = startItem.object + `('')`; } else if (startItem.object.toLowerCase() == "line" || startItem.object.toLowerCase() == "today" || startItem.object.toLowerCase() == "time") { string = startItem.object; } else if (startItem.object.toLowerCase() == "cell") { string = startItem.object + "(,,'')"; } else if (startItem.object.toLowerCase() == "total" || startItem.object.toLowerCase() == "col" || startItem.object.toLowerCase() == "row") { string = startItem.object + "(,'')"; } else { string = startItem.object + "()"; } expressionObject.previewString = string; } } else { if (startItem.object instanceof StiFormElement) { expressionObject.previewString = `Value('${startItem.object.name}')`; } else { if (startItem.object instanceof StiTotalsFieldItem) { expressionObject.previewString = `Total(${startItem.object.eParent.totalsFields.indexOf(startItem.object) + 1},'${startItem.object.eParent.name}')`; } else if (startItem.object instanceof StiColumnItem && !startItem.isCell) { expressionObject.previewString = `Col(${startItem.object.eParent.columns.indexOf(startItem.object) + 1},'${startItem.object.eParent.name}')`; } else { expressionObject.previewString = `Cell(${startItem.object.eParent.columns.indexOf(startItem.object) + 1},${startItem.index},'${startItem.object.eParent.name}')`; } } } return expressionObject; } startContainerDrag(object) { this.startExpressionDraggingX = object.event.clientX; this.startExpressionDraggingY = object.event.clientY; this.draggableExpressionObject = this.getExpressionString(object); this.isDragging = true; let elem = this.elementRef.nativeElement; elem.focus(); } moveContainer(event) { if (this.isDragging) { event.preventDefault(); let elements = document.elementsFromPoint(event.clientX, event.clientY); if (elements.find((elem) => elem.classList.contains("expression-preview"))) { let currentRange; if (document.caretRangeFromPoint) { currentRange = document.caretRangeFromPoint(event.clientX, event.clientY); } else { let sel = window.getSelection(); sel.collapse(event.rangeParent, event.rangeOffset); currentRange = sel.getRangeAt(0); } this.currentCarretOffset = currentRange.startOffset; setTimeout(() => { var range = document.createRange(); var sel = window.getSelection(); if (this.elementRef.nativeElement.childNodes[0]) { range?.setStart(this.elementRef.nativeElement.childNodes[0], this.currentCarretOffset); range?.collapse(true); sel.removeAllRanges(); sel.addRange(range); this.draggableExpressionObject.lastCaretOffset = this.currentCarretOffset; } }); } let deltaX = event.clientX - this.startExpressionDraggingX; let deltaY = event.clientY - this.startExpressionDraggingY; if (this.startExpressionDraggingX - 10 + deltaX < 0) { this.expressionDraggableContainerX = 0; } else if (this.startExpressionDraggingX - 10 + deltaX > window.innerWidth - this.elementRef?.nativeElement.clientWidth) { this.expressionDraggableContainerX = window.innerWidth - this.elementRef?.nativeElement.clientWidth; } else { this.expressionDraggableContainerX = this.startExpressionDraggingX - 10 + deltaX; } if (this.startExpressionDraggingY - 10 + deltaY < 0) { this.expressionDraggableContainerY = 0; } else if (this.startExpressionDraggingY - 10 + deltaY > window.innerHeight - this.elementRef?.nativeElement.clientHeight) { this.expressionDraggableContainerY = window.innerHeight - this.elementRef?.nativeElement.clientHeight; } else { this.expressionDraggableContainerY = this.startExpressionDraggingY - 10 + deltaY; } } } endContainerDrag(event) { if (this.isDragging) { if (document .elementsFromPoint(event.clientX, event.clientY) .find((element) => element.classList.contains("expression-preview"))) { this.needToAddExpression.next(this.draggableExpressionObject); } this.isDragging = false; this.draggableExpressionObject = null; } } constructor(model, mouseService) { this.model = model; this.mouseService = mouseService; this.started = false; this.status = {}; this.componentWidth = 700; this.componentHeight = 482; this.needToAddExpression = new Subject(); this.expressionPreviewString = ""; this.isDragging = false; window.onresize = (event) => { if (window.innerWidth > this.componentWidth) { if (window.innerWidth < this.componentX + this.componentWidth) { this.componentX = (window.innerWidth - this.componentWidth) / 2; } } else { this.componentX = 0; } if (window.innerHeight > this.componentHeight) { if (window.innerHeight < this.componentY + this.componentHeight) { this.componentY = (window.innerHeight - this.componentHeight) / 2; } } else { this.componentY = 0; } }; this.mouseService.getDocumentMouseMove().subscribe((event) => { this.moveContainer(event); }); this.mouseService.getDocumentMouseUp().subscribe((event) => { this.endContainerDrag(event); }); } getCaretOffset(element) { let caretOffset = 0; let doc = element.ownerDocument || element.document; let win = doc.defaultView || doc.parentWindow; let sel; if (typeof win.getSelection != "undefined") { sel = win.getSelection(); if (sel.rangeCount > 0) { let range = win.getSelection().getRangeAt(0); let preCaretRange = range.cloneRange(); preCaretRange.selectNodeContents(element); preCaretRange.setEnd(range.endContainer, range.endOffset); caretOffset = preCaretRange.toString().length; } } else if ((sel = doc.selection) && sel.type != "Control") { let textRange = sel.createRange(); let preCaretTextRange = doc.body.createTextRange(); preCaretTextRange.moveToElementText(element); preCaretTextRange.setEndPoint("EndToEnd", textRange); caretOffset = preCaretTextRange.text.length; } return caretOffset; } start() { if (this.started) { return; } this.started = true; this.model.formEvents.subscribe((e) => { if (e.name == "ValueChanged" || e.name == "ComponentDeleted" || e.name == "SetForm" || e.name == "UpdateForm") { setTimeout(() => { this.calculate(); }, 0); } }); } addDependency(expression, names, dependecies, excludeName) { let regex = /(\{.+?\})/g; let exec; while ((exec = regex.exec(expression)) !== null) { names.forEach(n => { if (excludeName != n && exec[0].indexOf(`'${n}'`) > 0 && dependecies.indexOf(n) == -1) { dependecies.push(n); } }); } } calculate() { let elements = {}; let dependencies = {}; let allElements = this.model.form.allElements.filter(el => (el instanceof StiTableElement || el instanceof StiLabelElement)); let names = allElements.map(e => e.name); allElements.forEach((e) => { if (e instanceof StiTableElement) { let dep = []; let table = e; table.columns.filter(c => c instanceof StiLabelColumnItem). forEach((col) => this.addDependency(col.expression, names, dep, table.name)); table.totalsFields.forEach(t => this.addDependency(t.value, names, dep, table.name)); dependencies[table.name] = dep; } else if (e instanceof StiLabelElement) { let dep = []; let label = e; this.addDependency(label.text.value, names, dep, label.name); dependencies[label.name] = dep; } }); let calculatedElements = []; let excludeElements = ["dummy"]; while (excludeElements.length > 0) { excludeElements = []; allElements.forEach((e) => { if (dependencies[e.name].length == 0 || dependencies[e.name].every(name => calculatedElements.indexOf(name) >= 0)) { excludeElements.push(e); calculatedElements.push(e.name); if (e instanceof StiTableElement) { let table = e; table.columns.forEach((c, colIndex) => { if (c instanceof StiLabelColumnItem) { let label = c; label.cells.forEach((c, rowIndex) => { this.exec(label, elements, table, colIndex, rowIndex); }); } }); table.totalsFields.forEach((t, index) => { let total = t; this.exec(total, elements, table, null, null, index); }); table.rowLabelsContentEditable.forEach((r, index) => { let row = r; this.exec(row, elements, table, null, index); }); } else if (e instanceof StiLabelElement) { let label = e; this.exec(label, elements); } } }); allElements = allElements.filter(e => excludeElements.indexOf(e) == -1); } } getElementName(element, row) { if (element instanceof StiTotalsFieldItem || element instanceof StiLabelColumnItem || element instanceof StiRowLabel) { let tables = []; this.model.form.pages.forEach((p) => p.allElements.forEach((e) => { if (e instanceof StiTableElement) { tables.push(e); } })); let table = tables.find((t) => t.totalsFields?.indexOf(element) >= 0 || t.columns?.indexOf(element) >= 0 || t.rowLabelsContentEditable?.indexOf(element) >= 0); if (element instanceof StiRowLabel) { return `${table.name}.Row.${row}`; } if (element instanceof StiTotalsFieldItem) { return `${table.name}.0.0.${table.totalsFields.indexOf(element)}`; } else { return `${table.name}.${table.columns?.indexOf(element)}.${row}`; } } else { return element.name; } } exec(element, elements, table, col, row, total) { let elName = this.getElementName(element, row); if (elements[elName] || !("expression" in element)) { return; } else if (this.haveExpression(element)) { try { elements[elName] = true; let this_ = this; let Value = function (elementName) { let el = this_.findElement(elementName); if (el) { this_.exec(el, elements); return el.value; } return null; }; let Sum = function (elements) { let sum = 0; try { elements.forEach((element) => { if (this_.isNumber(element)) { sum += element; } }); } catch { } return sum; }; let Line = function () { try { return row + 1; } catch { return 0; } }; let Today = function () { try { return StiStaticHelperService.formatDate(new Date(), this_.model.form.settings.dateFormat, this_.model.form.settings.culture); } catch { return null; } }; let Time = function () { try { return StiStaticHelperService.formatDate(new Date(), this_.model.form.settings.timeFormat, this_.model.form.settings.culture); } catch { return null; } }; let Max = function (elements) { let res; try { elements.forEach((element) => { if (this_.isNumber(element)) { if (res == null) { res = element; } res = Math.max(element, res); } }); } catch { } return res; }; let Min = function (elements) { let res; try { elements.forEach((element) => { if (this_.isNumber(element)) { if (res == null) { res = element; } res = Math.min(element, res); } }); } catch { } return res; }; let Total = function (index, tableName) { try { let curTable = tableName ? this_.model.form.getElementByName(tableName) : table; let total = typeof index == "number" ? curTable.totalsFields[index - 1] : curTable.totalsFields.find((t) => t.header == index); this_.exec(total, elements, curTable, null, null, index); return total.value; } catch { } }; let Count = function (elements) { try { return elements.length; } catch { return 0; } }; let Col = function (name, tableName) { try { let curTable = tableName ? this_.model.form.getElementByName(tableName) : table; let column = this_.isNumber(name) ? curTable.columns[name - 1] : curTable.columns.find((c) => c.label.toLowerCase() == name.toLowerCase()); let result = []; column["cells"].forEach((cell, index) => { try { this_.exec(column, elements, curTable, curTable.columns.indexOf(column), index); result.push(cell["value"] != undefined ? cell.value : cell); } catch { result.push(undefined); } }); return row != null ? result[row] : result; } catch { } }; let Row = function (name, tableName) { try { let curTable = tableName ? this_.model.form.getElementByName(tableName) : table; let rowIndex = this_.isNumber(name) ? name - 1 : curTable.rowLabels.findIndex((value) => value.toLowerCase() == name.toLowerCase()); let result = []; curTable.columns.forEach((ccol, index) => { try { let cell = ccol["cells"][rowIndex]; if (typeof cell == "number") { result.push(cell); } else { this_.exec(cell, elements, curTable, index, rowIndex); result.push(cell["value"] != undefined ? cell.value : cell); } } catch { result.push(undefined); } }); return col != null ? result[col] : result; } catch { } }; let Cell = function (colIndex, rowIndex, tableName) { try { let curTable = tableName ? this_.model.form.getElementByName(tableName) : table; let ccol = this_.isNumber(colIndex) ? curTable.columns[colIndex - 1] : curTable.columns.find((c) => c.label == colIndex); let curRowIndex = this_.isNumber(rowIndex) ? rowIndex - 1 : curTable.rowLabels.findIndex((value) => value.toLowerCase() == rowIndex.toLowerCase()); let cell = ccol["cells"][curRowIndex]; this_.exec(cell["value"] != undefined ? cell : ccol, elements, curTable, colIndex, rowIndex); return cell["value"] != undefined ? cell.value : cell; } catch { } }; let regex = /(\{.+?\})/g; let exp = element["expression"].toString(); let exec; let displayValue = exp; while ((exec = regex.exec(exp)) !== null) { let value = this.isSystemVariables(exec[0]) ? eval(this.replaceSystemVariables(exec[0])) : eval(exec[0]); if (element instanceof StiRowLabel) { value = value; } else { value = typeof value == "function" ? "" : value; value = Number.isNaN(value) || value === undefined ? exec[0] : value; } if (element instanceof StiLabelColumnItem) { element.cells[row] = value; } else if (element instanceof StiRowLabel) { element.value = exec.input; } else { element.value = value; } if (this_.isNumber(value) && !this_.isSystemVariables(exec[0])) { let formattedElement = element instanceof StiLabelElement ? this_.model.form.settings : element; value = this_.model.getFormattedValue(formattedElement, value); } displayValue = displayValue.replace(exec[0], Number.isNaN(value) || value === undefined ? exec[0] : value); if (exec.index > 1 && !(element instanceof StiLabelElement) && !(element instanceof StiRowLabel)) { if (element instanceof StiLabelColumnItem) { element.cells[row] = displayValue; } else { element.value = displayValue; } } } if (element instanceof StiLabelElement || element instanceof StiRowLabel) { element.displayValue = displayValue; } } catch { this.resetValue(element, row, element["expression"]); } } else { this.resetValue(element, row, element["expression"]); } } replaceSystemVariables(expressionString) { let value = expressionString.replace(/\s/g, "").toLowerCase(); let startIndex; let slicedValue; if (value.indexOf("line") != -1) { startIndex = value.indexOf("line"); } else if (value.indexOf("today") != -1) { startIndex = value.indexOf("today"); } else { startIndex = value.indexOf("time"); } if (value.slice(startIndex, startIndex + 5) == "today") { slicedValue = value.slice(startIndex, startIndex + 5); } else { slicedValue = value.slice(startIndex, startIndex + 4); } let valueForReplace = slicedValue.split(); valueForReplace.push("("); valueForReplace.push(")"); let resultString = valueForReplace.join().replace(/,/g, ""); resultString = resultString[0].toUpperCase() + resultString.slice(1); return value.replace(slicedValue, resultString); } resetValue(element, row, expression) { if (element instanceof StiLabelElement) { element.displayValue = undefined; element.value = null; } else { let value = this.haveExpression(element) && expression?.toString() == parseFloat(expression).toString() ? parseFloat(expression) : expression?.toString() == parseFloat(expression).toString() ? parseFloat(expression) : expression; if (element instanceof StiLabelColumnItem) { element.cells[row] = value; } else { element.value = value; } } } isNumber(value) { return typeof value === "number" && !isNaN(value); } haveExpression(element) { let str = element["expression"]; let regex = /(\{.+?\})/g; let regex2 = /{.+?\}/g; return element instanceof StiLabelElement || element instanceof StiRowLabel ? regex.test(str) : (element instanceof StiTotalsFieldItem || element instanceof StiLabelColumnItem) && regex2.test(str); } isSystemVariables(string) { let value = string.replace(/\s/g, ""); return (value.toLowerCase().indexOf("line") != -1 || value.toLowerCase().indexOf("today") != -1 || value.toLowerCase().indexOf("time") != -1); } findElement(name) { let el; this.model.form.pages.forEach((p) => p.allElements.forEach((e) => { if (e.name == name) { el = e; } })); return el; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StiExpressionService, deps: [{ token: i1.StiModelService }, { token: i2.StiMouseService }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StiExpressionService }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StiExpressionService, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i1.StiModelService }, { type: i2.StiMouseService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RpLWV4cHJlc3Npb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0aW11bHNvZnQtZm9ybXMvc3JjL2xpYi9zZXJ2aWNlcy9zdGktZXhwcmVzc2lvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDakUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzlELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNsRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDaEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFJMUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzVELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDOzs7O0FBR3JFLE1BQU0sT0FBTyxvQkFBb0I7YUFDeEIsZ0JBQVcsR0FBRyxDQUFDLEFBQUosQ0FBSztJQXFCdkIsbUJBQW1CLENBQUMsU0FBUztRQUMzQixJQUFJLGdCQUFnQixHQUFpQyxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDbEgsZ0JBQWdCLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQztRQUN6QyxJQUFJLE9BQU8sU0FBUyxDQUFDLE1BQU0sSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUN4QyxJQUFJLFNBQVMsQ0FB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