import { useDeferredValue, useMemo, useState } from 'react' import { createFileRoute, Link, useNavigate } from '@tanstack/react-router' import { useTranslation } from 'react-i18next' import { Alert, Badge, Button, EmptyState, LoadingBlock, PageHeader, SearchInput, } from '@nstart/ui' import { PlusIcon } from '@phosphor-icons/react' import { useDictionaries } from '@/api/queries' import type { DictionaryDefinition } from '@/api/client' import { DictionaryEditorDialog } from '@/components/schema/DictionaryEditorDialog' export const Route = createFileRoute('/dictionaries/')({ component: DictionariesPage, }) const matchesQuery = (d: DictionaryDefinition, q: string): boolean => { if (!q) return true const haystack = [d.name, d.displayName ?? '', d.description ?? ''] .join(' ') .toLowerCase() return haystack.includes(q) } function DictionariesPage() { const { t } = useTranslation() const navigate = useNavigate() const { data, isLoading, error } = useDictionaries() const [createOpen, setCreateOpen] = useState(false) const [query, setQuery] = useState('') const deferredQuery = useDeferredValue(query) const filtered = useMemo(() => { if (!data) return [] const q = deferredQuery.trim().toLowerCase() return data.filter((d) => matchesQuery(d, q)) }, [data, deferredQuery]) const createButton = ( ) if (isLoading) { return } if (error) { return ( {String(error)} ) } if (!data || data.length === 0) { return (
setCreateOpen(false)} onSuccess={(name) => { setCreateOpen(false) navigate({ to: '/dictionaries/$name', params: { name } }) }} />
) } return (
setQuery(e.target.value)} placeholder={t('dict.list.search.placeholder')} aria-label={t('dict.list.search.placeholder')} />
{t('dict.list.found', { shown: filtered.length, total: data.length })}
{filtered.length === 0 ? ( ) : (
{filtered.map((d) => (

{d.displayName ?? d.name}

{d.scope}
{d.description && (

{d.description}

)}
v{d.schemaVersion} · {d.bundle} · {d.supportedLocales.join(', ')}
{typeof d.recordCount === 'number' && ( {t('dict.list.recordCount', { count: d.recordCount })} )}
))}
)} setCreateOpen(false)} onSuccess={(name) => { setCreateOpen(false) navigate({ to: '/dictionaries/$name', params: { name } }) }} />
) }