table-dropdown.tsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import { DropdownHeader } from '@/shared/components/dropdown/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 '@/shared/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 '@/shared/components/ol/ol-overlay'
  12. import OLPopover from '@/shared/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. import getMeta from '@/utils/meta'
  18. export const TableDropdown = memo(function TableDropdown() {
  19. const { t } = useTranslation()
  20. const { writefullInstance } = useEditorContext()
  21. const showAiFeaturesDisabled = getMeta('ol-showAiFeaturesDisabled')
  22. const selectSizeDropdown = useDropdown()
  23. const target = useRef<any>(null)
  24. const view = useCodeMirrorViewContext()
  25. const onSizeSelected = useCallback(
  26. (sizeX: number, sizeY: number) => {
  27. selectSizeDropdown.onToggle(false)
  28. commands.insertTable(view, sizeX, sizeY)
  29. emitToolbarEvent(view, 'table-generator-insert-table')
  30. view.focus()
  31. },
  32. [selectSizeDropdown, view]
  33. )
  34. return (
  35. <>
  36. <div ref={target}>
  37. <ToolbarButtonMenu
  38. id="toolbar-table"
  39. label={t('toolbar_insert_table')}
  40. disablePopover={selectSizeDropdown.open}
  41. icon={<MaterialIcon type="table_chart" />}
  42. >
  43. <DropdownHeader className="ol-cm-toolbar-header mx-2">
  44. {t('toolbar_table_insert_table_lowercase')}
  45. </DropdownHeader>
  46. <OLListGroupItem
  47. aria-label={t('toolbar_generate_table')}
  48. disabled={showAiFeaturesDisabled}
  49. disabledReason={t('ai_features_unavailable_on_this_project')}
  50. onClick={() => {
  51. writefullInstance?.openTableGenerator()
  52. }}
  53. >
  54. <img
  55. alt="sparkle"
  56. className="ol-cm-toolbar-ai-sparkle-gradient"
  57. src={sparkle}
  58. aria-hidden="true"
  59. />
  60. <img
  61. alt="sparkle"
  62. className="ol-cm-toolbar-ai-sparkle-white"
  63. src={sparkleWhite}
  64. aria-hidden="true"
  65. />
  66. <span className={showAiFeaturesDisabled ? 'opacity-50' : ''}>
  67. {t('generate_from_text_or_image')}
  68. </span>
  69. </OLListGroupItem>
  70. <div className="ol-cm-toolbar-dropdown-divider mx-2 my-0" />
  71. <OLListGroupItem
  72. aria-label={t('toolbar_insert_table')}
  73. onMouseDown={event => {
  74. event.preventDefault()
  75. event.stopPropagation()
  76. }}
  77. onClick={event => {
  78. selectSizeDropdown.onToggle(!selectSizeDropdown.open)
  79. // prevent click event from bubbling up to the toolbar overflow button causing it to close
  80. event.stopPropagation()
  81. }}
  82. >
  83. <span>{t('select_size')}</span>
  84. </OLListGroupItem>
  85. </ToolbarButtonMenu>
  86. <OLOverlay
  87. show={selectSizeDropdown.open}
  88. target={target.current}
  89. placement="bottom"
  90. container={view.dom}
  91. containerPadding={0}
  92. transition
  93. rootClose
  94. onHide={() => selectSizeDropdown.onToggle(false)}
  95. >
  96. <OLPopover
  97. id="toolbar-table-menu"
  98. ref={selectSizeDropdown.ref}
  99. className="ol-cm-toolbar-button-menu-popover ol-cm-toolbar-button-menu-popover-unstyled"
  100. >
  101. <TableInserterDropdown onSizeSelected={onSizeSelected} />
  102. </OLPopover>
  103. </OLOverlay>
  104. </div>
  105. </>
  106. )
  107. })