This repository has been archived on 2023-03-18. You can view files and clone it, but cannot push or open issues or pull requests.
osr-discourse-src/app/assets/javascripts/select-kit/addon/components/select-kit/select-kit-header.js
2022-04-05 19:01:09 +02:00

173 lines
4.3 KiB
JavaScript

import Component from "@ember/component";
import UtilsMixin from "select-kit/mixins/utils";
import { computed } from "@ember/object";
import { makeArray } from "discourse-common/lib/helpers";
export default Component.extend(UtilsMixin, {
classNames: ["select-kit-header"],
classNameBindings: ["isFocused"],
attributeBindings: [
"role",
"tabindex",
"selectedValue:data-value",
"selectedNames:data-name",
"buttonTitle:title",
"selectKit.options.autofocus:autofocus",
],
selectKit: null,
role: "listbox",
tabindex: 0,
selectedValue: computed("value", function () {
return this.value === this.getValue(this.selectKit.noneItem)
? null
: makeArray(this.value).join(",");
}),
selectedNames: computed("selectedContent.[]", function () {
return makeArray(this.selectedContent)
.map((s) => this.getName(s))
.join(",");
}),
buttonTitle: computed("value", "selectKit.noneItem", function () {
if (
!this.value &&
this.selectKit.noneItem &&
!this.selectKit.options.showFullTitle
) {
return this.selectKit.noneItem.title || this.selectKit.noneItem.name;
}
}),
icons: computed("selectKit.options.{icon,icons}", function () {
const icon = makeArray(this.selectKit.options.icon);
const icons = makeArray(this.selectKit.options.icons);
return icon.concat(icons).filter(Boolean);
}),
didInsertElement() {
this._super(...arguments);
if (this.selectKit.options.autofocus) {
this.set("isFocused", true);
}
},
mouseDown() {
return false;
},
click(event) {
event.preventDefault();
event.stopPropagation();
this.selectKit.toggle(event);
},
keyUp(event) {
if (event.key === " ") {
event.preventDefault();
}
},
keyDown(event) {
if (this.selectKit.isDisabled || this.selectKit.options.disabled) {
return;
}
if (!this.selectKit.onKeydown(event)) {
return false;
}
const onlyShiftKey = event.shiftKey && event.key === "Shift";
if (event.metaKey || onlyShiftKey) {
return;
}
if (event.key === "Enter") {
event.stopPropagation();
if (this.selectKit.isExpanded) {
if (this.selectKit.highlighted) {
this.selectKit.select(
this.getValue(this.selectKit.highlighted),
this.selectKit.highlighted
);
return false;
}
} else {
this.selectKit.close(event);
}
} else if (event.key === "ArrowUp") {
event.stopPropagation();
if (this.selectKit.isExpanded) {
this.selectKit.highlightPrevious();
} else {
this.selectKit.open(event);
}
return false;
} else if (event.key === "ArrowDown") {
event.stopPropagation();
if (this.selectKit.isExpanded) {
this.selectKit.highlightNext();
} else {
this.selectKit.open(event);
}
return false;
} else if (event.key === " ") {
event.stopPropagation();
event.preventDefault(); // prevents the space to trigger a scroll page-next
this.selectKit.open(event);
} else if (event.key === "Escape") {
event.stopPropagation();
if (this.selectKit.isExpanded) {
this.selectKit.close(event);
} else {
this.element.blur();
}
} else if (event.key === "Tab") {
return true;
} else if (event.key === "Backspace") {
this._focusFilterInput();
} else if (
this.selectKit.options.filterable ||
this.selectKit.options.autoFilterable ||
this.selectKit.options.allowAny
) {
if (this.selectKit.isExpanded) {
this._focusFilterInput();
} else {
if (this.isValidInput(event.key)) {
this.selectKit.set("filter", event.key);
this.selectKit.open(event);
event.preventDefault();
event.stopPropagation();
}
}
} else {
if (this.selectKit.isExpanded) {
return false;
} else {
return true;
}
}
},
_focusFilterInput() {
const filterContainer = document.querySelector(
`#${this.selectKit.uniqueID}-filter`
);
if (filterContainer) {
filterContainer.style.display = "flex";
const filterInput = filterContainer.querySelector(".filter-input");
filterInput && filterInput.focus();
}
},
});