discourse/app/assets/javascripts/select-kit/addon/components/selected-name.js
Joffrey JAFFEUX 0854785175
FIX: allows to define label/title properties for display instead of name
Usage:

```
const content = [{foo: "FOO", bar: "BAR", value: 1, name: "foo-bar"}];

{{combo-box
  content=content
  value=value
  labelProperty="foo"
  titleProperty="bar"
}}
```
2020-05-28 08:30:31 +02:00

75 lines
2.0 KiB
JavaScript

import { computed, get, action } from "@ember/object";
import Component from "@ember/component";
import { makeArray } from "discourse-common/lib/helpers";
import UtilsMixin from "select-kit/mixins/utils";
export default Component.extend(UtilsMixin, {
tagName: "",
layoutName: "select-kit/templates/components/selected-name",
name: null,
value: null,
@action
onSelectedNameClick() {
if (this.selectKit.options.clearOnClick) {
this.selectKit.deselect(this.item);
return false;
}
},
didReceiveAttrs() {
this._super(...arguments);
// we can't listen on `item.nameProperty` given it's variable
this.setProperties({
headerLabel: this.getProperty(this.item, "labelProperty"),
headerTitle: this.getProperty(this.item, "titleProperty"),
name: this.getName(this.item),
value:
this.item === this.selectKit.noneItem ? null : this.getValue(this.item)
});
},
ariaLabel: computed("item", "sanitizedTitle", function() {
return this._safeProperty("ariaLabel", this.item) || this.sanitizedTitle;
}),
// this might need a more advanced solution
// but atm it's the only case we have to handle
sanitizedTitle: computed("title", function() {
return String(this.title).replace("…", "");
}),
title: computed("headerTitle", "item", function() {
return (
this.headerTitle ||
this._safeProperty("title", this.item) ||
this.name ||
""
);
}),
label: computed("headerLabel", "title", "name", function() {
return (
this.headerLabel ||
this._safeProperty("label", this.item) ||
this.title ||
this.name
);
}),
icons: computed("item.{icon,icons}", function() {
const icon = makeArray(this._safeProperty("icon", this.item));
const icons = makeArray(this._safeProperty("icons", this.item));
return icon.concat(icons).filter(Boolean);
}),
_safeProperty(name, content) {
if (!content) {
return null;
}
return get(content, name);
}
});