File
Implements
Index
Properties
|
|
|
Methods
|
|
|
Inputs
|
|
|
HostBindings
|
|
|
Accessors
|
|
|
|
inline
|
Type : boolean | string
|
|
|
true - the menu is displayed inline and not absolute
|
|
matCard
|
Type : boolean | string
|
|
|
HostBindings
|
class.inline
|
Type : boolean
|
Default value : false
|
|
|
|
class.mat-card-mode
|
Type : boolean
|
Default value : false
|
|
|
Methods
|
Public
activate
|
activate(columnName: string)
|
|
|
Parameters :
| Name |
Type |
Optional |
| columnName |
string
|
No
|
|
|
Public
deactivate
|
deactivate(columnName: string)
|
|
|
Parameters :
| Name |
Type |
Optional |
| columnName |
string
|
No
|
|
|
Public
updateDisplayColumns
|
updateDisplayColumns()
|
|
|
|
|
|
Public
displayColumns
|
Type : string[]
|
Default value : []
|
|
|
Accessors
|
visibleColumns
|
getvisibleColumns()
|
|
|
|
inline
|
getinline()
|
|
|
setinline(value: boolean | string)
|
|
|
true - the menu is displayed inline and not absolute
Parameters :
| Name |
Type |
Optional |
| value |
boolean | string
|
No
|
|
|
matCard
|
setmatCard(value: boolean | string)
|
|
|
Parameters :
| Name |
Type |
Optional |
| value |
boolean | string
|
No
|
|
import {
NgClass,
NgFor,
} from '@angular/common';
import type { QueryList } from '@angular/core';
import {
AfterContentInit,
ChangeDetectionStrategy,
Component,
ContentChildren,
HostBinding,
Input,
} from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatIconModule } from '@angular/material/icon';
import { MatMenuModule } from '@angular/material/menu';
import { StopPropagationDirective } from '@rxap/directives';
import { coerceBoolean } from '@rxap/utilities';
import { TableColumnOptionComponent } from './table-column-option/table-column-option.component';
@Component({
selector: 'rxap-table-column-menu',
templateUrl: './table-column-menu.component.html',
styleUrls: ['./table-column-menu.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
exportAs: 'rxapTableColumns',
imports: [
MatButtonModule,
MatMenuModule,
MatIconModule,
NgFor,
StopPropagationDirective,
MatCheckboxModule,
NgClass,
]
})
export class TableColumnMenuComponent implements AfterContentInit {
public get visibleColumns() {
return this.columns?.filter((option) => !option.hidden);
}
@ContentChildren(TableColumnOptionComponent)
public columns?: QueryList<TableColumnOptionComponent>;
public displayColumns: string[] = [];
@HostBinding('class.inline')
private _inline = false;
public get inline(): boolean | '' {
return this._inline;
}
/**
* true - the menu is displayed inline and not absolute
* @param value
*/
@Input()
public set inline(value: boolean | '') {
this._inline = coerceBoolean(value);
}
@Input()
public set matCard(value: boolean | '') {
this._matCardMode = coerceBoolean(value);
}
@HostBinding('class.mat-card-mode')
private _matCardMode = false;
public ngAfterContentInit() {
this.updateDisplayColumns();
}
public updateDisplayColumns() {
if (!this.columns) {
throw new Error(
'Could not query content children of TableColumnOptionComponent',
);
}
this.displayColumns = this.columns
.filter((option) => option.active)
.map((option) => option.name);
}
public activate(columnName: string) {
this.columns
?.filter((option) => option.name === columnName)
.forEach((column) => column.activate());
this.updateDisplayColumns();
}
public deactivate(columnName: string) {
this.columns
?.filter((option) => option.name === columnName)
.forEach((column) => column.deactivate());
this.updateDisplayColumns();
}
}
<button [matMenuTriggerFor]="columnMenu" mat-icon-button type="button">
<mat-icon>tune</mat-icon>
</button>
<mat-menu #columnMenu="matMenu">
<span
*ngFor="let column of $any(visibleColumns ?? [])"
[disableRipple]="true"
mat-menu-item
rxapStopPropagation
>
<mat-checkbox
(change)="column.toggle(); updateDisplayColumns()"
[checked]="column.active">
{{ column.display }}
</mat-checkbox>
</span>
<ng-content select="[mat-menu-item],mat-divider"></ng-content>
</mat-menu>
:host {
/* TODO(mdc-migration): The following rule targets internal classes of card that may no longer apply for the MDC version. */
&.mat-card-mode:not(.inline) {
position: absolute;
top: 8px;
right: 8px;
bottom: auto;
left: auto;
}
}
Legend
Html element with directive