@fleetbase/fleetops-engine
Version:
Fleet & Transport Management Extension for Fleetbase
141 lines (122 loc) • 5.12 kB
JavaScript
import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking';
import { inject as service } from '@ember/service';
import { action, get, setProperties } from '@ember/object';
import { isArray } from '@ember/array';
import { debug } from '@ember/debug';
import { task } from 'ember-concurrency';
export default class CustomerOrderFormComponent extends Component {
orderCreation;
customFieldsRegistry;
customFields = null;
cancelOrderCreation() {
if (typeof this.args.onCancel === 'function') {
this.args.onCancel();
}
}
*loadCustomerOrderConfig() {
try {
this.orderConfigs = yield this.store.findAll('order-config');
} catch (error) {
this.notifications.serverError(error);
}
try {
this.enabledOrderConfigs = yield this.fetch.get('fleet-ops/settings/customer-enabled-order-configs');
this.orderConfigs = this.orderConfigs.filter((orderConfig) => this.enabledOrderConfigs.includes(orderConfig.id));
if (this.orderConfigs) {
this._setOrderConfig(this.orderConfigs[0].id);
}
} catch (error) {
this.notifications.serverError(error);
}
if (!this.orderConfigs) {
try {
const defaultOrderConfig = yield this.fetch.get('orders/default-config', {}, { normalizeToEmberData: true, normalizeModelType: 'order-config' });
if (defaultOrderConfig) {
this._setOrderConfig(defaultOrderConfig.id);
}
} catch (error) {
this.notifications.serverError(error);
}
}
try {
const paymentsConfig = yield this.fetch.get('fleet-ops/settings/customer-payments-config');
if (paymentsConfig) {
this.paymentsEnabled = paymentsConfig.paymentsEnabled;
this.paymentsOnboardCompleted = paymentsConfig.paymentsOnboardCompleted;
}
} catch (error) {
this.notifications.serverError(error);
}
}
*getQuotes() {
if (this.loadCustomerOrderConfig.isRunning || this.urlSearchParams.has('checkout_session_id')) {
return;
}
let payload = this.payload.serialize();
let route = this.getRoute();
let distance = get(route, 'details.summary.totalDistance');
let time = get(route, 'details.summary.totalTime');
let service_type = this.order.type;
let scheduled_at = this.order.scheduled_at;
let facilitator = this.order.facilitator?.get('public_id');
let is_route_optimized = this.order.get('is_route_optimized');
let { waypoints, entities } = this;
let places = [];
if (this.payloadCoordinates.length < 2) {
return;
}
// get place instances from WaypointModel
for (let i = 0; i < waypoints.length; i++) {
let place = yield waypoints[i].place;
places.pushObject(place);
}
setProperties(payload, { type: this.order.type, waypoints: places, entities });
try {
const serviceQuotes = yield this.fetch.post(
'service-quotes/preliminary',
{
payload: this._getSerializedPayload(payload),
distance,
time,
service,
service_type,
facilitator,
scheduled_at,
is_route_optimized,
},
{ normalizeToEmberData: true, normalizeModelType: 'service-quote' }
);
this.serviceQuotes = isArray(serviceQuotes) ? serviceQuotes : [];
if (this.serviceQuotes.length) {
this.selectedServiceQuote = this.serviceQuotes.firstObject.id;
}
} catch (error) {
this.notifications.serverError(error);
}
}
*selectOrderConfig(orderConfig) {
if (!orderConfig) return;
this.setOrderConfig(orderConfig);
try {
yield this.getQuotes.perform();
const customFieldsManager = yield this.customFieldsRegistry.loadSubjectCustomFields.perform(orderConfig);
this.orderCreation.addContext('cfManager', customFieldsManager);
this.customFields = customFieldsManager;
this.args.resource.cfManager = customFieldsManager;
if (typeof this.args.onCustomFieldsReady === 'function') {
this.args.onCustomFieldsReady(customFieldsManager);
}
} catch (err) {
debug('Error loading order custom fields: ' + err.message);
}
}
setOrderConfig(orderConfig) {
this.args.resource.setProperties({
order_config_uuid: orderConfig.id,
order_config: orderConfig,
type: orderConfig.key,
});
this.args.resource.payload.set('type', orderConfig.key);
}
}