CellDetailPanel.tsx 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import { useEffect, useState } from 'react'
  2. import remarkGfm from 'remark-gfm'
  3. import { Sheet, SheetContent, SheetHeader, SheetTitle } from 'ui'
  4. import { Markdown } from '@/components/interfaces/Markdown'
  5. import CodeEditor from '@/components/ui/CodeEditor/CodeEditor'
  6. import { TwoOptionToggle } from '@/components/ui/TwoOptionToggle'
  7. interface CellDetailPanelProps {
  8. column: string
  9. value: any
  10. visible: boolean
  11. onClose: () => void
  12. }
  13. export const CellDetailPanel = ({ column, value, visible, onClose }: CellDetailPanelProps) => {
  14. const [view, setView] = useState<'view' | 'md'>('view')
  15. const formattedValue =
  16. value === null
  17. ? ''
  18. : typeof value === 'object'
  19. ? JSON.stringify(value, null, '\t')
  20. : String(value)
  21. const showMarkdownToggle = typeof value === 'string'
  22. useEffect(() => {
  23. if (visible) setView('view')
  24. }, [visible])
  25. return (
  26. <Sheet open={visible} onOpenChange={() => onClose()}>
  27. <SheetContent size="lg" className="flex flex-col gap-0">
  28. <SheetHeader className="py-2.5">
  29. <SheetTitle className="flex items-center justify-between pr-7">
  30. <p className="truncate">
  31. Viewing cell details on column: <code className="text-sm">{column}</code>
  32. </p>
  33. {showMarkdownToggle && (
  34. <TwoOptionToggle
  35. options={['MD', 'view']}
  36. activeOption={view}
  37. borderOverride="border-muted"
  38. onClickOption={(value) => setView(value as 'view' | 'md')}
  39. />
  40. )}
  41. </SheetTitle>
  42. </SheetHeader>
  43. {view === 'view' ? (
  44. <div className="relative h-full">
  45. <CodeEditor
  46. isReadOnly
  47. id="sql-editor-expand-cell"
  48. language="json"
  49. value={formattedValue}
  50. placeholder={value === null ? 'NULL' : undefined}
  51. options={{ wordWrap: 'off', contextmenu: false }}
  52. />
  53. </div>
  54. ) : (
  55. <div className="grow py-4 px-4 bg-default overflow-y-auto">
  56. <Markdown
  57. remarkPlugins={[remarkGfm]}
  58. className="max-w-full! markdown-body"
  59. content={formattedValue}
  60. />
  61. </div>
  62. )}
  63. </SheetContent>
  64. </Sheet>
  65. )
  66. }