Home

Awesome

GrapesJS click plugin (no more drag-and-drop)

Installation

npm install grapesjs grapesjs-click

Usage

JavaScript

import grapesjs from 'grapesjs'
import grapesjsClick, { getMouseListener, showGrabbedInfo, hideGrabbedInfo } from 'grapesjs-click'

const pluginOptions = {
  hasAutoDropped: boolean // optional, default to true
}
const editor = grapesjs.init({
  // ...
  plugins: [
    grapesjsClick
  ],
  pluginOpts: {
    [grapesjsClick]: pluginOptions
  }
  // ...
})

TypeScript

import grapesjs, { usePlugin } from 'grapesjs'
import grapesjsClick, { getMouseListener, showGrabbedInfo, hideGrabbedInfo } from 'grapesjs-click'

import type { PluginOptions, CommandOptions } from 'grapesjs-click'

const pluginOptions: PluginOptions = {
  hasAutoDropped: boolean // optional, default to true
}
const editor = grapesjs.init({
  // ...
  plugins: [
    usePlugin(grapesjsClick, pluginOptions)
  ]
  // ...
})

Commands

Grab a block

const commandOptions: CommandOptions = {
  id: string // required, grapesjs block identifier
}

editor.runCommand('click:grab-block', commandOptions)

Drop a block

const commandOptions: CommandOptions = {
  id: string // optional, grabbed block id by default
}

editor.runCommand('click:drop-block', commandOptions)

Grab a component

const commandOptions: CommandOptions = {
  id: string // optional, selected component by default
}

editor.runCommand('click:grab-component', commandOptions)

Drop a component

const commandOptions: CommandOptions = {
  id: string // optional, grabbed component id by default
}

editor.runCommand('click:drop-component', commandOptions)

Events

import type { MouseListener } from 'grapesjs-click'

// Your custom HTML element to display block or component info.
const grabbedInfoEl = document.getElementById('grabbed-info')

// An utility to make your custom HTML element follow the mouse cursor.
const mouseListener: MouseListener = getMouseListener(editor, grabbedInfoEl)

Full demonstration in the src/example.ts file.

On block grabbed

editor.on('click:grab-block', (block: Block) => {
  const label = block.getLabel()
  const category = block.getCategoryLabel()

  grabbedInfoEl.textContent = `${label} (${category})`

  showGrabbedInfo(grabbedInfoEl, mouseListener)
})

On block dropped

editor.on('click:drop-block', () => {
  grabbedInfoEl.textContent = ''
  grabbedInfoEl.style.top = '0'
  grabbedInfoEl.style.left = '0'

  hideGrabbedInfo(grabbedInfoEl, mouseListener)
})

On component grabbed

editor.on('click:grab-component', (component: Component) => {
  const { name, type } = component.props()
  const label = name || type

  grabbedInfoEl.textContent = label

  showGrabbedInfo(grabbedInfoEl, mouseListener)
})

On component dropped

editor.on('click:drop-component', (component: Component) => {
  grabbedInfoEl.textContent = ''
  grabbedInfoEl.style.top = '0'
  grabbedInfoEl.style.left = '0'

  hideGrabbedInfo(grabbedInfoEl, mouseListener)
})

Options

{
  // Drop the grabbed block or component when a component is selected in the canvas.
  hasAutoDropped: boolean // optional, default to true
}

Question? Idea?

If you have a question about how grapesjs-click works or an idea to improve it, the Discussions tab in GitHub is the place to be.

However, if you get an error, you should open an issue.

License

Distributed under the BSD 3-Clause License. See LICENSE for more information.

Contact

Benjamin Grand @bgrand_ch