From 70d573343e7d59b5e66658df96b80dabb9d2f7fd Mon Sep 17 00:00:00 2001 From: qmo-odoo Date: Thu, 30 Jan 2020 07:50:42 +0000 Subject: [PATCH] [IMP] website_event: Improve event registration Purpose: Improve the registration on front-end by allowing the manager to customize it and display more informations to users about the tickets and the status of the event. Specs: For event manager: Allow users to decide wether or not they want to unfold/fold ticket details on their event. The reason behind this is that some events might have 5+ different tickets and having them unfolded would bloat the UI quite horribly. By default, ticket details should be unfolded with no possibility for the end users to fold it back. Always display a button for the manager to go configure the event in back-end For users in general: Show price range in case the ticket details are folded. Clearly show the user that a particular ticket is sold out/expired Cleary show the user that registrations are open/closed/sold out LINKS: TaskID:2162438 PR: #43856 --- addons/event_sale/models/event_ticket.py | 1 + addons/website_event/controllers/main.py | 1 + .../static/src/js/website_event.js | 12 -- .../src/js/website_event_ticket_details.js | 55 +++++++++ addons/website_event/views/assets.xml | 1 + .../website_event/views/event_templates.xml | 109 +++++++++++------- .../views/website_event_templates.xml | 10 +- 7 files changed, 135 insertions(+), 54 deletions(-) create mode 100644 addons/website_event/static/src/js/website_event_ticket_details.js diff --git a/addons/event_sale/models/event_ticket.py b/addons/event_sale/models/event_ticket.py index d88ea5f4a24..2e6ab3410a8 100644 --- a/addons/event_sale/models/event_ticket.py +++ b/addons/event_sale/models/event_ticket.py @@ -94,6 +94,7 @@ class EventTemplateTicket(models.Model): class EventTicket(models.Model): _inherit = 'event.event.ticket' + _order = "event_id, price" # product price_reduce_taxinc = fields.Float(string='Price Reduce Tax inc', compute='_compute_price_reduce_taxinc') diff --git a/addons/website_event/controllers/main.py b/addons/website_event/controllers/main.py index 8691222101d..1823bffcb6f 100644 --- a/addons/website_event/controllers/main.py +++ b/addons/website_event/controllers/main.py @@ -212,6 +212,7 @@ class WebsiteEventController(http.Controller): urls = event._get_event_resource_urls() values = { 'event': event, + 'sold_out': all(not ticket.sale_available and not ticket.is_expired for ticket in event.event_ticket_ids), 'main_object': event, 'range': range, 'registrable': event.sudo().event_registrations_open, diff --git a/addons/website_event/static/src/js/website_event.js b/addons/website_event/static/src/js/website_event.js index cdaf012448d..36c0f5df526 100644 --- a/addons/website_event/static/src/js/website_event.js +++ b/addons/website_event/static/src/js/website_event.js @@ -9,9 +9,6 @@ var _t = core._t; // Catch registration form event, because of JS for attendee details var EventRegistrationForm = Widget.extend({ - events: { - 'click .o_wevent_registration_btn': '_onRegistrationBtnClick', - }, /** * @override @@ -70,15 +67,6 @@ var EventRegistrationForm = Widget.extend({ }); } }, - /** - * @private - * @param {Event} ev - */ - _onRegistrationBtnClick: function (ev) { - var $btn = $(ev.currentTarget); - $btn.toggleClass('btn-primary text-left pl-0'); - $btn.siblings().toggleClass('d-none'); - }, }); publicWidget.registry.EventRegistrationFormInstance = publicWidget.Widget.extend({ diff --git a/addons/website_event/static/src/js/website_event_ticket_details.js b/addons/website_event/static/src/js/website_event_ticket_details.js new file mode 100644 index 00000000000..8ad2e307c69 --- /dev/null +++ b/addons/website_event/static/src/js/website_event_ticket_details.js @@ -0,0 +1,55 @@ +odoo.define('website_event.ticket_details', function (require) { + var publicWidget = require('web.public.widget'); + + publicWidget.registry.ticketDetailsWidget = publicWidget.Widget.extend({ + selector: '.o_wevent_js_ticket_details', + events: { + 'click .o_wevent_registration_btn': '_onTicketDetailsClick', + 'change .custom-select': '_onTicketQuantityChange' + }, + start: function (){ + this.foldedByDefault = this.$el.data('foldedByDefault') === 1; + return this._super.apply(this, arguments); + }, + + //-------------------------------------------------------------------------- + // Private + //-------------------------------------------------------------------------- + + /** + * @private + */ + _getTotalTicketCount: function (){ + var ticketCount = 0; + this.$('.custom-select').each(function (){ + ticketCount += parseInt($(this).val()); + }); + return ticketCount; + }, + + //-------------------------------------------------------------------------- + // Handlers + //-------------------------------------------------------------------------- + + /** + * @private + * @param {*} ev + */ + _onTicketDetailsClick: function (ev){ + ev.preventDefault(); + if (this.foldedByDefault){ + $(ev.currentTarget).toggleClass('btn-primary text-left pl-0'); + $(ev.currentTarget).siblings().toggleClass('d-none'); + this.$('.close').toggleClass('d-none'); + } + }, + /** + * @private + */ + _onTicketQuantityChange: function (){ + this.$('button.btn-primary').attr('disabled', this._getTotalTicketCount() === 0); + } + }); + +return publicWidget.registry.ticketDetailsWidget; +}); diff --git a/addons/website_event/views/assets.xml b/addons/website_event/views/assets.xml index 9c14a99c5ea..28f03d3848b 100644 --- a/addons/website_event/views/assets.xml +++ b/addons/website_event/views/assets.xml @@ -14,6 +14,7 @@ + diff --git a/addons/website_event/views/event_templates.xml b/addons/website_event/views/event_templates.xml index 35592fed462..c611173360e 100644 --- a/addons/website_event/views/event_templates.xml +++ b/addons/website_event/views/event_templates.xml @@ -98,12 +98,7 @@ -<<<<<<< HEAD - -