diff --git a/internal_packages/N1-Scheduler/package.json b/internal_packages/N1-Scheduler/package.json index 0b4cebc21..dd42bdf45 100644 --- a/internal_packages/N1-Scheduler/package.json +++ b/internal_packages/N1-Scheduler/package.json @@ -17,9 +17,6 @@ }, "icon": "./icon.png", "isOptional": true, - "dependencies": { - "moment-round": "^1.0" - }, "windowTypes": { "default": true, "composer": true, diff --git a/internal_packages/N1-Scheduler/stylesheets/scheduler.less b/internal_packages/N1-Scheduler/stylesheets/scheduler.less index 8e6ab14d6..3cb97f0e7 100644 --- a/internal_packages/N1-Scheduler/stylesheets/scheduler.less +++ b/internal_packages/N1-Scheduler/stylesheets/scheduler.less @@ -33,6 +33,7 @@ color: @text-color; } .row { + position: relative; display: flex; align-items: baseline; padding: 10px 0; @@ -60,6 +61,7 @@ } } .row.time { + z-index: 10; // So the time pickers show over .time-picker { text-align: center; } diff --git a/src/components/time-picker.jsx b/src/components/time-picker.jsx index cb95c2594..40534329c 100644 --- a/src/components/time-picker.jsx +++ b/src/components/time-picker.jsx @@ -1,8 +1,11 @@ import React from 'react' import ReactDOM from 'react-dom' import moment from 'moment' +require('moment-round') // overrides moment import classnames from 'classnames' +const INTERVAL = [30, 'minutes'] + export default class TimePicker extends React.Component { static displayName = "TimePicker"; @@ -29,26 +32,54 @@ export default class TimePicker extends React.Component { } } + componentDidMount() { + this._fixTimeOptionScroll() + } + componentWillReceiveProps(newProps) { this.setState({rawText: this._valToTimeString(newProps.value)}) } + componentDidUpdate() { + if (this._gotoScrollStartOnUpdate) { + this._fixTimeOptionScroll() + } + } + _valToTimeString(value) { return moment(value).format("LT") } _onKeyDown = (event) => { if (event.key === "ArrowUp") { - // TODO: When `renderTimeOptions` is implemented + event.preventDefault() + this._onArrow(event.key) } else if (event.key === "ArrowDown") { - // TODO: When `renderTimeOptions` is implemented + event.preventDefault() + this._onArrow(event.key) } else if (event.key === "Enter") { this.context.parentTabGroup.shiftFocus(1); } } + _onArrow(key) { + let newT = moment(this.props.value); + newT = newT.round.apply(newT, INTERVAL); + if (key === "ArrowUp") { + newT = newT.subtract.apply(newT, INTERVAL); + } else if (key === "ArrowDown") { + newT = newT.add.apply(newT, INTERVAL); + } + if (moment(this.props.value).day() !== newT.day()) { + return + } + this._gotoScrollStartOnUpdate = true + this.props.onChange(newT); + } + _onFocus = () => { this.setState({focused: true}); + this._gotoScrollStartOnUpdate = true const el = ReactDOM.findDOMNode(this.refs.input); el.setSelectionRange(0, el.value.length) } @@ -83,26 +114,86 @@ export default class TimePicker extends React.Component { if (simpleDigitMatch && simpleDigitMatch.length > 0) { const hr = parseInt(simpleDigitMatch[1], 10); if (hr <= 7) { - // If you're going to punch in "2" into the time field, you - // probably mean 2pm, not 2am. return true } } return false } - // TODO - _renderTimeOptions() { - // TODO: When you select a time a dropdown will additionally show - // letting you pick from preset times. The `relativeTo` prop will give - // you relative times - const opts = [] - if (this.state.focused) { - return ( -