diff options
author | GeckoEidechse <40122905+GeckoEidechse@users.noreply.github.com> | 2023-01-08 17:50:10 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-08 17:50:10 +0100 |
commit | 1df421ba963ae0d740c2915b2e038dfb2f6b8f95 (patch) | |
tree | 41268c995588b307916792b8dc7afe5fa1bbf916 /src-vue | |
parent | 1ae404dc90a4aa922652e3bedcdee9c3b0016593 (diff) | |
download | FlightCore-1df421ba963ae0d740c2915b2e038dfb2f6b8f95.tar.gz FlightCore-1df421ba963ae0d740c2915b2e038dfb2f6b8f95.zip |
feat: Delete given Thunderstore mod (#111)
* feat: Expose installed NS mod directory
This allows other functions to get a mod directory directly which is
useful for e.g. deleting a mod.
* feat: Add button to delete Northstar mod
* refactor: Return vector of NorthstarMod
instead of unnamed Tuples
* feat: Delete given Thunderstore mod
* refactor: replace information button by a dropdown menu with remove item
* refactor: only display removal mod option if said mod is installed
* feat: only display dropdown menu for installed mods
* refactor: Remove leftover print statement
* chore: Remove leftover todo comment
* feat: Show confirm warning before deleting mod
* refactor: Call func directly instead of proxy
Removes the `func_caller` pattern
* fix: Call reloading mods after attempted delete
* feat: Hook up deleting mod backend function
Now clicking "Remove Mod" calls the appropriate backend function that
removes the corresponding mod.
* refactor: Call func directly instead of proxy
Removes the `func_caller` pattern
* style: Autoformat
* feat: Support removing outdated mods
No longer include the version number in the comparison check
* fix: Rephrase error message
* feat: Show pop-up confirmation before deleting mod
for Thunderstore mod in ThunderstoreView
Co-authored-by: Alystrasz <contact@remyraes.com>
Co-authored-by: Remy Raes <raes.remy@gmail.com>
Diffstat (limited to 'src-vue')
-rw-r--r-- | src-vue/src/components/ThunderstoreModCard.vue | 83 |
1 files changed, 81 insertions, 2 deletions
diff --git a/src-vue/src/components/ThunderstoreModCard.vue b/src-vue/src/components/ThunderstoreModCard.vue index 1e742fa2..a202aa50 100644 --- a/src-vue/src/components/ThunderstoreModCard.vue +++ b/src-vue/src/components/ThunderstoreModCard.vue @@ -35,11 +35,30 @@ > {{ modButtonText }} </el-button> - <el-button link type="info" class="infoBtn" @click="openURL(mod.package_url)"> + + <!-- Information dropdown menu --> + <el-button v-if="!modIsRemovable" + link type="info" class="infoBtn" @click="openURL(mod.package_url)"> <el-icon> <InfoFilled /> </el-icon> </el-button> + + <el-dropdown v-else> + <el-icon class="infoBtn moreBtn"> + <MoreFilled /> + </el-icon> + <template #dropdown> + <el-dropdown-menu> + <el-dropdown-item @click="openURL(mod.package_url)"> + More info + </el-dropdown-item> + <el-dropdown-item @click="deleteMod(mod)"> + Remove mod + </el-dropdown-item> + </el-dropdown-menu> + </template> + </el-dropdown> </span> </div> </el-card> @@ -54,6 +73,8 @@ import {ThunderstoreModStatus} from "../utils/thunderstore/ThunderstoreModStatus import {NorthstarMod} from "../utils/NorthstarMod"; import {GameInstall} from "../utils/GameInstall"; import {ElNotification} from "element-plus"; +import { NorthstarState } from "../utils/NorthstarState"; +import { ElMessageBox } from "element-plus"; export default defineComponent({ name: "ThunderstoreModCard", @@ -138,6 +159,15 @@ export default defineComponent({ }, /** + * Tells if a Thunderstore mod can be removed. + * This is used to tell if we should display the "Remove mod" option. + **/ + modIsRemovable(): boolean { + return [ThunderstoreModStatus.INSTALLED, ThunderstoreModStatus.OUTDATED] + .includes(this.modStatus); + }, + + /** * This computes the total count of downloads of a given mod, by adding * download count of each of its releases. */ @@ -166,6 +196,50 @@ export default defineComponent({ return `${dependencyStringMembers[0]}-${dependencyStringMembers[1]}`; }, + async deleteMod(mod: ThunderstoreMod) { + + // Show pop-up to confirm delete + ElMessageBox.confirm( + 'Delete Thunderstore mod?', + 'Warning', + { + confirmButtonText: 'OK', + cancelButtonText: 'Cancel', + type: 'warning', + } + ) + .then(async () => { // Deletion confirmed + let game_install = { + game_path: this.$store.state.game_path, + install_type: this.$store.state.install_type + } as GameInstall; + + await invoke("delete_thunderstore_mod", { gameInstall: game_install, thunderstoreModString: this.latestVersion.full_name }) + .then((message) => { + ElNotification({ + title: `Removed ${mod.name}`, + message: message as string, + type: 'success', + position: 'bottom-right' + }); + }) + .catch((error) => { + ElNotification({ + title: 'Error', + message: error, + type: 'error', + position: 'bottom-right' + }); + }) + .finally(() => { + this.$store.commit('loadInstalledMods'); + }); + }) + .catch(() => { // Deletion cancelled + console.log("Deleting Thunderstore mod cancelled.") + }) + }, + async installMod (mod: ThunderstoreMod) { let game_install = { game_path: this.$store.state.game_path, @@ -241,8 +315,13 @@ export default defineComponent({ .infoBtn { width: 20px; - padding: 0; + padding: 0 !important; font-size: 20px; border: none; } + +.moreBtn { + margin-left: 10px; + height: auto; +} </style> |