aboutsummaryrefslogtreecommitdiffstats
path: root/src/angular/checklist/checklist.component.ts
blob: 386cd3ee532ef649805ef0ee2fed9ba1e3551654 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import { Component, EventEmitter, Input, Output } from "@angular/core";
import { ChecklistModel } from "./models/Checklist";
import { ChecklistItemModel } from "./models/ChecklistItem";
import template from "./checklist.component.html";

@Component({
    selector: 'sdc-checklist',
    template: template
})
export class ChecklistComponent  {
    @Input() public checklistModel: ChecklistModel;
    @Output() public checkedChange: EventEmitter<ChecklistItemModel> = new EventEmitter<ChecklistItemModel>();

    private checkboxCheckedChange(checkbox: ChecklistItemModel, currentChecklistModel: ChecklistModel, stopPropagation?: boolean) {
        // push/pop the checkbox value
        if (checkbox.isChecked) {
            currentChecklistModel.selectedValues.push(checkbox.value);
        }else {
            const index: number = currentChecklistModel.selectedValues.indexOf(checkbox.value);
            currentChecklistModel.selectedValues.splice(index, 1);
        }
        if (!stopPropagation) {
            if (checkbox.subLevelChecklist &&
                ((checkbox.isChecked && checkbox.subLevelChecklist.selectedValues.length < checkbox.subLevelChecklist.checkboxes.length) ||
                (!checkbox.isChecked && checkbox.subLevelChecklist.selectedValues.length))) {
                checkbox.subLevelChecklist.checkboxes.forEach((childCheckbox: ChecklistItemModel) => {
                    if (childCheckbox.isChecked !== checkbox.isChecked) {
                        childCheckbox.isChecked = checkbox.isChecked;
                        this.checkboxCheckedChange(childCheckbox, checkbox.subLevelChecklist);
                    }
                });
            }
        }
        // raise event
        this.checkedChange.emit(checkbox);
    }

    private childCheckboxChange(updatedCheckbox: ChecklistItemModel, parentCheckbox: ChecklistItemModel) {
        let updatedValues: any[] = parentCheckbox.subLevelChecklist.selectedValues;
        if (parentCheckbox.isChecked !== (updatedValues.length === parentCheckbox.subLevelChecklist.checkboxes.length)) {
            parentCheckbox.isChecked = updatedValues.length === parentCheckbox.subLevelChecklist.checkboxes.length;
            this.checkboxCheckedChange(parentCheckbox, this.checklistModel, true);
        }
        this.checkedChange.emit(updatedCheckbox);
    }

    private hasCheckedChild(currentCheckbox: Element): boolean {
        return !!currentCheckbox.querySelector(".sdc-checkbox__input:checked");
    }
}