diff --git a/apps/web/src/components/domains/domain-availability-panel.tsx b/apps/web/src/components/domains/domain-availability-panel.tsx
index e452acc..71fff12 100644
--- a/apps/web/src/components/domains/domain-availability-panel.tsx
+++ b/apps/web/src/components/domains/domain-availability-panel.tsx
@@ -18,20 +18,6 @@ import { LoadingButton } from '@/components/loading-button'
import { ConfirmDialog } from '@/components/confirm-dialog'
import { QueryState } from '@/components/query-state'
import { TableSkeleton } from '@/components/skeletons'
-import {
- AppField,
- AppFieldGroup,
- AppFieldLabel,
-} from '@/components/app-field'
-import { AppInput } from '@/components/app-input'
-import {
- AppItem,
- AppItemActions,
- AppItemContent,
- AppItemGroup,
- AppItemSeparator,
- AppItemTitle,
-} from '@/components/app-item'
import {
Frame,
FrameDescription,
@@ -40,6 +26,16 @@ import {
FrameTitle,
} from '@/components/reui/frame'
import { Button } from '@cfdm/ui/components/button'
+import { Field, FieldGroup, FieldLabel } from '@cfdm/ui/components/field'
+import { Input } from '@cfdm/ui/components/input'
+import {
+ Item,
+ ItemActions,
+ ItemContent,
+ ItemGroup,
+ ItemSeparator,
+ ItemTitle,
+} from '@cfdm/ui/components/item'
import {
Select,
SelectContent,
@@ -178,21 +174,19 @@ export function DomainAvailabilityPanel({
createMutation.mutate()
}}
>
-
-
-
- Hostname
-
-
+
+ Hostname
+ setHostname(e.target.value)}
autoComplete="off"
/>
-
-
- Тип
+
+
+ Тип
-
+
Добавить
-
+
@@ -251,14 +245,14 @@ export function DomainAvailabilityPanel({
description="Добавьте hostname для проверки доступности"
/>
) : (
-
+
{monitors.map((monitor, index) => (
-
-
-
+ -
+
+
{monitor.hostname}
-
+
{monitorTypeLabel(monitor.type)}
@@ -271,8 +265,8 @@ export function DomainAvailabilityPanel({
Ещё не проверялся
)}
-
-
+
+
}
/>
-
-
- {index < monitors.length - 1 ? (
-
- ) : null}
+
+
+ {index < monitors.length - 1 ?
: null}
))}
-
+
)}
diff --git a/apps/web/src/components/domains/domains-bulk-toolbar.tsx b/apps/web/src/components/domains/domains-bulk-toolbar.tsx
index 230ce44..d9d3679 100644
--- a/apps/web/src/components/domains/domains-bulk-toolbar.tsx
+++ b/apps/web/src/components/domains/domains-bulk-toolbar.tsx
@@ -1,4 +1,6 @@
import { useState } from 'react'
+import { Badge } from '@/components/reui/badge'
+import { Frame, FramePanel } from '@/components/reui/frame'
import { Button } from '@cfdm/ui/components/button'
import {
Select,
@@ -42,89 +44,97 @@ export function DomainsBulkToolbar({
]
return (
-
-
- Выбрано: {count}
-
-
-
-
-
- setTag(e.target.value)}
- />
-
-
-
+
+
+
+ {count} выбрано
+
+
+
+
+
+ setTag(e.target.value)}
+ />
+
+
+
+
)
}
diff --git a/apps/web/src/routes/_auth/domains/$domainId/index.tsx b/apps/web/src/routes/_auth/domains/$domainId/index.tsx
index fad07cd..dc0bb3d 100644
--- a/apps/web/src/routes/_auth/domains/$domainId/index.tsx
+++ b/apps/web/src/routes/_auth/domains/$domainId/index.tsx
@@ -24,6 +24,7 @@ import { useDomainPage } from '@/hooks/use-domain-page'
import type { SubdomainTableRow } from '@/hooks/use-domain-page'
import { PageShell } from '@/components/page-shell'
import { QueryState } from '@/components/query-state'
+import { CountedLineTabs } from '@/components/counted-line-tabs'
import { DetailPanel, ResourcePage } from '@/components/reui-kit'
import {
SUBDOMAIN_TABS,
@@ -53,12 +54,7 @@ import {
SelectTrigger,
SelectValue,
} from '@cfdm/ui/components/select'
-import {
- Tabs,
- TabsContent,
- TabsList,
- TabsTrigger,
-} from '@cfdm/ui/components/tabs'
+import { TabsContent } from '@cfdm/ui/components/tabs'
export const Route = createFileRoute('/_auth/domains/$domainId/')({
loader: async ({ context: { queryClient }, params }) => {
@@ -327,50 +323,26 @@ function DomainOverviewPage() {
actions={headerActions}
/>
-
-
-
- Обзор
-
-
- DNS
-
-
- Доступность
-
-
- Поддомены
-
- {subdomainRows.length}
-
-
-
- Привязки
-
- {bindings.length}
-
-
-
-
-
- ({ ...tab }))}
- tabFilter={subdomainTabFilter}
- filterFields={filterFields}
- filters={filters}
- onFiltersChange={setFilters}
- onClearFilters={() =>
- setFilters(createDefaultSubdomainFilters())
- }
- getFilterFieldValue={subdomainFilterFieldValue}
- columns={columns}
- data={subdomainRows}
- getRowId={(row) => String(row.subdomain.id)}
- toolbarExtra={
+ ({ ...tab }))}
+ tabFilter={subdomainTabFilter}
+ filterFields={filterFields}
+ filters={filters}
+ onFiltersChange={setFilters}
+ onClearFilters={() =>
+ setFilters(createDefaultSubdomainFilters())
+ }
+ getFilterFieldValue={subdomainFilterFieldValue}
+ columns={columns}
+ data={subdomainRows}
+ getRowId={(row) => String(row.subdomain.id)}
+ toolbarExtra={
+
+ }
+ emptyState={{
+ title: 'Поддомены не созданы',
+ description: 'Добавьте поддомен для привязки сервисов',
+ action: (
- }
- emptyState={{
- title: 'Поддомены не созданы',
- description: 'Добавьте поддомен для привязки сервисов',
- action: (
-
- ),
- }}
- />
-
+ ),
+ }}
+ />
-
-
-
+
-
+
}>
К группам
)
+ const metricCards = useMemo(() => {
+ if (!group) return []
+ return [
+ {
+ id: 'domains',
+ icon: ,
+ label: 'Домены',
+ description: 'Зоны в этой группе',
+ footer: (
+
+ {group.domain_count}
+
+ ),
+ },
+ {
+ id: 'slug',
+ icon: ,
+ label: 'Slug',
+ description: 'Идентификатор группы',
+ footer: (
+ {group.slug}
+ ),
+ },
+ {
+ id: 'group',
+ icon: ,
+ label: 'Группа',
+ description: group.name,
+ footer: (
+ }
+ >
+ Открыть канбан
+
+ ),
+ },
+ ]
+ }, [group])
+
return (
- setFilters(createDefaultGroupDomainFilters())}
- getFilterFieldValue={groupDomainFilterFieldValue}
- columns={columns}
- data={domains ?? []}
- getRowId={(row) => String(row.id)}
- isLoading={isLoading}
- isError={isError}
- error={error}
- onRetry={() => {
- void refetchGroup()
- void refetchDomains()
- }}
- primaryAction={primaryAction}
- emptyState={{
- title: 'В группе нет доменов',
- description:
- 'Перетащите домены на канбане групп или назначьте группу при импорте',
- action: (
- }>
- Открыть канбан групп
-
- ),
- }}
- />
+
+
+
+ {!isLoading && group ? (
+
+ ) : null}
+
+
+ setFilters(createDefaultGroupDomainFilters())}
+ getFilterFieldValue={groupDomainFilterFieldValue}
+ columns={columns}
+ data={domains ?? []}
+ getRowId={(row) => String(row.id)}
+ isLoading={isLoading}
+ isError={isError}
+ error={error}
+ onRetry={() => {
+ void refetchGroup()
+ void refetchDomains()
+ }}
+ emptyState={{
+ title: 'В группе нет доменов',
+ description:
+ 'Перетащите домены на канбане групп или назначьте группу при импорте',
+ action: (
+ }
+ >
+ Открыть канбан групп
+
+ ),
+ }}
+ />
+
+
)
}