import { SelectionModel } from "@angular/cdk/collections"; import { Component, EventEmitter, Input, OnDestroy, Output } from "@angular/core"; import { Subject, takeUntil } from "rxjs"; import { ProjectListView } from "../../models/view/project-list.view"; @Component({ selector: "sm-projects-list", templateUrl: "./projects-list.component.html", }) export class ProjectsListComponent implements OnDestroy { @Input() get projects(): ProjectListView[] { return this._projects; } set projects(projects: ProjectListView[]) { this.selection.clear(); this._projects = projects; } private _projects: ProjectListView[]; @Output() editProjectEvent = new EventEmitter(); @Output() viewProjectEvent = new EventEmitter(); @Output() deleteProjectEvent = new EventEmitter(); @Output() onProjectCheckedEvent = new EventEmitter(); @Output() newProjectEvent = 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.onProjectCheckedEvent.emit(this.selection.selected)); } ngOnDestroy(): void { this.destroy$.next(); this.destroy$.complete(); } isAllSelected() { const numSelected = this.selection.selected.length; const numRows = this.projects.length; return numSelected === numRows; } toggleAll() { this.isAllSelected() ? this.selection.clear() : this.selection.select(...this.projects.map((s) => s.id)); } deleteProject(projectId: string) { this.deleteProjectEvent.emit(this.projects.filter((p) => p.id == projectId)); } bulkDeleteProjects() { this.deleteProjectEvent.emit( this.projects.filter((project) => this.selection.isSelected(project.id)) ); } }