diff --git a/src/localization/en.json b/src/localization/en.json
index 7fb68999..0212623a 100644
--- a/src/localization/en.json
+++ b/src/localization/en.json
@@ -177,6 +177,8 @@
"edit_mode": "Edit Mode",
"copy": "Copy",
"clear": "Clear",
+ "select_all": "Select All",
+ "deselect_all": "Deselect All",
"bulk_unfavorite": "Bulk Unfavorite",
"refresh_favorites_tooltip": "Refresh VRChat favorites",
"export": "Export",
diff --git a/src/views/Favorites/FavoritesAvatar.vue b/src/views/Favorites/FavoritesAvatar.vue
index b3a128d1..52731c1f 100644
--- a/src/views/Favorites/FavoritesAvatar.vue
+++ b/src/views/Favorites/FavoritesAvatar.vue
@@ -357,6 +357,13 @@
+
+ {{
+ isAllFriendsSelected
+ ? t('view.favorite.deselect_all')
+ : t('view.favorite.select_all')
+ }}
+
{{ t('view.favorite.clear') }}
@@ -426,6 +433,15 @@
return groupedByGroupKeyFavoriteFriends.value[activeRemoteGroup.value.key] || [];
});
+ const isAllFriendsSelected = computed(() => {
+ if (!activeRemoteGroup.value || !currentFriendFavorites.value.length) {
+ return false;
+ }
+ return currentFriendFavorites.value
+ .map((fav) => fav.id)
+ .every((id) => selectedFavoriteFriends.value.includes(id));
+ });
+
watch(
() => favoriteFriendGroups.value.map((group) => `${group.key}:${group.count}`),
() => {
@@ -548,6 +564,17 @@
selectedFavoriteFriends.value = [];
}
+ function toggleSelectAllFriends() {
+ if (!activeRemoteGroup.value) {
+ return;
+ }
+ if (isAllFriendsSelected.value) {
+ selectedFavoriteFriends.value = [];
+ } else {
+ selectedFavoriteFriends.value = currentFriendFavorites.value.map((fav) => fav.id);
+ }
+ }
+
function copySelectedFriends() {
if (!selectedFavoriteFriends.value.length) {
return;
diff --git a/src/views/Favorites/FavoritesWorld.vue b/src/views/Favorites/FavoritesWorld.vue
index 1fcce882..ca64e49b 100644
--- a/src/views/Favorites/FavoritesWorld.vue
+++ b/src/views/Favorites/FavoritesWorld.vue
@@ -298,6 +298,13 @@
+
+ {{
+ isAllWorldsSelected
+ ? t('view.favorite.deselect_all')
+ : t('view.favorite.select_all')
+ }}
+
{{ t('view.favorite.clear') }}
@@ -638,6 +645,15 @@
}
});
+ const isAllWorldsSelected = computed(() => {
+ if (!activeRemoteGroup.value || !currentRemoteFavorites.value.length) {
+ return false;
+ }
+ return currentRemoteFavorites.value
+ .map((fav) => fav.id)
+ .every((id) => selectedFavoriteWorlds.value.includes(id));
+ });
+
watch(
() => ({
remote: favoriteWorldGroups.value.map((group) => group.key),
@@ -855,6 +871,17 @@
selectedFavoriteWorlds.value = [];
}
+ function toggleSelectAllWorlds() {
+ if (!activeRemoteGroup.value) {
+ return;
+ }
+ if (isAllWorldsSelected.value) {
+ selectedFavoriteWorlds.value = [];
+ } else {
+ selectedFavoriteWorlds.value = currentRemoteFavorites.value.map((fav) => fav.id);
+ }
+ }
+
function copySelectedWorlds() {
if (!selectedFavoriteWorlds.value.length) {
return;