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;
|