fix(ui): table actions column layout and resolved label

Move flex off td.actions to inner wrapper; show Закрыта for resolved problems. SAC 0.8.2.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
PTah
2026-06-05 14:10:56 +10:00
parent 02200f1a80
commit 95c5b9f25a
6 changed files with 53 additions and 28 deletions
+1 -1
View File
@@ -1,5 +1,5 @@
"""Единый источник версии SAC (API, health, логи, OpenAPI).""" """Единый источник версии SAC (API, health, логи, OpenAPI)."""
APP_NAME = "Security Alert Center" APP_NAME = "Security Alert Center"
APP_VERSION = "0.8.1" APP_VERSION = "0.8.2"
APP_VERSION_LABEL = f"{APP_NAME} v.{APP_VERSION}" APP_VERSION_LABEL = f"{APP_NAME} v.{APP_VERSION}"
+19
View File
@@ -32,6 +32,7 @@ a {
.sac-host-row td.actions { .sac-host-row td.actions {
cursor: default; cursor: default;
vertical-align: middle;
} }
.sac-host-row:hover td.actions, .sac-host-row:hover td.actions,
@@ -113,9 +114,27 @@ th {
} }
td.actions { td.actions {
vertical-align: middle;
white-space: nowrap;
}
td.actions .actions-inner {
display: flex;
align-items: center;
gap: 0.35rem;
flex-wrap: wrap;
}
.actions-muted {
color: #9aa4b2;
font-size: 0.85rem;
}
p.actions {
display: flex; display: flex;
gap: 0.35rem; gap: 0.35rem;
flex-wrap: wrap; flex-wrap: wrap;
align-items: center;
} }
.card { .card {
+1 -1
View File
@@ -1,3 +1,3 @@
export const APP_NAME = "Security Alert Center"; export const APP_NAME = "Security Alert Center";
export const APP_VERSION = "0.8.1"; export const APP_VERSION = "0.8.2";
export const APP_VERSION_LABEL = `${APP_NAME} v.${APP_VERSION}`; export const APP_VERSION_LABEL = `${APP_NAME} v.${APP_VERSION}`;
+11 -9
View File
@@ -61,15 +61,17 @@
<td>{{ formatDt(h.last_seen_at) }}</td> <td>{{ formatDt(h.last_seen_at) }}</td>
<td>{{ h.event_count ?? 0 }}</td> <td>{{ h.event_count ?? 0 }}</td>
<td class="actions" @click.stop> <td class="actions" @click.stop>
<button <div class="actions-inner">
type="button" <button
class="danger" type="button"
:disabled="deletingId === h.id" class="danger"
title="Удалить хост и все его события" :disabled="deletingId === h.id"
@click="confirmDelete(h)" title="Удалить хост и все его события"
> @click="confirmDelete(h)"
Удалить >
</button> Удалить
</button>
</div>
</td> </td>
</tr> </tr>
</tbody> </tbody>
+1
View File
@@ -45,6 +45,7 @@
<button v-if="problem.status !== 'resolved'" type="button" :disabled="acting" @click="doResolve"> <button v-if="problem.status !== 'resolved'" type="button" :disabled="acting" @click="doResolve">
Resolve Resolve
</button> </button>
<span v-else class="actions-muted">Закрыта</span>
</p> </p>
</div> </div>
+20 -17
View File
@@ -50,23 +50,26 @@
<RouterLink :to="`/problems/${p.id}`">{{ p.title }}</RouterLink> <RouterLink :to="`/problems/${p.id}`">{{ p.title }}</RouterLink>
</td> </td>
<td class="actions"> <td class="actions">
<button <div class="actions-inner">
v-if="p.status === 'open'" <button
type="button" v-if="p.status === 'open'"
class="secondary" type="button"
:disabled="actingId === p.id" class="secondary"
@click="doAck(p.id)" :disabled="actingId === p.id"
> @click="doAck(p.id)"
Ack >
</button> Ack
<button </button>
v-if="p.status !== 'resolved'" <button
type="button" v-if="p.status !== 'resolved'"
:disabled="actingId === p.id" type="button"
@click="doResolve(p.id)" :disabled="actingId === p.id"
> @click="doResolve(p.id)"
Resolve >
</button> Resolve
</button>
<span v-if="p.status === 'resolved'" class="actions-muted">Закрыта</span>
</div>
</td> </td>
</tr> </tr>
</tbody> </tbody>