@ducna01120/fleetops-engine
Version:
Fleet & Transport Management Extension for Fleetbase
118 lines (91 loc) • 3.28 kB
JavaScript
import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking';
import { inject as service } from '@ember/service';
import { action, computed } from '@ember/object';
import { isArray } from '@ember/array';
import { isBlank } from '@ember/utils';
import { timeout } from 'ember-concurrency';
import { task } from 'ember-concurrency-decorators';
export default class FleetDriverListingComponent extends Component {
store;
appCache;
drivers = [];
selected = [];
query;
isLoading = false;
isLoaded = false;
get ids() {
return this.selected.map((selection) => selection.id);
}
async setupComponent() {
const { selected, fleet } = this.args;
this.selected = isArray(selected) && selected.length ? selected : [];
this.drivers = await this.queryFleetDrivers(fleet);
}
setSelected() {
const { selected } = this.args;
if (isArray(selected) && selected.length) {
this.selected = selected;
}
}
select(option, selected) {
if (selected) {
this.selected.pushObject(option);
} else {
this.selected.removeObject(option);
}
option.setProperties({ selected });
if (typeof this.args.onChange === 'function') {
this.args.onChange(this.selected);
}
}
onAdd(driver) {
if (typeof this.args.onRemoveDriver === 'function') {
this.args.onAddDriver(driver);
}
const index = this.drivers.findIndex((d) => d.id === driver.id);
if (index === -1) {
this.drivers.pushObject(driver);
}
}
onRemove(driver) {
if (typeof this.args.onRemoveDriver === 'function') {
this.args.onRemoveDriver(driver);
}
this.drivers.removeObject(driver);
}
queryFleetDrivers(fleet, query = null) {
this.isLoading = true;
const cacheKey = `${fleet.id}:fleetDrivers`;
// const cachedResults = this.appCache.getEmberData(cacheKey, 'driver');
// if (cachedResults) {
// this.drivers = this.toggleSelected(cachedResults);
// this.isLoaded = true;
// }
return new Promise((resolve) => {
this.store.query('driver', { query, fleet: fleet.id }).then((drivers) => {
this.isLoading = false;
this.isLoaded = true;
// save to cache
if (!query) {
this.appCache.setEmberData(cacheKey, drivers);
}
resolve(this.toggleSelected(drivers));
});
});
}
toggleSelected(options = []) {
return options.map((option) => {
option.set('selected', this.ids.includes(option.id));
return option;
});
}
*search({ target: { value } }) {
const { fleet } = this.args;
if (isBlank(value)) {
return;
}
yield timeout(300);
this.drivers = yield this.queryFleetDrivers(fleet, value);
}
}