mirror of
https://github.com/discourse/discourse.git
synced 2025-02-10 05:14:59 +00:00
18461e38cf
In the long term we should aim to modernize these places, but for now this change will make them compatible with Ember 5.x (while maintaining compatibility with Ember 3.28)
95 lines
2.3 KiB
JavaScript
95 lines
2.3 KiB
JavaScript
import { arrayContentDidChange } from "@ember/-internals/metal";
|
|
import Component from "@ember/component";
|
|
import { action } from "@ember/object";
|
|
import { empty } from "@ember/object/computed";
|
|
import { isEmpty } from "@ember/utils";
|
|
import { classNameBindings } from "@ember-decorators/component";
|
|
import { on } from "@ember-decorators/object";
|
|
import discourseComputed from "discourse-common/utils/decorators";
|
|
|
|
@classNameBindings(":simple-list", ":value-list")
|
|
export default class SimpleList extends Component {
|
|
@empty("newValue") inputEmpty;
|
|
|
|
inputDelimiter = null;
|
|
newValue = "";
|
|
collection = null;
|
|
values = null;
|
|
choices = null;
|
|
allowAny = false;
|
|
|
|
@on("didReceiveAttrs")
|
|
_setupCollection() {
|
|
this.set("collection", this._splitValues(this.values, this.inputDelimiter));
|
|
this.set("isPredefinedList", !this.allowAny && !isEmpty(this.choices));
|
|
}
|
|
|
|
keyDown(event) {
|
|
if (event.which === 13) {
|
|
this.addValue(this.newValue);
|
|
return;
|
|
}
|
|
}
|
|
|
|
@action
|
|
changeValue(index, event) {
|
|
this.collection.replace(index, 1, [event.target.value]);
|
|
arrayContentDidChange(this.collection, index);
|
|
this._onChange();
|
|
}
|
|
|
|
@action
|
|
addValue(newValue) {
|
|
if (!newValue) {
|
|
return;
|
|
}
|
|
|
|
this.set("newValue", null);
|
|
this.collection.addObject(newValue);
|
|
this._onChange();
|
|
}
|
|
|
|
@action
|
|
removeValue(value) {
|
|
this.collection.removeObject(value);
|
|
this._onChange();
|
|
}
|
|
|
|
@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._onChange();
|
|
}
|
|
|
|
_onChange() {
|
|
this.onChange?.(this.collection);
|
|
}
|
|
|
|
@discourseComputed("choices", "values")
|
|
validValues(choices, values) {
|
|
return choices.filter((name) => !values.includes(name));
|
|
}
|
|
|
|
@discourseComputed("collection")
|
|
showUpDownButtons(collection) {
|
|
return collection.length - 1 ? true : false;
|
|
}
|
|
|
|
_splitValues(values, delimiter) {
|
|
return values && values.length
|
|
? values.split(delimiter || "\n").filter(Boolean)
|
|
: [];
|
|
}
|
|
}
|