all files / ui/ InsertInlineNodeCommand.js

0% Statements 0/22
0% Branches 0/12
0% Functions 0/5
0% Lines 0/21
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96                                                                                                                                                                                               
import Command from './Command'
 
/**
  Reusable command implementation for inserting inline nodes.
 
  @class InsertInlineNodeCommand
 
  @example
 
  Define a custom command.
 
  ```
  class AddXRefCommand extends InsertInlineNodeCommand {
    createNodeData() {
      return {
        attributes: {'ref-type': 'bibr'},
        targets: [],
        label: '???',
        type: 'xref'
      }
    }
  }
  ```
 
  Register it in your app using the configurator.
 
  ```
  config.addCommand('add-xref', AddXRefCommand, {nodeType: 'xref'})
  ```
*/
 
class InsertInlineNodeCommand extends Command {
  /**
    @param config Takes a config object, provided on registration in configurator
  */
  constructor(...args) {
    super(...args)
 
    if (!this.config.nodeType) {
      throw new Error('Every InlineInlineNodeCommand must have a nodeType')
    }
  }
 
  /**
    Determine command state for inline node insertion. Command is enabled
    if selection is a property selection.
  */
  getCommandState(params) {
    let newState = {
      disabled: this.isDisabled(params),
      active: false
    }
    return newState
  }
 
  isDisabled(params) {
    let sel = params.selection
    let selectionState = params.editorSession.getSelectionState()
    if (!sel.isPropertySelection()) {
      return true
    }
    if (this.config.disableCollapsedCursor && sel.isCollapsed()) {
      return true
    }
 
    // We don't allow inserting an inline node on top of an existing inline
    // node.
    if (selectionState.isInlineNodeSelection()) {
      return true
    }
    return false
  }
 
  /**
    Insert new inline node at the current selection
  */
  execute(params) {
    let state = this.getCommandState(params)
    if (state.disabled) return
    let editorSession = this._getEditorSession(params)
    editorSession.transaction((tx) => {
      let nodeData = this.createNodeData(tx, params)
      tx.insertInlineNode(nodeData)
    })
  }
 
  createNodeData(tx) { // eslint-disable-line
    return {
      type: this.config.nodeType
    }
  }
 
}
 
export default InsertInlineNodeCommand