stimulsoft-forms
Version:
Stimulsoft PDF Forms
592 lines • 92.4 kB
JavaScript
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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