fix(ui): сохранять фильтры серверов в адресе страницы
This commit is contained in:
1 parent
b64e6834a9
commit
dfb993e1a3
7 files changed
+256
-10
No files matched your search
@@ -11,7 +11,7 @@ import { PageHeader } from "@/components/page-header"
|
||||
import { FormField, FormToggle, SectionTitle, SegmentedControl } from "@/components/form-kit"
|
||||
import { DataPageToolbar } from "@/components/data-page-toolbar"
|
||||
import { ServersDataGrid } from "@/components/data-grids/servers-data-grid"
|
||||
import { createFilterQuery } from "@/components/reui/filters/filters-query"
|
||||
import { useServerUrlState } from "@/hooks/use-server-url-state"
|
||||
import { ServerFilters } from "@/components/data-grids/server-filters"
|
||||
import { applyFilterQuery } from "@/lib/data-filters/apply-filter-query"
|
||||
import { SERVER_FILTER_ACCESSORS } from "@/lib/data-filters/server-filter-fields"
|
||||
@@ -231,9 +231,7 @@ function ServersPageContent() {
|
||||
|
||||
const [serverList, setServerList] = useState<Server[]>([])
|
||||
const [listState, setListState] = useState<"loading" | "ready" | "error">("loading")
|
||||
const [search, setSearch] = useState("")
|
||||
const [typeFilter, setTypeFilter] = useState<TypeFilter>("all")
|
||||
const [advancedFilters, setAdvancedFilters] = useState(() => createFilterQuery())
|
||||
const { search, setSearch, typeFilter, setTypeFilter, filters: advancedFilters, setFilters: setAdvancedFilters, error: urlError, hasFilters, reset: resetFilters } = useServerUrlState()
|
||||
const [open, setOpen] = useState(false)
|
||||
const [sheetMode, setSheetMode] = useState<SheetMode>("add")
|
||||
const [editingId, setEditingId] = useState<string | null>(null)
|
||||
@@ -561,6 +559,7 @@ function ServersPageContent() {
|
||||
const selectedServer = serverList.find(server => server.id === selectedServerId)
|
||||
|
||||
const filtered = useMemo(() => {
|
||||
if (urlError) return []
|
||||
const base = serverList.filter(sv => {
|
||||
if (selectedServerId !== null && sv.id !== selectedServerId) return false
|
||||
if (typeFilter !== "all" && sv.type !== typeFilter) return false
|
||||
@@ -569,7 +568,7 @@ function ServersPageContent() {
|
||||
return sv.name.toLowerCase().includes(q) || sv.host.includes(q) || sv.site.toLowerCase().includes(q)
|
||||
})
|
||||
return applyFilterQuery(base, advancedFilters, SERVER_FILTER_ACCESSORS)
|
||||
}, [serverList, search, typeFilter, advancedFilters, selectedServerId])
|
||||
}, [serverList, search, typeFilter, advancedFilters, selectedServerId, urlError])
|
||||
|
||||
const counts = useMemo(() => ({
|
||||
all: serverList.length,
|
||||
@@ -668,6 +667,8 @@ function ServersPageContent() {
|
||||
/>
|
||||
|
||||
{/* Table */}
|
||||
{urlError && <Alert variant="warning" role="alert"><AlertTitle>Фильтры требуют внимания</AlertTitle><AlertDescription>{urlError}</AlertDescription></Alert>}
|
||||
{hasFilters && <div><Button variant="outline" size="sm" onClick={resetFilters}>Сбросить фильтры списка</Button></div>}
|
||||
<DataPageCard>
|
||||
<DataPageToolbar
|
||||
segmented={{
|
||||
|
||||
Reference in new issue
Block a user