/
value-list.js.es6
95 lines (77 loc) · 2.08 KB
/
value-list.js.es6
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
import { makeArray } from "discourse-common/lib/helpers";
import { empty, alias } from "@ember/object/computed";
import Component from "@ember/component";
import { on } from "ember-addons/ember-computed-decorators";
import computed from "ember-addons/ember-computed-decorators";
export default Component.extend({
classNameBindings: [":value-list"],
inputInvalid: empty("newValue"),
inputDelimiter: null,
inputType: null,
newValue: "",
collection: null,
values: null,
noneKey: alias("addKey"),
@on("didReceiveAttrs")
_setupCollection() {
const values = this.values;
if (this.inputType === "array") {
this.set("collection", values || []);
return;
}
this.set(
"collection",
this._splitValues(values, this.inputDelimiter || "\n")
);
},
@computed("choices.[]", "collection.[]")
filteredChoices(choices, collection) {
return makeArray(choices).filter(i => collection.indexOf(i) < 0);
},
keyDown(event) {
if (event.keyCode === 13) this.send("addValue", this.newValue);
},
actions: {
changeValue(index, newValue) {
this._replaceValue(index, newValue);
},
addValue(newValue) {
if (this.inputInvalid) return;
this.set("newValue", "");
this._addValue(newValue);
},
removeValue(value) {
this._removeValue(value);
},
selectChoice(choice) {
this._addValue(choice);
}
},
_addValue(value) {
this.collection.addObject(value);
this._saveValues();
},
_removeValue(value) {
const collection = this.collection;
collection.removeObject(value);
this._saveValues();
},
_replaceValue(index, newValue) {
this.collection.replace(index, 1, [newValue]);
this._saveValues();
},
_saveValues() {
if (this.inputType === "array") {
this.set("values", this.collection);
return;
}
this.set("values", this.collection.join(this.inputDelimiter || "\n"));
},
_splitValues(values, delimiter) {
if (values && values.length) {
return values.split(delimiter).filter(x => x);
} else {
return [];
}
}
});