summaryrefslogtreecommitdiff
path: root/client/js/models/abstract_list.js
blob: 754b8e230b50b2c78641e713cd175d7df81aef9b (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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
"use strict";

const events = require("../events.js");

class AbstractList extends events.EventTarget {
    constructor() {
        super();
        this._list = [];
    }

    static fromResponse(response) {
        const ret = new this();
        ret.raw_data = response;
        for (let item of response) {
            const addedItem = this._itemClass.fromResponse(item);
            if (addedItem.addEventListener) {
                addedItem.addEventListener("delete", (e) => {
                    ret.remove(addedItem);
                });
                addedItem.addEventListener("change", (e) => {
                    ret.dispatchEvent(
                        new CustomEvent("change", {
                            detail: e.detail,
                        })
                    );
                });
            }
            ret._list.push(addedItem);
        }
        return ret;
    }

    sync(plainList) {
        this.clear();
        for (let item of plainList || []) {
            this.add(this.constructor._itemClass.fromResponse(item));
        }
    }

    add(item) {
        if (item.addEventListener) {
            item.addEventListener("delete", (e) => {
                this.remove(item);
            });
            item.addEventListener("change", (e) => {
                this.dispatchEvent(
                    new CustomEvent("change", {
                        detail: e.detail,
                    })
                );
            });
        }
        this._list.push(item);
        const detail = {};
        detail[this.constructor._itemName] = item;
        this.dispatchEvent(
            new CustomEvent("add", {
                detail: detail,
            })
        );
    }

    clear() {
        for (let item of [...this._list]) {
            this.remove(item);
        }
    }

    remove(itemToRemove) {
        for (let [index, item] of this._list.entries()) {
            if (item !== itemToRemove) {
                continue;
            }
            this._list.splice(index, 1);
            const detail = {};
            detail[this.constructor._itemName] = itemToRemove;
            this.dispatchEvent(
                new CustomEvent("remove", {
                    detail: detail,
                })
            );
            return;
        }
    }

    get length() {
        return this._list.length;
    }

    at(index) {
        return this._list[index];
    }

    map(...args) {
        return this._list.map(...args);
    }

    filter(...args) {
        return this._list.filter(...args);
    }

    includes(item) {
        return this._list.includes(item);
    }

    [Symbol.iterator]() {
        return this._list[Symbol.iterator]();
    }
}

module.exports = AbstractList;