Fix location dropdowns silently truncating at the 100-row backend cap
The backend clamps perpage to MAX_PAGE_SIZE (100), so location selectors that requested a large page received only the first page and still got a 200. Late-alphabet locations (past ~C5W) simply went missing from every module's dropdown, and no error surfaced. Add locationsApi.listAll, which pages through the full set via fetchAllPages, matching the established machines/printers pattern, and switch every location selector consumer to it.
This commit is contained in:
@@ -273,6 +273,12 @@ export const locationsApi = {
|
|||||||
list(params = {}) {
|
list(params = {}) {
|
||||||
return api.get('/locations', { params })
|
return api.get('/locations', { params })
|
||||||
},
|
},
|
||||||
|
// Every location, paged past the backend's 100-row cap. Location selector
|
||||||
|
// dropdowns must use this: list() with a large perpage is clamped to 100 and
|
||||||
|
// still returns a success response, so the tail simply goes missing.
|
||||||
|
listAll(params = {}) {
|
||||||
|
return fetchAllPages('/locations', params)
|
||||||
|
},
|
||||||
get(id) {
|
get(id) {
|
||||||
return api.get(`/locations/${id}`)
|
return api.get(`/locations/${id}`)
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -266,8 +266,10 @@ async function loadFilterOptions(fields) {
|
|||||||
filterOptions.value.assettypes = response.data.data || []
|
filterOptions.value.assettypes = response.data.data || []
|
||||||
}
|
}
|
||||||
if (fields.includes('location') && !filterOptions.value.locations.length) {
|
if (fields.includes('location') && !filterOptions.value.locations.length) {
|
||||||
const response = await locationsApi.list({ perpage: 100 })
|
// listAll: 100 is the server-side cap, not a generous limit, and the
|
||||||
filterOptions.value.locations = response.data.data || []
|
// location list is past it - a report filtered by a late-alphabet
|
||||||
|
// location could not be built.
|
||||||
|
filterOptions.value.locations = await locationsApi.listAll()
|
||||||
}
|
}
|
||||||
if (fields.includes('application') && !filterOptions.value.applications.length) {
|
if (fields.includes('application') && !filterOptions.value.applications.length) {
|
||||||
// listAll: 100 is the server-side cap, not a generous limit, and the
|
// listAll: 100 is the server-side cap, not a generous limit, and the
|
||||||
|
|||||||
@@ -472,7 +472,7 @@ onMounted(async () => {
|
|||||||
assetsApi.statuses.list(),
|
assetsApi.statuses.list(),
|
||||||
vendorsApi.list({ perpage: 100 }),
|
vendorsApi.list({ perpage: 100 }),
|
||||||
modelsApi.listAll({ category: 'PC' }), // backend caps perpage at 100; page through all
|
modelsApi.listAll({ category: 'PC' }), // backend caps perpage at 100; page through all
|
||||||
locationsApi.list({ perpage: 100 }),
|
locationsApi.listAll(), // backend caps perpage at 100; page through all
|
||||||
operatingsystemsApi.list({ perpage: 100 }),
|
operatingsystemsApi.list({ perpage: 100 }),
|
||||||
computersApi.protocols.list(),
|
computersApi.protocols.list(),
|
||||||
// Handles its own failure: a site without printers still gets a form.
|
// Handles its own failure: a site without printers still gets a form.
|
||||||
@@ -482,7 +482,7 @@ onMounted(async () => {
|
|||||||
statuses.value = statusRes.data.data || []
|
statuses.value = statusRes.data.data || []
|
||||||
vendors.value = vendorRes.data.data || []
|
vendors.value = vendorRes.data.data || []
|
||||||
models.value = allModels
|
models.value = allModels
|
||||||
locations.value = locRes.data.data || []
|
locations.value = locRes || []
|
||||||
operatingsystems.value = osRes.data.data || []
|
operatingsystems.value = osRes.data.data || []
|
||||||
protocols.value = protoRes.data.data || []
|
protocols.value = protoRes.data.data || []
|
||||||
|
|
||||||
|
|||||||
@@ -512,7 +512,7 @@ onMounted(async () => {
|
|||||||
machinesApi.types.list(),
|
machinesApi.types.list(),
|
||||||
assetsApi.statuses.list(),
|
assetsApi.statuses.list(),
|
||||||
vendorsApi.list({ perpage: 500 }),
|
vendorsApi.list({ perpage: 500 }),
|
||||||
locationsApi.list({ perpage: 500 }),
|
locationsApi.listAll(), // backend caps perpage at 100; page through all
|
||||||
modelsApi.listAll({ category: 'Equipment' }), // backend caps perpage at 100; page through all
|
modelsApi.listAll({ category: 'Equipment' }), // backend caps perpage at 100; page through all
|
||||||
businessunitsApi.list({ perpage: 500 }),
|
businessunitsApi.list({ perpage: 500 }),
|
||||||
computersApi.listAll(), // backend caps perpage at 100; page through all
|
computersApi.listAll(), // backend caps perpage at 100; page through all
|
||||||
@@ -522,7 +522,7 @@ onMounted(async () => {
|
|||||||
machineTypes.value = typesRes.data.data || []
|
machineTypes.value = typesRes.data.data || []
|
||||||
statuses.value = statusRes.data.data || []
|
statuses.value = statusRes.data.data || []
|
||||||
vendors.value = vendorRes.data.data || []
|
vendors.value = vendorRes.data.data || []
|
||||||
locations.value = locRes.data.data || []
|
locations.value = locRes || []
|
||||||
models.value = allModels
|
models.value = allModels
|
||||||
businessunits.value = buRes.data.data || []
|
businessunits.value = buRes.data.data || []
|
||||||
// listAll resolves to the ARRAY, not a response: fetchAllPages already
|
// listAll resolves to the ARRAY, not a response: fetchAllPages already
|
||||||
|
|||||||
@@ -181,13 +181,13 @@ onMounted(async () => {
|
|||||||
const [typesResponse, statusResponse, locResponse, buResponse, assetTypesResponse] = await Promise.all([
|
const [typesResponse, statusResponse, locResponse, buResponse, assetTypesResponse] = await Promise.all([
|
||||||
measuringtoolsApi.types.list({ perpage: 200 }),
|
measuringtoolsApi.types.list({ perpage: 200 }),
|
||||||
assetsApi.statuses.list(),
|
assetsApi.statuses.list(),
|
||||||
locationsApi.list({ perpage: 500 }),
|
locationsApi.listAll(), // backend caps perpage at 100; page through all
|
||||||
businessunitsApi.list({ perpage: 500 }),
|
businessunitsApi.list({ perpage: 500 }),
|
||||||
assetsApi.types.list(),
|
assetsApi.types.list(),
|
||||||
])
|
])
|
||||||
types.value = typesResponse.data.data || []
|
types.value = typesResponse.data.data || []
|
||||||
statuses.value = statusResponse.data.data || []
|
statuses.value = statusResponse.data.data || []
|
||||||
locations.value = locResponse.data.data || []
|
locations.value = locResponse || []
|
||||||
businessunits.value = buResponse.data.data || []
|
businessunits.value = buResponse.data.data || []
|
||||||
|
|
||||||
const assetType = (assetTypesResponse.data.data || []).find(a => a.assettype === 'measuring_tool')
|
const assetType = (assetTypesResponse.data.data || []).find(a => a.assettype === 'measuring_tool')
|
||||||
|
|||||||
@@ -460,8 +460,8 @@ async function loadVendors() {
|
|||||||
|
|
||||||
async function loadLocations() {
|
async function loadLocations() {
|
||||||
try {
|
try {
|
||||||
const response = await locationsApi.list({ perpage: 100 })
|
const items = await locationsApi.listAll() // backend caps perpage at 100; page through all
|
||||||
locations.value = response.data.data || []
|
locations.value = items || []
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('Error loading locations:', err)
|
console.error('Error loading locations:', err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -197,8 +197,8 @@ async function loadVendors() {
|
|||||||
|
|
||||||
async function loadLocations() {
|
async function loadLocations() {
|
||||||
try {
|
try {
|
||||||
const response = await locationsApi.list({ perpage: 100 })
|
const items = await locationsApi.listAll() // backend caps perpage at 100; page through all
|
||||||
locations.value = response.data.data || []
|
locations.value = items || []
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error loading locations:', error)
|
console.error('Error loading locations:', error)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -352,8 +352,8 @@ async function loadVLANs() {
|
|||||||
|
|
||||||
async function loadLocations() {
|
async function loadLocations() {
|
||||||
try {
|
try {
|
||||||
const response = await locationsApi.list({ perpage: 100 })
|
const items = await locationsApi.listAll() // backend caps perpage at 100; page through all
|
||||||
locations.value = response.data.data || []
|
locations.value = items || []
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('Error loading locations:', err)
|
console.error('Error loading locations:', err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -505,14 +505,14 @@ onMounted(async () => {
|
|||||||
assetsApi.statuses.list(),
|
assetsApi.statuses.list(),
|
||||||
vendorsApi.list({ perpage: 100 }),
|
vendorsApi.list({ perpage: 100 }),
|
||||||
modelsApi.listAll({ category: 'Printer' }),
|
modelsApi.listAll({ category: 'Printer' }),
|
||||||
locationsApi.list({ perpage: 100 })
|
locationsApi.listAll() // backend caps perpage at 100; page through all
|
||||||
])
|
])
|
||||||
|
|
||||||
printerTypes.value = mtRes.data.data || []
|
printerTypes.value = mtRes.data.data || []
|
||||||
statuses.value = statusRes.data.data || []
|
statuses.value = statusRes.data.data || []
|
||||||
vendors.value = vendorRes.data.data || []
|
vendors.value = vendorRes.data.data || []
|
||||||
models.value = allModels
|
models.value = allModels
|
||||||
locations.value = locRes.data.data || []
|
locations.value = locRes || []
|
||||||
|
|
||||||
// Load printer if editing
|
// Load printer if editing
|
||||||
if (isEdit.value) {
|
if (isEdit.value) {
|
||||||
|
|||||||
Reference in New Issue
Block a user