Skip to content
Snippets Groups Projects
MatchingQuestion.js 1.93 KiB
Newer Older
chris's avatar
chris committed
import { injectable } from 'inversify';
chris's avatar
chris committed
import { Fragment } from 'prosemirror-model';
import { findWrapping } from 'prosemirror-transform';
import { TextSelection } from 'prosemirror-state';
chris's avatar
chris committed
import { v4 as uuidv4 } from 'uuid';
chris's avatar
chris committed
import { Tools } from 'wax-prosemirror-core';
chris's avatar
chris committed
import helpers from '../MultipleChoiceQuestionService/helpers/helpers';
chris's avatar
chris committed

@injectable()
class MatchingQuestion extends Tools {
chris's avatar
chris committed
  title = 'Add Matching';
  label = 'Matching';
  name = 'Matching';
chris's avatar
chris committed

  get run() {
chris's avatar
chris committed
    return main => {
      const { dispatch } = main;
      const { state } = main;
chris's avatar
chris committed
      // helpers.checkifEmpty(main);
chris's avatar
chris committed
      /* Create Wrapping */
chris's avatar
chris committed
      const { $from, $to } = main.state.selection;
chris's avatar
chris committed
      const range = $from.blockRange($to);
chris's avatar
chris committed
      const { tr } = main.state;
chris's avatar
chris committed

      const wrapping =
        range &&
        findWrapping(range, state.config.schema.nodes.matching_container, {
          id: uuidv4(),
        });
      if (!wrapping) return false;
      tr.wrap(range, wrapping);

      const map = tr.mapping.maps[0];
      let newPos = 0;
      map.forEach((_from, _to, _newFrom, newTo) => {
        newPos = newTo;
      });

      tr.setSelection(TextSelection.create(tr.doc, range.$to.pos));
      const option = state.config.schema.nodes.matching_option.create(
chris's avatar
chris committed
        { id: uuidv4(), isfirst: true },
chris's avatar
chris committed
        Fragment.empty,
      );

      tr.replaceSelectionWith(option);
      dispatch(tr);
chris's avatar
chris committed
      return true;
chris's avatar
chris committed
    };
chris's avatar
chris committed
  }

chris's avatar
chris committed
  select = (state, activeViewId, activeView) => {
    const { disallowedTools } = activeView.props;
    let status = true;
    const { from, to } = state.selection;
    if (from === null || disallowedTools.includes('Matching')) return false;

    state.doc.nodesBetween(from, to, (node, pos) => {
      if (node.type.groups.includes('questions')) {
        status = false;
      }
    });
    return status;
  };
chris's avatar
chris committed

  get active() {
    return state => {};
  }

  get enable() {
    return state => {};
  }
}
export default MatchingQuestion;