discourse/app/assets/javascripts/admin/addon/components/value-list.js

139 lines
3.0 KiB
JavaScript

import { action } from "@ember/object";
import { classNames } from "@ember-decorators/component";
import discourseComputed from "discourse-common/utils/decorators";
import { on } from "@ember-decorators/object";
import { empty, reads } from "@ember/object/computed";
import Component from "@ember/component";
import { makeArray } from "discourse-common/lib/helpers";
@classNames("value-list")
export default class ValueList extends Component {
@empty("newValue") inputInvalid;
inputDelimiter = null;
inputType = null;
newValue = "";
collection = null;
values = null;
@reads("addKey") noneKey;
@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")
);
}
@discourseComputed("choices.[]", "collection.[]")
filteredChoices(choices, collection) {
return makeArray(choices).filter((i) => !collection.includes(i));
}
keyDown(event) {
if (event.key === "Enter") {
this.send("addValue", this.newValue);
}
}
@action
changeValue(index, event) {
this._replaceValue(index, event.target.value);
}
@action
addValue(newValue) {
if (this.inputInvalid) {
return;
}
this.set("newValue", null);
this._addValue(newValue);
}
@action
removeValue(value) {
this._removeValue(value);
}
@action
selectChoice(choice) {
this._addValue(choice);
}
@action
shift(operation, index) {
let futureIndex = index + operation;
if (futureIndex > this.collection.length - 1) {
futureIndex = 0;
} else if (futureIndex < 0) {
futureIndex = this.collection.length - 1;
}
const shiftedValue = this.collection[index];
this.collection.removeAt(index);
this.collection.insertAt(futureIndex, shiftedValue);
this._saveValues();
}
_addValue(value) {
this.collection.addObject(value);
if (this.choices) {
this.set("choices", this.choices.rejectBy("id", value));
} else {
this.set("choices", []);
}
this._saveValues();
}
_removeValue(value) {
this.collection.removeObject(value);
if (this.choices) {
this.set("choices", this.choices.concat([value]).uniq());
} else {
this.set("choices", makeArray(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"));
}
@discourseComputed("collection")
showUpDownButtons(collection) {
return collection.length - 1 ? true : false;
}
_splitValues(values, delimiter) {
if (values && values.length) {
return values.split(delimiter).filter((x) => x);
} else {
return [];
}
}
}