mirror of
https://github.com/OCA/pms.git
synced 2025-01-29 00:17:45 +02:00
[WIP] Hotel-Calendar
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
},
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user