UNPKG

react-choices

Version:

Component to build simple, flexible, and accessible choice components

1 lines 30.2 kB
{"version":3,"file":"index.mjs","sources":["src/utils.js","src/ChoicesDisplay.js","src/withLogic.js","src/actions.js","src/reducer.js","src/Choices.js"],"sourcesContent":["export const KEYCODE = {\n NUMPAD_2: 98,\n NUMPAD_4: 100,\n NUMPAD_6: 102,\n NUMPAD_8: 104,\n\n DOWN: 40,\n LEFT: 37,\n RIGHT: 39,\n UP: 38,\n\n ESC: 27\n}\n\nexport function compose(...funcs) {\n if (funcs.length === 0) {\n return arg => arg\n }\n\n if (funcs.length === 1) {\n return funcs[0]\n }\n\n return funcs.reduce((a, b) => (...args) => a(b(...args)))\n}\n\nexport const whenDifferent = (connectableProps = []) => (props, nextProps) =>\n connectableProps.some(prop => props[prop] !== nextProps[prop])\n","import React from 'react'\nimport cx from 'classnames-es'\n\nconst ChoicesDisplay = ({\n label,\n states,\n disabled,\n readOnly,\n setValue,\n hoverValue,\n previousValue,\n nextValue,\n getContainerProps,\n getContainerLabelProps,\n getItemProps,\n getItemInputProps\n}) => (\n <div\n {...getContainerProps()}\n className={cx('Choices__container', {\n 'Choices__container--disabled': disabled,\n 'Choices__container--readonly': readOnly\n })}\n >\n <div {...getContainerLabelProps()} className=\"Choices__label\">\n {label}\n </div>\n <div className=\"Choices__items\">\n <button onClick={previousValue} disabled={disabled} readOnly={readOnly}>\n {'<'}\n </button>\n {states.map(state => (\n <button\n key={state.key}\n {...getItemProps(state)}\n {...getItemInputProps(state)}\n className={cx('Choices__item', state.inputClassName, {\n 'Choices__item--focused': state.focused,\n 'Choices__item--hovered': state.hovered,\n 'Choices__item--selected': state.selected\n })}\n onMouseOver={hoverValue.bind(null, state.value)}\n onClick={setValue.bind(null, state.value)}\n >\n {state.label}\n </button>\n ))}\n <button onClick={nextValue} disabled={disabled} readOnly={readOnly}>\n {'>'}\n </button>\n </div>\n </div>\n)\n\nexport default ChoicesDisplay\n","import React, { Component } from 'react'\nimport { withRenderProp, withLifecycleStateLogic } from 'conventional-component'\nimport cx from 'classnames-es'\nimport { KEYCODE, whenDifferent } from './utils'\n\nimport { COMPONENT_NAME } from './Choices'\nimport ChoicesDisplay from './ChoicesDisplay'\n\nconst toInputClassName = state =>\n `${[state.blockName, state.name].join('-')}__input-${state.value}`\n\nconst defaultGetKeyCodeHandler = (keyCode, parentInstance) => {\n switch (keyCode) {\n case KEYCODE.NUMPAD_2:\n case KEYCODE.NUMPAD_4:\n case KEYCODE.DOWN:\n case KEYCODE.LEFT:\n return parentInstance.focusPreviousValue\n case KEYCODE.NUMPAD_8:\n case KEYCODE.NUMPAD_6:\n case KEYCODE.UP:\n case KEYCODE.RIGHT:\n return parentInstance.focusNextValue\n case KEYCODE.ESC:\n return parentInstance.resetValue\n default:\n return () => undefined\n }\n}\n\nconst createStates = (props = {}, availableStates = []) => {\n return availableStates.map(availableState => ({\n ...availableState,\n key: `${props.blockName}-${props.name}__item-${availableState.value}`,\n label:\n typeof availableState.label !== 'undefined'\n ? availableState.label\n : availableState.value,\n notSettable: availableState.settable === false,\n focused: availableState.value === props.focusedValue,\n hovered: availableState.value === props.hoveredValue,\n selected:\n availableState.value === (props.selectedValue || props.defaultValue),\n inputClassName: toInputClassName({\n ...availableState,\n blockName: props.blockName,\n name: props.name\n })\n }))\n}\n\nclass EventDetectionContainer extends Component {\n setContainer = ref => (this.container = ref)\n\n keyboardListener = event => {\n const isActiveControl = this.container.contains(document.activeElement)\n\n let handle = () => undefined\n if (isActiveControl) {\n handle = this.props.getKeyCodeHandler(\n event.keyCode,\n this.props.parentInstance\n )\n }\n\n return handle(event)\n }\n\n unfocusWhenOutside = event => {\n const isActiveControl = this.container.contains(document.activeElement)\n if (!isActiveControl) {\n const unfocusValue =\n this.props.unfocusValue || this.props.parentInstance.unfocusValue\n if (unfocusValue) {\n return unfocusValue()\n }\n }\n }\n\n unhoverWhenOutside = event => {\n const unhoverValue =\n this.props.unhoverValue || this.props.parentInstance.unhoverValue\n if (unhoverValue) {\n return unhoverValue()\n }\n }\n\n componentDidMount() {\n document.addEventListener('keydown', this.keyboardListener)\n document.addEventListener('focusin', this.unfocusWhenOutside)\n }\n\n componentWillUnmount() {\n document.removeEventListener('keydown', this.keyboardListener)\n document.removeEventListener('focusin', this.unfocusWhenOutside)\n }\n\n render() {\n const { children } = this.props\n return (\n <div\n className=\"EventDetection-container\"\n ref={this.setContainer}\n onMouseOut={this.unhoverWhenOutside}\n >\n {children}\n </div>\n )\n }\n}\n\nfunction withLogic(Template = ChoicesDisplay) {\n class Choices extends Component {\n static defaultProps = {\n blockName: COMPONENT_NAME\n }\n\n componentWillReceiveProps(nextProps) {\n const hasNewSelectedValue =\n this.props.selectedValue &&\n nextProps.selectedValue !== this.props.selectedValue\n const hasNewFocusedValue = !!nextProps.focusedValue\n if (hasNewSelectedValue) {\n this.focusInputElement(nextProps.selectedValue)\n } else if (hasNewFocusedValue) {\n this.focusInputElement(nextProps.focusedValue)\n }\n }\n\n createClassName = (element, modifier = undefined) =>\n `${this.props.blockName}__${element}` + (modifier ? `--${modifier}` : '')\n\n focusInputElement = value => {\n const el = (document.getElementsByClassName(\n toInputClassName({\n blockName: this.props.blockName,\n name: this.props.name,\n value\n })\n ) || [])[0]\n if (el && this.props.disabled !== true) {\n requestAnimationFrame(() => el.focus())\n }\n }\n\n getContainerProps = () => ({\n className: cx(this.createClassName('container'), {\n [this.createClassName('container', 'disabled')]: this.props.disabled,\n [this.createClassName('container', 'readonly')]: this.props.readOnly\n }),\n role: 'radiogroup',\n 'aria-labelledby': this.createClassName(`label-${this.props.name}`),\n 'aria-activedescendant': this.createClassName(\n `item-${this.props.selectedValue}`\n ),\n 'aria-disabled': this.props.disabled ? 'true' : 'false',\n 'aria-readonly': this.props.readOnly ? 'true' : 'false'\n })\n\n getContainerLabelProps = () => ({\n id: this.createClassName(`label-${this.props.name}`),\n className: this.createClassName('label')\n })\n\n getItemProps = state => ({\n key: state.key,\n id: this.createClassName(`item-${state.value}`),\n className: this.createClassName('item'),\n role: 'radio',\n 'aria-checked': state.selected ? 'true' : 'false'\n })\n\n getItemInputProps = state => ({\n tabIndex: state.selected && this.props.disabled !== true ? 0 : -1,\n className: cx(this.createClassName('item__input'), state.inputClassName),\n disabled: this.props.disabled || false,\n readOnly: this.props.readOnly || false\n })\n\n resetValue = event => {\n event && event.preventDefault()\n if (this.props.readOnly || this.props.disabled) return\n this.props.setValue(this.props.defaultValue)\n }\n\n setValue = (value, event) => {\n event && event.preventDefault()\n if (this.props.readOnly || this.props.disabled) return\n this.props.setValue(value)\n }\n\n unfocusValue = this.setValue.bind(null, undefined)\n\n hoverValue = (value, event) => {\n event && event.preventDefault()\n if (this.props.disabled) return\n this.props.hoverValue(value)\n }\n\n unhoverValue = this.hoverValue.bind(null, undefined)\n\n focusPreviousValue = event => {\n event && event.preventDefault()\n if (this.props.disabled) return\n this.props.previousValue(false)\n }\n\n focusNextValue = event => {\n event && event.preventDefault()\n if (this.props.disabled) return\n this.props.nextValue(false)\n }\n\n previousValue = event => {\n event && event.preventDefault()\n if (this.props.readOnly || this.props.disabled) return\n this.props.previousValue(true)\n }\n\n nextValue = event => {\n event && event.preventDefault()\n if (this.props.readOnly || this.props.disabled) return\n this.props.nextValue(true)\n }\n\n render() {\n const getKeyCodeHandler =\n this.props.getKeyCodeHandler || defaultGetKeyCodeHandler\n\n const templateProps = {\n createClassName: this.createClassName,\n getContainerProps: this.getContainerProps,\n getContainerLabelProps: this.getContainerLabelProps,\n getItemProps: this.getItemProps,\n getItemInputProps: this.getItemInputProps,\n\n name: this.props.name,\n label: this.props.label,\n blockName: this.props.blockName,\n states: createStates(this.props, this.props.availableStates),\n defaultValue: this.props.defaultValue,\n focusedValue: this.props.focusedValue,\n hoveredValue: this.props.hoveredValue,\n selectedValue: this.props.selectedValue,\n disabled: this.props.disabled || false,\n readOnly: this.props.readOnly || false,\n\n resetValue: this.resetValue,\n setValue: this.setValue,\n hoverValue: this.hoverValue,\n previousValue: this.previousValue,\n nextValue: this.nextValue\n }\n\n let children = null\n if (\n typeof this.props.render === 'function' ||\n typeof this.props.children === 'function'\n ) {\n children = withRenderProp({\n ...templateProps,\n render: this.props.render,\n children: this.props.children\n })\n } else if (Template) {\n children = <Template {...templateProps} />\n }\n\n return (\n <EventDetectionContainer\n parentInstance={this}\n getKeyCodeHandler={getKeyCodeHandler}\n unfocusValue={this.unfocusValue}\n unhoverValue={this.unhoverValue}\n >\n {children}\n </EventDetectionContainer>\n )\n }\n }\n\n return withLifecycleStateLogic({\n shouldDispatchReceiveNextProps: whenDifferent([\n 'name',\n 'label',\n 'blockName',\n 'availableStates',\n 'defaultValue',\n 'selectedValue'\n ])\n })(Choices)\n}\n\nexport default withLogic\n","import { withActionIdentity } from 'conventional-component'\n\nconst prefix = 'react-choices'\n\nexport const SET_VALUE = `${prefix}/SET_VALUE`\nexport const HOVER_VALUE = `${prefix}/HOVER_VALUE`\nexport const PREVIOUS_VALUE = `${prefix}/PREVIOUS_VALUE`\nexport const NEXT_VALUE = `${prefix}/NEXT_VALUE`\n\nexport const setValue = withActionIdentity(value => ({\n type: SET_VALUE,\n payload: value\n}))\n\nexport const hoverValue = withActionIdentity(value => ({\n type: HOVER_VALUE,\n payload: value\n}))\n\nexport const previousValue = withActionIdentity((shouldSelect = false) => ({\n type: PREVIOUS_VALUE,\n payload: { shouldSelect }\n}))\n\nexport const nextValue = withActionIdentity((shouldSelect = false) => ({\n type: NEXT_VALUE,\n payload: { shouldSelect }\n}))\n","import { INIT, RECEIVE_NEXT_PROPS } from 'conventional-component'\nimport { SET_VALUE, PREVIOUS_VALUE, NEXT_VALUE, HOVER_VALUE } from './actions'\n\nconst REDUCER_NAME = 'choices'\n\nconst initialState = {\n name: undefined,\n label: undefined,\n blockName: undefined,\n availableStates: [],\n defaultValue: undefined,\n focusedValue: undefined,\n hoveredValue: undefined,\n selectedValue: undefined\n}\n\nconst firstValue = (availableStates = []) => (availableStates[0] || {}).value\n\nconst isSettable = state => state.settable !== false\n\nconst getPreviousValue = state => {\n const currentValue = state.focusedValue || state.selectedValue\n const currentStateIndex = state.availableStates.findIndex(\n as => as.value === currentValue\n )\n\n if (currentStateIndex > 0) {\n let previousSettableIndex = -1\n for (let idx = state.availableStates.length; idx >= 0; idx--) {\n if (idx < currentStateIndex && isSettable(state.availableStates[idx])) {\n previousSettableIndex = idx\n break\n }\n }\n\n if (previousSettableIndex !== -1) {\n return state.availableStates[previousSettableIndex].value\n }\n }\n\n return undefined\n}\n\nconst getNextValue = state => {\n const currentValue = state.focusedValue || state.selectedValue\n const currentStateIndex = state.availableStates.findIndex(\n as => as.value === currentValue\n )\n\n if (currentStateIndex < state.availableStates.length - 1) {\n let nextSettableIndex = -1\n for (let idx = 0; idx < state.availableStates.length; idx++) {\n if (idx > currentStateIndex && isSettable(state.availableStates[idx])) {\n nextSettableIndex = idx\n break\n }\n }\n\n if (nextSettableIndex !== -1) {\n return state.availableStates[nextSettableIndex].value\n }\n }\n\n return undefined\n}\n\nconst reducer = (state = initialState, action) => {\n switch (action.type) {\n case INIT: {\n const availableStates = action.payload.availableStates\n return {\n ...state,\n name: action.payload.name,\n label: action.payload.label,\n blockName: action.payload.blockName,\n availableStates,\n defaultValue: action.payload.defaultValue,\n selectedValue:\n action.payload.defaultValue || firstValue(availableStates)\n }\n }\n case RECEIVE_NEXT_PROPS: {\n return {\n ...state,\n name: action.payload.name,\n label: action.payload.label,\n blockName: action.payload.blockName,\n availableStates: action.payload.availableStates,\n defaultValue: action.payload.defaultValue,\n selectedValue: action.payload.selectedValue\n }\n }\n case PREVIOUS_VALUE: {\n const { shouldSelect } = action.payload\n const previousValue = getPreviousValue(state)\n\n if (previousValue) {\n if (shouldSelect) {\n return {\n ...state,\n selectedValue: previousValue,\n focusedValue: previousValue\n }\n } else {\n return { ...state, focusedValue: previousValue }\n }\n }\n\n return state\n }\n case NEXT_VALUE: {\n const { shouldSelect } = action.payload\n const nextValue = getNextValue(state)\n\n if (nextValue) {\n if (shouldSelect) {\n return { ...state, selectedValue: nextValue, focusedValue: nextValue }\n } else {\n return { ...state, focusedValue: nextValue }\n }\n }\n\n return state\n }\n case SET_VALUE: {\n const value = action.payload\n const availableState = state.availableStates.find(\n as => as.value === value\n )\n\n if (availableState && isSettable(availableState)) {\n return { ...state, selectedValue: value, focusedValue: value }\n } else if (value === undefined) {\n return { ...state, focusedValue: undefined }\n }\n\n return state\n }\n case HOVER_VALUE: {\n const value = action.payload\n const availableState = state.availableStates.find(\n as => as.value === value\n )\n\n if (availableState) {\n return { ...state, hoveredValue: action.payload }\n } else if (value === undefined) {\n return { ...state, hoveredValue: undefined }\n }\n\n return state\n }\n default:\n return state\n }\n}\n\nexport { initialState, REDUCER_NAME, getPreviousValue, getNextValue }\nexport default reducer\n","import { connectToState } from 'conventional-component'\nimport { compose } from './utils'\n\nimport ChoicesDisplay from './ChoicesDisplay'\nimport withLogic from './withLogic'\nimport reducer from './reducer'\nimport * as actions from './actions'\n\nconst COMPONENT_NAME = 'Choices'\nconst COMPONENT_KEY = 'name'\n\nconst enhance = compose(connectToState(reducer, actions), withLogic)\n\nconst Choices = enhance(ChoicesDisplay)\n\nexport { COMPONENT_NAME, COMPONENT_KEY }\nexport default Choices\n"],"names":["KEYCODE","compose","funcs","length","arg","reduce","a","b","whenDifferent","connectableProps","props","nextProps","some","prop","ChoicesDisplay","label","states","disabled","readOnly","setValue","hoverValue","previousValue","nextValue","getContainerProps","getContainerLabelProps","getItemProps","getItemInputProps","cx","map","state","key","inputClassName","focused","hovered","selected","bind","value","toInputClassName","blockName","name","join","defaultGetKeyCodeHandler","keyCode","parentInstance","NUMPAD_2","NUMPAD_4","DOWN","LEFT","focusPreviousValue","NUMPAD_8","NUMPAD_6","UP","RIGHT","focusNextValue","ESC","resetValue","undefined","createStates","availableStates","availableState","settable","focusedValue","hoveredValue","selectedValue","defaultValue","EventDetectionContainer","setContainer","container","ref","keyboardListener","isActiveControl","contains","document","activeElement","handle","getKeyCodeHandler","event","unfocusWhenOutside","unfocusValue","unhoverWhenOutside","unhoverValue","addEventListener","removeEventListener","children","Component","withLogic","Template","Choices","createClassName","element","modifier","focusInputElement","el","getElementsByClassName","focus","preventDefault","hasNewSelectedValue","hasNewFocusedValue","templateProps","render","withRenderProp","defaultProps","COMPONENT_NAME","withLifecycleStateLogic","prefix","SET_VALUE","HOVER_VALUE","PREVIOUS_VALUE","NEXT_VALUE","withActionIdentity","shouldSelect","REDUCER_NAME","initialState","firstValue","isSettable","getPreviousValue","currentValue","currentStateIndex","findIndex","as","previousSettableIndex","idx","getNextValue","nextSettableIndex","reducer","action","type","INIT","payload","RECEIVE_NEXT_PROPS","find","COMPONENT_KEY","enhance","connectToState","actions"],"mappings":"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"}