odoo.define('lunch.LunchControllerCommon', function (require) {
"use strict";
/**
* This file defines the common events and functions used by Controllers for the Lunch view.
*/
var session = require('web.session');
var core = require('web.core');
var LunchWidget = require('lunch.LunchWidget');
var LunchPaymentDialog = require('lunch.LunchPaymentDialog');
var _t = core._t;
var LunchControllerCommon = {
custom_events: {
add_product: '_onAddProduct',
change_location: '_onLocationChanged',
change_user: '_onUserChanged',
open_wizard: '_onOpenWizard',
order_now: '_onOrderNow',
remove_product: '_onRemoveProduct',
unlink_order: '_onUnlinkOrder',
},
/**
* @override
*/
init: function () {
this._super.apply(this, arguments);
this.editMode = false;
this.updated = false;
this.widgetData = null;
this.context = session.user_context;
this.archiveEnabled = false;
},
/**
* @override
*/
start: function () {
// create a div inside o_content that will be used to wrap the lunch
// banner and renderer (this is required to get the desired
// layout with the searchPanel to the left)
var self = this;
this.$('.o_content').append($('
').addClass('o_lunch_content'));
return this._super.apply(this, arguments).then(function () {
self.$('.o_lunch_content').append(self.$('.o_lunch_view'));
});
},
//--------------------------------------------------------------------------
// Private
//--------------------------------------------------------------------------
_fetchPaymentInfo: function () {
return this._rpc({
route: '/lunch/payment_message',
params: {
context: this.context,
},
});
},
_fetchWidgetData: async function () {
this.widgetData = await this._rpc({
route: '/lunch/infos',
params: {
user_id: this.searchModel.get('userId'),
context: this.context,
},
});
},
/**
* Renders and appends the lunch banner widget.
*
* @private
*/
_renderLunchWidget: function () {
var self = this;
var oldWidget = this.widget;
this.widgetData.wallet = parseFloat(this.widgetData.wallet).toFixed(2);
this.widget = new LunchWidget(this, _.extend(this.widgetData, {edit: this.editMode}));
return this.widget.appendTo(document.createDocumentFragment()).then(function () {
self.$('.o_lunch_content').prepend(self.widget.$el);
if (oldWidget) {
oldWidget.destroy();
}
});
},
_showPaymentDialog: function (title) {
var self = this;
title = title || '';
this._fetchPaymentInfo().then(function (data) {
var paymentDialog = new LunchPaymentDialog(self, _.extend(data, {title: title}));
paymentDialog.open();
});
},
/**
* Override to fetch and display the lunch data. Because of the presence of
* the searchPanel, also wrap the lunch widget and the renderer into
* a div, to get the desired layout.
*
* @override
* @private
*/
_update: function () {
var def = this._fetchWidgetData().then(this._renderLunchWidget.bind(this));
return Promise.all([def, this._super.apply(this, arguments)]);
},
//--------------------------------------------------------------------------
// Handlers
//--------------------------------------------------------------------------
_onAddProduct: function (ev) {
var self = this;
ev.stopPropagation();
this._rpc({
model: 'lunch.order',
method: 'update_quantity',
args: [[ev.data.lineId], 1],
}).then(function () {
self.reload();
});
},
_onLocationChanged: function (ev) {
ev.stopPropagation();
this.searchModel.dispatch('setLocationId', ev.data.locationId);
},
_onOpenWizard: function (ev) {
var self = this;
ev.stopPropagation();
var ctx = this.searchModel.get('userId') ? {default_user_id: this.searchModel.get('userId')} : {};
var options = {
on_close: function () {
self.reload();
},
};
// YTI TODO Maybe don't always pass the default_product_id
var action = {
res_model: 'lunch.order',
name: _t('Configure Your Order'),
type: 'ir.actions.act_window',
views: [[false, 'form']],
target: 'new',
context: _.extend(ctx, {default_product_id: ev.data.productId}),
};
if (ev.data.lineId) {
action = _.extend(action, {
res_id: ev.data.lineId,
context: _.extend(action.context, {
active_id: ev.data.lineId,
}),
});
}
this.do_action(action, options);
},
_onOrderNow: function (ev) {
var self = this;
ev.stopPropagation();
this._rpc({
route: '/lunch/pay',
params: {
user_id: this.searchModel.get('userId'),
context: this.context,
},
}).then(function (isPaid) {
if (isPaid) {
// TODO: feedback?
self.reload();
} else {
self._showPaymentDialog(_t("Not enough money in your wallet"));
self.reload();
}
});
},
_onRemoveProduct: function (ev) {
var self = this;
ev.stopPropagation();
this._rpc({
model: 'lunch.order',
method: 'update_quantity',
args: [[ev.data.lineId], -1],
}).then(function () {
self.reload();
});
},
_onUserChanged: function (ev) {
ev.stopPropagation();
this.searchModel.dispatch('updateUserId', ev.data.userId);
},
_onUnlinkOrder: function (ev) {
var self = this;
ev.stopPropagation();
this._rpc({
route: '/lunch/trash',
params: {
user_id: this.searchModel.get('userId'),
context: this.context,
},
}).then(function () {
self.reload();
});
},
};
return LunchControllerCommon;
});