import { Component, Input, ViewChild, ElementRef, Output, EventEmitter } from '@angular/core'; interface Checkable { checked: boolean; } @Component({ selector: 'app-master-checkbox', template: `
` }) export class MasterCheckboxComponent { @Input() id: string; @Input() list: Map; @Output() changed = new EventEmitter(); @ViewChild('masterCheckbox') masterCheckbox: ElementRef; selected: boolean; clicked() { this.list.forEach(item => item.checked = this.selected); this.selectionChanged(); } selectionChanged() { if (!this.masterCheckbox) return; let checked: number = 0; this.list.forEach(item => { if(item.checked) checked++ }); this.selected = checked > 0 && checked == this.list.size; this.masterCheckbox.nativeElement.indeterminate = checked > 0 && checked < this.list.size; this.changed.emit(checked); } } @Component({ selector: 'app-slave-checkbox', template: `
` }) export class SlaveCheckboxComponent { @Input() id: string; @Input() master: MasterCheckboxComponent; @Input() checkable: Checkable; }