Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
ellinge committed Mar 31, 2019
2 parents 366d639 + 528b38f commit 0b4804c
Show file tree
Hide file tree
Showing 8 changed files with 176 additions and 13 deletions.
21 changes: 17 additions & 4 deletions README.md
Expand Up @@ -151,8 +151,8 @@ const data = {
const onChange = (currentNode, selectedNodes) => {
console.log('onChange::', currentNode, selectedNodes)
}
const onAction = ({ action, node }) => {
console.log(`onAction:: [${action}]`, node)
const onAction = ({ action, id }) => {
console.log(`onAction:: [${action}]`, id)
}
const onNodeToggle = currentNode => {
console.log('onNodeToggle::', currentNode)
Expand Down Expand Up @@ -211,6 +211,20 @@ function onNodeToggle(currentNode) {
return <DropdownTreeSelect data={data} onNodeToggle={onNodeToggle} />
```

### onAction

Type: `function`

Fires when a action is triggered. Example:

```jsx
function onAction({action, id}) {
console.log(`onAction:: [${action}]`, id)
}

return <DropdownTreeSelect data={data} onAction={onAction} />
```

### onFocus

Type: `function`
Expand Down Expand Up @@ -251,7 +265,6 @@ The `action` object requires the following structure:
```js
{
className, // required: CSS class for the node. e.g. `fa fa-info`
onAction, // required: Fired on click of the action. The event handler receives `action` object as well as the `node` object.
title, // optional: HTML tooltip text
text, // optional: Any text to be displayed. This is helpful to pass ligatures if you're using ligature fonts
... // optional: Any extra properties that you'd like to receive during `onChange` event
Expand Down Expand Up @@ -315,7 +328,7 @@ Type: `bool` (default: `false`)

Type: `string`

Specific id for container. The container renders with a default id of `rdtsN` where N is count of the current component rendered.
Specific id for container. The container renders with a default id of `rdtsN` where N is the count of the current component rendered.

Use to ensure a own unique id when a simple counter is not sufficient, e.g in a partial server render (SSR)

Expand Down
4 changes: 2 additions & 2 deletions docs/src/stories/BigData/index.js
Expand Up @@ -8,8 +8,8 @@ import bigData from './big-data.json'
const onChange = (curNode, selectedNodes) => {
console.log('onChange::', curNode, selectedNodes)
}
const onAction = ({ action, node }) => {
console.log(`onAction:: [${action}]`, node)
const onAction = ({ action, id }) => {
console.log(`onAction:: [${action}]`, id)
}
const onNodeToggle = curNode => {
console.log('onNodeToggle::', curNode)
Expand Down
4 changes: 2 additions & 2 deletions docs/src/stories/DefaultValues/index.js
Expand Up @@ -9,8 +9,8 @@ import data from './data.json'
const onChange = (curNode, selectedNodes) => {
console.log('onChange::', curNode, selectedNodes)
}
const onAction = ({ action, node }) => {
console.log(`onAction:: [${action}]`, node)
const onAction = ({ action, id }) => {
console.log(`onAction:: [${action}]`, id)
}
const onNodeToggle = curNode => {
console.log('onNodeToggle::', curNode)
Expand Down
4 changes: 2 additions & 2 deletions docs/src/stories/Options/index.js
Expand Up @@ -25,8 +25,8 @@ class WithOptions extends PureComponent {
onChange = (curNode, selectedNodes) => {
console.log('onChange::', curNode, selectedNodes)
}
onAction = ({ action, node }) => {
console.log(`onAction:: [${action}]`, node)
onAction = ({ action, id }) => {
console.log(`onAction:: [${action}]`, id)
}
onNodeToggle = curNode => {
console.log('onNodeToggle::', curNode)
Expand Down
4 changes: 2 additions & 2 deletions docs/src/stories/Simple/index.js
Expand Up @@ -8,8 +8,8 @@ import data from './data.json'
const onChange = (curNode, selectedNodes) => {
console.log('onChange::', curNode, selectedNodes)
}
const onAction = ({ action, node }) => {
console.log(`onAction:: [${action}]`, node)
const onAction = ({ action, id }) => {
console.log(`onAction:: [${action}]`, id)
}
const onNodeToggle = curNode => {
console.log('onNodeToggle::', curNode)
Expand Down
2 changes: 2 additions & 0 deletions package.json
Expand Up @@ -19,6 +19,7 @@
"search"
],
"main": "dist/react-dropdown-tree-select.js",
"types": "dist/react-dropdown-tree-select.d.ts",
"repository": "https://github.com/dowjones/react-dropdown-tree-select.git",
"author": "Hrusikesh Panda <hrusikesh.panda@dowjones.com>",
"license": "MIT",
Expand Down Expand Up @@ -65,6 +66,7 @@
"babel-preset-stage-0": "6.24.1",
"commitizen": "^2.9.6",
"conventional-changelog-cli": "^2.0.5",
"copy-webpack-plugin": "^5.0.1",
"coveralls": "^3.0.0",
"cross-env": "^5.0.5",
"css-loader": "^0.28.0",
Expand Down
144 changes: 144 additions & 0 deletions types/react-dropdown-tree-select.d.ts
@@ -0,0 +1,144 @@
// tslint:disable:interface-name
declare module "react-dropdown-tree-select" {
import * as React from "react";

export type TreeData = Object | TreeNodeProps[];

export interface DropdownTreeSelectProps {
data: TreeData;
/** Clear the input search if a node has been selected/unselected */
clearSearchOnChange?: boolean;
/** Displays search results as a tree instead of flattened results */
keepTreeOnSearch?: boolean;
/** Displays children of found nodes to allow searching for a parent node on
* then selecting any child node of the found node. Defaults to false
* NOTE this works only in combination with keepTreeOnSearch
*/
keepChildrenOnSearch?: boolean;
/** The text to display as placeholder on the search box. Defaults to Choose... */
placeholderText?: string;
/** If set to true, shows the dropdown when rendered.
* This can be used to render the component with the dropdown open as its initial state
*/
showDropdown?: boolean;
/** Additional classname for container.
* The container renders with a default classname of react-dropdown-tree-select
*/
className?: string;
/** Fires when a node change event occurs. Currently the following actions trigger a node change:
* Checkbox click which checks/unchecks the item
* Closing of pill (which unchecks the corresponding checkbox item)
*
* Calls the handler with the current node object and all selected nodes (if any)
*/
onChange?: (currentNode: TreeNode, selectedNodes: TreeNode[]) => void;
/** Fired on click of the action */
onAction?: (event: ActionEvent) => void;
/** Fires when a node is expanded or collapsed.
* Calls the handler with the current node object
*/
onNodeToggle?: (currentNode: TreeNode) => void;
/** Fires when input box receives focus or the dropdown arrow is clicked.
* This is helpful for setting dirty or touched flags with forms
*/
onFocus?: () => void;
/** Fires when input box loses focus or the dropdown arrow is clicked again (and the dropdown collapses).
* This is helpful for setting dirty or touched flags with forms
*/
onBlur?: () => void;
/** Turns the dropdown into a simple, single select dropdown.
* If you pass tree data, only immediate children are picked, grandchildren nodes are ignored.
* Defaults to false
*/
simpleSelect?: boolean;
/** The text to display when the search does not find results in the content list. Defaults to No matches found */
noMatchesText?: string;
/** If set to true, shows checkboxes in a partial state when one, but not all of their children are selected.
* Allows styling of partially selected nodes as well, by using :indeterminate pseudo class.
* Simply add desired styles to .node.partial .checkbox-item:indeterminate { ... } in your CSS
*/
showPartiallySelected?: boolean;
/** disabled=true disables the dropdown completely. This is useful during form submit events */
disabled?: boolean;
/** readOnly=true makes the dropdown read only,
* which means that the user can still interact with it but cannot change any of its values.
* This can be useful for display only forms
*/
readOnly?: boolean;
hierarchical?: boolean;
/** Specific id for container. The container renders with a default id of `rdtsN` where N is count of the current component rendered
* Use to ensure a own unique id when a simple counter is not sufficient, e.g in a partial server render (SSR)
*/
id?: string;
}

export interface DropdownTreeSelectState {
showDropdown: boolean;
searchModeOn: boolean;
allNodesHidden: boolean;
tree: TreeNode[];
tags: TreeNode[];
}

export default class DropdownTreeSelect extends React.Component<DropdownTreeSelectProps, DropdownTreeSelectState> {
node: HTMLDivElement;
searchInput: HTMLInputElement;
keepDropdownActive: boolean;
handleClick(): void;
}

export interface TreeNode {
/** Checkbox label */
label: string;
/** Checkbox value */
value: string;
/** Initial state of checkbox. if true, checkbox is selected and corresponding pill is rendered. */
checked?: boolean;
/** Selectable state of checkbox. if true, the checkbox is disabled and the node is not selectable. */
disabled?: boolean;
/** If true, the node is expanded
* (children of children nodes are not expanded by default unless children nodes also have expanded: true).
*/
expanded?: boolean;
/** Additional css class for the node. This is helpful to style the nodes your way */
className?: string;
/** Css class for the corresponding tag. Use this to add custom style the pill corresponding to the node. */
tagClassName?: string;
/** An array of extra action on the node (such as displaying an info icon or any custom icons/elements) */
actions?: NodeAction[];
/** Allows data-* attributes to be set on the node and tag elements */
dataset?: NodeDataSet;
/** Indicate if a node is a default value.
* When true, the dropdown will automatically select the node(s) when there is no other selected node.
* Can be used on more than one node.
*/
isDefaultValue?: boolean;
/** Any extra properties that you'd like to receive during `onChange` event */
[property: string]: any;
}

export interface TreeNodeProps extends TreeNode {
/** Array of child objects */
children?: Node[];
}

export interface NodeAction {
/** CSS class for the node. e.g. `fa fa-info` */
className: string;
/** HTML tooltip text */
title?: string;
/** Any text to be displayed. This is helpful to pass ligatures if you're using ligature fonts */
text?: string;
/** Any extra properties that you'd like to receive during `onChange` event */
[property: string]: any;
}

export interface ActionEvent {
action: string;
id: string;
}

export interface NodeDataSet {
[property: string]: any;
}
}
6 changes: 5 additions & 1 deletion webpack.config.js
@@ -1,6 +1,7 @@
const path = require('path')
const webpack = require('webpack')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const CopyPlugin = require('copy-webpack-plugin')
const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer')

module.exports = {
Expand Down Expand Up @@ -34,7 +35,10 @@ module.exports = {
analyzerMode: 'static',
openAnalyzer: false,
generateStatsFile: true
})
}),
new CopyPlugin([
{ from: path.join(__dirname, 'types'), to: path.join(__dirname, 'dist') }
])
],
module: {
rules: [
Expand Down

0 comments on commit 0b4804c

Please sign in to comment.