Skip to content
This repository was archived by the owner on Nov 27, 2024. It is now read-only.

datadotworld/draft-js-checkable-list-item

This branch is 3 commits ahead of sugarshin/draft-js-checkable-list-item:master.

Folders and files

NameName
Last commit message
Last commit date

Latest commit

60ee4c5 · Nov 27, 2024

History

74 Commits
Oct 5, 2018
Nov 27, 2024
Feb 21, 2018
Nov 9, 2016
May 23, 2018
Sep 13, 2018
Oct 29, 2017
May 23, 2018
Oct 29, 2016
May 23, 2018
Nov 27, 2024
Jan 4, 2018
Nov 27, 2024
Nov 26, 2024
Feb 21, 2018
May 23, 2018

Repository files navigation

draft-js-checkable-list-item

CircleCI Coverage Status

Dependency Status npm version License

Checkable list item for Draft.js

npm i draft-js-checkable-list-item

Live demo

data.world publishing

Push to master to publish to Artifactory.

Usage

Example

import React, { Component } from 'react'
import { Editor, EditorState, RichUtils, DefaultDraftBlockRenderMap } from 'draft-js'
import {
  blockRenderMap, CheckableListItem, CheckableListItemBlock, CheckableListItemUtils, CHECKABLE_LIST_ITEM
} from 'draft-js-checkable-list-item'
import 'draft-js/dist/Draft.css'
import 'draft-js-checkable-list-item/lib/CheckableListItem.css'

import type ContentBlock from 'draft-js/lib/ContentBlock'

export default class App extends Component {
  editor: Editor
  state: { editorState: EditorState }

  blockRendererFn = (block: ContentBlock): ?CheckableListItemBlock => {
    if (block.getType() === CHECKABLE_LIST_ITEM) {
      return {
        component: CheckableListItem,
        props: {
          onChangeChecked: () => this.changeEditorState(
            CheckableListItemUtils.toggleChecked(this.state.editorState, block)
          ),
          checked: !!block.getData().get('checked'),
        },
      }
    }
  }

  handleTab = (ev: SyntheticKeyboardEvent): ?boolean => {
    if (this.adjustBlockDepth(ev)) {
      return true
    }
    const { editorState } = this.state
    const newEditorState = RichUtils.onTab(ev, editorState, 4)
    if (newEditorState !== editorState) {
      this.changeEditorState(newEditorState)
    }
  }

  changeEditorState = (editorState: EditorState): void => this.setState({ editorState })

  state = { editorState: EditorState.createEmpty() }

  render() {
    return (
      <div>
        <div>
          <span onMouseDown={this.createMouseDownHandler(CHECKABLE_LIST_ITEM)}></span>
        </div>
        <Editor
          blockRendererFn={this.blockRendererFn}
          blockRenderMap={DefaultDraftBlockRenderMap.merge(blockRenderMap)}
          blockStyleFn={this.blockStyleFn}
          editorState={this.state.editorState}
          onChange={this.changeEditorState}
          onTab={this.handleTab}
        />
      </div>
    )
  }

  createMouseDownHandler(type: string): Function {
    return (ev: SyntheticEvent) => {
      ev.preventDefault()
      this.changeEditorState(RichUtils.toggleBlockType(this.state.editorState, type))
    }
  }

  blockStyleFn(block: ContentBlock): ?string {
    if (block.getType() === CHECKABLE_LIST_ITEM) {
      return CHECKABLE_LIST_ITEM
    }
  }

  adjustBlockDepth(ev: SyntheticKeyboardEvent): boolean {
    const { editorState } = this.state
    const newEditorState = CheckableListItemUtils.onTab(ev, editorState, 4)
    if (newEditorState !== editorState) {
      this.changeEditorState(newEditorState)
      return true
    }
    return false
  }
}

Contributing

  1. Fork it!
  2. Create your feature branch: git checkout -b my-new-feature
  3. Commit your changes: git commit -am 'Add some feature'
  4. Push to the branch: git push origin my-new-feature
  5. Submit a pull request :D

License

MIT

© sugarshin

Releases

No releases published

Packages

No packages published

Languages

  • JavaScript 91.9%
  • Shell 4.1%
  • Stylus 4.0%