table-dropdown.tsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import { DropdownHeader } from '@/features/ui/components/bootstrap-5/dropdown-menu'
  2. import { ToolbarButtonMenu } from './button-menu'
  3. import MaterialIcon from '../../../../shared/components/material-icon'
  4. import { useTranslation } from 'react-i18next'
  5. import { useEditorContext } from '@/shared/context/editor-context'
  6. import { memo, useRef, useCallback } from 'react'
  7. import OLListGroupItem from '@/features/ui/components/ol/ol-list-group-item'
  8. import sparkleWhite from '@/shared/svgs/sparkle-small-white.svg'
  9. import sparkle from '@/shared/svgs/ai-sparkle-text.svg'
  10. import { TableInserterDropdown } from './table-inserter-dropdown'
  11. import OLOverlay from '@/features/ui/components/ol/ol-overlay'
  12. import OLPopover from '@/features/ui/components/ol/ol-popover'
  13. import useDropdown from '../../../../shared/hooks/use-dropdown'
  14. import * as commands from '../../extensions/toolbar/commands'
  15. import { useCodeMirrorViewContext } from '../codemirror-context'
  16. import { emitToolbarEvent } from '../../extensions/toolbar/utils/analytics'
  17. export const TableDropdown = memo(function TableDropdown() {
  18. const { t } = useTranslation()
  19. const { writefullInstance } = useEditorContext()
  20. const { open, onToggle, ref } = useDropdown()
  21. const target = useRef<any>(null)
  22. const view = useCodeMirrorViewContext()
  23. const onSizeSelected = useCallback(
  24. (sizeX: number, sizeY: number) => {
  25. onToggle(false)
  26. commands.insertTable(view, sizeX, sizeY)
  27. emitToolbarEvent(view, 'table-generator-insert-table')
  28. view.focus()
  29. },
  30. [view, onToggle]
  31. )
  32. return (
  33. <>
  34. <div ref={target}>
  35. <ToolbarButtonMenu
  36. id="toolbar-table"
  37. label={t('toolbar_insert_table')}
  38. icon={<MaterialIcon type="table_chart" />}
  39. >
  40. <DropdownHeader className="ol-cm-toolbar-header mx-2">
  41. {t('toolbar_table_insert_table_lowercase')}
  42. </DropdownHeader>
  43. <OLListGroupItem
  44. aria-label={t('toolbar_generate_table')}
  45. onClick={event => {
  46. writefullInstance?.openTableGenerator()
  47. }}
  48. >
  49. <img
  50. alt="sparkle"
  51. className="ol-cm-toolbar-ai-sparkle-gradient"
  52. src={sparkle}
  53. aria-hidden="true"
  54. />
  55. <img
  56. alt="sparkle"
  57. className="ol-cm-toolbar-ai-sparkle-white"
  58. src={sparkleWhite}
  59. aria-hidden="true"
  60. />
  61. <span>{t('generate_from_text_or_image')}</span>
  62. </OLListGroupItem>
  63. <div className="ol-cm-toolbar-dropdown-divider mx-2 my-0" />
  64. <OLListGroupItem
  65. aria-label={t('toolbar_insert_table')}
  66. onMouseDown={event => {
  67. event.preventDefault()
  68. event.stopPropagation()
  69. }}
  70. onClick={() => {
  71. onToggle(!open)
  72. }}
  73. >
  74. <span>{t('select_size')}</span>
  75. </OLListGroupItem>
  76. </ToolbarButtonMenu>
  77. <OLOverlay
  78. show={open}
  79. target={target.current}
  80. placement="bottom"
  81. container={view.dom}
  82. containerPadding={0}
  83. transition
  84. rootClose
  85. onHide={() => onToggle(false)}
  86. >
  87. <OLPopover
  88. id="toolbar-table-menu"
  89. ref={ref}
  90. className="ol-cm-toolbar-button-menu-popover ol-cm-toolbar-button-menu-popover-unstyled"
  91. >
  92. <TableInserterDropdown onSizeSelected={onSizeSelected} />
  93. </OLPopover>
  94. </OLOverlay>
  95. </div>
  96. </>
  97. )
  98. })