Skip to content

This PR improves UI reliability and usability by fixing a Safari-specific z-index issue, enhancing object filtering capabilities, and resolving SSE synchronization problems that prevented the UI from updating correctly.#62

Merged
cgalibern merged 3 commits intoopensvc:mainfrom
PaulJouvanceau:dev
Feb 10, 2026

Conversation

@PaulJouvanceau
Copy link
Contributor

Changes

Fix: Replaced Popper with Menu to resolve a Safari z-index issue causing dropdowns to appear behind other UI elements.

Feature (Objects): Reworked object filters from single-select to multi-select, allowing more flexible and powerful filtering.

Fix: Resolved Server-Sent Events (SSE) synchronization issues that could cause the UI to not update when backend events were received.

Impact

Better cross-browser behavior (especially Safari).

Improved user experience when filtering objects.

More reliable real-time UI updates driven by SSE events.

Testing

Manually tested filter behavior with multiple selections.

Verified dropdown rendering and layering in Safari.

Confirmed UI updates correctly on SSE events (no stale state observed).

- Replaced Popper components with Menu for action menus
- Removed Safari-specific workarounds (isSafari, disablePortal)
- Moved row menu logic to parent component
- Better cross-browser compatibility and accessibility

Fixes: Action menus appearing behind sticky header on Safari
- Replace Autocomplete components with multi-select Select components for Global State, Namespace, and Kind filters
- Update state management to handle arrays of selected values instead of single strings
- Modify URL query parameter handling to support comma-separated values for multi-select filters
- Add Chip display for selected filter values with delete functionality
- Update filtering logic to support multiple selected values per filter category
- Add React.useId for unique form label associations
- Remove "all" option from globalStates array as empty array now represents "all"
- Update useEffect dependencies to track array changes instead of string values

Key changes:
- Single selection (selectedGlobalState, selectedNamespace, selectedKind) → Array selection (selectedGlobalStates, selectedNamespaces, selectedKinds)
- URL params: single value → comma-separated values (e.g., "globalState=up,down")
- Filter UI: Dropdown with single selection → Multi-select with checkboxes and chips
- Filter logic: OR logic within each filter category (object matches any selected value)
…e in real-time

This commit fixes multiple critical bugs in the event buffering and flushing system
that prevented real-time updates to the UI, particularly for freeze actions and node
display issues.

Issues Fixed

1. Event loss during flush - Events arriving during an active flush were silently
   ignored. Added needsFlush flag to queue events that arrive during flush and
   schedule an immediate re-flush after completion.

2. Stale store state - Store reference was captured once at the start of flush,
   causing subsequent updates to use outdated state. Now getState() is called for
   each update to always use the current state.

3. Object reference mutations - Used Object.assign() which mutated existing objects
   instead of creating new references, breaking Zustand's reactivity. Changed to use
   spread operator for proper shallow copies.

4. Partial event data loss - Multiple events for the same object would overwrite
   the buffer instead of merging. Now buffer updates merge with existing data instead
   of replacing it.

5. Missing shallow copy in store updates - setInstanceStatuses would mutate
   existing objects. Added explicit shallow copy before modifications.

6. Excessive flush delays - Reduced FLUSH_DELAY from 50ms to 10ms and
   MIN_FLUSH_INTERVAL from 50ms to 10ms for more responsive updates.

7. Duplicate return statement - Removed duplicate return in setNodeStatuses.

Technical Changes

- eventSourceManager.jsx:
  - Added needsFlush flag to detect events arriving during flush
  - Modified scheduleFlush() to queue events during flush instead of dropping them
  - Added re-flush logic in flushBuffers() finally block
  - Changed updateBuffer() to merge data instead of replacing it
  - Fixed hasObjectStatus/hasInstanceStatus merging to use spread operator
  - Call getState() for each store update instead of once at the start
  - Reduced buffer flush delays from 50ms/100ms to 10ms

- useEventStore.js:
  - Fixed setInstanceStatuses to always create shallow copy before modification
  - Improved logging for debugging state changes

The fix ensures that all event properties are preserved, frozen indicators display
correctly, nodes are all shown, and the UI updates immediately when actions are
performed without requiring a page refresh.
@cgalibern cgalibern merged commit 0920693 into opensvc:main Feb 10, 2026
1 check 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.

2 participants