fix(ui): сохранить контекст и фокус контейнеров

This commit is contained in:
Denozordec committed 2026-10-01 11:13:29 +07:00
1 parent 3ceb8c038c
commit 71cc6fa3a7
12 files changed
+128 -27

No files matched your search

+7
View File
@@ -0,0 +1,7 @@
import assert from "node:assert/strict"
import {readContainersUrl,patchContainersUrl} from "./containers-url-state"
for(const q of ["server=bad","server=0","server=1.5","server=9007199254740992","server=1&server=2","status=bad","status=running&status=stopped","q=a&q=b","q="+"x".repeat(201)])assert.ok(readContainersUrl(new URLSearchParams(q)).error,q)
assert.deepEqual(readContainersUrl(new URLSearchParams("server=2&status=unknown&q=test")),{server:"2",status:"unknown",search:"test",error:null})
assert.deepEqual(readContainersUrl(new URLSearchParams()),{server:"all",status:"all",search:"",error:null})
assert.equal(patchContainersUrl(new URLSearchParams("server=1&status=running&ref=map"),{server:null,status:null}),"/containers?ref=map")
console.log("Containers URL: strict/duplicate context, empty defaults, unrelated parameters preserved")
+16
View File
@@ -0,0 +1,16 @@
export type ContainerStatusFilter = "all" | "running" | "stopped" | "error" | "unknown"
const statuses = ["running","stopped","error","unknown"]
export function readContainersUrl(params: URLSearchParams) {
const server = params.get("server"), status = params.get("status"), search = params.get("q") ?? ""
let error: string | null = null
if (["server","status","q"].some(key=>params.getAll(key).length>1)) error="Параметры контекста контейнеров повторяются."
if(server!==null && (!/^[1-9]\d*$/.test(server)||!Number.isSafeInteger(Number(server)))) error="В ссылке указан неверный сервер."
if(status!==null&&!statuses.includes(status))error="В ссылке указан неизвестный статус."
if(search.length>200)error="Поиск в ссылке слишком длинный."
return {server:server??"all",status:(status??"all") as ContainerStatusFilter,search,error}
}
export function patchContainersUrl(params:URLSearchParams,changes:Record<string,string|null>) {
const next=new URLSearchParams(params)
for(const [key,value] of Object.entries(changes))if(value===null||value==="")next.delete(key);else next.set(key,value)
return "/containers"+(next.size?"?"+next.toString():"")
}