Skip to content

NO-ISSUE: Update to PatternFly 6.6, add theme/contrast prefs, and improve catalog and VM list pages - #139

Merged
openshift-merge-bot[bot] merged 7 commits into
osac-project:mainfrom
jeff-phillips-18:pf-updates
Aug 17, 2026
Merged

NO-ISSUE: Update to PatternFly 6.6, add theme/contrast prefs, and improve catalog and VM list pages#139
openshift-merge-bot[bot] merged 7 commits into
osac-project:mainfrom
jeff-phillips-18:pf-updates

Conversation

@jeff-phillips-18

@jeff-phillips-18 jeff-phillips-18 commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Upgrade PatternFly from 6.4 to 6.6 and enable the Felt brand theme.
  • Add contrast preferences (system default, glass, traditional, high contrast) via User Preferences modal
  • Add a FOUC-prevention script in index.html that applies the saved theme before React boots
  • Replace the catalog item detail drawer with a routed sub-page at /catalog/:kind/:id, supporting VM, cluster, and bare metal catalog items with a create action
  • Add multi-type toggle filters and keyword search to the catalog page, persisted as URL query params
  • Add multi-status toggle filters (running/stopped with counts) and keyword search to the VM list page, persisted as URL query params
  • Update the masthead to use the new Red Hat OSAC SVG logo via react-svg
  • Migrate security groups and virtual networks list pages to use URL search params

Demo

Kapture.2026-08-12.at.14.00.11.mp4

Test plan

  • Verify theme switching (light / dark / system) applies immediately and persists across page reloads
  • Verify contrast mode switching (system / glass / traditional / high contrast) works and persists
  • Confirm no flash of wrong theme on initial page load
  • Navigate to catalog, toggle type filters (VMs, Clusters, Bare Metal) — URL params update, items filter correctly
  • Click a catalog item card to navigate to the detail sub-page; verify breadcrumb back to catalog, detail content, and create action button
  • Navigate to VM list, toggle Running/Stopped filters — counts update, URL params persist
  • Use keyword search on catalog and VM list pages — verify filtering and URL param persistence
  • Verify the OSAC logo renders correctly in the masthead

Summary by CodeRabbit

  • New Features

    • Browse virtual machine, cluster, and bare-metal catalog items together.
    • View detailed catalog pages with descriptions, defaults, metadata, and creation actions.
    • Filter catalogs by type and search, with preferences preserved in the URL.
    • Launch resources directly from catalog cards.
    • Choose dark, glass, system, or high-contrast appearance settings.
  • Improvements

    • Enhanced branding, accessibility labels, translations, and skip-to-content navigation.
    • Virtual machine and security-group filters now persist in the URL.
    • Improved toolbar layouts, loading states, and empty-state messaging.

@openshift-ci
openshift-ci Bot requested review from larsks and rccrdpccl August 12, 2026 18:11
@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository: osac-project/coderabbit/.coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 2eea78cb-a12e-4fab-a5cd-d4e2b429a877

📥 Commits

Reviewing files that changed from the base of the PR and between 78a1355 and 4a63e2a.

📒 Files selected for processing (10)
  • apps/app-frontend/src/shell/ShellMasthead.tsx
  • libs/ui-components/src/components/Project/ProjectListPage.test.tsx
  • libs/ui-components/src/components/UserPreferences/UserPreferencesModal.tsx
  • libs/ui-components/src/components/catalog/CatalogItemListSection.tsx
  • libs/ui-components/src/components/catalog/catalogItemDisplay.ts
  • libs/ui-components/src/components/catalog/details/CatalogItemDetailContent.tsx
  • libs/ui-components/src/components/catalog/details/CatalogItemDetails.tsx
  • libs/ui-components/src/pages/networking/VirtualNetworksListPage.tsx
  • libs/ui-components/src/pages/tenant/CatalogPage.tsx
  • libs/ui-components/src/pages/tenant/VmListPage.tsx
🚧 Files skipped from review as they are similar to previous changes (9)
  • libs/ui-components/src/components/catalog/details/CatalogItemDetails.tsx
  • libs/ui-components/src/pages/networking/VirtualNetworksListPage.tsx
  • libs/ui-components/src/components/catalog/details/CatalogItemDetailContent.tsx
  • apps/app-frontend/src/shell/ShellMasthead.tsx
  • libs/ui-components/src/pages/tenant/CatalogPage.tsx
  • libs/ui-components/src/components/catalog/catalogItemDisplay.ts
  • libs/ui-components/src/pages/tenant/VmListPage.tsx
  • libs/ui-components/src/components/UserPreferences/UserPreferencesModal.tsx
  • libs/ui-components/src/components/catalog/CatalogItemListSection.tsx

Included review availability: Your plan includes up to 1 review per rolling hour; 0 remain after this review.


Walkthrough

This PR adds routed catalog detail pages, typed multi-service catalog browsing, contrast-aware theme preferences, translated shell updates, and URL-backed filtering for networking and VM list pages.

Changes

Typed catalog browsing and detail pages

Layer / File(s) Summary
Typed catalog data and detail contracts
libs/ui-components/src/api/v1/baremetal-instance.ts, libs/ui-components/src/components/catalog/..., libs/ui-components/src/components/catalogProvision/...
Catalog utilities now attach item kinds, normalize field paths, localize type badges, and add bare-metal item lookup.
Combined catalog browse flow
libs/ui-components/src/pages/tenant/CatalogPage.tsx, libs/ui-components/src/components/catalog/...
The catalog now combines VM, cluster, and bare-metal items, stores filters in the URL, shows counts, and routes item selection to /catalog/{type}/{id}.
Routed catalog detail pages
apps/app-frontend/src/shell/AppShell.tsx, libs/ui-components/src/components/catalog/details/..., libs/ui-components/src/pages/tenant/CatalogPage.test.tsx
The drawer flow was replaced with routed detail pages that fetch typed items, render details, and provide type-specific create actions.

UI preferences and shell updates

Layer / File(s) Summary
Contrast-aware theme state
apps/app-frontend/index.html, apps/app-frontend/public/theme-boot.js, apps/app-frontend/package.json, libs/ui-components/src/hooks/use-theme.ts, libs/ui-components/src/hooks/use-session.tsx, libs/ui-components/src/components/UserPreferences/UserPreferencesModal.tsx
The app now applies Felt, dark, glass, and high-contrast classes before React loads. Theme and session state now expose contrast preferences.
Shell navigation and masthead updates
apps/app-frontend/src/shell/AppShell.tsx, apps/app-frontend/src/shell/ShellMasthead.tsx, apps/app-frontend/src/shell/ShellSidebar.tsx, libs/ui-components/src/components/ErrorBoundary/ErrorBoundary.tsx
The shell now supports skip-to-content navigation, translated labels, sidebar insets, SVG branding, and wrapped normal children.

URL-backed list filters

Layer / File(s) Summary
Networking list search state
libs/ui-components/src/pages/networking/SecurityGroupsListPage.tsx, libs/ui-components/src/pages/networking/VirtualNetworksListPage.tsx
The networking pages now use PatternFly toolbars. Security group search state is stored in the URL.
VM status and search filters
libs/ui-components/src/pages/tenant/VmListPage.tsx
The VM list now stores status and search filters in URL parameters and distinguishes empty inventory from unmatched filters.

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

Merge Risk: ⚪ Minimal · up to 4a63e

The PR introduces the described UI, theming, routing, filtering, and dependency updates; no actionable merge-blocking risk remains based on the supplied evidence.

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant CatalogPage
  participant Router
  participant CatalogItemDetailPage
  participant CatalogAPI
  User->>CatalogPage: Open catalog
  CatalogPage->>CatalogAPI: Load VM, cluster, and bare-metal catalogs
  CatalogAPI-->>CatalogPage: Return typed items
  User->>CatalogPage: Select a catalog item
  CatalogPage->>Router: Navigate to /catalog/{kind}/{id}
  Router->>CatalogItemDetailPage: Render detail route
  CatalogItemDetailPage->>CatalogAPI: Fetch item by kind and id
  CatalogAPI-->>CatalogItemDetailPage: Return item details
  User->>CatalogItemDetailPage: Start create action
  CatalogItemDetailPage->>Router: Navigate to resource create route
Loading
🚥 Pre-merge checks | ✅ 10 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Ai-Attribution ⚠️ Warning Commit c743714 says “Updates from Coderabbit review,” but all seven PR commits lack Assisted-by or Generated-by trailers; no Co-Authored-By trailer is present. Add a Red Hat-approved Assisted-by or Generated-by trailer naming the AI tool to the relevant commit, and do not use Co-Authored-By.
✅ Passed checks (10 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
No-Hardcoded-Secrets ✅ Passed The PR diff adds no API keys, tokens, passwords, private-key material, credential URLs, or suspicious assignments; long new pnpm integrity values are dependency hashes, not secrets.
No-Weak-Crypto ✅ Passed The full PR diff adds UI, routing, filtering, and theme-preference logic; exact added-line searches found no MD5, SHA1, DES, RC4, 3DES, Blowfish, ECB, crypto API, or secret comparison.
No-Injection-Vectors ✅ Passed The cumulative PR diff adds no SQL, eval/exec, shell, pickle, yaml.load, or dangerouslySetInnerHTML sinks; full-source searches found none.
Container-Privileges ✅ Passed The PR changes no Kubernetes or container manifest; deployment has no privilege fields, and the unchanged production image runs as USER 1001.
No-Sensitive-Data-In-Logs ✅ Passed The pull-request diff adds no console, logger, print, trace, or debugger calls; changed files contain no new diagnostic logging that could expose sensitive data.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the PatternFly upgrade, theme and contrast preferences, and catalog and VM list improvements.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 8

Caution

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

⚠️ Outside diff range comments (1)
libs/ui-components/src/components/catalog/CatalogItemListSection.tsx (1)

45-51: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

The spinner label reads "Loading undefined" without a title.

title is now optional, and CatalogPage renders CatalogItemListSection without it. The template literal then produces the aria-label Loading undefined. Screen readers announce that text. Use a fallback label.

🐛 Proposed fix
-              <Spinner aria-label={`Loading ${title}`} />
+              <Spinner aria-label={title ? `Loading ${title}` : 'Loading'} />
🤖 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 `@libs/ui-components/src/components/catalog/CatalogItemListSection.tsx` around
lines 45 - 51, Update the loading Spinner in CatalogItemListSection to use a
meaningful fallback when the optional title is absent, ensuring its aria-label
never renders “Loading undefined” while preserving the existing title-specific
label when provided.
🧹 Nitpick comments (5)
libs/ui-components/src/api/v1/baremetal-instance.ts (1)

45-57: 🗄️ Data Integrity & Integration | 🔵 Trivial | ⚡ Quick win

Avoid sharing the list query key when the ID is blank.

If trimmedId is empty, apiQueryKey('v1/baremetal_instance_catalog_items', undefined) produces ['v1/baremetal_instance_catalog_items']. That is the exact key used by useBareMetalInstanceCatalogItems. The detail query is disabled in that case, so no request is sent, but the disabled observer still reads the list cache entry and runs select: (data) => data.object on a list response. Keep the detail cache namespace separate.

♻️ Proposed key separation
-    queryKey: apiQueryKey(
-      'v1/baremetal_instance_catalog_items',
-      trimmedId ? [trimmedId] : undefined,
-    ),
+    queryKey: apiQueryKey('v1/baremetal_instance_catalog_items', [trimmedId || 'detail']),
🤖 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 `@libs/ui-components/src/api/v1/baremetal-instance.ts` around lines 45 - 57,
Update useBareMetalInstanceCatalogItem so its queryKey always uses a distinct
detail-query namespace, including when trimmedId is empty, rather than passing
undefined to apiQueryKey and colliding with useBareMetalInstanceCatalogItems.
Preserve the existing ID-specific key behavior and disabled state for blank IDs.
libs/ui-components/src/pages/tenant/CatalogPage.tsx (2)

179-181: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Drop the cast by making the search filter generic.

filterCatalogItemsBySearch is typed (items: CatalogItem[]) => CatalogItem[], so the result needs as CatalogItemWithType[]. A generic signature keeps the type field in the return type.

♻️ Proposed generic signature
-export const filterCatalogItemsBySearch = (items: CatalogItem[], search: string): CatalogItem[] => {
+export const filterCatalogItemsBySearch = <T extends CatalogItem>(
+  items: T[],
+  search: string,
+): T[] => {

Then the call site needs no cast:

-  const filteredItems = useMemo(() =>
-    filterCatalogItemsBySearch(filterCatalogItemsByTypes(data, typeFilters), search) as CatalogItemWithType[],
-    [search, data, typeFilters]);
+  const filteredItems = useMemo(
+    () => filterCatalogItemsBySearch(filterCatalogItemsByTypes(data, typeFilters), search),
+    [search, data, typeFilters],
+  );
🤖 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 `@libs/ui-components/src/pages/tenant/CatalogPage.tsx` around lines 179 - 181,
Update filterCatalogItemsBySearch to be generic over the item subtype so it
accepts and returns the same specific item type, preserving
CatalogItemWithType.type through filtering. Then remove the as
CatalogItemWithType[] cast from the filteredItems useMemo call while keeping its
existing filtering behavior.

148-162: 🎯 Functional Correctness | 🔵 Trivial | 💤 Low value

The search input drops whitespace-only input.

setSearch deletes the search parameter when the trimmed value is empty. The SearchInput value comes from the URL. If the user types only spaces, the characters disappear from the field. Store the raw value and trim only for filtering.

♻️ Proposed change
-        const trimmed = value.trim();
-        if (!trimmed) {
+        if (!value) {
           next.delete(SEARCH_PARAM);
         } else {
           next.set(SEARCH_PARAM, value);
         }

Also applies to: 220-227

🤖 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 `@libs/ui-components/src/pages/tenant/CatalogPage.tsx` around lines 148 - 162,
Update setSearch in CatalogPage so whitespace-only input is preserved in the URL
by checking the raw value for emptiness and storing the raw value unchanged;
leave trimming to the search filtering logic, including the corresponding
search-parameter update at the other referenced location.
libs/ui-components/src/components/catalog/details/CatalogItemDetailContent.test.tsx (1)

31-64: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Cover the spec. prefixed field paths, and rename the test.

All fixture paths are un-prefixed, so the test never exercises normalizeCatalogFieldPath. The CatalogPage.test.tsx fixture uses spec.image.source_ref, which means both shapes occur. Add a fixture field such as spec.cores and assert the resource chip renders. Also rename "shows drawer-era details" because the drawer no longer exists.

Also applies to: 79-81

🤖 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
`@libs/ui-components/src/components/catalog/details/CatalogItemDetailContent.test.tsx`
around lines 31 - 64, Update the fixture in the relevant
CatalogItemDetailContent test to include a spec.-prefixed field path such as
spec.cores, and assert that its resource chip renders so
normalizeCatalogFieldPath is exercised for both path shapes. Rename the test
currently describing “drawer-era details” to reflect the current detail UI
rather than the removed drawer.
libs/ui-components/src/components/catalogProvision/catalogFieldDefinition.ts (1)

155-170: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Normalization is correct, but the type predicate now narrows wrongly.

isCatalogItemResourceFieldPath('spec.cores') returns true, and TypeScript then narrows path to 'cores'. The raw value is still 'spec.cores'. formatCatalogResourcePart already works around this with a cast of the normalized path. Return boolean and expose a normalizing lookup instead, so callers cannot index by the un-normalized path.

♻️ Optional signature change
-export const isCatalogItemResourceFieldPath = (
-  path: string,
-): path is CatalogItemResourceFieldPath => {
-  return catalogItemResourceFieldPathSet.has(normalizeCatalogFieldPath(path));
-};
+export const catalogItemResourceFieldPath = (
+  path: string,
+): CatalogItemResourceFieldPath | undefined => {
+  const normalized = normalizeCatalogFieldPath(path);
+  return catalogItemResourceFieldPathSet.has(normalized)
+    ? (normalized as CatalogItemResourceFieldPath)
+    : undefined;
+};
+
+export const isCatalogItemResourceFieldPath = (path: string): boolean =>
+  catalogItemResourceFieldPath(path) !== undefined;
🤖 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 `@libs/ui-components/src/components/catalogProvision/catalogFieldDefinition.ts`
around lines 155 - 170, Change isCatalogItemResourceFieldPath to return a plain
boolean instead of a type predicate, since it normalizes the input without
changing the raw path value. Add a separate normalizing lookup helper that
returns the normalized CatalogItemResourceFieldPath for callers needing typed
indexing, and update formatCatalogResourcePart to use that helper rather than
casting the normalized path.
🤖 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 `@apps/app-frontend/index.html`:
- Around line 15-26: Normalize the persisted theme and contrast values in the
inline initialization script before evaluating system preferences or toggling
classes. Update the logic around the theme and contrast storage reads to match
use-theme.ts: treat unsupported values as “system,” then apply the existing
dark, high-contrast, and glass class behavior consistently.
- Around line 8-28: Update the theme/contrast boot script in index.html to
satisfy a strict script-src CSP by moving it into an external JavaScript asset
or adding its exact content hash/nonce to the production CSP. Ensure the chosen
approach works with the production Go server, and do not use unsafe-inline or
unsafe-eval.

In `@libs/ui-components/src/components/catalog/CatalogItemCard.tsx`:
- Around line 34-45: Replace the local catalogItemCreatePath if-chain in
libs/ui-components/src/components/catalog/CatalogItemCard.tsx:34-45 with an
import of the shared switch-based catalogItemCreatePath helper. In
libs/ui-components/src/components/catalog/details/CatalogItemDetails.tsx:15-33,
retain the label mapping in getCatalogCreateAction but obtain the route through
that shared helper; update both sites to use the centralized mapping for all
CatalogItemKind values.

In `@libs/ui-components/src/components/catalog/details/CatalogItemDetailPage.tsx`:
- Around line 15-18: Update useCatalogItemByKind so the cluster ID is trimmed
before being passed to useClusterCatalogItem, preventing whitespace-only values
from enabling the query while preserving the existing kind-based selection
behavior.

In `@libs/ui-components/src/pages/networking/VirtualNetworksListPage.tsx`:
- Around line 60-73: Update the search state and handlers in
VirtualNetworksListPage’s SearchInput to use useSearchParams instead of local
component state, matching the parameter-preserving setter pattern used by
SecurityGroupsListPage. Read the search value from the URL and preserve existing
query parameters while updating or clearing the virtual-network search
parameter.

In `@libs/ui-components/src/pages/tenant/CatalogPage.tsx`:
- Around line 232-249: Update the empty-state branching in CatalogPage so the
service-selection prompt is shown only when typeFilters is empty and data
contains items; when the catalog data is empty, render the “No catalog items
found” state with the “No published catalog items are available yet.” body. In
CatalogPage.test.tsx, update the no-items transport case to assert that heading
and body text.

In `@libs/ui-components/src/pages/tenant/VmListPage.tsx`:
- Around line 90-105: Update the status-filter synchronization logic around
STATUS_FILTER_PARAM and serializeStatusFilters so clearing all selections
preserves an explicit empty status query parameter instead of deleting it.
Ensure the initialization guard recognizes that empty parameter as intentionally
initialized, preventing a reload or remount from restoring default statuses.
- Around line 171-172: Update the showEmptyState condition in VmListPage so “No
virtual machines yet” is shown only when the total VM inventory is empty, using
the unfiltered inventory count rather than filteredVms.length. Apply the same
condition to the corresponding empty-state rendering branch around the secondary
occurrence, preserving the filter-empty message when VMs exist but none match
the selected status.

---

Outside diff comments:
In `@libs/ui-components/src/components/catalog/CatalogItemListSection.tsx`:
- Around line 45-51: Update the loading Spinner in CatalogItemListSection to use
a meaningful fallback when the optional title is absent, ensuring its aria-label
never renders “Loading undefined” while preserving the existing title-specific
label when provided.

---

Nitpick comments:
In `@libs/ui-components/src/api/v1/baremetal-instance.ts`:
- Around line 45-57: Update useBareMetalInstanceCatalogItem so its queryKey
always uses a distinct detail-query namespace, including when trimmedId is
empty, rather than passing undefined to apiQueryKey and colliding with
useBareMetalInstanceCatalogItems. Preserve the existing ID-specific key behavior
and disabled state for blank IDs.

In
`@libs/ui-components/src/components/catalog/details/CatalogItemDetailContent.test.tsx`:
- Around line 31-64: Update the fixture in the relevant CatalogItemDetailContent
test to include a spec.-prefixed field path such as spec.cores, and assert that
its resource chip renders so normalizeCatalogFieldPath is exercised for both
path shapes. Rename the test currently describing “drawer-era details” to
reflect the current detail UI rather than the removed drawer.

In
`@libs/ui-components/src/components/catalogProvision/catalogFieldDefinition.ts`:
- Around line 155-170: Change isCatalogItemResourceFieldPath to return a plain
boolean instead of a type predicate, since it normalizes the input without
changing the raw path value. Add a separate normalizing lookup helper that
returns the normalized CatalogItemResourceFieldPath for callers needing typed
indexing, and update formatCatalogResourcePart to use that helper rather than
casting the normalized path.

In `@libs/ui-components/src/pages/tenant/CatalogPage.tsx`:
- Around line 179-181: Update filterCatalogItemsBySearch to be generic over the
item subtype so it accepts and returns the same specific item type, preserving
CatalogItemWithType.type through filtering. Then remove the as
CatalogItemWithType[] cast from the filteredItems useMemo call while keeping its
existing filtering behavior.
- Around line 148-162: Update setSearch in CatalogPage so whitespace-only input
is preserved in the URL by checking the raw value for emptiness and storing the
raw value unchanged; leave trimming to the search filtering logic, including the
corresponding search-parameter update at the other referenced location.
🪄 Autofix

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: Repository: osac-project/coderabbit/.coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: d601fbd9-4b8f-4820-bb68-ee26eadb50a4

📥 Commits

Reviewing files that changed from the base of the PR and between 4bcc5df and 7e2e985.

⛔ Files ignored due to path filters (2)
  • libs/ui-components/src/assets/RH-OSAC.svg is excluded by !**/*.svg
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (29)
  • apps/app-frontend/index.html
  • apps/app-frontend/package.json
  • apps/app-frontend/src/shell/AppShell.tsx
  • apps/app-frontend/src/shell/ShellMasthead.tsx
  • apps/app-frontend/src/shell/ShellSidebar.tsx
  • libs/i18n/locales/en/translation.json
  • libs/ui-components/src/api/v1/baremetal-instance.ts
  • libs/ui-components/src/components/ErrorBoundary/ErrorBoundary.tsx
  • libs/ui-components/src/components/UserPreferences/UserPreferencesModal.tsx
  • libs/ui-components/src/components/catalog/CatalogItemCard.tsx
  • libs/ui-components/src/components/catalog/CatalogItemDetailContent.tsx
  • libs/ui-components/src/components/catalog/CatalogItemDetailDrawer.css
  • libs/ui-components/src/components/catalog/CatalogItemDetailDrawer.tsx
  • libs/ui-components/src/components/catalog/CatalogItemListSection.tsx
  • libs/ui-components/src/components/catalog/catalogItemDisplay.ts
  • libs/ui-components/src/components/catalog/details/CatalogFieldEditabilityLabel.tsx
  • libs/ui-components/src/components/catalog/details/CatalogItemDetailContent.test.tsx
  • libs/ui-components/src/components/catalog/details/CatalogItemDetailContent.tsx
  • libs/ui-components/src/components/catalog/details/CatalogItemDetailPage.tsx
  • libs/ui-components/src/components/catalog/details/CatalogItemDetails.tsx
  • libs/ui-components/src/components/catalogProvision/catalogFieldDefinition.ts
  • libs/ui-components/src/hooks/use-session.tsx
  • libs/ui-components/src/hooks/use-theme.ts
  • libs/ui-components/src/pages/networking/SecurityGroupsListPage.tsx
  • libs/ui-components/src/pages/networking/VirtualNetworksListPage.tsx
  • libs/ui-components/src/pages/tenant/CatalogPage.test.tsx
  • libs/ui-components/src/pages/tenant/CatalogPage.tsx
  • libs/ui-components/src/pages/tenant/VmListPage.css
  • libs/ui-components/src/pages/tenant/VmListPage.tsx
💤 Files with no reviewable changes (4)
  • libs/ui-components/src/pages/tenant/VmListPage.css
  • libs/ui-components/src/components/catalog/CatalogItemDetailDrawer.tsx
  • libs/ui-components/src/components/catalog/CatalogItemDetailContent.tsx
  • libs/ui-components/src/components/catalog/CatalogItemDetailDrawer.css

Comment thread apps/app-frontend/index.html Outdated
Comment thread apps/app-frontend/index.html Outdated
Comment thread libs/ui-components/src/components/catalog/CatalogItemCard.tsx Outdated
Comment thread libs/ui-components/src/pages/networking/VirtualNetworksListPage.tsx
Comment thread libs/ui-components/src/pages/tenant/CatalogPage.tsx
Comment thread libs/ui-components/src/pages/tenant/VmListPage.tsx
Comment thread libs/ui-components/src/pages/tenant/VmListPage.tsx Outdated
@openshift-ci

openshift-ci Bot commented Aug 17, 2026

Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: jeff-phillips-18, rawagner

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@rawagner rawagner changed the title Update to PatternFly 6.6, add theme/contrast prefs, and improve catalog and VM list pages PFRFE-37: Update to PatternFly 6.6, add theme/contrast prefs, and improve catalog and VM list pages Aug 17, 2026
@openshift-ci-robot

openshift-ci-robot commented Aug 17, 2026

Copy link
Copy Markdown

@jeff-phillips-18: This pull request references PFRFE-37 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the feature request to target the "5.1.0" version, but no target version was set.

Details

In response to this:

Summary

  • Upgrade PatternFly from 6.4 to 6.6 and enable the Felt brand theme.
  • Add contrast preferences (system default, glass, traditional, high contrast) via User Preferences modal
  • Add a FOUC-prevention script in index.html that applies the saved theme before React boots
  • Replace the catalog item detail drawer with a routed sub-page at /catalog/:kind/:id, supporting VM, cluster, and bare metal catalog items with a create action
  • Add multi-type toggle filters and keyword search to the catalog page, persisted as URL query params
  • Add multi-status toggle filters (running/stopped with counts) and keyword search to the VM list page, persisted as URL query params
  • Update the masthead to use the new Red Hat OSAC SVG logo via react-svg
  • Migrate security groups and virtual networks list pages to use URL search params

Demo

Kapture.2026-08-12.at.14.00.11.mp4

Test plan

  • Verify theme switching (light / dark / system) applies immediately and persists across page reloads
  • Verify contrast mode switching (system / glass / traditional / high contrast) works and persists
  • Confirm no flash of wrong theme on initial page load
  • Navigate to catalog, toggle type filters (VMs, Clusters, Bare Metal) — URL params update, items filter correctly
  • Click a catalog item card to navigate to the detail sub-page; verify breadcrumb back to catalog, detail content, and create action button
  • Navigate to VM list, toggle Running/Stopped filters — counts update, URL params persist
  • Use keyword search on catalog and VM list pages — verify filtering and URL param persistence
  • Verify the OSAC logo renders correctly in the masthead

Summary by CodeRabbit

  • New Features

  • Browse virtual machine, cluster, and bare-metal catalog items together.

  • View detailed catalog pages with descriptions, defaults, metadata, and creation actions.

  • Filter catalogs by type and search, with preferences preserved in the URL.

  • Launch resources directly from catalog cards.

  • Choose dark, glass, system, or high-contrast appearance settings.

  • Improvements

  • Enhanced branding, accessibility labels, translations, and skip-to-content navigation.

  • Virtual machine and security-group filters now persist in the URL.

  • Improved toolbar layouts, loading states, and empty-state messaging.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@jeff-phillips-18 jeff-phillips-18 changed the title PFRFE-37: Update to PatternFly 6.6, add theme/contrast prefs, and improve catalog and VM list pages NO-ISSUE: Update to PatternFly 6.6, add theme/contrast prefs, and improve catalog and VM list pages Aug 17, 2026
@openshift-ci-robot

Copy link
Copy Markdown

@jeff-phillips-18: This pull request explicitly references no jira issue.

Details

In response to this:

Summary

  • Upgrade PatternFly from 6.4 to 6.6 and enable the Felt brand theme.
  • Add contrast preferences (system default, glass, traditional, high contrast) via User Preferences modal
  • Add a FOUC-prevention script in index.html that applies the saved theme before React boots
  • Replace the catalog item detail drawer with a routed sub-page at /catalog/:kind/:id, supporting VM, cluster, and bare metal catalog items with a create action
  • Add multi-type toggle filters and keyword search to the catalog page, persisted as URL query params
  • Add multi-status toggle filters (running/stopped with counts) and keyword search to the VM list page, persisted as URL query params
  • Update the masthead to use the new Red Hat OSAC SVG logo via react-svg
  • Migrate security groups and virtual networks list pages to use URL search params

Demo

Kapture.2026-08-12.at.14.00.11.mp4

Test plan

  • Verify theme switching (light / dark / system) applies immediately and persists across page reloads
  • Verify contrast mode switching (system / glass / traditional / high contrast) works and persists
  • Confirm no flash of wrong theme on initial page load
  • Navigate to catalog, toggle type filters (VMs, Clusters, Bare Metal) — URL params update, items filter correctly
  • Click a catalog item card to navigate to the detail sub-page; verify breadcrumb back to catalog, detail content, and create action button
  • Navigate to VM list, toggle Running/Stopped filters — counts update, URL params persist
  • Use keyword search on catalog and VM list pages — verify filtering and URL param persistence
  • Verify the OSAC logo renders correctly in the masthead

Summary by CodeRabbit

  • New Features

  • Browse virtual machine, cluster, and bare-metal catalog items together.

  • View detailed catalog pages with descriptions, defaults, metadata, and creation actions.

  • Filter catalogs by type and search, with preferences preserved in the URL.

  • Launch resources directly from catalog cards.

  • Choose dark, glass, system, or high-contrast appearance settings.

  • Improvements

  • Enhanced branding, accessibility labels, translations, and skip-to-content navigation.

  • Virtual machine and security-group filters now persist in the URL.

  • Improved toolbar layouts, loading states, and empty-state messaging.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@rawagner rawagner changed the title NO-ISSUE: Update to PatternFly 6.6, add theme/contrast prefs, and improve catalog and VM list pages PFRFE-37: Update to PatternFly 6.6, add theme/contrast prefs, and improve catalog and VM list pages Aug 17, 2026
@openshift-ci-robot

openshift-ci-robot commented Aug 17, 2026

Copy link
Copy Markdown

@jeff-phillips-18: This pull request references PFRFE-37 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the feature request to target the "5.1.0" version, but no target version was set.

Details

In response to this:

Summary

  • Upgrade PatternFly from 6.4 to 6.6 and enable the Felt brand theme.
  • Add contrast preferences (system default, glass, traditional, high contrast) via User Preferences modal
  • Add a FOUC-prevention script in index.html that applies the saved theme before React boots
  • Replace the catalog item detail drawer with a routed sub-page at /catalog/:kind/:id, supporting VM, cluster, and bare metal catalog items with a create action
  • Add multi-type toggle filters and keyword search to the catalog page, persisted as URL query params
  • Add multi-status toggle filters (running/stopped with counts) and keyword search to the VM list page, persisted as URL query params
  • Update the masthead to use the new Red Hat OSAC SVG logo via react-svg
  • Migrate security groups and virtual networks list pages to use URL search params

Demo

Kapture.2026-08-12.at.14.00.11.mp4

Test plan

  • Verify theme switching (light / dark / system) applies immediately and persists across page reloads
  • Verify contrast mode switching (system / glass / traditional / high contrast) works and persists
  • Confirm no flash of wrong theme on initial page load
  • Navigate to catalog, toggle type filters (VMs, Clusters, Bare Metal) — URL params update, items filter correctly
  • Click a catalog item card to navigate to the detail sub-page; verify breadcrumb back to catalog, detail content, and create action button
  • Navigate to VM list, toggle Running/Stopped filters — counts update, URL params persist
  • Use keyword search on catalog and VM list pages — verify filtering and URL param persistence
  • Verify the OSAC logo renders correctly in the masthead

Summary by CodeRabbit

  • New Features

  • Browse virtual machine, cluster, and bare-metal catalog items together.

  • View detailed catalog pages with descriptions, defaults, metadata, and creation actions.

  • Filter catalogs by type and search, with preferences preserved in the URL.

  • Launch resources directly from catalog cards.

  • Choose dark, glass, system, or high-contrast appearance settings.

  • Improvements

  • Enhanced branding, accessibility labels, translations, and skip-to-content navigation.

  • Virtual machine and security-group filters now persist in the URL.

  • Improved toolbar layouts, loading states, and empty-state messaging.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@rawagner rawagner changed the title PFRFE-37: Update to PatternFly 6.6, add theme/contrast prefs, and improve catalog and VM list pages NO-ISSUE: Update to PatternFly 6.6, add theme/contrast prefs, and improve catalog and VM list pages Aug 17, 2026
@openshift-ci-robot

Copy link
Copy Markdown

@jeff-phillips-18: This pull request explicitly references no jira issue.

Details

In response to this:

Summary

  • Upgrade PatternFly from 6.4 to 6.6 and enable the Felt brand theme.
  • Add contrast preferences (system default, glass, traditional, high contrast) via User Preferences modal
  • Add a FOUC-prevention script in index.html that applies the saved theme before React boots
  • Replace the catalog item detail drawer with a routed sub-page at /catalog/:kind/:id, supporting VM, cluster, and bare metal catalog items with a create action
  • Add multi-type toggle filters and keyword search to the catalog page, persisted as URL query params
  • Add multi-status toggle filters (running/stopped with counts) and keyword search to the VM list page, persisted as URL query params
  • Update the masthead to use the new Red Hat OSAC SVG logo via react-svg
  • Migrate security groups and virtual networks list pages to use URL search params

Demo

Kapture.2026-08-12.at.14.00.11.mp4

Test plan

  • Verify theme switching (light / dark / system) applies immediately and persists across page reloads
  • Verify contrast mode switching (system / glass / traditional / high contrast) works and persists
  • Confirm no flash of wrong theme on initial page load
  • Navigate to catalog, toggle type filters (VMs, Clusters, Bare Metal) — URL params update, items filter correctly
  • Click a catalog item card to navigate to the detail sub-page; verify breadcrumb back to catalog, detail content, and create action button
  • Navigate to VM list, toggle Running/Stopped filters — counts update, URL params persist
  • Use keyword search on catalog and VM list pages — verify filtering and URL param persistence
  • Verify the OSAC logo renders correctly in the masthead

Summary by CodeRabbit

  • New Features

  • Browse virtual machine, cluster, and bare-metal catalog items together.

  • View detailed catalog pages with descriptions, defaults, metadata, and creation actions.

  • Filter catalogs by type and search, with preferences preserved in the URL.

  • Launch resources directly from catalog cards.

  • Choose dark, glass, system, or high-contrast appearance settings.

  • Improvements

  • Enhanced branding, accessibility labels, translations, and skip-to-content navigation.

  • Virtual machine and security-group filters now persist in the URL.

  • Improved toolbar layouts, loading states, and empty-state messaging.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@openshift-merge-bot
openshift-merge-bot Bot merged commit dcd684f into osac-project:main Aug 17, 2026
7 checks passed
@jeff-phillips-18
jeff-phillips-18 deleted the pf-updates branch August 18, 2026 11:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants