import { SelectionModel } from "@angular/cdk/collections"; import { Component, EventEmitter, Input, OnDestroy, Output } from "@angular/core"; import { Subject, takeUntil } from "rxjs"; import { SecretListView } from "../models/view/secret-list.view"; @Component({ selector: "sm-secrets-list", templateUrl: "./secrets-list.component.html", }) export class SecretsListComponent implements OnDestroy { @Input() get secrets(): SecretListView[] { return this._secrets; } set secrets(secrets: SecretListView[]) { this.selection.clear(); this._secrets = secrets; } private _secrets: SecretListView[]; @Output() editSecretEvent = new EventEmitter(); @Output() copySecretNameEvent = new EventEmitter(); @Output() copySecretValueEvent = new EventEmitter(); @Output() projectsEvent = new EventEmitter(); @Output() onSecretCheckedEvent = new EventEmitter(); @Output() deleteSecretsEvent = new EventEmitter(); @Output() newSecretEvent = new EventEmitter(); @Output() importSecretsEvent = new EventEmitter(); private destroy$: Subject = new Subject(); selection = new SelectionModel(true, []); constructor() { this.selection.changed .pipe(takeUntil(this.destroy$)) .subscribe((_) => this.onSecretCheckedEvent.emit(this.selection.selected)); } ngOnDestroy(): void { this.destroy$.next(); this.destroy$.complete(); } isAllSelected() { const numSelected = this.selection.selected.length; const numRows = this.secrets.length; return numSelected === numRows; } toggleAll() { this.isAllSelected() ? this.selection.clear() : this.selection.select(...this.secrets.map((s) => s.id)); } bulkDeleteSecrets() { if (this.selection.selected.length >= 1) { this.deleteSecretsEvent.emit(this.selection.selected); } } }