diff options
| author | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
|---|---|---|
| committer | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
| commit | 3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch) | |
| tree | a44932296ef4a9b71d5f010906253d8c53727726 /addons/lunch/static/src/js/lunch_controller_common.js | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/lunch/static/src/js/lunch_controller_common.js')
| -rw-r--r-- | addons/lunch/static/src/js/lunch_controller_common.js | 218 |
1 files changed, 218 insertions, 0 deletions
diff --git a/addons/lunch/static/src/js/lunch_controller_common.js b/addons/lunch/static/src/js/lunch_controller_common.js new file mode 100644 index 00000000..8cd09316 --- /dev/null +++ b/addons/lunch/static/src/js/lunch_controller_common.js @@ -0,0 +1,218 @@ +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($('<div>').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; + +}); |
