diff -r d5fb6baacbd0 -r 0ff47a9c5da2 cms/app-client/app/components/visu-chrono.js --- a/cms/app-client/app/components/visu-chrono.js Wed Jul 06 18:02:12 2016 +0200 +++ b/cms/app-client/app/components/visu-chrono.js Thu Jul 07 11:06:11 2016 +0200 @@ -7,7 +7,7 @@ dateObserver: Ember.observer('filter.date', function() { var self = this; this.$('li').removeClass('highlighted'); - this.get('filter.date').forEach(function(date) { + this.get('filter').get('date').forEach(function(date) { self.$('li#' + date).addClass('highlighted'); }); }), @@ -22,33 +22,65 @@ } var isMouseDown = false, - isHighlighted; + isHighlighted, + didHighlight, + previousElement; - Ember.$("#chrono-table li").mousedown(function () { - isMouseDown = true; - var dates = self.get('filter').get('date').toArray(); - var index = dates.indexOf(parseInt(Ember.$(this).attr('id'))); - if(index === -1) { - dates.push(parseInt(Ember.$(this).attr('id'))); - isHighlighted = true; - } else { - dates.splice(index, 1); - isHighlighted = false; + 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]; + if(event.shiftKey) { + while(previousElement !== element) { + elements.push(previousElement); + if(previousElement < element) { + previousElement = previousElement + 1; + } else if(previousElement > element) { + previousElement = previousElement - 1; + } else { + break; + } + } + } + var dates = self.get('filter').get('date').toArray(); + var index = dates.indexOf(element); + if((!event.shiftKey && index === -1) || (event.shiftKey && didHighlight)) { + dates = dates.concat(elements); + isHighlighted = true; + } else { + elements.forEach(function(el) { + var id = dates.indexOf(el); + if((!event.shiftKey && index !== -1) || (event.shiftKey && id !== -1)) { + dates.splice(id, 1); + } + }); + isHighlighted = false; + } + // Ascending sorting. + dates.sort(function(a, b) { return a - b; }); + self.get('filter').set('date', dates); + didHighlight = isHighlighted; + previousElement = element; + // Prevent text selection. + return false; } - self.get('filter').set('date', dates); - return false; // prevent text selection }).mouseover(function () { if (isMouseDown) { + var element = parseInt(Ember.$(this).attr('id')); if(Ember.$(this).hasClass("highlighted") !== isHighlighted) { var dates = self.get('filter').get('date').toArray(); - var index = dates.indexOf(parseInt(Ember.$(this).attr('id'))); + var index = dates.indexOf(element); if(index === -1) { - dates.push(parseInt(Ember.$(this).attr('id'))); + dates.push(element); } else { dates.splice(index, 1); } self.get('filter').set('date', dates); } + previousElement = element; } }).bind("selectstart", function () { return false;