Skip to content

fix: UI/UX improvements — tooltips, nav label, connection save and refresh#13

Merged
wicky-zipstack merged 9 commits into
mainfrom
fix/ui-ux-improvements
Apr 2, 2026
Merged

fix: UI/UX improvements — tooltips, nav label, connection save and refresh#13
wicky-zipstack merged 9 commits into
mainfrom
fix/ui-ux-improvements

Conversation

@wicky-zipstack

@wicky-zipstack wicky-zipstack commented Mar 31, 2026

Copy link
Copy Markdown
Contributor

What

  • Rename "Dashboard" to "Projects" in top navigation bar
  • Add Ant Design <Tooltip> wrappers to all 7 Visitran AI sidebar header buttons
  • Fix connection not appearing in dropdown after creation from project/environment page
  • Fix inability to save connector name/description without re-testing connection
  • Add scrollbar to explorer sidebar with hover-only visibility
  • Replace toolbar overflow 3-dot ellipsis with "More (N)" button showing hidden item count

Why

  • "Dashboard" label was confusing — users couldn't quickly find their project list from other tabs
  • AI sidebar action buttons (icon-only) had no tooltips, making them hard to discover
  • After creating a new connection via the modal, the dropdown didn't refresh because getAllConnection() was not awaited before closing the modal
  • Updating only name/description of a connector triggered a full connection re-test, which could fail or timeout unnecessarily
  • Explorer sidebar (models/seeds list) had no visible scrollbar — users couldn't tell the list was scrollable when it overflowed
  • The 3-dot overflow menu gave no indication of how many items were hidden; "More (N)" pattern (similar to Jira/Linear) is more discoverable

How

  • NavigationTabs.jsx: Changed label text from "Dashboard" to "Projects"
  • Header.jsx: Imported Tooltip from antd, wrapped all header buttons with <Tooltip title="...">, removed redundant title attributes
  • CreateConnection.jsx: Changed getAllConnection() to await getAllConnection() before setIsModalOpen(false) in both create and update paths
  • connection.py (backend): Added _has_credentials_changed() helper that compares incoming credentials against stored values; test_connection_data() is now only called when credentials actually changed
  • ide-layout.css: Constrained explorer tree height chain so content overflows properly; scrollbar thumb is hidden by default and appears on hover over the explorer panel
  • no-code-toolbar.jsx: Replaced MoreOutlined icon with More (N) text + count badge + down arrow; moved button inline with toolbar items instead of far right; added smart overflow check — if hidden items fit without the "More" button, show all items directly
  • no-code-toolbar.css: Added .toolbar-more-badge styling (square badge, primary blue, white text); fixed vertical alignment and top clipping of filter badge

Can this PR break any existing features. If yes, please list possible items. If no, please explain why. (PS: Admins do not merge the PR without this section filled)

  • No. The nav rename is cosmetic. Tooltip additions are purely additive UI. The await fix only changes timing (wait before close vs close before wait). The backend credential check is conservative — it still tests when any credential field differs, only skipping when metadata-only changes are made. The scrollbar and toolbar changes are CSS/layout-only and do not affect component logic. All CSS used is cross-browser compatible.

Database Migrations

  • None

Env Config

  • None

Relevant Docs

  • N/A

Related Issues or PRs

  • Based on staging feedback observations

Dependencies Versions

  • None

Notes on Testing

  • Verified "Projects" label appears in top nav
  • Verified all 7 AI sidebar buttons show tooltips on hover
  • Verified new connection appears in dropdown immediately after creation (both project and environment flows)
  • Verified connector name/description can be saved without re-testing connection
  • Verified explorer sidebar shows scrollbar on hover and hides on mouse out
  • Verified "More (N)" button shows correct count, aligns with toolbar items, and auto-hides when all items fit
  • Verified toolbar recalculates correctly when AI drawer or explorer opens/closes
  • ESLint: 0 errors, Python: compiles clean

Screenshots

image

Checklist

…fresh

- Rename "Dashboard" to "Projects" in top navigation for clarity
- Add Ant Design Tooltip wrappers to all Visitran AI sidebar header buttons
- Await getAllConnection() before closing modal to ensure dropdown refreshes
- Skip connection test on metadata-only updates (name/description changes)
- Constrain explorer tree height so content overflows and scrolls
- Show scrollbar thumb only when hovering over the explorer panel
- Replace 3-dot MoreOutlined icon with "More (N)" text button showing hidden item count
- Add square badge for the count with primary color styling
- Place "More" button inline next to last visible item instead of far right
- Skip "More" button entirely when hidden items fit without it

@tahierhussain tahierhussain left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@wicky-zipstack Can you please add screenshots for all the UI changes that were made?

Comment thread frontend/src/ide/ide-layout.css
Comment thread frontend/src/ide/editor/no-code-toolbar/no-code-toolbar.css Outdated
Comment thread frontend/src/ide/editor/no-code-toolbar/no-code-toolbar.jsx Outdated
Comment thread frontend/src/base/components/environment/CreateConnection.jsx Outdated
Comment thread backend/backend/application/context/connection.py Outdated
@greptile-apps

greptile-apps Bot commented Mar 31, 2026

Copy link
Copy Markdown

Greptile Summary

This PR delivers a collection of UI/UX polish fixes across the frontend and a targeted backend improvement: renaming "Dashboard" → "Projects" in the nav, adding <Tooltip> wrappers to all AI sidebar buttons, fixing the connection-dropdown staleness after create/update, adding hover-only scrollbar visibility to the explorer sidebar, and replacing the 3-dot overflow button with a labelled "More (N)" button.

Key changes:

  • Connection save flow (frontend + backend): CreateConnection.jsx now sends metadata_only: true when only name/description changed. connection.py adds a server-side _has_credentials_changed() guard so even if metadata_only is set, the connection test still runs when decrypted credentials differ from stored values — closing the gap where the frontend flag alone could be manipulated.
  • Dropdown refresh (race condition fix): getAllConnections in both NewEnv.jsx and NewProject.jsx now accepts an updatedConnection object and performs an in-memory optimistic list update (insert or replace) instead of a full network refetch. This is synchronous and eliminates the prior race condition where setIsModalOpen(false) ran before the fetch resolved.
  • Toolbar overflow: "More (N)" button is moved inline with toolbar items inside the measured container; ELLIPSIS_BUTTON_WIDTH updated from 40 → 90 px to reserve the correct space for width calculations.
  • Explorer scrollbar: A chain of min-height: 0 / overflow: hidden CSS rules propagates through the Ant Design tab hierarchy so the tree container scrolls correctly; scrollbar thumb appears only on hover via ::-webkit-scrollbar-thumb.
  • History button removed: The HistoryOutlined button (which called resetSelectedChatId — a misleading label) has been removed entirely rather than relabelled, which is the correct resolution.

Confidence Score: 4/5

Safe to merge for all new changes; one outstanding P1 from the previous review cycle (connection_url bypass for URL-mode connections) remains unaddressed in this diff

Five of the six prior review concerns are fully resolved in this PR: the History button is removed, _has_credentials_changed() now exists and is wired in, the optimistic-update pattern replaces the getAllConnection race condition, the empty seq_badge_wrapper is gone, and the backend provides a secondary credential-change guard that mitigates the frontend hasDetailsChanged gap. No new P0/P1 issues were found in the introduced code. Score is held at 4 rather than 5 solely because the connection_url silent bypass for URL-mode connections (flagged in the prior cycle) has not yet been addressed.

backend/backend/application/context/connection.py — the _has_credentials_changed / _DERIVED_FIELDS interaction for URL-mode connections is still an open concern from the prior review round

Important Files Changed

Filename Overview
backend/backend/application/context/connection.py Adds _has_credentials_changed() helper and server-side credential guard before test_connection_data(); the connection_url exclusion in _DERIVED_FIELDS leaves a silent bypass for URL-mode connections (flagged in prior thread, still unresolved)
frontend/src/base/components/environment/CreateConnection.jsx Adds metadata_only flag when only name/description changed, passes updated connection object to getAllConnection() for optimistic list refresh; backend now provides secondary server-side guard mitigating the credential-change gap in hasDetailsChanged
frontend/src/base/components/environment/NewEnv.jsx Replaces network refetch in getAllConnections with an optimistic state update when a connection object with an id is supplied, falling back to a full fetch otherwise; correctly handles insert vs. update semantics
frontend/src/base/new-project/NewProject.jsx Mirrors the NewEnv.jsx optimistic-update pattern for getAllConnections; also adds `
frontend/src/ide/editor/no-code-toolbar/no-code-toolbar.jsx Replaces standalone MoreOutlined ellipsis button with an inline "More (N)" badge button inside the Space element; width measurement logic accounts for the new button's presence via ELLIPSIS_BUTTON_WIDTH constant
frontend/src/ide/editor/no-code-toolbar/no-code-toolbar.css Adds .toolbar-more-badge styling for the count chip and adjusts toolbar content layout to flexbox; scroll-behavior: smooth is now a no-op on an overflow: hidden element (harmless)
frontend/src/ide/ide-layout.css Chains min-height: 0 / overflow: hidden through the Ant Design tab hierarchy to enable proper scrolling in the explorer tree, and adds webkit hover-only scrollbar thumb styling
frontend/src/ide/chat-ai/Header.jsx Wraps all AI sidebar action buttons in <Tooltip>, removes the HistoryOutlined button that previously had a misleading onClick handler, and removes now-redundant inline title props
frontend/src/base/components/topbar/NavigationTabs.jsx Cosmetic rename of "Dashboard" label to "Projects" — no logic changes

Sequence Diagram

sequenceDiagram
    participant U as User
    participant FE as CreateConnection.jsx
    participant API as Backend API
    participant DB as Database

    Note over U,DB: Metadata-only update (name/description change)
    U->>FE: Change connection name, click Save
    FE->>FE: hasDetailsChanged=true, no credentials revealed
    FE->>API: PUT /connection/{id} { metadata_only: true, connection_details: { passw: "********" } }
    API->>DB: fetch stored_model
    DB-->>API: stored_details (decrypted)
    API->>API: _merge_with_stored → replaces sentinels with real values
    API->>API: _has_credentials_changed(merged, stored) → False
    Note over API: metadata_only=true AND credentials_changed=false → skip test
    API->>DB: update_connection(name, details)
    DB-->>API: updated model
    API-->>FE: { id, name, datasource_name, ... }
    FE->>FE: getAllConnection(updatedConnection) → optimistic setConnectionList
    FE->>U: Modal closes, dropdown updated immediately

    Note over U,DB: Credential update (password changed after reveal)
    U->>FE: Reveal credentials, change password, click Save
    FE->>FE: hasDetailsChanged=false → metadata_only NOT set
    FE->>API: PUT /connection/{id} { connection_details: { passw: "new_password" } }
    API->>API: _merge_with_stored → new password not masked, kept as-is
    API->>API: _has_credentials_changed → True
    API->>API: test_connection_data(datasource, merged_data)
    API->>DB: update_connection
    DB-->>API: updated model
    API-->>FE: { id, name, ... }
    FE->>FE: getAllConnection(updatedConnection) → optimistic update
    FE->>U: Modal closes, connection validated
Loading

Reviews (6): Last reviewed commit: "fix: improve getAllConnections — rename ..." | Re-trigger Greptile

Comment thread backend/backend/application/context/connection.py
Comment thread frontend/src/ide/chat-ai/Header.jsx Outdated
Comment thread frontend/src/ide/editor/no-code-toolbar/no-code-toolbar.jsx Outdated
- Use CSS variables for scrollbar colors (dark/light theme support)
- Remove !important from toolbar CSS, use specificity instead
- Remove fit-without-More optimization logic
- Use create/update API response data instead of re-fetching connection list
- Replace backend credential-change detection with explicit metadata_only flag
- Remove History button (mislabeled onClick handler)
- Remove empty seq_badge_wrapper div from More button
Comment thread frontend/src/base/components/environment/CreateConnection.jsx
Use padding-top on .toolbar-more-item instead of empty seq_badge_wrapper div.
Use margin-top: 11px on .toolbar-more-item to match seq_badge_wrapper
offset on other toolbar items, instead of empty spacer div.
Comment thread backend/backend/application/context/connection.py Outdated
Comment thread frontend/src/base/components/environment/CreateConnection.jsx
…e path

- Add _has_credentials_changed() as server-side safety net: skip connection
  test only when metadata_only=true AND credentials are unchanged
- Pass update API response data to getAllConnection() to avoid re-fetching
When connection data is passed from create/update response, update the
connection list state directly instead of making an extra API call.
Applied to both NewEnv.jsx and NewProject.jsx.
Comment thread frontend/src/base/components/environment/NewEnv.jsx
… fallback to empty array

- Rename connectionData → updatedConnection for clarity
- Add optional chaining (updatedConnection?.id, c?.id) for edge cases
- Ensure connectionList always falls back to [] if API returns undefined/null
- Applied to both NewEnv.jsx and NewProject.jsx

@tahierhussain tahierhussain left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@Deepak-Gnanasekar Deepak-Gnanasekar left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@abhizipstack abhizipstack left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@abhizipstack abhizipstack self-requested a review April 1, 2026 11:53
@wicky-zipstack wicky-zipstack merged commit d970e19 into main Apr 2, 2026
2 checks passed
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.

4 participants