frontend/apps/quantgrid/playwright/logic-entities/Table.ts (166 lines of code) (raw):
import { Field } from './Field';
import { Override } from './Override';
export class Table {
private top: number;
private left: number;
private name: string;
private isDynamic: boolean;
private isManual: boolean;
private isTableHeaderHidden: boolean;
private isFieldHeaderHidden: boolean;
public width() {
return this.fields.length;
}
public height() {
if (this.isDynamic) {
return undefined;
}
const base = 2;
if (this.isManual) return base + this.overrides[0].getSize();
else return base + 1;
}
public getTop() {
return this.top;
}
public getLeft() {
return this.left;
}
public getName() {
return this.name;
}
constructor(top: number, left: number, name: string) {
this.top = top;
this.left = left;
this.name = name;
this.fields = new Array<Field>(0);
this.overrides = new Array<Override>(0);
}
public makeManual() {
this.isManual = true;
}
public makeDynamic() {
this.isDynamic = true;
}
public hideHeader() {
this.isTableHeaderHidden = true;
}
public hideFieldHeader() {
this.isFieldHeaderHidden = true;
}
public showHeader() {
this.isTableHeaderHidden = false;
}
public showFieldHeader() {
this.isFieldHeaderHidden = false;
}
private fields: Array<Field>;
private overrides: Array<Override>;
public toDsl() {
let dsl = `!placement(${this.top},${this.left})\ntable ${this.name}\n`;
if (this.isFieldHeaderHidden) {
dsl = `!hideFields()\n${dsl}`;
}
if (this.isTableHeaderHidden) {
dsl = `!hideHeader()\n${dsl}`;
}
if (this.isManual) {
dsl = `!manual()\n${dsl}`;
}
for (const field of this.fields) {
dsl += field.toDsl() + '\n';
}
if (this.overrides.length > 0) {
dsl += 'override\n';
if (!this.isManual) dsl += 'row,';
for (const over of this.overrides) {
dsl += `[${over.getName()}],`;
}
dsl = dsl.slice(0, -1) + '\n';
let max = this.overrides[0].getMaxKey();
let dslSection = '';
for (let i = 1; i < this.overrides.length; i++)
if (this.overrides[i].getMaxKey() > max)
max = this.overrides[i].getMaxKey();
for (let i = 0; i <= max; i++) {
for (const over of this.overrides) {
if (over.getValue(i)) dslSection += over.getValue(i);
dslSection += ',';
}
if (dslSection.length > (dslSection.match(/,/g) || []).length) {
if (!this.isManual) dslSection = `${i},${dslSection}`;
dsl += dslSection.slice(0, -1) + '\n';
}
dslSection = '';
}
}
return dsl;
}
public updatePlacement(top: number, left: number) {
this.top = top;
this.left = left;
}
public updateName(newName: string) {
this.name = newName;
}
public removeField(name: string) {
const indToRemove = this.fields.findIndex(
(item) => item.getName() === name
);
this.fields.splice(indToRemove, 1);
}
public addField(field: Field) {
this.fields.push(field);
}
public swapFields(index1: number, index2: number) {
const t = this.fields[index1];
this.fields[index1] = this.fields[index2];
this.fields[index2] = t;
}
public getField(ind: number) {
return this.fields[ind];
}
public getFieldByName(name: string) {
const ind = this.fields.findIndex((item) => item.getName() === name);
return this.getField(ind);
}
public createOverride(name: string, values: Map<number, string>) {
this.overrides.push(new Override(name, values));
}
public addOverrideValue(name: string, row: number, value: string) {
let over = this.overrides.find((item) => item.getName() === name);
if (!over) {
this.createOverride(name, new Map<number, string>());
over = this.overrides.find((item) => item.getName() === name);
}
over?.updateValue(row, value);
}
public removeOverride(name: string) {
const indToRemove = this.overrides.findIndex(
(item) => item.getName() === name
);
this.overrides.splice(indToRemove, 1);
}
public removeOverrideValue(name: string, row: number) {
const override = this.overrides.find((item) => item.getName() === name);
override?.removeValue(row);
if (override?.getSize() === 0) this.removeOverride(name);
}
public getOverrideValue(name: string, row: number) {
const result = this.overrides
.find((item) => item.getName() === name)
?.getValue(row);
if (!result) return '';
return result;
}
public getFirstCellCoord() {
let verticalShift = 2;
if (this.isTableHeaderHidden) verticalShift--;
if (this.isFieldHeaderHidden) verticalShift--;
return this.getTop() + verticalShift;
}
public getFieldHeadersRow() {
let verticalShift = 1;
if (this.isTableHeaderHidden) verticalShift--;
return this.getTop() + verticalShift;
}
}