From 1ab864f4e3de67def2a31aeb84aaaafb3d6da1ad Mon Sep 17 00:00:00 2001 From: jtricerolph Date: Sat, 4 Jul 2026 12:53:20 +0000 Subject: [PATCH] Room planner: pull category sort order from settings global_config Category ordering on the default view now uses the admin-configured sort_order from global_config.newbook.rooms rather than the raw NewBook site_category_order. Falls back to NewBook order if the settings row is absent. Also overrides category_order on each room. Co-Authored-By: Claude Sonnet 4.6 --- backend/src/routes/rooms.js | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/backend/src/routes/rooms.js b/backend/src/routes/rooms.js index e8efcfc..9fddc94 100644 --- a/backend/src/routes/rooms.js +++ b/backend/src/routes/rooms.js @@ -135,22 +135,27 @@ export async function roomRoutes(app) { const canSeeRate = hasCap(req, 'rate_details') const canSeeAllNotes = hasCap(req, 'view_all_notes') - // Load config for note type visibility - const cfgRow = await pool.query(`SELECT value FROM config WHERE key = 'visible_note_types'`) + // Load config in parallel: note visibility, exclusions, settings category order + const [cfgRow, excRow, settingsRow] = await Promise.all([ + pool.query(`SELECT value FROM config WHERE key = 'visible_note_types'`), + pool.query(`SELECT key, value FROM config WHERE key IN ('excluded_categories','hide_excluded_categories')`), + pool.query(`SELECT value FROM global_config WHERE key = 'newbook.rooms'`), + ]) const visibleNoteTypes = cfgRow.rows[0]?.value || [] - - // Load exclusion config - const excRow = await pool.query( - `SELECT key, value FROM config WHERE key IN ('excluded_categories','hide_excluded_categories')` - ) const cfgMap = Object.fromEntries(excRow.rows.map(r => [r.key, r.value])) const excludedCategories = cfgMap.excluded_categories || [] const hideExcluded = cfgMap.hide_excluded_categories ?? false + // Build category sort-order map from settings (admin-configured) — keyed by category id + const settingsCatOrder = {} + for (const cat of settingsRow.rows[0]?.value?.categories ?? []) { + settingsCatOrder[String(cat.id)] = cat.sort_order ?? 999 + } + // Fetch from NewBook in parallel let sites, bookings, tasks try { - // list_type 'staying' includes bookings with arrival <= period_to, + // list_type 'staying' includes bookings with arrival <= period_to, // so fetching yesterday→tomorrow captures all adjacent-day brackets. ;[sites, bookings, tasks] = await Promise.all([ fetchSites(), @@ -167,10 +172,11 @@ export async function roomRoutes(app) { site.site_category_id ?? site.category_id ?? site.category?.id ?? '' ) if (catId && !categoryMap[catId]) { + const nbOrder = site.site_category_order ?? site.category_order ?? site.category?.order ?? 999 categoryMap[catId] = { id: catId, name: site.site_category_name ?? site.category_name ?? site.category?.name ?? catId, - order: site.site_category_order ?? site.category_order ?? site.category?.order ?? 999, + order: settingsCatOrder[catId] ?? nbOrder, } } } @@ -184,6 +190,10 @@ export async function roomRoutes(app) { const classified = classifyRoom(site, bookings, viewDate, yesterday, tomorrow) + // Override category_order with settings value if available + const catOrderOverride = settingsCatOrder[catId] + if (catOrderOverride !== undefined) classified.category_order = catOrderOverride + // Filter booking data per capabilities if (classified.booking) { classified.booking = filterBookingData(