From d775e049d689f4ae68a2343da1b6eac50f1b7c77 Mon Sep 17 00:00:00 2001 From: Julian Freeman Date: Tue, 31 Mar 2026 13:30:46 -0400 Subject: [PATCH] block when checking --- src/components/SoftwareCard.vue | 15 ++++++++++++--- src/store/software.ts | 2 +- src/views/Essentials.vue | 1 + src/views/Updates.vue | 1 + 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/components/SoftwareCard.vue b/src/components/SoftwareCard.vue index 5d92ca7..70d36d4 100644 --- a/src/components/SoftwareCard.vue +++ b/src/components/SoftwareCard.vue @@ -4,7 +4,8 @@ :class="{ 'installed-mode': software.status === 'installed', 'is-selected': isSelected && software.status !== 'installed', - 'is-busy': software.status === 'pending' || software.status === 'installing' + 'is-busy': software.status === 'pending' || software.status === 'installing', + 'is-disabled': disabled && software.status === 'idle' }" @click="handleCardClick" > @@ -14,7 +15,7 @@ class="checkbox" :class="{ 'checked': isSelected, - 'disabled': software.status === 'installed' || software.status === 'pending' || software.status === 'installing' + 'disabled': disabled || software.status === 'installed' || software.status === 'pending' || software.status === 'installing' }" > @@ -64,6 +65,7 @@ v-if="software.status === 'idle'" @click.stop="$emit('install', software.id, (software as any).targetVersion)" class="action-btn install-btn" + :disabled="disabled" > {{ actionLabel }} @@ -103,6 +105,7 @@ v-else-if="software.status === 'error'" @click.stop="$emit('install', software.id, (software as any).targetVersion)" class="action-btn retry-btn" + :disabled="disabled" > 重试 @@ -130,7 +133,8 @@ const props = defineProps<{ }, actionLabel?: string, selectable?: boolean, - isSelected?: boolean + isSelected?: boolean, + disabled?: boolean }>(); const emit = defineEmits(['install', 'toggleSelect']); @@ -186,6 +190,11 @@ const handleCardClick = () => { opacity: 0.9; } +.software-card.is-disabled { + opacity: 0.6; + pointer-events: none; +} + .selection-area { margin-right: 16px; flex-shrink: 0; diff --git a/src/store/software.ts b/src/store/software.ts index c80fa34..f55a93a 100644 --- a/src/store/software.ts +++ b/src/store/software.ts @@ -105,7 +105,7 @@ export const useSoftwareStore = defineStore('software', { }).sort(sortByName); }, isBusy: (state) => { - return Object.values(state.activeTasks).some(task => + return state.loading || Object.values(state.activeTasks).some(task => task.status === 'pending' || task.status === 'installing' ); } diff --git a/src/views/Essentials.vue b/src/views/Essentials.vue index 10fa3ed..105cfdc 100644 --- a/src/views/Essentials.vue +++ b/src/views/Essentials.vue @@ -58,6 +58,7 @@ :action-label="item.actionLabel" :selectable="true" :is-selected="store.selectedEssentialIds.includes(item.id)" + :disabled="store.isBusy" @install="store.install" @toggle-select="id => store.toggleSelection(id, 'essential')" /> diff --git a/src/views/Updates.vue b/src/views/Updates.vue index 9d9cc68..1c9457e 100644 --- a/src/views/Updates.vue +++ b/src/views/Updates.vue @@ -62,6 +62,7 @@ action-label="更新" :selectable="true" :is-selected="store.selectedUpdateIds.includes(item.id)" + :disabled="store.isBusy" @install="store.install" @toggle-select="id => store.toggleSelection(id, 'update')" />