Skip to content
Snippets Groups Projects
Title.js 1.58 KiB
Newer Older
chris's avatar
chris committed
import React from 'react';
import { isEmpty } from 'lodash';
chris's avatar
chris committed
import { injectable } from 'inversify';
chris's avatar
chris committed
import { Commands, DocumentHelpers, Tools } from 'wax-prosemirror-core';
chris's avatar
chris committed
import TitleButton from './components/TitleButton';
chris's avatar
chris committed
import checkLevelFromConfig from '../HeadingService/checkLevelFromConfig';
chris's avatar
chris committed

@injectable()
chris's avatar
chris committed
export default class Title extends Tools {
chris's avatar
chris committed
  title = 'Change to Title';
chris's avatar
chris committed
  label = 'Title';
chris's avatar
chris committed
  name = 'Title';
chris's avatar
chris committed

  get run() {
    return (state, dispatch) => {
chris's avatar
chris committed
      Commands.setBlockType(state.config.schema.nodes.title, { level: 1 })(
        state,
        dispatch,
      );
chris's avatar
chris committed
    };
  }

chris's avatar
chris committed
  get active() {
chris's avatar
chris committed
    return state => {
chris's avatar
chris committed
      return Commands.blockActive(state.config.schema.nodes.title)(state);
    };
  }

chris's avatar
chris committed
  select = (state, activeViewId) => {
chris's avatar
chris committed
    const {
      selection: { $from, $to },
    } = state;

chris's avatar
chris committed
    if (this.config) {
      const allowedLevel = checkLevelFromConfig(
        state,
        activeViewId,
        this.config,
      );
      if (allowedLevel > 1) return false;
    }

chris's avatar
chris committed
    const titleCounter = DocumentHelpers.findChildrenByType(
      state.doc,
      state.config.schema.nodes.title,
      true,
    );

    if (
      activeViewId !== 'main' ||
      $from.parent !== $to.parent ||
      titleCounter.length === 1
    )
      return false;

chris's avatar
chris committed
    return true;
  };

chris's avatar
chris committed
  get enable() {
    return state => {
      return Commands.setBlockType(state.config.schema.nodes.title)(state);
chris's avatar
chris committed
    };
  }
chris's avatar
chris committed

  renderTool(view) {
    if (isEmpty(view)) return null;
chris's avatar
chris committed
    return this.isDisplayed() ? (
      <TitleButton item={this.toJSON()} key="Title" view={view} />
chris's avatar
chris committed
    ) : null;
  }
chris's avatar
chris committed
}