/** * TasksSourceInlineSelector * Extracted from AIChatPanel.tsx (lines 5294-5419) * Inline component for selecting a tasks/tickets source table. */ import React, { useState, useMemo } from 'react'; import { X, Loader2 } from 'lucide-react'; import { useAllTables } from '@/features/tables/hooks/useAllTables'; import type { TasksSourceConfig } from './AIChatPanel.types'; interface TasksSourceInlineSelectorProps { defaultSpaceId?: number; onSelect: (config: TasksSourceConfig) => void; onCancel: () => void; showHeader?: boolean; } export function TasksSourceInlineSelector({ defaultSpaceId, onSelect, onCancel, showHeader = true }: TasksSourceInlineSelectorProps) { const [selectedProjectId, setSelectedProjectId] = useState(null); const [selectedTableId, setSelectedTableId] = useState(null); const { data: allTablesData, isLoading } = useAllTables(); // Filter spaces const filteredSpaces = useMemo(() => { if (!allTablesData?.spacesWithTables) return []; if (!defaultSpaceId) return allTablesData.spacesWithTables; return allTablesData.spacesWithTables.filter(s => s.id === defaultSpaceId); }, [allTablesData, defaultSpaceId]); // Get tables for selected project const projectTables = useMemo(() => { if (!selectedProjectId || !allTablesData?.spacesWithTables) return []; for (const space of allTablesData.spacesWithTables) { const project = space.projects.find(p => p.id === selectedProjectId); if (project) return project.tables || []; } return []; }, [selectedProjectId, allTablesData]); // Get selected table info const selectedTable = useMemo(() => { if (!selectedTableId) return null; return allTablesData?.flat?.find(t => t.id === String(selectedTableId)); }, [selectedTableId, allTablesData]); const handleSave = () => { if (!selectedTable) return; onSelect({ tableId: Number(selectedTable.id), tableName: selectedTable.displayName || selectedTable.name, tableIcon: selectedTable.icon, displayColumn: selectedTable.displayField }); }; if (isLoading) { return (
); } return (
{/* Header with close button */} {showHeader && (
)} {/* Project selector with label if no header */} {!showHeader && } {/* Project selector */} {/* Table selector */}
{/* Save button only */}
); }