feat(web): командная палитра ⌘K — поиск агентов/списков/наборов и действия (ReUI c-command-7 + cmdk)

This commit is contained in:
Denozordec
2026-09-25 01:35:29 +07:00
parent 28f1f35f16
commit 3d4edbad8b
7 changed files with 448 additions and 125 deletions
+19 -5
View File
@@ -29,6 +29,10 @@ import {
import type { PolicySet } from '@evofw/shared'
export const Route = createFileRoute('/_auth/rules/')({
validateSearch: (search: Record<string, unknown>) => ({
/** Открыть sheet создания (из ⌘K-палитры). */
create: search.create === true || undefined,
}),
component: PolicySetsPage,
})
@@ -42,7 +46,9 @@ function PolicySetsPage() {
const navigate = useNavigate()
const qc = useQueryClient()
const setsQ = useQuery(policySetsQueryOptions())
const [sheetOpen, setSheetOpen] = useState(false)
const createParam = Route.useSearch().create === true
const [sheetOpenState, setSheetOpenState] = useState(false)
const sheetOpen = sheetOpenState || createParam
const [name, setName] = useState('')
const [description, setDescription] = useState('')
const [filters, setFilters] = useState<Filter[]>([])
@@ -63,7 +69,7 @@ function PolicySetsPage() {
toast.success('Набор создан')
setName('')
setDescription('')
setSheetOpen(false)
setSheetOpenState(false)
void qc.invalidateQueries({ queryKey: ['policy-sets'] })
void navigate({ to: '/rules/$setId', params: { setId: row.id } })
},
@@ -203,7 +209,7 @@ function PolicySetsPage() {
const canCreate = useCan()('fw:policies:write')
const addButton = canCreate ? (
<Button size="sm" onClick={() => setSheetOpen(true)}>
<Button size="sm" onClick={() => setSheetOpenState(true)}>
<Plus data-icon="inline-start" />
Новый набор
</Button>
@@ -260,7 +266,15 @@ function PolicySetsPage() {
disabled={remove.isPending}
/>
<Sheet open={sheetOpen} onOpenChange={setSheetOpen}>
<Sheet
open={sheetOpen}
onOpenChange={(open) => {
setSheetOpenState(open)
if (!open && createParam) {
void navigate({ to: '/rules', search: { create: undefined }, replace: true })
}
}}
>
<SheetContent className="flex flex-col gap-0 overflow-hidden sm:max-w-md">
<SheetHeader className="shrink-0">
<SheetTitle>Новый набор</SheetTitle>
@@ -289,7 +303,7 @@ function PolicySetsPage() {
</Field>
</div>
<SheetFooter className="mt-0 shrink-0 flex-row flex-wrap gap-2 border-t">
<Button variant="outline" onClick={() => setSheetOpen(false)}>
<Button variant="outline" onClick={() => setSheetOpenState(false)}>
Отмена
</Button>
<Button