import { CdkDragDrop, moveItemInArray } from "@angular/cdk/drag-drop"; import { Injectable } from "@angular/core"; import { ActionColumn, SelectionType, TableColumn } from "../../models"; export interface TableColumnSettings { displayedColumns: TableColumn[]; availableMenuColumns: TableColumn[]; hasColumnHeaders: boolean; hasColumnFilters: boolean; tableColspan: number; } @Injectable() export class TableColumnService { constructor() {} getInitialColumnSettings(columns: TableColumn[], leftActionColumns: ActionColumn[], selectionType: SelectionType, initialColumns?: string): TableColumnSettings { let displayedColumns: TableColumn[] = []; let availableMenuColumns: TableColumn[] = []; if (initialColumns != null && initialColumns !== '') { const columnNames = initialColumns.split(';'); columnNames.forEach(name => { const column = columns.find(x => x.prop === name); if (column != null) { displayedColumns.push(column); availableMenuColumns.push(column); } }); } if (displayedColumns.length > 0) { if (availableMenuColumns.length < columns.length) { columns.forEach(column => { if (!availableMenuColumns.some(x => x.prop === column.prop)) { availableMenuColumns.push(column); } }); } } else { displayedColumns = columns; availableMenuColumns = columns; } const hasColumnHeaders = displayedColumns.some(x => !x.ignoreHeaders); const hasColumnFilters = displayedColumns.some(x => x.hasFilter); const tableColspan = this.getTableColspan(displayedColumns, leftActionColumns, selectionType); return { displayedColumns, availableMenuColumns, hasColumnHeaders, hasColumnFilters, tableColspan }; } private getTableColspan(displayedColumns: TableColumn[], leftActionColumns: ActionColumn[], selectionType: SelectionType): number { let colspan = 0; if (selectionType === SelectionType.checkbox) { colspan++; } colspan += displayedColumns.length + leftActionColumns.length; return colspan; } getDisplayedColumnsStrings(displayedColumns: TableColumn[]): string[] { if (displayedColumns != null && displayedColumns.length > 0) { return displayedColumns.map(x => x.prop); } return []; } onMouseDown(event: any, el: any = null): { x: string, y: string, width: string } { el = el || event.target; return { x: el.getBoundingClientRect().left - event.clientX + 'px', y: el.getBoundingClientRect().top - event.clientY + 'px', width: el.getBoundingClientRect().width + 'px' }; } dropColumn(event: CdkDragDrop, displayedColumns: TableColumn[]): TableColumn[] { moveItemInArray(displayedColumns, event.previousIndex, event.currentIndex); return displayedColumns; } getUpdatedColumnSettings(displayedColumns: TableColumn[], availableMenuColumns: TableColumn[], leftActionColumns: ActionColumn[], selectionType: SelectionType): TableColumnSettings { const sortedColumns: TableColumn[] = []; displayedColumns.forEach(column => { sortedColumns.push(column); }); availableMenuColumns.forEach(column => { if (!displayedColumns.some(x => x.prop === column.prop)) { sortedColumns.push(column); } }); const hasColumnHeaders = displayedColumns.some(x => !x.ignoreHeaders); const hasColumnFilters = displayedColumns.some(x => x.hasFilter); const tableColspan = this.getTableColspan(displayedColumns, leftActionColumns, selectionType); return { displayedColumns, availableMenuColumns: sortedColumns, hasColumnHeaders, hasColumnFilters, tableColspan }; } }