diff --git a/backend/app/version.py b/backend/app/version.py
index f3f8ca7..dceee1b 100644
--- a/backend/app/version.py
+++ b/backend/app/version.py
@@ -1,5 +1,5 @@
"""Единый источник версии SAC (API, health, логи, OpenAPI)."""
APP_NAME = "Security Alert Center"
-APP_VERSION = "0.3.9"
+APP_VERSION = "0.4.0"
APP_VERSION_LABEL = f"{APP_NAME} v.{APP_VERSION}"
diff --git a/frontend/src/components/HostAgentVersionUpgrade.vue b/frontend/src/components/HostAgentVersionUpgrade.vue
index 2826a77..af13d36 100644
--- a/frontend/src/components/HostAgentVersionUpgrade.vue
+++ b/frontend/src/components/HostAgentVersionUpgrade.vue
@@ -7,8 +7,12 @@
v-if="showUpgrade"
type="button"
class="agent-version-upgrade"
- :disabled="updating"
- :title="upgradeTitle"
+ :class="{
+ 'agent-version-upgrade--inactive': upgradeBlocked,
+ 'agent-version-upgrade--updating': updating,
+ }"
+ :disabled="updating || upgradeBlocked"
+ :title="buttonTitle"
@click.stop="emit('upgrade')"
>
↑
@@ -31,6 +35,8 @@ const props = defineProps<{
host: HostSummary;
git: AgentGitVersions | null | undefined;
updating?: boolean;
+ /** Другой хост сейчас обновляется — стрелка видна, но неактивна (серая). */
+ upgradeBlocked?: boolean;
outdatedHighlight?: boolean;
}>();
@@ -40,9 +46,7 @@ const emit = defineEmits<{
const gitTargetVersion = computed(() => gitTargetVersionForHost(props.host, props.git));
-const showUpgrade = computed(
- () => !props.updating && isGitAgentUpgradeAvailable(props.host, props.git),
-);
+const showUpgrade = computed(() => isGitAgentUpgradeAvailable(props.host, props.git));
const currentTitle = computed(() => {
if (!props.host.product_version) return "";
@@ -56,6 +60,16 @@ const upgradeTitle = computed(() => {
if (!gitTargetVersion.value) return "";
return `Обновить агент до ${gitTargetVersion.value}`;
});
+
+const buttonTitle = computed(() => {
+ if (props.updating) {
+ return "Обновление выполняется…";
+ }
+ if (props.upgradeBlocked) {
+ return "Дождитесь завершения обновления на другом хосте";
+ }
+ return upgradeTitle.value;
+});