fix(ui): сохранить контекст и фокус контейнеров
This commit is contained in:
1 parent
3ceb8c038c
commit
71cc6fa3a7
12 files changed
+128
-27
No files matched your search
@@ -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")
|
||||
@@ -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():"")
|
||||
}
|
||||
Reference in new issue
Block a user