| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- import { Check, ChevronDown, Copy, X as XIcon } from 'lucide-react'
- import {
- Button,
- DropdownMenu,
- DropdownMenuContent,
- DropdownMenuItem,
- DropdownMenuTrigger,
- } from 'ui'
- import type { LogData, QueryType } from './Logs.types'
- import { buildLogsPrompt } from './Logs.utils'
- import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider'
- import { AiAssistantDropdown } from '@/components/ui/AiAssistantDropdown'
- import { ShortcutBadge } from '@/components/ui/ShortcutBadge'
- import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state'
- import { SHORTCUT_IDS } from '@/state/shortcuts/registry'
- import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state'
- export type LogCopyFormat = 'json' | 'markdown' | 'csv'
- interface MultiSelectActionBarProps {
- selectedRows: Set<string>
- selectedRowsData: LogData[]
- copiedFormat: LogCopyFormat | null
- onCopy: (format: LogCopyFormat) => void
- onClear: () => void
- queryType?: QueryType
- sqlQuery?: string
- }
- export function MultiSelectActionBar({
- selectedRows,
- selectedRowsData,
- copiedFormat,
- onCopy,
- onClear,
- queryType,
- sqlQuery,
- }: MultiSelectActionBarProps) {
- const { openSidebar } = useSidebarManagerSnapshot()
- const aiSnap = useAiAssistantStateSnapshot()
- function handleOpenAiAssistant() {
- const prompt = buildLogsPrompt(selectedRowsData, queryType, sqlQuery)
- openSidebar(SIDEBAR_KEYS.AI_ASSISTANT)
- aiSnap.newChat({ initialMessage: prompt })
- }
- const count = selectedRows.size
- if (count === 0) return null
- return (
- <div
- className="flex items-center gap-2 px-3 py-1.5 border-b bg-surface-200 text-sm sticky top-0 z-10"
- style={{ height: 40 }}
- >
- <span className="text-foreground-light font-mono text-xs">
- {count} row{count !== 1 ? 's' : ''} selected
- </span>
- <div className="flex items-center gap-1 ml-auto">
- <DropdownMenu>
- <DropdownMenuTrigger asChild>
- <Button
- type="default"
- size="tiny"
- icon={copiedFormat ? <Check size={12} className="text-brand" /> : <Copy size={12} />}
- iconRight={<ChevronDown size={11} />}
- >
- {copiedFormat ? 'Copied!' : 'Copy'}
- </Button>
- </DropdownMenuTrigger>
- <DropdownMenuContent align="end" className="w-60">
- <DropdownMenuItem onClick={() => onCopy('json')} className="gap-x-2">
- <Copy size={13} />
- <p>Copy as JSON</p>
- <ShortcutBadge shortcutId={SHORTCUT_IDS.RESULTS_COPY_JSON} className="ml-auto" />
- </DropdownMenuItem>
- <DropdownMenuItem onClick={() => onCopy('markdown')} className="gap-x-2">
- <Copy size={13} />
- <p>Copy as Markdown</p>
- <ShortcutBadge shortcutId={SHORTCUT_IDS.RESULTS_COPY_MARKDOWN} className="ml-auto" />
- </DropdownMenuItem>
- <DropdownMenuItem onClick={() => onCopy('csv')} className="gap-x-2">
- <Copy size={13} />
- <p>Copy as CSV</p>
- <ShortcutBadge shortcutId={SHORTCUT_IDS.RESULTS_COPY_CSV} className="ml-auto" />
- </DropdownMenuItem>
- </DropdownMenuContent>
- </DropdownMenu>
- <AiAssistantDropdown
- label="Explain with AI"
- buildPrompt={() => buildLogsPrompt(selectedRowsData, queryType, sqlQuery)}
- onOpenAssistant={handleOpenAiAssistant}
- telemetrySource="log_explorer"
- />
- <Button
- type="text"
- size="tiny"
- icon={<XIcon size={12} />}
- onClick={onClear}
- title="Clear selection"
- className="text-foreground-lighter px-1.5 hover:text-foreground"
- />
- </div>
- </div>
- )
- }
|