projects/onto-search/src/lib/onto-search-column-selector/onto-search-column-selector.component.ts
selector | onto-search-column-selector |
styleUrls | onto-search-column-selector.component.scss |
templateUrl | onto-search-column-selector.component.html |
columnGroups
|
The groups of columns information for the dropdown select
Type: |
defaultColumns
|
Sets default columns. Shown when no selectedColumns are passed and when
Type: |
selectedColumns
|
Sets selected columns in dropdown select
Type: |
selectionChanged
|
Fired when the dropdown panel is closed. $event type: EventEmitter<SelectionColumn[]>
|
selectionChangedInternal |
selectionChangedInternal($event: MatSelectChange)
|
Returns:
void
|
onClosed |
onClosed()
|
Returns:
void
|
compareColumnsLabels |
compareColumnsLabels(columnA: SelectionColumn, columnB: SelectionColumn)
|
Returns:
boolean
|
resetColumns |
resetColumns()
|
Returns:
void
|
Private setFormColumnSelection |
setFormColumnSelection(columns: SelectionColumn[])
|
Returns:
void
|
Private compareColumnsByLabel |
compareColumnsByLabel(columnA: SelectionColumn, columnB: SelectionColumn)
|
Returns:
number
|
Private isSelectionChanged |
isSelectionChanged: |
Default value: false
|
selectCtrl |
selectCtrl: |
Private selection |
selection: |
import {Component, EventEmitter, Input, OnChanges, Output, SimpleChanges} from '@angular/core';
import {MatSelectChange} from '@angular/material/select';
import {FormControl} from '@angular/forms';
import {SelectionColumn} from './models/selection-column';
import {SelectionColumnGroup} from './models/selection-column-group';
@Component({
selector: 'onto-search-column-selector',
templateUrl: './onto-search-column-selector.component.html',
styleUrls: ['./onto-search-column-selector.component.scss']
})
export class OntoSearchColumnSelector implements OnChanges {
/**
* The groups of columns information for the dropdown select
*/
@Input()
columnGroups: SelectionColumnGroup[];
/**
* Sets selected columns in dropdown select
*/
@Input()
selectedColumns: SelectionColumn[];
/**
* Sets default columns. Shown when no selectedColumns are passed and when
* reset button is pressed
*/
@Input()
defaultColumns: SelectionColumn[];
/**
* Fired when the dropdown panel is closed.
* Sends an array {@link SelectionColumn}
*/
@Output()
selectionChanged: EventEmitter<SelectionColumn[]> = new EventEmitter<SelectionColumn[]>();
selectCtrl = new FormControl();
private selection: SelectionColumn[] = [];
private isSelectionChanged = false;
ngOnChanges(changes: SimpleChanges): void {
const defaultColumns = changes?.defaultColumns?.currentValue;
const selectedColumns = changes?.selectedColumns?.currentValue;
const columnGroups = changes?.columnGroups?.currentValue;
if (defaultColumns && defaultColumns.length > 0 && !this.selectedColumns) {
this.setFormColumnSelection(defaultColumns);
}
if (selectedColumns) {
this.setFormColumnSelection(selectedColumns);
}
if (columnGroups?.length) {
this.columnGroups.sort(this.compareColumnsByLabel);
}
}
selectionChangedInternal($event: MatSelectChange): void {
this.isSelectionChanged = true;
this.selection = $event.value;
}
onClosed(): void {
if (this.isSelectionChanged) {
this.isSelectionChanged = false;
this.selectionChanged.next(this.selection);
}
}
compareColumnsLabels(columnA: SelectionColumn, columnB: SelectionColumn): boolean {
return columnA.label === columnB.label;
}
resetColumns(): void {
this.setFormColumnSelection(this.defaultColumns);
}
private setFormColumnSelection(columns: SelectionColumn[]): void {
this.selectCtrl.setValue([...columns]);
this.selectCtrl.updateValueAndValidity();
this.selection = columns;
this.isSelectionChanged = true;
this.onClosed();
}
private compareColumnsByLabel(columnA: SelectionColumn, columnB: SelectionColumn): number {
if (columnA.label > columnB.label) {
return 1;
} else if (columnB.label > columnA.label) {
return -1;
}
return 0;
}
}