Skip to content

fix: query iverload#200

Merged
v-kessler merged 6 commits intomainfrom
vk/loqe
Feb 20, 2026
Merged

fix: query iverload#200
v-kessler merged 6 commits intomainfrom
vk/loqe

Conversation

@v-kessler
Copy link
Contributor

@v-kessler v-kessler commented Feb 20, 2026

  • added new tool LoQE

Summary by CodeRabbit

  • New Features

    • Added LoQE page and navigation item (Beta) and a Volumes roadmap page
    • Redesigned navigation bar with rail mode, reorganized sections, Roles and Server entries, and roadmap badges
  • Style

    • Updated home page card layout, icon/text sizing, and app container sizing
    • Removed Query tab from warehouse details and moved navigation placement in layout
  • Accessibility

    • Improved external link button security/accessibility attributes
  • Chores

    • Bumped console-components dependency

@coderabbitai
Copy link

coderabbitai bot commented Feb 20, 2026

Walkthrough

Adds LoQE and Volumes pages, restructures navigation into a rail-aware drawer with reordered menu items and new entries, updates Home card layout and accessibility attributes, removes Warehouse Query tab, bumps a console-components dependency, and changes app container width from 100vw to 100%.

Changes

Cohort / File(s) Summary
Dependency & Layout
package.json, src/App.vue
Bumped @lakekeeper/console-components to github:lakekeeper/console-components#v0.2.27. App container #app width changed from 100vw to 100%.
Navigation Restructure
src/components/NavigationBar.vue, src/layouts/default.vue
Replaced dialog-based nav with a rail-aware permanent/toggle drawer, added subheaders (Navigation, Tools, System), reordered and added menu items (LoQE, Roles, Server settings), introduced route-based active state for Roles, and moved NavigationBar placement in layout.
Home Page UI
src/components/Home.vue
Redesigned Quick Access Cards (grid, sizing, spacing), added LoQE card with Beta chip, adjusted icon/text sizes, added lazy-src placeholders and rel="noopener noreferrer" on external links.
New Pages
src/pages/loqe.vue, src/pages/volumes.vue
Added loqe.vue rendering LoQEExplorer with base-url-prefix and auto-init; added volumes.vue showing a roadmap/info card with GitHub Discussions link.
Warehouse Details
src/pages/warehouse/[id].vue
Removed the "Query" tab and its associated tab view; catalogUrl computed left commented out.
Route Types
src/typed-router.d.ts
Added typed route entries and page-file mappings for /loqe and /volumes to the route-type maps.
Misc. Accessibility & Links
src/components/*
Added rel="noopener noreferrer" to multiple external quick-link buttons for safety and accessibility.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰 I hopped through rails and routes today, a tiny patch of cheer,
New pages sprang, cards rearranged — a beta badge appears!
Width grew kinder, links grew safe, the nav now hums along,
A rabbit's nibble in the code — a small and merry song. 🎶

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Title check ⚠️ Warning The title 'fix: query iverload' does not match the PR objectives, which describe adding a new tool LoQE. The title appears to be a typo or unrelated to the primary changes. Consider updating the title to reflect the main changes, such as 'feat: add LoQE tool and reorganize navigation' or 'feat: add LoQE explorer with updated navigation and volumes page'.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch vk/loqe

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/pages/warehouse/[id].vue (1)

227-229: ⚠️ Potential issue | 🟡 Minor

Guard against stale ?tab=query in the URL.

A user with a bookmarked /warehouse/:id?tab=query will have tab.value set to 'query' on mount. Since that tab no longer exists, the v-tabs-window renders nothing and the panel is blank.

🐛 Proposed fix
 onMounted(() => {
-  if (route.query.tab) {
-    tab.value = route.query.tab as string;
-  }
+  const validTabs = ['namespaces', 'details', 'tasks', 'permissions'];
+  if (route.query.tab && validTabs.includes(route.query.tab as string)) {
+    tab.value = route.query.tab as string;
+  }
   loadWarehouse();
 });
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/pages/warehouse/`[id].vue around lines 227 - 229, The current mount logic
blindly assigns route.query.tab to tab.value causing a blank panel when the URL
contains an outdated value; change the assignment in the component where you
read route.query.tab to validate the incoming value against the component's
allowed tab keys (e.g., the tabs array or the same keys used by v-tabs-window)
and only set tab.value if it matches a known tab, otherwise leave tab.value at
its default (or fallback to a safe tab like 'details'); reference the existing
route.query.tab and tab.value variables and the tabs list/v-tabs-window keys
when adding this guard.
🧹 Nitpick comments (3)
src/pages/loqe.vue (1)

2-4: Consider replacing the hardcoded 64px offset with Vuetify's layout-aware approach.

calc(100vh - 64px) assumes exactly one 64 px AppBar and no other top layout components. When AuthenticationDisabledWarningBanner is rendered (auth-disabled deployments), the real available height inside v-main is shorter, causing the container to overflow. Vuetify's layout system already handles the offset via --v-layout-top; relying on it is more robust.

♻️ Proposed fix
-  <v-container fluid style="height: calc(100vh - 64px); padding: 0">
+  <v-container fluid class="fill-height" style="padding: 0; align-items: stretch;">
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/pages/loqe.vue` around lines 2 - 4, Replace the hardcoded offset in the
v-container inline style (currently using calc(100vh - 64px)) with Vuetify's
layout-aware CSS variable so the container height respects dynamic top
bars/banners; update the v-container (LoQEExplorer wrapper) to use calc(100vh -
var(--v-layout-top)) (or min-height variant) and keep padding: 0 so it no longer
overflows when AuthenticationDisabledWarningBanner or other top elements are
present.
src/pages/warehouse/[id].vue (1)

107-107: Remove dead code storageType and projectId left over from the Query tab removal.

storageType and projectId are set inside loadWarehouse() but never consumed anywhere in the remaining template or script. catalogUrl is already commented out.

♻️ Proposed cleanup
-const storageType = ref<string | undefined>(undefined);
-const projectId = ref<string | undefined>(undefined);

And remove the corresponding assignments inside loadWarehouse() at lines 191, 197, 206, 208, 210, and 222.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/pages/warehouse/`[id].vue at line 107, Remove the dead reactive
declarations storageType and projectId and all assignments to them inside
loadWarehouse; specifically delete the top-level ref declarations for
storageType and projectId and remove every assignment to these variables within
the loadWarehouse function (the leftover lines referenced in the review) since
neither is used anywhere else in the template or script.
src/components/NavigationBar.vue (1)

104-108: size="small" props on all v-icon elements are overridden and redundant.

The scoped :deep rule sets font-size: 18px !important, which unconditionally beats the size="small" prop (~20 px via Vuetify's internal CSS variable). Either drop size="small" from all six icons and keep the CSS, or remove the CSS and stick with the prop — mixing both is misleading.

♻️ Option A — keep CSS, drop redundant props
-        <v-icon size="small" icon="mdi-home-circle"></v-icon>
+        <v-icon icon="mdi-home-circle"></v-icon>

(repeat for the remaining five v-icon elements)

♻️ Option B — keep props, drop CSS override (accept Vuetify's small=20px)
-<style scoped>
-:deep(.v-list-item__prepend > .v-icon) {
-  font-size: 18px !important;
-}
-</style>
+<style scoped></style>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/NavigationBar.vue` around lines 104 - 108, The scoped :deep
CSS rule in NavigationBar.vue forces font-size:18px !important for
.v-list-item__prepend > .v-icon, making all size="small" props on the six v-icon
instances redundant; pick one approach and apply it consistently: either remove
size="small" from each v-icon (all occurrences) and keep the existing :deep CSS
override, or delete the :deep rule and leave size="small" on the v-icon elements
so Vuetify's built-in small (~20px) sizing applies—update only the v-icon
attributes or the scoped style accordingly and ensure no leftover redundant size
props or !important font-size rule remain.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/components/NavigationBar.vue`:
- Around line 30-32: The Roadmap and Beta v-chip elements in the <template
`#append`> slot are always rendered and get clipped when the v-navigation-drawer
is in rail mode; add the same v-show guard used for the subheaders to each chip
so they are hidden in rail mode (e.g., v-show="!isRail" or the exact
boolean/computed used by the subheader guard in this component) — apply this to
the v-chip with content "Roadmap" and to the "Beta" chip in the append slot so
they only render when not in rail mode.

In `@src/pages/volumes.vue`:
- Around line 23-30: The external link button (the v-btn element rendering "Join
the Discussion" with props href and target="_blank") should include
rel="noopener noreferrer" to prevent tabnabbing; update the v-btn instance that
has prepend-icon="mdi-github" and target="_blank" to add rel="noopener
noreferrer" so the opened GitHub tab cannot access window.opener.

---

Outside diff comments:
In `@src/pages/warehouse/`[id].vue:
- Around line 227-229: The current mount logic blindly assigns route.query.tab
to tab.value causing a blank panel when the URL contains an outdated value;
change the assignment in the component where you read route.query.tab to
validate the incoming value against the component's allowed tab keys (e.g., the
tabs array or the same keys used by v-tabs-window) and only set tab.value if it
matches a known tab, otherwise leave tab.value at its default (or fallback to a
safe tab like 'details'); reference the existing route.query.tab and tab.value
variables and the tabs list/v-tabs-window keys when adding this guard.

---

Nitpick comments:
In `@src/components/NavigationBar.vue`:
- Around line 104-108: The scoped :deep CSS rule in NavigationBar.vue forces
font-size:18px !important for .v-list-item__prepend > .v-icon, making all
size="small" props on the six v-icon instances redundant; pick one approach and
apply it consistently: either remove size="small" from each v-icon (all
occurrences) and keep the existing :deep CSS override, or delete the :deep rule
and leave size="small" on the v-icon elements so Vuetify's built-in small
(~20px) sizing applies—update only the v-icon attributes or the scoped style
accordingly and ensure no leftover redundant size props or !important font-size
rule remain.

In `@src/pages/loqe.vue`:
- Around line 2-4: Replace the hardcoded offset in the v-container inline style
(currently using calc(100vh - 64px)) with Vuetify's layout-aware CSS variable so
the container height respects dynamic top bars/banners; update the v-container
(LoQEExplorer wrapper) to use calc(100vh - var(--v-layout-top)) (or min-height
variant) and keep padding: 0 so it no longer overflows when
AuthenticationDisabledWarningBanner or other top elements are present.

In `@src/pages/warehouse/`[id].vue:
- Line 107: Remove the dead reactive declarations storageType and projectId and
all assignments to them inside loadWarehouse; specifically delete the top-level
ref declarations for storageType and projectId and remove every assignment to
these variables within the loadWarehouse function (the leftover lines referenced
in the review) since neither is used anywhere else in the template or script.

coderabbitai[bot]
coderabbitai bot previously approved these changes Feb 20, 2026
@v-kessler
Copy link
Contributor Author

@coderabbitai review

@coderabbitai
Copy link

coderabbitai bot commented Feb 20, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/pages/warehouse/[id].vue (1)

226-229: ⚠️ Potential issue | 🟡 Minor

Stale ?tab=query in URL causes a blank content area.

onMounted blindly assigns route.query.tab to tab with no allowlist check. After the Query tab is removed, any URL carrying ?tab=query sets tab to 'query' — no <v-tab> activates and no <v-tabs-window-item> renders. The watcher at line 246 then persists tab=query back into the URL, trapping the user in a blank state until they manually click a tab.

🐛 Proposed fix — guard against unknown tab values
 onMounted(() => {
   if (route.query.tab) {
-    tab.value = route.query.tab as string;
+    const validTabs = ['namespaces', 'details', 'tasks', 'permissions'];
+    const requested = route.query.tab as string;
+    if (validTabs.includes(requested)) {
+      tab.value = requested;
+    }
   }
   loadWarehouse();
 });
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/pages/warehouse/`[id].vue around lines 226 - 229, onMounted currently
assigns route.query.tab directly to tab.value which allows stale/unknown values
(e.g. "query") to leave no active <v-tab> and a blank <v-tabs-window-item>;
update the onMounted handler and the tab watcher to validate route.query.tab
against the allowlist of known tab keys (the same set used to render your
<v-tab> items) before assignment—if the value is not in that allowlist, fall
back to the default tab key (or leave tab.value unchanged) and only write back
validated values to the URL in the watcher; reference the onMounted callback,
route.query.tab, tab.value and the tab watcher when making this change.
🧹 Nitpick comments (2)
src/pages/warehouse/[id].vue (2)

170-173: Remove the commented-out catalogUrl block rather than leaving it in.

The four commented lines add noise and suggest the code is in an intermediate state. If catalogUrl is no longer needed after the Query tab removal, delete it; if it may return, track it via a GitHub issue instead.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/pages/warehouse/`[id].vue around lines 170 - 173, Remove the
commented-out catalogUrl computed block to reduce noise: delete the four
commented lines that define catalogUrl (the computed() wrapper and its use of
import.meta.env.VITE_APP_ICEBERG_CATALOG_URL and the baseUrl →
`${baseUrl}/catalog` return), and if you think this logic might be needed later,
open a GitHub issue referencing catalogUrl and the environment variable rather
than leaving commented code in src/pages/warehouse/[id].vue.

107-107: storageType and projectId are unused refs that should be removed.

Both are set in loadWarehouse() but never referenced elsewhere in the component. They were likely passed to the now-removed WarehouseSqlQuery component. Removing them eliminates unnecessary storage-profile inference logic.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/pages/warehouse/`[id].vue at line 107, Remove the unused reactive refs
storageType and projectId from the component: delete their declarations
(storageType and projectId) and any assignments inside loadWarehouse, and remove
any leftover comments or logic related to storage-profile inference or the
now-removed WarehouseSqlQuery; ensure loadWarehouse no longer sets storageType
or projectId and that no other code references these symbols.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In `@src/pages/warehouse/`[id].vue:
- Around line 226-229: onMounted currently assigns route.query.tab directly to
tab.value which allows stale/unknown values (e.g. "query") to leave no active
<v-tab> and a blank <v-tabs-window-item>; update the onMounted handler and the
tab watcher to validate route.query.tab against the allowlist of known tab keys
(the same set used to render your <v-tab> items) before assignment—if the value
is not in that allowlist, fall back to the default tab key (or leave tab.value
unchanged) and only write back validated values to the URL in the watcher;
reference the onMounted callback, route.query.tab, tab.value and the tab watcher
when making this change.

---

Nitpick comments:
In `@src/pages/warehouse/`[id].vue:
- Around line 170-173: Remove the commented-out catalogUrl computed block to
reduce noise: delete the four commented lines that define catalogUrl (the
computed() wrapper and its use of import.meta.env.VITE_APP_ICEBERG_CATALOG_URL
and the baseUrl → `${baseUrl}/catalog` return), and if you think this logic
might be needed later, open a GitHub issue referencing catalogUrl and the
environment variable rather than leaving commented code in
src/pages/warehouse/[id].vue.
- Line 107: Remove the unused reactive refs storageType and projectId from the
component: delete their declarations (storageType and projectId) and any
assignments inside loadWarehouse, and remove any leftover comments or logic
related to storage-profile inference or the now-removed WarehouseSqlQuery;
ensure loadWarehouse no longer sets storageType or projectId and that no other
code references these symbols.

@v-kessler v-kessler merged commit 051be2f into main Feb 20, 2026
7 checks passed
@v-kessler v-kessler deleted the vk/loqe branch February 20, 2026 20:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant