From d1d436ed0432b84d00de194984723cd115c068ec Mon Sep 17 00:00:00 2001 From: QS5ELkMu Date: Sat, 8 Dec 2018 23:47:21 +0100 Subject: [PATCH] [WIP] Multi-Calendar --- .../calendar/hotel_calendar_controller.js | 22 ++++++------- .../static/src/js/widgets/MultiCalendar.js | 32 ++++++++----------- .../src/lib/hcalendar/css/hcalendar.css | 6 ++++ .../static/src/lib/hcalendar/js/hcalendar.js | 25 +++++++++------ 4 files changed, 45 insertions(+), 40 deletions(-) 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 aa41237ea..1c7338d88 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 @@ -55,7 +55,7 @@ var PMSCalendarController = AbstractController.extend({ var oparams = [pricelist_id, false, pricelist, {}, {}]; this.model.save_changes(oparams).then(function(results){ $(calendar.btnSaveChanges).removeClass('need-save'); - calendar.$el.find('.hcal-input-changed').removeClass('hcal-input-changed'); + $(calendar.edtable).find('.hcal-input-changed').removeClass('hcal-input-changed'); }); }, @@ -163,6 +163,7 @@ var PMSCalendarController = AbstractController.extend({ }, _reload_active_calendar: function() { + var self = this; var filterDates = this.renderer.get_view_filter_dates(); // Clip dates var dfrom = filterDates[0].clone(), @@ -181,13 +182,11 @@ var PMSCalendarController = AbstractController.extend({ false ]; this.model.get_calendar_data(oparams).then(function(results){ - this._multi_calendar._merge_days_tooltips(results['events']); - this._multi_calendar._reserv_tooltips = _.extend(this._multi_calendar._reserv_tooltips, results['tooltips']); var reservs = []; for (var r of results['reservations']) { var nreserv = new HReservation({ 'id': r[1], - 'room_id': r[15], + 'room_id': r[0], 'title': r[2], 'adults': r[3], 'childrens': r[4], @@ -208,13 +207,15 @@ var PMSCalendarController = AbstractController.extend({ reservs.push(nreserv); } - this._multi_calendar.merge_pricelist(results['pricelist']); - this._multi_calendar.merge_restrictions(results['restrictions']); - this._multi_calendar.merge_reservations(reservs); + self._multi_calendar._reserv_tooltips = _.extend(this._multi_calendar._reserv_tooltips, results['tooltips']); + self._multi_calendar.merge_days_tooltips(results['events']); + self._multi_calendar.merge_pricelist(results['pricelist']); + self._multi_calendar.merge_restrictions(results['restrictions']); + self._multi_calendar.merge_reservations(reservs); - this._multi_calendar._assign_extra_info(this._multi_calendar.get_active_calendar()); + self._multi_calendar._assign_extra_info(this._multi_calendar.get_active_calendar()); }.bind(this)).then(function(){ - this.renderer._last_dates = filterDates; + self.renderer._last_dates = filterDates; }); }, @@ -574,12 +575,10 @@ var PMSCalendarController = AbstractController.extend({ var need_reload_pricelists = false; var need_update_counters = false; var nreservs = [] - console.log("BUS!"); for (var notif of notifications) { if (notif[0][1] === 'hotel.reservation') { switch (notif[1]['type']) { case 'reservation': - console.log("BUS RESERVA"); var reserv = notif[1]['reservation']; // Only show notifications of other users // if (notif[1]['subtype'] !== 'noshow' && this._view_options['show_notifications'] && notif[1]['userid'] != this.dataset.context.uid) { @@ -953,7 +952,6 @@ var PMSCalendarController = AbstractController.extend({ if (!date_begin.isSame(this.renderer._last_dates[0].clone().utc(), 'd') || !date_end.isSame(this.renderer._last_dates[1].clone().utc(), 'd')) { var date_end = $dateTimePickerEnd.data("DateTimePicker").date().set({'hour': 23, 'minute': 59, 'second': 59}).clone().utc(); - console.log(date_end); active_calendar.setStartDate(date_begin, active_calendar.getDateDiffDays(date_begin, date_end), false, function(){ this._reload_active_calendar(); }.bind(this)); diff --git a/hotel_calendar/static/src/js/widgets/MultiCalendar.js b/hotel_calendar/static/src/js/widgets/MultiCalendar.js index b355f900d..14f1fdded 100644 --- a/hotel_calendar/static/src/js/widgets/MultiCalendar.js +++ b/hotel_calendar/static/src/js/widgets/MultiCalendar.js @@ -30,7 +30,7 @@ odoo.define('hotel_calendar.MultiCalendar', function(require) { }, get_calendar: function(index) { - return this._calendars[index]; + return this._calendars[index-1]; }, get_tab: function(index) { @@ -69,16 +69,6 @@ odoo.define('hotel_calendar.MultiCalendar', function(require) { } }, - update_all_reservations: function() { - for (var calendar of this._calendars) { - this._update_reservations(calendar); - } - }, - - update_reservations: function(calendar) { - calendar.setReservations(this._dataset['reservations']); - }, - replace_reservation: function(newReserv, oldReserv) { for (var calendar of this._calendars) { calendar.replaceReservation(newReserv, oldReserv); @@ -175,7 +165,7 @@ odoo.define('hotel_calendar.MultiCalendar', function(require) { } for (var calendar of this._calendars) { - calendar.addReservations(_.clone(this._dataset['reservations'])); + calendar.addReservations(this._dataset['reservations']); } }, @@ -200,7 +190,7 @@ odoo.define('hotel_calendar.MultiCalendar', function(require) { this._base); this._assign_calendar_events(calendar); this._assign_extra_info(calendar); - calendar.setReservations(_.clone(this._dataset['reservations'])); + calendar.setReservations(this._dataset['reservations']); this._calendars.push(calendar); return this._calendars.length-1; }, @@ -210,19 +200,25 @@ odoo.define('hotel_calendar.MultiCalendar', function(require) { }, - _create_tab: function(name, id) { + _create_tab: function(name, id, options) { var self = this; var sanitized_id = this._sanitizeId(id); - // '+' Tab - var $tab = $('', { + + var $tab = $('', _.extend({ id: this._sanitizeId(name), href: `#${sanitized_id}`, text: name, role: 'tab', - }).data('tabindex', this._tabs.length).appendTo($('
  • ').prependTo(this.$tabs)); + }, options)).data('tabindex', this._tabs.length).appendTo($('
  • ').prependTo(this.$tabs)); $tab.on('shown.bs.tab', function(ev){ self._active_index = $(ev.target).data('tabindex'); self.recalculate_reservation_positions(); + if (ev.relatedTarget) { + var prev_index = $(ev.relatedTarget).data('tabindex'); + if (prev_index) { + self.get_calendar(prev_index).cancelSwap(); + } + } }); $tab[0].dataset.toggle = 'tab'; var $panel = $('
    ', { @@ -246,7 +242,7 @@ odoo.define('hotel_calendar.MultiCalendar', function(require) { }).appendTo(this.$el); // '+' Tab - var [$tab, $panel] = this._create_tab('+', 'default'); + var [$tab, $panel] = this._create_tab('+', 'default', {class: 'multi-calendar-tab-plus'}); $tab.on('shown.bs.tab', function(ev){ ev.preventDefault(); var new_calendar_id = self.create_calendar(`Calendar #${self._calendars.length}`); diff --git a/hotel_calendar/static/src/lib/hcalendar/css/hcalendar.css b/hotel_calendar/static/src/lib/hcalendar/css/hcalendar.css index 5379c2791..d25a9e2cf 100644 --- a/hotel_calendar/static/src/lib/hcalendar/css/hcalendar.css +++ b/hotel_calendar/static/src/lib/hcalendar/css/hcalendar.css @@ -488,6 +488,12 @@ input#bookings_search { margin-bottom: 0.2em; } +.multi-calendar-tab-plus { + background-color: darkgray; + font-weight: bold; + color: white; +} + .noselect { -webkit-touch-callout: none; /* iOS Safari */ -webkit-user-select: none; /* Safari */ diff --git a/hotel_calendar/static/src/lib/hcalendar/js/hcalendar.js b/hotel_calendar/static/src/lib/hcalendar/js/hcalendar.js index 464cc5f3e..9863a1c17 100644 --- a/hotel_calendar/static/src/lib/hcalendar/js/hcalendar.js +++ b/hotel_calendar/static/src/lib/hcalendar/js/hcalendar.js @@ -57,6 +57,7 @@ function HotelCalendar(/*String*/querySelector, /*Dictionary*/options, /*List*/p paginatorStepsMin: 1, paginatorStepsMax: 15, }, options); + this.options.startDate = this.options.startDate.clone(); this.options.startDate.subtract('1', 'd'); // Check correct values @@ -148,6 +149,15 @@ HotelCalendar.prototype = { return this._modeSwap; }, + cancelSwap: function() { + if (this._modeSwap !== HotelCalendar.MODE.NONE) { + this._modeSwap = HotelCalendar.MODE.NONE; + this._dispatchEvent('hcalOnCancelSwapReservations'); + this._reset_action_reservation(); + this._updateHighlightSwapReservations(); + } + }, + //==== DOMAINS setDomain: function(/*Int*/section, /*Array*/domain) { if (this._domains[section] !== domain) { @@ -205,7 +215,7 @@ HotelCalendar.prototype = { // Merge var uzr = []; for (var r of reservations) { - r = _.clone(r); // HOT-FIX: Multi-Calendar Support + r = r.clone(); // HOT-FIX: Multi-Calendar Support var rindex = !forced?_.findKey(this._reservations, {'id': r.id}):false; if (rindex) { r._html = this._reservations[rindex]._html; @@ -2433,22 +2443,17 @@ HotelCalendar.prototype = { if (this.reservationAction.action === HotelCalendar.ACTION.SWAP || this.getSwapMode() !== HotelCalendar.MODE.NONE) { var needReset = false; if (ev.keyCode === 27) { - this._dispatchEvent('hcalOnCancelSwapReservations'); - needReset = true; + this.cancelSwap(); } else if (ev.keyCode === 13) { this._dispatchSwapReservations(); - needReset = true; - } - else if (ev.keyCode === 17 && this.getSwapMode() === HotelCalendar.MODE.SWAP_FROM) { - this.setSwapMode(HotelCalendar.MODE.SWAP_TO); - } - - if (needReset) { this._reset_action_reservation(); this._updateHighlightSwapReservations(); this._modeSwap = HotelCalendar.MODE.NONE; } + else if (ev.keyCode === 17 && this.getSwapMode() === HotelCalendar.MODE.SWAP_FROM) { + this.setSwapMode(HotelCalendar.MODE.SWAP_TO); + } } },