Files
project-work/worker-toolkit-flaredown/repo/frontend/app/components/select-field.js

91 lines
2.3 KiB
JavaScript

import Ember from 'ember';
export default Ember.Component.extend({
items: [],
selection: null,
resource: null,
defaultQueryParams: null,
placeholder: 'select item',
async: true,
create: false,
openOnFocus: true,
multiple: false,
classNames: ['select-field'],
createItemAction: Ember.computed('create', function() {
return this.get('create') ? 'createItem' : false;
}),
findAll() {
this.store.findAll(this.get('resource')).then( (items) => {
this.refreshItems(items);
});
},
findByQuery(params = { }, autoAddSelection=false) {
this.store.queryRecord('search', this.queryParams(params)).then( (items) => {
this.refreshItems(items.get('searchables'), autoAddSelection);
});
},
refreshItems(items, autoAddSelection=false) {
this.set('items', items);
let selectedItem = this.get('selection');
if (autoAddSelection && Ember.isPresent(selectedItem)) {
let foundItem = items.toArray().findBy('name', selectedItem.get('name'));
if (!Ember.isPresent(foundItem)) {
items.addObject(selectedItem);
}
}
},
queryParams(params) {
var defaults = this.get('defaultQueryParams');
if (Ember.isPresent(defaults)) {
if (Ember.isNone(params['query'])) {
params['query'] = {};
}
for (var key in defaults) { params['query'][key] = defaults[key]; }
}
return params;
},
randomItemsOnInit: false,
actions: {
fetchItems() {
if (this.get('randomItemsOnInit')) {
this.findByQuery({
resource: this.get('resource'),
scope: 'random',
}, true);
} else {
if(this.get('async')) {
this.findByQuery({ resource: this.get('resource') }, true);
} else if (Ember.isEmpty(this.get('items'))) {
this.findAll();
}
}
},
selectItem(item) {
Ember.tryInvoke(this, 'onSelect', [item]);
},
createItem(value) {
var item = this.store.createRecord(this.get('resource'), { name: value });
this.set('selection', item);
Ember.tryInvoke(this, 'onSelect', [item]);
},
updateFilter(value) {
if( this.get('async') && value.length >= 1 ) {
this.findByQuery({ resource: this.get('resource'), query: { name: value } });
}
}
}
});