hedera-web/forms/ecomerce/checkout/index.js

237 lines
5.0 KiB
JavaScript

import './style.scss';
export default new Class({
Extends: Hedera.Form,
Template: require('./ui.xml'),
activate() {
this.autoStepLocked = true;
this.$.assistant.stepsIndex = this.agencySteps;
this.today = Date.vnNew();
this.today.setHours(0, 0, 0, 0);
},
onValuesReady() {
const orderForm = this.$.orderForm;
const defaultsForm = this.$.defaults;
if (!(orderForm.ready && defaultsForm.ready))
return;
let date;
const row = orderForm.$ || defaultsForm.$ || {};
if (!date || date.getTime() < (Date.vnNew()).getTime()) {
date = Date.vnNew();
date.setHours(0, 0, 0, 0);
let addDays = 0;
switch(date.getDay()) {
case 6: // Saturday
addDays += 2;
break;
case 0: // Sunday
addDays++;
break;
}
if (row.deliveryMethod != 'PICKUP')
addDays++;
date.setDate(date.getDate() + addDays);
}
this.$.lot.assign({
date,
method: row.deliveryMethod,
agency: row.agencyModeFk,
address: row.addressFk
});
this.autoStepLocked = false;
},
disableButtons(disable) {
this.$.assistantBar.disabled = disable;
},
async onConfirmClick() {
this.disableButtons(true);
let id = this.$.params.$.id;
const params = Object.assign({}, this.$.lot.$);
let query;
if (id) {
params.id = id;
query = 'CALL myOrder_configure(#id, #date, #method, #agency, #address)';
} else {
query = 'CALL myOrder_create(@orderId, #date, #method, #agency, #address); SELECT @orderId;';
}
let resultSet;
try {
resultSet = await this.conn.execQuery(query, params);
} finally {
this.disableButtons(false);
}
if (!resultSet.fetchResult())
return;
let redirect;
const basket = new Hedera.Basket(this.app);
if (id) {
Htk.Toast.showMessage(_('OrderUpdated'));
switch(this.hash.$.continue) {
case 'catalog':
redirect = {form: 'ecomerce/catalog'};
break;
default:
redirect = {form: 'ecomerce/basket'};
if (id !== basket.orderId)
redirect.id = id;
}
} else {
basket.loadIntoBasket(resultSet.fetchValue());
redirect = {form: 'ecomerce/catalog'};
}
this.hash.setAll(redirect);
},
onCancelClick() {
if (this.$.params.$.id)
window.history.back();
else
this.hash.setAll({form: 'ecomerce/orders'});
},
agencySteps: ['method', 'date', 'address', 'agency', 'confirm-delivery'],
pickupSteps: ['method', 'date', 'address', 'pickup', 'confirm-pickup'],
isDelivery() {
return this.$.rgMethod.value != 'PICKUP';
},
onMethodChange() {
this.$.assistant.stepsIndex = this.isDelivery() ?
this.agencySteps : this.pickupSteps;
this.onFieldChange();
},
methodValidate() {
if (!this.$.rgMethod.isSelected())
throw new Error(_('Please select an option'));
},
dateShow() {
Vn.Node.setText(this.$.dateQuestion, this.isDelivery() ?
_('OrderDateDeliveryQuestion'):
_('OrderDatePickupQuestion'));
this.$.calendar.goToSelectedMonth();
},
dateValidate() {
if (!this.$.calendar.value)
throw new Error(_('Please select a date'));
},
addressShow() {
Vn.Node.setText(this.$.addressQuestion, this.isDelivery() ?
_('AddressQuestion'):
_('AddressQuestionPickup'));
},
addressValidate() {
if (this.$.addressForm.row == -1)
throw new Error(_('Please select an address'));
},
agencyShow() {
this.$.agencies.refresh();
},
agencyValidate() {
if (this.$.agencyCombo.row == -1 && this.isDelivery())
throw new Error(_('Please select an agency'));
},
pickupShow() {
this.$.warehouses.refresh();
},
pickupValidate() {
if (this.$.warehouseCombo.row == -1)
throw new Error(_('Please select a store'));
},
onFieldChange() {
if (!this.autoStepLocked)
this.$.assistant.moveNext();
},
onAddressClick(addressId) {
this.$.lot.set('address', addressId);
this.$.assistant.moveNext();
},
onAddressChange() {
if (this.selectedNode)
Vn.Node.removeClass(this.selectedNode, 'selected');
const row = this.$.addresses.search('id', this.$.lot.$.address);
if (row != -1) {
const builder = this.$.repeater.getBuilder(row);
this.selectedNode = builder.$.address;
Vn.Node.addClass(this.selectedNode, 'selected');
}
this.$.addressForm.row = row;
},
onAgenciesReady(model) {
this.selectAgency(model, 'NoAgeciesAvailableForDate');
},
onWarehousesReady(model) {
this.selectAgency(model, 'NoWarehousesAvailableForDate');
},
selectAgency(model, emptyMessage) {
if (!model.ready) return;
let agencyId = null;
if (model.numRows > 0) {
const agencies = [this.$.lot.$.agency];
const defaults = this.$.defaults.$ || {};
if (defaults.agencyModeFk)
agencies.push(defaults.agencyModeFk);
if (defaults.defaultAgencyFk)
agencies.push(defaults.defaultAgencyFk);
for (const agency of agencies)
if (model.search('id', agency) !== -1) {
agencyId = agency;
break;
}
} else
Htk.Toast.showError(_(emptyMessage));
this.autoStepLocked = true;
this.$.lot.assign({agency: agencyId});
this.autoStepLocked = false;
},
calendarRestrict(date) {
return date.getTime() >= this.today.getTime();
}
});