diff --git a/web/src/lib/components/overview/OverviewRecentJobsCard.svelte b/web/src/lib/components/overview/OverviewRecentJobsCard.svelte new file mode 100644 index 0000000..b5b8769 --- /dev/null +++ b/web/src/lib/components/overview/OverviewRecentJobsCard.svelte @@ -0,0 +1,94 @@ + + + + +
+ Последние задачи + Фоновые задачи ingest, refresh и apply +
+ +
+ + j.job_id} + loading={initialLoading || loading} + {error} + emptyTitle="Нет задач" + emptyDescription="Задачи появятся после refresh или деплоя." + > + {#snippet cell({ row: j, column })} + {#if column.id === 'kind'} + {jobKindTitle(j, moduleNameById)} + {:else if column.id === 'status'} + {jobStatusRu(j.status)} + {:else if column.id === 'created'} + + {formatDateTime(j.created_at)} + + {:else if column.id === 'actions'} + + {/if} + {/snippet} + + +
diff --git a/web/src/lib/components/overview/OverviewRecentRevisionsCard.svelte b/web/src/lib/components/overview/OverviewRecentRevisionsCard.svelte new file mode 100644 index 0000000..acc788b --- /dev/null +++ b/web/src/lib/components/overview/OverviewRecentRevisionsCard.svelte @@ -0,0 +1,89 @@ + + + + +
+ Последние ревизии + Снимки конфигурации BIRD после обновления модулей +
+ +
+ + rev.id} + loading={initialLoading || loading} + {error} + emptyTitle="Нет ревизий" + emptyDescription="Ревизии появятся после обновления модулей." + > + {#snippet cell({ row: rev, column })} + {#if column.id === 'id'} + {rev.id.slice(0, 8)}… + {:else if column.id === 'created'} + + {formatDateTime(rev.created_at)} + + {:else if column.id === 'prefixes'} + {rev.materialized_prefix_count} + {:else if column.id === 'actions'} + + {/if} + {/snippet} + + +
diff --git a/web/src/routes/+page.svelte b/web/src/routes/+page.svelte index 0c80c80..7dd7636 100644 --- a/web/src/routes/+page.svelte +++ b/web/src/routes/+page.svelte @@ -1,25 +1,36 @@
+ > + {#snippet actions()} + + {/snippet} + - - - - {#if healthy === null} -
- Проверка… - {:else if healthy} - - API работает - {:else} - - API недоступен - {/if} -
-
+ + + Панель управления EvoBGP + + Сводка по модулям, сети и фоновым задачам. Настройка префиксов — на странице + , деплой и + ревизии — + , + здоровье системы — + . + + + + {#if healthy === null} + + + Проверка API… + Запрос к /v1/health + + {:else if healthy} + + + API работает + Сервер отвечает на запросы health-check. + + {:else} + + + API недоступен + + Не удалось получить ответ от сервера. Проверьте подключение и статус API. + + + {/if} -
- {#each stats as stat (stat.label)} - {@const Icon = stat.icon} - {@const a = stat.accent} - - -
- - - {stat.label} - - -
- - {loading ? '—' : stat.value} - -
- -

{stat.description}

-
-
- {/each} + {#if initialLoading} + {#each Array(5) as _, i (i)} + + {/each} + {:else} + {#each kpiCards as card (card.id)} + {@const Icon = card.icon} + {@const a = card.accent} + + +
+ + + {card.label} + + +
+ {card.value} +
+ + {card.badge} +

{card.description}

+
+
+ {/each} + {/if} +
+ +
+ +
- - + Быстрые действия + Частые переходы к настройке и деплою - - - - - - + + + + + +