91 lines
2.3 KiB
JavaScript
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 } });
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
});
|