UNPKG

ldx-widgets

Version:

widgets

220 lines (183 loc) 6.27 kB
React = require 'react' {Flux} = require 'delorean' Input = React.createFactory(require './input_placeholder') Spinner = React.createFactory(require './spinner') InputMixin = require '../mixins/input_mixin' {div, button, label} = React.DOM ### Input Props @props.value - REQUIRED - String The value of the input w/ out this props, the input will not work @props.onChange - REQUIRED method that will change the value of the input prop gets passed a single param that is the new value of the input w/ out this method, the input will not update @props.className - OPTIONAL - string - default 'text-input' optional class to be added the input element itself @props.id - OPTIONAL - string - default null optional id to be added the input element itself @props.placeholder - OPTIONAL - string - default null optional placeholder text for the input @props.wrapperClass - OPTIONAL - string default null class to be added to the wrapper div @props.wrapperLabel - OPTIONAL - default null text for wrapping label element @props.loading - OPTIONAL - Boolean indicator to determine that the input is loading a value from the server @props.showClear - OPTIONAL - Boolean indicator to determine whether or not to show the clear "X" button @props.tabIndex - OPTIONAL - int - default null tab index for the input @props.maxLength - OPTIONAL - int - default null max characters that can be entered in the input @props.onKeyDown/onKeyPress/onKeyUp/onEnterKey/onBlur/onFocus optional handlers for various events @props.disabled - OPTIONAL - Boolean - default no disabled state of the input @props.validation - OPTIONAL - Function a method that takes the value and returns an arry of validation objects always return an empty array for a valid value see the validation store for more documentation on validation objects @props.isInPopover - OPTIONAL - default no set this to yes if the form is inside a popover or modal, forces the validation to display above the popover/modal layer Inconsequential if validation is not being used @props.delayedActionOnChange - OPTIONAL - Object Takes action and interval parameters, will fire the action after the set interval everytime the data changes @props.textTransform - OPTIONAL - Function runs the value through a transform method that will change the input before returning via getValue() @props.focusOnMount - OPTIONAL - Boolean Focuses the input once mounted ### TextInput2 = React.createClass displayName: 'TextInput2' mixins: [Flux.mixins.storeListener, InputMixin] watchStores: ['validation'] propTypes: type: React.PropTypes.string className: React.PropTypes.string textTransform: React.PropTypes.func focusOnMount: React.PropTypes.bool delayedActionOnChange: React.PropTypes.object tabIndex: React.PropTypes.number maxLength: React.PropTypes.number disabled: React.PropTypes.bool onChange: React.PropTypes.func onKeyDown: React.PropTypes.func onKeyUp: React.PropTypes.func onKeyPress: React.PropTypes.func style: React.PropTypes.object autoComplete: React.PropTypes.oneOfType [ React.PropTypes.string React.PropTypes.bool ] placeholder: React.PropTypes.oneOfType [ React.PropTypes.string React.PropTypes.number ] value: React.PropTypes.oneOfType [ React.PropTypes.string React.PropTypes.number ] id: React.PropTypes.oneOfType [ React.PropTypes.string React.PropTypes.number ] getDefaultProps: -> type: 'text' className: 'text-input' id: null placeholder: '' wrapperClass: null wrapperLabel: null loading: no showClear: no tabIndex: null maxLength: null onKeyDown: null onKeyPress: null onFocus: null onBlur: null onKeyUp: null onEnterKey: null onChange: null disabled: no autoComplete: no validation: off isInPopover: no delayedActionOnChange: null spellCheck: false style: null focusOnMount: false render: -> {value, placeholder, tabIndex, className, maxLength, loading, type, showClear, onKeyDown, onKeyPress, onBlur, onFocus, wrapperClass, wrapperLabel, id, disabled, validation, autoComplete, spellCheck, style, focusOnMount} = @props {errors, forceShowAllErrors} = @getStore 'validation' {valueHasChanged} = @state isValid = not errors[@inputId]? outerClass = 'field-wrap' outerClass += " #{wrapperClass}" if wrapperClass? outerClass += ' invalid' if not isValid and (valueHasChanged or forceShowAllErrors) inputClass = 'loading-spinner' inputClass += " #{className}" if className? errorButtonClass = 'field-errors-show' errorButtonClass += ' is-hidden' if loading # Autocomplete autoComplete = switch typeof autoComplete when 'string' then autoComplete when 'boolean' if autoComplete then 'on' else 'off' input = Input { key: 'textInput' ref: 'input' id: id className: inputClass type: type value: value placeholder: placeholder maxLength: maxLength disabled: disabled tabIndex: tabIndex onChange: @handleChange onKeyUp: @handleKeyUp onKeyDown: onKeyDown onKeyPress: onKeyPress onBlur: onBlur onFocus: onFocus autoComplete: autoComplete spellCheck: spellCheck } # Add a wrapper label element if label prop is present if wrapperLabel input = label { key: 'textInputLabel' }, [wrapperLabel, input] div { className: "#{outerClass}" style: style }, [ input div({ key: 'input-spinner' className: 'input-spinner' }, Spinner { length: 3 } ) if loading button { className: 'search-clear' title: 'Clear Search' key: 'searchClearBtn' onClick: @clear tabIndex: -1 } if value?.length > 0 and showClear div { className: errorButtonClass key: 'textInputErrorsShow' ref: 'errorAnchor' onMouseOver: @handleErrorMouseOver onMouseOut: @handleErrorMouseOut } ] module.exports = TextInput2