diff --git a/package-lock.json b/package-lock.json index 4002698b..c5d5721b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "node-api-dotnet": "^0.9.19" }, "devDependencies": { + "@dnd-kit/vue": "^0.3.2", "@electron/rebuild": "^4.0.3", "@eslint/js": "^9.39.2", "@fontsource-variable/inter": "^5.2.8", @@ -741,6 +742,124 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/@dnd-kit/abstract": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@dnd-kit/abstract/-/abstract-0.3.2.tgz", + "integrity": "sha512-uvPVK+SZYD6Viddn9M0K0JQdXknuVSxA/EbMlFRanve3P/XTc18oLa5zGftKSGjfQGmuzkZ34E26DSbly1zi3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@dnd-kit/geometry": "^0.3.2", + "@dnd-kit/state": "^0.3.2", + "tslib": "^2.6.2" + } + }, + "node_modules/@dnd-kit/abstract/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@dnd-kit/collision": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@dnd-kit/collision/-/collision-0.3.2.tgz", + "integrity": "sha512-pNmNSLCI8S9fNQ7QJ3fBCDjiT0sqBhUFcKgmyYaGvGCAU+kq0AP8OWlh0JSisc9k5mFyxmRpmFQcnJpILz/RPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@dnd-kit/abstract": "^0.3.2", + "@dnd-kit/geometry": "^0.3.2", + "tslib": "^2.6.2" + } + }, + "node_modules/@dnd-kit/collision/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@dnd-kit/dom": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@dnd-kit/dom/-/dom-0.3.2.tgz", + "integrity": "sha512-cIUAVgt2szQyz6JRy7I+0r+xeyOAGH21Y15hb5bIyHoDEaZBvIDH+OOlD9eoLjCbsxDLN9WloU2CBi3OE6LYDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@dnd-kit/abstract": "^0.3.2", + "@dnd-kit/collision": "^0.3.2", + "@dnd-kit/geometry": "^0.3.2", + "@dnd-kit/state": "^0.3.2", + "tslib": "^2.6.2" + } + }, + "node_modules/@dnd-kit/dom/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@dnd-kit/geometry": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@dnd-kit/geometry/-/geometry-0.3.2.tgz", + "integrity": "sha512-3UBPuIS7E3oGiHxOE8h810QA+0pnrnCtGxl4Os1z3yy5YkC/BEYGY+TxWPTQaY1/OMV7GCX7ZNMlama2QN3n3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@dnd-kit/state": "^0.3.2", + "tslib": "^2.6.2" + } + }, + "node_modules/@dnd-kit/geometry/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@dnd-kit/state": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@dnd-kit/state/-/state-0.3.2.tgz", + "integrity": "sha512-dLUIkoYrIJhGXfF2wGLTfb46vUokEsO/OoE21TSfmahYrx7ysTmnwbePsznFaHlwgZhQEh6AlLvthLCeY21b1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@preact/signals-core": "^1.10.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@dnd-kit/state/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@dnd-kit/vue": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@dnd-kit/vue/-/vue-0.3.2.tgz", + "integrity": "sha512-tYX0YzylmkPyjTM8Kv//o90sWNVRCFBtzSu7/Ung2aFMJhfEEUKJoEYRL2V4Cz+fLkOPQFaFqNxSDpNKTeWNxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@dnd-kit/abstract": "^0.3.2", + "@dnd-kit/dom": "^0.3.2", + "@dnd-kit/state": "^0.3.2", + "tslib": "^2.6.2" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/@dnd-kit/vue/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, "node_modules/@electron/asar": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz", @@ -2874,6 +2993,17 @@ "url": "https://opencollective.com/pkgr" } }, + "node_modules/@preact/signals-core": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@preact/signals-core/-/signals-core-1.13.0.tgz", + "integrity": "sha512-slT6XeTCAbdql61GVLlGU4x7XHI7kCZV5Um5uhE4zLX4ApgiiXc0UYFvVOKq06xcovzp7p+61l68oPi563ARKg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-rc.2", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.2.tgz", diff --git a/package.json b/package.json index 0ed9ecdd..a72ee15e 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ }, "homepage": "https://github.com/vrcx-team/VRCX#readme", "devDependencies": { + "@dnd-kit/vue": "^0.3.2", "@electron/rebuild": "^4.0.3", "@eslint/js": "^9.39.2", "@fontsource-variable/inter": "^5.2.8", diff --git a/src/localization/en.json b/src/localization/en.json index b2fdacd0..f169bac0 100644 --- a/src/localization/en.json +++ b/src/localization/en.json @@ -7,7 +7,8 @@ "actions": { "open": "Open", "confirm": "Confirm", - "clear": "Clear" + "clear": "Clear", + "reset": "Reset" }, "time_units": { "y": "y", @@ -93,7 +94,8 @@ "sort_secondary": "Then by", "sort_tertiary": "Then by", "favorite_groups": "Favorite Groups", - "favorite_groups_placeholder": "All Groups" + "favorite_groups_placeholder": "All Groups", + "edit_group_order": "Edit Group Order" }, "notifications": "Notifications", "notification_center": { diff --git a/src/stores/settings/appearance.js b/src/stores/settings/appearance.js index 7ae2d7ea..70a1ab3b 100644 --- a/src/stores/settings/appearance.js +++ b/src/stores/settings/appearance.js @@ -78,6 +78,7 @@ export const useAppearanceSettingsStore = defineStore( const isHideFriendsInSameInstance = ref(false); const isSidebarDivideByFriendGroup = ref(false); const sidebarFavoriteGroups = ref([]); + const sidebarFavoriteGroupOrder = ref([]); const hideUserNotes = ref(false); const hideUserMemos = ref(false); const hideUnfriends = ref(false); @@ -152,6 +153,7 @@ export const useAppearanceSettingsStore = defineStore( isHideFriendsInSameInstanceConfig, isSidebarDivideByFriendGroupConfig, sidebarFavoriteGroupsConfig, + sidebarFavoriteGroupOrderConfig, hideUserNotesConfig, hideUserMemosConfig, hideUnfriendsConfig, @@ -208,6 +210,10 @@ export const useAppearanceSettingsStore = defineStore( true ), configRepository.getString('VRCX_sidebarFavoriteGroups', '[]'), + configRepository.getString( + 'VRCX_sidebarFavoriteGroupOrder', + '[]' + ), configRepository.getBool('VRCX_hideUserNotes', false), configRepository.getBool('VRCX_hideUserMemos', false), configRepository.getBool('VRCX_hideUnfriends', false), @@ -299,6 +305,9 @@ export const useAppearanceSettingsStore = defineStore( sidebarFavoriteGroups.value = JSON.parse( sidebarFavoriteGroupsConfig ); + sidebarFavoriteGroupOrder.value = JSON.parse( + sidebarFavoriteGroupOrderConfig + ); hideUserNotes.value = hideUserNotesConfig; hideUserMemos.value = hideUserMemosConfig; hideUnfriends.value = hideUnfriendsConfig; @@ -717,6 +726,16 @@ export const useAppearanceSettingsStore = defineStore( JSON.stringify(value) ); } + /** + * @param {string[]} value + */ + function setSidebarFavoriteGroupOrder(value) { + sidebarFavoriteGroupOrder.value = value; + configRepository.setString( + 'VRCX_sidebarFavoriteGroupOrder', + JSON.stringify(value) + ); + } function setHideUserNotes() { hideUserNotes.value = !hideUserNotes.value; configRepository.setBool('VRCX_hideUserNotes', hideUserNotes.value); @@ -975,6 +994,7 @@ export const useAppearanceSettingsStore = defineStore( isHideFriendsInSameInstance, isSidebarDivideByFriendGroup, sidebarFavoriteGroups, + sidebarFavoriteGroupOrder, hideUserNotes, hideUserMemos, hideUnfriends, @@ -1013,6 +1033,7 @@ export const useAppearanceSettingsStore = defineStore( setIsHideFriendsInSameInstance, setIsSidebarDivideByFriendGroup, setSidebarFavoriteGroups, + setSidebarFavoriteGroupOrder, setHideUserNotes, setHideUserMemos, setHideUnfriends, diff --git a/src/views/Sidebar/Sidebar.vue b/src/views/Sidebar/Sidebar.vue index 514104b9..c47da93a 100644 --- a/src/views/Sidebar/Sidebar.vue +++ b/src/views/Sidebar/Sidebar.vue @@ -86,7 +86,7 @@ class="absolute top-1 right-1.25 size-1.5 rounded-full bg-red-500" /> - +
{{ t('side_panel.settings.favorite_groups') }}