Skip to content

Commit 83eda4b

Browse files
github-actions[bot]Helw150claude
committed
fix(iris): normalize URL query params to handle array values safely
Vue Router query values can be string | string[] | null when a URL has repeated params (e.g. ?name=a&name=b). Add a queryStr() helper that always extracts a single string, falling back to '' for arrays/null. Tightens parse function signatures from unknown to string. Co-authored-by: William Held <Helw150@users.noreply.github.com> Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 4190ab7 commit 83eda4b

1 file changed

Lines changed: 15 additions & 9 deletions

File tree

  • lib/iris/dashboard/src/components/controller

lib/iris/dashboard/src/components/controller/JobsTab.vue

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,23 +42,29 @@ const EXPANDED_JOBS_KEY = 'iris.controller.expandedJobs'
4242
4343
// -- State (hydrated from URL query params) --
4444
45-
function parseSort(v: unknown): SortField {
45+
/** Safely extract a single string from a Vue Router query value (string | string[] | null). */
46+
function queryStr(v: string | string[] | null | undefined): string {
47+
if (Array.isArray(v)) return v[0] ?? ''
48+
return v ?? ''
49+
}
50+
51+
function parseSort(v: string): SortField {
4652
return SORT_FIELDS.includes(v as SortField) ? (v as SortField) : 'date'
4753
}
48-
function parseDir(v: unknown): SortDir {
54+
function parseDir(v: string): SortDir {
4955
return SORT_DIRS.includes(v as SortDir) ? (v as SortDir) : 'desc'
5056
}
51-
function parsePage(v: unknown): number {
57+
function parsePage(v: string): number {
5258
const n = Number(v)
5359
return Number.isFinite(n) && n >= 0 ? Math.floor(n) : 0
5460
}
5561
56-
const page = ref(parsePage(route.query.page))
57-
const sortField = ref<SortField>(parseSort(route.query.sort))
58-
const sortDir = ref<SortDir>(parseDir(route.query.dir))
59-
const nameFilter = ref((route.query.name as string) ?? '')
60-
const localFilter = ref((route.query.name as string) ?? '')
61-
const stateFilter = ref((route.query.state as string) ?? '')
62+
const page = ref(parsePage(queryStr(route.query.page)))
63+
const sortField = ref<SortField>(parseSort(queryStr(route.query.sort)))
64+
const sortDir = ref<SortDir>(parseDir(queryStr(route.query.dir)))
65+
const nameFilter = ref(queryStr(route.query.name))
66+
const localFilter = ref(queryStr(route.query.name))
67+
const stateFilter = ref(queryStr(route.query.state))
6268
const expandedJobs = ref<Set<string>>(loadExpandedJobs())
6369
const childJobsByParent = ref<Map<string, JobStatus[]>>(new Map())
6470
const loadingChildJobs = ref<Set<string>>(new Set())

0 commit comments

Comments
 (0)