feat(shift-key): add support to shift + click for multi delete in a row

This commit is contained in:
Joxit 2023-02-04 21:56:32 +01:00
parent 959af86333
commit dc64f72483
No known key found for this signature in database
GPG key ID: F526592B8E012263
3 changed files with 42 additions and 2 deletions

View file

@ -140,6 +140,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
setRegistryServers(props.defaultRegistries); 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 // props.singleRegistry === 'true' means old static version
const registryUrl = const registryUrl =
props.registryUrl || props.registryUrl ||

View file

@ -60,7 +60,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
}, },
handleCheckboxChange(event) { handleCheckboxChange(event) {
const action = event.target.checked ? ACTION_CHECK_TO_DELETE : ACTION_UNCHECK_TO_DELETE; 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);
}, },
}; };
</script> </script>

View file

@ -183,23 +183,32 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
this.update({ this.update({
multiDelete: true, multiDelete: true,
toDelete: this.state.toDelete, toDelete: this.state.toDelete,
slectedImage: undefined,
}); });
} else { } else {
this.update({ this.update({
multiDelete: event.target.checked, multiDelete: event.target.checked,
slectedImage: undefined,
}); });
} }
}, },
onRemoveImageChange(action, image) { onRemoveImageChange(action, image, shiftKey) {
let confirmDeleteImage = false; let confirmDeleteImage = false;
let singleDeleteAction = false; let singleDeleteAction = false;
let slectedImage = undefined;
switch (action) { switch (action) {
case ACTION_CHECK_TO_DELETE: { case ACTION_CHECK_TO_DELETE: {
this.state.toDelete.add(image); this.state.toDelete.add(image);
if (shiftKey) {
slectedImage = this.supportShiftKey(image, true);
}
break; break;
} }
case ACTION_UNCHECK_TO_DELETE: { case ACTION_UNCHECK_TO_DELETE: {
this.state.toDelete.delete(image); this.state.toDelete.delete(image);
if (shiftKey) {
slectedImage = this.supportShiftKey(image, false);
}
break; break;
} }
case ACTION_DELETE_IMAGE: { case ACTION_DELETE_IMAGE: {
@ -213,8 +222,33 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
toDelete: this.state.toDelete, toDelete: this.state.toDelete,
confirmDeleteImage, confirmDeleteImage,
singleDeleteAction, 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() { onReverseOrder() {
this.state.orderType = null; this.state.orderType = null;
this.state.desc = false; this.state.desc = false;