@kaifronsdal/transcript-viewer
Version:
A web-based viewer for AI conversation transcripts with rollback support
67 lines (59 loc) • 2.13 kB
text/typescript
import type { FilterState, TableRow } from '$lib/shared/types';
/**
* Extract all transcripts from tree structure using unified TableRow type
*/
export function extractAllTranscriptsFromTree(nodes: TableRow[]): any[] {
const transcripts: any[] = [];
for (const node of nodes) {
if (node.type === 'transcript') {
transcripts.push(node.originalTranscript); // Use originalTranscript from unified type
} else if (node.type === 'folder' && node.subRows) {
transcripts.push(...extractAllTranscriptsFromTree(node.subRows));
}
}
return transcripts;
}
/**
* Filter folder tree recursively based on filter state using unified TableRow type
*/
export function filterFolderTree(
nodes: TableRow[],
filters: FilterState,
filterFunction: (transcript: any) => boolean
): TableRow[] {
if (!nodes) {
console.warn('⚠️ [DEBUG] filterFolderTree received undefined nodes');
return [];
}
return nodes
.map(node => {
if (node.type === 'transcript') {
// Apply filters to transcript
const transcript = node.originalTranscript;
if (!transcript) {
console.warn('⚠️ [DEBUG] Transcript node missing originalTranscript:', node);
return null;
}
// Apply search query filter
if (filters.searchQuery && !transcript.summary.toLowerCase().includes(filters.searchQuery.toLowerCase())) {
return null;
}
// Apply expression filter
if (!filterFunction(transcript)) return null;
return node;
} else if (node.type === 'folder') {
// Recursively filter subRows (unified type)
const filteredChildren = filterFolderTree(node.subRows || [], filters, filterFunction);
// Only include folder if it has matching children
if (filteredChildren.length > 0) {
return {
...node,
subRows: filteredChildren // Use subRows instead of children
};
}
return null;
}
return null;
})
.filter((node): node is TableRow => node !== null);
}