Compare commits

...
1 Commits
Author SHA1 Message Date
Denozordec e6e319a275 refactor(web): improve job kind handling in schedule components
CD / quality (push) Successful in 1m49s
quality / changes (push) Successful in 9s
quality / openapi (push) Successful in 25s
quality / web (push) Successful in 1m6s
quality / go (push) Skipped
quality / bird2 (push) Skipped
quality / commitlint (push) Skipped
quality / docker-check (push) Skipped
CD / publish (push) Successful in 3m2s
- Removed hardcoded job kind checks in schedule components and replaced them with a utility function `isRefreshJobKind` for better maintainability.
- Updated the `ui-labels` module to include additional job kinds and their corresponding labels.
- Adjusted the `DashboardRecentJobsGrid`, `OperationsJobsGrid`, and `ScheduleJobsGrid` components to reflect these changes, enhancing the clarity and consistency of job kind representation.
2026-08-19 09:45:31 +07:00
7 changed files with 26 additions and 8 deletions
@@ -29,7 +29,6 @@ export function DashboardRecentJobsGrid({
cell: ({ row }) => (
<DataGridPrimaryCell
title={jobKindRu(row.original.kind)}
accent="mono"
subtitle={
row.original.meta?.module_id
? (nameById.get(String(row.original.meta.module_id)) ?? undefined)
@@ -43,7 +43,6 @@ export function OperationsJobsGrid({
cell: ({ row }) => (
<DataGridPrimaryCell
title={jobKindRu(row.original.kind)}
accent="mono"
subtitle={
row.original.meta?.module_id
? (nameById.get(String(row.original.meta.module_id)) ??
@@ -16,7 +16,7 @@ import {
SelectValue,
} from '@evobgp/ui/components/select'
import { cn } from '@evobgp/ui/lib/utils'
import { jobKindRu } from '@/lib/ui-labels'
import { isRefreshJobKind, jobKindRu } from '@/lib/ui-labels'
import type { JobRow } from '@/types/api'
import { ScheduleCalendarView } from './schedule-calendar-view'
@@ -34,7 +34,7 @@ function jobTimestamp(job: JobRow): string | undefined {
}
function matchesFilter(job: JobRow, filter: JobFilter): boolean {
if (filter === 'refresh') return job.kind === 'module_refresh'
if (filter === 'refresh') return isRefreshJobKind(job.kind)
if (filter === 'failed')
return ['failed', 'error', 'cancelled'].includes(job.status.toLowerCase())
return true
@@ -4,6 +4,7 @@ import { FrameDataGrid } from '@/components/reui-kit'
import { QueryState } from '@/components/query-state'
import { TableSkeleton } from '@/components/skeletons'
import { Tabs, TabsList, TabsTrigger } from '@evobgp/ui/components/tabs'
import { isRefreshJobKind } from '@/lib/ui-labels'
import type { JobRow } from '@/types/api'
import { ScheduleJobsGrid } from './schedule-jobs-grid'
@@ -11,7 +12,7 @@ import { ScheduleJobsGrid } from './schedule-jobs-grid'
type JobTab = 'all' | 'refresh' | 'failed'
function filterJobs(items: JobRow[], tab: JobTab): JobRow[] {
if (tab === 'refresh') return items.filter((j) => j.kind === 'module_refresh')
if (tab === 'refresh') return items.filter((j) => isRefreshJobKind(j.kind))
if (tab === 'failed')
return items.filter((j) => ['failed', 'error', 'cancelled'].includes(j.status.toLowerCase()))
return items
@@ -20,7 +21,7 @@ function filterJobs(items: JobRow[], tab: JobTab): JobRow[] {
function tabCounts(items: JobRow[]) {
return {
all: items.length,
refresh: items.filter((j) => j.kind === 'module_refresh').length,
refresh: items.filter((j) => isRefreshJobKind(j.kind)).length,
failed: items.filter((j) => ['failed', 'error', 'cancelled'].includes(j.status.toLowerCase()))
.length,
}
@@ -21,7 +21,7 @@ export function ScheduleJobsGrid({
{
accessorKey: 'kind',
header: ({ column }) => <DataGridColumnHeader column={column} title="Вид" />,
cell: ({ row }) => <DataGridPrimaryCell title={jobKindRu(row.original.kind)} accent="mono" />,
cell: ({ row }) => <DataGridPrimaryCell title={jobKindRu(row.original.kind)} />,
meta: { headerTitle: 'Вид' },
},
{
+19
View File
@@ -30,9 +30,28 @@ export function moduleTypeRu(type: string): string {
const JOB_KIND_RU: Record<string, string> = {
module_refresh: 'Обновление модуля',
tenant_refresh: 'Обновление тенанта',
peer_reconcile: 'Согласование пиров',
deploy_apply: 'Применение на спикеры',
apply: 'Применение конфигурации',
revision_rollback: 'Откат ревизии',
rollback: 'Откат ревизии',
bird_reload: 'Перезагрузка BIRD',
postgres_metrics_refresh: 'Метрики PostgreSQL',
postgres_slow_query_aggregate: 'Медленные запросы PostgreSQL',
postgres_table_bloat_estimate: 'Bloat таблиц PostgreSQL',
postgres_index_usage_analyze: 'Использование индексов PostgreSQL',
postgres_autovacuum_lag_detect: 'Отставание autovacuum',
postgres_vacuum: 'VACUUM PostgreSQL',
postgres_vacuum_analyze: 'VACUUM ANALYZE PostgreSQL',
postgres_analyze: 'ANALYZE PostgreSQL',
postgres_reindex: 'REINDEX PostgreSQL',
postgres_cleanup: 'Очистка PostgreSQL',
maintenance_policy_run: 'Политика обслуживания',
}
export function isRefreshJobKind(kind: string): boolean {
return kind === 'module_refresh' || kind === 'tenant_refresh'
}
export function jobKindRu(kind: string): string {
File diff suppressed because one or more lines are too long