mirror of
https://github.com/TryGhost/Ghost.git
synced 2024-12-30 14:22:07 +03:00
103 lines
3.0 KiB
JavaScript
103 lines
3.0 KiB
JavaScript
import Component from '@glimmer/component';
|
|
import RSVP, {resolve} from 'rsvp';
|
|
import {action, get} from '@ember/object';
|
|
import {defaultMatcher, filterOptions} from 'ember-power-select/utils/group-utils';
|
|
import {tracked} from '@glimmer/tracking';
|
|
|
|
export default class GhInputWithSelectComponent extends Component {
|
|
@tracked searchEnabled = true;
|
|
|
|
get matcher() {
|
|
return this.args.matcher || defaultMatcher;
|
|
}
|
|
|
|
get valueField() {
|
|
return this.args.valueField || 'name';
|
|
}
|
|
|
|
shouldShowCreateOption(term, options) {
|
|
if (this.args.showCreate) {
|
|
return true;
|
|
}
|
|
return this.args.showCreateWhen ? this.args.showCreateWhen(term, options) : false;
|
|
}
|
|
|
|
addCreateOption(term, results) {
|
|
if (this.shouldShowCreateOption(term, results)) {
|
|
if (this.args.showCreatePosition === 'bottom'){
|
|
results.push(this.buildSuggestionForTerm(term));
|
|
} else {
|
|
results.unshift(this.buildSuggestionForTerm(term));
|
|
}
|
|
}
|
|
}
|
|
|
|
@action
|
|
searchAndSuggest(term, select) {
|
|
return RSVP.resolve(this.args.options).then((newOptions) => {
|
|
if (term.length === 0) {
|
|
return newOptions;
|
|
}
|
|
|
|
let searchAction = this.args.search;
|
|
if (searchAction) {
|
|
return resolve(searchAction(term, select)).then((results) => {
|
|
if (results.toArray) {
|
|
results = results.toArray();
|
|
}
|
|
this.addCreateOption(term, results);
|
|
return results;
|
|
});
|
|
}
|
|
|
|
newOptions = this.filter(newOptions, term);
|
|
this.addCreateOption(term, newOptions);
|
|
|
|
return newOptions;
|
|
});
|
|
}
|
|
|
|
@action
|
|
selectOrCreate(selection, select, keyboardEvent) {
|
|
// don't randomly select an option whilst typing in the input
|
|
if (select && !select.isOpen) {
|
|
return;
|
|
}
|
|
|
|
const value = selection.__value__ || get(selection, this.valueField);
|
|
|
|
if (this.args.onChange) {
|
|
return this.args.onChange(value, select, keyboardEvent);
|
|
} else {
|
|
return this.args.onInput(value, select, keyboardEvent);
|
|
}
|
|
}
|
|
|
|
// Methods
|
|
filter(options, searchText) {
|
|
let matcher;
|
|
if (this.args.searchField) {
|
|
matcher = (option, text) => this.matcher(get(option, this.args.searchField), text);
|
|
} else {
|
|
matcher = (option, text) => this.matcher(option, text);
|
|
}
|
|
return filterOptions(options || [], searchText, matcher);
|
|
}
|
|
|
|
buildSuggestionForTerm(term) {
|
|
return {
|
|
__isSuggestion__: true,
|
|
__value__: term,
|
|
text: this.buildSuggestionLabel(term)
|
|
};
|
|
}
|
|
|
|
buildSuggestionLabel(term) {
|
|
if (this.args.buildSuggestion) {
|
|
return this.args.buildSuggestion(term);
|
|
}
|
|
|
|
return `Create "${term}"...`;
|
|
}
|
|
}
|