[IMP] Use current month range search for calendar view
authorFabien Meghazi <fme@openerp.com>
Tue, 13 Dec 2011 16:22:35 +0000 (17:22 +0100)
committerFabien Meghazi <fme@openerp.com>
Tue, 13 Dec 2011 16:22:35 +0000 (17:22 +0100)
bzr revid: fme@openerp.com-20111213162235-d5jywhbfii8dfpjj

addons/web_calendar/static/src/js/calendar.js

index 887bdc4..aac3dcb 100644 (file)
@@ -10,6 +10,7 @@ openerp.web_calendar.CalendarView = openerp.web.View.extend({
 // Dhtmlx scheduler ?
     init: function(parent, dataset, view_id, options) {
         this._super(parent);
+        this.ready = $.Deferred();
         this.set_default_options(options);
         this.dataset = dataset;
         this.model = dataset.model;
@@ -26,6 +27,9 @@ openerp.web_calendar.CalendarView = openerp.web.View.extend({
              '#905000', '#9b0000', '#840067', '#510090', '#0000c9', '#009b00', '#9abe00', '#ffc900' ];
         this.color_map = {};
         this.last_search = [];
+        this.range_start = null;
+        this.range_stop = null;
+        this.update_range_dates(Date.today());
     },
     start: function() {
         this._super();
@@ -126,9 +130,8 @@ openerp.web_calendar.CalendarView = openerp.web.View.extend({
         scheduler.attachEvent('onClick', this.do_edit_event);
         scheduler.attachEvent('onLightbox', this.do_edit_event);
 
-        scheduler.attachEvent('onViewChange', function(mode, date) {
-            self.$element.removeClass('oe_cal_day oe_cal_week oe_cal_month').addClass('oe_cal_' + mode);
-        });
+        scheduler.attachEvent('onViewChange', this.on_view_changed);
+        this.refresh_scheduler();
 
         if (this.options.sidebar) {
             this.mini_calendar = scheduler.renderCalendar({
@@ -141,6 +144,18 @@ openerp.web_calendar.CalendarView = openerp.web.View.extend({
             });
         }
     },
+    on_view_changed: function(mode, date) {
+        this.$element.removeClass('oe_cal_day oe_cal_week oe_cal_month').addClass('oe_cal_' + mode);
+        if (!date.between(this.range_start, this.range_stop)) {
+            this.update_range_dates(date);
+            this.do_ranged_search();
+        }
+        this.ready.resolve();
+    },
+    update_range_dates: function(date) {
+        this.range_start = date.clone().moveToFirstDayOfMonth();
+        this.range_stop = this.range_start.clone().addMonths(1).addSeconds(-1);
+    },
     refresh_scheduler: function() {
         scheduler.setCurrentView(scheduler._date);
     },
@@ -345,23 +360,30 @@ openerp.web_calendar.CalendarView = openerp.web.View.extend({
         return data;
     },
     do_search: function(domain, context, group_by) {
+        this.last_search = arguments;
+        this.do_ranged_search();
+    },
+    do_ranged_search: function() {
         var self = this
-        if (!domain) {
-            this.do_search.apply(this, this.last_search);
-        } else {
-            this.last_search = [domain, context, group_by];
-        }
         scheduler.clearAll();
-        $.when(this.has_been_loaded).then(function() {
+        $.when(this.has_been_loaded, this.ready).then(function() {
             self.dataset.read_slice(_.keys(self.fields), {
                 offset: 0,
-                limit: self.limit
+                domain: self.get_range_domain(),
+                context: self.last_search[1]
             }, function(events) {
                 self.dataset_events = events;
                 self.on_events_loaded(events);
             });
         });
     },
+    get_range_domain: function() {
+        var format = openerp.web.date_to_str,
+            domain = this.last_search[0].slice(0);
+        domain.unshift([this.date_start, '>=', format(this.range_start.clone().addDays(-6))]);
+        domain.unshift([this.date_start, '<=', format(this.range_stop.clone().addDays(6))]);
+        return domain;
+    },
     do_show: function () {
         var self = this;
         $.when(this.has_been_loaded).then(function() {