Skip to content

feat(admin-ui): implement mobile header, dashboard, and health screens (#2920)#2921

Merged
moabu merged 7 commits into
mainfrom
admin-ui-issue-2920
Jul 13, 2026
Merged

feat(admin-ui): implement mobile header, dashboard, and health screens (#2920)#2921
moabu merged 7 commits into
mainfrom
admin-ui-issue-2920

Conversation

@faisalsiddique4400

@faisalsiddique4400 faisalsiddique4400 commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

feat(admin-ui): implement mobile header, dashboard, and health screens (#2920)

Summary

This PR introduces the mobile implementation of the Admin UI header along with responsive layouts for the Dashboard and Health pages.

The update improves the mobile user experience by adapting these core screens to smaller displays while maintaining consistency with the existing Admin UI design system and responsive navigation.


Fix Summary

  • Implemented a responsive mobile header for the Admin UI
  • Added mobile layouts for the Dashboard page
  • Added mobile layouts for the Health page
  • Optimized page structure and spacing for smaller screen sizes
  • Improved responsive rendering of dashboard and health information
  • Integrated the new mobile screens with the existing navigation flow
  • Preserved existing desktop and tablet layouts
  • Maintained consistency with the Admin UI design language

Verification

npm run check:all

passes successfully.

  • Verified the mobile header renders correctly on supported screen sizes
  • Verified the Dashboard page displays correctly in mobile view
  • Verified the Health page displays correctly in mobile view
  • Verified navigation between mobile screens functions as expected
  • Verified desktop and tablet layouts remain unchanged
  • Verified no regressions in existing responsive behavior

🔗 Ticket

Closes: #2920

Summary by CodeRabbit

  • New Features
    • Added a custom refresh icon option to toolbar/health refresh controls.
    • Improved mobile experience with a new compact profile dropdown (theme, language, sign-out) and updated navbar/mobile profile rendering.
    • Added/extended SVG icon exports and introduced a new refresh icon.
    • Added new localized UI labels for additional menu/title text.
  • Bug Fixes
    • Improved small-screen layout for date picker popups, preventing overflow and tightening calendar spacing.
    • Enhanced dashboard, navbar, health, status cards, and mobile bottom navigation transitions to better fit narrow viewports.

#2920)

Signed-off-by: faisalsiddique4400 <faisalsiddique10886@gmail.com>
@coderabbitai

coderabbitai Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

@faisalsiddique4400, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 19 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: e62ca7a1-41e7-41ed-8df6-e93908b80cc9

📥 Commits

Reviewing files that changed from the base of the PR and between 3e6692b and d45e736.

📒 Files selected for processing (7)
  • admin-ui/app/components/MobileBottomNav/MobileNavSheet.tsx
  • admin-ui/app/constants/ui.ts
  • admin-ui/app/hooks/useLangPersistence.ts
  • admin-ui/app/routes/Apps/Gluu/styles/GluuNavBar.style.ts
  • admin-ui/app/routes/Dashboards/DashboardPage.style.ts
  • admin-ui/app/routes/components/Dropdowns/MobileProfileDropdown.tsx
  • admin-ui/plugins/admin/components/Health/HealthPage.style.ts
📝 Walkthrough

Walkthrough

The admin UI adds mobile-responsive navigation, dashboard, date-picker, health-page, profile, and bottom-sheet behavior. It also introduces persisted theme/language preferences, reusable SVG icons, localized labels, and responsive service-card styling.

Changes

Mobile admin UI

Layer / File(s) Summary
Responsive navbar and profile preferences
admin-ui/app/routes/Apps/Gluu/*, admin-ui/app/routes/components/Dropdowns/*, admin-ui/app/routes/components/LogoThemed/*, admin-ui/app/hooks/*, admin-ui/app/locales/*
The navbar switches between desktop and mobile controls, with localized greetings, a mobile profile dropdown, themed logo variants, responsive truncation, and persisted theme/language selection.
Responsive dashboard and health screens
admin-ui/app/routes/Dashboards/*, admin-ui/app/components/GluuDatePicker/*, admin-ui/plugins/admin/components/Health/*, admin-ui/app/components/GluuSearchToolbar/*
Dashboard and health screens gain mobile headings, responsive cards, chart legends, date-picker sizing, single-column service layouts, icon-only refresh behavior, and revised service-status styling.
Animated mobile bottom sheet
admin-ui/app/components/MobileBottomNav/*
Bottom-sheet rendering now coordinates enter and exit transitions, animated scrims and sheets, and expandable sublists.
Shared icons and type cleanup
admin-ui/app/components/SVG/*, admin-ui/app/components/index.tsx, admin-ui/app/utils/*, admin-ui/plugins/*, admin-ui/vite.config.ts
Reusable arrow and refresh icons are exported, while several type and expression layouts are reformatted without runtime changes.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant GluuNavBar
  participant MobileProfileDropdown
  participant PreferenceHooks
  participant BrowserStorage
  User->>GluuNavBar: open mobile profile
  GluuNavBar->>MobileProfileDropdown: render profile menu
  MobileProfileDropdown->>PreferenceHooks: select theme or language
  PreferenceHooks->>BrowserStorage: persist preference
  PreferenceHooks-->>MobileProfileDropdown: apply selected preference
Loading

Possibly related PRs

Suggested reviewers: moabu, duttarnab

Poem

I’m a rabbit with a smaller screen,
Hopping through layouts neat and clean.
Icons twirl and menus glide,
Cards make room from side to side.
Languages bloom, themes softly gleam—
Mobile UI becomes a dream.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning The PR also includes unrelated formatting-only edits in auth-server, saml, scim, user-management, and vite config. Split unrelated refactors and formatting changes into separate PRs or remove them from this mobile UI change.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly describes the main mobile header, dashboard, and health UI work.
Linked Issues check ✅ Passed The changes add a mobile app header plus mobile Dashboard and Health page layouts as requested in #2920.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch admin-ui-issue-2920

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.

@mo-auto mo-auto added comp-admin-ui Component affected by issue or PR kind-feature Issue or PR is a new feature request labels Jul 10, 2026

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@admin-ui/app/routes/Apps/Gluu/GluuNavBar.tsx`:
- Line 82: Update the home link in GluuNavBar’s mobile logo Link to use a static
translated aria-label that describes its destination or purpose, such as “Home,”
instead of the current pageTitle value; use the project’s existing i18n
translation mechanism.
- Line 31: Update the useMediaQuery call in GluuNavBar to pass the noSsr option
as true, ensuring the mobile breakpoint is evaluated immediately without the
initial desktop-layout render.

In `@admin-ui/app/routes/components/Dropdowns/MobileProfileDropdown.tsx`:
- Around line 77-107: Extract the duplicated user-config theme persistence logic
from MobileProfileDropdown’s onChangeTheme and ThemeDropdownComponent’s
onChangeTheme into a shared useThemePersistence(userInfo) hook. Have the hook
validate, read/merge/write STORAGE_KEYS.USER_CONFIG keyed by inum, handle parse
failures, and expose the theme-change callback; update both components to use it
while retaining their existing dispatch behavior and dependencies.
- Around line 109-123: Add error handling to the promise chain in
changeLanguage, handling rejections from ensureLocaleLoaded or
i18n.changeLanguage with an internal catch that logs diagnostic details and
reconciles the optimistic lang state and persisted INIT_LANG/USER_CONFIG values
as appropriate. Keep the operation fire-and-forget without allowing unhandled
rejections, and update dependencies only if required by the chosen error
handler.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 09ff9758-2d29-4d17-8e59-6d0644242e7f

📥 Commits

Reviewing files that changed from the base of the PR and between badc905 and ee1a154.

📒 Files selected for processing (22)
  • admin-ui/app/components/GluuDatePicker/GluuDatePicker.style.ts
  • admin-ui/app/components/GluuSearchToolbar/GluuRefreshButton.tsx
  • admin-ui/app/components/GluuSearchToolbar/types.ts
  • admin-ui/app/components/SVG/Refresh.tsx
  • admin-ui/app/components/SVG/index.tsx
  • admin-ui/app/locales/en/translation.json
  • admin-ui/app/locales/es/translation.json
  • admin-ui/app/locales/fr/translation.json
  • admin-ui/app/locales/pt/translation.json
  • admin-ui/app/routes/Apps/Gluu/GluuNavBar.tsx
  • admin-ui/app/routes/Apps/Gluu/hooks/useNavbarTheme.ts
  • admin-ui/app/routes/Apps/Gluu/styles/GluuNavBar.style.ts
  • admin-ui/app/routes/Dashboards/DashboardPage.style.ts
  • admin-ui/app/routes/Dashboards/DashboardPage.tsx
  • admin-ui/app/routes/components/Dropdowns/MobileProfileDropdown.tsx
  • admin-ui/app/routes/components/Dropdowns/styles/MobileProfileDropdown.style.ts
  • admin-ui/app/routes/components/LogoThemed/LogoThemed.tsx
  • admin-ui/app/styles/miltonbo/scss/_layout.scss
  • admin-ui/plugins/admin/components/Health/HealthPage.style.ts
  • admin-ui/plugins/admin/components/Health/HealthPage.tsx
  • admin-ui/plugins/admin/components/Health/components/ServiceStatusCard.style.ts
  • admin-ui/plugins/admin/components/Health/components/ServiceStatusCard.tsx

Comment thread admin-ui/app/routes/Apps/Gluu/GluuNavBar.tsx
Comment thread admin-ui/app/routes/Apps/Gluu/GluuNavBar.tsx Outdated
Comment thread admin-ui/app/routes/components/Dropdowns/MobileProfileDropdown.tsx Outdated
Comment thread admin-ui/app/routes/components/Dropdowns/MobileProfileDropdown.tsx Outdated
Signed-off-by: faisalsiddique4400 <faisalsiddique10886@gmail.com>

@duttarnab duttarnab 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.

  1. The botton navigation should be always visible
Image
  1. The horizontal scroll should not be allowed in mobile view
Image

Signed-off-by: faisalsiddique4400 <faisalsiddique10886@gmail.com>
Signed-off-by: faisalsiddique4400 <faisalsiddique10886@gmail.com>

@coderabbitai coderabbitai Bot 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.

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)
admin-ui/app/routes/components/Dropdowns/MobileProfileDropdown.tsx (1)

72-86: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

No Escape-key handler to close the menu.

Unlike MobileNavSheet (which closes on Escape), this dropdown only closes via outside click or item selection. Popup menus (role="menu") are expected to close on Escape for keyboard users.

♿ Proposed fix
   useEffect(() => {
     if (!isOpen) return

     const handleClickOutside = (event: MouseEvent) => {
       const target = event.target as Node
       if (containerRef.current && !containerRef.current.contains(target)) {
         setIsOpen(false)
       }
     }

     document.addEventListener('mousedown', handleClickOutside)
     return () => {
       document.removeEventListener('mousedown', handleClickOutside)
     }
   }, [isOpen])
+
+  useEffect(() => {
+    if (!isOpen) return undefined
+    const handleKeyDown = (event: KeyboardEvent) => {
+      if (event.key === 'Escape') setIsOpen(false)
+    }
+    document.addEventListener('keydown', handleKeyDown)
+    return () => document.removeEventListener('keydown', handleKeyDown)
+  }, [isOpen])
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@admin-ui/app/routes/components/Dropdowns/MobileProfileDropdown.tsx` around
lines 72 - 86, Add an Escape-key listener within the MobileProfileDropdown
useEffect when isOpen, invoking setIsOpen(false) for Escape presses. Register
and clean up this listener alongside the existing mousedown handler, preserving
current outside-click behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@admin-ui/app/components/MobileBottomNav/MobileNavSheet.tsx`:
- Around line 268-293: Update the child buttons rendered by the sublist in
MobileNavSheet so collapsed items are removed from keyboard navigation while
expanded items retain normal focusability. Use the existing expanded state to
set each button’s tabIndex consistently with the aria-hidden state on the
subListWrap.

In `@admin-ui/app/hooks/useLangPersistence.ts`:
- Around line 16-25: Prevent out-of-order locale loads from applying stale
languages: add a latest-request tracker in useLangPersistence, update it
synchronously in changeLanguage before invoking applyLanguage, and pass or
otherwise use it in applyLanguage to verify the resolved code is still current
before calling i18nInstance.changeLanguage. Keep persistence writes unchanged
and continue logging load errors.

---

Outside diff comments:
In `@admin-ui/app/routes/components/Dropdowns/MobileProfileDropdown.tsx`:
- Around line 72-86: Add an Escape-key listener within the MobileProfileDropdown
useEffect when isOpen, invoking setIsOpen(false) for Escape presses. Register
and clean up this listener alongside the existing mousedown handler, preserving
current outside-click behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: e3d17fb4-c5c6-438c-92ac-a4183e54c555

📥 Commits

Reviewing files that changed from the base of the PR and between ee1a154 and 3e6692b.

📒 Files selected for processing (38)
  • admin-ui/app/components/GluuDatePicker/GluuDatePicker.style.ts
  • admin-ui/app/components/GluuDropdown/GluuDropdown.tsx
  • admin-ui/app/components/GluuSearchToolbar/types.ts
  • admin-ui/app/components/MobileBottomNav/MobileNavSheet.style.ts
  • admin-ui/app/components/MobileBottomNav/MobileNavSheet.tsx
  • admin-ui/app/components/MobileBottomNav/sheetConstants.ts
  • admin-ui/app/components/SVG/ArrowRight.tsx
  • admin-ui/app/components/SVG/Refresh.tsx
  • admin-ui/app/components/SVG/index.tsx
  • admin-ui/app/components/index.tsx
  • admin-ui/app/hooks/useLangPersistence.ts
  • admin-ui/app/hooks/useThemePersistence.ts
  • admin-ui/app/locales/en/translation.json
  • admin-ui/app/routes/Apps/Gluu/GluuNavBar.tsx
  • admin-ui/app/routes/Apps/Gluu/LanguageMenu.tsx
  • admin-ui/app/routes/Apps/Gluu/ThemeDropdown.tsx
  • admin-ui/app/routes/Apps/Gluu/styles/GluuNavBar.style.ts
  • admin-ui/app/routes/Apps/Gluu/types/common.ts
  • admin-ui/app/routes/components/Dropdowns/MobileProfileDropdown.tsx
  • admin-ui/app/routes/components/Dropdowns/styles/MobileProfileDropdown.style.ts
  • admin-ui/app/routes/components/Dropdowns/types.ts
  • admin-ui/app/routes/components/LogoThemed/LogoThemed.tsx
  • admin-ui/app/utils/types/TokenControllerTypes.ts
  • admin-ui/app/utils/userConfig.ts
  • admin-ui/plugins/admin/components/Health/HealthPage.style.ts
  • admin-ui/plugins/admin/components/Health/components/ServiceStatusCard.style.ts
  • admin-ui/plugins/admin/helper/assets.ts
  • admin-ui/plugins/admin/helper/webhook.ts
  • admin-ui/plugins/auth-server/components/AuthServerProperties/types/index.ts
  • admin-ui/plugins/auth-server/components/ConfigApiProperties/utils/valueUtils.ts
  • admin-ui/plugins/auth-server/components/Sessions/types/sessionTypes.ts
  • admin-ui/plugins/saml/components/WebsiteSsoServiceProviderForm.tsx
  • admin-ui/plugins/saml/helper/utils.ts
  • admin-ui/plugins/saml/types/formValues.ts
  • admin-ui/plugins/scim/components/ScimPage.tsx
  • admin-ui/plugins/user-claims/components/types/UserClaimsListPage.types.ts
  • admin-ui/plugins/user-management/components/UserDetailViewPage.tsx
  • admin-ui/vite.config.ts
💤 Files with no reviewable changes (6)
  • admin-ui/app/components/SVG/Refresh.tsx
  • admin-ui/app/components/GluuSearchToolbar/types.ts
  • admin-ui/app/components/GluuDatePicker/GluuDatePicker.style.ts
  • admin-ui/app/routes/Apps/Gluu/styles/GluuNavBar.style.ts
  • admin-ui/app/routes/components/LogoThemed/LogoThemed.tsx
  • admin-ui/plugins/admin/components/Health/HealthPage.style.ts

Comment thread admin-ui/app/components/MobileBottomNav/MobileNavSheet.tsx
Comment thread admin-ui/app/hooks/useLangPersistence.ts Outdated
duttarnab
duttarnab previously approved these changes Jul 13, 2026
Signed-off-by: faisalsiddique4400 <faisalsiddique10886@gmail.com>
Signed-off-by: faisalsiddique4400 <faisalsiddique10886@gmail.com>
Signed-off-by: faisalsiddique4400 <faisalsiddique10886@gmail.com>
@sonarqubecloud

Copy link
Copy Markdown

@moabu
moabu merged commit 874908d into main Jul 13, 2026
8 checks passed
@moabu
moabu deleted the admin-ui-issue-2920 branch July 13, 2026 08:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

comp-admin-ui Component affected by issue or PR kind-feature Issue or PR is a new feature request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(admin-ui): Implement the header of the app and screens of the dashboard and the health page in the mobile view

4 participants