
Security News
Browserslist-rs Gets Major Refactor, Cutting Binary Size by Over 1MB
Browserslist-rs now uses static data to reduce binary size by over 1MB, improving memory use and performance for Rust-based frontend tools.
react-trello-menu
Advanced tools
Pluggable components to add a trello like kanban board to your menu builder
Pluggable components to add a trello-like kanban board to your menu builder based on react-trello v2.2.3 by Prakash RC (https://github.com/rcdexta/react-trello). This version adds additional menu-specific editing capabilities.
Install using npm or yarn
$ npm install --save react-trello-menu
or
$ yarn add react-trello-menu
The Board
component takes a prop called data
that contains all the details related to rendering the board. A sample data json is given here to illustrate the contract:
const data = {
lanes: [
{
id: 'lane1',
title: 'Planned Tasks',
label: '2/2',
cards: [
{id: 'Card1', title: 'Write Blog', description: 'Can AI make memes', label: '30 mins', draggable: false},
{id: 'Card2', title: 'Pay Rent', description: 'Transfer via NEFT', label: '5 mins', metadata: {sha: 'be312a1'}}
]
},
{
id: 'lane2',
title: 'Completed',
label: '0/0',
cards: []
}
]
}
draggable
property of Card object is true
by default.
The data is passed to the board component and that's it.
import React from 'react'
import Board from 'react-trello-menu'
export default class App extends React.Component {
render() {
return <Board data={data} />
}
}
Refer to storybook for detailed examples: https://andreioprisan.github.io/react-trello-menu/
Also refer to the sample project that uses react-trello-menu as illustration: https://github.com/andreioprisan/react-trello-menu-example
$ yarn add andreioprisan/react-trello-menu
and
import Board from 'react-trello-menu/src'
Breaking changes. Since version 2.2 these properties are removed: addLaneTitle
, addCardLink
, customLaneHeader
, newCardTemplate
, newLaneTemplate
,
and customCardLayout
with children
element.
Follow upgrade instructions to make easy migration.
This is the container component that encapsulates the lanes and cards
Name | Type | Description |
---|---|---|
data | object | Actual board data in the form of json |
Name | Type | Description |
---|---|---|
draggable | boolean | Makes all cards and lanes draggable. Default: false |
laneDraggable | boolean | Set to false to disable lane dragging. Default: true |
cardDraggable | boolean | Set to false to disable card dragging. Default: true |
collapsibleLanes | boolean | Make the lanes with cards collapsible. Default: false |
editable | boolean | Makes the entire board editable. Allow cards to be added or deleted Default: false |
canAddLanes | boolean | Allows new lanes to be added to the board. Default: false |
hideCardDeleteIcon | boolean | Disable showing the delete icon to the top right corner of the card (when board is editable) |
editLaneTitle | boolean | Allow inline lane title edit Default: false |
Name | Type | Description |
---|---|---|
handleDragStart | function | Callback function triggered when card drag is started: handleDragStart(cardId, laneId) |
handleDragEnd | function | Callback function triggered when card drag ends, return false if you want to cancel drop: handleDragEnd(cardId, sourceLaneId, targetLaneId, position, cardDetails) |
handleLaneDragStart | function | Callback function triggered when lane drag is started: handleLaneDragStart(laneId) |
handleLaneDragEnd | function | Callback function triggered when lane drag ends: handleLaneDragEnd(removedIndex, addedIndex, payload) |
onDataChange | function | Called everytime the data changes due to user interaction or event bus: onDataChange(newData) |
onCardClick | function | Called when a card is clicked: onCardClick(cardId, metadata, laneId) |
onCardAdd | function | Called when a new card is added: onCardAdd(card, laneId) |
onCardDelete | function | Called when a card is deleted: onCardDelete(cardId, laneId) |
onCardMoveAcrossLanes | function | Called when a card is moved across lanes onCardMoveAcrossLanes(fromLaneId, toLaneId, cardId, index) |
onLaneAdd | function | Called when a new lane is added: onLaneAdd(params) |
onLaneDelete | function | Called when a lane is deleted onLaneDelete(laneId) |
onLaneUpdate | function | Called when a lane attributes are updated onLaneUpdate(laneId, data) |
onLaneClick | function | Called when a lane is clicked onLaneClick(laneId) . Card clicks are not propagated to lane click event |
onLaneScroll | function | Called when a lane is scrolled to the end: onLaneScroll(requestedPage, laneId) |
Name | Type | Description |
---|---|---|
eventBusHandle | function | This is a special function that providers a publishHook to pass new events to the board. See details in Publish Events section |
laneSortFunction | function | Used to specify the logic to sort cards on a lane: laneSortFunction(card1, card2) |
Name | Type | Description |
---|---|---|
lang | string | Language of compiled texts ("en", "ru"). Default is "en" |
t | function | Translation function. You can specify either one key as a String . Look into ./src/locales for keys list |
Name | Type | Description |
---|---|---|
style | object | Pass CSS style props to board container |
cardStyle | object | CSS style for every cards |
laneStyle | object | CSS style for every lanes |
tagStyle | object | If cards have tags, use this prop to modify their style |
cardDragClass | string | CSS class to be applied to Card when being dragged |
laneDragClass | string | CSS class to be applied to Lane when being dragged |
components | object | Map of customised components. List of available. |
Name | Type | Description |
---|---|---|
id | string | ID of lane |
style | object | Pass CSS style props to lane container |
labelStyle | object | Pass CSS style props of label |
cardStyle | object | Pass CSS style props for cards in this lane |
disallowAddingCard | boolean | Disallow adding card button in this lane (default: false) |
Refer to stories
folder for examples on many more options for customization.
It is possible to make the entire board editable by setting the editable
prop to true. This switch prop will enable existing cards to be deleted and show a Add Card
link at the bottom of each lane, clicking which will show an inline editable new card.
Check out the editable board story and its corresponding source code for more details.
There are three ways to apply styles to the library components including Board
, Lane
or Card
:
Use the predefined css classnames attached to these elements that go by .react-trello-menu-lane
, .react-trello-menu-card
, .react-trello-menu-board
:
.react-trello-menu-lane {
border: 0;
background-color: initial;
}
This method depends on used Card
and Lane
components.
const data = {
lanes: [
{
id: 'lane1',
title: 'Planned Tasks',
style: { backgroundColor: 'yellow' }, // Style of Lane
cardStyle: { backgroundColor: 'blue' } // Style of Card
...
};
<Board
style={{backgroundColor: 'red'}} // Style of BoardWrapper
data={data}
/>
Storybook example - stories/Styling.story.js
You can override any of used components (ether one or completery all)
const components = {
GlobalStyle: MyGlobalStyle, // global style created with method `createGlobalStyle` of `styled-components`
LaneHeader: MyLaneHeader,
Card: MyCard,
AddCardLink: MyAddCardLink,
...
};
<Board components={components} />
Total list of customizable components: src/components/index.js
Refer to components definitions to discover their properties list and types.
Refer more examples in storybook.
When defining the board, it is possible to obtain a event hook to the component to publish new events later after the board has been rendered. Refer the example below:
let eventBus = undefined
const setEventBus = (handle) => {
eventBus = handle
}
//To add a card
eventBus.publish({type: 'ADD_CARD', laneId: 'COMPLETED', card: {id: "M1", title: "Buy Milk", label: "15 mins", description: "Also set reminder"}})
//To remove a card
eventBus.publish({type: 'REMOVE_CARD', laneId: 'PLANNED', cardId: "M1"})
//To move a card from one lane to another. index specifies the position to move the card to in the target lane
eventBus.publish({type: 'MOVE_CARD', fromLaneId: 'PLANNED', toLaneId: 'WIP', cardId: 'Plan3', index: 0})
//To update the lanes
eventBus.publish({type: 'UPDATE_LANES', lanes: newLaneData})
<Board data={data} eventBusHandle={setEventBus}/>
The first event in the above example will move the card Buy Milk
from the planned lane to completed lane. We expect that this library can be wired to a backend push api that can alter the state of the board in realtime.
Pass translation function to provide custom or localized texts:
// If your translation table is flat
//
// For example: { 'placeholder.title': 'some text' }
const customTranslation = (key) => TRANSLATION_TABLE[key]
// If your translation table has nested hashes (provided translations table is it)
//
// For example: { 'placeholder': { 'title': 'some text' } }
import { createTranslate } from 'react-trello-menu'
const customTranslation = createTranslate(TRANSLATION_TABLE)
<Board t={customTranslation} .../>
List of available keys - locales/en/translation.json
import { withTranslation } from 'react-i18next';
const I18nBoard = withTranslation()(Board)
Tested to work with following browsers using Browserling:
Pass environment variable REDUX_LOGGING
as true to enable Redux logging in any environment
cd react-trello-menu/
yarn install
yarn run storybook
yarn run lint
: Lint all js filesyarn run lintfix
: fix linting errors of all js filesyarn run semantic-release
: make a release. Leave it for CI to do.yarn run storybook
: Start developing by using storybookyarn run test
: Run tests. tests file should be written as *.test.js
and using ES2015yarn run test:watch
: Watch tests while writingyarn run test:cover
: Show coverage report of your testsyarn run test:report
: Report test coverage to codecov.io. Leave this for CIyarn run build
: transpile all ES6 component files into ES5(commonjs) and put it in dist
directoryyarn run docs
: create static build of storybook in docs
directory that can be used for github pagesLearn how to write stories here
rcdexta |
dapi |
MIT
FAQs
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Browserslist-rs now uses static data to reduce binary size by over 1MB, improving memory use and performance for Rust-based frontend tools.
Research
Security News
Eight new malicious Firefox extensions impersonate games, steal OAuth tokens, hijack sessions, and exploit browser permissions to spy on users.
Security News
The official Go SDK for the Model Context Protocol is in development, with a stable, production-ready release expected by August 2025.