Merge pull request #1393 from coreos-inc/shift
Add support for shift key selection in checkable items
This commit is contained in:
commit
b6556a0d20
3 changed files with 40 additions and 4 deletions
|
@ -1,3 +1,3 @@
|
||||||
<span class="co-checkable-item" ng-click="toggleItem()"
|
<span class="co-checkable-item" ng-mousedown="toggleItem($event)"
|
||||||
ng-class="controller.isChecked(item, controller.checked) ? 'checked': 'not-checked'">
|
ng-class="controller.isChecked(item, controller.checked) ? 'checked': 'not-checked'">
|
||||||
</span>
|
</span>
|
||||||
|
|
|
@ -713,8 +713,10 @@ angular.module("core-ui", [])
|
||||||
'controller': '=controller'
|
'controller': '=controller'
|
||||||
},
|
},
|
||||||
controller: function($rootScope, $scope, $element) {
|
controller: function($rootScope, $scope, $element) {
|
||||||
$scope.toggleItem = function() {
|
$scope.toggleItem = function($event) {
|
||||||
$scope.controller.toggleItem($scope.item);
|
$event.preventDefault();
|
||||||
|
$event.stopPropagation();
|
||||||
|
$scope.controller.toggleItem($scope.item, $event.shiftKey);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -12,6 +12,8 @@ angular.module('quay').factory('UIService', ['$timeout', '$rootScope', '$locatio
|
||||||
this.itemKey_ = itemKey;
|
this.itemKey_ = itemKey;
|
||||||
this.listeners_ = [];
|
this.listeners_ = [];
|
||||||
this.page_ = null;
|
this.page_ = null;
|
||||||
|
this.lastChanged_ = null;
|
||||||
|
|
||||||
this.ApiService = ApiService
|
this.ApiService = ApiService
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -23,7 +25,28 @@ angular.module('quay').factory('UIService', ['$timeout', '$rootScope', '$locatio
|
||||||
return !!this.allCheckedMap_[item[this.itemKey_]];
|
return !!this.allCheckedMap_[item[this.itemKey_]];
|
||||||
};
|
};
|
||||||
|
|
||||||
CheckStateController.prototype.toggleItem = function(item) {
|
CheckStateController.prototype.toggleItem = function(item, opt_shift) {
|
||||||
|
if (opt_shift && this.lastChanged_) {
|
||||||
|
var itemIndex = $.inArray(item, this.items);
|
||||||
|
var lastIndex = $.inArray(this.lastChanged_, this.items);
|
||||||
|
|
||||||
|
if (itemIndex >= 0 && lastIndex >= 0) {
|
||||||
|
var startIndex = Math.min(itemIndex, lastIndex);
|
||||||
|
var endIndex = Math.max(itemIndex, lastIndex);
|
||||||
|
var shouldCheck = this.isChecked(this.lastChanged_);
|
||||||
|
|
||||||
|
for (var i = startIndex; i <= endIndex; ++i) {
|
||||||
|
if (shouldCheck) {
|
||||||
|
this.checkItem(this.items[i]);
|
||||||
|
} else {
|
||||||
|
this.uncheckItem(this.items[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (this.isChecked(item)) {
|
if (this.isChecked(item)) {
|
||||||
this.uncheckItem(item);
|
this.uncheckItem(item);
|
||||||
} else {
|
} else {
|
||||||
|
@ -32,6 +55,7 @@ angular.module('quay').factory('UIService', ['$timeout', '$rootScope', '$locatio
|
||||||
};
|
};
|
||||||
|
|
||||||
CheckStateController.prototype.toggleItems = function() {
|
CheckStateController.prototype.toggleItems = function() {
|
||||||
|
this.lastChanged_= null;
|
||||||
this.updateMap_(this.checked, false);
|
this.updateMap_(this.checked, false);
|
||||||
|
|
||||||
if (this.checked.length) {
|
if (this.checked.length) {
|
||||||
|
@ -83,12 +107,22 @@ angular.module('quay').factory('UIService', ['$timeout', '$rootScope', '$locatio
|
||||||
};
|
};
|
||||||
|
|
||||||
CheckStateController.prototype.checkItem = function(item) {
|
CheckStateController.prototype.checkItem = function(item) {
|
||||||
|
if (this.isChecked(item)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.lastChanged_ = item;
|
||||||
this.checked.push(item);
|
this.checked.push(item);
|
||||||
this.allCheckedMap_[item[this.itemKey_]] = true;
|
this.allCheckedMap_[item[this.itemKey_]] = true;
|
||||||
this.callListeners_();
|
this.callListeners_();
|
||||||
};
|
};
|
||||||
|
|
||||||
CheckStateController.prototype.uncheckItem = function(item) {
|
CheckStateController.prototype.uncheckItem = function(item) {
|
||||||
|
if (!this.isChecked(item)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.lastChanged_ = item;
|
||||||
this.checked = $.grep(this.checked, function(cItem) {
|
this.checked = $.grep(this.checked, function(cItem) {
|
||||||
return cItem != item;
|
return cItem != item;
|
||||||
});
|
});
|
||||||
|
|
Reference in a new issue