diff --git a/src/components/docker-registry-ui.riot b/src/components/docker-registry-ui.riot
index bee1f7b5..d7c065d6 100644
--- a/src/components/docker-registry-ui.riot
+++ b/src/components/docker-registry-ui.riot
@@ -140,6 +140,12 @@ along with this program. If not, see .
setRegistryServers(props.defaultRegistries);
}
+ window.onselectstart = (e) => {
+ if (e.target && e.target.className) {
+ return !['checkbox', 'checkmark', 'remove-tag'].find((elt) => e.target.className.indexOf(elt) >= 0);
+ }
+ };
+
// props.singleRegistry === 'true' means old static version
const registryUrl =
props.registryUrl ||
diff --git a/src/components/tag-list/remove-image.riot b/src/components/tag-list/remove-image.riot
index 48b5c7ec..7ef5c198 100644
--- a/src/components/tag-list/remove-image.riot
+++ b/src/components/tag-list/remove-image.riot
@@ -60,7 +60,7 @@ along with this program. If not, see .
},
handleCheckboxChange(event) {
const action = event.target.checked ? ACTION_CHECK_TO_DELETE : ACTION_UNCHECK_TO_DELETE;
- this.props.handleCheckboxChange(action, this.props.image);
+ this.props.handleCheckboxChange(action, this.props.image, event.shiftKey);
},
};
diff --git a/src/components/tag-list/tag-table.riot b/src/components/tag-list/tag-table.riot
index 17b303d0..f10362ac 100644
--- a/src/components/tag-list/tag-table.riot
+++ b/src/components/tag-list/tag-table.riot
@@ -183,23 +183,32 @@ along with this program. If not, see .
this.update({
multiDelete: true,
toDelete: this.state.toDelete,
+ slectedImage: undefined,
});
} else {
this.update({
multiDelete: event.target.checked,
+ slectedImage: undefined,
});
}
},
- onRemoveImageChange(action, image) {
+ onRemoveImageChange(action, image, shiftKey) {
let confirmDeleteImage = false;
let singleDeleteAction = false;
+ let slectedImage = undefined;
switch (action) {
case ACTION_CHECK_TO_DELETE: {
this.state.toDelete.add(image);
+ if (shiftKey) {
+ slectedImage = this.supportShiftKey(image, true);
+ }
break;
}
case ACTION_UNCHECK_TO_DELETE: {
this.state.toDelete.delete(image);
+ if (shiftKey) {
+ slectedImage = this.supportShiftKey(image, false);
+ }
break;
}
case ACTION_DELETE_IMAGE: {
@@ -213,8 +222,33 @@ along with this program. If not, see .
toDelete: this.state.toDelete,
confirmDeleteImage,
singleDeleteAction,
+ slectedImage,
});
},
+ supportShiftKey(selectedImage, addOrRemove) {
+ if (!this.state.slectedImage) {
+ return selectedImage;
+ } else {
+ let shouldChange = false;
+ const tags = getPage(this.props.tags, this.props.page);
+ tags
+ .filter((image) => {
+ if (image == this.state.slectedImage || image == selectedImage) {
+ shouldChange = !shouldChange;
+ return true;
+ }
+ return shouldChange;
+ })
+ .forEach((image) => {
+ if (addOrRemove) {
+ this.state.toDelete.add(image);
+ } else {
+ this.state.toDelete.delete(image);
+ }
+ });
+ return undefined;
+ }
+ },
onReverseOrder() {
this.state.orderType = null;
this.state.desc = false;