agent-ecosystem/src/renderer/components/team/sidebar/teamSidebarUiState.ts
iliya 304a2a7f79 feat(graph): enhance GraphControls with settings toggle and improved zoom functionality
- Added a settings toggle to the GraphControls for better user interaction.
- Implemented event listeners to close settings when clicking outside or pressing Escape.
- Improved zoom controls to mark user interaction, preventing auto-fit adjustments during user actions.
- Refactored GraphOverlay to streamline rendering and position updates for selected nodes.
- Updated GraphView to utilize new layout effects for better performance and responsiveness.
2026-03-29 00:05:29 +02:00

122 lines
3.6 KiB
TypeScript

import { DEFAULT_CLAUDE_LOGS_FILTER } from '../ClaudeLogsFilterPopover';
import type { ClaudeLogsFilterState } from '../ClaudeLogsFilterPopover';
import type { ClaudeLogsViewerState } from '../CliLogsRichView';
import type { MessagesFilterState } from '../messages/MessagesFilterPopover';
export interface TeamMessagesSidebarUiState {
messagesSearchQuery: string;
messagesFilter: MessagesFilterState;
messagesFilterOpen: boolean;
messagesCollapsed: boolean;
sidebarSearchVisible: boolean;
expandedItemKey: string | null;
sidebarScrollTop: number;
}
export interface TeamClaudeLogsSidebarUiState {
searchQuery: string;
filter: ClaudeLogsFilterState;
filterOpen: boolean;
viewerState: ClaudeLogsViewerState;
}
const messagesStateByTeam = new Map<string, TeamMessagesSidebarUiState>();
const claudeLogsStateByTeam = new Map<string, TeamClaudeLogsSidebarUiState>();
function cloneMessagesFilter(filter: MessagesFilterState): MessagesFilterState {
return {
from: new Set(filter.from),
to: new Set(filter.to),
showNoise: filter.showNoise,
};
}
function cloneClaudeLogsFilter(filter: ClaudeLogsFilterState): ClaudeLogsFilterState {
return {
streams: new Set(filter.streams),
kinds: new Set(filter.kinds),
};
}
function cloneViewerState(viewerState: ClaudeLogsViewerState): ClaudeLogsViewerState {
return {
collapsedGroupIds: new Set(viewerState.collapsedGroupIds),
expandedItemIds: new Set(viewerState.expandedItemIds),
expandedSubagentIds: new Set(viewerState.expandedSubagentIds),
viewport: { ...viewerState.viewport },
};
}
export function createDefaultMessagesSidebarUiState(): TeamMessagesSidebarUiState {
return {
messagesSearchQuery: '',
messagesFilter: {
from: new Set(),
to: new Set(),
showNoise: false,
},
messagesFilterOpen: false,
messagesCollapsed: true,
sidebarSearchVisible: false,
expandedItemKey: null,
sidebarScrollTop: 0,
};
}
export function createDefaultClaudeLogsSidebarUiState(): TeamClaudeLogsSidebarUiState {
return {
searchQuery: '',
filter: {
streams: new Set(DEFAULT_CLAUDE_LOGS_FILTER.streams),
kinds: new Set(DEFAULT_CLAUDE_LOGS_FILTER.kinds),
},
filterOpen: false,
viewerState: {
collapsedGroupIds: new Set(),
expandedItemIds: new Set(),
expandedSubagentIds: new Set(),
viewport: { mode: 'edge', edge: 'newest' },
},
};
}
export function getTeamMessagesSidebarUiState(teamName: string): TeamMessagesSidebarUiState {
const state = messagesStateByTeam.get(teamName) ?? createDefaultMessagesSidebarUiState();
return {
...state,
messagesFilter: cloneMessagesFilter(state.messagesFilter),
};
}
export function setTeamMessagesSidebarUiState(
teamName: string,
state: TeamMessagesSidebarUiState
): void {
messagesStateByTeam.set(teamName, {
...state,
messagesFilter: cloneMessagesFilter(state.messagesFilter),
});
}
export function getTeamClaudeLogsSidebarUiState(teamName: string): TeamClaudeLogsSidebarUiState {
const state = claudeLogsStateByTeam.get(teamName) ?? createDefaultClaudeLogsSidebarUiState();
return {
searchQuery: state.searchQuery,
filter: cloneClaudeLogsFilter(state.filter),
filterOpen: state.filterOpen,
viewerState: cloneViewerState(state.viewerState),
};
}
export function setTeamClaudeLogsSidebarUiState(
teamName: string,
state: TeamClaudeLogsSidebarUiState
): void {
claudeLogsStateByTeam.set(teamName, {
searchQuery: state.searchQuery,
filter: cloneClaudeLogsFilter(state.filter),
filterOpen: state.filterOpen,
viewerState: cloneViewerState(state.viewerState),
});
}