From 7a72f1a0bb11a4f534c58cc81d1f475190a464bb Mon Sep 17 00:00:00 2001 From: Gros Frumos Date: Sat, 21 Mar 2026 11:24:15 +0200 Subject: [PATCH] kin: KIN-144-frontend_dev --- .../src/components/EscalationBanner.vue | 47 +++++++++++++++++-- web/frontend/src/locales/en.json | 5 +- web/frontend/src/locales/ru.json | 5 +- 3 files changed, 50 insertions(+), 7 deletions(-) diff --git a/web/frontend/src/components/EscalationBanner.vue b/web/frontend/src/components/EscalationBanner.vue index 043f0ba..09c9f9f 100644 --- a/web/frontend/src/components/EscalationBanner.vue +++ b/web/frontend/src/components/EscalationBanner.vue @@ -2,7 +2,7 @@ import { ref, computed, onMounted, onUnmounted } from 'vue' import { useI18n } from 'vue-i18n' import { useRouter } from 'vue-router' -import { api, type EscalationNotification, type Task } from '../api' +import { api, ApiError, type EscalationNotification, type Task } from '../api' const { t, locale } = useI18n() const router = useRouter() @@ -186,6 +186,28 @@ function cancelRevise() { reviseComment.value = '' } +const restartingTaskId = ref(null) +const restartError = ref(null) + +async function restartTask(taskId: string) { + if (!confirm(t('escalation.restart_confirm', { task_id: taskId }))) return + restartingTaskId.value = taskId + restartError.value = null + try { + await api.runTask(taskId) + dismiss(taskId) + } catch (e: any) { + if (e instanceof ApiError && e.code === 'task_already_running') { + restartError.value = t('escalation.restart_already_running') + } else { + restartError.value = e.message + } + setTimeout(() => { restartError.value = null }, 4000) + } finally { + restartingTaskId.value = null + } +} + onMounted(async () => { await load() pollTimer = setInterval(load, 10000) @@ -282,15 +304,30 @@ onUnmounted(() => {

{{ n.reason }}

{{ formatTime(n.blocked_at) }}

- +
+ + +
+ +
+ {{ restartError }} +
+
diff --git a/web/frontend/src/locales/en.json b/web/frontend/src/locales/en.json index bc034c1..7bd5e04 100644 --- a/web/frontend/src/locales/en.json +++ b/web/frontend/src/locales/en.json @@ -243,7 +243,10 @@ "revise_comment_placeholder": "Revision comment...", "revise_send": "Send", "revise_cancel": "Cancel", - "revise_default_comment": "Sent for revision" + "revise_default_comment": "Sent for revision", + "restart": "▶ Restart", + "restart_confirm": "Restart pipeline for task {task_id}?", + "restart_already_running": "Pipeline is already running" }, "liveConsole": { "hide_log": "▲ Скрыть лог", diff --git a/web/frontend/src/locales/ru.json b/web/frontend/src/locales/ru.json index a4967a7..2f6505d 100644 --- a/web/frontend/src/locales/ru.json +++ b/web/frontend/src/locales/ru.json @@ -243,7 +243,10 @@ "revise_comment_placeholder": "Комментарий к доработке...", "revise_send": "Отправить", "revise_cancel": "Отмена", - "revise_default_comment": "Отправлено на доработку" + "revise_default_comment": "Отправлено на доработку", + "restart": "▶ Перезапустить", + "restart_confirm": "Перезапустить pipeline для задачи {task_id}?", + "restart_already_running": "Pipeline уже запущен" }, "liveConsole": { "hide_log": "▲ Скрыть лог",