table-inserter-dropdown.tsx 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import { FC, useState } from 'react'
  2. import classNames from 'classnames'
  3. import { useTranslation } from 'react-i18next'
  4. export const TableInserterDropdown = ({
  5. onSizeSelected,
  6. }: {
  7. onSizeSelected: (sizeX: number, sizeY: number) => void
  8. }) => {
  9. return (
  10. <div className="ol-cm-toolbar-table-grid-popover">
  11. <SizeGrid sizeX={10} sizeY={10} onSizeSelected={onSizeSelected} />
  12. </div>
  13. )
  14. }
  15. TableInserterDropdown.displayName = 'TableInserterDropdown'
  16. const range = (start: number, end: number) =>
  17. Array.from({ length: end - start + 1 }, (v, k) => k + start)
  18. const SizeGrid: FC<{
  19. sizeX: number
  20. sizeY: number
  21. onSizeSelected: (sizeX: number, sizeY: number) => void
  22. }> = ({ sizeX, sizeY, onSizeSelected }) => {
  23. const [currentSize, setCurrentSize] = useState<{
  24. sizeX: number
  25. sizeY: number
  26. }>({ sizeX: 0, sizeY: 0 })
  27. const { t } = useTranslation()
  28. let label = t('toolbar_table_insert_table_lowercase')
  29. if (currentSize.sizeX > 0 && currentSize.sizeY > 0) {
  30. label = t('toolbar_table_insert_size_table', {
  31. size: `${currentSize.sizeY}×${currentSize.sizeX}`,
  32. })
  33. }
  34. return (
  35. <>
  36. <div className="ol-cm-toolbar-table-size-label">{label}</div>
  37. <table
  38. className="ol-cm-toolbar-table-grid"
  39. onMouseLeave={() => {
  40. setCurrentSize({ sizeX: 0, sizeY: 0 })
  41. }}
  42. >
  43. <tbody>
  44. {range(1, sizeY).map(y => (
  45. <tr key={y}>
  46. {range(1, sizeX).map(x => (
  47. // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions
  48. <td
  49. className={classNames('ol-cm-toolbar-table-cell', {
  50. active: currentSize.sizeX >= x && currentSize.sizeY >= y,
  51. })}
  52. key={x}
  53. onMouseEnter={() => {
  54. setCurrentSize({ sizeX: x, sizeY: y })
  55. }}
  56. onMouseUp={() => onSizeSelected(x, y)}
  57. />
  58. ))}
  59. </tr>
  60. ))}
  61. </tbody>
  62. </table>
  63. </>
  64. )
  65. }