Skip to content
Snippets Groups Projects
MatchingContainerComponent.js 4.07 KiB
Newer Older
chris's avatar
chris committed
/* eslint-disable react/prop-types */
chris's avatar
chris committed
import React, { useContext, useRef, useState } from 'react';
chris's avatar
chris committed
import { v4 as uuidv4 } from 'uuid';
chris's avatar
chris committed
import { WaxContext } from 'wax-prosemirror-core';
chris's avatar
chris committed
import { Icon } from 'wax-prosemirror-components';
chris's avatar
chris committed
import styled from 'styled-components';
import FeedbackComponent from './FeedbackComponent';
chris's avatar
chris committed
import ContainerEditor from './ContainerEditor';
chris's avatar
chris committed
import DropDownComponent from './DropDownComponent';
chris's avatar
chris committed

const MatchingWrapper = styled.div`
chris's avatar
chris committed
  display: flex;
  flex-direction: column;
chris's avatar
chris committed
  margin: 0px 38px 15px 38px;
chris's avatar
chris committed
  margin-top: 10px;
`;
chris's avatar
chris committed

chris's avatar
chris committed
const MatchingContainer = styled.div`
  border: 3px solid #f5f5f7;
  margin-bottom: 30px;
  padding: 10px;
`;

chris's avatar
chris committed
const QuestionWrapper = styled.div`
  display: flex;
  flex-direction: row;
`;
chris's avatar
chris committed

const InputsContainer = styled.div`
  display: flex;
  flex-direction: column;
chris's avatar
chris committed
  width: 100%;
chris's avatar
chris committed
`;

chris's avatar
chris committed
const Option = styled.div`
chris's avatar
chris committed
  display: flex;
  flex-direction: row;
chris's avatar
chris committed
  width: 100%;
chris's avatar
chris committed
`;

chris's avatar
chris committed
const ActionButton = styled.button`
chris's avatar
chris committed
  height: 24px;
chris's avatar
chris committed
  border: none;
  background: transparent;
  cursor: pointer;
chris's avatar
chris committed
  padding-left: 0;
chris's avatar
chris committed
`;

const StyledIconAction = styled(Icon)`
  height: 24px;
  width: 24px;
chris's avatar
chris committed
`;

chris's avatar
chris committed
const CreateOptions = styled.div`
  display: flex;
  flex-direction: column;
chris's avatar
chris committed
  padding-bottom: 10px;
chris's avatar
chris committed
`;

chris's avatar
chris committed
const OptionArea = styled.div`
  display: flex;
chris's avatar
chris committed
  width: 100%;
chris's avatar
chris committed

  ul {
    display: flex;
    flex-wrap: wrap;
    flex-direction: row;
    margin: 0;
    padding: 0;
    li {
      list-style-type: none;
      padding-right: 7px;
      padding-bottom: 7px;

      span {
        background: #535e76;
        color: white;
        padding: 3px 3px 3px 10px;
        border-radius: 12px;
      }
      buttton {
      }
      svg {
        fill: white;
        width: 16px;
        height: 16px;
      }
    }
  }
chris's avatar
chris committed
`;

const AddOption = styled.div`
  display: flex;
`;

chris's avatar
chris committed
export default ({ node, view, getPos }) => {
  const context = useContext(WaxContext);
  const {
    pmViews: { main },
  } = context;
chris's avatar
chris committed
  const [options, setOptions] = useState([]);
  const addOptionRef = useRef(null);
chris's avatar
chris committed

  const customProps = main.props.customValues;

  const isEditable = main.props.editable(editable => {
    return editable;
  });

  const readOnly = !isEditable;

chris's avatar
chris committed
  const addOption = () => {
chris's avatar
chris committed
    if (addOptionRef.current.value.trim() === '') return;
chris's avatar
chris committed
    const obj = { label: addOptionRef.current.value, key: uuidv4() };
    setOptions(prevOptions => [...prevOptions, obj]);
chris's avatar
chris committed
  };
chris's avatar
chris committed

chris's avatar
chris committed
  const removeOption = key => {
    setOptions(options.filter(option => option.key !== key));
  };

chris's avatar
chris committed
  return (
    <MatchingWrapper>
      <span>Matching</span>
      <MatchingContainer className="matching">
chris's avatar
chris committed
        <QuestionWrapper>
chris's avatar
chris committed
          <InputsContainer>
            <Option>
              <ContainerEditor getPos={getPos} node={node} view={view} />
chris's avatar
chris committed
              <DropDownComponent options={options} />
chris's avatar
chris committed
            </Option>
          </InputsContainer>
chris's avatar
chris committed
        </QuestionWrapper>
chris's avatar
chris committed
        {!readOnly && (
          <CreateOptions>
chris's avatar
chris committed
            <OptionArea>
              <ul>
                {options.map((option, index) => {
                  return (
                    <li key={option.key}>
                      <span>
                        {option.label} &nbsp;
                        <ActionButton
                          onClick={() => removeOption(option.key)}
                          type="button"
                        >
                          <StyledIconAction name="deleteOutlined" />
                        </ActionButton>
                      </span>
                    </li>
                  );
                })}
              </ul>
            </OptionArea>
chris's avatar
chris committed
            <AddOption>
              <input placeholder="Add Option" ref={addOptionRef} type="text" />
              <button onClick={addOption} type="button">
                Add
              </button>
            </AddOption>
          </CreateOptions>
        )}
chris's avatar
chris committed
        {!(readOnly && !customProps.showFeedBack) && (
          <FeedbackComponent
            getPos={getPos}
            node={node}
            readOnly={readOnly}
            view={view}
          />
        )}
      </MatchingContainer>
    </MatchingWrapper>
  );
};