import {
LocalizedController,
HistoryNavigator,
EVENT_REFRESH,
EVENT_ACTION,
EVENT_SSAPP_HAS_LOADED,
BUTTON_ROLES,
} from "../../assets/pdm-web-components/index.esm.js";
const {OrderStatus} = require('wizard').Model;
export default class OrderController extends LocalizedController {
initializeModel = () => ({
orderLines: JSON.stringify([]),
identity: {},
orderRef: '',
mode: 'issued'
});
constructor(...args) {
super(false, ...args);
let self = this;
super.bindLocale(self, `order`);
self.model = self.initializeModel();
const wizard = require('wizard');
const {Order} = wizard.Model;
self._updateStatuses(Order);
const participantManager = wizard.Managers.getParticipantManager();
self.issuedOrderManager = wizard.Managers.getIssuedOrderManager(participantManager);
self.issuedOrderManager.bindController(self);
self.orderEl = self.querySelector('managed-order');
HistoryNavigator.registerTab({
'tab-order': self.translate('title')
})
self.on(EVENT_REFRESH, (evt) => {
evt.preventDefault();
evt.stopImmediatePropagation();
self.model.identity = self.issuedOrderManager.getIdentity();
self.orderEl.updateDirectory();
const state = evt.detail;
const label = !!state.previousTab ? state.previousTab.label : HistoryNavigator.getPreviousTab().label;
self.model.back = this.translate('back', label);
if (state && state.mode && state.order) {
self.model.mode = state.mode;
const newRef = `${state.mode === 'issued' ? state.order.senderId : state.order.requesterId}-${state.order.orderId}`;
if (newRef === self.model.orderRef)
return self.orderEl.refresh();
self.model.orderRef = newRef;
} else {
self.mode = 'issued';
self.model.orderRef = '';
self.model.orderLines = JSON.stringify(state && state.orderLines ? [...state.orderLines] : []);
}
});
self.on(EVENT_ACTION, async (evt) => {
evt.preventDefault();
evt.stopImmediatePropagation();
const {action, props} = evt.detail;
switch (action){
case OrderStatus.CREATED:
return await self._handleCreateOrder.call(self, props);
default:
const {newStatus, order, extraInfo} = props;
return await self._handleUpdateOrderStatus.call(self, order, newStatus, extraInfo);
}
});
console.log("OrderController initialized");
}
_updateStatuses(clazz){
if (!clazz.getAllowedStatusUpdateFromShipment)
throw new Error("Invalid Class provided")
const obj = this.model.toObject().statuses;
this.model.statuses = Object.keys(obj).reduce((accum, state) => {
accum[state].paths = clazz.getAllowedStatusUpdateFromShipment(state);
return accum;
}, obj);
}
async _handleUpdateOrderStatus(order, newStatus, extraInfo){
const self = this;
const oldStatus = order.status.status;
const oldExtraInfo = order.status.extraInfo;
order.status['status'] = newStatus;
order.status['extraInfo'] = extraInfo;
const errors = order.validate(oldStatus);
if (errors) {
order.status['status'] = oldStatus; // rollback
order.status['extraInfo'] = oldExtraInfo;
return self.showErrorToast(self.translate(`manage.error.invalid`, errors.join('\n')));
}
const loader = self._getLoader(self.translate('manage.loading'));
await loader.present();
const sendError = async function(msg){
await loader.dismiss();
self.showErrorToast(msg);
}
self.issuedOrderManager.update(order, async (err, updatedOrder) => {
if (err)
return sendError(self.translate('manage.error.error'));
self.showToast(self.translate('manage.success'));
self.refresh({
mode: 'issued',
order: updatedOrder
});
await loader.dismiss();
});
}
/**
* Sends an event named create-issued-order to the IssuedOrders controller.
*/
async _handleCreateOrder(order) {
let self = this;
if (order.validate())
return this.showErrorToast(this.translate(`create.error.invalid`));
const alert = await self.showConfirm('create.confirm');
const {role} = await alert.onDidDismiss();
if (BUTTON_ROLES.CONFIRM !== role)
return console.log(`Order creation canceled by clicking ${role}`);
const loader = self._getLoader(self.translate('create.loading'));
await loader.present()
const sendError = async function(msg){
await loader.dismiss();
self.showErrorToast(msg);
}
self.issuedOrderManager.create(order, async (err, keySSI, dbPath) => {
if (err)
return sendError(self.translate('create.error.error'));
self.showToast(self.translate('create.success'));
self.model.mode = 'issued';
self.model.orderRef = `${order.senderId}-${order.orderId}`;
await loader.dismiss();
});
}
async showConfirm(action = 'create.confirm', ...args){
return super.showConfirm(this.translate(`${action}.message`, ...args),
this.translate(`${action}.buttons.ok`),
this.translate(`${action}.buttons.cancel`));
}
async _showPopup(message = 'create.confirm', popupOptions, callback, ...args){
return super.showPopup({
message: this.translate(`${message}.message`, ...args),
confirmButtonLabel: this.translate(`${message}.buttons.ok`),
cancelButtonLabel: this.translate(`${message}.buttons.cancel`),
options: popupOptions
}, callback);
}
}
Source