cms/app-client/app/components/visu-chrono.js
changeset 392 4fbe94af93e8
parent 234 c928f6190771
child 393 5ef3bfef0bff
--- a/cms/app-client/app/components/visu-chrono.js	Thu Nov 03 11:14:41 2016 +0100
+++ b/cms/app-client/app/components/visu-chrono.js	Fri Nov 04 19:03:25 2016 +0100
@@ -1,24 +1,90 @@
 import Ember from 'ember';
+import _ from 'lodash/lodash';
 
 export default Ember.Component.extend({
 
+    range: [],
+
+    decades: Ember.computed('range', function() {
+        var range = this.get('range');
+        return _.range(Math.floor(range[0]/10)*10, Math.floor(range[1]/10)*10, 10);
+    }),
+
     filter: Ember.inject.service(),
 
-    dateObserver: Ember.observer('filter.date', function() {
+    dateObserver: Ember.observer('date', function() {
         var self = this;
         this.$('li').removeClass('highlighted');
-        this.get('filter').get('date').forEach(function(date) {
+        this.get('date').forEach(function(date) {
             self.$('li#' + date).addClass('highlighted');
         });
     }),
 
+    date: Ember.computed('filter.date', {
+        get: function() {
+            const dates = this.get('filter').get('date');
+            console.log("get DATES", dates);
+            if(dates === null) {
+                return [];
+            }
+            const res = _.reduce(dates, function(res, d) {
+                let m = d.match(/^(\d+)(?:-(\d+))?$/);
+                if(m) {
+                    let start = parseInt(m[1]);
+                    let end = parseInt(m[2]);
+                    if(isNaN(end)) {
+                        res.push(parseInt(m[1]));
+                    } else {
+                        res = res.concat(_.range(start,end+1));
+                    }
+                }
+                return res;
+            }, []).sort();
+            console.log("GET DATE", res);
+            return res;
+        },
+        set: function(key, values) {
+            var srcDateList = _.clone(values).sort();
+            let start = null;
+            let end = null;
+            var pushValues = function(s,e,valuesList) {
+                if(s === e) {
+                    valuesList.push(s.toString());
+                } else {
+                    valuesList.push(s.toString()+"-"+e.toString());
+                }
+            };
+            let dateList = _.reduce(srcDateList, function(res, d, i) {
+                if(start === null) {
+                    start = end = d;
+                }
+                if(d > (end + 1)) {
+                    pushValues(start, end, res);
+                    start = end = d;
+                } else {
+                    end = d;
+                }
+                if(i === (srcDateList.length - 1)) {
+                    pushValues(start, end, res);
+                }
+                return res;
+          }, []);
+          console.log("SET DATE",key, values, dateList);
+          if(dateList.length === 0) {
+              dateList = null;
+          }
+          this.get('filter').set('date', dateList);
+          return srcDateList;
+      }
+    }),
+
     elementId: "chrono-table",
 
     didInsertElement: function(){
         var self = this;
 
-        if (this.get('filter').get('date') !== null){
-            this.highlightQuery(this.get('filter').get('date'));
+        if (this.get('date') !== null){
+            this.highlightQuery(this.get('date'));
         }
 
         var isMouseDown = false,
@@ -29,7 +95,7 @@
         Ember.$("#chrono-table li").mousedown(function (event) {
             // Prevent right click selection.
             if(event.button === 0) {
-                
+
                 isMouseDown = true;
                 var element = parseInt(Ember.$(this).attr('id'));
                 var elements = [element];
@@ -43,9 +109,9 @@
                         } else {
                             break;
                         }
-                    }    
+                    }
                 }
-                var dates = self.get('filter').get('date').toArray();
+                var dates = self.get('date');
                 var index = dates.indexOf(element);
                 if((!event.shiftKey && index === -1) || (event.shiftKey && didHighlight)) {
                     dates = dates.concat(elements);
@@ -54,14 +120,12 @@
                     elements.forEach(function(el) {
                         var id = dates.indexOf(el);
                         if((!event.shiftKey && index !== -1) || (event.shiftKey && id !== -1)) {
-                            dates.splice(id, 1);    
+                            dates.splice(id, 1);
                         }
                     });
                     isHighlighted = false;
                 }
-                // Ascending sorting.
-                dates.sort(function(a, b) { return a - b; });
-                self.get('filter').set('date', dates);
+                self.set('date', dates);
                 didHighlight = isHighlighted;
                 previousElement = element;
                 // Prevent text selection.
@@ -71,14 +135,14 @@
             if (isMouseDown) {
                 var element = parseInt(Ember.$(this).attr('id'));
                 if(Ember.$(this).hasClass("highlighted") !== isHighlighted) {
-                    var dates = self.get('filter').get('date').toArray();
+                    var dates = self.get('date');
                     var index = dates.indexOf(element);
                     if(index === -1) {
                         dates.push(element);
                     } else {
                         dates.splice(index, 1);
                     }
-                    self.get('filter').set('date', dates);
+                    self.set('date', dates);
                 }
                 previousElement = element;
             }
@@ -92,6 +156,10 @@
     },
 
     highlightQuery: function(dates){
+        console.log("highlightQuery", dates);
+        if(dates === null) {
+            return;
+        }
         dates.map(function(date){
             Ember.$("#" + date).toggleClass("highlighted", true);
         });
@@ -102,7 +170,7 @@
         selectDecade: function(decade) {
             var array = [];
             var next = decade + 10;
-            var dates = this.get('filter').get('date');
+            var dates = this.get('date');
             while(decade < next) {
                 array.push(decade);
                 decade ++;
@@ -112,14 +180,12 @@
                     return dates.indexOf(value) === -1;
                 });
                 array = dates.concat(array);
-                // Ascending sorting.
-                array.sort(function(a, b) { return a - b; });
             } else {
                 array = dates.filter(function(value) {
                     return array.indexOf(value) === -1;
                 });
             }
-            this.get('filter').set('date', array);
+            this.set('date', array);
         }
 
     }