UNPKG

ldx-widgets

Version:

widgets

271 lines (218 loc) 7.28 kB
React = require 'react' PropTypes = require 'prop-types' createClass = require 'create-react-class' _ = require 'lodash' moment = require 'moment' DatePicker = React.createFactory(require '../date_picker') SelectInput2 = React.createFactory(require '../select_input_2') {div, label, span} = React.DOM ###& @general - This component passes all props forward to datepicker, see datepicker component for it's props. @props.formLabel - OPTIONAL - [string] The value of the label that will display to the left of the input @props.className - OPTIONAL - [string] - default 'grid grid-pad' optional class to be added the main div @props.labelColumnClass - OPTIONAL - [string] optional class that will be added to the label column @props.inputColumnClass - OPTIONAL - [string] optional class that will be added to the input column @props.isFieldRequired - OPTIONAL - [boolean] optional boolean that will display the red asterisk if true @props.fullRow - OPTIONAL - [boolean] optional boolean that will determine whether to display the input in a full row with or without a label @props.enableTime - OPTIONAL - [boolean] includes the time picker @props.children - OPTIONAL - [array] optional array of children &### GridFormDatePicker = createClass displayName: 'GridFormDatePicker' propTypes: formLabel: PropTypes.string className: PropTypes.string labelColumnClass: PropTypes.string inputColumnClass: PropTypes.string isFieldRequired: PropTypes.bool fullRow: PropTypes.bool enableTime: PropTypes.bool twentyFourHour: PropTypes.bool selected: PropTypes.object minutes: PropTypes.array AmPm: PropTypes.array isInPopover: PropTypes.bool disabled: PropTypes.bool onChange: PropTypes.func timeColumns: PropTypes.number returnDateString: PropTypes.string getDefaultProps: -> labelColumnClass: 'col-3-12' inputColumnClass: 'col-9-12' className: 'grid grid-pad' isFieldRequired: no fullRow: yes enableTime: no twentyFourHour: no minutes: [0,15,30,45] AmPm: ['am', 'pm'] isInPopover: no disabled: no timeColumns: 2 render: -> {formLabel, className, labelColumnClass, inputColumnClass, inputTextClass, isFieldRequired, selected, fullRow, enableTime, twentyFourHour, tabId, children, isInPopover, tabIndex, disabled, onChange} = @props if formLabel? labelClass = 'form-label' if isFieldRequired then labelClass += ' is-required' labelField = div { key: 'label' className: labelColumnClass }, label {className: labelClass}, formLabel # we do not want to pass the className down as it will mess up the styles inputProps = _.omit(_.assign({}, @props, {ref: 'input'}), ['className']) input = DatePicker inputProps if enableTime classes = @getCellClasses(inputColumnClass) {hour, minute, ampm} = @parseTime(selected) inputCell = [ div { key: 'picker' className: classes[0] }, input div { key: 'time1' className: classes[1] }, [ SelectInput2 { ref: 'hour' key: 'hour' tabId: tabId wrapperClass: 'hour' value: hour or '' options: do @getHourOptions onChange: onChange disabled: disabled isInPopover: isInPopover tabIndex: tabIndex } span { key: 'divide' className: 'time-divide' }, ':' SelectInput2 { ref: 'minute' key: 'minute' wrapperClass: 'minutes' tabId: tabId value: minute or '' options: do @getMinuteOptions onChange: onChange disabled: disabled isInPopover: isInPopover tabIndex: tabIndex } SelectInput2 { ref: 'ampm' key: 'ampm' wrapperClass: 'ampm' tabId: tabId value: ampm or '' options: do @getAmPmOptions onChange: onChange disabled: disabled isInPopover: isInPopover tabIndex: tabIndex } unless twentyFourHour ] ] else inputCell = div { key: 'input' className: inputColumnClass }, input # This is a full row of a form with a label if fullRow and formLabel? content = [ labelField inputCell ].concat children div { className: className }, content # This is a full row w/ out a label else if fullRow content = [ inputCell ].concat children div { className: className }, content # This is a single cell within a row else inputCell getValue: -> {enableTime, returnDateString, twentyFourHour} = @props timestamp = @refs.input.getValue() return timestamp unless enableTime minute = @refs.minute.getValue() hour = @refs.hour.getValue() ampm = @refs.ampm?.getValue() or '' # When returnDateString is passed the datepicker will return a string instead of a moment object # in this case momentize it before extracting the time if returnDateString? date = moment(timestamp, returnDateString).format('YYYYMMDD') rv = moment("#{date}#{hour}#{minute}#{ampm}", if twentyFourHour then 'YYYYMMDDHHmm' else 'YYYYMMDDhmma') rv.format(returnDateString) else date = timestamp.format('YYYYMMDD') moment("#{date}#{hour}#{minute}#{ampm}", if twentyFourHour then 'YYYYMMDDHHmm' else 'YYYYMMDDhmma') parseTime: (timestamp) -> return {} unless timestamp? {twentyFourHour, returnDateString} = @props # When returnDateString is passed the datepicker will return a string instead of a moment object # in this case momentize it before extracting the time timestamp = if returnDateString? then moment(timestamp, returnDateString) else timestamp { hour: timestamp.format(if twentyFourHour then 'HH' else 'h') minute: timestamp.format('mm') ampm: timestamp.format('a') } getHourOptions: -> {twentyFourHour} = @props if not twentyFourHour hourOptions = [{ label: '12' value: '12' }] hourOptions.push( label: hour value: hour ) for hour in [1..11] hourOptions else { label: if hour < 10 then "0#{hour}" else hour value: if hour < 10 then "0#{hour}" else hour } for hour in [0..23] getMinuteOptions: -> {minutes} = @props { label: if minute < 10 then "0#{minute}" else minute value: if minute < 10 then "0#{minute}" else minute } for minute in minutes getAmPmOptions: -> {AmPm} = @props { label: opt value: opt } for opt in AmPm getCellClasses: (inputColumnClass) -> {timeColumns} = @props classSplit = inputColumnClass.split('-') dateCol = classSplit[1] colCount = classSplit[2] [ "col-#{dateCol - timeColumns}-#{colCount}" "col-#{timeColumns}-#{colCount}" ] module.exports = GridFormDatePicker