[WIP] Hotel-Calendar

This commit is contained in:
QS5ELkMu
2018-12-06 17:29:53 +01:00
parent c76f65384b
commit 5212f3801a
5 changed files with 115 additions and 53 deletions

View File

@@ -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

View File

@@ -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;

View File

@@ -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 = $('<div>');
$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;

View File

@@ -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 = $('<div>');
$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;

View File

@@ -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("<p>NO CALENDAR DEFINED!</p>");
this._create_tabs_panel();
},
_create_tab: function(name, id) {
// '+' Tab
var $tab = $('<a/>', {
id: name,
href: `#${id}`,
text: name,
}).appendTo($('<li/>').prependTo(this.$tabs));
$tab[0].dataset.toggle = 'tab';
var $pane = $('<div/>', {
id: id,
class: 'tab-pane',
}).appendTo(this.$tabs_content);
return $pane;
},
_create_tabs_panel: function() {
this.$el.empty();
this.$tabs = $('<ul/>', {
class: 'nav nav-tabs',
}).appendTo(this.$el);
this.$tabs_content = $('<div/>', {
class: 'tab-content',
}).appendTo(this.$el);
// '+' Tab
var $pane = this._create_tab('+', 'default');
$('<p/>', {
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) {
},
});