feat(dimzou): complete admin monitoring filters
This commit is contained in:
@@ -39,9 +39,12 @@ function DimzouTranslationsPage() {
|
||||
// language filter applies on Enter/blur to avoid a request per keystroke
|
||||
const [languageInput, setLanguageInput] = useState('')
|
||||
const [language, setLanguage] = useState('')
|
||||
const [sourceInput, setSourceInput] = useState('')
|
||||
const [sourceDocumentId, setSourceDocumentId] = useState('')
|
||||
const filters: Record<string, string> = {}
|
||||
if (status !== 'all') filters.status = status
|
||||
if (language) filters.language_code = language
|
||||
if (sourceDocumentId) filters.source_document_id = sourceDocumentId
|
||||
|
||||
const list = useListPage('dimzou-translations', fetchDimzouTranslations, filters)
|
||||
|
||||
@@ -119,7 +122,14 @@ function DimzouTranslationsPage() {
|
||||
canRetranslate ? (
|
||||
<ConfirmDialog
|
||||
trigger={
|
||||
<Button size="sm" variant="outline" disabled={!row.original.draft_version_id}>
|
||||
<Button
|
||||
size="sm"
|
||||
variant="outline"
|
||||
disabled={
|
||||
!row.original.draft_version_id ||
|
||||
row.original.blocks.needs_translation + row.original.blocks.translation_failed === 0
|
||||
}
|
||||
>
|
||||
重新机器翻译
|
||||
</Button>
|
||||
}
|
||||
@@ -150,6 +160,17 @@ function DimzouTranslationsPage() {
|
||||
placeholder="语言,如 en"
|
||||
className="h-8 w-28"
|
||||
/>
|
||||
<Input
|
||||
value={sourceInput}
|
||||
onChange={(event) => setSourceInput(event.target.value)}
|
||||
onBlur={() => setSourceDocumentId(sourceInput.trim())}
|
||||
onKeyDown={(event) => {
|
||||
if (event.key === 'Enter') setSourceDocumentId(sourceInput.trim())
|
||||
}}
|
||||
inputMode="numeric"
|
||||
placeholder="源文档 ID"
|
||||
className="h-8 w-28"
|
||||
/>
|
||||
<Select value={status} onValueChange={setStatus}>
|
||||
<SelectTrigger size="sm" className="w-28">
|
||||
<SelectValue />
|
||||
|
||||
@@ -11,6 +11,7 @@ import { PageHeader } from '@/components/page-header'
|
||||
import { DetailSheet } from '@/features/studio/detail-sheet'
|
||||
import { Badge } from '@/components/ui/badge'
|
||||
import { Button } from '@/components/ui/button'
|
||||
import { Input } from '@/components/ui/input'
|
||||
import {
|
||||
Select,
|
||||
SelectContent,
|
||||
@@ -45,13 +46,17 @@ const formatTime = (value?: string | null) =>
|
||||
|
||||
function DimzouDocumentsPage() {
|
||||
const [state, setState] = useState<string>('all')
|
||||
const [queryInput, setQueryInput] = useState('')
|
||||
const [query, setQuery] = useState('')
|
||||
const [ownerInput, setOwnerInput] = useState('')
|
||||
const [ownerUid, setOwnerUid] = useState('')
|
||||
const [detailId, setDetailId] = useState<number | null>(null)
|
||||
|
||||
const list = useListPage(
|
||||
'dimzou-documents',
|
||||
fetchDimzouDocuments,
|
||||
state === 'all' ? {} : { state },
|
||||
)
|
||||
const filters: Record<string, string> = {}
|
||||
if (state !== 'all') filters.state = state
|
||||
if (query) filters.q = query
|
||||
if (ownerUid) filters.owner_uid = ownerUid
|
||||
const list = useListPage('dimzou-documents', fetchDimzouDocuments, filters)
|
||||
|
||||
const detail = useQuery({
|
||||
queryKey: ['dimzou-document', detailId],
|
||||
@@ -108,19 +113,37 @@ function DimzouDocumentsPage() {
|
||||
title="文档监控"
|
||||
description="全站协作文档及其版本、译文与待审情况(只读)"
|
||||
actions={
|
||||
<Select value={state} onValueChange={setState}>
|
||||
<SelectTrigger size="sm" className="w-28">
|
||||
<SelectValue />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectItem value="all">全部状态</SelectItem>
|
||||
{Object.entries(STATE_LABELS).map(([value, label]) => (
|
||||
<SelectItem key={value} value={value}>
|
||||
{label}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
<div className="flex items-center gap-2">
|
||||
<Input
|
||||
className="h-8 w-36"
|
||||
placeholder="搜索标题,回车"
|
||||
value={queryInput}
|
||||
onChange={(event) => setQueryInput(event.target.value)}
|
||||
onBlur={() => setQuery(queryInput.trim())}
|
||||
onKeyDown={(event) => event.key === 'Enter' && setQuery(queryInput.trim())}
|
||||
/>
|
||||
<Input
|
||||
className="h-8 w-44"
|
||||
placeholder="所有者 UID,回车"
|
||||
value={ownerInput}
|
||||
onChange={(event) => setOwnerInput(event.target.value)}
|
||||
onBlur={() => setOwnerUid(ownerInput.trim())}
|
||||
onKeyDown={(event) => event.key === 'Enter' && setOwnerUid(ownerInput.trim())}
|
||||
/>
|
||||
<Select value={state} onValueChange={setState}>
|
||||
<SelectTrigger size="sm" className="w-28">
|
||||
<SelectValue />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectItem value="all">全部状态</SelectItem>
|
||||
{Object.entries(STATE_LABELS).map(([value, label]) => (
|
||||
<SelectItem key={value} value={value}>
|
||||
{label}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</div>
|
||||
}
|
||||
/>
|
||||
<DataTable
|
||||
|
||||
@@ -10,6 +10,7 @@ import { PageHeader } from '@/components/page-header'
|
||||
import { DetailSheet } from '@/features/studio/detail-sheet'
|
||||
import { Badge } from '@/components/ui/badge'
|
||||
import { Button } from '@/components/ui/button'
|
||||
import { Input } from '@/components/ui/input'
|
||||
import {
|
||||
Select,
|
||||
SelectContent,
|
||||
@@ -28,13 +29,17 @@ const formatTime = (value?: string | null) =>
|
||||
|
||||
function DimzouPublicationsPage() {
|
||||
const [visibility, setVisibility] = useState<string>('all')
|
||||
const [queryInput, setQueryInput] = useState('')
|
||||
const [query, setQuery] = useState('')
|
||||
const [languageInput, setLanguageInput] = useState('')
|
||||
const [language, setLanguage] = useState('')
|
||||
const [detail, setDetail] = useState<DimzouPublication | null>(null)
|
||||
|
||||
const list = useListPage(
|
||||
'dimzou-publications',
|
||||
fetchDimzouPublications,
|
||||
visibility === 'all' ? {} : { visibility },
|
||||
)
|
||||
const filters: Record<string, string> = {}
|
||||
if (visibility !== 'all') filters.visibility = visibility
|
||||
if (query) filters.q = query
|
||||
if (language) filters.language = language
|
||||
const list = useListPage('dimzou-publications', fetchDimzouPublications, filters)
|
||||
|
||||
const columns: ColumnDef<DimzouPublication>[] = [
|
||||
{
|
||||
@@ -92,7 +97,26 @@ function DimzouPublicationsPage() {
|
||||
title="发布监控"
|
||||
description="全站已发布内容快照(只读)"
|
||||
actions={
|
||||
<Select value={visibility} onValueChange={setVisibility}>
|
||||
<div className="flex items-center gap-2">
|
||||
<Input
|
||||
className="h-8 w-36"
|
||||
placeholder="搜索标题,回车"
|
||||
value={queryInput}
|
||||
onChange={(event) => setQueryInput(event.target.value)}
|
||||
onBlur={() => setQuery(queryInput.trim())}
|
||||
onKeyDown={(event) => event.key === 'Enter' && setQuery(queryInput.trim())}
|
||||
/>
|
||||
<Input
|
||||
className="h-8 w-28"
|
||||
placeholder="语言,如 zh-cn"
|
||||
value={languageInput}
|
||||
onChange={(event) => setLanguageInput(event.target.value)}
|
||||
onBlur={() => setLanguage(languageInput.trim())}
|
||||
onKeyDown={(event) =>
|
||||
event.key === 'Enter' && setLanguage(languageInput.trim())
|
||||
}
|
||||
/>
|
||||
<Select value={visibility} onValueChange={setVisibility}>
|
||||
<SelectTrigger size="sm" className="w-28">
|
||||
<SelectValue />
|
||||
</SelectTrigger>
|
||||
@@ -101,7 +125,8 @@ function DimzouPublicationsPage() {
|
||||
<SelectItem value="public">公开</SelectItem>
|
||||
<SelectItem value="group_only">仅协作组</SelectItem>
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</Select>
|
||||
</div>
|
||||
}
|
||||
/>
|
||||
<DataTable
|
||||
|
||||
Reference in New Issue
Block a user