in frontend/apps/quantgrid/src/app/context/ViewportContext/GridBuilder.ts [185:379]
public buildGridTableHeader(tableData: TableData, zIndex: number): GridData {
const { table, diff } = tableData;
const { tableName } = table;
const isTableHorizontal = table.getIsTableDirectionHorizontal();
const isTableHeaderHidden = table.getIsTableHeaderHidden();
const isFieldsHeaderHidden = table.getIsTableFieldsHidden();
const totalSize = table.getTotalSize();
const tableDimensions = this.getTableDimensions(
tableName,
isTableHorizontal
);
const { startCol, startRow, endCol } = tableDimensions;
const data: GridData = {};
// Add table header (first table row with tableName)
if (!isTableHeaderHidden) {
for (let col = startCol; col <= endCol; col++) {
GridBuilder.setSafeDataCell(data, startRow, col, {
table: {
...tableDimensions,
tableName,
isTableNameHeaderHidden: isTableHeaderHidden,
isTableFieldsHeaderHidden: isFieldsHeaderHidden,
hasKeys: table.hasKeys(),
isTableHorizontal,
totalSize,
isManual: table.isManual(),
isNewAdded: !!diff?.table,
},
value: tableName,
row: startRow,
col,
startCol: tableDimensions.startCol,
endCol: tableDimensions.endCol,
zIndex: col === startCol ? zIndex + 1 : zIndex,
isFieldHeader: false,
isTableHeader: true,
});
}
}
// Add table fields headers (second table row with names of the fields)
const fieldRow = startRow + table.getTableNameHeaderHeight();
let directionIndex = isTableHorizontal ? fieldRow : startCol;
for (const field of table.fields) {
const columnName = field.key.fieldName;
const fieldSize = !isTableHorizontal ? field.getSize() : 1;
// dynamic fields are drawing separately
if (columnName === dynamicFieldName) {
continue;
}
const isNested = tableData.nestedColumnNames.has(columnName);
const type = tableData.types[columnName];
const isPeriodSeries = type === ColumnDataType.PERIOD_SERIES;
const expression = field.expressionMetadata?.text || '';
const viewportErrorMessage = tableData?.fieldErrors[columnName];
const fieldErrorMessage = getFieldErrors(
this.viewGridData.getParsingErrors(),
this.viewGridData.getCompilationErrors(),
viewportErrorMessage,
tableName,
columnName
);
const note = field.note?.text || '';
const { sort, isFiltered, numericFilter, isFieldUsedInSort } =
this.getApplyBlockGridParams(tableData, table, columnName);
// This iterations needed for case when table is NOT horizontal and fields sizes not 1
for (
let innerFieldIndex = 0;
innerFieldIndex < fieldSize;
innerFieldIndex++
) {
const directionOffset = directionIndex + innerFieldIndex;
const cellCol = isTableHorizontal
? startCol
: directionIndex + innerFieldIndex;
const cellRow = isTableHorizontal ? directionOffset : fieldRow;
const isMainFieldCell = innerFieldIndex === 0;
const fieldStartCol = isTableHorizontal ? startCol : directionIndex;
const fieldEndCol = isTableHorizontal
? startCol
: directionIndex + fieldSize - 1;
const targetColumnName = field.isDynamic
? dynamicFieldName
: columnName;
const totalFieldTypes =
table.total?.getFieldTotalTypes(targetColumnName);
const cellTable: GridTable = {
...tableDimensions,
tableName,
isTableNameHeaderHidden: isTableHeaderHidden,
isTableFieldsHeaderHidden: isFieldsHeaderHidden,
hasKeys: table.hasKeys(),
isTableHorizontal,
totalSize,
isManual: table.isManual(),
isNewAdded: !!diff?.table,
};
const cellField: GridField = {
fieldName: columnName,
note,
expression,
isPeriodSeries,
isDynamic: field.isDynamic,
isNested,
isKey: field.isKey,
isDim: field.isDim,
hasError: !!fieldErrorMessage,
errorMessage: fieldErrorMessage,
isFiltered,
numericFilter,
totalFieldTypes,
sort,
isFieldUsedInSort,
type,
isChanged: !!diff?.fields.includes(columnName),
};
if (!isFieldsHeaderHidden) {
GridBuilder.setSafeDataCell(data, cellRow, cellCol, {
table: cellTable,
value: isMainFieldCell ? columnName : '',
field: cellField,
row: cellRow,
col: cellCol,
startCol: fieldStartCol,
endCol: fieldEndCol,
zIndex,
isFieldHeader: true,
isTableHeader: false,
});
}
// Add total rows
for (let i = 1; i <= totalSize; i++) {
const offset = isFieldsHeaderHidden ? 1 : 0;
const col = isTableHorizontal ? cellCol + i - offset : cellCol;
const row = isTableHorizontal ? cellRow : cellRow + i - offset;
const targetColumnName = field.isDynamic
? dynamicFieldName
: columnName;
const totalExpression = table.total?.getFieldTotalByIndex(
targetColumnName,
i
);
const totalValue = tableData.total[targetColumnName]?.[i];
const value = totalValue && totalExpression ? totalValue : '';
const totalErrorMessage = getTotalErrors(
this.viewGridData.getParsingErrors(),
this.viewGridData.getCompilationErrors(),
tableName,
columnName,
i
);
const isRightAligned = this.isValueRightAligned(
cellField.isNested,
cellField.type
);
GridBuilder.setSafeDataCell(data, row, col, {
table: cellTable,
field: cellField,
totalExpression: totalExpression?.expression || '',
totalIndex: i,
totalType: totalExpression?.type,
hasError: !!totalErrorMessage,
errorMessage: totalErrorMessage,
value,
row,
col,
startCol: isTableHorizontal ? col : fieldStartCol,
endCol: isTableHorizontal ? col : fieldEndCol,
zIndex,
isRightAligned,
isFieldHeader: false,
isTableHeader: false,
});
}
}
directionIndex += fieldSize;
}
return data;
}