@ducna01120/fleetops-engine
Version:
Fleet & Transport Management Extension for Fleetbase
182 lines (152 loc) • 6.14 kB
JavaScript
import BaseController from '@ducna01120/fleetops-engine/controllers/base-controller';
import { tracked } from '@glimmer/tracking';
import { inject as service } from '@ember/service';
import { action } from '@ember/object';
import { format, isValid as isValidDate } from 'date-fns';
import isObject from '@fleetbase/ember-core/utils/is-object';
import isJson from '@fleetbase/ember-core/utils/is-json';
import createFullCalendarEventFromOrder, { createOrderEventTitle } from '../../../utils/create-full-calendar-event-from-order';
export default class OperationsSchedulerIndexController extends BaseController {
modalsManager;
notifications;
store;
intl;
hostRouter;
scheduledOrders = [];
unscheduledOrders = [];
events = [];
setCalendarApi(calendar) {
this.calendar = calendar;
// setup some custom post initialization stuff here
// calendar.setOption('height', 800);
}
viewEvent(order) {
// get the event from the calendar
let event = this.calendar.getEventById(order.id);
this.modalsManager.show('modals/order-event', {
title: `Scheduling for ${order.public_id}`,
acceptButtonText: 'Save Changes',
acceptButtonIcon: 'save',
hideDeclineButton: true,
order,
reschedule: (date) => {
if (date && typeof date.toDate === 'function') {
date = date.toDate();
}
order.set('scheduled_at', date);
},
unschedule: () => {
order.set('scheduled_at', null);
},
confirm: async (modal) => {
modal.startLoading();
if (!order.get('hasDirtyAttributes')) {
return modal.done();
}
try {
await order.save();
// remove event from calendar
if (event) {
this.removeEvent(event);
}
if (order.scheduled_at) {
// notify order has been scheduled
this.notifications.success(this.intl.t('fleet-ops.operations.scheduler.index.info-message', { orderId: order.public_id, orderAt: order.scheduledAt }));
// add event to calendar
event = this.calendar.addEvent(createFullCalendarEventFromOrder(order));
} else {
this.notifications.info(this.intl.t('fleet-ops.operations.scheduler.index.info-message', { orderId: order.public_id }));
}
// update event props
this.setEventProperty(event, 'title', createOrderEventTitle(order));
// refresh route
return this.hostRouter.refresh();
} catch (error) {
this.notifications.serverError(error);
modal.stopLoading();
}
},
});
}
viewOrderAsEvent(eventClickInfo) {
const { event } = eventClickInfo;
const order = this.store.peekRecord('order', event.id);
this.viewEvent(order, eventClickInfo);
}
async scheduleEventFromDrop(dropInfo) {
const { draggedEl, date } = dropInfo;
const { dataset } = draggedEl;
const { event } = dataset;
const data = JSON.parse(event);
const order = this.store.peekRecord('order', data.id);
try {
order.set('scheduled_at', date);
await order.save();
return this.hostRouter.refresh();
} catch (error) {
this.notifications.serverError(error);
this.removeEvent(event);
}
}
receivedEvent(eventReceivedInfo) {
const { event } = eventReceivedInfo;
const order = this.store.peekRecord('order', event.id);
this.setEventProperty(event, 'title', createOrderEventTitle(order));
}
async rescheduleEventFromDrag(eventDropInfo) {
const { event } = eventDropInfo;
const { start } = event;
const order = this.store.peekRecord('order', event.id);
const scheduledTime = order.scheduledAtTime;
const newDate = new Date(`${format(start, 'PP')} ${scheduledTime}`);
try {
// set and save order props
order.set('scheduled_at', isValidDate(newDate) ? newDate : start);
await order.save();
this.setEventProperty(event, 'title', createOrderEventTitle(order));
return this.hostRouter.refresh();
} catch (error) {
this.notifications.serverError(error);
this.removeEvent(event);
}
}
removeEvent(event) {
if (isObject(event) && typeof event.remove === 'function') {
event.remove();
return true;
}
if (isObject(event) && typeof event.id === 'string') {
return this.removeEvent(event.id);
}
if (isJson(event)) {
event = JSON.parse(event);
return this.removeEvent(event.id);
}
if (typeof event === 'string') {
event = this.calendar.getEventById(event);
if (typeof event.remove === 'function') {
event.remove();
return true;
}
}
return false;
}
getEvent(event) {
if (isJson(event)) {
event = JSON.parse(event);
return this.calendar.getEventById(event.id);
}
if (typeof event === 'string') {
return this.calendar.getEventById(event);
}
return event;
}
setEventProperty(event, prop, value) {
const eventInstance = this.getEvent(event);
if (typeof eventInstance.setProp === 'function') {
eventInstance.setProp(prop, value);
return true;
}
return false;
}
}