- 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.
122 lines
3.6 KiB
TypeScript
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),
|
|
});
|
|
}
|