fix: add null/HTTP checks to tag viewer API calls

- browseISO: resp.ok + data null check before accessing data.error
- selectPartition: resp.ok + data null check
- viewVolumeTags: resp.ok + data null check
- Fixed v.Name → v.name (JSON keys are lowercase from volInfo tags)

Prevents 'Cannot read properties of null (reading error)'
This commit is contained in:
2026-06-22 04:20:01 -07:00
parent 568691542a
commit a489d523e3
+19 -7
View File
@@ -428,9 +428,13 @@ async function browseISO() {
try { try {
const resp = await fetch(`${API}/disk/partitions?iso=${encodeURIComponent(iso)}`) const resp = await fetch(`${API}/disk/partitions?iso=${encodeURIComponent(iso)}`)
if (!resp.ok) {
status.textContent = 'HTTP ' + resp.status
return
}
const data = await resp.json() const data = await resp.json()
if (data.error) { if (!data || data.error) {
status.textContent = data.error status.textContent = (data && data.error) || 'server error'
return return
} }
status.textContent = data.length + ' partition' + (data.length === 1 ? '' : 's') status.textContent = data.length + ' partition' + (data.length === 1 ? '' : 's')
@@ -454,9 +458,13 @@ async function selectPartition(iso, part) {
try { try {
const resp = await fetch(`${API}/disk/volumes?iso=${encodeURIComponent(iso)}&part=${encodeURIComponent(part)}`) const resp = await fetch(`${API}/disk/volumes?iso=${encodeURIComponent(iso)}&part=${encodeURIComponent(part)}`)
if (!resp.ok) {
volsEl.innerHTML = '<span class="no-files">HTTP ' + resp.status + '</span>'
return
}
const data = await resp.json() const data = await resp.json()
if (data.error) { if (!data || data.error) {
volsEl.innerHTML = '<span class="no-files">' + data.error + '</span>' volsEl.innerHTML = '<span class="no-files">' + (data && data.error ? data.error : 'server error') + '</span>'
return return
} }
if (!Array.isArray(data) || data.length === 0) { if (!Array.isArray(data) || data.length === 0) {
@@ -464,7 +472,7 @@ async function selectPartition(iso, part) {
return return
} }
volsEl.innerHTML = data.map(v => ` volsEl.innerHTML = data.map(v => `
<div class="vol-item" data-action="tag-vol" data-iso="${esc(iso)}" data-part="${esc(part)}" data-vol="${esc(v.Name)}">${esc(v.Name)}</div> <div class="vol-item" data-action="tag-vol" data-iso="${esc(iso)}" data-part="${esc(part)}" data-vol="${esc(v.name)}">${esc(v.name)}</div>
`).join('') `).join('')
} catch (e) { } catch (e) {
volsEl.innerHTML = 'Failed: ' + e.message volsEl.innerHTML = 'Failed: ' + e.message
@@ -480,9 +488,13 @@ async function viewVolumeTags(iso, part, vol) {
try { try {
const resp = await fetch(`${API}/volume/tags?iso=${encodeURIComponent(iso)}&part=${encodeURIComponent(part)}&vol=${encodeURIComponent(vol)}`) const resp = await fetch(`${API}/volume/tags?iso=${encodeURIComponent(iso)}&part=${encodeURIComponent(part)}&vol=${encodeURIComponent(vol)}`)
if (!resp.ok) {
detailEl.innerHTML = '<span class="no-files">HTTP ' + resp.status + '</span>'
return
}
const data = await resp.json() const data = await resp.json()
if (data.error) { if (!data || data.error) {
detailEl.innerHTML = '<span class="no-files">' + data.error + '</span>' detailEl.innerHTML = '<span class="no-files">' + (data && data.error ? data.error : 'server error') + '</span>'
return return
} }
if (!Array.isArray(data) || data.length === 0) { if (!Array.isArray(data) || data.length === 0) {