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/event_sale/static/src | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/event_sale/static/src')
3 files changed, 203 insertions, 0 deletions
diff --git a/addons/event_sale/static/src/js/event_configurator_controller.js b/addons/event_sale/static/src/js/event_configurator_controller.js new file mode 100644 index 00000000..3ae81387 --- /dev/null +++ b/addons/event_sale/static/src/js/event_configurator_controller.js @@ -0,0 +1,38 @@ +odoo.define('event.EventConfiguratorFormController', function (require) { +"use strict"; + +var FormController = require('web.FormController'); + +/** + * This controller is overridden to allow configuring sale_order_lines through a popup + * window when a product with 'event_ok' is selected. + * + * This allows keeping an editable list view for sales order and remove the noise of + * those 2 fields ('event_id' + 'event_ticket_id') + */ +var EventConfiguratorFormController = FormController.extend({ + /** + * We let the regular process take place to allow the validation of the required fields + * to happen. + * + * Then we can manually close the window, providing event information to the caller. + * + * @override + */ + saveRecord: function () { + var self = this; + return this._super.apply(this, arguments).then(function () { + var state = self.renderer.state.data; + self.do_action({type: 'ir.actions.act_window_close', infos: { + eventConfiguration: { + event_id: {id: state.event_id.data.id}, + event_ticket_id: {id: state.event_ticket_id.data.id} + } + }}); + }); + } +}); + +return EventConfiguratorFormController; + +}); diff --git a/addons/event_sale/static/src/js/event_configurator_view.js b/addons/event_sale/static/src/js/event_configurator_view.js new file mode 100644 index 00000000..67aebba4 --- /dev/null +++ b/addons/event_sale/static/src/js/event_configurator_view.js @@ -0,0 +1,21 @@ +odoo.define('event.EventConfiguratorFormView', function (require) { +"use strict"; + +var EventConfiguratorFormController = require('event.EventConfiguratorFormController'); +var FormView = require('web.FormView'); +var viewRegistry = require('web.view_registry'); + +/** + * @see EventConfiguratorFormController for more information + */ +var EventConfiguratorFormView = FormView.extend({ + config: _.extend({}, FormView.prototype.config, { + Controller: EventConfiguratorFormController + }), +}); + +viewRegistry.add('event_configurator_form', EventConfiguratorFormView); + +return EventConfiguratorFormView; + +}); diff --git a/addons/event_sale/static/src/js/event_configurator_widget.js b/addons/event_sale/static/src/js/event_configurator_widget.js new file mode 100644 index 00000000..eff0edd3 --- /dev/null +++ b/addons/event_sale/static/src/js/event_configurator_widget.js @@ -0,0 +1,144 @@ +odoo.define('event_sale.product_configurator', function (require) { +var ProductConfiguratorWidget = require('sale.product_configurator'); + +/** + * Extension of the ProductConfiguratorWidget to support event product configuration. + * It opens when an event product_product is set. + * + * The event information include: + * - event_id + * - event_ticket_id + * + */ +ProductConfiguratorWidget.include({ + /** + * @returns {boolean} + * + * @override + * @private + */ + _isConfigurableLine: function () { + return this.recordData.event_ok || this._super.apply(this, arguments); + }, + + /** + * @param {integer} productId + * @param {String} dataPointID + * @returns {Promise<Boolean>} stopPropagation true if a suitable configurator has been found. + * + * @override + * @private + */ + _onProductChange: function (productId, dataPointId) { + var self = this; + return this._super.apply(this, arguments).then(function (stopPropagation) { + if (stopPropagation || productId === undefined) { + return Promise.resolve(true); + } else { + return self._checkForEvent(productId, dataPointId); + } + }); + }, + + /** + * This method will check if the productId needs configuration or not: + * + * @param {integer} productId + * @param {string} dataPointID + * @returns {Promise<Boolean>} stopPropagation true if the product is an event ticket. + * + * @private + */ + _checkForEvent: function (productId, dataPointId) { + var self = this; + return this._rpc({ + model: 'product.product', + method: 'read', + args: [productId, ['event_ok']], + }).then(function (result) { + if (Array.isArray(result) && result.length && result[0].event_ok) { + self._openEventConfigurator({ + default_product_id: productId + }, + dataPointId + ); + return Promise.resolve(true); + } + return Promise.resolve(false); + }); + }, + + /** + * Opens the event configurator in 'edit' mode. + * + * @override + * @private + */ + _onEditLineConfiguration: function () { + if (this.recordData.event_ok) { + var defaultValues = { + default_product_id: this.recordData.product_id.data.id + }; + + if (this.recordData.event_id) { + defaultValues.default_event_id = this.recordData.event_id.data.id; + } + + if (this.recordData.event_ticket_id) { + defaultValues.default_event_ticket_id = this.recordData.event_ticket_id.data.id; + } + + this._openEventConfigurator(defaultValues, this.dataPointID); + } else { + this._super.apply(this, arguments); + } + }, + + /** + * Opens the event configurator to allow configuring the SO line with events information. + * + * When the window is closed, configured values are used to trigger a 'field_changed' + * event to modify the current SO line. + * + * If the window is closed without providing the required values 'event_id' and + * 'event_ticket_id', the product_id field is cleaned. + * + * @param {Object} data various "default_" values + * @param {string} dataPointId + * + * @private + */ + _openEventConfigurator: function (data, dataPointId) { + var self = this; + this.do_action('event_sale.event_configurator_action', { + additional_context: data, + on_close: function (result) { + if (result && !result.special) { + self.trigger_up('field_changed', { + dataPointID: dataPointId, + changes: result.eventConfiguration, + onSuccess: function () { + // Call post-init function. + self._onLineConfigured(); + } + }); + } else { + if (!self.recordData.event_id || !self.recordData.event_ticket_id) { + self.trigger_up('field_changed', { + dataPointID: dataPointId, + changes: { + product_id: false, + name: '' + }, + }); + } + } + } + }); + } +}); + + +return ProductConfiguratorWidget; + +}); |
