17 lines
1.2 KiB
TypeScript
17 lines
1.2 KiB
TypeScript
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():"")
|
|
}
|