From 5212f3801af4303f2914c8afc8b66588042c38c7 Mon Sep 17 00:00:00 2001 From: QS5ELkMu Date: Thu, 6 Dec 2018 17:29:53 +0100 Subject: [PATCH] [WIP] Hotel-Calendar --- .../models/inherited_hotel_reservation.py | 12 ++++ hotel_calendar/static/src/css/view.css | 7 +++ .../calendar/hotel_calendar_controller.js | 48 +++++++++++++-- .../views/calendar/hotel_calendar_renderer.js | 43 -------------- .../static/src/js/widgets/MultiCalendar.js | 58 +++++++++++++++++-- 5 files changed, 115 insertions(+), 53 deletions(-) diff --git a/hotel_calendar/models/inherited_hotel_reservation.py b/hotel_calendar/models/inherited_hotel_reservation.py index e84a8f5ac..fdb217034 100644 --- a/hotel_calendar/models/inherited_hotel_reservation.py +++ b/hotel_calendar/models/inherited_hotel_reservation.py @@ -144,6 +144,16 @@ class HotelReservation(models.Model): }) return json_rooms + @api.model + def _hcalendar_calendar_data(self, calendars): + json_calendars = [] + for calendar in calendars: + json_calendars.append({ + 'id': calendar.id, + 'name': calendar.name, + }) + return json_calendars + @api.model def _hcalendar_event_data(self, events): json_events = [] @@ -310,6 +320,7 @@ class HotelReservation(models.Model): raise ValidationError(_('Input Error: No dates defined!')) rooms = self.env['hotel.room'].search([], order='hcal_sequence ASC') + calendars = self.env['hotel.calendar'].search([]) json_res, json_res_tooltips = self.get_hcalendar_reservations_data( dfrom, dto, rooms) @@ -320,6 +331,7 @@ class HotelReservation(models.Model): 'pricelist': self.get_hcalendar_pricelist_data(dfrom, dto), 'restrictions': self.get_hcalendar_restrictions_data(dfrom, dto), 'events': self.get_hcalendar_events_data(dfrom, dto), + 'calendars': self._hcalendar_calendar_data(calendars) } return vals diff --git a/hotel_calendar/static/src/css/view.css b/hotel_calendar/static/src/css/view.css index 4fa4e944c..cd1c21ffe 100644 --- a/hotel_calendar/static/src/css/view.css +++ b/hotel_calendar/static/src/css/view.css @@ -67,6 +67,13 @@ padding: 0.1em; } +.warn-message { + text-align: center; + line-height: 100vh; + font-size: xx-large; + color: gray; +} + /** SELECT 2 **/ #pms-search .select2-search-choice { padding-top: 1px !important; diff --git a/hotel_calendar/static/src/js/views/calendar/hotel_calendar_controller.js b/hotel_calendar/static/src/js/views/calendar/hotel_calendar_controller.js index 5917e1c59..a33cfa9c5 100644 --- a/hotel_calendar/static/src/js/views/calendar/hotel_calendar_controller.js +++ b/hotel_calendar/static/src/js/views/calendar/hotel_calendar_controller.js @@ -90,7 +90,14 @@ var PMSCalendarController = AbstractController.extend({ _onLoadCalendarSettings: function (ev) { var self = this; return this.model.get_hcalendar_settings().then(function(options){ - self.renderer.load_hcalendar_options(options); + self._view_options = options; + var date_begin = moment().startOf('day'); + if (['xs', 'md'].indexOf(self._find_bootstrap_environment()) >= 0) { + self._view_options['days'] = 7; + } else { + self._view_options['days'] = (self._view_options['days'] !== 'month')?parseInt(self._view_options['days']):date_begin.daysInMonth(); + } + self.renderer.load_hcalendar_options(self._view_options); }); }, @@ -104,9 +111,8 @@ var PMSCalendarController = AbstractController.extend({ hcal_dates[1].format(HotelConstants.ODOO_DATETIME_MOMENT_FORMAT) ]; this.model.get_calendar_data(oparams).then(function(results){ - - self.renderer._days_tooltips = results['events']; - self.renderer._reserv_tooltips = results['tooltips']; + self.renderer._multi_calendar._days_tooltips = results['events']; + self.renderer._multi_calendar._reserv_tooltips = results['tooltips']; var rooms = []; for (var r of results['rooms']) { var nroom = new HRoom( @@ -127,7 +133,23 @@ var PMSCalendarController = AbstractController.extend({ rooms.push(nroom); } - self.renderer.create_calendar('#hcal_widget', rooms, results['pricelist'], results['restrictions']); + var options = { + startDate: HotelCalendar.toMomentUTC(self.renderer._last_dates[0], HotelConstants.ODOO_DATETIME_MOMENT_FORMAT), + days: self.renderer._view_options['days'] + 1, + rooms: rooms, + endOfWeek: parseInt(self.renderer._view_options['eday_week']) || 6, + divideRoomsByCapacity: self.renderer._view_options['divide_rooms_by_capacity'] || false, + allowInvalidActions: self.renderer._view_options['allow_invalid_actions'] || false, + assistedMovement: self.renderer._view_options['assisted_movement'] || false, + showPricelist: self.renderer._view_options['show_pricelist'] || false, + showAvailability: self.renderer._view_options['show_availability'] || false, + showNumRooms: self.renderer._view_options['show_num_rooms'] || 0, + endOfWeekOffset: self.renderer._view_options['eday_week_offset'] || 0 + }; + + for (var calendar of results['calendars']) { + self.renderer._multi_calendar.create_calendar(calendar['name'], options, results['pricelist'], results['restrictions'], self.renderer.$el[0]); + } // TODO: Not read this... do the change!! var reservs = []; @@ -338,6 +360,22 @@ var PMSCalendarController = AbstractController.extend({ } }, + _find_bootstrap_environment: function() { + var envs = ['xs', 'sm', 'md', 'lg']; + + var $el = $('
'); + $el.appendTo($('body')); + + for (var i = envs.length - 1; i >= 0; i--) { + var env = envs[i]; + + $el.addClass('hidden-'+env); + if ($el.is(':hidden')) { + $el.remove(); + return env; + } + } + }, }); return PMSCalendarController; diff --git a/hotel_calendar/static/src/js/views/calendar/hotel_calendar_renderer.js b/hotel_calendar/static/src/js/views/calendar/hotel_calendar_renderer.js index ae9617af8..5a7baa90b 100644 --- a/hotel_calendar/static/src/js/views/calendar/hotel_calendar_renderer.js +++ b/hotel_calendar/static/src/js/views/calendar/hotel_calendar_renderer.js @@ -88,11 +88,6 @@ var HotelCalendarView = AbstractRenderer.extend({ // View Options this._view_options = options; var date_begin = moment().startOf('day'); - if (['xs', 'md'].indexOf(this._find_bootstrap_environment()) >= 0) { - this._view_options['days'] = 7; - } else { - this._view_options['days'] = (this._view_options['days'] !== 'month')?parseInt(this._view_options['days']):date_begin.daysInMonth(); - } var date_end = date_begin.clone().add(this._view_options['days'], 'd').endOf('day'); var $dateTimePickerBegin = this.$el.find('#pms-search #date_begin'); var $dateTimePickerEnd = this.$el.find('#pms-search #date_end'); @@ -110,27 +105,6 @@ var HotelCalendarView = AbstractRenderer.extend({ } }, - create_calendar: function(containerSelector, rooms, pricelist, restrictions) { - this.destroy_calendar(); - - var options = { - startDate: HotelCalendar.toMomentUTC(this._last_dates[0], HotelConstants.ODOO_DATETIME_MOMENT_FORMAT), - days: this._view_options['days'] + 1, - rooms: rooms, - endOfWeek: parseInt(this._view_options['eday_week']) || 6, - divideRoomsByCapacity: this._view_options['divide_rooms_by_capacity'] || false, - allowInvalidActions: this._view_options['allow_invalid_actions'] || false, - assistedMovement: this._view_options['assisted_movement'] || false, - showPricelist: this._view_options['show_pricelist'] || false, - showAvailability: this._view_options['show_availability'] || false, - showNumRooms: this._view_options['show_num_rooms'] || 0, - endOfWeekOffset: this._view_options['eday_week_offset'] || 0 - }; - - //this._hcalendar = new HotelCalendar(containerSelector, options, pricelist, restrictions, this.$el[0]); - //this._assign_hcalendar_events(); - }, - _assign_hcalendar_events: function() { var self = this; this._hcalendar.addEventListener('hcalOnSavePricelist', function(ev){ @@ -796,23 +770,6 @@ var HotelCalendarView = AbstractRenderer.extend({ } } }, - - _find_bootstrap_environment: function() { - var envs = ['xs', 'sm', 'md', 'lg']; - - var $el = $('
'); - $el.appendTo($('body')); - - for (var i = envs.length - 1; i >= 0; i--) { - var env = envs[i]; - - $el.addClass('hidden-'+env); - if ($el.is(':hidden')) { - $el.remove(); - return env; - } - } - } }); return HotelCalendarView; diff --git a/hotel_calendar/static/src/js/widgets/MultiCalendar.js b/hotel_calendar/static/src/js/widgets/MultiCalendar.js index 42b507b5a..7b2470733 100644 --- a/hotel_calendar/static/src/js/widgets/MultiCalendar.js +++ b/hotel_calendar/static/src/js/widgets/MultiCalendar.js @@ -8,8 +8,9 @@ odoo.define('hotel_calendar.MultiCalendar', function(require) { var Widget = require('web.Widget'); var MultiCalendar = Widget.extend({ - _calendars: null, + _calendars: [], _active_calendar: -1, + _events: {}, init: function(parent) { this._super.apply(this, arguments); @@ -18,16 +19,49 @@ odoo.define('hotel_calendar.MultiCalendar', function(require) { start: function() { this._super.apply(this, arguments); - this.$el.html("

NO CALENDAR DEFINED!

"); + this._create_tabs_panel(); + }, + + _create_tab: function(name, id) { + // '+' Tab + var $tab = $('', { + id: name, + href: `#${id}`, + text: name, + }).appendTo($('
  • ').prependTo(this.$tabs)); + $tab[0].dataset.toggle = 'tab'; + var $pane = $('
    ', { + id: id, + class: 'tab-pane', + }).appendTo(this.$tabs_content); + + return $pane; + }, + + _create_tabs_panel: function() { + this.$el.empty(); + this.$tabs = $('
      ', { + class: 'nav nav-tabs', + }).appendTo(this.$el); + this.$tabs_content = $('
      ', { + class: 'tab-content', + }).appendTo(this.$el); + + // '+' Tab + var $pane = this._create_tab('+', 'default'); + $('

      ', { + class: 'warn-message', + text: "NO CALENDAR DEFINED!", + }).appendTo($pane); }, get_active_calendar: function() { return this._calendars[this._active_calendar]; - } + }, recalculate_reservation_positions: function() { setTimeout(function(){ - for (var reserv of this._hcalendar._reservations) { + for (var reserv of this.get_active_calendar._reservations) { var style = window.getComputedStyle(reserv._html, null); if (parseInt(style.width, 10) < 15 || parseInt(style.height, 10) < 15 || parseInt(style.top, 10) === 0) { this.get_active_calendar()._updateReservation(reserv); @@ -36,7 +70,21 @@ odoo.define('hotel_calendar.MultiCalendar', function(require) { }.bind(this), 200); }, - create_calendar: function() { + create_calendar: function(name, options, pricelist, restrictions, base) { + var $pane = this._create_tab(name, `calendar-pane-${name}`); + var calendar = new HotelCalendar($pane[0], options, pricelist, restrictions, base); + this._assign_calendar_events(calendar); + this._calendars.push(calendar); + this._active_calendar = this._calendars.length - 1; + }, + + on: function(event_name, callback) { + for (var calendar of this._calendars) { + calendar.addEventListener(event_name, callback); + } + }, + + _assign_calendar_events: function(calendar) { }, });