Skip to content
Snippets Groups Projects
TableDropDown.js 2.26 KiB
Newer Older
chris's avatar
chris committed
/* eslint react/prop-types: 0 */
chris's avatar
chris committed
import React, { useMemo, useContext, useState } from 'react';
import { TextSelection } from 'prosemirror-state';
chris's avatar
chris committed
import styled from 'styled-components';
import * as tablesFn from 'prosemirror-tables';
chris's avatar
chris committed
import { WaxContext } from 'wax-prosemirror-core';
chris's avatar
chris committed
import Dropdown from 'react-dropdown';
import 'react-dropdown/style.css';
chris's avatar
chris committed

const DropdownStyled = styled(Dropdown)`
chris's avatar
chris committed
  display: inline-flex;
  opacity: ${props => (props.select ? 1 : 0.4)};
chris's avatar
chris committed
  pointer-events: ${props => (props.select ? 'default' : 'none')};
chris's avatar
chris committed

chris's avatar
chris committed
  .Dropdown-control {
    border: none;
chris's avatar
chris committed

    &:hover {
      box-shadow: none;
    }
chris's avatar
chris committed
  }
chris's avatar
chris committed

chris's avatar
chris committed
  .Dropdown-arrow {
chris's avatar
chris committed
    right: 25px;
chris's avatar
chris committed
    top: 14px;
chris's avatar
chris committed
  }
chris's avatar
chris committed

chris's avatar
chris committed
  .Dropdown-menu {
chris's avatar
chris committed
    align-items: flex-start;
    display: flex;
    flex-direction: column;
chris's avatar
chris committed
    width: 120%;

    .Dropdown-option {
      width: 100%;
    }
chris's avatar
chris committed
  }
chris's avatar
chris committed
`;

const dropDownOptions = [
chris's avatar
chris committed
  { label: 'add column before', value: 'addColumnBefore' },
  { label: 'add column after', value: 'addColumnAfter' },
  { label: 'Delete column', value: 'deleteColumn' },
  { label: 'Insert row before', value: 'addRowBefore' },
  { label: 'Insert row after', value: 'addRowAfter' },
  { label: 'Delete row', value: 'deleteRow' },
  { label: 'Delete table', value: 'deleteTable' },
  { label: 'Merge cells', value: 'mergeCells' },
  { label: 'Split cell', value: 'splitCell' },
  { label: 'Toggle header column', value: 'toggleHeaderColumn' },
  { label: 'Toggle header row', value: 'toggleHeaderRow' },
  { label: 'Toggle header cells', value: 'toggleHeaderCell' },
chris's avatar
chris committed
];

chris's avatar
chris committed
const TableDropDown = ({ view: { dispatch, state }, item }) => {
chris's avatar
chris committed
  const { activeView } = useContext(WaxContext);
chris's avatar
chris committed
  const [selectedOption, setSelectedOption] = useState('');
chris's avatar
chris committed

  const isDisabled = item.select(activeView.state);
  const TableDropDownComponent = useMemo(
    () => (
      <DropdownStyled
        onChange={option => {
chris's avatar
chris committed
          item.run(activeView.state, dispatch, tablesFn[option.value]);
          setSelectedOption(option.value);

          setTimeout(() => {
            activeView.focus();
          });
chris's avatar
chris committed
        }}
chris's avatar
chris committed
        options={dropDownOptions}
chris's avatar
chris committed
        placeholder="Table Options"
        select={isDisabled}
      />
    ),
chris's avatar
chris committed
    [isDisabled, selectedOption],
chris's avatar
chris committed
  );
chris's avatar
chris committed

  return TableDropDownComponent;
chris's avatar
chris committed
};
chris's avatar
chris committed

chris's avatar
chris committed
export default TableDropDown;