diff --git a/modoboa/static/js/jquery.htmltable.js b/modoboa/static/js/jquery.htmltable.js
index 18c281e26..482bf870c 100644
--- a/modoboa/static/js/jquery.htmltable.js
+++ b/modoboa/static/js/jquery.htmltable.js
@@ -12,7 +12,6 @@
this.shift_pressed = false;
this.ctrl_pressed = false;
this.last_selection = null;
- this.prev_dir = null;
this.listen();
this.$element.css({
@@ -55,6 +54,32 @@
}
},
+ /**
+ * Set the row's state, cancel the change if the current state
+ * and the new state are identical
+ */
+ _set_select: function($row, selected) {
+ var $input = $row.find(this.options.input_selector);
+
+ if (this.is_selected($row) == selected)
+ return;
+ $input.prop('checked', selected);
+ if (selected)
+ {
+ $row.addClass(this.options.row_selected_class);
+ if (this.options.row_unselected_event !== undefined) {
+ this.options.row_unselected_event($row);
+ }
+ }
+ else
+ {
+ $row.removeClass(this.options.row_selected_class);
+ if (this.options.row_selected_event !== undefined) {
+ this.options.row_selected_event($row);
+ }
+ }
+ },
+
/**
* Change the selection state of a given row.
*
@@ -68,29 +93,22 @@
var $row = $(e.target).parents(this.options.row_selector);
if (this.shift_pressed && this.last_selection) {
- var start = this.last_selection;
-
- this.clear_selection();
- this.last_selection = start;
-
+ var select = !this.is_selected($row);
var itfunc = ($row.index() >= this.last_selection.index()) ?
"next" : "prev";
- var $cur_row = null;
-
- if (this.prev_dir && itfunc != this.prev_dir) {
- $cur_row = this.last_selection;
- } else {
- $cur_row = this.last_selection;
- }
- for (; $cur_row.length; $cur_row = $cur_row[itfunc](this.options.row_selector)) {
- this._toggle_select($cur_row);
+ var $cur_row = this.last_selection;
+
+ for ($cur_row = $cur_row[itfunc](this.options.row_selector);
+ $cur_row.length;
+ $cur_row = $cur_row[itfunc](this.options.row_selector)) {
+ this._set_select($cur_row, select);
if ($row.attr("id") == $cur_row.attr("id")) {
break;
}
}
- this.prev_dir = itfunc;
+ this.last_selection = $row;
return;
- } else if (!(this.options.keep_selection || this.ctrl_pressed) &&
+ } else if (!this.options.keep_selection && !this.ctrl_pressed &&
(!this.last_selection || !this.last_selection.is($row))) {
this.clear_selection();
}