UNPKG

react-dropdown-tree-select

Version:

Lightweight, customizable and fast Dropdown Tree Select component for React

186 lines (173 loc) 8.73 kB
// tslint:disable:interface-name declare module 'react-dropdown-tree-select' { import * as React from 'react' export type TreeData = Object | TreeNodeProps[] export type Mode = 'multiSelect' | 'simpleSelect' | 'radioSelect' | 'hierarchical' export type ShowDropdownState = 'default' | 'initial' | 'always' 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 /** Keeps single selects open after selection. Defaults to `false` * NOTE this works only in combination with simpleSelect or radioSelect */ keepOpenOnSelect?: boolean /** Texts to override output for */ texts?: TextProps /** If set to initial, shows the dropdown when first rendered. * If set to always, shows the dropdown when rendered, and keeps it visible at all times. Toggling dropdown is disabled. */ showDropdown?: ShowDropdownState /** 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?: (currentNode: TreeNode, currentAction: NodeAction) => 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 /** Defines how the dropdown is rendered / behaves * * - multiSelect * A multi selectable dropdown which supports tree data with parent-child relationships. This is the default mode. * * - hierarchical * A multi selectable dropdown which supports tree data **without** parent-child relationships. In this mode, selecting a node has no ripple effects on its descendants or ancestors. Subsequently, `showPartiallySelected` becomes a moot flag and has no effect as well. * * ⚠️ Note that `hierarchical=true` negates/overrides `showPartiallySelected`. * * - simpleSelect * Turns the dropdown into a simple, single select dropdown. If you pass tree data, only immediate children are picked, grandchildren nodes are ignored. * * ⚠️ If multiple nodes in data are selected - by setting either `checked` or `isDefaultValue`, only the first visited node stays selected. * * - radioSelect * Turns the dropdown into radio select dropdown. * Like `simpleSelect`, you can only select one value; but keeps the tree/children structure. * * ⚠️ If multiple nodes in data are selected - by setting either `checked` or `isDefaultValue`, only the first visited node stays selected. * * * */ mode?: Mode /** 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 /** 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 /** Optional search predicate to override the default case insensitive contains match on node labels. */ searchPredicate?: (currentNode: TreeNode, searchTerm: string) => boolean /** inlineSearchInput=true Makes the search input renders inside the dropdown-content. Defaults to `false` */ inlineSearchInput?: boolean /** disablePoppingOnBackspace=true indicates that when a user triggers a 'backspace' keyDown in the empty * search bar, the tree will not deselect nodes. */ disablePoppingOnBackspace?: boolean } export interface DropdownTreeSelectState { showDropdown: ShowDropdownState 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?: TreeNode[] } export interface TextProps { /** The text to display as placeholder on the search box. Defaults to Choose... */ placeholder?: string /** The text to display as placeholder on the inline search box. Only applicable with the `inlineSearchInput` setting. Defaults to `Search...` */ inlineSearchPlaceholder?: string /** The text to display when the search does not find results in the content list. Defaults to No matches found */ noMatches?: string /** Adds `aria-labelledby` to search input when input starts with `#`, adds `aria-label` to search input when label has value (not containing '#') */ label?: string /** The text to display for `aria-label` on tag delete buttons which is combined with `aria-labelledby` pointing to the node label. Defaults to `Remove */ labelRemove?: string } 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 NodeDataSet { [property: string]: any } }