From 774a7fb5c17e817859576a97de28989da005d173 Mon Sep 17 00:00:00 2001 From: andreaci Date: Fri, 1 Mar 2019 10:19:56 +0100 Subject: [PATCH 01/31] added disableTime and disableDateBox props --- .gitignore | 3 + package.json | 111 ++--- src/Wrapper.jsx | 261 ++++++----- src/lib/DateTimeRangeContainer.jsx | 226 ++++----- src/lib/DateTimeRangePicker.jsx | 730 +++++++++++++++-------------- src/lib/date_picker/DatePicker.jsx | 105 ++--- 6 files changed, 737 insertions(+), 699 deletions(-) diff --git a/.gitignore b/.gitignore index 4d29575..a4d548c 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,6 @@ npm-debug.log* yarn-debug.log* yarn-error.log* +dist/ +node_modules/ +package-lock.json diff --git a/package.json b/package.json index 3b2174a..b6db1f5 100644 --- a/package.json +++ b/package.json @@ -1,57 +1,58 @@ { - "name": "react-advanced-datetimerange-picker", - "version": "0.1.10", - "license": "GNU", - "main": "dist/index.js", - "module": "dist/index.js", - "files": [ - "dist", - "README.md" - ], - "repository": { - "type": "git", - "url": "https://github.com/v0ltoz/react-datetimepicker" - }, - "jest": { - "collectCoverageFrom": [ - "**/src/lib/utils/*.{js,jsx}", - "**/src/lib/calendar/*.{js,jsx}", - "!**/node_modules/**", - "!**/vendor/**" - ] - }, - "dependencies": { - "moment": "2.22.2", - "prop-types": "15.6.2", - "react-bootstrap": "0.31.3", - "react-dot-fragment": "0.2.7", - "react-moment-proptypes": "1.6.0", - "react-scripts": "2.1.1" - }, - "scripts": { - "start": "react-scripts start", - "build": "rm -rf dist && NODE_ENV=production babel src/lib --out-dir dist --copy-files --ignore __tests__,spec.js,test.js,__snapshots__", - "test": "react-scripts test" - }, - "eslintConfig": { - "extends": "react-app" - }, - "browserslist": [ - ">0.2%", - "not dead", - "not ie <= 11", - "not op_mini all" - ], - "devDependencies": { - "@babel/cli": "^7.1.5", - "@babel/core": "^7.1.6", - "@babel/preset-env": "^7.1.6", - "@babel/preset-react": "^7.0.0", - "babel-loader": "^8.0.4", - "enzyme": "^3.7.0", - "enzyme-adapter-react-15": "^1.1.1", - "react": "15.6.2", - "react-dom": "15.6.2", - "react-test-renderer": "^15.6.2" - } + "name": "react-advanced-datetimerange-picker", + "version": "0.1.10", + "license": "GNU", + "main": "dist/index.js", + "module": "dist/index.js", + "files": [ + "dist", + "README.md" + ], + "repository": { + "type": "git", + "url": "https://github.com/v0ltoz/react-datetimepicker" + }, + "jest": { + "collectCoverageFrom": [ + "**/src/lib/utils/*.{js,jsx}", + "**/src/lib/calendar/*.{js,jsx}", + "!**/node_modules/**", + "!**/vendor/**" + ] + }, + "dependencies": { + "moment": "2.22.2", + "prop-types": "15.6.2", + "react-bootstrap": "0.31.3", + "react-dot-fragment": "0.2.7", + "react-moment-proptypes": "1.6.0", + "react-scripts": "2.1.1" + }, + "scripts": { + "start": "react-scripts start", + "build-win": "if exist dist rmdir /s dist && set NODE_ENV=production && .\\node_modules\\.bin\\babel src\\lib --out-dir dist --copy-files --ignore __tests__,spec.js,test.js,__snapshots__", + "build": "rm -rf dist && NODE_ENV=production babel src/lib --out-dir dist --copy-files --ignore __tests__,spec.js,test.js,__snapshots__", + "test": "react-scripts test" + }, + "eslintConfig": { + "extends": "react-app" + }, + "browserslist": [ + ">0.2%", + "not dead", + "not ie <= 11", + "not op_mini all" + ], + "devDependencies": { + "@babel/cli": "^7.1.5", + "@babel/core": "^7.1.6", + "@babel/preset-env": "^7.1.6", + "@babel/preset-react": "^7.0.0", + "babel-loader": "^8.0.4", + "enzyme": "^3.7.0", + "enzyme-adapter-react-15": "^1.1.1", + "react": "15.6.2", + "react-dom": "15.6.2", + "react-test-renderer": "^15.6.2" + } } diff --git a/src/Wrapper.jsx b/src/Wrapper.jsx index ba116bf..53c4146 100644 --- a/src/Wrapper.jsx +++ b/src/Wrapper.jsx @@ -1,128 +1,155 @@ import React from 'react'; -import DateTimeRangeContainer from './lib/index' -import {FormControl, Grid, Row, Col} from 'react-bootstrap' -import moment from "moment" +import DateTimeRangeContainer from './lib/index'; +import { FormControl, Grid, Row, Col } from 'react-bootstrap'; +import moment from 'moment'; class Wrapper extends React.Component { + constructor(props) { + super(props); + let now = new Date(); + let start = moment(new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0, 0)); + let end = moment(start) + .add(1, 'days') + .subtract(1, 'seconds'); + start = moment(start) + .subtract(34, 'months') + .subtract(1, 'seconds'); + end = moment(start) + .add(5, 'days') + .add(); + this.state = { + start: start, + end: end + }; - constructor(props){ - super(props); - let now = new Date(); - let start = moment(new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0,0,0,0)); - let end = moment(start).add(1, "days").subtract(1, "seconds"); - start = moment(start).subtract(34, "months").subtract(1, "seconds"); - end = moment(start).add(5, "days").add(); - this.state = { - start : start, - end : end - } + this.onClick = this.onClick.bind(this); + this.applyCallback = this.applyCallback.bind(this); + } - this.onClick = this.onClick.bind(this); - this.applyCallback = this.applyCallback.bind(this); - } + applyCallback(startDate, endDate) { + // console.log("Apply Callback"); + // console.log(startDate.format("DD-MM-YYYY HH:mm")); + // console.log(endDate.format("DD-MM-YYYY HH:mm")); + this.setState({ + start: startDate, + end: endDate + }); + } - applyCallback(startDate, endDate){ - // console.log("Apply Callback"); - // console.log(startDate.format("DD-MM-YYYY HH:mm")); - // console.log(endDate.format("DD-MM-YYYY HH:mm")); - this.setState( - { - start: startDate, - end : endDate - } - ) - } + onClick() { + let newStart = moment(this.state.start).subtract(3, 'days'); + // console.log("On Click Callback"); + // console.log(newStart.format("DD-MM-YYYY HH:mm")); + this.setState({ start: newStart }); + } - onClick(){ - let newStart = moment(this.state.start).subtract(3, "days"); - // console.log("On Click Callback"); - // console.log(newStart.format("DD-MM-YYYY HH:mm")); - this.setState({start : newStart}) - } + renderContainerNoGrid(ranges, local, maxDate) { + return ( +
+ + + +
Click Me to test change state here and updating picker
+
+ ); + } - renderContainerNoGrid(ranges, local, maxDate){ - return( -
- - - -
- Click Me to test change state here and updating picker -
-
- ) - } + renderGrid(ranges, local, maxDate) { + return ( + + + 1 + + + + + + + 3 + + + + ); + } + renderDisableTime(ranges, local, maxDate) { + return ( + + + 1 + + + + + + + 3 + + + + ); + } + renderDisableDateBox(ranges, local, maxDate) { + return ( + + + 1 + + + + + + + 3 + + + + ); + } - renderGrid(ranges, local, maxDate){ - return( - - - - 1 - - - - - - - - 3 - - - - ) - } + render() { + let now = new Date(); + let start = moment(new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0, 0)); + let end = moment(start) + .add(1, 'days') + .subtract(1, 'seconds'); + let ranges = { + 'Today Only': [moment(start), moment(end)], + 'Yesterday Only': [moment(start).subtract(1, 'days'), moment(end).subtract(1, 'days')], + '3 Days': [moment(start).subtract(3, 'days'), moment(end)], + '5 Days': [moment(start).subtract(5, 'days'), moment(end)], + '1 Week': [moment(start).subtract(7, 'days'), moment(end)], + '2 Weeks': [moment(start).subtract(14, 'days'), moment(end)], + '1 Month': [moment(start).subtract(1, 'months'), moment(end)], + '90 Days': [moment(start).subtract(90, 'days'), moment(end)], + '1 Year': [moment(start).subtract(1, 'years'), moment(end)] + }; + let local = { + format: 'DD-MM-YYYY HH:mm', + sundayFirst: false + }; + let maxDate = moment(start).add(24, 'hour'); + return ( +
+

renderContainerNoGrid

+ {this.renderContainerNoGrid(ranges, local, maxDate)} - render(){ - let now = new Date(); - let start = moment(new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0,0,0,0)); - let end = moment(start).add(1, "days").subtract(1, "seconds"); - let ranges = { - "Today Only": [moment(start), moment(end)], - "Yesterday Only": [moment(start).subtract(1, "days"), moment(end).subtract(1, "days")], - "3 Days": [moment(start).subtract(3, "days"), moment(end)], - "5 Days": [moment(start).subtract(5, "days"), moment(end)], - "1 Week": [moment(start).subtract(7, "days"), moment(end)], - "2 Weeks": [moment(start).subtract(14, "days"), moment(end)], - "1 Month": [moment(start).subtract(1, "months"), moment(end)], - "90 Days": [moment(start).subtract(90, "days"), moment(end)], - "1 Year": [moment(start).subtract(1, "years"), moment(end)], - } - let local = { - "format":"DD-MM-YYYY HH:mm", - "sundayFirst" : false - } - let maxDate = moment(start).add(24, "hour") - return( -
- {this.renderContainerNoGrid(ranges, local, maxDate)} - {this.renderGrid(ranges, local, maxDate)} - {this.renderContainerNoGrid(ranges, local, maxDate)} -
- ); - } +

renderGrid

+ {this.renderGrid(ranges, local, maxDate)} + +

renderContainerNoGrid

+ {this.renderContainerNoGrid(ranges, local, maxDate)} + +

renderDisableTime

+ {this.renderDisableTime(ranges, local, maxDate)} + +

renderDisableDateBox

+ {this.renderDisableDateBox(ranges, local, maxDate)} +
+ ); + } } -export {Wrapper}; \ No newline at end of file +export { Wrapper }; + +const h1style = { marginTop: 50, borderTop: '1px solid gray' }; + +const divstyle = { padding: 30 }; diff --git a/src/lib/DateTimeRangeContainer.jsx b/src/lib/DateTimeRangeContainer.jsx index b9d1331..dc1a14b 100644 --- a/src/lib/DateTimeRangeContainer.jsx +++ b/src/lib/DateTimeRangeContainer.jsx @@ -1,129 +1,137 @@ import React from 'react'; -import { findDOMNode } from "react-dom"; -import './style/DateTimeRange.css' +import { findDOMNode } from 'react-dom'; +import './style/DateTimeRange.css'; import { DateTimeRangePicker } from './DateTimeRangePicker'; import PropTypes from 'prop-types'; import momentPropTypes from 'react-moment-proptypes'; export const mobileBreakPoint = 680; class DateTimeRangeContainer extends React.Component { - constructor(props){ - super(props); - this.state = { - visible: false, - x : 0, - y : 0, - screenWidthToTheRight : 0 - } - this.resize = this.resize.bind(this); - this.onClickContainerHandler= this.onClickContainerHandler.bind(this); - this.handleOutsideClick = this.handleOutsideClick.bind(this); - this.changeVisibleState = this.changeVisibleState.bind(this); - this.keyDown = this.keyDown.bind(this); - } + constructor(props) { + super(props); + this.state = { + visible: false, + x: 0, + y: 0, + screenWidthToTheRight: 0 + }; + this.resize = this.resize.bind(this); + this.onClickContainerHandler = this.onClickContainerHandler.bind(this); + this.handleOutsideClick = this.handleOutsideClick.bind(this); + this.changeVisibleState = this.changeVisibleState.bind(this); + this.keyDown = this.keyDown.bind(this); + } - componentDidMount(){ - window.addEventListener('resize', this.resize); - document.addEventListener("keydown", this.keyDown, false); - this.resize(); - } + componentDidMount() { + window.addEventListener('resize', this.resize); + document.addEventListener('keydown', this.keyDown, false); + this.resize(); + } - componentWillMount(){ - window.removeEventListener('resize', this.resize); - document.removeEventListener("keydown", this.keyDown, false); - } + componentWillMount() { + window.removeEventListener('resize', this.resize); + document.removeEventListener('keydown', this.keyDown, false); + } - resize(){ - const domNode = findDOMNode(this).children[0]; - let boundingClientRect = domNode.getBoundingClientRect(); - let widthRightOfThis = window.innerWidth - boundingClientRect.x; - if(widthRightOfThis < mobileBreakPoint){ - // If in small mode put picker in middle of child - let childMiddle = boundingClientRect.width / 2; - let containerMiddle = 144; - let newY = childMiddle - containerMiddle; - this.setState({x:boundingClientRect.height + 5, y:newY, screenWidthToTheRight:widthRightOfThis}); - }else{ - this.setState({x:boundingClientRect.height + 5, y:0, screenWidthToTheRight:widthRightOfThis}); - } - } + resize() { + const domNode = findDOMNode(this).children[0]; + let boundingClientRect = domNode.getBoundingClientRect(); + let widthRightOfThis = window.innerWidth - boundingClientRect.x; + if (widthRightOfThis < mobileBreakPoint) { + // If in small mode put picker in middle of child + let childMiddle = boundingClientRect.width / 2; + let containerMiddle = 144; + let newY = childMiddle - containerMiddle; + this.setState({ x: boundingClientRect.height + 5, y: newY, screenWidthToTheRight: widthRightOfThis }); + } else { + this.setState({ x: boundingClientRect.height + 5, y: 0, screenWidthToTheRight: widthRightOfThis }); + } + } - keyDown(e){ - if (e.keyCode === 27) { - this.setState({visible:false}); - document.removeEventListener("keydown", this.keyDown, false); - } - } + keyDown(e) { + if (e.keyCode === 27) { + this.setState({ visible: false }); + document.removeEventListener('keydown', this.keyDown, false); + } + } - onClickContainerHandler(event){ - if(!this.state.visible){ - document.addEventListener('click', this.handleOutsideClick, false); - document.addEventListener("keydown", this.keyDown, false); - this.changeVisibleState(); - } - } + onClickContainerHandler(event) { + if (!this.state.visible) { + document.addEventListener('click', this.handleOutsideClick, false); + document.addEventListener('keydown', this.keyDown, false); + this.changeVisibleState(); + } + } - handleOutsideClick(e) { - // ignore clicks on the component itself - if(this.state.visible){ - if (this.container.contains(e.target)) { - return; - } - document.removeEventListener('click', this.handleOutsideClick, false); - this.changeVisibleState(); - } - } + handleOutsideClick(e) { + // ignore clicks on the component itself + if (this.state.visible) { + if (this.container.contains(e.target)) { + return; + } + document.removeEventListener('click', this.handleOutsideClick, false); + this.changeVisibleState(); + } + } - changeVisibleState(){ - this.setState(prevState => ({ - visible: !prevState.visible, - })); - } + changeVisibleState() { + this.setState(prevState => ({ + visible: !prevState.visible + })); + } - shouldShowPicker(){ - if(this.state.visible && this.state.screenWidthToTheRight < mobileBreakPoint){ - return "block" - } else if(this.state.visible){ - return "flex" - }else { - return "none" - } - } - - render(){ - let showPicker = this.shouldShowPicker(); - let x = this.state.x; - let y = this.state.y; - return ( -
{ this.container = container; }}> - {this.props.children && -
- {this.props.children} -
} -
- -
-
- ) - } + shouldShowPicker() { + if (this.state.visible && this.state.screenWidthToTheRight < mobileBreakPoint) { + return 'block'; + } else if (this.state.visible) { + return 'flex'; + } else { + return 'none'; + } + } + + render() { + let showPicker = this.shouldShowPicker(); + let x = this.state.x; + let y = this.state.y; + return ( +
{ + this.container = container; + }} + > + {this.props.children &&
{this.props.children}
} +
+ +
+
+ ); + } } DateTimeRangeContainer.propTypes = { - ranges: PropTypes.object.isRequired, - start: momentPropTypes.momentObj, - end: momentPropTypes.momentObj, - local: PropTypes.object.isRequired, - applyCallback: PropTypes.func.isRequired, - maxDate: momentPropTypes.momentObj + ranges: PropTypes.object.isRequired, + start: momentPropTypes.momentObj, + end: momentPropTypes.momentObj, + local: PropTypes.object.isRequired, + applyCallback: PropTypes.func.isRequired, + maxDate: momentPropTypes.momentObj, + disableTime: PropTypes.bool, + disableDateBox: PropTypes.bool }; -export default DateTimeRangeContainer; \ No newline at end of file +export default DateTimeRangeContainer; diff --git a/src/lib/DateTimeRangePicker.jsx b/src/lib/DateTimeRangePicker.jsx index 87a685c..794b4ed 100644 --- a/src/lib/DateTimeRangePicker.jsx +++ b/src/lib/DateTimeRangePicker.jsx @@ -1,369 +1,371 @@ import React from 'react'; -import './style/DateTimeRange.css' -import Ranges from "./ranges/Ranges" -import DatePicker from "./date_picker/DatePicker" -import Fragment from 'react-dot-fragment' -import moment from "moment" -import {isValidTimeChange} from './utils/TimeFunctionUtils' -import {datePicked, pastMaxDate} from './utils/DateSelectedUtils' +import './style/DateTimeRange.css'; +import Ranges from './ranges/Ranges'; +import DatePicker from './date_picker/DatePicker'; +import Fragment from 'react-dot-fragment'; +import moment from 'moment'; +import { isValidTimeChange } from './utils/TimeFunctionUtils'; +import { datePicked, pastMaxDate } from './utils/DateSelectedUtils'; -export const ModeEnum = Object.freeze({"start":"start", "end":"end"}); -export var momentFormat = "DD-MM-YYYY HH:mm"; +export const ModeEnum = Object.freeze({ start: 'start', end: 'end' }); +export var momentFormat = 'DD-MM-YYYY HH:mm'; class DateTimeRangePicker extends React.Component { - constructor(props){ - super(props); - let ranges = {} - let customRange = {"Custom Range": "Custom Range"} - Object.assign(ranges, this.props.ranges, customRange); - - if(this.props.local && this.props.local.format){ - momentFormat = this.props.local.format; - } - - this.state = { - selectedRange: 0, - selectingModeFrom: true, - ranges : ranges, - start: this.props.start, - startLabel: this.props.start.format(momentFormat), - end: this.props.end, - endLabel: this.props.end.format(momentFormat), - focusDate : false - } - this.bindToFunctions(); - } - - bindToFunctions(){ - this.rangeSelectedCallback = this.rangeSelectedCallback.bind(this); - this.dateSelectedNoTimeCallback = this.dateSelectedNoTimeCallback.bind(this); - this.timeChangeCallback = this.timeChangeCallback.bind(this); - this.dateTextFieldCallback = this.dateTextFieldCallback.bind(this); - this.onChangeDateTextHandlerCallback = this.onChangeDateTextHandlerCallback.bind(this); - this.changeSelectingModeCallback = this.changeSelectingModeCallback.bind(this); - this.applyCallback = this.applyCallback.bind(this); - this.keyboardCellCallback = this.keyboardCellCallback.bind(this); - this.focusOnCallback = this.focusOnCallback.bind(this); - this.cellFocusedCallback = this.cellFocusedCallback.bind(this); - } - - componentDidMount(){ - this.setToRangeValue(this.state.start, this.state.end) - } - - componentDidUpdate(prevProps){ - if(!this.props.start.isSame(prevProps.start)){ - this.updateStartEndAndLabels(this.props.start, this.state.end); - } - else if(!this.props.end.isSame(prevProps.end)){ - this.updateStartEndAndLabels(this.state.start, this.props.end); - } - } - - applyCallback(){ - this.props.applyCallback(this.state.start, this.state.end); - this.props.changeVisibleState(); - } - - rangeSelectedCallback(index, value){ - // If Past Max Date Dont allow update - let start; - let end; - if(value !== "Custom Range"){ - start = this.state.ranges[value][0]; - end = this.state.ranges[value][1]; - if(pastMaxDate(start, this.props.maxDate, true) || pastMaxDate(end, this.props.maxDate, true)){ - return false; - } - } - // Else update state to new selected index and update start and end time - this.setState({selectedRange:index}); - if(value !== "Custom Range"){ - this.updateStartEndAndLabels(start, end); - } - } - - setToRangeValue(startDate, endDate){ - let rangesArray = Object.values(this.state.ranges) - for(let i = 0; i < rangesArray.length; i++){ - if(rangesArray[i] === "Custom Range"){ - continue; - }else if(rangesArray[i][0].isSame(startDate, "minutes") && rangesArray[i][1].isSame(endDate, "minutes")){ - this.setState({selectedRange:i}); - return; - } - } - this.setToCustomRange(); - } - - setToCustomRange(){ - let rangesArray = Object.values(this.state.ranges) - for(let i = 0; i < rangesArray.length; i++){ - if(rangesArray[i] === "Custom Range"){ - this.setState({selectedRange:i}); - } - } - } - - updateStartEndAndLabels(newStart, newEnd){ - this.setState({ - start : newStart, - startLabel: newStart.format(momentFormat), - end: newEnd, - endLabel: newEnd.format(momentFormat) - }); - } - - dateSelectedNoTimeCallback(cellDate){ - let newDates = datePicked(this.state.start, this.state.end, cellDate, this.state.selectingModeFrom) - let startDate = newDates.startDate; - let endDate = newDates.endDate; - let newStart = this.duplicateMomentTimeFromState(startDate, true); - let newEnd = this.duplicateMomentTimeFromState(endDate, false); - this.updateStartEndAndLabels(newStart, newEnd); - this.setToRangeValue(newStart, newEnd); - this.setState((prevState) => ({ - selectingModeFrom: !prevState.selectingModeFrom - })) - } - - changeSelectingModeCallback(selectingModeFromParam){ - this.setState({selectingModeFrom: selectingModeFromParam}); - } - - duplicateMomentTimeFromState(date, startDate){ - let state; - if(startDate){ - state = this.state.start; - }else{ - state = this.state.end; - } - let newDate = [date.year(), date.month(), date.date(), state.hours(), state.minutes()] - return moment(newDate); - } - - timeChangeCallback(newHour, newMinute, mode){ - if(mode === "start"){ - this.updateStartTime(newHour, newMinute, mode); - }else if(mode === "end"){ - this.updateEndTime(newHour, newMinute, mode); - } - } - - updateStartTime(newHour, newMinute, mode){ - this.updateTime(this.state.start, newHour, newMinute, mode, "start", "startLabel") - } - - updateEndTime(newHour, newMinute, mode){ - this.updateTime(this.state.end, newHour, newMinute, mode, "end", "endLabel") - } - - updateTime(origDate, newHour, newMinute, mode, stateDateToChangeName, stateLabelToChangeName){ - let date = moment(origDate); - date.hours(newHour); - date.minutes(newMinute); - // If Past Max Date Dont allow update - if(pastMaxDate(date, this.props.maxDate, true)){ - return false - } - // If Valid Time Change allow the change else set new start and end times - // to be minute ahead/behind the new date - if(isValidTimeChange(mode, date, this.state.start, this.state.end)){ - this.setState({ - [stateDateToChangeName]:date, - [stateLabelToChangeName]: date.format(momentFormat) - }); - this.updateTimeCustomRangeUpdator(stateDateToChangeName, date); - }else{ - let newDate = moment(date); - if(mode === "start"){ - newDate.add(1, "minute"); - this.updateStartEndAndLabels(date, newDate) - this.setToRangeValue(date, newDate); - }else{ - newDate.subtract(1, "minute"); - this.updateStartEndAndLabels(newDate, date); - this.setToRangeValue(newDate, date); - } - } - } - - updateTimeCustomRangeUpdator(stateDateToChangeName, date){ - if(stateDateToChangeName === "start"){ - this.setToRangeValue(date, this.state.end); - }else{ - this.setToRangeValue(this.state.start, date); - } - } - - dateTextFieldCallback(mode){ - if(mode === "start"){ - let newDate = moment(this.state.startLabel, momentFormat) - let isValidNewDate = newDate.isValid(); - let isSameOrBeforeEnd = newDate.isSameOrBefore(this.state.end, "minute"); - let isAfterEndDate = newDate.isAfter(this.state.end); - this.updateDate(mode, newDate, isValidNewDate, isSameOrBeforeEnd, isAfterEndDate, "start", "startLabel") - }else{ - let newDate = moment(this.state.endLabel, momentFormat) - let isValidNewDate = newDate.isValid(); - let isBeforeStartDate = newDate.isBefore(this.state.start); - let isSameOrAfterStartDate = newDate.isSameOrAfter(this.state.start, "minute"); - this.updateDate(mode, newDate, isValidNewDate, isSameOrAfterStartDate, isBeforeStartDate, "end", "endLabel") - } - } - - updateDate(mode, newDate, isValidNewDate, isValidDateChange, isInvalidDateChange, stateDateToChangeName, stateLabelToChangeName){ - // If new date past max date dont allow change - if(pastMaxDate(newDate, this.props.maxDate, true)){ - this.updateStartEndAndLabels(this.state.start, this.state.end); - return false - } - // Else if date valid and date change valid update the date, - // if date invalid go into update invalid mode, adds/subtract 1 days from start/stop value - if(isValidNewDate && isValidDateChange){ - this.setState({ - [stateDateToChangeName]: newDate, - [stateLabelToChangeName]: newDate.format(momentFormat) - }); - this.updateTimeCustomRangeUpdator(stateDateToChangeName, newDate); - }else if(isValidNewDate && isInvalidDateChange){ - this.updateInvalidDate(mode, newDate); - }else if(!isValidNewDate){ - this.updateStartEndAndLabels(this.state.start, this.state.end); - } - } - - updateInvalidDate(mode, newDate){ - if(mode === "start"){ - let newEndDate = moment(newDate).add(1, "day"); - this.updateLabelsAndRangeValues(newDate, newEndDate); - }else{ - let newStartDate = moment(newDate).subtract(1, "day"); - this.updateStartEndAndLabels(newStartDate, newDate); - } - } - - updateLabelsAndRangeValues(startDate, endDate){ - this.updateStartEndAndLabels(startDate, endDate); - this.setToRangeValue(startDate, endDate); - } - - onChangeDateTextHandlerCallback(newValue, mode){ - if(mode === "start"){ - this.setState({ - startLabel: newValue - }) - }else if(mode === "end"){ - this.setState({ - endLabel: newValue - }) - } - } - - keyboardCellCallback(originalDate, newDate){ - let startDate; - let endDate; - if(originalDate.isSame(this.state.start, "day")){ - startDate = this.duplicateMomentTimeFromState(newDate, true); - endDate = moment(this.state.end); - }else{ - startDate = moment(this.state.start); - endDate = this.duplicateMomentTimeFromState(newDate, false);; - } - - if(startDate.isBefore(endDate, "day")){ - this.updateStartEndAndLabels(startDate, endDate); - }else{ - this.updateStartEndAndLabels(endDate, startDate); - } - } - - focusOnCallback(date){ - if(date){ - this.setState({ - focusDate : date - }) - }else{ - this.setState({ - focusDate: false - }) - } - } - - cellFocusedCallback(date){ - if(date.isSame(this.state.start, "day")){ - this.changeSelectingModeCallback(true); - }else if(date.isSame(this.state.end, "day")){ - this.changeSelectingModeCallback(false); - } - } - - renderStartDate(){ - return( - - ) - } - - renderEndDate(){ - return( - - ) - } - - render(){ - - return ( - - - {this.renderStartDate()} - {this.renderEndDate()} - - ) - } + constructor(props) { + super(props); + let ranges = {}; + let customRange = { 'Custom Range': 'Custom Range' }; + Object.assign(ranges, this.props.ranges, customRange); + + if (this.props.local && this.props.local.format) { + momentFormat = this.props.local.format; + } + + this.state = { + selectedRange: 0, + selectingModeFrom: true, + ranges: ranges, + start: this.props.start, + startLabel: this.props.start.format(momentFormat), + end: this.props.end, + endLabel: this.props.end.format(momentFormat), + focusDate: false + }; + this.bindToFunctions(); + } + + bindToFunctions() { + this.rangeSelectedCallback = this.rangeSelectedCallback.bind(this); + this.dateSelectedNoTimeCallback = this.dateSelectedNoTimeCallback.bind(this); + this.timeChangeCallback = this.timeChangeCallback.bind(this); + this.dateTextFieldCallback = this.dateTextFieldCallback.bind(this); + this.onChangeDateTextHandlerCallback = this.onChangeDateTextHandlerCallback.bind(this); + this.changeSelectingModeCallback = this.changeSelectingModeCallback.bind(this); + this.applyCallback = this.applyCallback.bind(this); + this.keyboardCellCallback = this.keyboardCellCallback.bind(this); + this.focusOnCallback = this.focusOnCallback.bind(this); + this.cellFocusedCallback = this.cellFocusedCallback.bind(this); + } + + componentDidMount() { + this.setToRangeValue(this.state.start, this.state.end); + } + + componentDidUpdate(prevProps) { + if (!this.props.start.isSame(prevProps.start)) { + this.updateStartEndAndLabels(this.props.start, this.state.end); + } else if (!this.props.end.isSame(prevProps.end)) { + this.updateStartEndAndLabels(this.state.start, this.props.end); + } + } + + applyCallback() { + this.props.applyCallback(this.state.start, this.state.end); + this.props.changeVisibleState(); + } + + rangeSelectedCallback(index, value) { + // If Past Max Date Dont allow update + let start; + let end; + if (value !== 'Custom Range') { + start = this.state.ranges[value][0]; + end = this.state.ranges[value][1]; + if (pastMaxDate(start, this.props.maxDate, true) || pastMaxDate(end, this.props.maxDate, true)) { + return false; + } + } + // Else update state to new selected index and update start and end time + this.setState({ selectedRange: index }); + if (value !== 'Custom Range') { + this.updateStartEndAndLabels(start, end); + } + } + + setToRangeValue(startDate, endDate) { + let rangesArray = Object.values(this.state.ranges); + for (let i = 0; i < rangesArray.length; i++) { + if (rangesArray[i] === 'Custom Range') { + continue; + } else if (rangesArray[i][0].isSame(startDate, 'minutes') && rangesArray[i][1].isSame(endDate, 'minutes')) { + this.setState({ selectedRange: i }); + return; + } + } + this.setToCustomRange(); + } + + setToCustomRange() { + let rangesArray = Object.values(this.state.ranges); + for (let i = 0; i < rangesArray.length; i++) { + if (rangesArray[i] === 'Custom Range') { + this.setState({ selectedRange: i }); + } + } + } + + updateStartEndAndLabels(newStart, newEnd) { + this.setState({ + start: newStart, + startLabel: newStart.format(momentFormat), + end: newEnd, + endLabel: newEnd.format(momentFormat) + }); + } + + dateSelectedNoTimeCallback(cellDate) { + let newDates = datePicked(this.state.start, this.state.end, cellDate, this.state.selectingModeFrom); + let startDate = newDates.startDate; + let endDate = newDates.endDate; + let newStart = this.duplicateMomentTimeFromState(startDate, true); + let newEnd = this.duplicateMomentTimeFromState(endDate, false); + this.updateStartEndAndLabels(newStart, newEnd); + this.setToRangeValue(newStart, newEnd); + this.setState(prevState => ({ + selectingModeFrom: !prevState.selectingModeFrom + })); + } + + changeSelectingModeCallback(selectingModeFromParam) { + this.setState({ selectingModeFrom: selectingModeFromParam }); + } + + duplicateMomentTimeFromState(date, startDate) { + let state; + if (startDate) { + state = this.state.start; + } else { + state = this.state.end; + } + let newDate = [date.year(), date.month(), date.date(), state.hours(), state.minutes()]; + return moment(newDate); + } + + timeChangeCallback(newHour, newMinute, mode) { + if (mode === 'start') { + this.updateStartTime(newHour, newMinute, mode); + } else if (mode === 'end') { + this.updateEndTime(newHour, newMinute, mode); + } + } + + updateStartTime(newHour, newMinute, mode) { + this.updateTime(this.state.start, newHour, newMinute, mode, 'start', 'startLabel'); + } + + updateEndTime(newHour, newMinute, mode) { + this.updateTime(this.state.end, newHour, newMinute, mode, 'end', 'endLabel'); + } + + updateTime(origDate, newHour, newMinute, mode, stateDateToChangeName, stateLabelToChangeName) { + let date = moment(origDate); + date.hours(newHour); + date.minutes(newMinute); + // If Past Max Date Dont allow update + if (pastMaxDate(date, this.props.maxDate, true)) { + return false; + } + // If Valid Time Change allow the change else set new start and end times + // to be minute ahead/behind the new date + if (isValidTimeChange(mode, date, this.state.start, this.state.end)) { + this.setState({ + [stateDateToChangeName]: date, + [stateLabelToChangeName]: date.format(momentFormat) + }); + this.updateTimeCustomRangeUpdator(stateDateToChangeName, date); + } else { + let newDate = moment(date); + if (mode === 'start') { + newDate.add(1, 'minute'); + this.updateStartEndAndLabels(date, newDate); + this.setToRangeValue(date, newDate); + } else { + newDate.subtract(1, 'minute'); + this.updateStartEndAndLabels(newDate, date); + this.setToRangeValue(newDate, date); + } + } + } + + updateTimeCustomRangeUpdator(stateDateToChangeName, date) { + if (stateDateToChangeName === 'start') { + this.setToRangeValue(date, this.state.end); + } else { + this.setToRangeValue(this.state.start, date); + } + } + + dateTextFieldCallback(mode) { + if (mode === 'start') { + let newDate = moment(this.state.startLabel, momentFormat); + let isValidNewDate = newDate.isValid(); + let isSameOrBeforeEnd = newDate.isSameOrBefore(this.state.end, 'minute'); + let isAfterEndDate = newDate.isAfter(this.state.end); + this.updateDate(mode, newDate, isValidNewDate, isSameOrBeforeEnd, isAfterEndDate, 'start', 'startLabel'); + } else { + let newDate = moment(this.state.endLabel, momentFormat); + let isValidNewDate = newDate.isValid(); + let isBeforeStartDate = newDate.isBefore(this.state.start); + let isSameOrAfterStartDate = newDate.isSameOrAfter(this.state.start, 'minute'); + this.updateDate(mode, newDate, isValidNewDate, isSameOrAfterStartDate, isBeforeStartDate, 'end', 'endLabel'); + } + } + + updateDate(mode, newDate, isValidNewDate, isValidDateChange, isInvalidDateChange, stateDateToChangeName, stateLabelToChangeName) { + // If new date past max date dont allow change + if (pastMaxDate(newDate, this.props.maxDate, true)) { + this.updateStartEndAndLabels(this.state.start, this.state.end); + return false; + } + // Else if date valid and date change valid update the date, + // if date invalid go into update invalid mode, adds/subtract 1 days from start/stop value + if (isValidNewDate && isValidDateChange) { + this.setState({ + [stateDateToChangeName]: newDate, + [stateLabelToChangeName]: newDate.format(momentFormat) + }); + this.updateTimeCustomRangeUpdator(stateDateToChangeName, newDate); + } else if (isValidNewDate && isInvalidDateChange) { + this.updateInvalidDate(mode, newDate); + } else if (!isValidNewDate) { + this.updateStartEndAndLabels(this.state.start, this.state.end); + } + } + + updateInvalidDate(mode, newDate) { + if (mode === 'start') { + let newEndDate = moment(newDate).add(1, 'day'); + this.updateLabelsAndRangeValues(newDate, newEndDate); + } else { + let newStartDate = moment(newDate).subtract(1, 'day'); + this.updateStartEndAndLabels(newStartDate, newDate); + } + } + + updateLabelsAndRangeValues(startDate, endDate) { + this.updateStartEndAndLabels(startDate, endDate); + this.setToRangeValue(startDate, endDate); + } + + onChangeDateTextHandlerCallback(newValue, mode) { + if (mode === 'start') { + this.setState({ + startLabel: newValue + }); + } else if (mode === 'end') { + this.setState({ + endLabel: newValue + }); + } + } + + keyboardCellCallback(originalDate, newDate) { + let startDate; + let endDate; + if (originalDate.isSame(this.state.start, 'day')) { + startDate = this.duplicateMomentTimeFromState(newDate, true); + endDate = moment(this.state.end); + } else { + startDate = moment(this.state.start); + endDate = this.duplicateMomentTimeFromState(newDate, false); + } + + if (startDate.isBefore(endDate, 'day')) { + this.updateStartEndAndLabels(startDate, endDate); + } else { + this.updateStartEndAndLabels(endDate, startDate); + } + } + + focusOnCallback(date) { + if (date) { + this.setState({ + focusDate: date + }); + } else { + this.setState({ + focusDate: false + }); + } + } + + cellFocusedCallback(date) { + if (date.isSame(this.state.start, 'day')) { + this.changeSelectingModeCallback(true); + } else if (date.isSame(this.state.end, 'day')) { + this.changeSelectingModeCallback(false); + } + } + + renderStartDate() { + return ( + + ); + } + + renderEndDate() { + return ( + + ); + } + + render() { + return ( + + + {this.renderStartDate()} + {this.renderEndDate()} + + ); + } } -export {DateTimeRangePicker}; \ No newline at end of file +export { DateTimeRangePicker }; diff --git a/src/lib/date_picker/DatePicker.jsx b/src/lib/date_picker/DatePicker.jsx index 548e9cd..72e91d3 100644 --- a/src/lib/date_picker/DatePicker.jsx +++ b/src/lib/date_picker/DatePicker.jsx @@ -1,59 +1,56 @@ import React from 'react'; -import '../style/DateTimeRange.css' -import "../style/DateTimeRange.css" -import Label from './Label' -import DateField from './DateField' -import TimeField from './TimeField' -import Calendar from '../calendar/Calendar' -import ApplyCancelButtons from './ApplyCancelButtons' -import ActiveNotifier from './ActiveNotifier' -import moment from 'moment' +import '../style/DateTimeRange.css'; +import '../style/DateTimeRange.css'; +import Label from './Label'; +import DateField from './DateField'; +import TimeField from './TimeField'; +import Calendar from '../calendar/Calendar'; +import ApplyCancelButtons from './ApplyCancelButtons'; +import ActiveNotifier from './ActiveNotifier'; +import moment from 'moment'; class DatePicker extends React.Component { + render() { + //If button property present display buttons + let buttons; + if (this.props.enableButtons) { + buttons = ; + } + return ( +
+
+
- render(){ - //If button property present display buttons - let buttons; - if(this.props.enableButtons){ - buttons = ; - } - return( -
-
-
- - - {buttons} -
- ); - } + + + {buttons} +
+ ); + } } -export default DatePicker \ No newline at end of file +export default DatePicker; From 8ab6f8dd64ef4326b8242009a0cfdb10839d7c17 Mon Sep 17 00:00:00 2001 From: andreaci Date: Fri, 1 Mar 2019 11:18:36 +0100 Subject: [PATCH 02/31] MaxDays parameter in selection --- src/Wrapper.jsx | 20 ++ src/lib/DateTimeRangeContainer.jsx | 22 +- src/lib/DateTimeRangePicker.jsx | 36 ++- src/lib/date_picker/ApplyCancelButtons.jsx | 298 ++++++++++----------- src/lib/date_picker/DatePicker.jsx | 2 +- src/lib/index.jsx | 24 +- src/lib/style/DateTimeRange.css | 272 ++++++++++--------- 7 files changed, 384 insertions(+), 290 deletions(-) diff --git a/src/Wrapper.jsx b/src/Wrapper.jsx index 53c4146..878a5d9 100644 --- a/src/Wrapper.jsx +++ b/src/Wrapper.jsx @@ -71,6 +71,23 @@ class Wrapper extends React.Component { ); } + renderMaxDays(ranges, local, maxDate) { + return ( + + + 1 + + + + + + + 3 + + + + ); + } renderDisableTime(ranges, local, maxDate) { return ( @@ -144,6 +161,9 @@ class Wrapper extends React.Component {

renderDisableDateBox

{this.renderDisableDateBox(ranges, local, maxDate)} + +

renderMaxDays

+ {this.renderMaxDays(ranges, local, maxDate)} ); } diff --git a/src/lib/DateTimeRangeContainer.jsx b/src/lib/DateTimeRangeContainer.jsx index dc1a14b..a4fe8ce 100644 --- a/src/lib/DateTimeRangeContainer.jsx +++ b/src/lib/DateTimeRangeContainer.jsx @@ -13,7 +13,8 @@ class DateTimeRangeContainer extends React.Component { visible: false, x: 0, y: 0, - screenWidthToTheRight: 0 + screenWidthToTheRight: 0, + errorClass: '' }; this.resize = this.resize.bind(this); this.onClickContainerHandler = this.onClickContainerHandler.bind(this); @@ -90,6 +91,10 @@ class DateTimeRangeContainer extends React.Component { } } + updateErrorClass(className) { + if (this.state.errorClass !== className) this.setState({ errorClass: className }); + } + render() { let showPicker = this.shouldShowPicker(); let x = this.state.x; @@ -97,14 +102,14 @@ class DateTimeRangeContainer extends React.Component { return (
{ this.container = container; }} > {this.props.children &&
{this.props.children}
} -
+
@@ -131,7 +138,14 @@ DateTimeRangeContainer.propTypes = { applyCallback: PropTypes.func.isRequired, maxDate: momentPropTypes.momentObj, disableTime: PropTypes.bool, - disableDateBox: PropTypes.bool + disableDateBox: PropTypes.bool, + maxDays: PropTypes.number +}; + +DateTimeRangeContainer.defaultProps = { + maxDays: 366, + disableDateBox: false, + disableTime: false }; export default DateTimeRangeContainer; diff --git a/src/lib/DateTimeRangePicker.jsx b/src/lib/DateTimeRangePicker.jsx index 794b4ed..e8f87cb 100644 --- a/src/lib/DateTimeRangePicker.jsx +++ b/src/lib/DateTimeRangePicker.jsx @@ -29,7 +29,8 @@ class DateTimeRangePicker extends React.Component { startLabel: this.props.start.format(momentFormat), end: this.props.end, endLabel: this.props.end.format(momentFormat), - focusDate: false + focusDate: false, + errorClass: '' }; this.bindToFunctions(); } @@ -60,10 +61,34 @@ class DateTimeRangePicker extends React.Component { } applyCallback() { + if (!this.checkMaxDays(this.state.start, this.state.end)) { + return false; + } + this.props.applyCallback(this.state.start, this.state.end); this.props.changeVisibleState(); } + checkMaxDays(startDate, endDate) { + let { maxDays } = this.props; + + if (maxDays != null && maxDays > 0) { + let days = Date.daysBetween(startDate, endDate); + + if (days > this.props.maxDays) { + this.props.updateErrorClass('error'); + if (this.state.errorClass !== 'error') this.setState({ errorClass: 'error' }); + return false; + } else { + this.props.updateErrorClass(''); + if (this.state.errorClass !== '') this.setState({ errorClass: '' }); + return true; + } + } + + return true; + } + rangeSelectedCallback(index, value) { // If Past Max Date Dont allow update let start; @@ -74,6 +99,9 @@ class DateTimeRangePicker extends React.Component { if (pastMaxDate(start, this.props.maxDate, true) || pastMaxDate(end, this.props.maxDate, true)) { return false; } + if (!this.checkMaxDays(start, end)) { + return false; + } } // Else update state to new selected index and update start and end time this.setState({ selectedRange: index }); @@ -83,6 +111,10 @@ class DateTimeRangePicker extends React.Component { } setToRangeValue(startDate, endDate) { + if (!this.checkMaxDays(startDate, endDate)) { + return false; + } + let rangesArray = Object.values(this.state.ranges); for (let i = 0; i < rangesArray.length; i++) { if (rangesArray[i] === 'Custom Range') { @@ -320,6 +352,7 @@ class DateTimeRangePicker extends React.Component { applyCallback={this.applyCallback} maxDate={this.props.maxDate} local={this.props.local} + className={this.state.errorClass} /> ); } @@ -349,6 +382,7 @@ class DateTimeRangePicker extends React.Component { maxDate={this.props.maxDate} local={this.props.local} enableButtons={true} + className={this.state.errorClass} /> ); } diff --git a/src/lib/date_picker/ApplyCancelButtons.jsx b/src/lib/date_picker/ApplyCancelButtons.jsx index 792b051..c569c3d 100644 --- a/src/lib/date_picker/ApplyCancelButtons.jsx +++ b/src/lib/date_picker/ApplyCancelButtons.jsx @@ -1,160 +1,148 @@ import React from 'react'; -import '../style/DateTimeRange.css' -import "../style/DateTimeRange.css" +import '../style/DateTimeRange.css'; +import '../style/DateTimeRange.css'; import { addFocusStyle } from '../utils/StyleUtils'; class ApplyCancelButtons extends React.Component { - constructor(props){ - super(props); - this.state = { - hoverColourApply: "#5cb85c", - hoverColourCancel: "#fff", - applyFocus: false, - cancelFocus: false, - } - this.bindToFunctions(); - } - - bindToFunctions(){ - this.mouseEnterApply = this.mouseEnterApply.bind(this); - this.mouseLeaveApply = this.mouseLeaveApply.bind(this); - this.mouseEnterCancel = this.mouseEnterCancel.bind(this); - this.mouseLeaveCancel = this.mouseLeaveCancel.bind(this); - this.cancelPressed = this.cancelPressed.bind(this); - this.applyPressed = this.applyPressed.bind(this); - this.applyOnKeyPress = this.applyOnKeyPress.bind(this); - this.cancelOnKeyPress = this.cancelOnKeyPress.bind(this); - this.applyOnFocus = this.applyOnFocus.bind(this); - this.applyOnBlur = this.applyOnBlur.bind(this); - this.cancelOnBlur = this.cancelOnBlur.bind(this); - this.cancelOnFocus = this.cancelOnFocus.bind(this); - } - - mouseEnterApply(e){ - this.setState({hoverColourApply: "#3e8e41"}) - } - - mouseLeaveApply(e){ - this.setState({hoverColourApply: "#5cb85c"}) - } - - mouseEnterCancel(e){ - this.setState({hoverColourCancel: "rgb(192, 185, 185)"}) - } - - mouseLeaveCancel(e){ - this.setState({hoverColourCancel: "#fff"}) - } - - cancelPressed(e){ - this.props.changeVisibleState(); - } - - applyPressed(e){ - this.props.applyCallback(); - } - - applyOnFocus(){ - this.setState({applyFocus:true}); - } - - applyOnBlur(){ - this.setState({applyFocus:false}); - } - - cancelOnFocus(){ - this.setState({cancelFocus:true}); - } - - cancelOnBlur(){ - this.setState({cancelFocus:false}); - } - - isSpaceBarOrEnterPressed(e){ - if(e.keyCode === 32 || e.keyCode === 13){ - return true; - } - return false; - } - - applyOnKeyPress(e){ - if(this.isSpaceBarOrEnterPressed(e)){ - this.props.applyCallback(); - } - } - - cancelOnKeyPress(e){ - if(this.isSpaceBarOrEnterPressed(e)){ - this.props.changeVisibleState(); - } - } - - renderButton(className, onMouseEnter, onMouseLeave, onClick, style, onKeyDown, onFocus, onBlur, text){ - let styleLocal; - if(text === "Apply"){ - styleLocal = addFocusStyle(this.state.applyFocus, style); - }else{ - styleLocal = addFocusStyle(this.state.cancelFocus, style); - } - return( -
- {text} -
- ); - } - - getMaxDateBox(){ - if(this.props.maxDate){ - return( -
- Max Date: {this.props.maxDate.format(this.props.local.format)} -
- ) - } - } - - render(){ - let maxDateBox = this.getMaxDateBox(); - return( -
- {maxDateBox} - { - this.renderButton("buttonSeperator applyButton", - this.mouseEnterApply, - this.mouseLeaveApply, - this.applyPressed, - {backgroundColor:this.state.hoverColourApply}, - this.applyOnKeyPress, - this.applyOnFocus, - this.applyOnBlur, - "Apply" - ) - } - - { - this.renderButton("buttonSeperator cancelButton", - this.mouseEnterCancel, - this.mouseLeaveCancel, - this.cancelPressed, - {backgroundColor:this.state.hoverColourCancel}, - this.cancelOnKeyPress, - this.cancelOnFocus, - this.cancelOnBlur, - "Cancel" - ) - } -
- ); - } + constructor(props) { + super(props); + + this.state = { + applyFocus: false, + cancelFocus: false + }; + this.bindToFunctions(); + } + + bindToFunctions() { + this.mouseEnterApply = this.mouseEnterApply.bind(this); + this.mouseLeaveApply = this.mouseLeaveApply.bind(this); + this.mouseEnterCancel = this.mouseEnterCancel.bind(this); + this.mouseLeaveCancel = this.mouseLeaveCancel.bind(this); + this.cancelPressed = this.cancelPressed.bind(this); + this.applyPressed = this.applyPressed.bind(this); + this.applyOnKeyPress = this.applyOnKeyPress.bind(this); + this.cancelOnKeyPress = this.cancelOnKeyPress.bind(this); + this.applyOnFocus = this.applyOnFocus.bind(this); + this.applyOnBlur = this.applyOnBlur.bind(this); + this.cancelOnBlur = this.cancelOnBlur.bind(this); + this.cancelOnFocus = this.cancelOnFocus.bind(this); + } + + mouseEnterApply(e) {} + + mouseLeaveApply(e) {} + + mouseEnterCancel(e) {} + + mouseLeaveCancel(e) {} + + cancelPressed(e) { + this.props.changeVisibleState(); + } + + applyPressed(e) { + this.props.applyCallback(); + } + + applyOnFocus() { + this.setState({ applyFocus: true }); + } + + applyOnBlur() { + this.setState({ applyFocus: false }); + } + + cancelOnFocus() { + this.setState({ cancelFocus: true }); + } + + cancelOnBlur() { + this.setState({ cancelFocus: false }); + } + + isSpaceBarOrEnterPressed(e) { + if (e.keyCode === 32 || e.keyCode === 13) { + return true; + } + return false; + } + + applyOnKeyPress(e) { + if (this.isSpaceBarOrEnterPressed(e)) { + this.props.applyCallback(); + } + } + + cancelOnKeyPress(e) { + if (this.isSpaceBarOrEnterPressed(e)) { + this.props.changeVisibleState(); + } + } + + renderButton(className, onMouseEnter, onMouseLeave, onClick, style, onKeyDown, onFocus, onBlur, text) { + let styleLocal; + if (text === 'Apply') { + styleLocal = addFocusStyle(this.state.applyFocus, style); + } else { + styleLocal = addFocusStyle(this.state.cancelFocus, style); + } + return ( +
+ {text} +
+ ); + } + + getMaxDateBox() { + if (this.props.maxDate) { + return
Max Date: {this.props.maxDate.format(this.props.local.format)}
; + } + } + + render() { + let { className } = this.props; + if (className == null) className = ''; + + let maxDateBox = this.getMaxDateBox(); + return ( +
+ {maxDateBox} + {this.renderButton( + 'buttonSeperator applyButton ' + className, + this.mouseEnterApply, + this.mouseLeaveApply, + this.applyPressed, + {}, + this.applyOnKeyPress, + this.applyOnFocus, + this.applyOnBlur, + 'Apply' + )} + + {this.renderButton( + 'buttonSeperator cancelButton ' + className, + this.mouseEnterCancel, + this.mouseLeaveCancel, + this.cancelPressed, + {}, + this.cancelOnKeyPress, + this.cancelOnFocus, + this.cancelOnBlur, + 'Cancel' + )} +
+ ); + } } -export default ApplyCancelButtons \ No newline at end of file +export default ApplyCancelButtons; diff --git a/src/lib/date_picker/DatePicker.jsx b/src/lib/date_picker/DatePicker.jsx index 72e91d3..486a212 100644 --- a/src/lib/date_picker/DatePicker.jsx +++ b/src/lib/date_picker/DatePicker.jsx @@ -14,7 +14,7 @@ class DatePicker extends React.Component { //If button property present display buttons let buttons; if (this.props.enableButtons) { - buttons = ; + buttons = ; } return (
diff --git a/src/lib/index.jsx b/src/lib/index.jsx index dded394..d608940 100644 --- a/src/lib/index.jsx +++ b/src/lib/index.jsx @@ -1,2 +1,22 @@ -import DateTimeRangeContainer from "./DateTimeRangeContainer" -export default DateTimeRangeContainer; \ No newline at end of file +import DateTimeRangeContainer from './DateTimeRangeContainer'; + +if (Date.daysBetween == null) { + Date.daysBetween = function(date1, date2) { + if (date1._isAMomentObject === true) date1 = date1.toDate(); + if (date2._isAMomentObject === true) date2 = date2.toDate(); + + //Get 1 day in milliseconds + var one_day = 1000 * 60 * 60 * 24; + + // Convert both dates to milliseconds + var date1_ms = date1.getTime(); + var date2_ms = date2.getTime(); + + // Calculate the difference in milliseconds + var difference_ms = date2_ms - date1_ms; + + // Convert back to days and return + return Math.round(difference_ms / one_day); + }; +} +export default DateTimeRangeContainer; diff --git a/src/lib/style/DateTimeRange.css b/src/lib/style/DateTimeRange.css index cbdd451..3c57a58 100644 --- a/src/lib/style/DateTimeRange.css +++ b/src/lib/style/DateTimeRange.css @@ -1,210 +1,228 @@ .daterangepickercontainer { - position: relative; + position: relative; } .daterangepicker { - position: absolute; - display: flex; - color: inherit; - background-color: #fff; - border-radius: 4px; - padding: 4px; - margin-top: 1px; - top: 100px; - left: 20px; - max-width: 680px; - z-index: 3001; - border: 1px solid rgba(0,0,0,0.15); - background-clip: padding-box; - box-shadow: 0 6px 12px rgba(0,0,0,.175); -} -.daterangepicker:before, .daterangepicker:after { - position: absolute; - display: inline-block; - border-bottom-color: rgba(0, 0, 0, 0.2); - content: ""; + position: absolute; + display: flex; + color: inherit; + background-color: #fff; + border-radius: 4px; + padding: 4px; + margin-top: 1px; + top: 100px; + left: 20px; + max-width: 680px; + z-index: 3001; + border: 1px solid rgba(0, 0, 0, 0.15); + background-clip: padding-box; + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); +} + +.daterangepicker.error { + border: 1px solid rgba(255, 0, 0, 0.5); +} + +.daterangepicker:before, +.daterangepicker:after { + position: absolute; + display: inline-block; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; } .daterangepicker:before { - top: -7px; - border-right: 7px solid transparent; - border-left: 7px solid transparent; - border-bottom: 7px solid rgba(0, 0, 0, 0.15); + top: -7px; + border-right: 7px solid transparent; + border-left: 7px solid transparent; + border-bottom: 7px solid rgba(0, 0, 0, 0.15); } .daterangepicker:after { - top: -6px; - border-right: 6px solid transparent; - border-bottom: 6px solid rgba(0, 0, 0, 0.3); - border-left: 6px solid transparent; + top: -6px; + border-right: 6px solid transparent; + border-bottom: 6px solid rgba(0, 0, 0, 0.3); + border-left: 6px solid transparent; } .rangecontainer { - width: 160px; + width: 160px; } .rangebuttonstyle { - color: #08c; - font-size: 13px; - background-color: #f5f5f5; - border: 1px solid #f5f5f5; - border-radius: 4px; - cursor: pointer; - margin-bottom : 8px; - margin-left: 4px; - margin-right: 4px; - margin-top: 4px; + color: #08c; + font-size: 13px; + background-color: #f5f5f5; + border: 1px solid #f5f5f5; + border-radius: 4px; + cursor: pointer; + margin-bottom: 8px; + margin-left: 4px; + margin-right: 4px; + margin-top: 4px; } .rangebuttontextstyle { - padding-left: 12px; - padding-top: 3px; - padding-bottom: 3px; - padding-right: 12px; + padding-left: 12px; + padding-top: 3px; + padding-bottom: 3px; + padding-right: 12px; } .rangeButtonSelectedStyle { - color: #f5f5f5; - font-size: 13px; - border: 1px solid #f5f5f5; - border-radius: 4px; - cursor: pointer; - margin-bottom : 8px; - margin-left: 4px; - margin-right: 4px; - margin-top: 4px; - background-color: #08c; + color: #f5f5f5; + font-size: 13px; + border: 1px solid #f5f5f5; + border-radius: 4px; + cursor: pointer; + margin-bottom: 8px; + margin-left: 4px; + margin-right: 4px; + margin-top: 4px; + background-color: #08c; } .fromDateTimeContainer { - font-size: 13px; - width : 270px; - margin: 4px; + font-size: 13px; + width: 270px; + margin: 4px; } .fromDateHourContainer { - border: 1px solid #f5f5f5; - border-radius: 4px; + border: 1px solid #f5f5f5; + border-radius: 4px; } .dateTimeLabel { - text-align: center; - font-weight: bold; - padding-bottom: 5px; + text-align: center; + font-weight: bold; + padding-bottom: 5px; } .inputDate { - height: 30px; + height: 30px; } .calendarAddon { - background-color: inherit; + background-color: inherit; } .timeContainer { - text-align: center; - position: relative; + text-align: center; + position: relative; } .timeSelectContainer { - margin : 8px; + margin: 8px; } .timeIconStyle { - position: absolute; - top : 3px; - left: 14px; - font-style: normal; - color: #555; + position: absolute; + top: 3px; + left: 14px; + font-style: normal; + color: #555; } .multipleContentOnLine { - position: relative; - display: inline; - padding: 1px; + position: relative; + display: inline; + padding: 1px; } .buttonContainer { - position: absolute; - display: flex; - bottom: 0; - right: 0; - margin-right: 13px; - margin-left: 13px; - margin-bottom: 10px; - margin-top: 10px; + position: absolute; + display: flex; + bottom: 0; + right: 0; + margin-right: 13px; + margin-left: 13px; + margin-bottom: 10px; + margin-top: 10px; } .buttonSeperator { - padding-left: 5px; - padding-right: 5px; + padding-left: 5px; + padding-right: 5px; } .applyButton { - border-color: #4cae4c; - color: #fff; - font-size: 12px; - border-radius: 3px; - padding: 5px 10px; - cursor: pointer; - margin-right: 4px; - border: 1px solid #5cb85c; + background-color: #4cae4c; + color: #fff; + font-size: 12px; + border-radius: 3px; + padding: 5px 10px; + cursor: pointer; + margin-right: 4px; + border: 1px solid #5cb85c; +} +.applyButton:hover { + background: #5cb85c; +} + +.applyButton.error { + background-color: rgb(233, 91, 91); + border: 1px solid red; + pointer-events: none; } .cancelButton { - background-color: #fff; - color: #333; - font-size: 12px; - border-radius: 3px; - padding: 5px 10px; - cursor: pointer; - border: 1px solid #ccc; + background-color: #fff; + color: #333; + font-size: 12px; + border-radius: 3px; + padding: 5px 10px; + cursor: pointer; + border: 1px solid #ccc; +} +.cancelButton:hover { + background: #f1f1f1; } .maxDateLabel { - padding: 7px; - font-size: 10px; + padding: 7px; + font-size: 10px; } .monthYearContainer { - margin : 5px; - margin-top: 15px; - display: flex; + margin: 5px; + margin-top: 15px; + display: flex; } .leftChevron { - display: grid; - width: 25%; - padding: 2px; - justify-content: left; - font-size: 14px; + display: grid; + width: 25%; + padding: 2px; + justify-content: left; + font-size: 14px; } .rightChevron { - display: grid; - width: 25%; - padding: 2px; - justify-content: right; - font-size: 14px; + display: grid; + width: 25%; + padding: 2px; + justify-content: right; + font-size: 14px; } .calendarGrid { - display: grid; - grid-template-columns: repeat(7, 1fr); - text-align: center; + display: grid; + grid-template-columns: repeat(7, 1fr); + text-align: center; } .calendarCell { - padding: 5px; + padding: 5px; } .activeNotifier { - text-align: center; - padding-bottom: 40px; + text-align: center; + padding-bottom: 40px; } .dot { - height: 10px; - width: 10px; - background-color: #12bc00; - border-radius: 50%; - display: inline-block; -} \ No newline at end of file + height: 10px; + width: 10px; + background-color: #12bc00; + border-radius: 50%; + display: inline-block; +} From 4bb1bf5311f102a89aeadc4448d39bebeed68747 Mon Sep 17 00:00:00 2001 From: andreaci Date: Fri, 1 Mar 2019 14:05:26 +0100 Subject: [PATCH 03/31] added disabled prop --- src/Wrapper.jsx | 21 +++++++++++++++++++++ src/lib/DateTimeRangeContainer.jsx | 11 +++++++---- src/lib/style/DateTimeRange.css | 4 ++++ 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/Wrapper.jsx b/src/Wrapper.jsx index 878a5d9..f459a20 100644 --- a/src/Wrapper.jsx +++ b/src/Wrapper.jsx @@ -123,6 +123,24 @@ class Wrapper extends React.Component { ); } + renderDisabled(ranges, local, maxDate) { + return ( + + + 1 + + + + + + + 3 + + + + ); + } + render() { let now = new Date(); let start = moment(new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0, 0)); @@ -164,6 +182,9 @@ class Wrapper extends React.Component {

renderMaxDays

{this.renderMaxDays(ranges, local, maxDate)} + +

renderDisabled

+ {this.renderDisabled(ranges, local, maxDate)}
); } diff --git a/src/lib/DateTimeRangeContainer.jsx b/src/lib/DateTimeRangeContainer.jsx index a4fe8ce..0f0b2e7 100644 --- a/src/lib/DateTimeRangeContainer.jsx +++ b/src/lib/DateTimeRangeContainer.jsx @@ -102,14 +102,14 @@ class DateTimeRangeContainer extends React.Component { return (
{ this.container = container; }} > {this.props.children &&
{this.props.children}
} -
+
@@ -139,13 +140,15 @@ DateTimeRangeContainer.propTypes = { maxDate: momentPropTypes.momentObj, disableTime: PropTypes.bool, disableDateBox: PropTypes.bool, - maxDays: PropTypes.number + maxDays: PropTypes.number, + disabled: PropTypes.bool }; DateTimeRangeContainer.defaultProps = { maxDays: 366, disableDateBox: false, - disableTime: false + disableTime: false, + disabled: false }; export default DateTimeRangeContainer; diff --git a/src/lib/style/DateTimeRange.css b/src/lib/style/DateTimeRange.css index 3c57a58..0738545 100644 --- a/src/lib/style/DateTimeRange.css +++ b/src/lib/style/DateTimeRange.css @@ -2,6 +2,10 @@ position: relative; } +.daterangepickercontainer.disabled { + pointer-events: none; +} + .daterangepicker { position: absolute; display: flex; From 1dd89e69937432de4986123d5280d7085130a42b Mon Sep 17 00:00:00 2001 From: andreaci Date: Fri, 1 Mar 2019 14:26:56 +0100 Subject: [PATCH 04/31] external translations support --- src/Wrapper.jsx | 22 ++++++++++++++++++++++ src/lib/DateTimeRangeContainer.jsx | 20 ++++++++++++++++++-- src/lib/DateTimeRangePicker.jsx | 21 +++++++++++++-------- src/lib/date_picker/ApplyCancelButtons.jsx | 4 ++-- src/lib/date_picker/DatePicker.jsx | 12 +++++++++++- 5 files changed, 66 insertions(+), 13 deletions(-) diff --git a/src/Wrapper.jsx b/src/Wrapper.jsx index f459a20..3dcbde2 100644 --- a/src/Wrapper.jsx +++ b/src/Wrapper.jsx @@ -140,6 +140,23 @@ class Wrapper extends React.Component { ); } + renderTranslated(ranges, local, maxDate) { + return ( + + + 1 + + + + + + + 3 + + + + ); + } render() { let now = new Date(); @@ -185,6 +202,9 @@ class Wrapper extends React.Component {

renderDisabled

{this.renderDisabled(ranges, local, maxDate)} + +

renderTranslated

+ {this.renderTranslated(ranges, local, maxDate)}
); } @@ -194,3 +214,5 @@ export { Wrapper }; const h1style = { marginTop: 50, borderTop: '1px solid gray' }; const divstyle = { padding: 30 }; + +const translations = { Apply: 'appleeeeca', Cancel: 'annuuuuu', customRange: 'customme', FromDate: 'daaaa', ToDate: 'aaaaa' }; diff --git a/src/lib/DateTimeRangeContainer.jsx b/src/lib/DateTimeRangeContainer.jsx index 0f0b2e7..998cc2d 100644 --- a/src/lib/DateTimeRangeContainer.jsx +++ b/src/lib/DateTimeRangeContainer.jsx @@ -99,6 +99,17 @@ class DateTimeRangeContainer extends React.Component { let showPicker = this.shouldShowPicker(); let x = this.state.x; let y = this.state.y; + + let translations = this.props.translations; + + if (translations == null) { + translations = default_translations; + } else { + Object.keys(default_translations).forEach(e => { + if (translations[e] == null) translations[e] = default_translations[e]; + }); + } + return (
@@ -131,6 +143,8 @@ class DateTimeRangeContainer extends React.Component { } } +const default_translations = { Apply: 'Apply', Cancel: 'Cancel', customRange: 'Custom Range', FromDate: 'From date', ToDate: 'To date' }; + DateTimeRangeContainer.propTypes = { ranges: PropTypes.object.isRequired, start: momentPropTypes.momentObj, @@ -141,14 +155,16 @@ DateTimeRangeContainer.propTypes = { disableTime: PropTypes.bool, disableDateBox: PropTypes.bool, maxDays: PropTypes.number, - disabled: PropTypes.bool + disabled: PropTypes.bool, + translations: PropTypes.object }; DateTimeRangeContainer.defaultProps = { maxDays: 366, disableDateBox: false, disableTime: false, - disabled: false + disabled: false, + translations: default_translations }; export default DateTimeRangeContainer; diff --git a/src/lib/DateTimeRangePicker.jsx b/src/lib/DateTimeRangePicker.jsx index e8f87cb..f1809ba 100644 --- a/src/lib/DateTimeRangePicker.jsx +++ b/src/lib/DateTimeRangePicker.jsx @@ -14,7 +14,10 @@ class DateTimeRangePicker extends React.Component { constructor(props) { super(props); let ranges = {}; - let customRange = { 'Custom Range': 'Custom Range' }; + + let customRange = {}; // { this.props.translations.customRange: this.props.translations.customRange }; + customRange[this.props.translations.customRange] = this.props.translations.customRange; + Object.assign(ranges, this.props.ranges, customRange); if (this.props.local && this.props.local.format) { @@ -93,7 +96,7 @@ class DateTimeRangePicker extends React.Component { // If Past Max Date Dont allow update let start; let end; - if (value !== 'Custom Range') { + if (value !== this.props.translations.customRange) { start = this.state.ranges[value][0]; end = this.state.ranges[value][1]; if (pastMaxDate(start, this.props.maxDate, true) || pastMaxDate(end, this.props.maxDate, true)) { @@ -105,7 +108,7 @@ class DateTimeRangePicker extends React.Component { } // Else update state to new selected index and update start and end time this.setState({ selectedRange: index }); - if (value !== 'Custom Range') { + if (value !== this.props.translations.customRange) { this.updateStartEndAndLabels(start, end); } } @@ -117,7 +120,7 @@ class DateTimeRangePicker extends React.Component { let rangesArray = Object.values(this.state.ranges); for (let i = 0; i < rangesArray.length; i++) { - if (rangesArray[i] === 'Custom Range') { + if (rangesArray[i] === this.props.translations.customRange) { continue; } else if (rangesArray[i][0].isSame(startDate, 'minutes') && rangesArray[i][1].isSame(endDate, 'minutes')) { this.setState({ selectedRange: i }); @@ -130,7 +133,7 @@ class DateTimeRangePicker extends React.Component { setToCustomRange() { let rangesArray = Object.values(this.state.ranges); for (let i = 0; i < rangesArray.length; i++) { - if (rangesArray[i] === 'Custom Range') { + if (rangesArray[i] === this.props.translations.customRange) { this.setState({ selectedRange: i }); } } @@ -256,7 +259,7 @@ class DateTimeRangePicker extends React.Component { [stateDateToChangeName]: newDate, [stateLabelToChangeName]: newDate.format(momentFormat) }); - this.updateTimeCustomRangeUpdator(stateDateToChangeName, newDate); + this.updateTimeUpdator(stateDateToChangeName, newDate); } else if (isValidNewDate && isInvalidDateChange) { this.updateInvalidDate(mode, newDate); } else if (!isValidNewDate) { @@ -334,7 +337,7 @@ class DateTimeRangePicker extends React.Component { ); } @@ -362,7 +366,7 @@ class DateTimeRangePicker extends React.Component { ); } diff --git a/src/lib/date_picker/ApplyCancelButtons.jsx b/src/lib/date_picker/ApplyCancelButtons.jsx index c569c3d..e84b8ad 100644 --- a/src/lib/date_picker/ApplyCancelButtons.jsx +++ b/src/lib/date_picker/ApplyCancelButtons.jsx @@ -127,7 +127,7 @@ class ApplyCancelButtons extends React.Component { this.applyOnKeyPress, this.applyOnFocus, this.applyOnBlur, - 'Apply' + this.props.ApplyString )} {this.renderButton( @@ -139,7 +139,7 @@ class ApplyCancelButtons extends React.Component { this.cancelOnKeyPress, this.cancelOnFocus, this.cancelOnBlur, - 'Cancel' + this.props.CancelString )} ); diff --git a/src/lib/date_picker/DatePicker.jsx b/src/lib/date_picker/DatePicker.jsx index 486a212..7743df3 100644 --- a/src/lib/date_picker/DatePicker.jsx +++ b/src/lib/date_picker/DatePicker.jsx @@ -14,7 +14,17 @@ class DatePicker extends React.Component { //If button property present display buttons let buttons; if (this.props.enableButtons) { - buttons = ; + buttons = ( + + ); } return (
From 6e91684111d5d89d1fbc168aa5ac131d8741dda4 Mon Sep 17 00:00:00 2001 From: andreaci Date: Fri, 1 Mar 2019 14:30:55 +0100 Subject: [PATCH 05/31] removed double css imports --- src/lib/calendar/Calendar.jsx | 341 ++++++++-------- src/lib/calendar/CalendarHeader.jsx | 28 +- src/lib/calendar/CalendarRow.jsx | 64 ++- src/lib/calendar/CalendarRows.jsx | 68 ++-- src/lib/calendar/Cell.jsx | 429 +++++++++++---------- src/lib/calendar/MonthYearSelector.jsx | 150 ++++--- src/lib/date_picker/ActiveNotifier.jsx | 49 ++- src/lib/date_picker/ApplyCancelButtons.jsx | 1 - src/lib/date_picker/DateField.jsx | 69 ++-- src/lib/date_picker/DatePicker.jsx | 1 - src/lib/date_picker/Label.jsx | 19 +- src/lib/date_picker/TimeField.jsx | 179 ++++----- src/lib/ranges/RangeButton.jsx | 231 +++++------ src/lib/ranges/Ranges.jsx | 139 ++++--- 14 files changed, 863 insertions(+), 905 deletions(-) diff --git a/src/lib/calendar/Calendar.jsx b/src/lib/calendar/Calendar.jsx index 427b458..bb49fed 100644 --- a/src/lib/calendar/Calendar.jsx +++ b/src/lib/calendar/Calendar.jsx @@ -1,177 +1,172 @@ import React from 'react'; -import '../style/DateTimeRange.css' -import "../style/DateTimeRange.css" -import MonthYearSelector from './MonthYearSelector' -import CalendarHeader from './CalendarHeader' -import CalendarRows from './CalendarRows' -import moment from 'moment' -import {getMonth, getYear, getFourtyTwoDays} from '../utils/TimeFunctionUtils' +import '../style/DateTimeRange.css'; +import MonthYearSelector from './MonthYearSelector'; +import CalendarHeader from './CalendarHeader'; +import CalendarRows from './CalendarRows'; +import moment from 'moment'; +import { getMonth, getYear, getFourtyTwoDays } from '../utils/TimeFunctionUtils'; class Calendar extends React.Component { - - constructor(props){ - super(props); - this.state = { - month : 0, - year : 0 - } - - this.changeMonthCallback = this.changeMonthCallback.bind(this); - this.changeYearCallback = this.changeYearCallback.bind(this); - this.changeMonthArrowsCallback = this.changeMonthArrowsCallback.bind(this); - } - - componentDidMount(){ - this.updateMonthYear(); - } - - componentDidUpdate(previousProps){ - if(!previousProps.date.isSame(this.props.date) || !previousProps.otherDate.isSame(this.props.otherDate)){ - this.updateMonthYear(); - } - } - - updateMonthYear(){ - let newMonth = getMonth(this.props.date, this.props.otherDate, this.props.mode); - let newYear = getYear(this.props.date, this.props.otherDate, this.props.mode); - this.setState({ - month: newMonth, - year : newYear - }) - } - - createMonths(){ - let months = [ - "January", "February", "March", "April", - "May", "June", "July", "August", "September", - "October", "November","December" ]; - return months; - } - - createYears(){ - let years = [] - //Range from 1900 to 25 years into the future - let past = moment("19000101", "YYYYMMDD"); - let yearsToGetFuture = 10; - let endYear = moment().add(yearsToGetFuture, "years").get('year') - let addedCurrentYear = false - while(!addedCurrentYear){ - if(past.get("years") === endYear){ - addedCurrentYear = true; - } - years.push(past.year()); - past.add(1, "years"); - } - return years; - } - - changeMonthCallback(event){ - for(let i = 0; i < event.target.length; i++){ - if(event.target[i].value === event.target.value){ - this.setState({month:i}) - } - } - } - - changeMonthArrowsCallback(isPreviousChange, isNextChange){ - let years = this.createYears(); - let monthLocal = parseInt(this.state.month); - let yearLocal = parseInt(this.state.year); - - let newMonthYear; - if(isPreviousChange){ - newMonthYear = this.getPreviousMonth(monthLocal, yearLocal, years); - } - if(isNextChange){ - newMonthYear = this.getNextMonth(monthLocal, yearLocal, years); - } - - this.setState({ - year: newMonthYear.yearLocal, - month: newMonthYear.monthLocal - }) - } - - getPreviousMonth(monthLocal, yearLocal, years){ - let isStartOfMonth = monthLocal === 0; - let isFirstYear = parseInt(yearLocal) === years[0]; - - if(!(isStartOfMonth && isFirstYear)){ - if(monthLocal === 0){ - monthLocal = 11; - yearLocal -= 1; - }else{ - monthLocal -= 1; - } - } - return {monthLocal, yearLocal} - } - - getNextMonth(monthLocal, yearLocal, years){ - let isEndOfMonth = monthLocal === 11; - let isLastYear = parseInt(yearLocal) === years[years.length - 1]; - if(!(isEndOfMonth && isLastYear)){ - if(monthLocal === 11){ - monthLocal = 0; - yearLocal += 1; - }else{ - monthLocal += 1; - } - } - return {monthLocal, yearLocal} - } - - changeYearCallback(event){ - this.setState({year:parseInt(event.target.value)}) - } - - render(){ - let months = this.createMonths(); - let years = this.createYears(); - let headers; - let sundayFirst; - if(this.props.local && this.props.local.sundayFirst){ - sundayFirst=true; - headers = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"] - }else{ - sundayFirst=false; - headers = ["Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"]; - } - - let fourtyTwoDays = getFourtyTwoDays(this.state.month, this.state.year, sundayFirst); - return( -
- - - -
- ); - } + constructor(props) { + super(props); + this.state = { + month: 0, + year: 0 + }; + + this.changeMonthCallback = this.changeMonthCallback.bind(this); + this.changeYearCallback = this.changeYearCallback.bind(this); + this.changeMonthArrowsCallback = this.changeMonthArrowsCallback.bind(this); + } + + componentDidMount() { + this.updateMonthYear(); + } + + componentDidUpdate(previousProps) { + if (!previousProps.date.isSame(this.props.date) || !previousProps.otherDate.isSame(this.props.otherDate)) { + this.updateMonthYear(); + } + } + + updateMonthYear() { + let newMonth = getMonth(this.props.date, this.props.otherDate, this.props.mode); + let newYear = getYear(this.props.date, this.props.otherDate, this.props.mode); + this.setState({ + month: newMonth, + year: newYear + }); + } + + createMonths() { + let months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; + return months; + } + + createYears() { + let years = []; + //Range from 1900 to 25 years into the future + let past = moment('19000101', 'YYYYMMDD'); + let yearsToGetFuture = 10; + let endYear = moment() + .add(yearsToGetFuture, 'years') + .get('year'); + let addedCurrentYear = false; + while (!addedCurrentYear) { + if (past.get('years') === endYear) { + addedCurrentYear = true; + } + years.push(past.year()); + past.add(1, 'years'); + } + return years; + } + + changeMonthCallback(event) { + for (let i = 0; i < event.target.length; i++) { + if (event.target[i].value === event.target.value) { + this.setState({ month: i }); + } + } + } + + changeMonthArrowsCallback(isPreviousChange, isNextChange) { + let years = this.createYears(); + let monthLocal = parseInt(this.state.month); + let yearLocal = parseInt(this.state.year); + + let newMonthYear; + if (isPreviousChange) { + newMonthYear = this.getPreviousMonth(monthLocal, yearLocal, years); + } + if (isNextChange) { + newMonthYear = this.getNextMonth(monthLocal, yearLocal, years); + } + + this.setState({ + year: newMonthYear.yearLocal, + month: newMonthYear.monthLocal + }); + } + + getPreviousMonth(monthLocal, yearLocal, years) { + let isStartOfMonth = monthLocal === 0; + let isFirstYear = parseInt(yearLocal) === years[0]; + + if (!(isStartOfMonth && isFirstYear)) { + if (monthLocal === 0) { + monthLocal = 11; + yearLocal -= 1; + } else { + monthLocal -= 1; + } + } + return { monthLocal, yearLocal }; + } + + getNextMonth(monthLocal, yearLocal, years) { + let isEndOfMonth = monthLocal === 11; + let isLastYear = parseInt(yearLocal) === years[years.length - 1]; + if (!(isEndOfMonth && isLastYear)) { + if (monthLocal === 11) { + monthLocal = 0; + yearLocal += 1; + } else { + monthLocal += 1; + } + } + return { monthLocal, yearLocal }; + } + + changeYearCallback(event) { + this.setState({ year: parseInt(event.target.value) }); + } + + render() { + let months = this.createMonths(); + let years = this.createYears(); + let headers; + let sundayFirst; + if (this.props.local && this.props.local.sundayFirst) { + sundayFirst = true; + headers = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']; + } else { + sundayFirst = false; + headers = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su']; + } + + let fourtyTwoDays = getFourtyTwoDays(this.state.month, this.state.year, sundayFirst); + return ( +
+ + + +
+ ); + } } -export default Calendar \ No newline at end of file +export default Calendar; diff --git a/src/lib/calendar/CalendarHeader.jsx b/src/lib/calendar/CalendarHeader.jsx index 96e5e4a..0a2d442 100644 --- a/src/lib/calendar/CalendarHeader.jsx +++ b/src/lib/calendar/CalendarHeader.jsx @@ -1,22 +1,16 @@ import React from 'react'; -import '../style/DateTimeRange.css' -import "../style/DateTimeRange.css" +import '../style/DateTimeRange.css'; class CalendarHeader extends React.Component { + mapHeaderToDiv(headers) { + return headers.map(function(header, i) { + return
{header}
; + }); + } - mapHeaderToDiv(headers){ - return headers.map(function(header, i){ - return
{header}
- }) - } - - render(){ - let headerDivs = this.mapHeaderToDiv(this.props.headers); - return( -
- {headerDivs} -
- ); - } + render() { + let headerDivs = this.mapHeaderToDiv(this.props.headers); + return
{headerDivs}
; + } } -export default CalendarHeader \ No newline at end of file +export default CalendarHeader; diff --git a/src/lib/calendar/CalendarRow.jsx b/src/lib/calendar/CalendarRow.jsx index 54eca61..07b1c7f 100644 --- a/src/lib/calendar/CalendarRow.jsx +++ b/src/lib/calendar/CalendarRow.jsx @@ -1,37 +1,35 @@ import React from 'react'; -import '../style/DateTimeRange.css' -import Cell from './Cell' -class CalendarRow extends React.Component { - generateCells(){ - let cells = []; - let daysSize = this.props.rowDays.length; - for(let i = 0; i < daysSize; i++){ - cells.push(); - } - return cells; - } +import '../style/DateTimeRange.css'; +import Cell from './Cell'; +class CalendarRow extends React.Component { + generateCells() { + let cells = []; + let daysSize = this.props.rowDays.length; + for (let i = 0; i < daysSize; i++) { + cells.push( + + ); + } + return cells; + } - render(){ - let cells = this.generateCells(); - return( -
- {cells} -
- ); - } + render() { + let cells = this.generateCells(); + return
{cells}
; + } } -export default CalendarRow \ No newline at end of file +export default CalendarRow; diff --git a/src/lib/calendar/CalendarRows.jsx b/src/lib/calendar/CalendarRows.jsx index a25d05d..995b05f 100644 --- a/src/lib/calendar/CalendarRows.jsx +++ b/src/lib/calendar/CalendarRows.jsx @@ -1,41 +1,37 @@ import React from 'react'; -import '../style/DateTimeRange.css' -import "../style/DateTimeRange.css" -import CalendarRow from './CalendarRow' +import '../style/DateTimeRange.css'; +import CalendarRow from './CalendarRow'; class CalendarRows extends React.Component { + generateDays() { + let calendarRows = []; + for (let i = 0; i < 6; i++) { + let startIndex = i * 7; + let endIndex = (i + 1) * 7; + let rowDays = this.props.fourtyTwoDays.slice(startIndex, endIndex); + calendarRows.push( + + ); + } + return calendarRows; + } -generateDays(){ - let calendarRows = []; - for(let i = 0; i < 6; i++){ - let startIndex = i * 7; - let endIndex = (((i + 1) * 7)); - let rowDays = this.props.fourtyTwoDays.slice(startIndex, endIndex); - calendarRows.push() - } - return calendarRows; + render() { + let calendarRows = this.generateDays(); + return
{calendarRows}
; + } } - - render(){ - let calendarRows = this.generateDays(); - return( -
- {calendarRows} -
- ); - } -} -export default CalendarRows \ No newline at end of file +export default CalendarRows; diff --git a/src/lib/calendar/Cell.jsx b/src/lib/calendar/Cell.jsx index 9ac804d..df4459c 100644 --- a/src/lib/calendar/Cell.jsx +++ b/src/lib/calendar/Cell.jsx @@ -1,216 +1,223 @@ import React from 'react'; -import ReactDOM from 'react-dom' -import '../style/DateTimeRange.css' -import {startDateStyle, endDateStyle, inBetweenStyle, normalCellStyle, hoverCellStyle, greyCellStyle, invalidStyle} from '../utils/TimeFunctionUtils' -import {isInbetweenDates} from '../utils/TimeFunctionUtils' -import moment from 'moment' +import ReactDOM from 'react-dom'; +import { startDateStyle, endDateStyle, inBetweenStyle, normalCellStyle, hoverCellStyle, greyCellStyle, invalidStyle } from '../utils/TimeFunctionUtils'; +import { isInbetweenDates } from '../utils/TimeFunctionUtils'; +import moment from 'moment'; import { addFocusStyle } from '../utils/StyleUtils'; -import { pastMaxDate } from '../utils/DateSelectedUtils' +import { pastMaxDate } from '../utils/DateSelectedUtils'; + +import '../style/DateTimeRange.css'; class Cell extends React.Component { - constructor(props){ - super(props); - this.state = {style:{}}; - - this.mouseEnter = this.mouseEnter.bind(this); - this.mouseLeave = this.mouseLeave.bind(this); - this.onClick = this.onClick.bind(this); - this.keyDown = this.keyDown.bind(this); - this.onFocus = this.onFocus.bind(this); - this.onBlur = this.onBlur.bind(this); - } - - componentDidUpdate(oldProps){ - if(!this.props.date.isSame(oldProps.date) || !this.props.otherDate.isSame(oldProps.otherDate)) { - this.styleCell(); - } - if(!this.props.cellDay.isSame(oldProps.cellDay)) { - this.styleCell(); - } - - // If a Cell is Selected - // If the focusDate is this cell - // and its not a gray cell - // Then Focus on this cell - let cellFocused = false; - let focusDateIsCellDate = typeof this.props.focusDate === "object" && this.props.focusDate.isSame(this.props.cellDay, "day") - if(document.activeElement.id === "cell"){ - cellFocused = true; - } - if(cellFocused && focusDateIsCellDate && !this.shouldStyleCellGrey(this.props.cellDay)){ - this.cell.focus(); - this.props.focusOnCallback(false); - } - } - - pastMaxDatePropsChecker(isCellDateProp, days){ - if(isCellDateProp){ - if(pastMaxDate(moment(this.props.date).add(days, "days"), this.props.maxDate, true)){ - return true; - } - }else{ - if(pastMaxDate(moment(this.props.otherDate).add(days, "days"), this.props.maxDate, true)){ - return true; - } - } - return false; - } - - keyDown(e){ - let componentFocused = document.activeElement === ReactDOM.findDOMNode(this.cell); - if(componentFocused && e.keyCode >= 37 && e.keyCode <= 40){ - e.preventDefault(); - let newDate = moment(this.props.cellDay); - // Check to see if this cell is the date prop - let isCellDateProp = this.props.cellDay.isSame(this.props.date, "day"); - if(e.keyCode === 38){ // Up Key - newDate.subtract(7, "days"); - }else if(e.keyCode === 40){ // Down Key - if(this.pastMaxDatePropsChecker(isCellDateProp, 7)){ - return; - } - newDate.add(7, "days"); - }else if(e.keyCode === 37){ // Left Key - newDate.subtract(1, "days"); - }else if(e.keyCode === 39){ // Right Key - if(this.pastMaxDatePropsChecker(isCellDateProp, 1)){ - return; - } - newDate.add(1, "days"); - } - this.props.keyboardCellCallback(this.props.cellDay, newDate); - this.props.focusOnCallback(newDate); - } - } - - onClick(){ - if(pastMaxDate(this.props.cellDay, this.props.maxDate, false)){ - return; - } - this.props.dateSelectedNoTimeCallback(this.props.cellDay); - } - - mouseEnter(){ - // If Past Max Date Style Cell Out of Use - if(this.checkAndSetMaxDateStyle(this.props.cellDay)){ - return; - } - // Hover Style Cell, Different if inbetween start and end date - let isDateStart = this.props.date.isSameOrBefore(this.props.otherDate, "minute"); - if(isInbetweenDates(isDateStart, this.props.cellDay, this.props.date, this.props.otherDate)){ - this.setState({"style": hoverCellStyle(true)}); - }else{ - this.setState({"style": hoverCellStyle()}); - } - } - - mouseLeave(){ - this.styleCell(); - } - - onFocus(){ - this.props.cellFocusedCallback(this.props.cellDay); - this.setState({focus:true}) - } - - onBlur(){ - this.setState({focus:false}) - } - - shouldStyleCellGrey(cellDay){ - let month = this.props.month; - let cellDayMonth = cellDay.month(); - if(month !== cellDayMonth){ - return true; - } - } - - shouldStyleCellStartEnd(cellDay, date, otherDate, startCheck, endCheck){ - let isCellDateProp = cellDay.isSame(date, "day"); - let isCellOtherDateProp = cellDay.isSame(otherDate, "day") - let isDateStart = date.isSameOrBefore(otherDate, "minute"); - let isOtherDateStart = otherDate.isSameOrBefore(date, "minute"); - - if(startCheck){ - return (isCellDateProp && isDateStart) || (isCellOtherDateProp && isOtherDateStart) - }else if(endCheck){ - return (isCellDateProp && !isDateStart) || (isCellOtherDateProp && !isOtherDateStart) - } - } - - checkAndSetMaxDateStyle(cellDate){ - if(pastMaxDate(cellDate, this.props.maxDate, false)){ - this.setState({"style": invalidStyle()}); - return true; - } - return false; - } - - styleCell(){ - let cellDay = this.props.cellDay; - let date = this.props.date; - let otherDate = this.props.otherDate; - - // If Past Max Date Style Cell Out of Use - if(this.checkAndSetMaxDateStyle(cellDay)){ - return; - } - - if(this.shouldStyleCellGrey(cellDay)){ - this.setState({"style": greyCellStyle()}); - return; - } - - let isDateStart = date.isSameOrBefore(otherDate, "minute"); - let inbetweenDates = isInbetweenDates(isDateStart, cellDay, date, otherDate); - - if(this.shouldStyleCellStartEnd(cellDay, date, otherDate, true, false)){ - this.setState({"style": startDateStyle()}); - }else if(this.shouldStyleCellStartEnd(cellDay, date, otherDate, false, true)){ - this.setState({"style": endDateStyle()}); - }else if(inbetweenDates){ - this.setState({"style": inBetweenStyle()}); - }else{ - this.setState({"style": normalCellStyle()}); - } - } - - isStartOrEndDate(){ - let cellDay = this.props.cellDay; - let date = this.props.date; - let otherDate = this.props.otherDate; - if(this.shouldStyleCellStartEnd(cellDay, date, otherDate, true, false) || this.shouldStyleCellStartEnd(cellDay, date, otherDate, false, true)){ - return true; - } - return false; - } - - render(){ - let dateFormatted = this.props.cellDay.format("D"); - let tabIndex = -1; - if(this.isStartOrEndDate() && !this.shouldStyleCellGrey(this.props.cellDay)){ - document.addEventListener("keydown", this.keyDown, false); - tabIndex = 0; - }else{ - document.removeEventListener("keydown", this.keyDown, false); - } - let style = addFocusStyle(this.state.focus, this.state.style); - return( -
{ this.cell = cell; }} - className="calendarCell" - tabIndex={tabIndex} - style={style} - onMouseEnter={this.mouseEnter} - onMouseLeave={this.mouseLeave} - onClick={this.onClick} - onFocus={this.onFocus} - onBlur={this.onBlur} - id="cell" - > - {dateFormatted} -
- ); - } + constructor(props) { + super(props); + this.state = { style: {} }; + + this.mouseEnter = this.mouseEnter.bind(this); + this.mouseLeave = this.mouseLeave.bind(this); + this.onClick = this.onClick.bind(this); + this.keyDown = this.keyDown.bind(this); + this.onFocus = this.onFocus.bind(this); + this.onBlur = this.onBlur.bind(this); + } + + componentDidUpdate(oldProps) { + if (!this.props.date.isSame(oldProps.date) || !this.props.otherDate.isSame(oldProps.otherDate)) { + this.styleCell(); + } + if (!this.props.cellDay.isSame(oldProps.cellDay)) { + this.styleCell(); + } + + // If a Cell is Selected + // If the focusDate is this cell + // and its not a gray cell + // Then Focus on this cell + let cellFocused = false; + let focusDateIsCellDate = typeof this.props.focusDate === 'object' && this.props.focusDate.isSame(this.props.cellDay, 'day'); + if (document.activeElement.id === 'cell') { + cellFocused = true; + } + if (cellFocused && focusDateIsCellDate && !this.shouldStyleCellGrey(this.props.cellDay)) { + this.cell.focus(); + this.props.focusOnCallback(false); + } + } + + pastMaxDatePropsChecker(isCellDateProp, days) { + if (isCellDateProp) { + if (pastMaxDate(moment(this.props.date).add(days, 'days'), this.props.maxDate, true)) { + return true; + } + } else { + if (pastMaxDate(moment(this.props.otherDate).add(days, 'days'), this.props.maxDate, true)) { + return true; + } + } + return false; + } + + keyDown(e) { + let componentFocused = document.activeElement === ReactDOM.findDOMNode(this.cell); + if (componentFocused && e.keyCode >= 37 && e.keyCode <= 40) { + e.preventDefault(); + let newDate = moment(this.props.cellDay); + // Check to see if this cell is the date prop + let isCellDateProp = this.props.cellDay.isSame(this.props.date, 'day'); + if (e.keyCode === 38) { + // Up Key + newDate.subtract(7, 'days'); + } else if (e.keyCode === 40) { + // Down Key + if (this.pastMaxDatePropsChecker(isCellDateProp, 7)) { + return; + } + newDate.add(7, 'days'); + } else if (e.keyCode === 37) { + // Left Key + newDate.subtract(1, 'days'); + } else if (e.keyCode === 39) { + // Right Key + if (this.pastMaxDatePropsChecker(isCellDateProp, 1)) { + return; + } + newDate.add(1, 'days'); + } + this.props.keyboardCellCallback(this.props.cellDay, newDate); + this.props.focusOnCallback(newDate); + } + } + + onClick() { + if (pastMaxDate(this.props.cellDay, this.props.maxDate, false)) { + return; + } + this.props.dateSelectedNoTimeCallback(this.props.cellDay); + } + + mouseEnter() { + // If Past Max Date Style Cell Out of Use + if (this.checkAndSetMaxDateStyle(this.props.cellDay)) { + return; + } + // Hover Style Cell, Different if inbetween start and end date + let isDateStart = this.props.date.isSameOrBefore(this.props.otherDate, 'minute'); + if (isInbetweenDates(isDateStart, this.props.cellDay, this.props.date, this.props.otherDate)) { + this.setState({ style: hoverCellStyle(true) }); + } else { + this.setState({ style: hoverCellStyle() }); + } + } + + mouseLeave() { + this.styleCell(); + } + + onFocus() { + this.props.cellFocusedCallback(this.props.cellDay); + this.setState({ focus: true }); + } + + onBlur() { + this.setState({ focus: false }); + } + + shouldStyleCellGrey(cellDay) { + let month = this.props.month; + let cellDayMonth = cellDay.month(); + if (month !== cellDayMonth) { + return true; + } + } + + shouldStyleCellStartEnd(cellDay, date, otherDate, startCheck, endCheck) { + let isCellDateProp = cellDay.isSame(date, 'day'); + let isCellOtherDateProp = cellDay.isSame(otherDate, 'day'); + let isDateStart = date.isSameOrBefore(otherDate, 'minute'); + let isOtherDateStart = otherDate.isSameOrBefore(date, 'minute'); + + if (startCheck) { + return (isCellDateProp && isDateStart) || (isCellOtherDateProp && isOtherDateStart); + } else if (endCheck) { + return (isCellDateProp && !isDateStart) || (isCellOtherDateProp && !isOtherDateStart); + } + } + + checkAndSetMaxDateStyle(cellDate) { + if (pastMaxDate(cellDate, this.props.maxDate, false)) { + this.setState({ style: invalidStyle() }); + return true; + } + return false; + } + + styleCell() { + let cellDay = this.props.cellDay; + let date = this.props.date; + let otherDate = this.props.otherDate; + + // If Past Max Date Style Cell Out of Use + if (this.checkAndSetMaxDateStyle(cellDay)) { + return; + } + + if (this.shouldStyleCellGrey(cellDay)) { + this.setState({ style: greyCellStyle() }); + return; + } + + let isDateStart = date.isSameOrBefore(otherDate, 'minute'); + let inbetweenDates = isInbetweenDates(isDateStart, cellDay, date, otherDate); + + if (this.shouldStyleCellStartEnd(cellDay, date, otherDate, true, false)) { + this.setState({ style: startDateStyle() }); + } else if (this.shouldStyleCellStartEnd(cellDay, date, otherDate, false, true)) { + this.setState({ style: endDateStyle() }); + } else if (inbetweenDates) { + this.setState({ style: inBetweenStyle() }); + } else { + this.setState({ style: normalCellStyle() }); + } + } + + isStartOrEndDate() { + let cellDay = this.props.cellDay; + let date = this.props.date; + let otherDate = this.props.otherDate; + if (this.shouldStyleCellStartEnd(cellDay, date, otherDate, true, false) || this.shouldStyleCellStartEnd(cellDay, date, otherDate, false, true)) { + return true; + } + return false; + } + + render() { + let dateFormatted = this.props.cellDay.format('D'); + let tabIndex = -1; + if (this.isStartOrEndDate() && !this.shouldStyleCellGrey(this.props.cellDay)) { + document.addEventListener('keydown', this.keyDown, false); + tabIndex = 0; + } else { + document.removeEventListener('keydown', this.keyDown, false); + } + let style = addFocusStyle(this.state.focus, this.state.style); + return ( +
{ + this.cell = cell; + }} + className="calendarCell" + tabIndex={tabIndex} + style={style} + onMouseEnter={this.mouseEnter} + onMouseLeave={this.mouseLeave} + onClick={this.onClick} + onFocus={this.onFocus} + onBlur={this.onBlur} + id="cell" + > + {dateFormatted} +
+ ); + } } -export default Cell \ No newline at end of file +export default Cell; diff --git a/src/lib/calendar/MonthYearSelector.jsx b/src/lib/calendar/MonthYearSelector.jsx index 7a114a0..6c0d8b0 100644 --- a/src/lib/calendar/MonthYearSelector.jsx +++ b/src/lib/calendar/MonthYearSelector.jsx @@ -1,98 +1,82 @@ import React from 'react'; -import '../style/DateTimeRange.css' -import "../style/DateTimeRange.css" -import {Glyphicon} from 'react-bootstrap' -import {addFocusStyle} from '../utils/StyleUtils.js' +import '../style/DateTimeRange.css'; +import { Glyphicon } from 'react-bootstrap'; +import { addFocusStyle } from '../utils/StyleUtils.js'; class MonthYearSelector extends React.Component { + constructor(props) { + super(props); + this.state = { + monthFocus: false, + yearFocus: false + }; - constructor(props){ - super(props); - this.state = { - monthFocus : false, - yearFocus : false - } + this.monthFocus = this.monthFocus.bind(this); + this.yearFocus = this.yearFocus.bind(this); + this.monthBlur = this.monthBlur.bind(this); + this.yearBlur = this.yearBlur.bind(this); + } - this.monthFocus = this.monthFocus.bind(this); - this.yearFocus = this.yearFocus.bind(this); - this.monthBlur = this.monthBlur.bind(this); - this.yearBlur = this.yearBlur.bind(this); - } + createCalendarMonths(months) { + return this.mapToOption(months); + } - createCalendarMonths(months){ - return this.mapToOption(months); - } + createYears(years) { + return this.mapToOption(years); + } - createYears(years){ - return this.mapToOption(years); - } + monthFocus() { + this.setState({ monthFocus: true }); + } - monthFocus(){ - this.setState({monthFocus: true}) - } + monthBlur() { + this.setState({ monthFocus: false }); + } - monthBlur(){ - this.setState({monthFocus: false}) - } + yearFocus() { + this.setState({ yearFocus: true }); + } - yearFocus(){ - this.setState({yearFocus: true}) - } + yearBlur() { + this.setState({ yearFocus: false }); + } - yearBlur(){ - this.setState({yearFocus: false}) - } + mapToOption(variableArray) { + return variableArray.map(function(varInstance, i) { + return ; + }); + } - mapToOption(variableArray){ - return variableArray.map(function(varInstance, i){ - return - }) - } + createGlyph(icon, onClickHandler, previous, next) { + return onClickHandler(previous, next)} />; + } - createGlyph(icon, onClickHandler, previous, next){ - return onClickHandler(previous, next)} - /> - } + render() { + let months = this.createCalendarMonths(this.props.months); + let years = this.createYears(this.props.years); + let leftArrow = this.createGlyph('chevron-left', this.props.changeMonthArrowsCallback, true, false); + let rightArrow = this.createGlyph('chevron-right', this.props.changeMonthArrowsCallback, false, true); + let monthFocusStyle = {}; + monthFocusStyle = addFocusStyle(this.state.monthFocus, monthFocusStyle); + let yearFocusStyle = {}; + yearFocusStyle = addFocusStyle(this.state.yearFocus, yearFocusStyle); - render(){ - let months = this.createCalendarMonths(this.props.months); - let years = this.createYears(this.props.years); - let leftArrow = this.createGlyph("chevron-left", this.props.changeMonthArrowsCallback, true, false); - let rightArrow = this.createGlyph("chevron-right", this.props.changeMonthArrowsCallback, false, true); - let monthFocusStyle = {}; - monthFocusStyle = addFocusStyle(this.state.monthFocus, monthFocusStyle); - let yearFocusStyle = {}; - yearFocusStyle = addFocusStyle(this.state.yearFocus, yearFocusStyle); - - return( -
-
- {leftArrow} -
-
- -
-
- -
-
- {rightArrow} -
-
- ); - } + return ( +
+
{leftArrow}
+
+ +
+
+ +
+
{rightArrow}
+
+ ); + } } -export default MonthYearSelector \ No newline at end of file +export default MonthYearSelector; diff --git a/src/lib/date_picker/ActiveNotifier.jsx b/src/lib/date_picker/ActiveNotifier.jsx index 14ae241..cc3f1e8 100644 --- a/src/lib/date_picker/ActiveNotifier.jsx +++ b/src/lib/date_picker/ActiveNotifier.jsx @@ -1,33 +1,28 @@ import React from 'react'; -import '../style/DateTimeRange.css' +import '../style/DateTimeRange.css'; class ActiveNotifier extends React.Component { + getDotDiv(text, style) { + return ( +
+ {text} +
+ ); + } - getDotDiv(text, style){ - return( -
- {text} -
- ); - } + render() { + let selectingModeFrom = this.props.selectingModeFrom; + let mode = this.props.mode; - render(){ - let selectingModeFrom= this.props.selectingModeFrom; - let mode = this.props.mode; - - let notifier; - if(selectingModeFrom && mode === "start"){ - notifier = this.getDotDiv("Selecting From ", "#12bc00") - }else if(!selectingModeFrom && mode === "end"){ - notifier = this.getDotDiv("Selecting To ", "#D70022") - }else{ - notifier =
- } - return( -
- {notifier} -
- ); - } + let notifier; + if (selectingModeFrom && mode === 'start') { + notifier = this.getDotDiv('Selecting From ', '#12bc00'); + } else if (!selectingModeFrom && mode === 'end') { + notifier = this.getDotDiv('Selecting To ', '#D70022'); + } else { + notifier =
; + } + return
{notifier}
; + } } -export default ActiveNotifier \ No newline at end of file +export default ActiveNotifier; diff --git a/src/lib/date_picker/ApplyCancelButtons.jsx b/src/lib/date_picker/ApplyCancelButtons.jsx index e84b8ad..ad79a39 100644 --- a/src/lib/date_picker/ApplyCancelButtons.jsx +++ b/src/lib/date_picker/ApplyCancelButtons.jsx @@ -1,6 +1,5 @@ import React from 'react'; import '../style/DateTimeRange.css'; -import '../style/DateTimeRange.css'; import { addFocusStyle } from '../utils/StyleUtils'; class ApplyCancelButtons extends React.Component { diff --git a/src/lib/date_picker/DateField.jsx b/src/lib/date_picker/DateField.jsx index 4ce30da..3981970 100644 --- a/src/lib/date_picker/DateField.jsx +++ b/src/lib/date_picker/DateField.jsx @@ -1,46 +1,41 @@ import React from 'react'; -import '../style/DateTimeRange.css' -import {InputGroup, FormControl, Glyphicon} from 'react-bootstrap' +import '../style/DateTimeRange.css'; +import { InputGroup, FormControl, Glyphicon } from 'react-bootstrap'; class DateField extends React.Component { + constructor(props) { + super(props); - constructor(props){ - super(props); + this.onChangeDateTextHandler = this.onChangeDateTextHandler.bind(this); + this.onBlur = this.onBlur.bind(this); + this.onClick = this.onClick.bind(this); + } - this.onChangeDateTextHandler = this.onChangeDateTextHandler.bind(this); - this.onBlur = this.onBlur.bind(this); - this.onClick= this.onClick.bind(this); - } - - onChangeDateTextHandler(event){ - this.props.onChangeDateTextHandlerCallback(event.target.value, this.props.mode); - } + onChangeDateTextHandler(event) { + this.props.onChangeDateTextHandlerCallback(event.target.value, this.props.mode); + } - onBlur(){ - this.props.dateTextFieldCallback(this.props.mode) - } + onBlur() { + this.props.dateTextFieldCallback(this.props.mode); + } - onClick(){ - if(this.props.mode === "start"){ - this.props.changeSelectingModeCallback(true); - }else{ - this.props.changeSelectingModeCallback(false); - } - } + onClick() { + if (this.props.mode === 'start') { + this.props.changeSelectingModeCallback(true); + } else { + this.props.changeSelectingModeCallback(false); + } + } - render(){ - return( - - - - - ); - } + render() { + return ( + + + + + + + ); + } } -export default DateField \ No newline at end of file +export default DateField; diff --git a/src/lib/date_picker/DatePicker.jsx b/src/lib/date_picker/DatePicker.jsx index 7743df3..9a53c98 100644 --- a/src/lib/date_picker/DatePicker.jsx +++ b/src/lib/date_picker/DatePicker.jsx @@ -1,6 +1,5 @@ import React from 'react'; import '../style/DateTimeRange.css'; -import '../style/DateTimeRange.css'; import Label from './Label'; import DateField from './DateField'; import TimeField from './TimeField'; diff --git a/src/lib/date_picker/Label.jsx b/src/lib/date_picker/Label.jsx index 9a9262a..3dbd5cb 100644 --- a/src/lib/date_picker/Label.jsx +++ b/src/lib/date_picker/Label.jsx @@ -1,19 +1,14 @@ import React from 'react'; -import '../style/DateTimeRange.css' -import "../style/DateTimeRange.css" +import '../style/DateTimeRange.css'; import PropTypes from 'prop-types'; class Label extends React.Component { - render(){ - return( -
- {this.props.label} -
- ); - } + render() { + return
{this.props.label}
; + } } -export default Label +export default Label; Label.propTypes = { - label: PropTypes.string.isRequired, -}; \ No newline at end of file + label: PropTypes.string.isRequired +}; diff --git a/src/lib/date_picker/TimeField.jsx b/src/lib/date_picker/TimeField.jsx index 2c2e416..7e28111 100644 --- a/src/lib/date_picker/TimeField.jsx +++ b/src/lib/date_picker/TimeField.jsx @@ -1,105 +1,106 @@ import React from 'react'; -import '../style/DateTimeRange.css' -import "../style/DateTimeRange.css" -import {Glyphicon} from 'react-bootstrap' -import {generateHours, generateMinutes} from '../utils/TimeFunctionUtils' +import '../style/DateTimeRange.css'; +import { Glyphicon } from 'react-bootstrap'; +import { generateHours, generateMinutes } from '../utils/TimeFunctionUtils'; import { addFocusStyle } from '../utils/StyleUtils'; class TimeField extends React.Component { + constructor(props) { + super(props); + this.state = { + hourFocus: false, + minuteFocus: false + }; + this.handleHourChange = this.handleHourChange.bind(this); + this.handleMinuteChange = this.handleMinuteChange.bind(this); + this.hourFocus = this.hourFocus.bind(this); + this.minuteFocus = this.minuteFocus.bind(this); + this.hourBlur = this.hourBlur.bind(this); + this.minuteBlur = this.minuteBlur.bind(this); + } - constructor(props){ - super(props); - this.state = { - hourFocus : false, - minuteFocus : false - } - this.handleHourChange = this.handleHourChange.bind(this); - this.handleMinuteChange = this.handleMinuteChange.bind(this); - this.hourFocus = this.hourFocus.bind(this); - this.minuteFocus = this.minuteFocus.bind(this); - this.hourBlur = this.hourBlur.bind(this); - this.minuteBlur = this.minuteBlur.bind(this); - } + generateHourSelectValues() { + let hours = generateHours(); + let selectValues = []; + for (let i = 0; i < hours.length; i++) { + selectValues.push( + + ); + } + return selectValues; + } - generateHourSelectValues() { - let hours = generateHours(); - let selectValues = []; - for(let i = 0; i < hours.length; i++){ - selectValues.push(); - } - return selectValues; - } + generateMinuteSelectValues() { + let minutes = generateMinutes(); + let selectValues = []; + for (let i = 0; i < minutes.length; i++) { + selectValues.push( + + ); + } + return selectValues; + } - generateMinuteSelectValues(){ - let minutes = generateMinutes(); - let selectValues = [] - for(let i = 0; i < minutes.length; i++){ - selectValues.push(); - } - return selectValues; - } + handleHourChange(event) { + this.props.timeChangeCallback(parseInt(event.target.value), this.props.date.minute(), this.props.mode); + } - handleHourChange(event){ - this.props.timeChangeCallback(parseInt(event.target.value), this.props.date.minute(), this.props.mode); - } + handleMinuteChange(event) { + this.props.timeChangeCallback(this.props.date.hour(), parseInt(event.target.value), this.props.mode); + } - handleMinuteChange(event){ - this.props.timeChangeCallback(this.props.date.hour(), parseInt(event.target.value), this.props.mode); - } + hourFocus() { + this.setState({ hourFocus: true }); + } - hourFocus(){ - this.setState({hourFocus: true}) - } + hourBlur() { + this.setState({ hourFocus: false }); + } - hourBlur(){ - this.setState({hourFocus: false}) - } + minuteFocus() { + this.setState({ minuteFocus: true }); + } - minuteFocus(){ - this.setState({minuteFocus: true}) - } + minuteBlur() { + this.setState({ minuteFocus: false }); + } - minuteBlur(){ - this.setState({minuteFocus: false}) - } + renderSelectField(valueInput, onChangeInput, optionsInput) { + return ( + + ); + } - renderSelectField(valueInput, onChangeInput, optionsInput){ - return( - - ); - } + render() { + let hours = this.generateHourSelectValues(); + let minutes = this.generateMinuteSelectValues(); + let hour = this.props.date.hour(); + let minute = this.props.date.minute(); + let hourFocusStyle = {}; + hourFocusStyle = addFocusStyle(this.state.hourFocus, hourFocusStyle); + let minuteFocusStyle = {}; + minuteFocusStyle = addFocusStyle(this.state.minuteFocus, minuteFocusStyle); - render(){ - let hours = this.generateHourSelectValues(); - let minutes = this.generateMinuteSelectValues(); - let hour = this.props.date.hour(); - let minute = this.props.date.minute(); - let hourFocusStyle = {}; - hourFocusStyle = addFocusStyle(this.state.hourFocus, hourFocusStyle); - let minuteFocusStyle = {}; - minuteFocusStyle = addFocusStyle(this.state.minuteFocus, minuteFocusStyle); - - return( -
-
-
- {this.renderSelectField(hour, this.handleHourChange, hours)} -
-
- : -
-
- {this.renderSelectField(minute, this.handleMinuteChange, minutes)} -
-
- -
- ); - } + return ( +
+
+
+ {this.renderSelectField(hour, this.handleHourChange, hours)} +
+
:
+
+ {this.renderSelectField(minute, this.handleMinuteChange, minutes)} +
+
+ +
+ ); + } } -export default TimeField \ No newline at end of file +export default TimeField; diff --git a/src/lib/ranges/RangeButton.jsx b/src/lib/ranges/RangeButton.jsx index fb15731..d693bcf 100644 --- a/src/lib/ranges/RangeButton.jsx +++ b/src/lib/ranges/RangeButton.jsx @@ -1,128 +1,129 @@ import React from 'react'; -import ReactDOM from "react-dom"; -import '../style/DateTimeRange.css' -import "../style/DateTimeRange.css" +import ReactDOM from 'react-dom'; +import '../style/DateTimeRange.css'; import { addFocusStyle } from '../utils/StyleUtils'; -class RangeButton extends React.Component{ - constructor(props){ - super(props); - this.state = { - style : "rangebuttonstyle", - } +class RangeButton extends React.Component { + constructor(props) { + super(props); + this.state = { + style: 'rangebuttonstyle' + }; - this.mouseEnter = this.mouseEnter.bind(this); - this.mouseLeave = this.mouseLeave.bind(this); - this.onFocus = this.onFocus.bind(this); - this.onBlur = this.onBlur.bind(this); - this.keyDown = this.keyDown.bind(this); - } + this.mouseEnter = this.mouseEnter.bind(this); + this.mouseLeave = this.mouseLeave.bind(this); + this.onFocus = this.onFocus.bind(this); + this.onBlur = this.onBlur.bind(this); + this.keyDown = this.keyDown.bind(this); + } - componentWillReceiveProps(nextProps){ - let focused = nextProps.focused[nextProps.index]; - // If selected index or focused set to selected style - if(nextProps.index === nextProps.selectedRange || focused){ - this.setState({style:"rangeButtonSelectedStyle"}) - }else{ - this.setState({style:"rangebuttonstyle"}) - } - } + componentWillReceiveProps(nextProps) { + let focused = nextProps.focused[nextProps.index]; + // If selected index or focused set to selected style + if (nextProps.index === nextProps.selectedRange || focused) { + this.setState({ style: 'rangeButtonSelectedStyle' }); + } else { + this.setState({ style: 'rangebuttonstyle' }); + } + } - componentDidUpdate(prevProps, prevState){ - let isComponentViewing = this.props.index === this.props.viewingIndex; - let focused = this.props.focused; - let focusedOnARange = false - for(let i = 0; i < focused.length; i++){ - if(focused[i] === true){ - focusedOnARange = true; - break; - } - } - // If the component we are currently on is the selected viewing component - // and we are focused on it according to our focused matrix. - // Then add an event listener for this button and set it as focused - if(isComponentViewing && focusedOnARange){ - document.addEventListener("keydown", this.keyDown, false); - this.button.focus(); - } - } + componentDidUpdate(prevProps, prevState) { + let isComponentViewing = this.props.index === this.props.viewingIndex; + let focused = this.props.focused; + let focusedOnARange = false; + for (let i = 0; i < focused.length; i++) { + if (focused[i] === true) { + focusedOnARange = true; + break; + } + } + // If the component we are currently on is the selected viewing component + // and we are focused on it according to our focused matrix. + // Then add an event listener for this button and set it as focused + if (isComponentViewing && focusedOnARange) { + document.addEventListener('keydown', this.keyDown, false); + this.button.focus(); + } + } - mouseEnter(){ - // Set hover style - this.setState({style:"rangeButtonSelectedStyle"}) - } + mouseEnter() { + // Set hover style + this.setState({ style: 'rangeButtonSelectedStyle' }); + } - mouseLeave(focused){ - let isFocused; - if (typeof focused === 'boolean'){ - isFocused = focused; - }else{ - isFocused = this.state.focused; - } - let isSelected = this.props.index === this.props.selectedRange; - // If not selected and not focused then on mouse leave set to normal style - if(!isSelected && !isFocused){ - this.setState({style:"rangebuttonstyle"}) - } - } + mouseLeave(focused) { + let isFocused; + if (typeof focused === 'boolean') { + isFocused = focused; + } else { + isFocused = this.state.focused; + } + let isSelected = this.props.index === this.props.selectedRange; + // If not selected and not focused then on mouse leave set to normal style + if (!isSelected && !isFocused) { + this.setState({ style: 'rangebuttonstyle' }); + } + } - onFocus(){ - this.setState({focused: true}); - this.props.setFocusedCallback(this.props.index, true); - this.mouseEnter(true); - } + onFocus() { + this.setState({ focused: true }); + this.props.setFocusedCallback(this.props.index, true); + this.mouseEnter(true); + } - onBlur(){ - this.setState({focused: false}); - this.props.setFocusedCallback(this.props.index, false); - this.mouseLeave(false); - document.removeEventListener("keydown", this.keyDown, false); - } + onBlur() { + this.setState({ focused: false }); + this.props.setFocusedCallback(this.props.index, false); + this.mouseLeave(false); + document.removeEventListener('keydown', this.keyDown, false); + } - keyDown(e){ - let componentFocused = document.activeElement === ReactDOM.findDOMNode(this.button); - // Up Key - if (e.keyCode === 38 && componentFocused) { - e.preventDefault(); - this.props.viewingIndexChangeCallback(this.props.index - 1); - } - // Down Key - else if (e.keyCode === 40 && componentFocused) { - e.preventDefault(); - this.props.viewingIndexChangeCallback(this.props.index + 1); - } - // Space Bar and Enter - else if(e.keyCode === 32 || e.keyCode === 13){ - this.props.rangeSelectedCallback(this.props.index, this.props.label); - } - } + keyDown(e) { + let componentFocused = document.activeElement === ReactDOM.findDOMNode(this.button); + // Up Key + if (e.keyCode === 38 && componentFocused) { + e.preventDefault(); + this.props.viewingIndexChangeCallback(this.props.index - 1); + } + // Down Key + else if (e.keyCode === 40 && componentFocused) { + e.preventDefault(); + this.props.viewingIndexChangeCallback(this.props.index + 1); + } + // Space Bar and Enter + else if (e.keyCode === 32 || e.keyCode === 13) { + this.props.rangeSelectedCallback(this.props.index, this.props.label); + } + } - render(){ - let isViewingIndex = this.props.viewingIndex === this.props.index; - let tabIndex; - if(isViewingIndex){ - tabIndex = 0; - }else{ - tabIndex = -1; - } - let focusStyle = {}; - focusStyle = addFocusStyle(this.state.focused, focusStyle); - return( -
{ this.button = button; }} - className={this.state.style} - onMouseEnter={this.mouseEnter} - onMouseLeave={this.mouseLeave} - onFocus={this.onFocus} - onBlur={this.onBlur} - tabIndex={tabIndex} - style={focusStyle} - > -
this.props.rangeSelectedCallback(this.props.index, this.props.label)}> - {this.props.label} -
-
- ) - } + render() { + let isViewingIndex = this.props.viewingIndex === this.props.index; + let tabIndex; + if (isViewingIndex) { + tabIndex = 0; + } else { + tabIndex = -1; + } + let focusStyle = {}; + focusStyle = addFocusStyle(this.state.focused, focusStyle); + return ( +
{ + this.button = button; + }} + className={this.state.style} + onMouseEnter={this.mouseEnter} + onMouseLeave={this.mouseLeave} + onFocus={this.onFocus} + onBlur={this.onBlur} + tabIndex={tabIndex} + style={focusStyle} + > +
this.props.rangeSelectedCallback(this.props.index, this.props.label)}> + {this.props.label} +
+
+ ); + } } -export default RangeButton \ No newline at end of file +export default RangeButton; diff --git a/src/lib/ranges/Ranges.jsx b/src/lib/ranges/Ranges.jsx index 96ed318..29e832c 100644 --- a/src/lib/ranges/Ranges.jsx +++ b/src/lib/ranges/Ranges.jsx @@ -1,80 +1,79 @@ import React from 'react'; -import '../style/DateTimeRange.css' -import "../style/DateTimeRange.css" -import RangeButton from "./RangeButton" -import {mobileBreakPoint} from "../DateTimeRangeContainer" -class Ranges extends React.Component{ +import '../style/DateTimeRange.css'; +import RangeButton from './RangeButton'; +import { mobileBreakPoint } from '../DateTimeRangeContainer'; - constructor(props){ - super(props); +class Ranges extends React.Component { + constructor(props) { + super(props); - let focused = []; - let ranges = Object.values(this.props.ranges) - for(let i = 0; i < ranges.length; i++){ - focused.push(false); - } + let focused = []; + let ranges = Object.values(this.props.ranges); + for (let i = 0; i < ranges.length; i++) { + focused.push(false); + } - this.state = ({ - viewingIndex: 0, - focused : focused - }) + this.state = { + viewingIndex: 0, + focused: focused + }; - this.viewingIndexChangeCallback = this.viewingIndexChangeCallback.bind(this); - this.setFocusedCallback = this.setFocusedCallback.bind(this); - } + this.viewingIndexChangeCallback = this.viewingIndexChangeCallback.bind(this); + this.setFocusedCallback = this.setFocusedCallback.bind(this); + } - componentWillReceiveProps(nextProps){ - // On Change of Selected Range reset viewing index to be the range index - if(this.props.selectedRange !== nextProps.selectedRange){ - this.setState({ - viewingIndex : nextProps.selectedRange - }) - } - } + componentWillReceiveProps(nextProps) { + // On Change of Selected Range reset viewing index to be the range index + if (this.props.selectedRange !== nextProps.selectedRange) { + this.setState({ + viewingIndex: nextProps.selectedRange + }); + } + } - viewingIndexChangeCallback(newIndex){ - // Allow a new item selected to be made - let length = this.state.focused.length - if(newIndex >= 0 && newIndex < length){ - this.setState({ - viewingIndex : newIndex - }) - } - } + viewingIndexChangeCallback(newIndex) { + // Allow a new item selected to be made + let length = this.state.focused.length; + if (newIndex >= 0 && newIndex < length) { + this.setState({ + viewingIndex: newIndex + }); + } + } - setFocusedCallback(index, focusedInput){ - // Set the focus value of indexed item, focusedInput is true or false - let focused = this.state.focused; - focused[index] = focusedInput; - this.setState({ - focused : focused - }) - } + setFocusedCallback(index, focusedInput) { + // Set the focus value of indexed item, focusedInput is true or false + let focused = this.state.focused; + focused[index] = focusedInput; + this.setState({ + focused: focused + }); + } - render(){ - let displayI = ''; - if(this.props.screenWidthToTheRight < mobileBreakPoint){ - displayI = 'contents'; - } - // Map the range index and object name and value to a range button - return( -
- {Object.keys(this.props.ranges).map((range, i) => ( - - ))} -
- ) - } + render() { + let displayI = ''; + if (this.props.screenWidthToTheRight < mobileBreakPoint) { + displayI = 'contents'; + } + // Map the range index and object name and value to a range button + return ( +
+ {Object.keys(this.props.ranges).map((range, i) => ( + + ))} +
+ ); + } } -export default Ranges \ No newline at end of file +export default Ranges; From 160931014cba828560ef7563ec23366641da96c2 Mon Sep 17 00:00:00 2001 From: andreaci Date: Fri, 1 Mar 2019 15:46:48 +0100 Subject: [PATCH 06/31] single-day selection --- src/Wrapper.jsx | 27 ++++++++++-- src/lib/DateTimeRangeContainer.jsx | 4 +- src/lib/DateTimeRangePicker.jsx | 67 ++++++++++++++++++++++-------- src/lib/date_picker/DatePicker.jsx | 22 ++++++++-- 4 files changed, 95 insertions(+), 25 deletions(-) diff --git a/src/Wrapper.jsx b/src/Wrapper.jsx index 3dcbde2..97c2f05 100644 --- a/src/Wrapper.jsx +++ b/src/Wrapper.jsx @@ -27,9 +27,9 @@ class Wrapper extends React.Component { } applyCallback(startDate, endDate) { - // console.log("Apply Callback"); - // console.log(startDate.format("DD-MM-YYYY HH:mm")); - // console.log(endDate.format("DD-MM-YYYY HH:mm")); + //console.log('Apply Callback'); + //console.log(startDate.format('DD-MM-YYYY HH:mm')); + //console.log(endDate.format('DD-MM-YYYY HH:mm')); this.setState({ start: startDate, end: endDate @@ -158,6 +158,24 @@ class Wrapper extends React.Component { ); } + renderMax1Day(ranges, local, maxDate) { + return ( + + + 1 + + + + + + + 3 + + + + ); + } + render() { let now = new Date(); let start = moment(new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0, 0)); @@ -182,6 +200,9 @@ class Wrapper extends React.Component { let maxDate = moment(start).add(24, 'hour'); return (
+

renderMax1Day

+ {this.renderMax1Day(ranges, local, maxDate)} +

renderContainerNoGrid

{this.renderContainerNoGrid(ranges, local, maxDate)} diff --git a/src/lib/DateTimeRangeContainer.jsx b/src/lib/DateTimeRangeContainer.jsx index 998cc2d..7975ef9 100644 --- a/src/lib/DateTimeRangeContainer.jsx +++ b/src/lib/DateTimeRangeContainer.jsx @@ -110,6 +110,8 @@ class DateTimeRangeContainer extends React.Component { }); } + let disableTime = this.props.maxDays != null && this.props.maxDays === 1 ? true : this.props.disableTime; + return (
{this.props.children}
}
0) { let days = Date.daysBetween(startDate, endDate); - if (days > this.props.maxDays) { + if (days - 1 > this.props.maxDays) { this.props.updateErrorClass('error'); if (this.state.errorClass !== 'error') this.setState({ errorClass: 'error' }); return false; @@ -149,16 +149,40 @@ class DateTimeRangePicker extends React.Component { } dateSelectedNoTimeCallback(cellDate) { - let newDates = datePicked(this.state.start, this.state.end, cellDate, this.state.selectingModeFrom); - let startDate = newDates.startDate; - let endDate = newDates.endDate; - let newStart = this.duplicateMomentTimeFromState(startDate, true); - let newEnd = this.duplicateMomentTimeFromState(endDate, false); - this.updateStartEndAndLabels(newStart, newEnd); - this.setToRangeValue(newStart, newEnd); - this.setState(prevState => ({ - selectingModeFrom: !prevState.selectingModeFrom - })); + if (this.props.maxDays != null && this.props.maxDays === 1) { + let startDate = moment([cellDate.year(), cellDate.month(), cellDate.date(), 0, 0, 0]); + let endDate = moment([cellDate.year(), cellDate.month(), cellDate.date(), 23, 59, 59]); + + this.updateStartEndAndLabels(startDate, endDate); + + //eslint-disable-next-line + this.state.start = startDate; + //eslint-disable-next-line + this.state.end = endDate; + + this.setState({ + start: startDate, + end: endDate, + selectingModeFrom: false + }); + + this.applyCallback(); + } else { + let newDates = datePicked(this.state.start, this.state.end, cellDate, this.state.selectingModeFrom); + + let startDate = newDates.startDate; + let endDate = newDates.endDate; + + let newStart = this.duplicateMomentTimeFromState(startDate, true); + let newEnd = this.duplicateMomentTimeFromState(endDate, false); + + this.updateStartEndAndLabels(newStart, newEnd); + this.setToRangeValue(newStart, newEnd); + + this.setState(prevState => ({ + selectingModeFrom: !prevState.selectingModeFrom + })); + } } changeSelectingModeCallback(selectingModeFromParam) { @@ -388,6 +412,7 @@ class DateTimeRangePicker extends React.Component { enableButtons={true} className={this.state.errorClass} translations={this.props.translations} + singleDay={this.props.maxDays != null && this.props.maxDays === 1} /> ); } @@ -395,13 +420,19 @@ class DateTimeRangePicker extends React.Component { render() { return ( - - {this.renderStartDate()} + {this.props.maxDays == null || this.props.maxDays > 1 ? ( + + + {this.renderStartDate()} + + ) : ( + '' + )} {this.renderEndDate()} ); diff --git a/src/lib/date_picker/DatePicker.jsx b/src/lib/date_picker/DatePicker.jsx index 9a53c98..e859e37 100644 --- a/src/lib/date_picker/DatePicker.jsx +++ b/src/lib/date_picker/DatePicker.jsx @@ -9,6 +9,21 @@ import ActiveNotifier from './ActiveNotifier'; import moment from 'moment'; class DatePicker extends React.Component { + dateSelectedNoTimeCallback(data) { + //console.log('dateSelectedNoTimeCallback ' + JSON.stringify(data)); + this.props.dateSelectedNoTimeCallback(data); + } + + focusDate(data) { + //console.log('focusDate ' + JSON.stringify(data)); + this.props.focusDate(data); + } + + cellFocusedCallback(data) { + //console.log('cellFocusedCallback ' + JSON.stringify(data)); + this.props.cellFocusedCallback(data); + } + render() { //If button property present display buttons let buttons; @@ -49,12 +64,13 @@ class DatePicker extends React.Component { mode={this.props.mode} otherDate={this.props.otherDate} maxDate={this.props.maxDate} - dateSelectedNoTimeCallback={this.props.dateSelectedNoTimeCallback} + dateSelectedNoTimeCallback={this.dateSelectedNoTimeCallback.bind(this)} keyboardCellCallback={this.props.keyboardCellCallback} focusOnCallback={this.props.focusOnCallback} - focusDate={this.props.focusDate} - cellFocusedCallback={this.props.cellFocusedCallback} + focusDate={this.focusDate.bind(this)} + cellFocusedCallback={this.cellFocusedCallback.bind(this)} local={this.props.local} + singleDay={this.props.singleDay} /> {buttons} From 0208db9c7804b29abc1645641f73378009d1237e Mon Sep 17 00:00:00 2001 From: andreaci Date: Fri, 1 Mar 2019 16:20:11 +0100 Subject: [PATCH 07/31] missing translations --- src/Wrapper.jsx | 10 +++++++++- src/lib/DateTimeRangeContainer.jsx | 12 +++++++++++- src/lib/DateTimeRangePicker.jsx | 20 +++++++------------- src/lib/calendar/Calendar.jsx | 11 +++++++---- src/lib/date_picker/ActiveNotifier.jsx | 4 ++-- src/lib/date_picker/ApplyCancelButtons.jsx | 2 +- src/lib/date_picker/DatePicker.jsx | 3 ++- 7 files changed, 39 insertions(+), 23 deletions(-) diff --git a/src/Wrapper.jsx b/src/Wrapper.jsx index 97c2f05..6a0fd62 100644 --- a/src/Wrapper.jsx +++ b/src/Wrapper.jsx @@ -236,4 +236,12 @@ const h1style = { marginTop: 50, borderTop: '1px solid gray' }; const divstyle = { padding: 30 }; -const translations = { Apply: 'appleeeeca', Cancel: 'annuuuuu', customRange: 'customme', FromDate: 'daaaa', ToDate: 'aaaaa' }; +const translations = { + Apply: 'appleeeeca', + Cancel: 'annuuuuu', + customRange: 'customme', + FromDate: 'daaaa', + ToDate: 'aaaaa', + months: ['1January', '2February', '3March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], + days: ['Lu', 'Ma', 'Me', 'Th', 'Fr', 'Sa', 'Su'] +}; diff --git a/src/lib/DateTimeRangeContainer.jsx b/src/lib/DateTimeRangeContainer.jsx index 7975ef9..d80d1f3 100644 --- a/src/lib/DateTimeRangeContainer.jsx +++ b/src/lib/DateTimeRangeContainer.jsx @@ -145,7 +145,17 @@ class DateTimeRangeContainer extends React.Component { } } -const default_translations = { Apply: 'Apply', Cancel: 'Cancel', customRange: 'Custom Range', FromDate: 'From date', ToDate: 'To date' }; +const default_translations = { + Apply: 'Apply', + Cancel: 'Cancel', + customRange: 'Custom Range', + FromDate: 'From date', + ToDate: 'To date', + SelectingFrom: 'Selecting to', + SelectingTo: 'Selecting from', + months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], + days: ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'] +}; DateTimeRangeContainer.propTypes = { ranges: PropTypes.object.isRequired, diff --git a/src/lib/DateTimeRangePicker.jsx b/src/lib/DateTimeRangePicker.jsx index 9122fd5..1b137a9 100644 --- a/src/lib/DateTimeRangePicker.jsx +++ b/src/lib/DateTimeRangePicker.jsx @@ -420,19 +420,13 @@ class DateTimeRangePicker extends React.Component { render() { return ( - {this.props.maxDays == null || this.props.maxDays > 1 ? ( - - - {this.renderStartDate()} - - ) : ( - '' - )} + + {this.props.maxDays == null || this.props.maxDays > 1 ? this.renderStartDate() : ''} {this.renderEndDate()} ); diff --git a/src/lib/calendar/Calendar.jsx b/src/lib/calendar/Calendar.jsx index bb49fed..ffb45d0 100644 --- a/src/lib/calendar/Calendar.jsx +++ b/src/lib/calendar/Calendar.jsx @@ -39,8 +39,8 @@ class Calendar extends React.Component { } createMonths() { - let months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; - return months; + // let months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; + return this.props.translations.months; } createYears() { @@ -48,10 +48,13 @@ class Calendar extends React.Component { //Range from 1900 to 25 years into the future let past = moment('19000101', 'YYYYMMDD'); let yearsToGetFuture = 10; + let endYear = moment() .add(yearsToGetFuture, 'years') .get('year'); + let addedCurrentYear = false; + while (!addedCurrentYear) { if (past.get('years') === endYear) { addedCurrentYear = true; @@ -129,10 +132,10 @@ class Calendar extends React.Component { let sundayFirst; if (this.props.local && this.props.local.sundayFirst) { sundayFirst = true; - headers = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']; + headers = [this.props.translations.days[6], ...this.props.translations.days]; //['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']; } else { sundayFirst = false; - headers = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su']; + headers = this.props.translations.days; //['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su']; } let fourtyTwoDays = getFourtyTwoDays(this.state.month, this.state.year, sundayFirst); diff --git a/src/lib/date_picker/ActiveNotifier.jsx b/src/lib/date_picker/ActiveNotifier.jsx index cc3f1e8..82c6ac3 100644 --- a/src/lib/date_picker/ActiveNotifier.jsx +++ b/src/lib/date_picker/ActiveNotifier.jsx @@ -16,9 +16,9 @@ class ActiveNotifier extends React.Component { let notifier; if (selectingModeFrom && mode === 'start') { - notifier = this.getDotDiv('Selecting From ', '#12bc00'); + notifier = this.getDotDiv(this.props.translations.SelectingFrom, '#12bc00'); } else if (!selectingModeFrom && mode === 'end') { - notifier = this.getDotDiv('Selecting To ', '#D70022'); + notifier = this.getDotDiv(this.props.translations.SelectingTo, '#D70022'); } else { notifier =
; } diff --git a/src/lib/date_picker/ApplyCancelButtons.jsx b/src/lib/date_picker/ApplyCancelButtons.jsx index ad79a39..db8aaa4 100644 --- a/src/lib/date_picker/ApplyCancelButtons.jsx +++ b/src/lib/date_picker/ApplyCancelButtons.jsx @@ -81,7 +81,7 @@ class ApplyCancelButtons extends React.Component { renderButton(className, onMouseEnter, onMouseLeave, onClick, style, onKeyDown, onFocus, onBlur, text) { let styleLocal; - if (text === 'Apply') { + if (text === this.props.ApplyString) { styleLocal = addFocusStyle(this.state.applyFocus, style); } else { styleLocal = addFocusStyle(this.state.cancelFocus, style); diff --git a/src/lib/date_picker/DatePicker.jsx b/src/lib/date_picker/DatePicker.jsx index e859e37..56664fc 100644 --- a/src/lib/date_picker/DatePicker.jsx +++ b/src/lib/date_picker/DatePicker.jsx @@ -71,8 +71,9 @@ class DatePicker extends React.Component { cellFocusedCallback={this.cellFocusedCallback.bind(this)} local={this.props.local} singleDay={this.props.singleDay} + translations={this.props.translations} /> - + {buttons}
); From a22fb064cad9cf434000ff8d705203523e678c73 Mon Sep 17 00:00:00 2001 From: andreaci Date: Fri, 1 Mar 2019 16:24:12 +0100 Subject: [PATCH 08/31] added maxYear / minYear in props --- src/lib/DateTimeRangeContainer.jsx | 10 ++++++++-- src/lib/DateTimeRangePicker.jsx | 4 ++++ src/lib/calendar/Calendar.jsx | 5 ++--- src/lib/date_picker/DatePicker.jsx | 2 ++ 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/lib/DateTimeRangeContainer.jsx b/src/lib/DateTimeRangeContainer.jsx index d80d1f3..2a5d66d 100644 --- a/src/lib/DateTimeRangeContainer.jsx +++ b/src/lib/DateTimeRangeContainer.jsx @@ -138,6 +138,8 @@ class DateTimeRangeContainer extends React.Component { updateErrorClass={this.updateErrorClass.bind(this)} disabled={this.props.disabled} translations={translations} + minYear={this.props.minYear} + maxYear={this.props.maxYear} />
@@ -168,7 +170,9 @@ DateTimeRangeContainer.propTypes = { disableDateBox: PropTypes.bool, maxDays: PropTypes.number, disabled: PropTypes.bool, - translations: PropTypes.object + translations: PropTypes.object, + minYear: PropTypes.number, + maxYear: PropTypes.number }; DateTimeRangeContainer.defaultProps = { @@ -176,7 +180,9 @@ DateTimeRangeContainer.defaultProps = { disableDateBox: false, disableTime: false, disabled: false, - translations: default_translations + translations: default_translations, + minYear: 2000, + maxYear: new Date().getFullYear() + 1 }; export default DateTimeRangeContainer; diff --git a/src/lib/DateTimeRangePicker.jsx b/src/lib/DateTimeRangePicker.jsx index 1b137a9..26a0426 100644 --- a/src/lib/DateTimeRangePicker.jsx +++ b/src/lib/DateTimeRangePicker.jsx @@ -381,6 +381,8 @@ class DateTimeRangePicker extends React.Component { local={this.props.local} className={this.state.errorClass} translations={this.props.translations} + minYear={this.props.minYear} + maxYear={this.props.maxYear} /> ); } @@ -413,6 +415,8 @@ class DateTimeRangePicker extends React.Component { className={this.state.errorClass} translations={this.props.translations} singleDay={this.props.maxDays != null && this.props.maxDays === 1} + minYear={this.props.minYear} + maxYear={this.props.maxYear} /> ); } diff --git a/src/lib/calendar/Calendar.jsx b/src/lib/calendar/Calendar.jsx index ffb45d0..16ed447 100644 --- a/src/lib/calendar/Calendar.jsx +++ b/src/lib/calendar/Calendar.jsx @@ -46,11 +46,10 @@ class Calendar extends React.Component { createYears() { let years = []; //Range from 1900 to 25 years into the future - let past = moment('19000101', 'YYYYMMDD'); - let yearsToGetFuture = 10; + let past = moment(this.props.minYear + '0101', 'YYYYMMDD'); let endYear = moment() - .add(yearsToGetFuture, 'years') + .add(this.props.maxYear - new Date().getFullYear(), 'years') .get('year'); let addedCurrentYear = false; diff --git a/src/lib/date_picker/DatePicker.jsx b/src/lib/date_picker/DatePicker.jsx index 56664fc..6628e1f 100644 --- a/src/lib/date_picker/DatePicker.jsx +++ b/src/lib/date_picker/DatePicker.jsx @@ -72,6 +72,8 @@ class DatePicker extends React.Component { local={this.props.local} singleDay={this.props.singleDay} translations={this.props.translations} + minYear={this.props.minYear} + maxYear={this.props.maxYear} /> {buttons} From 6cd0f23104ece6b650af5229f1b2dc28cb3b90bf Mon Sep 17 00:00:00 2001 From: andreaci Date: Mon, 4 Mar 2019 15:06:52 +0100 Subject: [PATCH 09/31] major styling overhaul --- public/index.html | 61 ++++-- src/Wrapper.jsx | 239 +++++++++++---------- src/lib/DateTimeRangeComponent.css | 87 ++++++++ src/lib/DateTimeRangeComponent.jsx | 193 +++++++++++++++++ src/lib/DateTimeRangeContainer.jsx | 9 +- src/lib/DateTimeRangePicker.jsx | 5 +- src/lib/calendar/Calendar.jsx | 1 + src/lib/calendar/CalendarRow.jsx | 1 + src/lib/calendar/CalendarRows.jsx | 1 + src/lib/calendar/Cell.css | 46 ++++ src/lib/calendar/Cell.jsx | 35 +-- src/lib/date_picker/DatePicker.jsx | 1 + src/lib/index.jsx | 3 + src/lib/ranges/RangeButton.css | 21 ++ src/lib/ranges/RangeButton.jsx | 39 ++-- src/lib/ranges/Ranges.jsx | 1 + src/lib/style/DateTimeRange.css | 33 --- src/lib/utils/ObjectUtils.js | 7 + src/lib/utils/StyleUtils.js | 57 ++++- src/lib/utils/TimeFunctionUtils.js | 327 +++++++++++------------------ 20 files changed, 764 insertions(+), 403 deletions(-) create mode 100644 src/lib/DateTimeRangeComponent.css create mode 100644 src/lib/DateTimeRangeComponent.jsx create mode 100644 src/lib/calendar/Cell.css create mode 100644 src/lib/ranges/RangeButton.css create mode 100644 src/lib/utils/ObjectUtils.js diff --git a/public/index.html b/public/index.html index 3932ecf..6e99a33 100644 --- a/public/index.html +++ b/public/index.html @@ -1,16 +1,16 @@ - - - - - - - - - - + + - - - React App - - - -
- + + + + React App + + + +
+ - + --> diff --git a/src/Wrapper.jsx b/src/Wrapper.jsx index 6a0fd62..91937b6 100644 --- a/src/Wrapper.jsx +++ b/src/Wrapper.jsx @@ -1,6 +1,6 @@ import React from 'react'; -import DateTimeRangeContainer from './lib/index'; -import { FormControl, Grid, Row, Col } from 'react-bootstrap'; +import DateTimeRangeContainer, { DateTimeRangeComponent } from './lib/index'; +import { FormControl } from 'react-bootstrap'; import moment from 'moment'; class Wrapper extends React.Component { @@ -35,7 +35,9 @@ class Wrapper extends React.Component { end: endDate }); } - + onChangeReady(data) { + console.log(data); + } onClick() { let newStart = moment(this.state.start).subtract(3, 'days'); // console.log("On Click Callback"); @@ -45,7 +47,8 @@ class Wrapper extends React.Component { renderContainerNoGrid(ranges, local, maxDate) { return ( -
+
+

renderContainerNoGrid

@@ -56,123 +59,108 @@ class Wrapper extends React.Component { renderGrid(ranges, local, maxDate) { return ( - - - 1 - - - - - - - 3 - - - +
+

renderGrid

+ + + + +
); } renderMaxDays(ranges, local, maxDate) { return ( - - - 1 - - - - - - - 3 - - - +
+

renderMaxDays

+ + + +
); } renderDisableTime(ranges, local, maxDate) { return ( - - - 1 - - - - - - - 3 - - - +
+

renderDisableTime

+ + + + +
); } renderDisableDateBox(ranges, local, maxDate) { return ( - - - 1 - - - - - - - 3 - - - +
+

renderDisableDateBox

+ + + +
); } renderDisabled(ranges, local, maxDate) { return ( - - - 1 - - - - - - - 3 - - - +
+

renderDisabled

+ + + +
); } renderTranslated(ranges, local, maxDate) { return ( - - - 1 - - - - - - - 3 - - - +
+

renderTranslated

+ + + +
); } renderMax1Day(ranges, local, maxDate) { return ( - - - 1 - - - - - - - 3 - - - +
+

renderMax1Day

+ + + +
+ ); + } + renderReadyToUseWT(ranges, local, maxDate) { + return ( +
+

renderReadyToUseWithTime

+ +
+ ); + } + renderReadyToUseDisabled(ranges, local, maxDate) { + return ( +
+

renderReadyToUseDisabled

+ +
+ ); + } + renderReadyToUse(ranges, local, maxDate) { + return ( +
+

renderReadyToUse

+ +
+ ); + } + renderCustomStyles(ranges, local, maxDate) { + return ( +
+

renderCustomStyles

+ +
); } @@ -200,39 +188,35 @@ class Wrapper extends React.Component { let maxDate = moment(start).add(24, 'hour'); return (
-

renderMax1Day

{this.renderMax1Day(ranges, local, maxDate)} -

renderContainerNoGrid

- {this.renderContainerNoGrid(ranges, local, maxDate)} - -

renderGrid

{this.renderGrid(ranges, local, maxDate)} -

renderContainerNoGrid

{this.renderContainerNoGrid(ranges, local, maxDate)} -

renderDisableTime

{this.renderDisableTime(ranges, local, maxDate)} -

renderDisableDateBox

{this.renderDisableDateBox(ranges, local, maxDate)} -

renderMaxDays

{this.renderMaxDays(ranges, local, maxDate)} -

renderDisabled

{this.renderDisabled(ranges, local, maxDate)} -

renderTranslated

{this.renderTranslated(ranges, local, maxDate)} + + {this.renderReadyToUse(ranges, local, maxDate)} + {this.renderReadyToUseWT(ranges, local, maxDate)} + + {this.renderCustomStyles(ranges, local, maxDate)} + + {this.renderReadyToUseDisabled(ranges, local, maxDate)}
); } } export { Wrapper }; -const h1style = { marginTop: 50, borderTop: '1px solid gray' }; +const h1style = { borderTop: '1px solid gray', fontSize: 14, fontWeight: 600 }; const divstyle = { padding: 30 }; @@ -245,3 +229,44 @@ const translations = { months: ['1January', '2February', '3March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], days: ['Lu', 'Ma', 'Me', 'Th', 'Fr', 'Sa', 'Su'] }; + +const customStyles = { + inBetweenStyle: () => { + return { + borderRadius: '0', + borderColour: 'transparent', + color: 'red', + backgroundColor: '#ffaaaa', + cursor: 'pointer' + }; + }, + + startDateStyle: () => { + return { + borderRadius: '10px 0 0 10px', + borderColour: 'transparent', + color: '#fff', + backgroundColor: 'red', + cursor: 'pointer' + }; + }, + + endDateStyle: () => { + return { + borderRadius: '0 10px 10px 0', + borderColour: 'transparent', + color: '#fff', + backgroundColor: 'red', + cursor: 'pointer' + }; + }, + + normalRangeStyle: () => { + return { color: 'red' }; + }, + selectedRangeStyle: () => { + return { + backgroundColor: 'red' + }; + } +}; diff --git a/src/lib/DateTimeRangeComponent.css b/src/lib/DateTimeRangeComponent.css new file mode 100644 index 0000000..7e71de5 --- /dev/null +++ b/src/lib/DateTimeRangeComponent.css @@ -0,0 +1,87 @@ +.date-range-selector .period-selector { + padding: 4px; + border-radius: 4px; + border: 1px solid lightgray; + background: white; + width: 400px; +} +.date-range-selector.single .period-selector { + width: 220px; +} + +.date-range-selector.disabled .period-selector { + background: lightgray; +} +.date-range-selector.disabled .period-selector input { + background: lightgray; +} + +.date-range-selector .period-selector input { + border: none; + padding: 4px; + outline: none !important; +} + +.date-range-selector .daterangepicker select, +.date-range-selector .inputDate { + outline: none !important; + border: 1px solid lightgray; + border-radius: 4px; + padding: 2px; +} +.date-range-selector .daterangepicker .timeSelectContainer select { + height: 30px; +} +.date-range-selector .inputDate { + padding: 4px; + width: 100%; +} + +.date-range-selector .fromDateHourContainer { + border: 1px solid transparent; + border-bottom: 1px solid #f1f1f1; + padding-bottom: 10px; +} + +.date-range-selector .fromDateHourContainer .input-group, +.date-range-selector .fromDateHourContainer .timeContainer { + display: inline-block; + width: auto; + margin: 0; + padding: 0; + vertical-align: middle; +} + +.date-range-selector .fromDateHourContainer .input-group { + width: 60%; +} +.date-range-selector .fromDateHourContainer .timeContainer { + width: 40%; +} + +.date-range-selector .fromDateHourContainer .input-group-addon, +.date-range-selector .fromDateHourContainer .timeIconStyle { + display: none; +} + +.date-range-selector .input-group { + width: 57%; + margin-right: 10px; +} + +.date-range-selector .timeSelectContainer { + margin: 0; +} + +.date-range-selector .monthYearContainer { + margin: 5px; +} + +.date-range-selector .glyphicon-calendar { + margin-left: 6px; + margin-right: 6px; +} + +.date-range-selector .input-group-addon { + width: 24px; +} diff --git a/src/lib/DateTimeRangeComponent.jsx b/src/lib/DateTimeRangeComponent.jsx new file mode 100644 index 0000000..67bee50 --- /dev/null +++ b/src/lib/DateTimeRangeComponent.jsx @@ -0,0 +1,193 @@ +import React, { Component } from 'react'; +import DateTimeRangeContainer from './DateTimeRangeContainer'; +import moment from 'moment'; +import PropTypes from 'prop-types'; + +import './DateTimeRangeComponent.css'; + +class DateRangeComponent extends Component { + componentWillMount() { + let now = new Date(); + + let start = this.props.start != null ? this.props.start : new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0, 0); + + let end = this.props.end + ? moment(this.props.end) + : moment(start) + .add(1, 'days') + .subtract(1, 'seconds'); + + let maxDays = this.props.maxDays == null ? 366 : this.props.maxDays; + + let rangesStr = this.props.translations != null ? this.props.translations.DefaultRanges : null; + if (rangesStr != null && rangesStr.length < 9) { + console.log('Invalid RangesDescriptors in translations! '); + rangesStr = null; + } + + if (rangesStr == null) rangesStr = DefaultRangesDescriptors; + + let ranges = {}; + if (this.props.ranges == null) { + ranges[rangesStr[0]] = [moment(start), moment(end)]; + ranges[rangesStr[1]] = [moment(start).subtract(1, 'days'), moment(end).subtract(1, 'days')]; + + if (maxDays === 1) ranges[rangesStr[2]] = [moment(start).subtract(2, 'days'), moment(end).subtract(2, 'days')]; + + if (maxDays > 3) ranges[rangesStr[3]] = [moment(start).subtract(3, 'days'), moment(end)]; + if (maxDays > 5) ranges[rangesStr[4]] = [moment(start).subtract(5, 'days'), moment(end)]; + if (maxDays > 7) ranges[rangesStr[5]] = [moment(start).subtract(7, 'days'), moment(end)]; + if (maxDays > 14) ranges[rangesStr[6]] = [moment(start).subtract(14, 'days'), moment(end)]; + if (maxDays > 30) ranges[rangesStr[7]] = [moment(start).subtract(1, 'months'), moment(end)]; + if (maxDays > 90) ranges[rangesStr[8]] = [moment(start).subtract(3, 'months'), moment(end)]; + if (maxDays > 365) ranges[rangesStr[9]] = [moment(start).subtract(1, 'years'), moment(end)]; + } else { + ranges = this.props.ranges; + + Object.keys(ranges).forEach(e => { + let cur = ranges[e]; + if (cur[0]._isAMomentObject == null) cur[0] = moment(cur[0]); + if (cur[1]._isAMomentObject == null) cur[1] = moment(cur[1]); + }); + } + + this.setState({ + start: start, + end: end.toDate(), + ranges + }); + + this.applyCallback = this.applyCallback.bind(this); + } + + componentDidMount() { + this.applyCallback(this.state.start, this.state.end); + } + + getDateString(date) { + let options = { + year: 'numeric', + month: 'long', + day: 'numeric' + }; + + var locale = window.navigator.userLanguage || window.navigator.language; + + if (date._isAMomentObject === true) date = date.toDate(); + + return ( + date.toLocaleDateString(locale, options) + + (this.props.enableTime + ? ' ' + + date + .getHours() + .toString() + .padStart(2, 0) + + ':' + + date + .getMinutes() + .toString() + .padStart(2, 0) + : '') + ); + } + + applyCallback(startDate, endDate) { + console.log(`applyCallback ${startDate} > ${endDate}`); + let selectedTextFrom = this.getDateString(startDate); + let selectedTextTo = this.getDateString(endDate); + + if (startDate._isAMomentObject) startDate = startDate.toDate(); + if (endDate._isAMomentObject) endDate = endDate.toDate(); + + this.setState({ + selectedTextFrom: selectedTextFrom, + selectedTextTo: selectedTextTo, + start: startDate, + end: endDate + }); + + let returnValue = {}; + returnValue.from = startDate; + returnValue.to = endDate; + + if (!this.props.enableTime || startDate === endDate) { + returnValue.from.setHours(0); + returnValue.from.setMinutes(0); + returnValue.to.setHours(23); + returnValue.to.setMinutes(59); + } + returnValue.from.setSeconds(0); + returnValue.to.setSeconds(59); + + returnValue.fromH = returnValue.from.getHours(); + + returnValue.from_str = moment(returnValue.from).format('YYYY-MM-DD HH:mm:ss'); + returnValue.to_str = moment(returnValue.to).format('YYYY-MM-DD HH:mm:ss'); + + if (this.props.onChange) { + this.props.onChange(returnValue); + } + } + + render() { + let minYear = this.props.minYear == null ? 2010 : this.props.minYear; + let maxYear = this.props.maxYear == null ? new Date().getFullYear() + 1 : this.props.maxYear; + + let start = moment(this.state.start); + let end = moment(this.state.end); + + let ranges = this.state.ranges; + + let local = { + format: 'DD-MM-YYYY', // + (this.props.enableTime ? ' HH:mm' : ''), + sundayFirst: false + }; + + return ( +
+ +
+
+ + {this.props.maxDays === 1 ? '' : } +
+ +
+ ); + } +} + +export default DateRangeComponent; + +const DefaultRangesDescriptors = ['Today', 'Yesterday', 'Two days ago', '3 days', '5 days', 'Last week', 'Last two week', 'Last month', 'Last 3 months', 'Last year']; + +DateTimeRangeContainer.propTypes = { + start: PropTypes.object, + end: PropTypes.object, + ranges: PropTypes.object, + enableTime: PropTypes.bool, + disabled: PropTypes.bool, + onChange: PropTypes.object.isRequired, + className: PropTypes.string, + maxDays: PropTypes.number.isRequired, + minYear: PropTypes.number, + maxYear: PropTypes.number, + translations: PropTypes.object, + calendarStyles: PropTypes.object +}; + +DateTimeRangeContainer.defaultProps = { maxDays: 366, enableTime: false, disabled: false, minYear: 2010, maxYear: new Date().getFullYear() + 1 }; diff --git a/src/lib/DateTimeRangeContainer.jsx b/src/lib/DateTimeRangeContainer.jsx index 2a5d66d..657d8c5 100644 --- a/src/lib/DateTimeRangeContainer.jsx +++ b/src/lib/DateTimeRangeContainer.jsx @@ -4,6 +4,7 @@ import './style/DateTimeRange.css'; import { DateTimeRangePicker } from './DateTimeRangePicker'; import PropTypes from 'prop-types'; import momentPropTypes from 'react-moment-proptypes'; +import { copyMissingProperties } from './utils/ObjectUtils'; export const mobileBreakPoint = 680; class DateTimeRangeContainer extends React.Component { @@ -105,9 +106,7 @@ class DateTimeRangeContainer extends React.Component { if (translations == null) { translations = default_translations; } else { - Object.keys(default_translations).forEach(e => { - if (translations[e] == null) translations[e] = default_translations[e]; - }); + translations = copyMissingProperties(translations, default_translations); } let disableTime = this.props.maxDays != null && this.props.maxDays === 1 ? true : this.props.disableTime; @@ -124,6 +123,7 @@ class DateTimeRangeContainer extends React.Component { {this.props.children &&
{this.props.children}
}
{this.props.maxDays == null || this.props.maxDays > 1 ? this.renderStartDate() : ''} {this.renderEndDate()} diff --git a/src/lib/calendar/Calendar.jsx b/src/lib/calendar/Calendar.jsx index 16ed447..a9ce4e9 100644 --- a/src/lib/calendar/Calendar.jsx +++ b/src/lib/calendar/Calendar.jsx @@ -154,6 +154,7 @@ class Calendar extends React.Component { /> { this.cell = cell; }} - className="calendarCell" + className={`calendarCell ${this.state.cssclass}`} tabIndex={tabIndex} style={style} onMouseEnter={this.mouseEnter} @@ -213,7 +223,6 @@ class Cell extends React.Component { onClick={this.onClick} onFocus={this.onFocus} onBlur={this.onBlur} - id="cell" > {dateFormatted}
diff --git a/src/lib/date_picker/DatePicker.jsx b/src/lib/date_picker/DatePicker.jsx index 6628e1f..14f8bf9 100644 --- a/src/lib/date_picker/DatePicker.jsx +++ b/src/lib/date_picker/DatePicker.jsx @@ -60,6 +60,7 @@ class DatePicker extends React.Component {
{ this.button = button; }} - className={this.state.style} + className={`rangebuttonstyle ${this.state.cssclass}`} onMouseEnter={this.mouseEnter} onMouseLeave={this.mouseLeave} onFocus={this.onFocus} @@ -119,7 +128,7 @@ class RangeButton extends React.Component { tabIndex={tabIndex} style={focusStyle} > -
this.props.rangeSelectedCallback(this.props.index, this.props.label)}> +
this.props.rangeSelectedCallback(this.props.index, this.props.label)}> {this.props.label}
diff --git a/src/lib/ranges/Ranges.jsx b/src/lib/ranges/Ranges.jsx index 29e832c..82b6625 100644 --- a/src/lib/ranges/Ranges.jsx +++ b/src/lib/ranges/Ranges.jsx @@ -70,6 +70,7 @@ class Ranges extends React.Component { viewingIndexChangeCallback={this.viewingIndexChangeCallback} focused={this.state.focused} setFocusedCallback={this.setFocusedCallback} + calendarStyles={this.props.calendarStyles} /> ))}
diff --git a/src/lib/style/DateTimeRange.css b/src/lib/style/DateTimeRange.css index 0738545..17ea2d7 100644 --- a/src/lib/style/DateTimeRange.css +++ b/src/lib/style/DateTimeRange.css @@ -51,39 +51,6 @@ width: 160px; } -.rangebuttonstyle { - color: #08c; - font-size: 13px; - background-color: #f5f5f5; - border: 1px solid #f5f5f5; - border-radius: 4px; - cursor: pointer; - margin-bottom: 8px; - margin-left: 4px; - margin-right: 4px; - margin-top: 4px; -} - -.rangebuttontextstyle { - padding-left: 12px; - padding-top: 3px; - padding-bottom: 3px; - padding-right: 12px; -} - -.rangeButtonSelectedStyle { - color: #f5f5f5; - font-size: 13px; - border: 1px solid #f5f5f5; - border-radius: 4px; - cursor: pointer; - margin-bottom: 8px; - margin-left: 4px; - margin-right: 4px; - margin-top: 4px; - background-color: #08c; -} - .fromDateTimeContainer { font-size: 13px; width: 270px; diff --git a/src/lib/utils/ObjectUtils.js b/src/lib/utils/ObjectUtils.js new file mode 100644 index 0000000..baf4221 --- /dev/null +++ b/src/lib/utils/ObjectUtils.js @@ -0,0 +1,7 @@ +export function copyMissingProperties(ownObject, referenceObject) { + Object.keys(referenceObject).forEach(e => { + if (ownObject[e] == null) ownObject[e] = referenceObject[e]; + }); + + return ownObject; +} diff --git a/src/lib/utils/StyleUtils.js b/src/lib/utils/StyleUtils.js index f518865..2fad7f9 100644 --- a/src/lib/utils/StyleUtils.js +++ b/src/lib/utils/StyleUtils.js @@ -1,10 +1,49 @@ export const addFocusStyle = (focused, currentStyle) => { - let style = JSON.parse(JSON.stringify(currentStyle)); - if(focused){ - style.outline = "cornflowerblue"; - style.outlineStyle = "auto"; - }else{ - style.outlineStyle = ""; - } - return style; -} \ No newline at end of file + let style = JSON.parse(JSON.stringify(currentStyle)); + if (focused) { + style.outline = 'cornflowerblue'; + style.outlineStyle = 'auto'; + } else { + style.outlineStyle = ''; + } + return style; +}; + +export const calendarStyles = { + startDateStyle: () => { + return {}; + }, + + endDateStyle: () => { + return {}; + }, + + inBetweenStyle: () => { + return {}; + }, + + normalCellStyle: () => { + return {}; + }, + + hoverCellStyle: between => { + return {}; + }, + + greyCellStyle: () => { + return {}; + }, + + invalidStyle: () => { + return {}; + } +}; + +export const rangesStyles = { + normalRangeStyle: () => { + return {}; + }, + selectedRangeStyle: () => { + return {}; + } +}; diff --git a/src/lib/utils/TimeFunctionUtils.js b/src/lib/utils/TimeFunctionUtils.js index 229bb8d..28f2150 100644 --- a/src/lib/utils/TimeFunctionUtils.js +++ b/src/lib/utils/TimeFunctionUtils.js @@ -1,222 +1,151 @@ -import {ModeEnum} from '../DateTimeRangePicker' -import moment from 'moment' +import { ModeEnum } from '../DateTimeRangePicker'; +import moment from 'moment'; export const generateHours = () => { - let hours = []; - for(let i = 0; i < 24; i++){ - hours.push(i); - } - return hours; -} + let hours = []; + for (let i = 0; i < 24; i++) { + hours.push(i); + } + return hours; +}; export const generateMinutes = () => { - let minutes = []; - for(let i = 0; i < 60; i++){ - if(i < 10){ - minutes.push("0" + i.toString()); - }else{ - minutes.push(i.toString()); - } - } - return minutes; -} + let minutes = []; + for (let i = 0; i < 60; i++) { + if (i < 10) { + minutes.push('0' + i.toString()); + } else { + minutes.push(i.toString()); + } + } + return minutes; +}; -function workOutMonthYear(date, secondDate, mode){ - // If both months are different months then - // allow normal display in the calendar - let selectedMonth = date.month(); - let otherMonth = secondDate.month(); - if(selectedMonth !== otherMonth){ - return date; - } - // If both months are the same and the same year - // have "end"/right as the month and "start"/left as -1 month - else if(date.year() === secondDate.year() && mode === ModeEnum.start){ - let lastMonth = JSON.parse(JSON.stringify(date)); - lastMonth = moment(lastMonth); - lastMonth.subtract(1, "month"); - return lastMonth; - }else{ - return date; - } +function workOutMonthYear(date, secondDate, mode) { + // If both months are different months then + // allow normal display in the calendar + let selectedMonth = date.month(); + let otherMonth = secondDate.month(); + if (selectedMonth !== otherMonth) { + return date; + } + // If both months are the same and the same year + // have "end"/right as the month and "start"/left as -1 month + else if (date.year() === secondDate.year() && mode === ModeEnum.start) { + let lastMonth = JSON.parse(JSON.stringify(date)); + lastMonth = moment(lastMonth); + lastMonth.subtract(1, 'month'); + return lastMonth; + } else { + return date; + } } export const getMonth = (date, secondDate, mode) => { - return workOutMonthYear(date, secondDate, mode).month(); -} - -export const getYear = (date, secondDate, mode) => { - return workOutMonthYear(date, secondDate, mode).year(); -} - -const getDaysBeforeStartMonday= (firstDayOfMonth) => { - let fourtyTwoDays = [] - let dayBeforeFirstDayOfMonth = firstDayOfMonth.day() - 1; // We dont want to include the first day of the new month - // Case whereby day before is a Saturday (6) and we require Saturday back to Monday for that week - if(dayBeforeFirstDayOfMonth === -1){ - for(let i = 6; i > 0; i--){ - let firstDayOfMonthCopy = firstDayOfMonth.clone(); - firstDayOfMonthCopy = firstDayOfMonthCopy.subtract(i, 'd'); - fourtyTwoDays.push(firstDayOfMonthCopy); - } - } - // Case Whereby day before first day is the Sunday (0), therefore we want the entire previous week - if(dayBeforeFirstDayOfMonth === 0){ - for(let i = 7; i > 0; i--){ - let firstDayOfMonthCopy = firstDayOfMonth.clone(); - firstDayOfMonthCopy = firstDayOfMonthCopy.subtract(i, 'd'); - fourtyTwoDays.push(firstDayOfMonthCopy); - } - } - // Every other day - else{ - for(let i = dayBeforeFirstDayOfMonth; i > 0; i--){ - let firstDayOfMonthCopy = firstDayOfMonth.clone(); - firstDayOfMonthCopy = firstDayOfMonthCopy.subtract(i, 'd'); - fourtyTwoDays.push(firstDayOfMonthCopy); - } - } - return fourtyTwoDays; -} - -const getDaysBeforeStartSunday= (firstDayOfMonth) => { - let fourtyTwoDays = [] - let dayBeforeFirstDayOfMonth = firstDayOfMonth.day() - 1; // We dont want to include the first day of the new month - - // Case whereby we need all previous week days - if(dayBeforeFirstDayOfMonth === -1){ - for(let i = 7; i > 0; i--){ - let firstDayOfMonthCopy = firstDayOfMonth.clone(); - firstDayOfMonthCopy = firstDayOfMonthCopy.subtract(i, 'd'); - fourtyTwoDays.push(firstDayOfMonthCopy); - } - } - // Every other day - else{ - for(let i = dayBeforeFirstDayOfMonth + 1; i > 0; i--){ - let firstDayOfMonthCopy = firstDayOfMonth.clone(); - firstDayOfMonthCopy = firstDayOfMonthCopy.subtract(i, 'd'); - fourtyTwoDays.push(firstDayOfMonthCopy); - } - } - return fourtyTwoDays; -} - -const getDaysBeforeStart = (firstDayOfMonth, sundayFirst) => { - if(!sundayFirst){ - return getDaysBeforeStartMonday(firstDayOfMonth); - }else{ - return getDaysBeforeStartSunday(firstDayOfMonth); - } -} - -export const getFourtyTwoDays = (initMonth, initYear, sundayFirst) => { - let fourtyTwoDays = [] - let firstDayOfMonth = moment(new Date(initYear, initMonth, 1)); - - fourtyTwoDays = getDaysBeforeStart(firstDayOfMonth, sundayFirst); - // Add in all days this month - for(let i = 0; i < firstDayOfMonth.daysInMonth(); i++){ - fourtyTwoDays.push(firstDayOfMonth.clone().add(i,'d')); - } - // Add in all days at the end of the month until last day of week seen - let lastDayOfMonth = moment(new Date(initYear, initMonth, firstDayOfMonth.daysInMonth())); - let toAdd = 1; - let gotAllDays = false - while(!gotAllDays){ - if(fourtyTwoDays.length >= 42){ - gotAllDays = true; - break; - } - fourtyTwoDays.push(lastDayOfMonth.clone().add(toAdd,'d')); - toAdd++; - } - return fourtyTwoDays; + return workOutMonthYear(date, secondDate, mode).month(); }; -export const isInbetweenDates = (isStartDate, dayToFindOut, start, end) => { - let isInBetweenDates; - if(isStartDate){ - isInBetweenDates = dayToFindOut.isAfter(start) && dayToFindOut.isBefore(end); - }else{ - isInBetweenDates = dayToFindOut.isBefore(start) && dayToFindOut.isAfter(end); - } - return isInBetweenDates; +export const getYear = (date, secondDate, mode) => { + return workOutMonthYear(date, secondDate, mode).year(); }; -export const isValidTimeChange = (mode, date, start, end) => { - let modeStartAndDateSameOrBeforeStart = (mode === "start") && (date.isSameOrBefore(end)); - let modeEndAndDateSameOrAfterEnd = (mode === "end") && (date.isSameOrAfter(start)); - return modeStartAndDateSameOrBeforeStart || modeEndAndDateSameOrAfterEnd; -} - -export const startDateStyle = () => { - return { - borderRadius:"4px 0 0 4px", - borderColour:"transparent", - color:"#fff", - backgroundColor:"#357abd", - cursor:"pointer" - }; +const getDaysBeforeStartMonday = firstDayOfMonth => { + let fourtyTwoDays = []; + let dayBeforeFirstDayOfMonth = firstDayOfMonth.day() - 1; // We dont want to include the first day of the new month + // Case whereby day before is a Saturday (6) and we require Saturday back to Monday for that week + if (dayBeforeFirstDayOfMonth === -1) { + for (let i = 6; i > 0; i--) { + let firstDayOfMonthCopy = firstDayOfMonth.clone(); + firstDayOfMonthCopy = firstDayOfMonthCopy.subtract(i, 'd'); + fourtyTwoDays.push(firstDayOfMonthCopy); + } + } + // Case Whereby day before first day is the Sunday (0), therefore we want the entire previous week + if (dayBeforeFirstDayOfMonth === 0) { + for (let i = 7; i > 0; i--) { + let firstDayOfMonthCopy = firstDayOfMonth.clone(); + firstDayOfMonthCopy = firstDayOfMonthCopy.subtract(i, 'd'); + fourtyTwoDays.push(firstDayOfMonthCopy); + } + } + // Every other day + else { + for (let i = dayBeforeFirstDayOfMonth; i > 0; i--) { + let firstDayOfMonthCopy = firstDayOfMonth.clone(); + firstDayOfMonthCopy = firstDayOfMonthCopy.subtract(i, 'd'); + fourtyTwoDays.push(firstDayOfMonthCopy); + } + } + return fourtyTwoDays; }; -export const endDateStyle = () => { - return { - borderRadius:"0 4px 4px 0", - borderColour:"transparent", - color:"#fff", - backgroundColor:"#357abd", - cursor:"pointer" - }; +const getDaysBeforeStartSunday = firstDayOfMonth => { + let fourtyTwoDays = []; + let dayBeforeFirstDayOfMonth = firstDayOfMonth.day() - 1; // We dont want to include the first day of the new month + + // Case whereby we need all previous week days + if (dayBeforeFirstDayOfMonth === -1) { + for (let i = 7; i > 0; i--) { + let firstDayOfMonthCopy = firstDayOfMonth.clone(); + firstDayOfMonthCopy = firstDayOfMonthCopy.subtract(i, 'd'); + fourtyTwoDays.push(firstDayOfMonthCopy); + } + } + // Every other day + else { + for (let i = dayBeforeFirstDayOfMonth + 1; i > 0; i--) { + let firstDayOfMonthCopy = firstDayOfMonth.clone(); + firstDayOfMonthCopy = firstDayOfMonthCopy.subtract(i, 'd'); + fourtyTwoDays.push(firstDayOfMonthCopy); + } + } + return fourtyTwoDays; }; -export const inBetweenStyle = () => { - return { - borderRadius:"0", - borderColour:"transparent", - color:"#000", - backgroundColor:"#ebf4f8", - cursor:"pointer" - }; +const getDaysBeforeStart = (firstDayOfMonth, sundayFirst) => { + if (!sundayFirst) { + return getDaysBeforeStartMonday(firstDayOfMonth); + } else { + return getDaysBeforeStartSunday(firstDayOfMonth); + } }; -export const normalCellStyle = () => { - return { - borderRadius:"0 0 0 0", - borderColour:"transparent", - color:"black", - backgroundColor:"" - }; +export const getFourtyTwoDays = (initMonth, initYear, sundayFirst) => { + let fourtyTwoDays = []; + let firstDayOfMonth = moment(new Date(initYear, initMonth, 1)); + + fourtyTwoDays = getDaysBeforeStart(firstDayOfMonth, sundayFirst); + // Add in all days this month + for (let i = 0; i < firstDayOfMonth.daysInMonth(); i++) { + fourtyTwoDays.push(firstDayOfMonth.clone().add(i, 'd')); + } + // Add in all days at the end of the month until last day of week seen + let lastDayOfMonth = moment(new Date(initYear, initMonth, firstDayOfMonth.daysInMonth())); + let toAdd = 1; + let gotAllDays = false; + while (!gotAllDays) { + if (fourtyTwoDays.length >= 42) { + gotAllDays = true; + break; + } + fourtyTwoDays.push(lastDayOfMonth.clone().add(toAdd, 'd')); + toAdd++; + } + return fourtyTwoDays; }; -export const hoverCellStyle = (between) => { - let borderRadius = "4px 4px 4px 4px"; - if(between){ - borderRadius = "0 0 0 0"; - } - return { - borderRadius:borderRadius, - borderColour:"transparent", - color:"inherit", - backgroundColor:"#eee", - cursor:"pointer" - }; +export const isInbetweenDates = (isStartDate, dayToFindOut, start, end) => { + let isInBetweenDates; + if (isStartDate) { + isInBetweenDates = dayToFindOut.isAfter(start) && dayToFindOut.isBefore(end); + } else { + isInBetweenDates = dayToFindOut.isBefore(start) && dayToFindOut.isAfter(end); + } + return isInBetweenDates; }; -export const greyCellStyle = () => { - let borderRadius = "4px 4px 4px 4px"; - return { - borderRadius:borderRadius, - borderColour:"transparent", - color:"#999", - backgroundColor:"#fff", - cursor:"pointer", - opacity:"0.25" - }; +export const isValidTimeChange = (mode, date, start, end) => { + let modeStartAndDateSameOrBeforeStart = mode === 'start' && date.isSameOrBefore(end); + let modeEndAndDateSameOrAfterEnd = mode === 'end' && date.isSameOrAfter(start); + return modeStartAndDateSameOrBeforeStart || modeEndAndDateSameOrAfterEnd; }; - -export const invalidStyle = () => { - let style = greyCellStyle(); - style.cursor = "not-allowed"; - return style; -}; \ No newline at end of file From 8fea7bd75bed52e6237eaa749560ca4878bd155a Mon Sep 17 00:00:00 2001 From: andreaci Date: Mon, 4 Mar 2019 15:32:16 +0100 Subject: [PATCH 10/31] rangeSelected callback --- src/Wrapper.jsx | 15 +++++++++++++++ src/lib/DateTimeRangeComponent.jsx | 4 +++- src/lib/DateTimeRangeContainer.jsx | 2 ++ src/lib/DateTimeRangePicker.jsx | 11 ++++++++++- 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/Wrapper.jsx b/src/Wrapper.jsx index 91937b6..a7a65f4 100644 --- a/src/Wrapper.jsx +++ b/src/Wrapper.jsx @@ -164,6 +164,20 @@ class Wrapper extends React.Component { ); } + renderRangeCallback(ranges, local, maxDate) { + return ( +
+

renderRangeCallback

+ +
+ ); + } + + onRange(value, data, cbdata) { + console.log('range selected callback: ' + value + ' > ' + data); + console.log(cbdata); + } + render() { let now = new Date(); let start = moment(new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0, 0)); @@ -210,6 +224,7 @@ class Wrapper extends React.Component { {this.renderCustomStyles(ranges, local, maxDate)} {this.renderReadyToUseDisabled(ranges, local, maxDate)} + {this.renderRangeCallback(ranges, local, maxDate)}
); } diff --git a/src/lib/DateTimeRangeComponent.jsx b/src/lib/DateTimeRangeComponent.jsx index 67bee50..ba9dbc8 100644 --- a/src/lib/DateTimeRangeComponent.jsx +++ b/src/lib/DateTimeRangeComponent.jsx @@ -159,6 +159,7 @@ class DateRangeComponent extends Component { minYear={minYear} maxYear={maxYear} translations={this.props.translations} + rangeCallback={this.props.rangeCallback} >
@@ -187,7 +188,8 @@ DateTimeRangeContainer.propTypes = { minYear: PropTypes.number, maxYear: PropTypes.number, translations: PropTypes.object, - calendarStyles: PropTypes.object + calendarStyles: PropTypes.object, + rangeCallback: PropTypes.func }; DateTimeRangeContainer.defaultProps = { maxDays: 366, enableTime: false, disabled: false, minYear: 2010, maxYear: new Date().getFullYear() + 1 }; diff --git a/src/lib/DateTimeRangeContainer.jsx b/src/lib/DateTimeRangeContainer.jsx index 657d8c5..8e324dc 100644 --- a/src/lib/DateTimeRangeContainer.jsx +++ b/src/lib/DateTimeRangeContainer.jsx @@ -140,6 +140,7 @@ class DateTimeRangeContainer extends React.Component { translations={translations} minYear={this.props.minYear} maxYear={this.props.maxYear} + rangeCallback={this.props.rangeCallback} />
@@ -165,6 +166,7 @@ DateTimeRangeContainer.propTypes = { end: momentPropTypes.momentObj, local: PropTypes.object.isRequired, applyCallback: PropTypes.func.isRequired, + rangeCallback: PropTypes.func, maxDate: momentPropTypes.momentObj, disableTime: PropTypes.bool, disableDateBox: PropTypes.bool, diff --git a/src/lib/DateTimeRangePicker.jsx b/src/lib/DateTimeRangePicker.jsx index 3846656..922172d 100644 --- a/src/lib/DateTimeRangePicker.jsx +++ b/src/lib/DateTimeRangePicker.jsx @@ -68,7 +68,8 @@ class DateTimeRangePicker extends React.Component { return false; } - this.props.applyCallback(this.state.start, this.state.end); + if (this.props.applyCallback) this.props.applyCallback(this.state.start, this.state.end); + this.props.changeVisibleState(); } @@ -105,6 +106,9 @@ class DateTimeRangePicker extends React.Component { if (!this.checkMaxDays(start, end)) { return false; } + if (this.props.rangeCallback) { + this.props.rangeCallback(value, this.state.ranges[value], { start: this.state.ranges[value][0].toDate(), end: this.state.ranges[value][1].toDate() }); + } } // Else update state to new selected index and update start and end time this.setState({ selectedRange: index }); @@ -124,6 +128,11 @@ class DateTimeRangePicker extends React.Component { continue; } else if (rangesArray[i][0].isSame(startDate, 'minutes') && rangesArray[i][1].isSame(endDate, 'minutes')) { this.setState({ selectedRange: i }); + + if (this.props.rangeCallback) { + this.props.rangeCallback(i, rangesArray[i], { start: rangesArray[i][0].toDate(), end: rangesArray[i][1].toDate() }); + } + return; } } From 14d510bc5edb53121ea2403cd32977aa11120c34 Mon Sep 17 00:00:00 2001 From: andreaci Date: Mon, 4 Mar 2019 16:15:30 +0100 Subject: [PATCH 11/31] minor changes --- src/Wrapper.jsx | 24 ++-- src/lib/DateTimeRangeComponent.jsx | 4 +- .../tests/render_tests/DoesRender.test.jsx | 109 ++++++++---------- 3 files changed, 61 insertions(+), 76 deletions(-) diff --git a/src/Wrapper.jsx b/src/Wrapper.jsx index a7a65f4..34a7522 100644 --- a/src/Wrapper.jsx +++ b/src/Wrapper.jsx @@ -1,6 +1,6 @@ import React from 'react'; import DateTimeRangeContainer, { DateTimeRangeComponent } from './lib/index'; -import { FormControl } from 'react-bootstrap'; + import moment from 'moment'; class Wrapper extends React.Component { @@ -36,7 +36,7 @@ class Wrapper extends React.Component { }); } onChangeReady(data) { - console.log(data); + //console.log(data); } onClick() { let newStart = moment(this.state.start).subtract(3, 'days'); @@ -50,7 +50,7 @@ class Wrapper extends React.Component {

renderContainerNoGrid

- +
Click Me to test change state here and updating picker
@@ -63,7 +63,7 @@ class Wrapper extends React.Component {

renderGrid

- + ); @@ -73,7 +73,7 @@ class Wrapper extends React.Component {

renderMaxDays

- +
); @@ -84,7 +84,7 @@ class Wrapper extends React.Component {

renderDisableTime

- + ); @@ -94,7 +94,7 @@ class Wrapper extends React.Component {

renderDisableDateBox

- +
); @@ -105,7 +105,7 @@ class Wrapper extends React.Component {

renderDisabled

- +
); @@ -115,7 +115,7 @@ class Wrapper extends React.Component {

renderTranslated

- +
); @@ -126,7 +126,7 @@ class Wrapper extends React.Component {

renderMax1Day

- +
); @@ -174,8 +174,8 @@ class Wrapper extends React.Component { } onRange(value, data, cbdata) { - console.log('range selected callback: ' + value + ' > ' + data); - console.log(cbdata); + //console.log('range selected callback: ' + value + ' > ' + data); + //console.log(cbdata); } render() { diff --git a/src/lib/DateTimeRangeComponent.jsx b/src/lib/DateTimeRangeComponent.jsx index ba9dbc8..d707657 100644 --- a/src/lib/DateTimeRangeComponent.jsx +++ b/src/lib/DateTimeRangeComponent.jsx @@ -93,7 +93,7 @@ class DateRangeComponent extends Component { } applyCallback(startDate, endDate) { - console.log(`applyCallback ${startDate} > ${endDate}`); + //console.log(`applyCallback ${startDate} > ${endDate}`); let selectedTextFrom = this.getDateString(startDate); let selectedTextTo = this.getDateString(endDate); @@ -182,7 +182,7 @@ DateTimeRangeContainer.propTypes = { ranges: PropTypes.object, enableTime: PropTypes.bool, disabled: PropTypes.bool, - onChange: PropTypes.object.isRequired, + onChange: PropTypes.func.isRequired, className: PropTypes.string, maxDays: PropTypes.number.isRequired, minYear: PropTypes.number, diff --git a/src/lib/tests/render_tests/DoesRender.test.jsx b/src/lib/tests/render_tests/DoesRender.test.jsx index 225e48a..bf17e74 100644 --- a/src/lib/tests/render_tests/DoesRender.test.jsx +++ b/src/lib/tests/render_tests/DoesRender.test.jsx @@ -1,77 +1,62 @@ -import React from "react"; -import DateTimeRangeContainer from '../../DateTimeRangeContainer' -import {mount, configure} from "enzyme" +import React from 'react'; +import DateTimeRangeContainer from '../../DateTimeRangeContainer'; +import { mount, configure } from 'enzyme'; import Adapter from 'enzyme-adapter-react-15'; import moment from 'moment'; -import {FormControl} from 'react-bootstrap' configure({ adapter: new Adapter() }); let now = new Date(); -let start = moment(new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0,0,0,0)); -let end = moment(start).add(1, "days").subtract(1, "seconds"); +let start = moment(new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0, 0)); +let end = moment(start) + .add(1, 'days') + .subtract(1, 'seconds'); let ranges = { - "Today Only": [moment(start), moment(end)], - "Yesterday Only": [moment(start).subtract(1, "days"), moment(end).subtract(1, "days")], - "3 Days": [moment(start).subtract(3, "days"), moment(end)], - "5 Days": [moment(start).subtract(5, "days"), moment(end)], - "1 Week": [moment(start).subtract(7, "days"), moment(end)], - "2 Weeks": [moment(start).subtract(14, "days"), moment(end)], - "1 Month": [moment(start).subtract(1, "months"), moment(end)], - "90 Days": [moment(start).subtract(90, "days"), moment(end)], - "1 Year": [moment(start).subtract(1, "years"), moment(end)], -} + 'Today Only': [moment(start), moment(end)], + 'Yesterday Only': [moment(start).subtract(1, 'days'), moment(end).subtract(1, 'days')], + '3 Days': [moment(start).subtract(3, 'days'), moment(end)], + '5 Days': [moment(start).subtract(5, 'days'), moment(end)], + '1 Week': [moment(start).subtract(7, 'days'), moment(end)], + '2 Weeks': [moment(start).subtract(14, 'days'), moment(end)], + '1 Month': [moment(start).subtract(1, 'months'), moment(end)], + '90 Days': [moment(start).subtract(90, 'days'), moment(end)], + '1 Year': [moment(start).subtract(1, 'years'), moment(end)] +}; let local = { - "format":"DD-MM-YYYY HH:mm", - "sundayFirst" : false -} + format: 'DD-MM-YYYY HH:mm', + sundayFirst: false +}; // let maxDate = moment(start).add(24, "hour"); let applyCallback = (startDate, endDate) => { - console.log(startDate); - console.log(endDate) -} + console.log(startDate); + console.log(endDate); +}; const dateTimeRangeContainerExpectedUse = mount( - - - + + + ); -const dateTimeRangeContainerNoChildren = mount( - - -); - -describe("DateTimeRangeContainer", () => { - - it("Always Renders Div's", () => { - expect(dateTimeRangeContainerExpectedUse.length).toBeGreaterThan(0); - }); +const dateTimeRangeContainerNoChildren = mount(); - it("Always render children Div and Daterange div", () => { - const wrappingDiv = dateTimeRangeContainerExpectedUse.first().children().children(); - // console.log(wrappingDiv.debug()); - expect(wrappingDiv.length).toBeGreaterThan(1); - }); +describe('DateTimeRangeContainer', () => { + it("Always Renders Div's", () => { + expect(dateTimeRangeContainerExpectedUse.length).toBeGreaterThan(0); + }); - it("No Child Present, Children Div Not rendered", () => { - const wrappingDiv = dateTimeRangeContainerNoChildren.first().children().children(); - expect(wrappingDiv.length).toBe(1); - }); + it('Always render children Div and Daterange div', () => { + const wrappingDiv = dateTimeRangeContainerExpectedUse + .first() + .children() + .children(); + // console.log(wrappingDiv.debug()); + expect(wrappingDiv.length).toBeGreaterThan(1); + }); -}); \ No newline at end of file + it('No Child Present, Children Div Not rendered', () => { + const wrappingDiv = dateTimeRangeContainerNoChildren + .first() + .children() + .children(); + expect(wrappingDiv.length).toBe(1); + }); +}); From df1ea86bde287a8be5734a5868220919e2449982 Mon Sep 17 00:00:00 2001 From: andreaci Date: Wed, 6 Mar 2019 12:24:15 +0100 Subject: [PATCH 12/31] styling changes - autoCloseOnSelection - showCurrentState --- src/lib/DateTimeRangeComponent.css | 8 +++++++ src/lib/DateTimeRangeComponent.jsx | 8 +++++-- src/lib/DateTimeRangeContainer.jsx | 20 ++++++++++++---- src/lib/DateTimeRangePicker.jsx | 28 ++++++++++++++++++---- src/lib/calendar/Calendar.jsx | 1 + src/lib/calendar/CalendarRow.jsx | 1 + src/lib/calendar/CalendarRows.jsx | 1 + src/lib/calendar/Cell.css | 25 ++++++++++++------- src/lib/calendar/Cell.jsx | 6 +++-- src/lib/date_picker/ActiveNotifier.jsx | 6 ++--- src/lib/date_picker/ApplyCancelButtons.jsx | 20 +++++++++++++--- src/lib/date_picker/DatePicker.jsx | 13 +++++----- src/lib/style/DateTimeRange.css | 25 +++++++++++++++---- 13 files changed, 123 insertions(+), 39 deletions(-) diff --git a/src/lib/DateTimeRangeComponent.css b/src/lib/DateTimeRangeComponent.css index 7e71de5..f771146 100644 --- a/src/lib/DateTimeRangeComponent.css +++ b/src/lib/DateTimeRangeComponent.css @@ -55,6 +55,10 @@ .date-range-selector .fromDateHourContainer .input-group { width: 60%; } +.daterangepickercontainer.notime .fromDateHourContainer .input-group { + width: 100%; +} + .date-range-selector .fromDateHourContainer .timeContainer { width: 40%; } @@ -85,3 +89,7 @@ .date-range-selector .input-group-addon { width: 24px; } + +.date-range-selector .reduce-opacity { + opacity: 0.8; +} diff --git a/src/lib/DateTimeRangeComponent.jsx b/src/lib/DateTimeRangeComponent.jsx index d707657..e5a16ff 100644 --- a/src/lib/DateTimeRangeComponent.jsx +++ b/src/lib/DateTimeRangeComponent.jsx @@ -160,6 +160,8 @@ class DateRangeComponent extends Component { maxYear={maxYear} translations={this.props.translations} rangeCallback={this.props.rangeCallback} + showCurrentState={this.props.showCurrentState} + autoCloseOnSelection={this.props.autoCloseOnSelection} >
@@ -189,7 +191,9 @@ DateTimeRangeContainer.propTypes = { maxYear: PropTypes.number, translations: PropTypes.object, calendarStyles: PropTypes.object, - rangeCallback: PropTypes.func + rangeCallback: PropTypes.func, + showCurrentState: PropTypes.bool, + autoCloseOnSelection: PropTypes.bool }; -DateTimeRangeContainer.defaultProps = { maxDays: 366, enableTime: false, disabled: false, minYear: 2010, maxYear: new Date().getFullYear() + 1 }; +DateTimeRangeContainer.defaultProps = { maxDays: 366, enableTime: false, disabled: false, minYear: 2010, maxYear: new Date().getFullYear() + 1, showCurrentState: false, autoCloseOnSelection: true }; diff --git a/src/lib/DateTimeRangeContainer.jsx b/src/lib/DateTimeRangeContainer.jsx index 8e324dc..3c64141 100644 --- a/src/lib/DateTimeRangeContainer.jsx +++ b/src/lib/DateTimeRangeContainer.jsx @@ -114,7 +114,7 @@ class DateTimeRangeContainer extends React.Component { return (
{ this.container = container; @@ -141,6 +141,8 @@ class DateTimeRangeContainer extends React.Component { minYear={this.props.minYear} maxYear={this.props.maxYear} rangeCallback={this.props.rangeCallback} + showCurrentState={this.props.showCurrentState} + autoCloseOnSelection={this.props.autoCloseOnSelection} />
@@ -154,8 +156,12 @@ const default_translations = { customRange: 'Custom Range', FromDate: 'From date', ToDate: 'To date', - SelectingFrom: 'Selecting to', - SelectingTo: 'Selecting from', + SelectingFrom: 'Selecting from', + SelectingTo: 'Selecting to', + + MaxDays: 'Max days', + MaxDate: 'Max date', + months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], days: ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'] }; @@ -175,7 +181,9 @@ DateTimeRangeContainer.propTypes = { translations: PropTypes.object, minYear: PropTypes.number, maxYear: PropTypes.number, - calendarStyles: PropTypes.object + calendarStyles: PropTypes.object, + showCurrentState: PropTypes.bool, + autoCloseOnSelection: PropTypes.bool }; DateTimeRangeContainer.defaultProps = { @@ -183,9 +191,11 @@ DateTimeRangeContainer.defaultProps = { disableDateBox: false, disableTime: false, disabled: false, + showCurrentState: true, translations: default_translations, minYear: 2000, - maxYear: new Date().getFullYear() + 1 + maxYear: new Date().getFullYear() + 1, + autoCloseOnSelection: false }; export default DateTimeRangeContainer; diff --git a/src/lib/DateTimeRangePicker.jsx b/src/lib/DateTimeRangePicker.jsx index 922172d..3e5edd8 100644 --- a/src/lib/DateTimeRangePicker.jsx +++ b/src/lib/DateTimeRangePicker.jsx @@ -64,11 +64,17 @@ class DateTimeRangePicker extends React.Component { } applyCallback() { - if (!this.checkMaxDays(this.state.start, this.state.end)) { + this.applyCallbackDirect(this.state.start, this.state.end); + } + + applyCallbackDirect(start, end) { + if (!this.checkMaxDays(start, end)) { return false; } - if (this.props.applyCallback) this.props.applyCallback(this.state.start, this.state.end); + if (this.props.applyCallback) { + this.props.applyCallback(start, end); + } this.props.changeVisibleState(); } @@ -115,6 +121,10 @@ class DateTimeRangePicker extends React.Component { if (value !== this.props.translations.customRange) { this.updateStartEndAndLabels(start, end); } + + if (this.props.autoCloseOnSelection) { + this.applyCallbackDirect(this.state.ranges[value][0].toDate(), this.state.ranges[value][1].toDate()); + } } setToRangeValue(startDate, endDate) { @@ -176,6 +186,8 @@ class DateTimeRangePicker extends React.Component { }); this.applyCallback(); + + return; } else { let newDates = datePicked(this.state.start, this.state.end, cellDate, this.state.selectingModeFrom); @@ -191,6 +203,10 @@ class DateTimeRangePicker extends React.Component { this.setState(prevState => ({ selectingModeFrom: !prevState.selectingModeFrom })); + + if (this.props.autoCloseOnSelection && !this.state.selectingModeFrom) { + this.applyCallbackDirect(startDate, endDate); + } } } @@ -389,10 +405,12 @@ class DateTimeRangePicker extends React.Component { applyCallback={this.applyCallback} maxDate={this.props.maxDate} local={this.props.local} - className={this.state.errorClass} + className={this.state.errorClass + ' ' + (this.state.selectingModeFrom ? '' : ' reduce-opacity')} translations={this.props.translations} minYear={this.props.minYear} maxYear={this.props.maxYear} + showCurrentState={this.props.showCurrentState} + maxDays={this.props.maxDays} /> ); } @@ -423,11 +441,13 @@ class DateTimeRangePicker extends React.Component { maxDate={this.props.maxDate} local={this.props.local} enableButtons={true} - className={this.state.errorClass} + className={this.state.errorClass + ' ' + (this.state.selectingModeFrom ? ' reduce-opacity' : '')} translations={this.props.translations} singleDay={this.props.maxDays != null && this.props.maxDays === 1} minYear={this.props.minYear} maxYear={this.props.maxYear} + showCurrentState={this.props.showCurrentState} + maxDays={this.props.maxDays} /> ); } diff --git a/src/lib/calendar/Calendar.jsx b/src/lib/calendar/Calendar.jsx index a9ce4e9..f7e19f6 100644 --- a/src/lib/calendar/Calendar.jsx +++ b/src/lib/calendar/Calendar.jsx @@ -167,6 +167,7 @@ class Calendar extends React.Component { focusOnCallback={this.props.focusOnCallback} focusDate={this.props.focusDate} cellFocusedCallback={this.props.cellFocusedCallback} + selectingModeFrom={this.props.selectingModeFrom} />
); diff --git a/src/lib/calendar/CalendarRow.jsx b/src/lib/calendar/CalendarRow.jsx index c39f1d7..36f3c2d 100644 --- a/src/lib/calendar/CalendarRow.jsx +++ b/src/lib/calendar/CalendarRow.jsx @@ -22,6 +22,7 @@ class CalendarRow extends React.Component { focusOnCallback={this.props.focusOnCallback} focusDate={this.props.focusDate} cellFocusedCallback={this.props.cellFocusedCallback} + selectingModeFrom={this.props.selectingModeFrom} /> ); } diff --git a/src/lib/calendar/CalendarRows.jsx b/src/lib/calendar/CalendarRows.jsx index 13e2afb..cc7f061 100644 --- a/src/lib/calendar/CalendarRows.jsx +++ b/src/lib/calendar/CalendarRows.jsx @@ -24,6 +24,7 @@ class CalendarRows extends React.Component { focusOnCallback={this.props.focusOnCallback} focusDate={this.props.focusDate} cellFocusedCallback={this.props.cellFocusedCallback} + selectingModeFrom={this.props.selectingModeFrom} /> ); } diff --git a/src/lib/calendar/Cell.css b/src/lib/calendar/Cell.css index 203baef..2f5b6a3 100644 --- a/src/lib/calendar/Cell.css +++ b/src/lib/calendar/Cell.css @@ -8,13 +8,13 @@ .calendarCell.start { color: white; border-radius: 4px 0 0 4px; - background-color: #357abd; + background-color: #4caf50; } .calendarCell.end { color: white; border-radius: 0 4px 4px 0; - background-color: #357abd; + background-color: #e53935; } .calendarCell.between { @@ -36,11 +36,20 @@ opacity: '0.25'; } -.calendarCell.hover-in { - border-radius: 0; - background-color: #eee; +.calendarCell.hover-out.start { + border-radius: 16px 0 0 16px; + background-color: #4caf50; } -.calendarCell.hover-out { - border-radius: 4px; - background-color: #eee; +.calendarCell.hover-out.end { + border-radius: 0 16px 16px 0; + background-color: #e53935; +} + +.calendarCell.hover-in.start { + border-radius: 16px 0 0 16px; + background-color: #4caf50; +} +.calendarCell.hover-in.end { + border-radius: 0 16px 16px 0; + background-color: #e53935; } diff --git a/src/lib/calendar/Cell.jsx b/src/lib/calendar/Cell.jsx index d94a744..679196b 100644 --- a/src/lib/calendar/Cell.jsx +++ b/src/lib/calendar/Cell.jsx @@ -109,12 +109,14 @@ class Cell extends React.Component { if (this.checkAndSetMaxDateStyle(this.props.cellDay)) { return; } + let classAdd = this.props.selectingModeFrom ? ' start' : ' end'; + // Hover Style Cell, Different if inbetween start and end date let isDateStart = this.props.date.isSameOrBefore(this.props.otherDate, 'minute'); if (isInbetweenDates(isDateStart, this.props.cellDay, this.props.date, this.props.otherDate)) { - this.setState({ style: this.getSelectedStyle().hoverCellStyle(true), cssclass: 'hover-in' }); + this.setState({ style: this.getSelectedStyle().hoverCellStyle(true), cssclass: 'hover-in' + classAdd }); } else { - this.setState({ style: this.getSelectedStyle().hoverCellStyle(), cssclass: 'hover-out' }); + this.setState({ style: this.getSelectedStyle().hoverCellStyle(), cssclass: 'hover-out' + classAdd }); } } diff --git a/src/lib/date_picker/ActiveNotifier.jsx b/src/lib/date_picker/ActiveNotifier.jsx index 82c6ac3..3c88da0 100644 --- a/src/lib/date_picker/ActiveNotifier.jsx +++ b/src/lib/date_picker/ActiveNotifier.jsx @@ -5,7 +5,7 @@ class ActiveNotifier extends React.Component { getDotDiv(text, style) { return (
- {text} + {text}
); } @@ -16,9 +16,9 @@ class ActiveNotifier extends React.Component { let notifier; if (selectingModeFrom && mode === 'start') { - notifier = this.getDotDiv(this.props.translations.SelectingFrom, '#12bc00'); + notifier = this.getDotDiv(this.props.translations.SelectingFrom, 'start'); } else if (!selectingModeFrom && mode === 'end') { - notifier = this.getDotDiv(this.props.translations.SelectingTo, '#D70022'); + notifier = this.getDotDiv(this.props.translations.SelectingTo, 'end'); } else { notifier =
; } diff --git a/src/lib/date_picker/ApplyCancelButtons.jsx b/src/lib/date_picker/ApplyCancelButtons.jsx index db8aaa4..2d20e6c 100644 --- a/src/lib/date_picker/ApplyCancelButtons.jsx +++ b/src/lib/date_picker/ApplyCancelButtons.jsx @@ -104,9 +104,23 @@ class ApplyCancelButtons extends React.Component { } getMaxDateBox() { + let items = []; if (this.props.maxDate) { - return
Max Date: {this.props.maxDate.format(this.props.local.format)}
; + items.push( +
+ {this.props.translations.MaxDate}: {this.props.maxDate.format(this.props.local.format)} +
+ ); } + if (this.props.maxDays && this.props.maxDays > 0 && this.props.maxDays !== 366) { + items.push( +
+ {this.props.translations.MaxDays}: {this.props.maxDays} +
+ ); + } + + return items; } render() { @@ -126,7 +140,7 @@ class ApplyCancelButtons extends React.Component { this.applyOnKeyPress, this.applyOnFocus, this.applyOnBlur, - this.props.ApplyString + this.props.translations.Apply )} {this.renderButton( @@ -138,7 +152,7 @@ class ApplyCancelButtons extends React.Component { this.cancelOnKeyPress, this.cancelOnFocus, this.cancelOnBlur, - this.props.CancelString + this.props.translations.Cancel )} ); diff --git a/src/lib/date_picker/DatePicker.jsx b/src/lib/date_picker/DatePicker.jsx index 14f8bf9..93dfb4b 100644 --- a/src/lib/date_picker/DatePicker.jsx +++ b/src/lib/date_picker/DatePicker.jsx @@ -10,17 +10,14 @@ import moment from 'moment'; class DatePicker extends React.Component { dateSelectedNoTimeCallback(data) { - //console.log('dateSelectedNoTimeCallback ' + JSON.stringify(data)); this.props.dateSelectedNoTimeCallback(data); } focusDate(data) { - //console.log('focusDate ' + JSON.stringify(data)); this.props.focusDate(data); } cellFocusedCallback(data) { - //console.log('cellFocusedCallback ' + JSON.stringify(data)); this.props.cellFocusedCallback(data); } @@ -35,13 +32,13 @@ class DatePicker extends React.Component { applyCallback={this.props.applyCallback} local={this.props.local} maxDate={this.props.maxDate} - ApplyString={this.props.translations.Apply} - CancelString={this.props.translations.Cancel} + translations={this.props.translations} + maxDays={this.props.maxDays} /> ); } return ( -
+
); diff --git a/src/lib/style/DateTimeRange.css b/src/lib/style/DateTimeRange.css index 17ea2d7..22617da 100644 --- a/src/lib/style/DateTimeRange.css +++ b/src/lib/style/DateTimeRange.css @@ -116,7 +116,7 @@ } .applyButton { - background-color: #4cae4c; + background-color: #4caf50; color: #fff; font-size: 12px; border-radius: 3px; @@ -130,7 +130,7 @@ } .applyButton.error { - background-color: rgb(233, 91, 91); + background-color: #e53935; border: 1px solid red; pointer-events: none; } @@ -148,9 +148,18 @@ background: #f1f1f1; } -.maxDateLabel { - padding: 7px; +.small-label { + padding: 2px 4px; font-size: 10px; + + border-radius: 4px; + border: 1px solid #f1f1f1; + + margin-top: 5px; + margin-right: 6px; + height: 20px; +} +.small-label .maxDate { } .monthYearContainer { @@ -193,7 +202,13 @@ .dot { height: 10px; width: 10px; - background-color: #12bc00; + border-radius: 50%; display: inline-block; } +.dot.start { + background-color: #4caf50; +} +.dot.end { + background-color: #e53935; +} From b313726e42a20ba0a4c59cc46cb2aec5bf0d3e4a Mon Sep 17 00:00:00 2001 From: andreaci Date: Wed, 6 Mar 2019 15:08:35 +0100 Subject: [PATCH 13/31] css changes --- src/lib/DateTimeRangeComponent.css | 12 +++++++- src/lib/date_picker/ApplyCancelButtons.jsx | 4 +-- src/lib/style/DateTimeRange.css | 35 ++++++++-------------- 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/src/lib/DateTimeRangeComponent.css b/src/lib/DateTimeRangeComponent.css index f771146..994a6a7 100644 --- a/src/lib/DateTimeRangeComponent.css +++ b/src/lib/DateTimeRangeComponent.css @@ -78,9 +78,19 @@ } .date-range-selector .monthYearContainer { - margin: 5px; + margin: 10px 5px; } +.date-range-selector .fromDateHourContainer input, +.date-range-selector .fromDateHourContainer select { + border: 1px solid #f1f1f1; + box-shadow: none; +} +.date-range-selector .monthYearContainer select { + border: 0; + cursor: pointer; + box-shadow: none; +} .date-range-selector .glyphicon-calendar { margin-left: 6px; margin-right: 6px; diff --git a/src/lib/date_picker/ApplyCancelButtons.jsx b/src/lib/date_picker/ApplyCancelButtons.jsx index 2d20e6c..4c56971 100644 --- a/src/lib/date_picker/ApplyCancelButtons.jsx +++ b/src/lib/date_picker/ApplyCancelButtons.jsx @@ -132,7 +132,7 @@ class ApplyCancelButtons extends React.Component {
{maxDateBox} {this.renderButton( - 'buttonSeperator applyButton ' + className, + 'footer-button apply ' + className, this.mouseEnterApply, this.mouseLeaveApply, this.applyPressed, @@ -144,7 +144,7 @@ class ApplyCancelButtons extends React.Component { )} {this.renderButton( - 'buttonSeperator cancelButton ' + className, + 'footer-button cancel ' + className, this.mouseEnterCancel, this.mouseLeaveCancel, this.cancelPressed, diff --git a/src/lib/style/DateTimeRange.css b/src/lib/style/DateTimeRange.css index 22617da..04be62e 100644 --- a/src/lib/style/DateTimeRange.css +++ b/src/lib/style/DateTimeRange.css @@ -110,41 +110,34 @@ margin-top: 10px; } -.buttonSeperator { - padding-left: 5px; - padding-right: 5px; +.footer-button { + font-size: 12px; + border-radius: 3px; + padding: 3px 15px; + cursor: pointer; + border: 1px solid #ccc; } -.applyButton { +.footer-button.apply { background-color: #4caf50; color: #fff; - font-size: 12px; - border-radius: 3px; - padding: 5px 10px; - cursor: pointer; - margin-right: 4px; - border: 1px solid #5cb85c; + margin-right: 6px; } -.applyButton:hover { +.footer-button.apply:hover { background: #5cb85c; } -.applyButton.error { +.footer-button.apply.error { background-color: #e53935; border: 1px solid red; pointer-events: none; } -.cancelButton { +.footer-button.cancel { background-color: #fff; color: #333; - font-size: 12px; - border-radius: 3px; - padding: 5px 10px; - cursor: pointer; - border: 1px solid #ccc; } -.cancelButton:hover { +.footer-button.cancel:hover { background: #f1f1f1; } @@ -155,12 +148,10 @@ border-radius: 4px; border: 1px solid #f1f1f1; - margin-top: 5px; + margin-top: 3px; margin-right: 6px; height: 20px; } -.small-label .maxDate { -} .monthYearContainer { margin: 5px; From 39e9f53f8511f0ef036369412dd7100464bebc83 Mon Sep 17 00:00:00 2001 From: andreaci Date: Wed, 6 Mar 2019 15:48:05 +0100 Subject: [PATCH 14/31] ranges: confusing ranges mode --- src/Wrapper.jsx | 21 ++++++++++ src/lib/DateTimeRangePicker.jsx | 28 +++++++++++--- src/lib/ranges/Ranges.jsx | 68 ++++++++++++++++++++++----------- src/lib/style/DateTimeRange.css | 30 ++++++++++++++- 4 files changed, 118 insertions(+), 29 deletions(-) diff --git a/src/Wrapper.jsx b/src/Wrapper.jsx index 34a7522..9b26616 100644 --- a/src/Wrapper.jsx +++ b/src/Wrapper.jsx @@ -173,6 +173,17 @@ class Wrapper extends React.Component { ); } + renderConfusingRanges(ranges, local, maxDate) { + return ( +
+

renderConfusingRanges

+ + + +
+ ); + } + onRange(value, data, cbdata) { //console.log('range selected callback: ' + value + ' > ' + data); //console.log(cbdata); @@ -195,6 +206,14 @@ class Wrapper extends React.Component { '90 Days': [moment(start).subtract(90, 'days'), moment(end)], '1 Year': [moment(start).subtract(1, 'years'), moment(end)] }; + + const ranges2 = [ + { title: 'prima colonna', ranges: ranges }, + { title: 'seconda colonna', ranges: ranges }, + { title: 'tersa colonna', ranges: ranges }, + { title: 'quarsa colonna', ranges: ranges } + ]; + let local = { format: 'DD-MM-YYYY HH:mm', sundayFirst: false @@ -225,6 +244,8 @@ class Wrapper extends React.Component { {this.renderReadyToUseDisabled(ranges, local, maxDate)} {this.renderRangeCallback(ranges, local, maxDate)} + + {this.renderConfusingRanges(ranges2, local, maxDate)}
); } diff --git a/src/lib/DateTimeRangePicker.jsx b/src/lib/DateTimeRangePicker.jsx index 3e5edd8..cc4754e 100644 --- a/src/lib/DateTimeRangePicker.jsx +++ b/src/lib/DateTimeRangePicker.jsx @@ -13,12 +13,29 @@ export var momentFormat = 'DD-MM-YYYY HH:mm'; class DateTimeRangePicker extends React.Component { constructor(props) { super(props); - let ranges = {}; - let customRange = {}; // { this.props.translations.customRange: this.props.translations.customRange }; - customRange[this.props.translations.customRange] = this.props.translations.customRange; + let ranges = {}, + customRange = {}, + rangesOriginal = {}; - Object.assign(ranges, this.props.ranges, customRange); + if (this.props.ranges == null || !Array.isArray(this.props.ranges)) { + customRange[this.props.translations.customRange] = this.props.translations.customRange; + Object.assign(ranges, this.props.ranges, customRange); + rangesOriginal = ranges; + } else { + rangesOriginal = this.props.ranges; + + if (Array.isArray(this.props.ranges)) { + for (let cur in this.props.ranges) { + let curColumn = this.props.ranges[cur]; + + Object.assign(ranges, curColumn.ranges); + } + + customRange[this.props.translations.customRange] = this.props.translations.customRange; + Object.assign(ranges, customRange); + } + } if (this.props.local && this.props.local.format) { momentFormat = this.props.local.format; @@ -27,6 +44,7 @@ class DateTimeRangePicker extends React.Component { this.state = { selectedRange: 0, selectingModeFrom: true, + rangesOriginal: rangesOriginal, ranges: ranges, start: this.props.start, startLabel: this.props.start.format(momentFormat), @@ -456,7 +474,7 @@ class DateTimeRangePicker extends React.Component { return ( + {this.getButtons(ranges)} +
+ ); + } //if (Array.isArray(ranges.columns)) + else { + return ( +
+ {Object.keys(ranges).map((column, i) => { + const curColumn = ranges[column]; + return ( +
+
{curColumn.title}
+ +
{this.getButtons(curColumn.ranges)}
+
+ ); + })} +
+ ); } - // Map the range index and object name and value to a range button - return ( -
- {Object.keys(this.props.ranges).map((range, i) => ( - - ))} -
- ); + } + + getButtons(ranges) { + return Object.keys(ranges).map((range, i) => ( + + )); } } export default Ranges; diff --git a/src/lib/style/DateTimeRange.css b/src/lib/style/DateTimeRange.css index 04be62e..558bab5 100644 --- a/src/lib/style/DateTimeRange.css +++ b/src/lib/style/DateTimeRange.css @@ -16,11 +16,12 @@ margin-top: 1px; top: 100px; left: 20px; - max-width: 680px; + /* max-width: 680px; */ z-index: 3001; border: 1px solid rgba(0, 0, 0, 0.15); background-clip: padding-box; box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + min-height: 370px; } .daterangepicker.error { @@ -50,6 +51,33 @@ .rangecontainer { width: 160px; } +.rangecontainer.columns { + width: auto; +} +.rangecontainer.columns.col1 { + width: 122px; +} +.rangecontainer.columns.col2 { + width: 244px; +} +.rangecontainer.columns.col3 { + width: 366px; +} +.rangecontainer.columns.col4 { + width: 488px; +} +.rangecontainer.columns .range-column { + display: inline-block; + vertical-align: top; + + margin: 0; +} +.rangecontainer.columns .range-column .title { + text-align: center; + font-weight: bold; + padding: 5px 0; + font-size: 12px; +} .fromDateTimeContainer { font-size: 13px; From eb5a003a0b0a3ac44113ad67bfbe2360a50ad521 Mon Sep 17 00:00:00 2001 From: andreaci Date: Wed, 6 Mar 2019 22:54:20 +0100 Subject: [PATCH 15/31] virtual selection now working - removed strange behaviours on next/prev month selection --- src/Wrapper.jsx | 588 ++++++------ src/lib/DateTimeRangeComponent.jsx | 387 ++++---- src/lib/DateTimeRangeContainer.jsx | 7 +- src/lib/DateTimeRangePicker.jsx | 999 +++++++++++---------- src/lib/calendar/Calendar.jsx | 346 +++---- src/lib/calendar/CalendarRow.jsx | 65 +- src/lib/calendar/CalendarRows.jsx | 69 +- src/lib/calendar/Cell.jsx | 458 +++++----- src/lib/date_picker/ApplyCancelButtons.jsx | 314 +++---- src/lib/date_picker/DatePicker.jsx | 151 ++-- src/lib/utils/TimeFunctionUtils.js | 253 +++--- 11 files changed, 1853 insertions(+), 1784 deletions(-) diff --git a/src/Wrapper.jsx b/src/Wrapper.jsx index 9b26616..c423b96 100644 --- a/src/Wrapper.jsx +++ b/src/Wrapper.jsx @@ -1,308 +1,308 @@ -import React from 'react'; -import DateTimeRangeContainer, { DateTimeRangeComponent } from './lib/index'; +import React from "react"; +import DateTimeRangeContainer, { DateTimeRangeComponent } from "./lib/index"; -import moment from 'moment'; +import moment from "moment"; class Wrapper extends React.Component { - constructor(props) { - super(props); - let now = new Date(); - let start = moment(new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0, 0)); - let end = moment(start) - .add(1, 'days') - .subtract(1, 'seconds'); - start = moment(start) - .subtract(34, 'months') - .subtract(1, 'seconds'); - end = moment(start) - .add(5, 'days') - .add(); - this.state = { - start: start, - end: end - }; - - this.onClick = this.onClick.bind(this); - this.applyCallback = this.applyCallback.bind(this); - } - - applyCallback(startDate, endDate) { - //console.log('Apply Callback'); - //console.log(startDate.format('DD-MM-YYYY HH:mm')); - //console.log(endDate.format('DD-MM-YYYY HH:mm')); - this.setState({ - start: startDate, - end: endDate - }); - } - onChangeReady(data) { - //console.log(data); - } - onClick() { - let newStart = moment(this.state.start).subtract(3, 'days'); - // console.log("On Click Callback"); - // console.log(newStart.format("DD-MM-YYYY HH:mm")); - this.setState({ start: newStart }); - } - - renderContainerNoGrid(ranges, local, maxDate) { - return ( -
-

renderContainerNoGrid

- - - -
Click Me to test change state here and updating picker
-
- ); - } - - renderGrid(ranges, local, maxDate) { - return ( -
-

renderGrid

- - - - -
- ); - } - renderMaxDays(ranges, local, maxDate) { - return ( -
-

renderMaxDays

- - - -
- ); - } - renderDisableTime(ranges, local, maxDate) { - return ( -
-

renderDisableTime

- - - - -
- ); - } - renderDisableDateBox(ranges, local, maxDate) { - return ( -
-

renderDisableDateBox

- - - -
- ); - } - - renderDisabled(ranges, local, maxDate) { - return ( -
-

renderDisabled

- - - -
- ); - } - renderTranslated(ranges, local, maxDate) { - return ( -
-

renderTranslated

- - - -
- ); - } - - renderMax1Day(ranges, local, maxDate) { - return ( -
-

renderMax1Day

- - - -
- ); - } - renderReadyToUseWT(ranges, local, maxDate) { - return ( -
-

renderReadyToUseWithTime

- -
- ); - } - renderReadyToUseDisabled(ranges, local, maxDate) { - return ( -
-

renderReadyToUseDisabled

- -
- ); - } - renderReadyToUse(ranges, local, maxDate) { - return ( -
-

renderReadyToUse

- -
- ); - } - renderCustomStyles(ranges, local, maxDate) { - return ( -
-

renderCustomStyles

- -
- ); - } - - renderRangeCallback(ranges, local, maxDate) { - return ( -
-

renderRangeCallback

- -
- ); - } - - renderConfusingRanges(ranges, local, maxDate) { - return ( -
-

renderConfusingRanges

- - - -
- ); - } - - onRange(value, data, cbdata) { - //console.log('range selected callback: ' + value + ' > ' + data); - //console.log(cbdata); - } - - render() { - let now = new Date(); - let start = moment(new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0, 0)); - let end = moment(start) - .add(1, 'days') - .subtract(1, 'seconds'); - let ranges = { - 'Today Only': [moment(start), moment(end)], - 'Yesterday Only': [moment(start).subtract(1, 'days'), moment(end).subtract(1, 'days')], - '3 Days': [moment(start).subtract(3, 'days'), moment(end)], - '5 Days': [moment(start).subtract(5, 'days'), moment(end)], - '1 Week': [moment(start).subtract(7, 'days'), moment(end)], - '2 Weeks': [moment(start).subtract(14, 'days'), moment(end)], - '1 Month': [moment(start).subtract(1, 'months'), moment(end)], - '90 Days': [moment(start).subtract(90, 'days'), moment(end)], - '1 Year': [moment(start).subtract(1, 'years'), moment(end)] - }; - - const ranges2 = [ - { title: 'prima colonna', ranges: ranges }, - { title: 'seconda colonna', ranges: ranges }, - { title: 'tersa colonna', ranges: ranges }, - { title: 'quarsa colonna', ranges: ranges } - ]; - - let local = { - format: 'DD-MM-YYYY HH:mm', - sundayFirst: false - }; - let maxDate = moment(start).add(24, 'hour'); - return ( -
- {this.renderMax1Day(ranges, local, maxDate)} - - {this.renderGrid(ranges, local, maxDate)} - - {this.renderContainerNoGrid(ranges, local, maxDate)} - - {this.renderDisableTime(ranges, local, maxDate)} - - {this.renderDisableDateBox(ranges, local, maxDate)} - - {this.renderMaxDays(ranges, local, maxDate)} - - {this.renderDisabled(ranges, local, maxDate)} - - {this.renderTranslated(ranges, local, maxDate)} - - {this.renderReadyToUse(ranges, local, maxDate)} - {this.renderReadyToUseWT(ranges, local, maxDate)} - - {this.renderCustomStyles(ranges, local, maxDate)} - - {this.renderReadyToUseDisabled(ranges, local, maxDate)} - {this.renderRangeCallback(ranges, local, maxDate)} - - {this.renderConfusingRanges(ranges2, local, maxDate)} -
- ); - } + constructor(props) { + super(props); + let now = new Date(); + let start = moment(new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0, 0)); + let end = moment(start) + .add(1, "days") + .subtract(1, "seconds"); + start = moment(start) + .subtract(34, "months") + .subtract(1, "seconds"); + end = moment(start) + .add(5, "days") + .add(); + this.state = { + start: start, + end: end + }; + + this.onClick = this.onClick.bind(this); + this.applyCallback = this.applyCallback.bind(this); + } + + applyCallback(startDate, endDate) { + //console.log('Apply Callback'); + //console.log(startDate.format('DD-MM-YYYY HH:mm')); + //console.log(endDate.format('DD-MM-YYYY HH:mm')); + this.setState({ + start: startDate, + end: endDate + }); + } + onChangeReady(data) { + //console.log(data); + } + onClick() { + let newStart = moment(this.state.start).subtract(3, "days"); + // console.log("On Click Callback"); + // console.log(newStart.format("DD-MM-YYYY HH:mm")); + this.setState({ start: newStart }); + } + + renderContainerNoGrid(ranges, local, maxDate) { + return ( +
+

renderContainerNoGrid

+ + + +
Click Me to test change state here and updating picker
+
+ ); + } + + renderGrid(ranges, local, maxDate) { + return ( +
+

renderGrid

+ + + + +
+ ); + } + renderMaxDays(ranges, local, maxDate) { + return ( +
+

renderMaxDays

+ + + +
+ ); + } + renderDisableTime(ranges, local, maxDate) { + return ( +
+

renderDisableTime

+ + + + +
+ ); + } + renderDisableDateBox(ranges, local, maxDate) { + return ( +
+

renderDisableDateBox

+ + + +
+ ); + } + + renderDisabled(ranges, local, maxDate) { + return ( +
+

renderDisabled

+ + + +
+ ); + } + renderTranslated(ranges, local, maxDate) { + return ( +
+

renderTranslated

+ + + +
+ ); + } + + renderMax1Day(ranges, local, maxDate) { + return ( +
+

renderMax1Day

+ + + +
+ ); + } + renderReadyToUseWT(ranges, local, maxDate) { + return ( +
+

renderReadyToUseWithTime

+ +
+ ); + } + renderReadyToUseDisabled(ranges, local, maxDate) { + return ( +
+

renderReadyToUseDisabled

+ +
+ ); + } + renderReadyToUse(ranges, local, maxDate) { + return ( +
+

renderReadyToUse

+ +
+ ); + } + renderCustomStyles(ranges, local, maxDate) { + return ( +
+

renderCustomStyles

+ +
+ ); + } + + renderRangeCallback(ranges, local, maxDate) { + return ( +
+

renderRangeCallback

+ +
+ ); + } + + renderConfusingRanges(ranges, local, maxDate) { + return ( +
+

renderConfusingRanges

+ + + +
+ ); + } + renderuseVirtualSelection(ranges, local, maxDate) { + return ( +
+

renderuseVirtualSelection

+ + + +
+ ); + } + + onRange(value, data, cbdata) { + //console.log('range selected callback: ' + value + ' > ' + data); + //console.log(cbdata); + } + + render() { + let now = new Date(); + let start = moment(new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0, 0)); + let end = moment(start) + .add(1, "days") + .subtract(1, "seconds"); + let ranges = { + "Today Only": [moment(start), moment(end)], + "Yesterday Only": [moment(start).subtract(1, "days"), moment(end).subtract(1, "days")], + "3 Days": [moment(start).subtract(3, "days"), moment(end)], + "5 Days": [moment(start).subtract(5, "days"), moment(end)], + "1 Week": [moment(start).subtract(7, "days"), moment(end)], + "2 Weeks": [moment(start).subtract(14, "days"), moment(end)], + "1 Month": [moment(start).subtract(1, "months"), moment(end)], + "90 Days": [moment(start).subtract(90, "days"), moment(end)], + "1 Year": [moment(start).subtract(1, "years"), moment(end)] + }; + + const ranges2 = [ + { title: "prima colonna", ranges: ranges }, + { title: "seconda colonna", ranges: ranges }, + { title: "tersa colonna", ranges: ranges }, + { title: "quarsa colonna", ranges: ranges } + ]; + + let local = { + format: "DD-MM-YYYY HH:mm", + sundayFirst: false + }; + let maxDate = moment(start).add(24, "hour"); + return ( +
+ {this.renderuseVirtualSelection(ranges, local, maxDate)} + {this.renderMax1Day(ranges, local, maxDate)} + {this.renderGrid(ranges, local, maxDate)} + {this.renderContainerNoGrid(ranges, local, maxDate)} + {this.renderDisableTime(ranges, local, maxDate)} + {this.renderDisableDateBox(ranges, local, maxDate)} + {this.renderMaxDays(ranges, local, maxDate)} + {this.renderDisabled(ranges, local, maxDate)} + {this.renderTranslated(ranges, local, maxDate)} + {this.renderReadyToUse(ranges, local, maxDate)} + {this.renderReadyToUseWT(ranges, local, maxDate)} + {this.renderCustomStyles(ranges, local, maxDate)} + {this.renderReadyToUseDisabled(ranges, local, maxDate)} + {this.renderRangeCallback(ranges, local, maxDate)} + {this.renderConfusingRanges(ranges2, local, maxDate)} +
+ ); + } } export { Wrapper }; -const h1style = { borderTop: '1px solid gray', fontSize: 14, fontWeight: 600 }; +const h1style = { borderTop: "1px solid gray", fontSize: 14, fontWeight: 600 }; const divstyle = { padding: 30 }; const translations = { - Apply: 'appleeeeca', - Cancel: 'annuuuuu', - customRange: 'customme', - FromDate: 'daaaa', - ToDate: 'aaaaa', - months: ['1January', '2February', '3March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], - days: ['Lu', 'Ma', 'Me', 'Th', 'Fr', 'Sa', 'Su'] + Apply: "appleeeeca", + Cancel: "annuuuuu", + customRange: "customme", + FromDate: "daaaa", + ToDate: "aaaaa", + months: ["1January", "2February", "3March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + days: ["Lu", "Ma", "Me", "Th", "Fr", "Sa", "Su"] }; const customStyles = { - inBetweenStyle: () => { - return { - borderRadius: '0', - borderColour: 'transparent', - color: 'red', - backgroundColor: '#ffaaaa', - cursor: 'pointer' - }; - }, - - startDateStyle: () => { - return { - borderRadius: '10px 0 0 10px', - borderColour: 'transparent', - color: '#fff', - backgroundColor: 'red', - cursor: 'pointer' - }; - }, - - endDateStyle: () => { - return { - borderRadius: '0 10px 10px 0', - borderColour: 'transparent', - color: '#fff', - backgroundColor: 'red', - cursor: 'pointer' - }; - }, - - normalRangeStyle: () => { - return { color: 'red' }; - }, - selectedRangeStyle: () => { - return { - backgroundColor: 'red' - }; - } + inBetweenStyle: () => { + return { + borderRadius: "0", + borderColour: "transparent", + color: "red", + backgroundColor: "#ffaaaa", + cursor: "pointer" + }; + }, + + startDateStyle: () => { + return { + borderRadius: "10px 0 0 10px", + borderColour: "transparent", + color: "#fff", + backgroundColor: "red", + cursor: "pointer" + }; + }, + + endDateStyle: () => { + return { + borderRadius: "0 10px 10px 0", + borderColour: "transparent", + color: "#fff", + backgroundColor: "red", + cursor: "pointer" + }; + }, + + normalRangeStyle: () => { + return { color: "red" }; + }, + selectedRangeStyle: () => { + return { + backgroundColor: "red" + }; + } }; diff --git a/src/lib/DateTimeRangeComponent.jsx b/src/lib/DateTimeRangeComponent.jsx index e5a16ff..56919a7 100644 --- a/src/lib/DateTimeRangeComponent.jsx +++ b/src/lib/DateTimeRangeComponent.jsx @@ -1,199 +1,210 @@ -import React, { Component } from 'react'; -import DateTimeRangeContainer from './DateTimeRangeContainer'; -import moment from 'moment'; -import PropTypes from 'prop-types'; +import React, { Component } from "react"; +import DateTimeRangeContainer from "./DateTimeRangeContainer"; +import moment from "moment"; +import PropTypes from "prop-types"; -import './DateTimeRangeComponent.css'; +import "./DateTimeRangeComponent.css"; class DateRangeComponent extends Component { - componentWillMount() { - let now = new Date(); - - let start = this.props.start != null ? this.props.start : new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0, 0); - - let end = this.props.end - ? moment(this.props.end) - : moment(start) - .add(1, 'days') - .subtract(1, 'seconds'); - - let maxDays = this.props.maxDays == null ? 366 : this.props.maxDays; - - let rangesStr = this.props.translations != null ? this.props.translations.DefaultRanges : null; - if (rangesStr != null && rangesStr.length < 9) { - console.log('Invalid RangesDescriptors in translations! '); - rangesStr = null; - } - - if (rangesStr == null) rangesStr = DefaultRangesDescriptors; - - let ranges = {}; - if (this.props.ranges == null) { - ranges[rangesStr[0]] = [moment(start), moment(end)]; - ranges[rangesStr[1]] = [moment(start).subtract(1, 'days'), moment(end).subtract(1, 'days')]; - - if (maxDays === 1) ranges[rangesStr[2]] = [moment(start).subtract(2, 'days'), moment(end).subtract(2, 'days')]; - - if (maxDays > 3) ranges[rangesStr[3]] = [moment(start).subtract(3, 'days'), moment(end)]; - if (maxDays > 5) ranges[rangesStr[4]] = [moment(start).subtract(5, 'days'), moment(end)]; - if (maxDays > 7) ranges[rangesStr[5]] = [moment(start).subtract(7, 'days'), moment(end)]; - if (maxDays > 14) ranges[rangesStr[6]] = [moment(start).subtract(14, 'days'), moment(end)]; - if (maxDays > 30) ranges[rangesStr[7]] = [moment(start).subtract(1, 'months'), moment(end)]; - if (maxDays > 90) ranges[rangesStr[8]] = [moment(start).subtract(3, 'months'), moment(end)]; - if (maxDays > 365) ranges[rangesStr[9]] = [moment(start).subtract(1, 'years'), moment(end)]; - } else { - ranges = this.props.ranges; - - Object.keys(ranges).forEach(e => { - let cur = ranges[e]; - if (cur[0]._isAMomentObject == null) cur[0] = moment(cur[0]); - if (cur[1]._isAMomentObject == null) cur[1] = moment(cur[1]); - }); - } - - this.setState({ - start: start, - end: end.toDate(), - ranges - }); - - this.applyCallback = this.applyCallback.bind(this); - } - - componentDidMount() { - this.applyCallback(this.state.start, this.state.end); - } - - getDateString(date) { - let options = { - year: 'numeric', - month: 'long', - day: 'numeric' - }; - - var locale = window.navigator.userLanguage || window.navigator.language; - - if (date._isAMomentObject === true) date = date.toDate(); - - return ( - date.toLocaleDateString(locale, options) + - (this.props.enableTime - ? ' ' + - date - .getHours() - .toString() - .padStart(2, 0) + - ':' + - date - .getMinutes() - .toString() - .padStart(2, 0) - : '') - ); - } - - applyCallback(startDate, endDate) { - //console.log(`applyCallback ${startDate} > ${endDate}`); - let selectedTextFrom = this.getDateString(startDate); - let selectedTextTo = this.getDateString(endDate); - - if (startDate._isAMomentObject) startDate = startDate.toDate(); - if (endDate._isAMomentObject) endDate = endDate.toDate(); - - this.setState({ - selectedTextFrom: selectedTextFrom, - selectedTextTo: selectedTextTo, - start: startDate, - end: endDate - }); - - let returnValue = {}; - returnValue.from = startDate; - returnValue.to = endDate; - - if (!this.props.enableTime || startDate === endDate) { - returnValue.from.setHours(0); - returnValue.from.setMinutes(0); - returnValue.to.setHours(23); - returnValue.to.setMinutes(59); - } - returnValue.from.setSeconds(0); - returnValue.to.setSeconds(59); - - returnValue.fromH = returnValue.from.getHours(); - - returnValue.from_str = moment(returnValue.from).format('YYYY-MM-DD HH:mm:ss'); - returnValue.to_str = moment(returnValue.to).format('YYYY-MM-DD HH:mm:ss'); - - if (this.props.onChange) { - this.props.onChange(returnValue); - } - } - - render() { - let minYear = this.props.minYear == null ? 2010 : this.props.minYear; - let maxYear = this.props.maxYear == null ? new Date().getFullYear() + 1 : this.props.maxYear; - - let start = moment(this.state.start); - let end = moment(this.state.end); - - let ranges = this.state.ranges; - - let local = { - format: 'DD-MM-YYYY', // + (this.props.enableTime ? ' HH:mm' : ''), - sundayFirst: false - }; - - return ( -
- -
-
- - {this.props.maxDays === 1 ? '' : } -
- -
- ); - } + componentWillMount() { + let now = new Date(); + + let start = this.props.start != null ? this.props.start : new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0, 0); + + let end = this.props.end + ? moment(this.props.end) + : moment(start) + .add(1, "days") + .subtract(1, "seconds"); + + let maxDays = this.props.maxDays == null ? 366 : this.props.maxDays; + + let rangesStr = this.props.translations != null ? this.props.translations.DefaultRanges : null; + if (rangesStr != null && rangesStr.length < 9) { + console.log("Invalid RangesDescriptors in translations! "); + rangesStr = null; + } + + if (rangesStr == null) rangesStr = DefaultRangesDescriptors; + + let ranges = {}; + if (this.props.ranges == null) { + ranges[rangesStr[0]] = [moment(start), moment(end)]; + ranges[rangesStr[1]] = [moment(start).subtract(1, "days"), moment(end).subtract(1, "days")]; + + if (maxDays === 1) ranges[rangesStr[2]] = [moment(start).subtract(2, "days"), moment(end).subtract(2, "days")]; + + if (maxDays > 3) ranges[rangesStr[3]] = [moment(start).subtract(3, "days"), moment(end)]; + if (maxDays > 5) ranges[rangesStr[4]] = [moment(start).subtract(5, "days"), moment(end)]; + if (maxDays > 7) ranges[rangesStr[5]] = [moment(start).subtract(7, "days"), moment(end)]; + if (maxDays > 14) ranges[rangesStr[6]] = [moment(start).subtract(14, "days"), moment(end)]; + if (maxDays > 30) ranges[rangesStr[7]] = [moment(start).subtract(1, "months"), moment(end)]; + if (maxDays > 90) ranges[rangesStr[8]] = [moment(start).subtract(3, "months"), moment(end)]; + if (maxDays > 365) ranges[rangesStr[9]] = [moment(start).subtract(1, "years"), moment(end)]; + } else { + ranges = this.props.ranges; + + Object.keys(ranges).forEach(e => { + let cur = ranges[e]; + if (cur[0]._isAMomentObject == null) cur[0] = moment(cur[0]); + if (cur[1]._isAMomentObject == null) cur[1] = moment(cur[1]); + }); + } + + this.setState({ + start: start, + end: end.toDate(), + ranges + }); + + this.applyCallback = this.applyCallback.bind(this); + } + + componentDidMount() { + this.applyCallback(this.state.start, this.state.end); + } + + getDateString(date) { + let options = { + year: "numeric", + month: "long", + day: "numeric" + }; + + var locale = window.navigator.userLanguage || window.navigator.language; + + if (date._isAMomentObject === true) date = date.toDate(); + + return ( + date.toLocaleDateString(locale, options) + + (this.props.enableTime + ? " " + + date + .getHours() + .toString() + .padStart(2, 0) + + ":" + + date + .getMinutes() + .toString() + .padStart(2, 0) + : "") + ); + } + + applyCallback(startDate, endDate) { + //console.log(`applyCallback ${startDate} > ${endDate}`); + let selectedTextFrom = this.getDateString(startDate); + let selectedTextTo = this.getDateString(endDate); + + if (startDate._isAMomentObject) startDate = startDate.toDate(); + if (endDate._isAMomentObject) endDate = endDate.toDate(); + + this.setState({ + selectedTextFrom: selectedTextFrom, + selectedTextTo: selectedTextTo, + start: startDate, + end: endDate + }); + + let returnValue = {}; + returnValue.from = startDate; + returnValue.to = endDate; + + if (!this.props.enableTime || startDate === endDate) { + returnValue.from.setHours(0); + returnValue.from.setMinutes(0); + returnValue.to.setHours(23); + returnValue.to.setMinutes(59); + } + returnValue.from.setSeconds(0); + returnValue.to.setSeconds(59); + + returnValue.fromH = returnValue.from.getHours(); + + returnValue.from_str = moment(returnValue.from).format("YYYY-MM-DD HH:mm:ss"); + returnValue.to_str = moment(returnValue.to).format("YYYY-MM-DD HH:mm:ss"); + + if (this.props.onChange) { + this.props.onChange(returnValue); + } + } + + render() { + let minYear = this.props.minYear == null ? 2010 : this.props.minYear; + let maxYear = this.props.maxYear == null ? new Date().getFullYear() + 1 : this.props.maxYear; + + let start = moment(this.state.start); + let end = moment(this.state.end); + + let ranges = this.state.ranges; + + let local = { + format: "DD-MM-YYYY", // + (this.props.enableTime ? ' HH:mm' : ''), + sundayFirst: false + }; + + return ( +
+ +
+
+ + {this.props.maxDays === 1 ? "" : } +
+ +
+ ); + } } export default DateRangeComponent; -const DefaultRangesDescriptors = ['Today', 'Yesterday', 'Two days ago', '3 days', '5 days', 'Last week', 'Last two week', 'Last month', 'Last 3 months', 'Last year']; +const DefaultRangesDescriptors = ["Today", "Yesterday", "Two days ago", "3 days", "5 days", "Last week", "Last two week", "Last month", "Last 3 months", "Last year"]; DateTimeRangeContainer.propTypes = { - start: PropTypes.object, - end: PropTypes.object, - ranges: PropTypes.object, - enableTime: PropTypes.bool, - disabled: PropTypes.bool, - onChange: PropTypes.func.isRequired, - className: PropTypes.string, - maxDays: PropTypes.number.isRequired, - minYear: PropTypes.number, - maxYear: PropTypes.number, - translations: PropTypes.object, - calendarStyles: PropTypes.object, - rangeCallback: PropTypes.func, - showCurrentState: PropTypes.bool, - autoCloseOnSelection: PropTypes.bool + start: PropTypes.object, + end: PropTypes.object, + ranges: PropTypes.object, + enableTime: PropTypes.bool, + disabled: PropTypes.bool, + onChange: PropTypes.func.isRequired, + className: PropTypes.string, + maxDays: PropTypes.number.isRequired, + minYear: PropTypes.number, + maxYear: PropTypes.number, + translations: PropTypes.object, + calendarStyles: PropTypes.object, + rangeCallback: PropTypes.func, + showCurrentState: PropTypes.bool, + autoCloseOnSelection: PropTypes.bool, + useVirtualSelection: PropTypes.bool }; -DateTimeRangeContainer.defaultProps = { maxDays: 366, enableTime: false, disabled: false, minYear: 2010, maxYear: new Date().getFullYear() + 1, showCurrentState: false, autoCloseOnSelection: true }; +DateTimeRangeContainer.defaultProps = { + useVirtualSelection: false, + maxDays: 366, + enableTime: false, + disabled: false, + minYear: 2010, + maxYear: new Date().getFullYear() + 1, + showCurrentState: false, + autoCloseOnSelection: true +}; diff --git a/src/lib/DateTimeRangeContainer.jsx b/src/lib/DateTimeRangeContainer.jsx index 3c64141..1285db8 100644 --- a/src/lib/DateTimeRangeContainer.jsx +++ b/src/lib/DateTimeRangeContainer.jsx @@ -143,6 +143,7 @@ class DateTimeRangeContainer extends React.Component { rangeCallback={this.props.rangeCallback} showCurrentState={this.props.showCurrentState} autoCloseOnSelection={this.props.autoCloseOnSelection} + useVirtualSelection={this.props.useVirtualSelection} />
@@ -183,7 +184,8 @@ DateTimeRangeContainer.propTypes = { maxYear: PropTypes.number, calendarStyles: PropTypes.object, showCurrentState: PropTypes.bool, - autoCloseOnSelection: PropTypes.bool + autoCloseOnSelection: PropTypes.bool, + useVirtualSelection: PropTypes.bool }; DateTimeRangeContainer.defaultProps = { @@ -195,7 +197,8 @@ DateTimeRangeContainer.defaultProps = { translations: default_translations, minYear: 2000, maxYear: new Date().getFullYear() + 1, - autoCloseOnSelection: false + autoCloseOnSelection: false, + useVirtualSelection: false }; export default DateTimeRangeContainer; diff --git a/src/lib/DateTimeRangePicker.jsx b/src/lib/DateTimeRangePicker.jsx index cc4754e..5395fab 100644 --- a/src/lib/DateTimeRangePicker.jsx +++ b/src/lib/DateTimeRangePicker.jsx @@ -1,489 +1,518 @@ -import React from 'react'; -import './style/DateTimeRange.css'; -import Ranges from './ranges/Ranges'; -import DatePicker from './date_picker/DatePicker'; -import Fragment from 'react-dot-fragment'; -import moment from 'moment'; -import { isValidTimeChange } from './utils/TimeFunctionUtils'; -import { datePicked, pastMaxDate } from './utils/DateSelectedUtils'; - -export const ModeEnum = Object.freeze({ start: 'start', end: 'end' }); -export var momentFormat = 'DD-MM-YYYY HH:mm'; +import React from "react"; +import "./style/DateTimeRange.css"; +import Ranges from "./ranges/Ranges"; +import DatePicker from "./date_picker/DatePicker"; +import Fragment from "react-dot-fragment"; +import moment from "moment"; +import { isValidTimeChange } from "./utils/TimeFunctionUtils"; +import { datePicked, pastMaxDate } from "./utils/DateSelectedUtils"; + +export const ModeEnum = Object.freeze({ start: "start", end: "end" }); +export var momentFormat = "DD-MM-YYYY HH:mm"; class DateTimeRangePicker extends React.Component { - constructor(props) { - super(props); - - let ranges = {}, - customRange = {}, - rangesOriginal = {}; - - if (this.props.ranges == null || !Array.isArray(this.props.ranges)) { - customRange[this.props.translations.customRange] = this.props.translations.customRange; - Object.assign(ranges, this.props.ranges, customRange); - rangesOriginal = ranges; - } else { - rangesOriginal = this.props.ranges; - - if (Array.isArray(this.props.ranges)) { - for (let cur in this.props.ranges) { - let curColumn = this.props.ranges[cur]; - - Object.assign(ranges, curColumn.ranges); - } - - customRange[this.props.translations.customRange] = this.props.translations.customRange; - Object.assign(ranges, customRange); - } - } - - if (this.props.local && this.props.local.format) { - momentFormat = this.props.local.format; - } - - this.state = { - selectedRange: 0, - selectingModeFrom: true, - rangesOriginal: rangesOriginal, - ranges: ranges, - start: this.props.start, - startLabel: this.props.start.format(momentFormat), - end: this.props.end, - endLabel: this.props.end.format(momentFormat), - focusDate: false, - errorClass: '' - }; - this.bindToFunctions(); - } - - bindToFunctions() { - this.rangeSelectedCallback = this.rangeSelectedCallback.bind(this); - this.dateSelectedNoTimeCallback = this.dateSelectedNoTimeCallback.bind(this); - this.timeChangeCallback = this.timeChangeCallback.bind(this); - this.dateTextFieldCallback = this.dateTextFieldCallback.bind(this); - this.onChangeDateTextHandlerCallback = this.onChangeDateTextHandlerCallback.bind(this); - this.changeSelectingModeCallback = this.changeSelectingModeCallback.bind(this); - this.applyCallback = this.applyCallback.bind(this); - this.keyboardCellCallback = this.keyboardCellCallback.bind(this); - this.focusOnCallback = this.focusOnCallback.bind(this); - this.cellFocusedCallback = this.cellFocusedCallback.bind(this); - } - - componentDidMount() { - this.setToRangeValue(this.state.start, this.state.end); - } - - componentDidUpdate(prevProps) { - if (!this.props.start.isSame(prevProps.start)) { - this.updateStartEndAndLabels(this.props.start, this.state.end); - } else if (!this.props.end.isSame(prevProps.end)) { - this.updateStartEndAndLabels(this.state.start, this.props.end); - } - } - - applyCallback() { - this.applyCallbackDirect(this.state.start, this.state.end); - } - - applyCallbackDirect(start, end) { - if (!this.checkMaxDays(start, end)) { - return false; - } - - if (this.props.applyCallback) { - this.props.applyCallback(start, end); - } - - this.props.changeVisibleState(); - } - - checkMaxDays(startDate, endDate) { - let { maxDays } = this.props; - - if (maxDays != null && maxDays > 0) { - let days = Date.daysBetween(startDate, endDate); - - if (days - 1 > this.props.maxDays) { - this.props.updateErrorClass('error'); - if (this.state.errorClass !== 'error') this.setState({ errorClass: 'error' }); - return false; - } else { - this.props.updateErrorClass(''); - if (this.state.errorClass !== '') this.setState({ errorClass: '' }); - return true; - } - } - - return true; - } - - rangeSelectedCallback(index, value) { - // If Past Max Date Dont allow update - let start; - let end; - if (value !== this.props.translations.customRange) { - start = this.state.ranges[value][0]; - end = this.state.ranges[value][1]; - if (pastMaxDate(start, this.props.maxDate, true) || pastMaxDate(end, this.props.maxDate, true)) { - return false; - } - if (!this.checkMaxDays(start, end)) { - return false; - } - if (this.props.rangeCallback) { - this.props.rangeCallback(value, this.state.ranges[value], { start: this.state.ranges[value][0].toDate(), end: this.state.ranges[value][1].toDate() }); - } - } - // Else update state to new selected index and update start and end time - this.setState({ selectedRange: index }); - if (value !== this.props.translations.customRange) { - this.updateStartEndAndLabels(start, end); - } - - if (this.props.autoCloseOnSelection) { - this.applyCallbackDirect(this.state.ranges[value][0].toDate(), this.state.ranges[value][1].toDate()); - } - } - - setToRangeValue(startDate, endDate) { - if (!this.checkMaxDays(startDate, endDate)) { - return false; - } - - let rangesArray = Object.values(this.state.ranges); - for (let i = 0; i < rangesArray.length; i++) { - if (rangesArray[i] === this.props.translations.customRange) { - continue; - } else if (rangesArray[i][0].isSame(startDate, 'minutes') && rangesArray[i][1].isSame(endDate, 'minutes')) { - this.setState({ selectedRange: i }); - - if (this.props.rangeCallback) { - this.props.rangeCallback(i, rangesArray[i], { start: rangesArray[i][0].toDate(), end: rangesArray[i][1].toDate() }); - } - - return; - } - } - this.setToCustomRange(); - } - - setToCustomRange() { - let rangesArray = Object.values(this.state.ranges); - for (let i = 0; i < rangesArray.length; i++) { - if (rangesArray[i] === this.props.translations.customRange) { - this.setState({ selectedRange: i }); - } - } - } - - updateStartEndAndLabels(newStart, newEnd) { - this.setState({ - start: newStart, - startLabel: newStart.format(momentFormat), - end: newEnd, - endLabel: newEnd.format(momentFormat) - }); - } - - dateSelectedNoTimeCallback(cellDate) { - if (this.props.maxDays != null && this.props.maxDays === 1) { - let startDate = moment([cellDate.year(), cellDate.month(), cellDate.date(), 0, 0, 0]); - let endDate = moment([cellDate.year(), cellDate.month(), cellDate.date(), 23, 59, 59]); - - this.updateStartEndAndLabels(startDate, endDate); - - //eslint-disable-next-line - this.state.start = startDate; - //eslint-disable-next-line - this.state.end = endDate; - - this.setState({ - start: startDate, - end: endDate, - selectingModeFrom: false - }); - - this.applyCallback(); - - return; - } else { - let newDates = datePicked(this.state.start, this.state.end, cellDate, this.state.selectingModeFrom); - - let startDate = newDates.startDate; - let endDate = newDates.endDate; - - let newStart = this.duplicateMomentTimeFromState(startDate, true); - let newEnd = this.duplicateMomentTimeFromState(endDate, false); - - this.updateStartEndAndLabels(newStart, newEnd); - this.setToRangeValue(newStart, newEnd); - - this.setState(prevState => ({ - selectingModeFrom: !prevState.selectingModeFrom - })); - - if (this.props.autoCloseOnSelection && !this.state.selectingModeFrom) { - this.applyCallbackDirect(startDate, endDate); - } - } - } - - changeSelectingModeCallback(selectingModeFromParam) { - this.setState({ selectingModeFrom: selectingModeFromParam }); - } - - duplicateMomentTimeFromState(date, startDate) { - let state; - if (startDate) { - state = this.state.start; - } else { - state = this.state.end; - } - let newDate = [date.year(), date.month(), date.date(), state.hours(), state.minutes()]; - return moment(newDate); - } - - timeChangeCallback(newHour, newMinute, mode) { - if (mode === 'start') { - this.updateStartTime(newHour, newMinute, mode); - } else if (mode === 'end') { - this.updateEndTime(newHour, newMinute, mode); - } - } - - updateStartTime(newHour, newMinute, mode) { - this.updateTime(this.state.start, newHour, newMinute, mode, 'start', 'startLabel'); - } - - updateEndTime(newHour, newMinute, mode) { - this.updateTime(this.state.end, newHour, newMinute, mode, 'end', 'endLabel'); - } - - updateTime(origDate, newHour, newMinute, mode, stateDateToChangeName, stateLabelToChangeName) { - let date = moment(origDate); - date.hours(newHour); - date.minutes(newMinute); - // If Past Max Date Dont allow update - if (pastMaxDate(date, this.props.maxDate, true)) { - return false; - } - // If Valid Time Change allow the change else set new start and end times - // to be minute ahead/behind the new date - if (isValidTimeChange(mode, date, this.state.start, this.state.end)) { - this.setState({ - [stateDateToChangeName]: date, - [stateLabelToChangeName]: date.format(momentFormat) - }); - this.updateTimeCustomRangeUpdator(stateDateToChangeName, date); - } else { - let newDate = moment(date); - if (mode === 'start') { - newDate.add(1, 'minute'); - this.updateStartEndAndLabels(date, newDate); - this.setToRangeValue(date, newDate); - } else { - newDate.subtract(1, 'minute'); - this.updateStartEndAndLabels(newDate, date); - this.setToRangeValue(newDate, date); - } - } - } - - updateTimeCustomRangeUpdator(stateDateToChangeName, date) { - if (stateDateToChangeName === 'start') { - this.setToRangeValue(date, this.state.end); - } else { - this.setToRangeValue(this.state.start, date); - } - } - - dateTextFieldCallback(mode) { - if (mode === 'start') { - let newDate = moment(this.state.startLabel, momentFormat); - let isValidNewDate = newDate.isValid(); - let isSameOrBeforeEnd = newDate.isSameOrBefore(this.state.end, 'minute'); - let isAfterEndDate = newDate.isAfter(this.state.end); - this.updateDate(mode, newDate, isValidNewDate, isSameOrBeforeEnd, isAfterEndDate, 'start', 'startLabel'); - } else { - let newDate = moment(this.state.endLabel, momentFormat); - let isValidNewDate = newDate.isValid(); - let isBeforeStartDate = newDate.isBefore(this.state.start); - let isSameOrAfterStartDate = newDate.isSameOrAfter(this.state.start, 'minute'); - this.updateDate(mode, newDate, isValidNewDate, isSameOrAfterStartDate, isBeforeStartDate, 'end', 'endLabel'); - } - } - - updateDate(mode, newDate, isValidNewDate, isValidDateChange, isInvalidDateChange, stateDateToChangeName, stateLabelToChangeName) { - // If new date past max date dont allow change - if (pastMaxDate(newDate, this.props.maxDate, true)) { - this.updateStartEndAndLabels(this.state.start, this.state.end); - return false; - } - // Else if date valid and date change valid update the date, - // if date invalid go into update invalid mode, adds/subtract 1 days from start/stop value - if (isValidNewDate && isValidDateChange) { - this.setState({ - [stateDateToChangeName]: newDate, - [stateLabelToChangeName]: newDate.format(momentFormat) - }); - if (this.updateTimeUpdator) this.updateTimeUpdator(stateDateToChangeName, newDate); - } else if (isValidNewDate && isInvalidDateChange) { - this.updateInvalidDate(mode, newDate); - } else if (!isValidNewDate) { - this.updateStartEndAndLabels(this.state.start, this.state.end); - } - } - - updateInvalidDate(mode, newDate) { - if (mode === 'start') { - let newEndDate = moment(newDate).add(1, 'day'); - this.updateLabelsAndRangeValues(newDate, newEndDate); - } else { - let newStartDate = moment(newDate).subtract(1, 'day'); - this.updateStartEndAndLabels(newStartDate, newDate); - } - } - - updateLabelsAndRangeValues(startDate, endDate) { - this.updateStartEndAndLabels(startDate, endDate); - this.setToRangeValue(startDate, endDate); - } - - onChangeDateTextHandlerCallback(newValue, mode) { - if (mode === 'start') { - this.setState({ - startLabel: newValue - }); - } else if (mode === 'end') { - this.setState({ - endLabel: newValue - }); - } - } - - keyboardCellCallback(originalDate, newDate) { - let startDate; - let endDate; - if (originalDate.isSame(this.state.start, 'day')) { - startDate = this.duplicateMomentTimeFromState(newDate, true); - endDate = moment(this.state.end); - } else { - startDate = moment(this.state.start); - endDate = this.duplicateMomentTimeFromState(newDate, false); - } - - if (startDate.isBefore(endDate, 'day')) { - this.updateStartEndAndLabels(startDate, endDate); - } else { - this.updateStartEndAndLabels(endDate, startDate); - } - } - - focusOnCallback(date) { - if (date) { - this.setState({ - focusDate: date - }); - } else { - this.setState({ - focusDate: false - }); - } - } - - cellFocusedCallback(date) { - if (date.isSame(this.state.start, 'day')) { - this.changeSelectingModeCallback(true); - } else if (date.isSame(this.state.end, 'day')) { - this.changeSelectingModeCallback(false); - } - } - - renderStartDate() { - return ( - - ); - } - - renderEndDate() { - return ( - - ); - } - - render() { - return ( - - - {this.props.maxDays == null || this.props.maxDays > 1 ? this.renderStartDate() : ''} - {this.renderEndDate()} - - ); - } + constructor(props) { + super(props); + + let ranges = {}, + customRange = {}, + rangesOriginal = {}; + + if (this.props.ranges == null || !Array.isArray(this.props.ranges)) { + customRange[this.props.translations.customRange] = this.props.translations.customRange; + Object.assign(ranges, this.props.ranges, customRange); + rangesOriginal = ranges; + } else { + rangesOriginal = this.props.ranges; + + if (Array.isArray(this.props.ranges)) { + for (let cur in this.props.ranges) { + let curColumn = this.props.ranges[cur]; + + Object.assign(ranges, curColumn.ranges); + } + + customRange[this.props.translations.customRange] = this.props.translations.customRange; + Object.assign(ranges, customRange); + } + } + + if (this.props.local && this.props.local.format) { + momentFormat = this.props.local.format; + } + + this.state = { + selectedRange: 0, + selectingModeFrom: true, + rangesOriginal: rangesOriginal, + ranges: ranges, + start: this.props.start, + startLabel: this.props.start.format(momentFormat), + end: this.props.end, + endLabel: this.props.end.format(momentFormat), + focusDate: false, + errorClass: "" + }; + this.bindToFunctions(); + } + + bindToFunctions() { + this.rangeSelectedCallback = this.rangeSelectedCallback.bind(this); + this.dateSelectedNoTimeCallback = this.dateSelectedNoTimeCallback.bind(this); + this.timeChangeCallback = this.timeChangeCallback.bind(this); + this.dateTextFieldCallback = this.dateTextFieldCallback.bind(this); + this.onChangeDateTextHandlerCallback = this.onChangeDateTextHandlerCallback.bind(this); + this.changeSelectingModeCallback = this.changeSelectingModeCallback.bind(this); + this.applyCallback = this.applyCallback.bind(this); + this.keyboardCellCallback = this.keyboardCellCallback.bind(this); + this.focusOnCallback = this.focusOnCallback.bind(this); + this.cellFocusedCallback = this.cellFocusedCallback.bind(this); + this.cellDateHover = this.cellDateHover.bind(this); + } + + componentDidMount() { + this.setToRangeValue(this.state.start, this.state.end); + } + + componentDidUpdate(prevProps) { + if (!this.props.start.isSame(prevProps.start)) { + this.updateStartEndAndLabels(this.props.start, this.state.end); + } else if (!this.props.end.isSame(prevProps.end)) { + this.updateStartEndAndLabels(this.state.start, this.props.end); + } + } + + applyCallback() { + this.applyCallbackDirect(this.state.start, this.state.end); + } + + applyCallbackDirect(start, end) { + if (!this.checkMaxDays(start, end)) { + return false; + } + + if (this.props.applyCallback) { + this.props.applyCallback(start, end); + } + + this.props.changeVisibleState(); + } + + checkMaxDays(startDate, endDate) { + let { maxDays } = this.props; + + if (maxDays != null && maxDays > 0) { + let days = Date.daysBetween(startDate, endDate); + + if (days - 1 > this.props.maxDays) { + this.props.updateErrorClass("error"); + if (this.state.errorClass !== "error") this.setState({ errorClass: "error" }); + return false; + } else { + this.props.updateErrorClass(""); + if (this.state.errorClass !== "") this.setState({ errorClass: "" }); + return true; + } + } + + return true; + } + + rangeSelectedCallback(index, value) { + // If Past Max Date Dont allow update + let start; + let end; + if (value !== this.props.translations.customRange) { + start = this.state.ranges[value][0]; + end = this.state.ranges[value][1]; + if (pastMaxDate(start, this.props.maxDate, true) || pastMaxDate(end, this.props.maxDate, true)) { + return false; + } + if (!this.checkMaxDays(start, end)) { + return false; + } + if (this.props.rangeCallback) { + this.props.rangeCallback(value, this.state.ranges[value], { start: this.state.ranges[value][0].toDate(), end: this.state.ranges[value][1].toDate() }); + } + } + // Else update state to new selected index and update start and end time + this.setState({ selectedRange: index }); + if (value !== this.props.translations.customRange) { + this.updateStartEndAndLabels(start, end); + } + + if (this.props.autoCloseOnSelection) { + this.applyCallbackDirect(this.state.ranges[value][0].toDate(), this.state.ranges[value][1].toDate()); + } + } + + setToRangeValue(startDate, endDate) { + if (!this.checkMaxDays(startDate, endDate)) { + return false; + } + + let rangesArray = Object.values(this.state.ranges); + for (let i = 0; i < rangesArray.length; i++) { + if (rangesArray[i] === this.props.translations.customRange) { + continue; + } else if (rangesArray[i][0].isSame(startDate, "minutes") && rangesArray[i][1].isSame(endDate, "minutes")) { + this.setState({ selectedRange: i }); + + if (this.props.rangeCallback) { + this.props.rangeCallback(i, rangesArray[i], { start: rangesArray[i][0].toDate(), end: rangesArray[i][1].toDate() }); + } + + return; + } + } + this.setToCustomRange(); + } + + setToCustomRange() { + let rangesArray = Object.values(this.state.ranges); + for (let i = 0; i < rangesArray.length; i++) { + if (rangesArray[i] === this.props.translations.customRange) { + this.setState({ selectedRange: i }); + } + } + } + + updateStartEndAndLabels(newStart, newEnd) { + this.setState({ + start: newStart, + startLabel: newStart.format(momentFormat), + end: newEnd, + endLabel: newEnd.format(momentFormat) + }); + } + + dateSelectedNoTimeCallback(cellDate) { + if (this.props.maxDays != null && this.props.maxDays === 1) { + let startDate = moment([cellDate.year(), cellDate.month(), cellDate.date(), 0, 0, 0]); + let endDate = moment([cellDate.year(), cellDate.month(), cellDate.date(), 23, 59, 59]); + + this.updateStartEndAndLabels(startDate, endDate); + + //eslint-disable-next-line + this.state.start = startDate; + //eslint-disable-next-line + this.state.end = endDate; + + this.setState({ + start: startDate, + end: endDate, + selectingModeFrom: false + }); + + this.applyCallback(); + + return; + } else { + let { start: startToUse, end: endToUse } = this.state; + if (this.props.useVirtualSelection && this.state.selectingModeFrom) { + endToUse = new startToUse.clone(); + } + + let newDates = datePicked(startToUse, endToUse, cellDate, this.state.selectingModeFrom); + + let startDate = newDates.startDate; + let endDate = newDates.endDate; + + let newStart = this.duplicateMomentTimeFromState(startDate, true); + let newEnd = this.duplicateMomentTimeFromState(endDate, false); + + this.updateStartEndAndLabels(newStart, newEnd); + this.setToRangeValue(newStart, newEnd); + + this.setState(prevState => ({ + selectingModeFrom: !prevState.selectingModeFrom + })); + + if (this.props.autoCloseOnSelection && !this.state.selectingModeFrom) { + this.applyCallbackDirect(startDate, endDate); + } + } + } + + changeSelectingModeCallback(selectingModeFromParam) { + this.setState({ selectingModeFrom: selectingModeFromParam }); + } + + duplicateMomentTimeFromState(date, startDate) { + let state; + if (startDate) { + state = this.state.start; + } else { + state = this.state.end; + } + let newDate = [date.year(), date.month(), date.date(), state.hours(), state.minutes()]; + return moment(newDate); + } + + timeChangeCallback(newHour, newMinute, mode) { + if (mode === "start") { + this.updateStartTime(newHour, newMinute, mode); + } else if (mode === "end") { + this.updateEndTime(newHour, newMinute, mode); + } + } + + updateStartTime(newHour, newMinute, mode) { + this.updateTime(this.state.start, newHour, newMinute, mode, "start", "startLabel"); + } + + updateEndTime(newHour, newMinute, mode) { + this.updateTime(this.state.end, newHour, newMinute, mode, "end", "endLabel"); + } + + updateTime(origDate, newHour, newMinute, mode, stateDateToChangeName, stateLabelToChangeName) { + let date = moment(origDate); + date.hours(newHour); + date.minutes(newMinute); + // If Past Max Date Dont allow update + if (pastMaxDate(date, this.props.maxDate, true)) { + return false; + } + // If Valid Time Change allow the change else set new start and end times + // to be minute ahead/behind the new date + if (isValidTimeChange(mode, date, this.state.start, this.state.end)) { + this.setState({ + [stateDateToChangeName]: date, + [stateLabelToChangeName]: date.format(momentFormat) + }); + this.updateTimeCustomRangeUpdator(stateDateToChangeName, date); + } else { + let newDate = moment(date); + if (mode === "start") { + newDate.add(1, "minute"); + this.updateStartEndAndLabels(date, newDate); + this.setToRangeValue(date, newDate); + } else { + newDate.subtract(1, "minute"); + this.updateStartEndAndLabels(newDate, date); + this.setToRangeValue(newDate, date); + } + } + } + + updateTimeCustomRangeUpdator(stateDateToChangeName, date) { + if (stateDateToChangeName === "start") { + this.setToRangeValue(date, this.state.end); + } else { + this.setToRangeValue(this.state.start, date); + } + } + + dateTextFieldCallback(mode) { + if (mode === "start") { + let newDate = moment(this.state.startLabel, momentFormat); + let isValidNewDate = newDate.isValid(); + let isSameOrBeforeEnd = newDate.isSameOrBefore(this.state.end, "minute"); + let isAfterEndDate = newDate.isAfter(this.state.end); + this.updateDate(mode, newDate, isValidNewDate, isSameOrBeforeEnd, isAfterEndDate, "start", "startLabel"); + } else { + let newDate = moment(this.state.endLabel, momentFormat); + let isValidNewDate = newDate.isValid(); + let isBeforeStartDate = newDate.isBefore(this.state.start); + let isSameOrAfterStartDate = newDate.isSameOrAfter(this.state.start, "minute"); + this.updateDate(mode, newDate, isValidNewDate, isSameOrAfterStartDate, isBeforeStartDate, "end", "endLabel"); + } + } + + updateDate(mode, newDate, isValidNewDate, isValidDateChange, isInvalidDateChange, stateDateToChangeName, stateLabelToChangeName) { + // If new date past max date dont allow change + if (pastMaxDate(newDate, this.props.maxDate, true)) { + this.updateStartEndAndLabels(this.state.start, this.state.end); + return false; + } + // Else if date valid and date change valid update the date, + // if date invalid go into update invalid mode, adds/subtract 1 days from start/stop value + if (isValidNewDate && isValidDateChange) { + this.setState({ + [stateDateToChangeName]: newDate, + [stateLabelToChangeName]: newDate.format(momentFormat) + }); + if (this.updateTimeUpdator) this.updateTimeUpdator(stateDateToChangeName, newDate); + } else if (isValidNewDate && isInvalidDateChange) { + this.updateInvalidDate(mode, newDate); + } else if (!isValidNewDate) { + this.updateStartEndAndLabels(this.state.start, this.state.end); + } + } + + updateInvalidDate(mode, newDate) { + if (mode === "start") { + let newEndDate = moment(newDate).add(1, "day"); + this.updateLabelsAndRangeValues(newDate, newEndDate); + } else { + let newStartDate = moment(newDate).subtract(1, "day"); + this.updateStartEndAndLabels(newStartDate, newDate); + } + } + + updateLabelsAndRangeValues(startDate, endDate) { + this.updateStartEndAndLabels(startDate, endDate); + this.setToRangeValue(startDate, endDate); + } + + onChangeDateTextHandlerCallback(newValue, mode) { + if (mode === "start") { + this.setState({ + startLabel: newValue + }); + } else if (mode === "end") { + this.setState({ + endLabel: newValue + }); + } + } + + keyboardCellCallback(originalDate, newDate) { + let startDate; + let endDate; + if (originalDate.isSame(this.state.start, "day")) { + startDate = this.duplicateMomentTimeFromState(newDate, true); + endDate = moment(this.state.end); + } else { + startDate = moment(this.state.start); + endDate = this.duplicateMomentTimeFromState(newDate, false); + } + + if (startDate.isBefore(endDate, "day")) { + this.updateStartEndAndLabels(startDate, endDate); + } else { + this.updateStartEndAndLabels(endDate, startDate); + } + } + + focusOnCallback(date) { + if (date) { + this.setState({ + focusDate: date + }); + } else { + this.setState({ + focusDate: false + }); + } + } + + cellDateHover(date, isFrom) { + console.log("hover on " + date.toString() + " mode: " + isFrom); + if (this.props.useVirtualSelection) { + if (this.state.selectingModeFrom) { + /* this.setState({ + start: date, + end: date + }); + + this.updateStartEndAndLabels(date, date); */ + } else { + console.log("set end date " + date.toString()); + this.setState({ + end: date + }); + + this.updateStartEndAndLabels(this.state.start, date); + } + } + } + + cellFocusedCallback(date) { + if (date.isSame(this.state.start, "day")) { + this.changeSelectingModeCallback(true); + } else if (date.isSame(this.state.end, "day")) { + this.changeSelectingModeCallback(false); + } + } + + renderStartDate() { + return ( + + ); + } + + renderEndDate() { + return ( + + ); + } + + render() { + return ( + + + {this.props.maxDays == null || this.props.maxDays > 1 /* && !this.props.useVirtualSelection */ ? this.renderStartDate() : ""} + {this.renderEndDate()} + + ); + } } export { DateTimeRangePicker }; diff --git a/src/lib/calendar/Calendar.jsx b/src/lib/calendar/Calendar.jsx index f7e19f6..c8f09cc 100644 --- a/src/lib/calendar/Calendar.jsx +++ b/src/lib/calendar/Calendar.jsx @@ -1,176 +1,178 @@ -import React from 'react'; -import '../style/DateTimeRange.css'; -import MonthYearSelector from './MonthYearSelector'; -import CalendarHeader from './CalendarHeader'; -import CalendarRows from './CalendarRows'; -import moment from 'moment'; -import { getMonth, getYear, getFourtyTwoDays } from '../utils/TimeFunctionUtils'; +import React from "react"; +import "../style/DateTimeRange.css"; +import MonthYearSelector from "./MonthYearSelector"; +import CalendarHeader from "./CalendarHeader"; +import CalendarRows from "./CalendarRows"; +import moment from "moment"; +import { getMonth, getYear, getFourtyTwoDays } from "../utils/TimeFunctionUtils"; class Calendar extends React.Component { - constructor(props) { - super(props); - this.state = { - month: 0, - year: 0 - }; - - this.changeMonthCallback = this.changeMonthCallback.bind(this); - this.changeYearCallback = this.changeYearCallback.bind(this); - this.changeMonthArrowsCallback = this.changeMonthArrowsCallback.bind(this); - } - - componentDidMount() { - this.updateMonthYear(); - } - - componentDidUpdate(previousProps) { - if (!previousProps.date.isSame(this.props.date) || !previousProps.otherDate.isSame(this.props.otherDate)) { - this.updateMonthYear(); - } - } - - updateMonthYear() { - let newMonth = getMonth(this.props.date, this.props.otherDate, this.props.mode); - let newYear = getYear(this.props.date, this.props.otherDate, this.props.mode); - this.setState({ - month: newMonth, - year: newYear - }); - } - - createMonths() { - // let months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; - return this.props.translations.months; - } - - createYears() { - let years = []; - //Range from 1900 to 25 years into the future - let past = moment(this.props.minYear + '0101', 'YYYYMMDD'); - - let endYear = moment() - .add(this.props.maxYear - new Date().getFullYear(), 'years') - .get('year'); - - let addedCurrentYear = false; - - while (!addedCurrentYear) { - if (past.get('years') === endYear) { - addedCurrentYear = true; - } - years.push(past.year()); - past.add(1, 'years'); - } - return years; - } - - changeMonthCallback(event) { - for (let i = 0; i < event.target.length; i++) { - if (event.target[i].value === event.target.value) { - this.setState({ month: i }); - } - } - } - - changeMonthArrowsCallback(isPreviousChange, isNextChange) { - let years = this.createYears(); - let monthLocal = parseInt(this.state.month); - let yearLocal = parseInt(this.state.year); - - let newMonthYear; - if (isPreviousChange) { - newMonthYear = this.getPreviousMonth(monthLocal, yearLocal, years); - } - if (isNextChange) { - newMonthYear = this.getNextMonth(monthLocal, yearLocal, years); - } - - this.setState({ - year: newMonthYear.yearLocal, - month: newMonthYear.monthLocal - }); - } - - getPreviousMonth(monthLocal, yearLocal, years) { - let isStartOfMonth = monthLocal === 0; - let isFirstYear = parseInt(yearLocal) === years[0]; - - if (!(isStartOfMonth && isFirstYear)) { - if (monthLocal === 0) { - monthLocal = 11; - yearLocal -= 1; - } else { - monthLocal -= 1; - } - } - return { monthLocal, yearLocal }; - } - - getNextMonth(monthLocal, yearLocal, years) { - let isEndOfMonth = monthLocal === 11; - let isLastYear = parseInt(yearLocal) === years[years.length - 1]; - if (!(isEndOfMonth && isLastYear)) { - if (monthLocal === 11) { - monthLocal = 0; - yearLocal += 1; - } else { - monthLocal += 1; - } - } - return { monthLocal, yearLocal }; - } - - changeYearCallback(event) { - this.setState({ year: parseInt(event.target.value) }); - } - - render() { - let months = this.createMonths(); - let years = this.createYears(); - let headers; - let sundayFirst; - if (this.props.local && this.props.local.sundayFirst) { - sundayFirst = true; - headers = [this.props.translations.days[6], ...this.props.translations.days]; //['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']; - } else { - sundayFirst = false; - headers = this.props.translations.days; //['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su']; - } - - let fourtyTwoDays = getFourtyTwoDays(this.state.month, this.state.year, sundayFirst); - return ( -
- - - -
- ); - } + constructor(props) { + super(props); + this.state = { + month: 0, + year: 0 + }; + + this.changeMonthCallback = this.changeMonthCallback.bind(this); + this.changeYearCallback = this.changeYearCallback.bind(this); + this.changeMonthArrowsCallback = this.changeMonthArrowsCallback.bind(this); + } + + componentDidMount() { + this.updateMonthYear(); + } + + componentDidUpdate(previousProps) { + if (!previousProps.date.isSame(this.props.date) || !previousProps.otherDate.isSame(this.props.otherDate)) { + this.updateMonthYear(); + } + } + + updateMonthYear() { + let newMonth = getMonth(this.props.date, this.props.otherDate, this.props.mode); + let newYear = getYear(this.props.date, this.props.otherDate, this.props.mode); + + this.setState({ + month: newMonth, + year: newYear + }); + } + + createMonths() { + // let months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; + return this.props.translations.months; + } + + createYears() { + let years = []; + //Range from 1900 to 25 years into the future + let past = moment(this.props.minYear + "0101", "YYYYMMDD"); + + let endYear = moment() + .add(this.props.maxYear - new Date().getFullYear(), "years") + .get("year"); + + let addedCurrentYear = false; + + while (!addedCurrentYear) { + if (past.get("years") === endYear) { + addedCurrentYear = true; + } + years.push(past.year()); + past.add(1, "years"); + } + return years; + } + + changeMonthCallback(event) { + for (let i = 0; i < event.target.length; i++) { + if (event.target[i].value === event.target.value) { + this.setState({ month: i }); + } + } + } + + changeMonthArrowsCallback(isPreviousChange, isNextChange) { + let years = this.createYears(); + let monthLocal = parseInt(this.state.month); + let yearLocal = parseInt(this.state.year); + + let newMonthYear; + if (isPreviousChange) { + newMonthYear = this.getPreviousMonth(monthLocal, yearLocal, years); + } + if (isNextChange) { + newMonthYear = this.getNextMonth(monthLocal, yearLocal, years); + } + + this.setState({ + year: newMonthYear.yearLocal, + month: newMonthYear.monthLocal + }); + } + + getPreviousMonth(monthLocal, yearLocal, years) { + let isStartOfMonth = monthLocal === 0; + let isFirstYear = parseInt(yearLocal) === years[0]; + + if (!(isStartOfMonth && isFirstYear)) { + if (monthLocal === 0) { + monthLocal = 11; + yearLocal -= 1; + } else { + monthLocal -= 1; + } + } + return { monthLocal, yearLocal }; + } + + getNextMonth(monthLocal, yearLocal, years) { + let isEndOfMonth = monthLocal === 11; + let isLastYear = parseInt(yearLocal) === years[years.length - 1]; + if (!(isEndOfMonth && isLastYear)) { + if (monthLocal === 11) { + monthLocal = 0; + yearLocal += 1; + } else { + monthLocal += 1; + } + } + return { monthLocal, yearLocal }; + } + + changeYearCallback(event) { + this.setState({ year: parseInt(event.target.value) }); + } + + render() { + let months = this.createMonths(); + let years = this.createYears(); + let headers; + let sundayFirst; + if (this.props.local && this.props.local.sundayFirst) { + sundayFirst = true; + headers = [this.props.translations.days[6], ...this.props.translations.days]; //['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']; + } else { + sundayFirst = false; + headers = this.props.translations.days; //['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su']; + } + + let fourtyTwoDays = getFourtyTwoDays(this.state.month, this.state.year, sundayFirst); + return ( +
+ + + +
+ ); + } } export default Calendar; diff --git a/src/lib/calendar/CalendarRow.jsx b/src/lib/calendar/CalendarRow.jsx index 36f3c2d..67bd433 100644 --- a/src/lib/calendar/CalendarRow.jsx +++ b/src/lib/calendar/CalendarRow.jsx @@ -1,37 +1,38 @@ -import React from 'react'; -import '../style/DateTimeRange.css'; -import Cell from './Cell'; +import React from "react"; +import "../style/DateTimeRange.css"; +import Cell from "./Cell"; class CalendarRow extends React.Component { - generateCells() { - let cells = []; - let daysSize = this.props.rowDays.length; - for (let i = 0; i < daysSize; i++) { - cells.push( - - ); - } - return cells; - } + generateCells() { + let cells = []; + let daysSize = this.props.rowDays.length; + for (let i = 0; i < daysSize; i++) { + cells.push( + + ); + } + return cells; + } - render() { - let cells = this.generateCells(); - return
{cells}
; - } + render() { + let cells = this.generateCells(); + return
{cells}
; + } } export default CalendarRow; diff --git a/src/lib/calendar/CalendarRows.jsx b/src/lib/calendar/CalendarRows.jsx index cc7f061..53cd78b 100644 --- a/src/lib/calendar/CalendarRows.jsx +++ b/src/lib/calendar/CalendarRows.jsx @@ -1,39 +1,40 @@ -import React from 'react'; -import '../style/DateTimeRange.css'; -import CalendarRow from './CalendarRow'; +import React from "react"; +import "../style/DateTimeRange.css"; +import CalendarRow from "./CalendarRow"; class CalendarRows extends React.Component { - generateDays() { - let calendarRows = []; - for (let i = 0; i < 6; i++) { - let startIndex = i * 7; - let endIndex = (i + 1) * 7; - let rowDays = this.props.fourtyTwoDays.slice(startIndex, endIndex); - calendarRows.push( - - ); - } - return calendarRows; - } + generateDays() { + let calendarRows = []; + for (let i = 0; i < 6; i++) { + let startIndex = i * 7; + let endIndex = (i + 1) * 7; + let rowDays = this.props.fourtyTwoDays.slice(startIndex, endIndex); + calendarRows.push( + + ); + } + return calendarRows; + } - render() { - let calendarRows = this.generateDays(); - return
{calendarRows}
; - } + render() { + let calendarRows = this.generateDays(); + return
{calendarRows}
; + } } export default CalendarRows; diff --git a/src/lib/calendar/Cell.jsx b/src/lib/calendar/Cell.jsx index 679196b..cd1d124 100644 --- a/src/lib/calendar/Cell.jsx +++ b/src/lib/calendar/Cell.jsx @@ -1,234 +1,234 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; -import { isInbetweenDates } from '../utils/TimeFunctionUtils'; -import moment from 'moment'; -import { addFocusStyle, calendarStyles } from '../utils/StyleUtils'; -import { pastMaxDate } from '../utils/DateSelectedUtils'; +import React from "react"; +import ReactDOM from "react-dom"; +import { isInbetweenDates } from "../utils/TimeFunctionUtils"; +import moment from "moment"; +import { addFocusStyle, calendarStyles } from "../utils/StyleUtils"; +import { pastMaxDate } from "../utils/DateSelectedUtils"; -import '../style/DateTimeRange.css'; -import './Cell.css'; -import { copyMissingProperties } from '../utils/ObjectUtils'; +import "../style/DateTimeRange.css"; +import "./Cell.css"; +import { copyMissingProperties } from "../utils/ObjectUtils"; class Cell extends React.Component { - constructor(props) { - super(props); - this.state = { style: {}, cssclass: '' }; - - this.mouseEnter = this.mouseEnter.bind(this); - this.mouseLeave = this.mouseLeave.bind(this); - this.onClick = this.onClick.bind(this); - this.keyDown = this.keyDown.bind(this); - this.onFocus = this.onFocus.bind(this); - this.onBlur = this.onBlur.bind(this); - } - - getSelectedStyle() { - if (this.props.calendarStyles == null) { - return calendarStyles; - } - - return copyMissingProperties(this.props.calendarStyles, calendarStyles); - } - - componentDidUpdate(oldProps) { - if (!this.props.date.isSame(oldProps.date) || !this.props.otherDate.isSame(oldProps.otherDate)) { - this.styleCell(); - } - if (!this.props.cellDay.isSame(oldProps.cellDay)) { - this.styleCell(); - } - - // If a Cell is Selected - // If the focusDate is this cell - // and its not a gray cell - // Then Focus on this cell - let cellFocused = false; - let focusDateIsCellDate = typeof this.props.focusDate === 'object' && this.props.focusDate.isSame(this.props.cellDay, 'day'); - if (document.activeElement.id === 'cell') { - cellFocused = true; - } - if (cellFocused && focusDateIsCellDate && !this.shouldStyleCellGrey(this.props.cellDay)) { - this.cell.focus(); - this.props.focusOnCallback(false); - } - } - - pastMaxDatePropsChecker(isCellDateProp, days) { - if (isCellDateProp) { - if (pastMaxDate(moment(this.props.date).add(days, 'days'), this.props.maxDate, true)) { - return true; - } - } else { - if (pastMaxDate(moment(this.props.otherDate).add(days, 'days'), this.props.maxDate, true)) { - return true; - } - } - return false; - } - - keyDown(e) { - let componentFocused = document.activeElement === ReactDOM.findDOMNode(this.cell); - if (componentFocused && e.keyCode >= 37 && e.keyCode <= 40) { - e.preventDefault(); - let newDate = moment(this.props.cellDay); - // Check to see if this cell is the date prop - let isCellDateProp = this.props.cellDay.isSame(this.props.date, 'day'); - if (e.keyCode === 38) { - // Up Key - newDate.subtract(7, 'days'); - } else if (e.keyCode === 40) { - // Down Key - if (this.pastMaxDatePropsChecker(isCellDateProp, 7)) { - return; - } - newDate.add(7, 'days'); - } else if (e.keyCode === 37) { - // Left Key - newDate.subtract(1, 'days'); - } else if (e.keyCode === 39) { - // Right Key - if (this.pastMaxDatePropsChecker(isCellDateProp, 1)) { - return; - } - newDate.add(1, 'days'); - } - this.props.keyboardCellCallback(this.props.cellDay, newDate); - this.props.focusOnCallback(newDate); - } - } - - onClick() { - if (pastMaxDate(this.props.cellDay, this.props.maxDate, false)) { - return; - } - this.props.dateSelectedNoTimeCallback(this.props.cellDay); - } - - mouseEnter() { - // If Past Max Date Style Cell Out of Use - if (this.checkAndSetMaxDateStyle(this.props.cellDay)) { - return; - } - let classAdd = this.props.selectingModeFrom ? ' start' : ' end'; - - // Hover Style Cell, Different if inbetween start and end date - let isDateStart = this.props.date.isSameOrBefore(this.props.otherDate, 'minute'); - if (isInbetweenDates(isDateStart, this.props.cellDay, this.props.date, this.props.otherDate)) { - this.setState({ style: this.getSelectedStyle().hoverCellStyle(true), cssclass: 'hover-in' + classAdd }); - } else { - this.setState({ style: this.getSelectedStyle().hoverCellStyle(), cssclass: 'hover-out' + classAdd }); - } - } - - mouseLeave() { - this.styleCell(); - } - - onFocus() { - this.props.cellFocusedCallback(this.props.cellDay); - this.setState({ focus: true }); - } - - onBlur() { - this.setState({ focus: false }); - } - - shouldStyleCellGrey(cellDay) { - let month = this.props.month; - let cellDayMonth = cellDay.month(); - if (month !== cellDayMonth) { - return true; - } - } - - shouldStyleCellStartEnd(cellDay, date, otherDate, startCheck, endCheck) { - let isCellDateProp = cellDay.isSame(date, 'day'); - let isCellOtherDateProp = cellDay.isSame(otherDate, 'day'); - let isDateStart = date.isSameOrBefore(otherDate, 'minute'); - let isOtherDateStart = otherDate.isSameOrBefore(date, 'minute'); - - if (startCheck) { - return (isCellDateProp && isDateStart) || (isCellOtherDateProp && isOtherDateStart); - } else if (endCheck) { - return (isCellDateProp && !isDateStart) || (isCellOtherDateProp && !isOtherDateStart); - } - } - - checkAndSetMaxDateStyle(cellDate) { - if (pastMaxDate(cellDate, this.props.maxDate, false)) { - this.setState({ style: this.getSelectedStyle().invalidStyle(), cssclass: 'invalid' }); - return true; - } - return false; - } - - styleCell() { - let cellDay = this.props.cellDay; - let date = this.props.date; - let otherDate = this.props.otherDate; - - // If Past Max Date Style Cell Out of Use - if (this.checkAndSetMaxDateStyle(cellDay)) { - return; - } - - if (this.shouldStyleCellGrey(cellDay)) { - this.setState({ style: this.getSelectedStyle().greyCellStyle(), cssclass: 'grey' }); - return; - } - - let isDateStart = date.isSameOrBefore(otherDate, 'minute'); - let inbetweenDates = isInbetweenDates(isDateStart, cellDay, date, otherDate); - - if (this.shouldStyleCellStartEnd(cellDay, date, otherDate, true, false)) { - this.setState({ style: this.getSelectedStyle().startDateStyle(), cssclass: 'start' }); - } else if (this.shouldStyleCellStartEnd(cellDay, date, otherDate, false, true)) { - this.setState({ style: this.getSelectedStyle().endDateStyle(), cssclass: 'end' }); - } else if (inbetweenDates) { - this.setState({ style: this.getSelectedStyle().inBetweenStyle(), cssclass: 'between' }); - } else { - this.setState({ style: this.getSelectedStyle().normalCellStyle(), cssclass: '' }); - } - } - - isStartOrEndDate() { - let cellDay = this.props.cellDay; - let date = this.props.date; - let otherDate = this.props.otherDate; - if (this.shouldStyleCellStartEnd(cellDay, date, otherDate, true, false) || this.shouldStyleCellStartEnd(cellDay, date, otherDate, false, true)) { - return true; - } - return false; - } - - render() { - let dateFormatted = this.props.cellDay.format('D'); - let tabIndex = -1; - if (this.isStartOrEndDate() && !this.shouldStyleCellGrey(this.props.cellDay)) { - document.addEventListener('keydown', this.keyDown, false); - tabIndex = 0; - } else { - document.removeEventListener('keydown', this.keyDown, false); - } - let style = addFocusStyle(this.state.focus, this.state.style); - - return ( -
{ - this.cell = cell; - }} - className={`calendarCell ${this.state.cssclass}`} - tabIndex={tabIndex} - style={style} - onMouseEnter={this.mouseEnter} - onMouseLeave={this.mouseLeave} - onClick={this.onClick} - onFocus={this.onFocus} - onBlur={this.onBlur} - > - {dateFormatted} -
- ); - } + constructor(props) { + super(props); + this.state = { style: {}, cssclass: "" }; + + this.mouseEnter = this.mouseEnter.bind(this); + this.mouseLeave = this.mouseLeave.bind(this); + this.onClick = this.onClick.bind(this); + this.keyDown = this.keyDown.bind(this); + this.onFocus = this.onFocus.bind(this); + this.onBlur = this.onBlur.bind(this); + } + + getSelectedStyle() { + if (this.props.calendarStyles == null) { + return calendarStyles; + } + + return copyMissingProperties(this.props.calendarStyles, calendarStyles); + } + + componentDidUpdate(oldProps) { + if (!this.props.date.isSame(oldProps.date) || !this.props.otherDate.isSame(oldProps.otherDate)) { + this.styleCell(); + } + if (!this.props.cellDay.isSame(oldProps.cellDay)) { + this.styleCell(); + } + + // If a Cell is Selected + // If the focusDate is this cell + // and its not a gray cell + // Then Focus on this cell + let cellFocused = false; + let focusDateIsCellDate = typeof this.props.focusDate === "object" && this.props.focusDate.isSame(this.props.cellDay, "day"); + if (document.activeElement.id === "cell") { + cellFocused = true; + } + if (cellFocused && focusDateIsCellDate && this.isCellThisMonth(this.props.cellDay)) { + this.cell.focus(); + this.props.focusOnCallback(false); + } + } + + pastMaxDatePropsChecker(isCellDateProp, days) { + if (isCellDateProp) { + if (pastMaxDate(moment(this.props.date).add(days, "days"), this.props.maxDate, true)) { + return true; + } + } else { + if (pastMaxDate(moment(this.props.otherDate).add(days, "days"), this.props.maxDate, true)) { + return true; + } + } + return false; + } + + keyDown(e) { + let componentFocused = document.activeElement === ReactDOM.findDOMNode(this.cell); + if (componentFocused && e.keyCode >= 37 && e.keyCode <= 40) { + e.preventDefault(); + let newDate = moment(this.props.cellDay); + // Check to see if this cell is the date prop + let isCellDateProp = this.props.cellDay.isSame(this.props.date, "day"); + if (e.keyCode === 38) { + // Up Key + newDate.subtract(7, "days"); + } else if (e.keyCode === 40) { + // Down Key + if (this.pastMaxDatePropsChecker(isCellDateProp, 7)) { + return; + } + newDate.add(7, "days"); + } else if (e.keyCode === 37) { + // Left Key + newDate.subtract(1, "days"); + } else if (e.keyCode === 39) { + // Right Key + if (this.pastMaxDatePropsChecker(isCellDateProp, 1)) { + return; + } + newDate.add(1, "days"); + } + this.props.keyboardCellCallback(this.props.cellDay, newDate); + this.props.focusOnCallback(newDate); + } + } + + onClick() { + if (pastMaxDate(this.props.cellDay, this.props.maxDate, false)) { + return; + } + this.props.dateSelectedNoTimeCallback(this.props.cellDay); + } + + mouseEnter() { + // If Past Max Date Style Cell Out of Use + if (this.checkAndSetMaxDateStyle(this.props.cellDay)) { + return; + } + let classAdd = this.props.selectingModeFrom ? " start" : " end"; + + // Hover Style Cell, Different if inbetween start and end date + let isDateStart = this.props.date.isSameOrBefore(this.props.otherDate, "minute"); + if (isInbetweenDates(isDateStart, this.props.cellDay, this.props.date, this.props.otherDate)) { + this.setState({ style: this.getSelectedStyle().hoverCellStyle(true), cssclass: "hover-in" + classAdd }); + } else { + this.setState({ style: this.getSelectedStyle().hoverCellStyle(), cssclass: "hover-out" + classAdd }); + } + + if (this.props.cellDateHover && this.isCellThisMonth(this.props.cellDay)) { + this.props.cellDateHover(this.props.cellDay, this.props.selectingModeFrom); + } + } + + mouseLeave() { + this.styleCell(); + } + + onFocus() { + this.props.cellFocusedCallback(this.props.cellDay); + this.setState({ focus: true }); + } + + onBlur() { + this.setState({ focus: false }); + } + + isCellThisMonth(cellDay) { + return this.props.month === cellDay.month(); + } + + shouldStyleCellStartEnd(cellDay, date, otherDate, startCheck, endCheck) { + let isCellDateProp = cellDay.isSame(date, "day"); + let isCellOtherDateProp = cellDay.isSame(otherDate, "day"); + let isDateStart = date.isSameOrBefore(otherDate, "minute"); + let isOtherDateStart = otherDate.isSameOrBefore(date, "minute"); + + if (startCheck) { + return (isCellDateProp && isDateStart) || (isCellOtherDateProp && isOtherDateStart); + } else if (endCheck) { + return (isCellDateProp && !isDateStart) || (isCellOtherDateProp && !isOtherDateStart); + } + } + + checkAndSetMaxDateStyle(cellDate) { + if (pastMaxDate(cellDate, this.props.maxDate, false)) { + this.setState({ style: this.getSelectedStyle().invalidStyle(), cssclass: "invalid" }); + return true; + } + return false; + } + + styleCell() { + let cellDay = this.props.cellDay; + let date = this.props.date; + let otherDate = this.props.otherDate; + + // If Past Max Date Style Cell Out of Use + if (this.checkAndSetMaxDateStyle(cellDay)) { + return; + } + + if (!this.isCellThisMonth(cellDay)) { + this.setState({ style: this.getSelectedStyle().greyCellStyle(), cssclass: "grey" }); + return; + } + + let isDateStart = date.isSameOrBefore(otherDate, "minute"); + let inbetweenDates = isInbetweenDates(isDateStart, cellDay, date, otherDate); + + if (this.shouldStyleCellStartEnd(cellDay, date, otherDate, true, false)) { + this.setState({ style: this.getSelectedStyle().startDateStyle(), cssclass: "start" }); + } else if (this.shouldStyleCellStartEnd(cellDay, date, otherDate, false, true)) { + this.setState({ style: this.getSelectedStyle().endDateStyle(), cssclass: "end" }); + } else if (inbetweenDates) { + this.setState({ style: this.getSelectedStyle().inBetweenStyle(), cssclass: "between" }); + } else { + this.setState({ style: this.getSelectedStyle().normalCellStyle(), cssclass: "" }); + } + } + + isStartOrEndDate() { + let cellDay = this.props.cellDay; + let date = this.props.date; + let otherDate = this.props.otherDate; + if (this.shouldStyleCellStartEnd(cellDay, date, otherDate, true, false) || this.shouldStyleCellStartEnd(cellDay, date, otherDate, false, true)) { + return true; + } + return false; + } + + render() { + let dateFormatted = this.props.cellDay.format("D"); + let tabIndex = -1; + if (this.isStartOrEndDate() && this.isCellThisMonth(this.props.cellDay)) { + document.addEventListener("keydown", this.keyDown, false); + tabIndex = 0; + } else { + document.removeEventListener("keydown", this.keyDown, false); + } + let style = addFocusStyle(this.state.focus, this.state.style); + + return ( +
{ + this.cell = cell; + }} + className={`calendarCell ${this.state.cssclass}`} + tabIndex={tabIndex} + style={style} + onMouseEnter={this.mouseEnter} + onMouseLeave={this.mouseLeave} + onClick={this.onClick} + onFocus={this.onFocus} + onBlur={this.onBlur} + > + {dateFormatted} +
+ ); + } } export default Cell; diff --git a/src/lib/date_picker/ApplyCancelButtons.jsx b/src/lib/date_picker/ApplyCancelButtons.jsx index 4c56971..ff574ad 100644 --- a/src/lib/date_picker/ApplyCancelButtons.jsx +++ b/src/lib/date_picker/ApplyCancelButtons.jsx @@ -1,161 +1,161 @@ -import React from 'react'; -import '../style/DateTimeRange.css'; -import { addFocusStyle } from '../utils/StyleUtils'; +import React from "react"; +import "../style/DateTimeRange.css"; +import { addFocusStyle } from "../utils/StyleUtils"; class ApplyCancelButtons extends React.Component { - constructor(props) { - super(props); - - this.state = { - applyFocus: false, - cancelFocus: false - }; - this.bindToFunctions(); - } - - bindToFunctions() { - this.mouseEnterApply = this.mouseEnterApply.bind(this); - this.mouseLeaveApply = this.mouseLeaveApply.bind(this); - this.mouseEnterCancel = this.mouseEnterCancel.bind(this); - this.mouseLeaveCancel = this.mouseLeaveCancel.bind(this); - this.cancelPressed = this.cancelPressed.bind(this); - this.applyPressed = this.applyPressed.bind(this); - this.applyOnKeyPress = this.applyOnKeyPress.bind(this); - this.cancelOnKeyPress = this.cancelOnKeyPress.bind(this); - this.applyOnFocus = this.applyOnFocus.bind(this); - this.applyOnBlur = this.applyOnBlur.bind(this); - this.cancelOnBlur = this.cancelOnBlur.bind(this); - this.cancelOnFocus = this.cancelOnFocus.bind(this); - } - - mouseEnterApply(e) {} - - mouseLeaveApply(e) {} - - mouseEnterCancel(e) {} - - mouseLeaveCancel(e) {} - - cancelPressed(e) { - this.props.changeVisibleState(); - } - - applyPressed(e) { - this.props.applyCallback(); - } - - applyOnFocus() { - this.setState({ applyFocus: true }); - } - - applyOnBlur() { - this.setState({ applyFocus: false }); - } - - cancelOnFocus() { - this.setState({ cancelFocus: true }); - } - - cancelOnBlur() { - this.setState({ cancelFocus: false }); - } - - isSpaceBarOrEnterPressed(e) { - if (e.keyCode === 32 || e.keyCode === 13) { - return true; - } - return false; - } - - applyOnKeyPress(e) { - if (this.isSpaceBarOrEnterPressed(e)) { - this.props.applyCallback(); - } - } - - cancelOnKeyPress(e) { - if (this.isSpaceBarOrEnterPressed(e)) { - this.props.changeVisibleState(); - } - } - - renderButton(className, onMouseEnter, onMouseLeave, onClick, style, onKeyDown, onFocus, onBlur, text) { - let styleLocal; - if (text === this.props.ApplyString) { - styleLocal = addFocusStyle(this.state.applyFocus, style); - } else { - styleLocal = addFocusStyle(this.state.cancelFocus, style); - } - return ( -
- {text} -
- ); - } - - getMaxDateBox() { - let items = []; - if (this.props.maxDate) { - items.push( -
- {this.props.translations.MaxDate}: {this.props.maxDate.format(this.props.local.format)} -
- ); - } - if (this.props.maxDays && this.props.maxDays > 0 && this.props.maxDays !== 366) { - items.push( -
- {this.props.translations.MaxDays}: {this.props.maxDays} -
- ); - } - - return items; - } - - render() { - let { className } = this.props; - if (className == null) className = ''; - - let maxDateBox = this.getMaxDateBox(); - return ( -
- {maxDateBox} - {this.renderButton( - 'footer-button apply ' + className, - this.mouseEnterApply, - this.mouseLeaveApply, - this.applyPressed, - {}, - this.applyOnKeyPress, - this.applyOnFocus, - this.applyOnBlur, - this.props.translations.Apply - )} - - {this.renderButton( - 'footer-button cancel ' + className, - this.mouseEnterCancel, - this.mouseLeaveCancel, - this.cancelPressed, - {}, - this.cancelOnKeyPress, - this.cancelOnFocus, - this.cancelOnBlur, - this.props.translations.Cancel - )} -
- ); - } + constructor(props) { + super(props); + + this.state = { + applyFocus: false, + cancelFocus: false + }; + this.bindToFunctions(); + } + + bindToFunctions() { + this.mouseEnterApply = this.mouseEnterApply.bind(this); + this.mouseLeaveApply = this.mouseLeaveApply.bind(this); + this.mouseEnterCancel = this.mouseEnterCancel.bind(this); + this.mouseLeaveCancel = this.mouseLeaveCancel.bind(this); + this.cancelPressed = this.cancelPressed.bind(this); + this.applyPressed = this.applyPressed.bind(this); + this.applyOnKeyPress = this.applyOnKeyPress.bind(this); + this.cancelOnKeyPress = this.cancelOnKeyPress.bind(this); + this.applyOnFocus = this.applyOnFocus.bind(this); + this.applyOnBlur = this.applyOnBlur.bind(this); + this.cancelOnBlur = this.cancelOnBlur.bind(this); + this.cancelOnFocus = this.cancelOnFocus.bind(this); + } + + mouseEnterApply(e) {} + + mouseLeaveApply(e) {} + + mouseEnterCancel(e) {} + + mouseLeaveCancel(e) {} + + cancelPressed(e) { + this.props.changeVisibleState(); + } + + applyPressed(e) { + this.props.applyCallback(); + } + + applyOnFocus() { + this.setState({ applyFocus: true }); + } + + applyOnBlur() { + this.setState({ applyFocus: false }); + } + + cancelOnFocus() { + this.setState({ cancelFocus: true }); + } + + cancelOnBlur() { + this.setState({ cancelFocus: false }); + } + + isSpaceBarOrEnterPressed(e) { + if (e.keyCode === 32 || e.keyCode === 13) { + return true; + } + return false; + } + + applyOnKeyPress(e) { + if (this.isSpaceBarOrEnterPressed(e)) { + this.props.applyCallback(); + } + } + + cancelOnKeyPress(e) { + if (this.isSpaceBarOrEnterPressed(e)) { + this.props.changeVisibleState(); + } + } + + renderButton(className, onMouseEnter, onMouseLeave, onClick, style, onKeyDown, onFocus, onBlur, text) { + let styleLocal; + if (text === this.props.ApplyString) { + styleLocal = addFocusStyle(this.state.applyFocus, style); + } else { + styleLocal = addFocusStyle(this.state.cancelFocus, style); + } + return ( +
+ {text} +
+ ); + } + + getMaxDateBox() { + let items = []; + if (this.props.maxDate) { + items.push( +
+ {this.props.translations.MaxDate}: {this.props.maxDate.format(this.props.local.format)} +
+ ); + } + if (this.props.maxDays && this.props.maxDays > 0 && this.props.maxDays !== 366) { + items.push( +
+ {this.props.translations.MaxDays}: {this.props.maxDays} +
+ ); + } + + return items; + } + + render() { + let { className } = this.props; + if (className == null) className = ""; + + let maxDateBox = this.getMaxDateBox(); + return ( +
+ {maxDateBox} + {this.renderButton( + "footer-button apply " + className, + this.mouseEnterApply, + this.mouseLeaveApply, + this.applyPressed, + {}, + this.applyOnKeyPress, + this.applyOnFocus, + this.applyOnBlur, + this.props.translations.Apply + )} + + {this.renderButton( + "footer-button cancel " + className, + this.mouseEnterCancel, + this.mouseLeaveCancel, + this.cancelPressed, + {}, + this.cancelOnKeyPress, + this.cancelOnFocus, + this.cancelOnBlur, + this.props.translations.Cancel + )} +
+ ); + } } export default ApplyCancelButtons; diff --git a/src/lib/date_picker/DatePicker.jsx b/src/lib/date_picker/DatePicker.jsx index 93dfb4b..da7a3f0 100644 --- a/src/lib/date_picker/DatePicker.jsx +++ b/src/lib/date_picker/DatePicker.jsx @@ -1,84 +1,85 @@ -import React from 'react'; -import '../style/DateTimeRange.css'; -import Label from './Label'; -import DateField from './DateField'; -import TimeField from './TimeField'; -import Calendar from '../calendar/Calendar'; -import ApplyCancelButtons from './ApplyCancelButtons'; -import ActiveNotifier from './ActiveNotifier'; -import moment from 'moment'; +import React from "react"; +import "../style/DateTimeRange.css"; +import Label from "./Label"; +import DateField from "./DateField"; +import TimeField from "./TimeField"; +import Calendar from "../calendar/Calendar"; +import ApplyCancelButtons from "./ApplyCancelButtons"; +import ActiveNotifier from "./ActiveNotifier"; +import moment from "moment"; class DatePicker extends React.Component { - dateSelectedNoTimeCallback(data) { - this.props.dateSelectedNoTimeCallback(data); - } + dateSelectedNoTimeCallback(data) { + this.props.dateSelectedNoTimeCallback(data); + } - focusDate(data) { - this.props.focusDate(data); - } + focusDate(data) { + this.props.focusDate(data); + } - cellFocusedCallback(data) { - this.props.cellFocusedCallback(data); - } + cellFocusedCallback(data) { + this.props.cellFocusedCallback(data); + } - render() { - //If button property present display buttons - let buttons; - if (this.props.enableButtons) { - buttons = ( - - ); - } - return ( -
-
-
+ render() { + //If button property present display buttons + let buttons; + if (this.props.enableButtons) { + buttons = ( + + ); + } + return ( +
+
+
- + - {this.props.showCurrentState ? : ''} - {buttons} -
- ); - } + {this.props.showCurrentState ? : ""} + {buttons} +
+ ); + } } export default DatePicker; diff --git a/src/lib/utils/TimeFunctionUtils.js b/src/lib/utils/TimeFunctionUtils.js index 28f2150..bac7416 100644 --- a/src/lib/utils/TimeFunctionUtils.js +++ b/src/lib/utils/TimeFunctionUtils.js @@ -1,151 +1,172 @@ -import { ModeEnum } from '../DateTimeRangePicker'; -import moment from 'moment'; +import { ModeEnum } from "../DateTimeRangePicker"; +import moment from "moment"; export const generateHours = () => { - let hours = []; - for (let i = 0; i < 24; i++) { - hours.push(i); - } - return hours; + let hours = []; + for (let i = 0; i < 24; i++) { + hours.push(i); + } + return hours; }; export const generateMinutes = () => { - let minutes = []; - for (let i = 0; i < 60; i++) { - if (i < 10) { - minutes.push('0' + i.toString()); - } else { - minutes.push(i.toString()); - } - } - return minutes; + let minutes = []; + for (let i = 0; i < 60; i++) { + if (i < 10) { + minutes.push("0" + i.toString()); + } else { + minutes.push(i.toString()); + } + } + return minutes; }; function workOutMonthYear(date, secondDate, mode) { - // If both months are different months then - // allow normal display in the calendar - let selectedMonth = date.month(); - let otherMonth = secondDate.month(); - if (selectedMonth !== otherMonth) { - return date; - } - // If both months are the same and the same year - // have "end"/right as the month and "start"/left as -1 month - else if (date.year() === secondDate.year() && mode === ModeEnum.start) { - let lastMonth = JSON.parse(JSON.stringify(date)); - lastMonth = moment(lastMonth); - lastMonth.subtract(1, 'month'); - return lastMonth; - } else { - return date; - } + // If both months are different months then + // allow normal display in the calendar + let selectedMonth = date.month(); + let otherMonth = secondDate.month(); + if (selectedMonth !== otherMonth) { + return date; + } + // If both months are the same and the same year + // have "start"/left as the month and "end"/right as +1 month + else if (date.year() === secondDate.year() && mode === ModeEnum.end) { + let lastMonth = JSON.parse(JSON.stringify(secondDate)); + lastMonth = moment(lastMonth); + lastMonth.add(1, "month"); + return lastMonth; + } else { + return date; + } } +/* +function workOutMonthYear(date, secondDate, mode) { + // If both months are different months then + // allow normal display in the calendar + let selectedMonth = date.month(); + let otherMonth = secondDate.month(); + if (selectedMonth !== otherMonth) { + return date; + } + // If both months are the same and the same year + // have "end"/right as the month and "start"/left as -1 month + else if (date.year() === secondDate.year() && mode === ModeEnum.start) { + let lastMonth = JSON.parse(JSON.stringify(date)); + lastMonth = moment(lastMonth); + lastMonth.subtract(1, "month"); + return lastMonth; + } else { + return date; + } +} */ + export const getMonth = (date, secondDate, mode) => { - return workOutMonthYear(date, secondDate, mode).month(); + return workOutMonthYear(date, secondDate, mode).month(); }; export const getYear = (date, secondDate, mode) => { - return workOutMonthYear(date, secondDate, mode).year(); + return workOutMonthYear(date, secondDate, mode).year(); }; const getDaysBeforeStartMonday = firstDayOfMonth => { - let fourtyTwoDays = []; - let dayBeforeFirstDayOfMonth = firstDayOfMonth.day() - 1; // We dont want to include the first day of the new month - // Case whereby day before is a Saturday (6) and we require Saturday back to Monday for that week - if (dayBeforeFirstDayOfMonth === -1) { - for (let i = 6; i > 0; i--) { - let firstDayOfMonthCopy = firstDayOfMonth.clone(); - firstDayOfMonthCopy = firstDayOfMonthCopy.subtract(i, 'd'); - fourtyTwoDays.push(firstDayOfMonthCopy); - } - } - // Case Whereby day before first day is the Sunday (0), therefore we want the entire previous week - if (dayBeforeFirstDayOfMonth === 0) { - for (let i = 7; i > 0; i--) { - let firstDayOfMonthCopy = firstDayOfMonth.clone(); - firstDayOfMonthCopy = firstDayOfMonthCopy.subtract(i, 'd'); - fourtyTwoDays.push(firstDayOfMonthCopy); - } - } - // Every other day - else { - for (let i = dayBeforeFirstDayOfMonth; i > 0; i--) { - let firstDayOfMonthCopy = firstDayOfMonth.clone(); - firstDayOfMonthCopy = firstDayOfMonthCopy.subtract(i, 'd'); - fourtyTwoDays.push(firstDayOfMonthCopy); - } - } - return fourtyTwoDays; + let fourtyTwoDays = []; + let dayBeforeFirstDayOfMonth = firstDayOfMonth.day() - 1; // We dont want to include the first day of the new month + // Case whereby day before is a Saturday (6) and we require Saturday back to Monday for that week + if (dayBeforeFirstDayOfMonth === -1) { + for (let i = 6; i > 0; i--) { + let firstDayOfMonthCopy = firstDayOfMonth.clone(); + firstDayOfMonthCopy = firstDayOfMonthCopy.subtract(i, "d"); + fourtyTwoDays.push(firstDayOfMonthCopy); + } + } + // Case Whereby day before first day is the Sunday (0), therefore we want the entire previous week + if (dayBeforeFirstDayOfMonth === 0) { + for (let i = 7; i > 0; i--) { + let firstDayOfMonthCopy = firstDayOfMonth.clone(); + firstDayOfMonthCopy = firstDayOfMonthCopy.subtract(i, "d"); + fourtyTwoDays.push(firstDayOfMonthCopy); + } + } + // Every other day + else { + for (let i = dayBeforeFirstDayOfMonth; i > 0; i--) { + let firstDayOfMonthCopy = firstDayOfMonth.clone(); + firstDayOfMonthCopy = firstDayOfMonthCopy.subtract(i, "d"); + fourtyTwoDays.push(firstDayOfMonthCopy); + } + } + return fourtyTwoDays; }; const getDaysBeforeStartSunday = firstDayOfMonth => { - let fourtyTwoDays = []; - let dayBeforeFirstDayOfMonth = firstDayOfMonth.day() - 1; // We dont want to include the first day of the new month + let fourtyTwoDays = []; + let dayBeforeFirstDayOfMonth = firstDayOfMonth.day() - 1; // We dont want to include the first day of the new month - // Case whereby we need all previous week days - if (dayBeforeFirstDayOfMonth === -1) { - for (let i = 7; i > 0; i--) { - let firstDayOfMonthCopy = firstDayOfMonth.clone(); - firstDayOfMonthCopy = firstDayOfMonthCopy.subtract(i, 'd'); - fourtyTwoDays.push(firstDayOfMonthCopy); - } - } - // Every other day - else { - for (let i = dayBeforeFirstDayOfMonth + 1; i > 0; i--) { - let firstDayOfMonthCopy = firstDayOfMonth.clone(); - firstDayOfMonthCopy = firstDayOfMonthCopy.subtract(i, 'd'); - fourtyTwoDays.push(firstDayOfMonthCopy); - } - } - return fourtyTwoDays; + // Case whereby we need all previous week days + if (dayBeforeFirstDayOfMonth === -1) { + for (let i = 7; i > 0; i--) { + let firstDayOfMonthCopy = firstDayOfMonth.clone(); + firstDayOfMonthCopy = firstDayOfMonthCopy.subtract(i, "d"); + fourtyTwoDays.push(firstDayOfMonthCopy); + } + } + // Every other day + else { + for (let i = dayBeforeFirstDayOfMonth + 1; i > 0; i--) { + let firstDayOfMonthCopy = firstDayOfMonth.clone(); + firstDayOfMonthCopy = firstDayOfMonthCopy.subtract(i, "d"); + fourtyTwoDays.push(firstDayOfMonthCopy); + } + } + return fourtyTwoDays; }; const getDaysBeforeStart = (firstDayOfMonth, sundayFirst) => { - if (!sundayFirst) { - return getDaysBeforeStartMonday(firstDayOfMonth); - } else { - return getDaysBeforeStartSunday(firstDayOfMonth); - } + if (!sundayFirst) { + return getDaysBeforeStartMonday(firstDayOfMonth); + } else { + return getDaysBeforeStartSunday(firstDayOfMonth); + } }; export const getFourtyTwoDays = (initMonth, initYear, sundayFirst) => { - let fourtyTwoDays = []; - let firstDayOfMonth = moment(new Date(initYear, initMonth, 1)); + let fourtyTwoDays = []; + let firstDayOfMonth = moment(new Date(initYear, initMonth, 1)); - fourtyTwoDays = getDaysBeforeStart(firstDayOfMonth, sundayFirst); - // Add in all days this month - for (let i = 0; i < firstDayOfMonth.daysInMonth(); i++) { - fourtyTwoDays.push(firstDayOfMonth.clone().add(i, 'd')); - } - // Add in all days at the end of the month until last day of week seen - let lastDayOfMonth = moment(new Date(initYear, initMonth, firstDayOfMonth.daysInMonth())); - let toAdd = 1; - let gotAllDays = false; - while (!gotAllDays) { - if (fourtyTwoDays.length >= 42) { - gotAllDays = true; - break; - } - fourtyTwoDays.push(lastDayOfMonth.clone().add(toAdd, 'd')); - toAdd++; - } - return fourtyTwoDays; + fourtyTwoDays = getDaysBeforeStart(firstDayOfMonth, sundayFirst); + // Add in all days this month + for (let i = 0; i < firstDayOfMonth.daysInMonth(); i++) { + fourtyTwoDays.push(firstDayOfMonth.clone().add(i, "d")); + } + // Add in all days at the end of the month until last day of week seen + let lastDayOfMonth = moment(new Date(initYear, initMonth, firstDayOfMonth.daysInMonth())); + let toAdd = 1; + let gotAllDays = false; + while (!gotAllDays) { + if (fourtyTwoDays.length >= 42) { + gotAllDays = true; + break; + } + fourtyTwoDays.push(lastDayOfMonth.clone().add(toAdd, "d")); + toAdd++; + } + return fourtyTwoDays; }; export const isInbetweenDates = (isStartDate, dayToFindOut, start, end) => { - let isInBetweenDates; - if (isStartDate) { - isInBetweenDates = dayToFindOut.isAfter(start) && dayToFindOut.isBefore(end); - } else { - isInBetweenDates = dayToFindOut.isBefore(start) && dayToFindOut.isAfter(end); - } - return isInBetweenDates; + let isInBetweenDates; + if (isStartDate) { + isInBetweenDates = dayToFindOut.isAfter(start) && dayToFindOut.isBefore(end); + } else { + isInBetweenDates = dayToFindOut.isBefore(start) && dayToFindOut.isAfter(end); + } + return isInBetweenDates; }; export const isValidTimeChange = (mode, date, start, end) => { - let modeStartAndDateSameOrBeforeStart = mode === 'start' && date.isSameOrBefore(end); - let modeEndAndDateSameOrAfterEnd = mode === 'end' && date.isSameOrAfter(start); - return modeStartAndDateSameOrBeforeStart || modeEndAndDateSameOrAfterEnd; + let modeStartAndDateSameOrBeforeStart = mode === "start" && date.isSameOrBefore(end); + let modeEndAndDateSameOrAfterEnd = mode === "end" && date.isSameOrAfter(start); + return modeStartAndDateSameOrBeforeStart || modeEndAndDateSameOrAfterEnd; }; From 77fe758203655c4ec2e4b1e483accc4a3ba69c0b Mon Sep 17 00:00:00 2001 From: andreaci Date: Thu, 7 Mar 2019 11:28:52 +0100 Subject: [PATCH 16/31] inverted date managed in virtualSelection --- .vscode/launch.json | 15 + src/Wrapper.jsx | 553 +++++++++-------- src/lib/DateTimeRangePicker.jsx | 1035 ++++++++++++++++--------------- 3 files changed, 817 insertions(+), 786 deletions(-) create mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..96c43a5 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "chrome", + "request": "launch", + "name": "Chrome", + "url": "http://localhost:3000", + "webRoot": "${workspaceFolder}" + } + ] +} diff --git a/src/Wrapper.jsx b/src/Wrapper.jsx index c423b96..0fc4a33 100644 --- a/src/Wrapper.jsx +++ b/src/Wrapper.jsx @@ -1,308 +1,307 @@ -import React from "react"; -import DateTimeRangeContainer, { DateTimeRangeComponent } from "./lib/index"; +import React from 'react'; +import DateTimeRangeContainer, { DateTimeRangeComponent } from './lib/index'; -import moment from "moment"; +import moment from 'moment'; class Wrapper extends React.Component { - constructor(props) { - super(props); - let now = new Date(); - let start = moment(new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0, 0)); - let end = moment(start) - .add(1, "days") - .subtract(1, "seconds"); - start = moment(start) - .subtract(34, "months") - .subtract(1, "seconds"); - end = moment(start) - .add(5, "days") - .add(); - this.state = { - start: start, - end: end - }; + constructor(props) { + super(props); + let now = new Date(); + let start = moment(new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0, 0)); + let end = moment(start) + .add(1, 'days') + .subtract(1, 'seconds'); + start = moment(start) + .subtract(34, 'months') + .subtract(1, 'seconds'); + end = moment(start) + .add(5, 'days') + .add(); + this.state = { + start: start, + end: end + }; - this.onClick = this.onClick.bind(this); - this.applyCallback = this.applyCallback.bind(this); - } + this.onClick = this.onClick.bind(this); + this.applyCallback = this.applyCallback.bind(this); + } - applyCallback(startDate, endDate) { - //console.log('Apply Callback'); - //console.log(startDate.format('DD-MM-YYYY HH:mm')); - //console.log(endDate.format('DD-MM-YYYY HH:mm')); - this.setState({ - start: startDate, - end: endDate - }); - } - onChangeReady(data) { - //console.log(data); - } - onClick() { - let newStart = moment(this.state.start).subtract(3, "days"); - // console.log("On Click Callback"); - // console.log(newStart.format("DD-MM-YYYY HH:mm")); - this.setState({ start: newStart }); - } + applyCallback(startDate, endDate) { + //console.log('Apply Callback'); + //console.log(startDate.format('DD-MM-YYYY HH:mm')); + //console.log(endDate.format('DD-MM-YYYY HH:mm')); + this.setState({ + start: startDate, + end: endDate + }); + } + onChangeReady(data) { + //console.log(data); + } + onClick() { + let newStart = moment(this.state.start).subtract(3, 'days'); + // console.log("On Click Callback"); + // console.log(newStart.format("DD-MM-YYYY HH:mm")); + this.setState({ start: newStart }); + } - renderContainerNoGrid(ranges, local, maxDate) { - return ( -
-

renderContainerNoGrid

- - - -
Click Me to test change state here and updating picker
-
- ); - } + renderContainerNoGrid(ranges, local, maxDate) { + return ( +
+

renderContainerNoGrid

+ + + +
Click Me to test change state here and updating picker
+
+ ); + } - renderGrid(ranges, local, maxDate) { - return ( -
-

renderGrid

+ renderGrid(ranges, local, maxDate) { + return ( +
+

renderGrid

- - - -
- ); - } - renderMaxDays(ranges, local, maxDate) { - return ( -
-

renderMaxDays

- - - -
- ); - } - renderDisableTime(ranges, local, maxDate) { - return ( -
-

renderDisableTime

+ + + +
+ ); + } + renderMaxDays(ranges, local, maxDate) { + return ( +
+

renderMaxDays

+ + + +
+ ); + } + renderDisableTime(ranges, local, maxDate) { + return ( +
+

renderDisableTime

- - - -
- ); - } - renderDisableDateBox(ranges, local, maxDate) { - return ( -
-

renderDisableDateBox

- - - -
- ); - } + + + +
+ ); + } + renderDisableDateBox(ranges, local, maxDate) { + return ( +
+

renderDisableDateBox

+ + + +
+ ); + } - renderDisabled(ranges, local, maxDate) { - return ( -
-

renderDisabled

- - - -
- ); - } - renderTranslated(ranges, local, maxDate) { - return ( -
-

renderTranslated

- - - -
- ); - } + renderDisabled(ranges, local, maxDate) { + return ( +
+

renderDisabled

+ + + +
+ ); + } + renderTranslated(ranges, local, maxDate) { + return ( +
+

renderTranslated

+ + + +
+ ); + } - renderMax1Day(ranges, local, maxDate) { - return ( -
-

renderMax1Day

- - - -
- ); - } - renderReadyToUseWT(ranges, local, maxDate) { - return ( -
-

renderReadyToUseWithTime

- -
- ); - } - renderReadyToUseDisabled(ranges, local, maxDate) { - return ( -
-

renderReadyToUseDisabled

- -
- ); - } - renderReadyToUse(ranges, local, maxDate) { - return ( -
-

renderReadyToUse

- -
- ); - } - renderCustomStyles(ranges, local, maxDate) { - return ( -
-

renderCustomStyles

- -
- ); - } + renderMax1Day(ranges, local, maxDate) { + return ( +
+

renderMax1Day

+ + + +
+ ); + } + renderReadyToUseWT(ranges, local, maxDate) { + return ( +
+

renderReadyToUseWithTime

+ +
+ ); + } + renderReadyToUseDisabled(ranges, local, maxDate) { + return ( +
+

renderReadyToUseDisabled

+ +
+ ); + } + renderReadyToUse(ranges, local, maxDate) { + return ( +
+

renderReadyToUse

+ +
+ ); + } + renderCustomStyles(ranges, local, maxDate) { + return ( +
+

renderCustomStyles

+ +
+ ); + } - renderRangeCallback(ranges, local, maxDate) { - return ( -
-

renderRangeCallback

- -
- ); - } + renderRangeCallback(ranges, local, maxDate) { + return ( +
+

renderRangeCallback

+ +
+ ); + } - renderConfusingRanges(ranges, local, maxDate) { - return ( -
-

renderConfusingRanges

- - - -
- ); - } - renderuseVirtualSelection(ranges, local, maxDate) { - return ( -
-

renderuseVirtualSelection

- - - -
- ); - } + renderConfusingRanges(ranges, local, maxDate) { + return ( +
+

renderConfusingRanges

+ + + +
+ ); + } + renderuseVirtualSelection(ranges, local, maxDate) { + return ( +
+

renderuseVirtualSelection

+ + + +
+ ); + } - onRange(value, data, cbdata) { - //console.log('range selected callback: ' + value + ' > ' + data); - //console.log(cbdata); - } + onRange(value, data, cbdata) { + console.log('range selected callback: ' + value + ' > ' + cbdata); + } - render() { - let now = new Date(); - let start = moment(new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0, 0)); - let end = moment(start) - .add(1, "days") - .subtract(1, "seconds"); - let ranges = { - "Today Only": [moment(start), moment(end)], - "Yesterday Only": [moment(start).subtract(1, "days"), moment(end).subtract(1, "days")], - "3 Days": [moment(start).subtract(3, "days"), moment(end)], - "5 Days": [moment(start).subtract(5, "days"), moment(end)], - "1 Week": [moment(start).subtract(7, "days"), moment(end)], - "2 Weeks": [moment(start).subtract(14, "days"), moment(end)], - "1 Month": [moment(start).subtract(1, "months"), moment(end)], - "90 Days": [moment(start).subtract(90, "days"), moment(end)], - "1 Year": [moment(start).subtract(1, "years"), moment(end)] - }; + render() { + let now = new Date(); + let start = moment(new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0, 0)); + let end = moment(start) + .add(1, 'days') + .subtract(1, 'seconds'); + let ranges = { + 'Today Only': [moment(start), moment(end)], + 'Yesterday Only': [moment(start).subtract(1, 'days'), moment(end).subtract(1, 'days')], + '3 Days': [moment(start).subtract(3, 'days'), moment(end)], + '5 Days': [moment(start).subtract(5, 'days'), moment(end)], + '1 Week': [moment(start).subtract(7, 'days'), moment(end)], + '2 Weeks': [moment(start).subtract(14, 'days'), moment(end)], + '1 Month': [moment(start).subtract(1, 'months'), moment(end)], + '90 Days': [moment(start).subtract(90, 'days'), moment(end)], + '1 Year': [moment(start).subtract(1, 'years'), moment(end)] + }; - const ranges2 = [ - { title: "prima colonna", ranges: ranges }, - { title: "seconda colonna", ranges: ranges }, - { title: "tersa colonna", ranges: ranges }, - { title: "quarsa colonna", ranges: ranges } - ]; + const ranges2 = [ + { title: 'prima colonna', ranges: ranges }, + { title: 'seconda colonna', ranges: ranges }, + { title: 'tersa colonna', ranges: ranges }, + { title: 'quarsa colonna', ranges: ranges } + ]; - let local = { - format: "DD-MM-YYYY HH:mm", - sundayFirst: false - }; - let maxDate = moment(start).add(24, "hour"); - return ( -
- {this.renderuseVirtualSelection(ranges, local, maxDate)} - {this.renderMax1Day(ranges, local, maxDate)} - {this.renderGrid(ranges, local, maxDate)} - {this.renderContainerNoGrid(ranges, local, maxDate)} - {this.renderDisableTime(ranges, local, maxDate)} - {this.renderDisableDateBox(ranges, local, maxDate)} - {this.renderMaxDays(ranges, local, maxDate)} - {this.renderDisabled(ranges, local, maxDate)} - {this.renderTranslated(ranges, local, maxDate)} - {this.renderReadyToUse(ranges, local, maxDate)} - {this.renderReadyToUseWT(ranges, local, maxDate)} - {this.renderCustomStyles(ranges, local, maxDate)} - {this.renderReadyToUseDisabled(ranges, local, maxDate)} - {this.renderRangeCallback(ranges, local, maxDate)} - {this.renderConfusingRanges(ranges2, local, maxDate)} -
- ); - } + let local = { + format: 'DD-MM-YYYY HH:mm', + sundayFirst: false + }; + let maxDate = moment(start).add(24, 'hour'); + return ( +
+ {this.renderuseVirtualSelection(ranges, local, maxDate)} + {this.renderMax1Day(ranges, local, maxDate)} + {this.renderGrid(ranges, local, maxDate)} + {this.renderContainerNoGrid(ranges, local, maxDate)} + {this.renderDisableTime(ranges, local, maxDate)} + {this.renderDisableDateBox(ranges, local, maxDate)} + {this.renderMaxDays(ranges, local, maxDate)} + {this.renderDisabled(ranges, local, maxDate)} + {this.renderTranslated(ranges, local, maxDate)} + {this.renderReadyToUse(ranges, local, maxDate)} + {this.renderReadyToUseWT(ranges, local, maxDate)} + {this.renderCustomStyles(ranges, local, maxDate)} + {this.renderReadyToUseDisabled(ranges, local, maxDate)} + {this.renderRangeCallback(ranges, local, maxDate)} + {this.renderConfusingRanges(ranges2, local, maxDate)} +
+ ); + } } export { Wrapper }; -const h1style = { borderTop: "1px solid gray", fontSize: 14, fontWeight: 600 }; +const h1style = { borderTop: '1px solid gray', fontSize: 14, fontWeight: 600 }; const divstyle = { padding: 30 }; const translations = { - Apply: "appleeeeca", - Cancel: "annuuuuu", - customRange: "customme", - FromDate: "daaaa", - ToDate: "aaaaa", - months: ["1January", "2February", "3March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], - days: ["Lu", "Ma", "Me", "Th", "Fr", "Sa", "Su"] + Apply: 'appleeeeca', + Cancel: 'annuuuuu', + customRange: 'customme', + FromDate: 'daaaa', + ToDate: 'aaaaa', + months: ['1January', '2February', '3March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], + days: ['Lu', 'Ma', 'Me', 'Th', 'Fr', 'Sa', 'Su'] }; const customStyles = { - inBetweenStyle: () => { - return { - borderRadius: "0", - borderColour: "transparent", - color: "red", - backgroundColor: "#ffaaaa", - cursor: "pointer" - }; - }, + inBetweenStyle: () => { + return { + borderRadius: '0', + borderColour: 'transparent', + color: 'red', + backgroundColor: '#ffaaaa', + cursor: 'pointer' + }; + }, - startDateStyle: () => { - return { - borderRadius: "10px 0 0 10px", - borderColour: "transparent", - color: "#fff", - backgroundColor: "red", - cursor: "pointer" - }; - }, + startDateStyle: () => { + return { + borderRadius: '10px 0 0 10px', + borderColour: 'transparent', + color: '#fff', + backgroundColor: 'red', + cursor: 'pointer' + }; + }, - endDateStyle: () => { - return { - borderRadius: "0 10px 10px 0", - borderColour: "transparent", - color: "#fff", - backgroundColor: "red", - cursor: "pointer" - }; - }, + endDateStyle: () => { + return { + borderRadius: '0 10px 10px 0', + borderColour: 'transparent', + color: '#fff', + backgroundColor: 'red', + cursor: 'pointer' + }; + }, - normalRangeStyle: () => { - return { color: "red" }; - }, - selectedRangeStyle: () => { - return { - backgroundColor: "red" - }; - } + normalRangeStyle: () => { + return { color: 'red' }; + }, + selectedRangeStyle: () => { + return { + backgroundColor: 'red' + }; + } }; diff --git a/src/lib/DateTimeRangePicker.jsx b/src/lib/DateTimeRangePicker.jsx index 5395fab..4a2bfd7 100644 --- a/src/lib/DateTimeRangePicker.jsx +++ b/src/lib/DateTimeRangePicker.jsx @@ -1,518 +1,535 @@ -import React from "react"; -import "./style/DateTimeRange.css"; -import Ranges from "./ranges/Ranges"; -import DatePicker from "./date_picker/DatePicker"; -import Fragment from "react-dot-fragment"; -import moment from "moment"; -import { isValidTimeChange } from "./utils/TimeFunctionUtils"; -import { datePicked, pastMaxDate } from "./utils/DateSelectedUtils"; - -export const ModeEnum = Object.freeze({ start: "start", end: "end" }); -export var momentFormat = "DD-MM-YYYY HH:mm"; +import React from 'react'; +import './style/DateTimeRange.css'; +import Ranges from './ranges/Ranges'; +import DatePicker from './date_picker/DatePicker'; +import Fragment from 'react-dot-fragment'; +import moment from 'moment'; +import { isValidTimeChange } from './utils/TimeFunctionUtils'; +import { datePicked, pastMaxDate } from './utils/DateSelectedUtils'; + +export const ModeEnum = Object.freeze({ start: 'start', end: 'end' }); +export var momentFormat = 'DD-MM-YYYY HH:mm'; class DateTimeRangePicker extends React.Component { - constructor(props) { - super(props); - - let ranges = {}, - customRange = {}, - rangesOriginal = {}; - - if (this.props.ranges == null || !Array.isArray(this.props.ranges)) { - customRange[this.props.translations.customRange] = this.props.translations.customRange; - Object.assign(ranges, this.props.ranges, customRange); - rangesOriginal = ranges; - } else { - rangesOriginal = this.props.ranges; - - if (Array.isArray(this.props.ranges)) { - for (let cur in this.props.ranges) { - let curColumn = this.props.ranges[cur]; - - Object.assign(ranges, curColumn.ranges); - } - - customRange[this.props.translations.customRange] = this.props.translations.customRange; - Object.assign(ranges, customRange); - } - } - - if (this.props.local && this.props.local.format) { - momentFormat = this.props.local.format; - } - - this.state = { - selectedRange: 0, - selectingModeFrom: true, - rangesOriginal: rangesOriginal, - ranges: ranges, - start: this.props.start, - startLabel: this.props.start.format(momentFormat), - end: this.props.end, - endLabel: this.props.end.format(momentFormat), - focusDate: false, - errorClass: "" - }; - this.bindToFunctions(); - } - - bindToFunctions() { - this.rangeSelectedCallback = this.rangeSelectedCallback.bind(this); - this.dateSelectedNoTimeCallback = this.dateSelectedNoTimeCallback.bind(this); - this.timeChangeCallback = this.timeChangeCallback.bind(this); - this.dateTextFieldCallback = this.dateTextFieldCallback.bind(this); - this.onChangeDateTextHandlerCallback = this.onChangeDateTextHandlerCallback.bind(this); - this.changeSelectingModeCallback = this.changeSelectingModeCallback.bind(this); - this.applyCallback = this.applyCallback.bind(this); - this.keyboardCellCallback = this.keyboardCellCallback.bind(this); - this.focusOnCallback = this.focusOnCallback.bind(this); - this.cellFocusedCallback = this.cellFocusedCallback.bind(this); - this.cellDateHover = this.cellDateHover.bind(this); - } - - componentDidMount() { - this.setToRangeValue(this.state.start, this.state.end); - } - - componentDidUpdate(prevProps) { - if (!this.props.start.isSame(prevProps.start)) { - this.updateStartEndAndLabels(this.props.start, this.state.end); - } else if (!this.props.end.isSame(prevProps.end)) { - this.updateStartEndAndLabels(this.state.start, this.props.end); - } - } - - applyCallback() { - this.applyCallbackDirect(this.state.start, this.state.end); - } - - applyCallbackDirect(start, end) { - if (!this.checkMaxDays(start, end)) { - return false; - } - - if (this.props.applyCallback) { - this.props.applyCallback(start, end); - } - - this.props.changeVisibleState(); - } - - checkMaxDays(startDate, endDate) { - let { maxDays } = this.props; - - if (maxDays != null && maxDays > 0) { - let days = Date.daysBetween(startDate, endDate); - - if (days - 1 > this.props.maxDays) { - this.props.updateErrorClass("error"); - if (this.state.errorClass !== "error") this.setState({ errorClass: "error" }); - return false; - } else { - this.props.updateErrorClass(""); - if (this.state.errorClass !== "") this.setState({ errorClass: "" }); - return true; - } - } - - return true; - } - - rangeSelectedCallback(index, value) { - // If Past Max Date Dont allow update - let start; - let end; - if (value !== this.props.translations.customRange) { - start = this.state.ranges[value][0]; - end = this.state.ranges[value][1]; - if (pastMaxDate(start, this.props.maxDate, true) || pastMaxDate(end, this.props.maxDate, true)) { - return false; - } - if (!this.checkMaxDays(start, end)) { - return false; - } - if (this.props.rangeCallback) { - this.props.rangeCallback(value, this.state.ranges[value], { start: this.state.ranges[value][0].toDate(), end: this.state.ranges[value][1].toDate() }); - } - } - // Else update state to new selected index and update start and end time - this.setState({ selectedRange: index }); - if (value !== this.props.translations.customRange) { - this.updateStartEndAndLabels(start, end); - } - - if (this.props.autoCloseOnSelection) { - this.applyCallbackDirect(this.state.ranges[value][0].toDate(), this.state.ranges[value][1].toDate()); - } - } - - setToRangeValue(startDate, endDate) { - if (!this.checkMaxDays(startDate, endDate)) { - return false; - } - - let rangesArray = Object.values(this.state.ranges); - for (let i = 0; i < rangesArray.length; i++) { - if (rangesArray[i] === this.props.translations.customRange) { - continue; - } else if (rangesArray[i][0].isSame(startDate, "minutes") && rangesArray[i][1].isSame(endDate, "minutes")) { - this.setState({ selectedRange: i }); - - if (this.props.rangeCallback) { - this.props.rangeCallback(i, rangesArray[i], { start: rangesArray[i][0].toDate(), end: rangesArray[i][1].toDate() }); - } - - return; - } - } - this.setToCustomRange(); - } - - setToCustomRange() { - let rangesArray = Object.values(this.state.ranges); - for (let i = 0; i < rangesArray.length; i++) { - if (rangesArray[i] === this.props.translations.customRange) { - this.setState({ selectedRange: i }); - } - } - } - - updateStartEndAndLabels(newStart, newEnd) { - this.setState({ - start: newStart, - startLabel: newStart.format(momentFormat), - end: newEnd, - endLabel: newEnd.format(momentFormat) - }); - } - - dateSelectedNoTimeCallback(cellDate) { - if (this.props.maxDays != null && this.props.maxDays === 1) { - let startDate = moment([cellDate.year(), cellDate.month(), cellDate.date(), 0, 0, 0]); - let endDate = moment([cellDate.year(), cellDate.month(), cellDate.date(), 23, 59, 59]); - - this.updateStartEndAndLabels(startDate, endDate); - - //eslint-disable-next-line - this.state.start = startDate; - //eslint-disable-next-line - this.state.end = endDate; - - this.setState({ - start: startDate, - end: endDate, - selectingModeFrom: false - }); - - this.applyCallback(); - - return; - } else { - let { start: startToUse, end: endToUse } = this.state; - if (this.props.useVirtualSelection && this.state.selectingModeFrom) { - endToUse = new startToUse.clone(); - } - - let newDates = datePicked(startToUse, endToUse, cellDate, this.state.selectingModeFrom); - - let startDate = newDates.startDate; - let endDate = newDates.endDate; - - let newStart = this.duplicateMomentTimeFromState(startDate, true); - let newEnd = this.duplicateMomentTimeFromState(endDate, false); - - this.updateStartEndAndLabels(newStart, newEnd); - this.setToRangeValue(newStart, newEnd); - - this.setState(prevState => ({ - selectingModeFrom: !prevState.selectingModeFrom - })); - - if (this.props.autoCloseOnSelection && !this.state.selectingModeFrom) { - this.applyCallbackDirect(startDate, endDate); - } - } - } - - changeSelectingModeCallback(selectingModeFromParam) { - this.setState({ selectingModeFrom: selectingModeFromParam }); - } - - duplicateMomentTimeFromState(date, startDate) { - let state; - if (startDate) { - state = this.state.start; - } else { - state = this.state.end; - } - let newDate = [date.year(), date.month(), date.date(), state.hours(), state.minutes()]; - return moment(newDate); - } - - timeChangeCallback(newHour, newMinute, mode) { - if (mode === "start") { - this.updateStartTime(newHour, newMinute, mode); - } else if (mode === "end") { - this.updateEndTime(newHour, newMinute, mode); - } - } - - updateStartTime(newHour, newMinute, mode) { - this.updateTime(this.state.start, newHour, newMinute, mode, "start", "startLabel"); - } - - updateEndTime(newHour, newMinute, mode) { - this.updateTime(this.state.end, newHour, newMinute, mode, "end", "endLabel"); - } - - updateTime(origDate, newHour, newMinute, mode, stateDateToChangeName, stateLabelToChangeName) { - let date = moment(origDate); - date.hours(newHour); - date.minutes(newMinute); - // If Past Max Date Dont allow update - if (pastMaxDate(date, this.props.maxDate, true)) { - return false; - } - // If Valid Time Change allow the change else set new start and end times - // to be minute ahead/behind the new date - if (isValidTimeChange(mode, date, this.state.start, this.state.end)) { - this.setState({ - [stateDateToChangeName]: date, - [stateLabelToChangeName]: date.format(momentFormat) - }); - this.updateTimeCustomRangeUpdator(stateDateToChangeName, date); - } else { - let newDate = moment(date); - if (mode === "start") { - newDate.add(1, "minute"); - this.updateStartEndAndLabels(date, newDate); - this.setToRangeValue(date, newDate); - } else { - newDate.subtract(1, "minute"); - this.updateStartEndAndLabels(newDate, date); - this.setToRangeValue(newDate, date); - } - } - } - - updateTimeCustomRangeUpdator(stateDateToChangeName, date) { - if (stateDateToChangeName === "start") { - this.setToRangeValue(date, this.state.end); - } else { - this.setToRangeValue(this.state.start, date); - } - } - - dateTextFieldCallback(mode) { - if (mode === "start") { - let newDate = moment(this.state.startLabel, momentFormat); - let isValidNewDate = newDate.isValid(); - let isSameOrBeforeEnd = newDate.isSameOrBefore(this.state.end, "minute"); - let isAfterEndDate = newDate.isAfter(this.state.end); - this.updateDate(mode, newDate, isValidNewDate, isSameOrBeforeEnd, isAfterEndDate, "start", "startLabel"); - } else { - let newDate = moment(this.state.endLabel, momentFormat); - let isValidNewDate = newDate.isValid(); - let isBeforeStartDate = newDate.isBefore(this.state.start); - let isSameOrAfterStartDate = newDate.isSameOrAfter(this.state.start, "minute"); - this.updateDate(mode, newDate, isValidNewDate, isSameOrAfterStartDate, isBeforeStartDate, "end", "endLabel"); - } - } - - updateDate(mode, newDate, isValidNewDate, isValidDateChange, isInvalidDateChange, stateDateToChangeName, stateLabelToChangeName) { - // If new date past max date dont allow change - if (pastMaxDate(newDate, this.props.maxDate, true)) { - this.updateStartEndAndLabels(this.state.start, this.state.end); - return false; - } - // Else if date valid and date change valid update the date, - // if date invalid go into update invalid mode, adds/subtract 1 days from start/stop value - if (isValidNewDate && isValidDateChange) { - this.setState({ - [stateDateToChangeName]: newDate, - [stateLabelToChangeName]: newDate.format(momentFormat) - }); - if (this.updateTimeUpdator) this.updateTimeUpdator(stateDateToChangeName, newDate); - } else if (isValidNewDate && isInvalidDateChange) { - this.updateInvalidDate(mode, newDate); - } else if (!isValidNewDate) { - this.updateStartEndAndLabels(this.state.start, this.state.end); - } - } - - updateInvalidDate(mode, newDate) { - if (mode === "start") { - let newEndDate = moment(newDate).add(1, "day"); - this.updateLabelsAndRangeValues(newDate, newEndDate); - } else { - let newStartDate = moment(newDate).subtract(1, "day"); - this.updateStartEndAndLabels(newStartDate, newDate); - } - } - - updateLabelsAndRangeValues(startDate, endDate) { - this.updateStartEndAndLabels(startDate, endDate); - this.setToRangeValue(startDate, endDate); - } - - onChangeDateTextHandlerCallback(newValue, mode) { - if (mode === "start") { - this.setState({ - startLabel: newValue - }); - } else if (mode === "end") { - this.setState({ - endLabel: newValue - }); - } - } - - keyboardCellCallback(originalDate, newDate) { - let startDate; - let endDate; - if (originalDate.isSame(this.state.start, "day")) { - startDate = this.duplicateMomentTimeFromState(newDate, true); - endDate = moment(this.state.end); - } else { - startDate = moment(this.state.start); - endDate = this.duplicateMomentTimeFromState(newDate, false); - } - - if (startDate.isBefore(endDate, "day")) { - this.updateStartEndAndLabels(startDate, endDate); - } else { - this.updateStartEndAndLabels(endDate, startDate); - } - } - - focusOnCallback(date) { - if (date) { - this.setState({ - focusDate: date - }); - } else { - this.setState({ - focusDate: false - }); - } - } - - cellDateHover(date, isFrom) { - console.log("hover on " + date.toString() + " mode: " + isFrom); - if (this.props.useVirtualSelection) { - if (this.state.selectingModeFrom) { - /* this.setState({ + constructor(props) { + super(props); + + let ranges = {}, + customRange = {}, + rangesOriginal = {}; + + if (this.props.ranges == null || !Array.isArray(this.props.ranges)) { + customRange[this.props.translations.customRange] = this.props.translations.customRange; + Object.assign(ranges, this.props.ranges, customRange); + rangesOriginal = ranges; + } else { + rangesOriginal = this.props.ranges; + + if (Array.isArray(this.props.ranges)) { + for (let cur in this.props.ranges) { + let curColumn = this.props.ranges[cur]; + + Object.assign(ranges, curColumn.ranges); + } + + customRange[this.props.translations.customRange] = this.props.translations.customRange; + Object.assign(ranges, customRange); + } + } + + if (this.props.local && this.props.local.format) { + momentFormat = this.props.local.format; + } + + this.state = { + selectedRange: 0, + selectingModeFrom: true, + rangesOriginal: rangesOriginal, + ranges: ranges, + start: this.props.start, + startLabel: this.props.start.format(momentFormat), + end: this.props.end, + endLabel: this.props.end.format(momentFormat), + focusDate: false, + errorClass: '' + }; + this.bindToFunctions(); + } + + bindToFunctions() { + this.rangeSelectedCallback = this.rangeSelectedCallback.bind(this); + this.dateSelectedNoTimeCallback = this.dateSelectedNoTimeCallback.bind(this); + this.timeChangeCallback = this.timeChangeCallback.bind(this); + this.dateTextFieldCallback = this.dateTextFieldCallback.bind(this); + this.onChangeDateTextHandlerCallback = this.onChangeDateTextHandlerCallback.bind(this); + this.changeSelectingModeCallback = this.changeSelectingModeCallback.bind(this); + this.applyCallback = this.applyCallback.bind(this); + this.keyboardCellCallback = this.keyboardCellCallback.bind(this); + this.focusOnCallback = this.focusOnCallback.bind(this); + this.cellFocusedCallback = this.cellFocusedCallback.bind(this); + this.cellDateHover = this.cellDateHover.bind(this); + } + + componentDidMount() { + this.setToRangeValue(this.state.start, this.state.end); + } + + componentDidUpdate(prevProps) { + if (!this.props.start.isSame(prevProps.start)) { + this.updateStartEndAndLabels(this.props.start, this.state.end); + } else if (!this.props.end.isSame(prevProps.end)) { + this.updateStartEndAndLabels(this.state.start, this.props.end); + } + } + + applyCallback() { + this.applyCallbackDirect(this.state.start, this.state.end); + } + + applyCallbackDirect(start, end) { + if (!this.checkMaxDays(start, end)) { + return false; + } + + if (this.props.applyCallback) { + this.props.applyCallback(start, end); + } + + this.props.changeVisibleState(); + } + + checkMaxDays(startDate, endDate) { + let { maxDays } = this.props; + + if (maxDays != null && maxDays > 0) { + let days = Date.daysBetween(startDate, endDate); + + if (days - 1 > this.props.maxDays) { + this.props.updateErrorClass('error'); + if (this.state.errorClass !== 'error') this.setState({ errorClass: 'error' }); + return false; + } else { + this.props.updateErrorClass(''); + if (this.state.errorClass !== '') this.setState({ errorClass: '' }); + return true; + } + } + + return true; + } + + rangeSelectedCallback(index, value) { + // If Past Max Date Dont allow update + let start; + let end; + if (value !== this.props.translations.customRange) { + start = this.state.ranges[value][0]; + end = this.state.ranges[value][1]; + if (pastMaxDate(start, this.props.maxDate, true) || pastMaxDate(end, this.props.maxDate, true)) { + return false; + } + if (!this.checkMaxDays(start, end)) { + return false; + } + if (this.props.rangeCallback) { + this.props.rangeCallback(value, this.state.ranges[value], { start: this.state.ranges[value][0].toDate(), end: this.state.ranges[value][1].toDate() }); + } + } + // Else update state to new selected index and update start and end time + this.setState({ selectedRange: index }); + if (value !== this.props.translations.customRange) { + this.updateStartEndAndLabels(start, end); + } + + if (this.props.autoCloseOnSelection) { + this.applyCallbackDirect(this.state.ranges[value][0].toDate(), this.state.ranges[value][1].toDate()); + } + } + + setToRangeValue(startDate, endDate) { + if (!this.checkMaxDays(startDate, endDate)) { + return false; + } + + let rangesArray = Object.values(this.state.ranges); + for (let i = 0; i < rangesArray.length; i++) { + if (rangesArray[i] === this.props.translations.customRange) { + continue; + } else if (rangesArray[i][0].isSame(startDate, 'minutes') && rangesArray[i][1].isSame(endDate, 'minutes')) { + this.setState({ selectedRange: i }); + + if (this.props.rangeCallback) { + this.props.rangeCallback(i, rangesArray[i], { start: rangesArray[i][0].toDate(), end: rangesArray[i][1].toDate() }); + } + + return; + } + } + this.setToCustomRange(); + } + + setToCustomRange() { + let rangesArray = Object.values(this.state.ranges); + for (let i = 0; i < rangesArray.length; i++) { + if (rangesArray[i] === this.props.translations.customRange) { + this.setState({ selectedRange: i }); + } + } + } + + updateStartEndAndLabels(newStart, newEnd) { + this.setState({ + start: newStart, + startLabel: newStart.format(momentFormat), + end: newEnd, + endLabel: newEnd.format(momentFormat) + }); + } + + dateSelectedNoTimeCallback(cellDate) { + if (this.props.maxDays != null && this.props.maxDays === 1) { + let startDate = moment([cellDate.year(), cellDate.month(), cellDate.date(), 0, 0, 0]); + let endDate = moment([cellDate.year(), cellDate.month(), cellDate.date(), 23, 59, 59]); + + this.updateStartEndAndLabels(startDate, endDate); + + //eslint-disable-next-line + this.state.start = startDate; + //eslint-disable-next-line + this.state.end = endDate; + + this.setState({ + start: startDate, + end: endDate, + selectingModeFrom: false + }); + + this.applyCallback(); + + return; + } else { + let { start: startToUse, end: endToUse } = this.state, + newDates; + if (this.props.useVirtualSelection) { + if (this.state.selectingModeFrom) { + endToUse = new startToUse.clone(); + newDates = datePicked(startToUse, endToUse, cellDate, this.state.selectingModeFrom); + } else { + if (startToUse > endToUse) { + let temp = startToUse; + startToUse = endToUse; + endToUse = temp; + } + newDates = datePicked(startToUse, endToUse, endToUse, this.state.selectingModeFrom); + } + } else { + newDates = datePicked(startToUse, endToUse, cellDate, this.state.selectingModeFrom); + } + + let startDate = newDates.startDate; + let endDate = newDates.endDate; + + let newStart = this.duplicateMomentTimeFromState(startDate, true); + let newEnd = this.duplicateMomentTimeFromState(endDate, false); + + this.updateStartEndAndLabels(newStart, newEnd); + this.setToRangeValue(newStart, newEnd); + + this.setState(prevState => ({ + selectingModeFrom: !prevState.selectingModeFrom + })); + + if (this.props.autoCloseOnSelection && !this.state.selectingModeFrom) { + this.applyCallbackDirect(startDate, endDate); + } + } + } + + changeSelectingModeCallback(selectingModeFromParam) { + this.setState({ selectingModeFrom: selectingModeFromParam }); + } + + duplicateMomentTimeFromState(date, startDate) { + let state; + if (startDate) { + state = this.state.start; + } else { + state = this.state.end; + } + let newDate = [date.year(), date.month(), date.date(), state.hours(), state.minutes()]; + return moment(newDate); + } + + timeChangeCallback(newHour, newMinute, mode) { + if (mode === 'start') { + this.updateStartTime(newHour, newMinute, mode); + } else if (mode === 'end') { + this.updateEndTime(newHour, newMinute, mode); + } + } + + updateStartTime(newHour, newMinute, mode) { + this.updateTime(this.state.start, newHour, newMinute, mode, 'start', 'startLabel'); + } + + updateEndTime(newHour, newMinute, mode) { + this.updateTime(this.state.end, newHour, newMinute, mode, 'end', 'endLabel'); + } + + updateTime(origDate, newHour, newMinute, mode, stateDateToChangeName, stateLabelToChangeName) { + let date = moment(origDate); + date.hours(newHour); + date.minutes(newMinute); + // If Past Max Date Dont allow update + if (pastMaxDate(date, this.props.maxDate, true)) { + return false; + } + // If Valid Time Change allow the change else set new start and end times + // to be minute ahead/behind the new date + if (isValidTimeChange(mode, date, this.state.start, this.state.end)) { + this.setState({ + [stateDateToChangeName]: date, + [stateLabelToChangeName]: date.format(momentFormat) + }); + this.updateTimeCustomRangeUpdator(stateDateToChangeName, date); + } else { + let newDate = moment(date); + if (mode === 'start') { + newDate.add(1, 'minute'); + this.updateStartEndAndLabels(date, newDate); + this.setToRangeValue(date, newDate); + } else { + newDate.subtract(1, 'minute'); + this.updateStartEndAndLabels(newDate, date); + this.setToRangeValue(newDate, date); + } + } + } + + updateTimeCustomRangeUpdator(stateDateToChangeName, date) { + if (stateDateToChangeName === 'start') { + this.setToRangeValue(date, this.state.end); + } else { + this.setToRangeValue(this.state.start, date); + } + } + + dateTextFieldCallback(mode) { + if (mode === 'start') { + let newDate = moment(this.state.startLabel, momentFormat); + let isValidNewDate = newDate.isValid(); + let isSameOrBeforeEnd = newDate.isSameOrBefore(this.state.end, 'minute'); + let isAfterEndDate = newDate.isAfter(this.state.end); + this.updateDate(mode, newDate, isValidNewDate, isSameOrBeforeEnd, isAfterEndDate, 'start', 'startLabel'); + } else { + let newDate = moment(this.state.endLabel, momentFormat); + let isValidNewDate = newDate.isValid(); + let isBeforeStartDate = newDate.isBefore(this.state.start); + let isSameOrAfterStartDate = newDate.isSameOrAfter(this.state.start, 'minute'); + this.updateDate(mode, newDate, isValidNewDate, isSameOrAfterStartDate, isBeforeStartDate, 'end', 'endLabel'); + } + } + + updateDate(mode, newDate, isValidNewDate, isValidDateChange, isInvalidDateChange, stateDateToChangeName, stateLabelToChangeName) { + // If new date past max date dont allow change + if (pastMaxDate(newDate, this.props.maxDate, true)) { + this.updateStartEndAndLabels(this.state.start, this.state.end); + return false; + } + // Else if date valid and date change valid update the date, + // if date invalid go into update invalid mode, adds/subtract 1 days from start/stop value + if (isValidNewDate && isValidDateChange) { + this.setState({ + [stateDateToChangeName]: newDate, + [stateLabelToChangeName]: newDate.format(momentFormat) + }); + if (this.updateTimeUpdator) this.updateTimeUpdator(stateDateToChangeName, newDate); + } else if (isValidNewDate && isInvalidDateChange) { + this.updateInvalidDate(mode, newDate); + } else if (!isValidNewDate) { + this.updateStartEndAndLabels(this.state.start, this.state.end); + } + } + + updateInvalidDate(mode, newDate) { + if (mode === 'start') { + let newEndDate = moment(newDate).add(1, 'day'); + this.updateLabelsAndRangeValues(newDate, newEndDate); + } else { + let newStartDate = moment(newDate).subtract(1, 'day'); + this.updateStartEndAndLabels(newStartDate, newDate); + } + } + + updateLabelsAndRangeValues(startDate, endDate) { + this.updateStartEndAndLabels(startDate, endDate); + this.setToRangeValue(startDate, endDate); + } + + onChangeDateTextHandlerCallback(newValue, mode) { + if (mode === 'start') { + this.setState({ + startLabel: newValue + }); + } else if (mode === 'end') { + this.setState({ + endLabel: newValue + }); + } + } + + keyboardCellCallback(originalDate, newDate) { + let startDate; + let endDate; + if (originalDate.isSame(this.state.start, 'day')) { + startDate = this.duplicateMomentTimeFromState(newDate, true); + endDate = moment(this.state.end); + } else { + startDate = moment(this.state.start); + endDate = this.duplicateMomentTimeFromState(newDate, false); + } + + if (startDate.isBefore(endDate, 'day')) { + this.updateStartEndAndLabels(startDate, endDate); + } else { + this.updateStartEndAndLabels(endDate, startDate); + } + } + + focusOnCallback(date) { + if (date) { + this.setState({ + focusDate: date + }); + } else { + this.setState({ + focusDate: false + }); + } + } + + cellDateHover(date, isFrom) { + if (this.props.useVirtualSelection) { + if (this.state.selectingModeFrom) { + /* this.setState({ start: date, end: date }); this.updateStartEndAndLabels(date, date); */ - } else { - console.log("set end date " + date.toString()); - this.setState({ - end: date - }); - - this.updateStartEndAndLabels(this.state.start, date); - } - } - } - - cellFocusedCallback(date) { - if (date.isSame(this.state.start, "day")) { - this.changeSelectingModeCallback(true); - } else if (date.isSame(this.state.end, "day")) { - this.changeSelectingModeCallback(false); - } - } - - renderStartDate() { - return ( - - ); - } - - renderEndDate() { - return ( - - ); - } - - render() { - return ( - - - {this.props.maxDays == null || this.props.maxDays > 1 /* && !this.props.useVirtualSelection */ ? this.renderStartDate() : ""} - {this.renderEndDate()} - - ); - } + } else { + let start = this.state.start; + /* + if (date < start) { + start = date; + date = this.state.start; + } */ + + this.setState({ + start: start, + end: date + }); + + this.updateStartEndAndLabels(start, date); + } + } + } + + cellFocusedCallback(date) { + if (date.isSame(this.state.start, 'day')) { + this.changeSelectingModeCallback(true); + } else if (date.isSame(this.state.end, 'day')) { + this.changeSelectingModeCallback(false); + } + } + + renderStartDate() { + return ( + + ); + } + + renderEndDate() { + return ( + + ); + } + + render() { + return ( + + + {this.props.maxDays == null || this.props.maxDays > 1 /* && !this.props.useVirtualSelection */ ? this.renderStartDate() : ''} + {this.renderEndDate()} + + ); + } } export { DateTimeRangePicker }; From 78ed5c8d7c8e4a7144e2615f4ac6750684e9e231 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Mon, 11 Mar 2019 10:09:04 +0100 Subject: [PATCH 17/31] added package npm command --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index b6db1f5..6290c35 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,8 @@ "start": "react-scripts start", "build-win": "if exist dist rmdir /s dist && set NODE_ENV=production && .\\node_modules\\.bin\\babel src\\lib --out-dir dist --copy-files --ignore __tests__,spec.js,test.js,__snapshots__", "build": "rm -rf dist && NODE_ENV=production babel src/lib --out-dir dist --copy-files --ignore __tests__,spec.js,test.js,__snapshots__", - "test": "react-scripts test" + "test": "react-scripts test", + "package": "npm pack && ren *.tgz %npm_package_name%.tgz" }, "eslintConfig": { "extends": "react-app" From 4de79735c7ebd52a6643628e714537e2811032c7 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Mon, 11 Mar 2019 16:07:00 +0100 Subject: [PATCH 18/31] demo images --- public/images/classical.png | Bin 0 -> 33358 bytes public/images/colors-styles.png | Bin 0 -> 37110 bytes public/images/no-time.png | Bin 0 -> 37837 bytes public/images/one-day.png | Bin 0 -> 24896 bytes public/images/ready-to-use.png | Bin 0 -> 40890 bytes public/images/virtual-selection.gif | Bin 0 -> 155022 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/images/classical.png create mode 100644 public/images/colors-styles.png create mode 100644 public/images/no-time.png create mode 100644 public/images/one-day.png create mode 100644 public/images/ready-to-use.png create mode 100644 public/images/virtual-selection.gif diff --git a/public/images/classical.png b/public/images/classical.png new file mode 100644 index 0000000000000000000000000000000000000000..f4469e6c583d395d6be7c23599d8c74b18d78e30 GIT binary patch literal 33358 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 z z&~<@;jW0dw%0R9+`8ld+_bM&s1a85Lz0tVoSaBB^?_b=8`ys3u`b; z(0_U9YGZzQl#o_V6uh-DO0L+J%FAKKyelQD`cfTX5vLsWV4+=;)A z+7$#f#&w{BkcT#OPjC1NXcjGQ&Qnhj;?H`vD>qpVh0WkrpWubAEs;bo9??u0GZ4`p z-!Hj=E0`{hs&-86ykZSM|LXdXG@K3V(zv2A%5x5n%mVL zNyv0SoW)%z)h=ro_NpB4cjF%;>Fp|l`H`NTBQKKJs7x4Af|pudY@E4}J6PU{Xkv0} z*z{1{1k2+*T4}BvcqhRlxO4K!cYOd}D{KU^n)YZF+3Z0;3_<_kC3QUe({S0i?c*W_ zZEZwM%**$$IYvtzZI(|-K%ZR>44AH*o(~j~KR=5sNnK>0cu>V1c#--ig3vA_ktKFH zm%0QPW+WXpo3QoFJgEY1G6+Oq|48m)eWBM@&-f#_L_*wyD6C@jpd@qK%G8Om1M2kU zc?bwT_4f198z{^Z=n#hi;qMq7&NM(CALxQNkHL%t#QZU%QPb#D0|k5hAf!Lk3Arm?2ia-5Ga6(+q6wf3_XW z#qUCjh^_SqaG#fxVjzSOYS3kJnzNCU@ETRMzSGcd5 z4)c;JW(>flCYb_8ZPUTlo;ua8oVbiTPVXHP*F7wU(7_y-v{@lT;i zOGsD6aKgG_6=m74uycY2szq{%*_QiHYs;q(*980!6c91;kULw+%qiDXx~(*44(HO~ z*R}31dCvNENb9aHad*C)&1fWk0nWczDDOu>FaQT`{&+U_I*iNC0gYeO_xfujezlMe z<<6`1ORa=2Hd02X@SdJgvUbz!7TNe~++YLHclCCsk=PN?we-WD1_{dKu5p!qlW#wT zb)=6mbC!iYWc*@Zu_QZeU+MxRVXfMi09wmO6eK4e(JM>_77j~5x@L0g7DFuGy0Z)H zI%?#AnI$}OzFDWUIAXQHmek~{WL}y_%Riun=MvM9bMXgxfth*~|0?h^9^7wIQ|cK0 z6w_^Tz^%C*&=hQAk%iMRmYPn4W|p?eH&Q*5O`nQwsL+;r4W{T|P;|Oq#_`v2)Py(O zNqAJj&fPtrev}GCmEtnoXXaqzi(Y!9$Vi!;D}#*jG$TpW1AC(~7j|b7ZdnLE&QZa+ z%+bXVa;LkHsGP<(X4x6~qq5gqD+UhEZ(vYeHZ4NZ;tj!;CMCQWYDer}AKKtVx?z*O z@Xffxe>R=w3y2qP371E>&M^zcMGT82Jsf!fy4nyX8)W3`?dBE&HE;0*8RV<}!xiPz zBB3sLt&vZe+b5sVKs<@0@GbaW^S;WzC8e)T)wY_U+qgRm^O)w42v~^U12fxon3Q|@ zU3ZkQGS%I_0QlPQflguQL$oK{aU*RX&5SU;GfuYmZ6|Wr7w13k-SSfd`Gj%2A-+^| z+EJ_+?q|jL)rczJqBIH`e1H48b!_vXXC1oqT|L+%u$)Sv=(V3dq9J1V?KJaIE~mbE zEvK!;aCm(BXu^+BkWOJ`Z2VTWc8Y%qx)71I;@`IBYoqQOt))kG3u#`~(#MiI{k*cv zzf-Cq)*HfDE}_Tug1jfI8C$I2!xhKNQKTDa1hzTF3b8IAz^D-DR^^e9^OdRpdEYA*qL@hAFSJu925k{AAUFj?^5sP&XW_w_b0ex9%qOimmZPaJU`d^023~+$_fxkQ20lE#c0k#&~$pg*nRq2)*4-5#n;GHZ)%Jw#mQ zy!F(}f4+@h@I3HnzakKi3Vk^z>?WBYz|obt|MVfZs#!eNy1kOuYG4G8v&x-~zYbfTq378@(`UhA zrh#dx8veB})i^;0hf2CGH~$+@Zo=%>Rx@mM{W}=L1e7fRp+dv{GP2{f%~3a!-4b!f zUd<1l9Q(Ot>t#Smx-Ubk@R@lP(BuZ_eJ#z6{dW$G;a3k~mw-t1e!+A@!fxM%}gc488t zyLeP=Pi$SVpn}H7F|@G5l$WRC_<(*#y^&`f;Zc=b3~@kj{vLYhPO|WMg1RP$Ep4J{ z!y=ZwZ#3m$s(fbo&#y31wgjoYUN$m7!Gfsr+Q>G$e99D<63j5w(=1DngNuRyhNyl0 z_Vz2~)akH1oMoP`$$OEE|GVONts(__i>gy6;Z$N4Lv%I3INmTweSt6{qDG)A9xtsi7} zLF9ll0dggnPCM(c0gOrcM=_QN4^}IrmKI=eQnd#=!&^vobnDMDO}G4fb#(2S-HO3c zg=C4N7fETU!Fo>^XBS0&3_A2nN3?xSXNO-Qm1dD7$iSUCZ+GJy-EGiJOiUVe5N)Jq zyOE2DT|*>wD_f$V|A~RCFBuZ{`C;9p`ixm6mURMHA@KvJ|9zP8zvWMv^{jvDQs`q?=pVYt1Hl#83Z0 zH+yv?E!-Dgh#;|J)&2ZDy|cM_R4dobvN51-pBQo(IJ01UI(DLm>+|i}q5*g&=YfW{ zhJ&+OinUFq{fu*Vyx1mW zH!+CxAY0Y6IXnUwKfrvC_RWbYpdUukCFnsM@fDnb=(y5KH*5+5+((2f8FS~766*JJ z&vQF(&R_TsJSR*i5>uz61oUd_%WXgkdijz^ts2pL*xjpl`^itgB)U5+3eP4T9IY@H z#=p80Bsdo_5}C~mJLiWK*YfXV#YdYA8wyxEZO8j5KHNvGE4AE_5Lrrxb#5R{!u)FY zV76v|bpS?NVfs*wBbPht6c}SS_4Kh=(u)&D1mh{a)2zkA>Lw45zZ%iJ0yrDd{JhEW zv$Zr#|5${^6(%g|r{NegN4z0ir;lLD2HKJFSQ!KZ)o|v(VrR^)MC~$Xz+2CRfSx@r z-K4|KT=&6!Crz(uoF-z_#|X^?%w2ZOoq|}-2~8^Vj!QF#HaCZpq5Q00wod5~$?(XhB z5Zv9}8GLR-o_BrkUHAKO=T}d!n(3}nU3K=}=hSJ9q5;PPz9(YG)`FbTQv`PgN31(t z_$Gjpf;fmd{{88H`~)e*e8fE#{GC)g-YI#~NWv zRLzSicg*$NT8*FA*TE*f<^rb`82J2#a){uf34ew8X239(oPFhMHyNw;#pfy{kMErg zBIgC<-%|d8VHn6Y%X_B8n6HS6bRg_eSaO%4yk8oWA7e&(x@J%7aQBs+P}+Xg?~}1s zk3vCJ>a72VP2H@7$vp(-F3^s$XBAw6cKEn`5yh%2M{_@(e9~#fA!>7ZlLrx^QKdgD zw{aUFDZ2S3Z9V`yx zhdiTD9cISbfoZ=`Gghv9^C+V(5%3-BHX*YCch3kc0CWHT;_B34O~unpRaqa@R%_AQ z)%Wf$hcAzQ%7Ux_G1LvVdPw!C3iE~T7i*GG8W_o7=v$@f$*X1 zMdT52z8TlE$Yn{Psu+E$kR z+flZKCi+tTB@75f{uLIU_-b#@qHkc}^2hHPulcaZIDX-s^Zte2)6?Tm^0J{JGpPMo z=ozPE{_pL=|34y+&yWn*g-uA2#4jq;(M^;EpvX*dbh+r~OtUoQy!7aZg8KUUa@p$9 zIS2v7GYjRq70*0y{l_LnT0Q}^G)x!&ZN)rsy@-h3c4kj}%Qa$m***VML_kn(1+d2g zC@Le@BQUWDY`Il~MDKFmw{1Xf@7f9p-k^ksubtHt?cRSUf?^mWCz*nsbm&J#LHP5X zzxL@-Gz*ZeqvAU5WT%jR0)KVd$|swRqCt&9OwzGoQ&vC#jUsLEtW8ofg@+dqy!!7O z&>0`8IkE+y1P6?xR-(Np+>;y(P(e4-b7I3o3q_x%XPLU}FT@X{El z*TJym!&ttG(rVwIceNpTFaB4sL5ax6Fy+}m;@RTSOB435&nO5#vM;3(&l{7ln>_=r zO0&rCS^P*%<3bq3(s)>45^CzN4-291%==)z-4~^;$Na$@4GyI~9hjFrv$5dsX?yf| zy(~w;vWg4|v#I`#k`Nh@X7 zb3IC}&7QQ|g8q1xHWhkw-v{x=@@(lan73O`&*ye22toG#eR<4iiY-YOPn<4De~jAb7)Fc&Im zynXEaCH|`M!1Xv*y^zH=;1GAcG=pr6Lp|Z`pf7SzsOav!*r?Db1G6{N60N(AvJ&Hx z^l0G8W!?S6%B?;4c;(Cq^W4xBwKTA;dE~NL7cuz>bYGkZdGF?c+)tyW<>iu6tPHL? zQJ_DHb2Tf2U_he4Xy&bB%;n6J50^+!ted5_ULKFY!GSmKOb*P$_!DJOp~Dk7?YK!n z0;FEM&eTV$^zI$J)B9vTPjl4Aa2s2$9k=B)jN}>q=6)U|1g4Mz#KhSE0}-U~2o(pS z2?cl&vqlP>(s0ZlUr9%8id=uLn?J6PH8V$GnCUGqgg0@e4Pu_Os>{o<&0ZpwWZ;LE z7`7YE^sFb>7lXH{6WbXlZ7mw?{N_-td)NOsn%wWqrrtLR5VBMN@OB zuZV1-%J>zptc;}zR$%}2D{QLg|uNzWVu7T>-euuksd_>lVyZ($Vf~8QFajSe^Ck zc>q)&m<*?#bdPf$w*s5X2-nw8XYZ$GxL#xCfF4HVs;=J3?mjt4z%wU%5$o;GXf>g8 zmBrgCX0+8PoTLY2mlQ%tiZX@{3XV!mZsr*q72YxNM*0Yv+8;PjmqmQs#;-A;4{IL2 zCh3pl;1>l3?z0&>eKqr{`^ZLal!)4u)CX2AJX$r&@Y$hrp&dEhMA@xvl1bUgURM!4 zkLz}aZsBUS33Ez{yvYc~KD3yAtL&~ z&m6ehageIRHb(Y{Ls_)9mDgQZhVHQ%2AT!w;S$~7g&CMcum`6y{=Cm>)#ahzmQnCZ z;Uk3UeebV#dHB$gC`-E|=JoK)E`vEb?^i$Ph9%HV zR!gvTgVUbiK627nt-@UPGu}Q`hfJyt1^N4BIG-LiI0mz5M5o-ajj0WjNki9hD;_RV z=cj}b8@+MoV-_+lTjsAdbUyp~wfC+27PB(8HK|!r8Vj@I*hbfNJEmuko@@BLT*BE` zODF!a&?fFD#KwLpS&`zl{#=@mZMVptJzXoIwqN+__`98KB3t`)bt6sgy2WlIx7xDQ z%IdL;L3|lMrXG28If_qk#ez~Uwor^84KZ!WY!BwYNMDCtHNL@8Hm?oeHLI#KX3L7# z&~EFj(+iCqcE-2lD#RI>P;5lh^m8<|V;6K_G<%~>Z!i=Qor`zct~lrJyV{t zZq9w6vhPF!H#RTz$Y!z>%u)kl(==0_K5&Nq(145`1ryIUkec9vC#gwy(R-#7s}TeD zJ83xC^_^C8?~Eucg|*DwftkamqW;BkKUlM1@}5Q!#qDKLYq~XR$#w6BZN0D5pl_u= zz^TmC^3Km|Yki`OFHV7~x4^Zvw=)W@BfO8)Wqu0uGTxUBL$b_wXRRtxA_OsRleE5? z|K6-5^t0`J zErQIBd)f%tqYV6gO98cxM+^UIbeIB2$~lzNuz5%c!>v_pmfLx^5zt>NATWm^{$y1| zJy6EB@0uW&D8GJ5GW|zjz_W{Ax{Pg6tfRG?hpM)WhpZlCPPJ?n!8XAS$6yl;A|tGc z@MXv$DNJ}+9|*=TP(69ev}03#AweT_%XFLJa<;!D(#dlv8b(aW9=?gEW`iYAfBwPh zHt6jMeHk<7QEW=*@!6c}raWXy+aeed=aTL;|(k^|!^w+tv{CG&PV11Axm;tXck zPpSsFeYC%QKgZoKE9<-9fNOTb<`e==>k16K>XKwJMsJmE+AbPjKx}L0jUii@6!g)+NR+MPMXSx>~HM=#yDv=imSznB4`$ZF@X$tXZMnCVF;{@mjvfU?HmLoWsl&AC6{mNr zMC}LBuk`v!S>7z6A|Bdm5=F~keS&D-Vw)$V6MFXm{?9P2yn_*ua9%3=YA@DrUv74O z5@LP~PJw*OBgVRV?GE1ZI!#Jj?zjwIh9B}0i-AW~XKuQLcoIEbj7t4@dR?Pdo`f^{8lST8Uo#^>e=F0Za^A8u@a{P>Yc=MJQY$G;)%t@ZPR%@V4&=AXBk zWyZ;xZ`ge7z(QSrqpf`&G)64UGGx}D#qa;YAbw)caJkvVxO4zh@GY_5hxKhTzydFa zq*BqAz!~6JbhbSDu%2UJK*X}Y_7iX_Xv|P80ptgdrjHSby(t)+VYX_#nNt86Vj6{;YtTFgne$C^b}*9Sqf==!h^Ln-_W zT(HE#L4HQt&0Z}Z^es;#4Nqn(4E_d=y(R8+TfC!(dPpmSkde*{VjspfT!^dHCU-wT z`gY~~J{bIsAmA34kic0+Bl7=u=TQUya~OmoQTgvAwqCU1yO-`TcCtuZ!*68%Ypair zbL~-ie}CWLdPV*C_*fAn7RCq^50#2%5FivKeeSHhky?T@Pyw{1r6u}XC<^Jq?-!$F z>3y05%9DjF(HlC`guWXFZU5`WGIl`v1>4sm)W17vI{DN5c_Yoeoz zbTpL5SBrC3VB1<%|5C)|p>;4q49SG`)N*VeY5Y^bB{~hjPTZa;;uyR^2^tMQMR~d3 zD%4|bAXCadeH!?L-AtY=Z2S`Qq#AU&m<-kN{8lhY+zGRtK0OGYY=RJu{-(An_A8~U zKpl*Xrt&LJF&eWgYsnHMN+hc|@ki3ys5P}Hp{$b>^!N^g4N;JMVdZNy|jC%#7q@ zg(j{QqrC21)y1&|B|J#`6Pm@?UH^xTh^YL9#6E$aC1YM;f1SAT4cky}kiR!)+dv44 zy=oiqGKLE{Bc|kjmr5G?T1xIepz2!E{$ZKdcZ2>YQHwn_4-AhXdR6`~-?vl?FZkOC ztEUm0h4ggG@;&qfSGE+p$%vNkzqTwt&1xTv(J(nEk%h1OI|^!+fR^6+s}uv(-s*UW zA{rg=9DZ0;f2&~CryoL29g~v{z7{5H334#{GT(3x2{ zd?)nzxQFeO!bKDxZER!Z8zWVe)`_Y~F@*j+lsa%aYKd1j2UCb6)#QyVzHePl$2yzR zwJW;F1X0yRx#B@2sHP2e@O<)iZd6`9f5s8JMVk04B)GxU!|=4;fNH-sR!2CTTwv0P zJFHdr3;;8Xx4XB&NYngF6y^hI7E_EQUWQ|JpJaJiryP@8H{APo@ZLomhK_+6BUD86 z9;5%_(Ctg=MJbPtt$lN$du=phC%k}BqimI#{fyAFKC`SB7h3>~ViPew##|eA%DQ=v z^va=TlYUgFPDN{7Sl-;(`uH!VjXj>iFlx6)CMKqa@4RXI&v8nW`@niWtNKW$j~xtM zj&I*LL4v*sPz>j;W-h)N0lgN5%gnfbMH*QWm7kWzy3gp8Z5Dlqecf0^i*Cg$x;||{ zX8jngZQ^U$8(lP&R^fM z^|ejK)%+|bf*!?e^zOvJTv`!NcUoI4&+oF3UiT$p3oaCwn4^V9>|EZ*GW)Eu*=>{t zpe9Alpxu(<)zi{euTP&P!V`#Aj-K|y#jUn3?5S6Ir&8D$fZ?q9&Op{bVrEcf9}{0+ zZuVT5w;1bSmu=F@%{((K3u_aKxOmdw+IqSgbejMx(P=EP4cedm6AtLyTs6(@ATFB{ z?d2y*tc_i&mLS}?l=(~+hn-tg^xrrrK^kJ}n%k4^APXcb<=30Pw-p=a(#eQPY*GyM zJ}q=6mnX1WH($-w+{M}JB65Eevn0`Zq#%@vpqH z+P0l|JL^%iN&83cxAB)Gk=fXAgi75$_@O#)t z>^3CCLP}Aq{AV-HnyD{^sB#95u6phdoL*~fBrVn!=7|U^an0jAiUSzlgPsxg>Px=P zX3@-RaiOi2_Sml)PKZ*OAUyV`cW;mAjJ{N2QzFZ^am}bc_ivL=-+obOetJAqP4&&E z`zxNWem2ZABl?&)tcAxIwV-ASvL`-0@g$MC*y^pg=Lv|tU||^W*xeWPBm05`3Q`Xx zSyJbpz-|^~(HPE6(P0f*aj(3`cA;&(-I%@ITq=&YjnY2x?3zKQTg6h}PiBT|Gn7$f z;vF&;j7jRgTmIG7@Y72!J{iM;_&p{0-v%8TCf$|`wk((ii2_}9I#-D@pR{8YG1)CTqgh^+qIJNl-<*GV+*i!1E2tm= zqhxIm-qmiGH0YM9Lc%AF_gO_gLvbpn^X;TtgS@1ibl5WUFQzd)mpi={Ru@Ps<&a+ zZupkeQ)hNpE4kzD!G#uCPT5pi3P$VoQwxoMzB&05omJCTz}*3bl|qWHXl_I1a|1$_ z#omW=&(~tQLiPfV&<|>LBc_e_Q^X!t7HgEEW%>Tl-jU79FBAh}$#v>I;@0MF{b*<- zEdUnF=!~1n>_q~faPG<6MBhX-J6}H>;av&#KzxjF7~R`G)9}igFraydK5Phnn;srs zP@DguUUJLl_Hzkq10dw=GjU;or9xpU1vD0>+B!msV3O8#|21T&fYa%k1nK=j++?Fq zo6hvO1DxiuW!YB6PPCaEU3jVm1bI5P&pi3fS34h~_SL3eY%M`nNRzWnAp&*_{c3hc z^smexkMxIO6govkJ*ecg50AWBiLO>Hm+M=cC_mnGmZpa`0h8n|sI+b+Y#Fe@yjWN` z_dicz+@>G=;|J^dn}srLO7kS6GBMjVe$m}|V_$1YwrLuf(<^OFgJIcC+LV-(ue!QK zK=p45;IrQe><%XUS*J9_=BR1Y7Zth3VpwZZlZtlw2ij&>Dn;c`GoHWJN=syemSP|fioSOf}l|;&$T9t zffzLP`EiUbN1qoUD=3^hO8dY9?tLib%uhU`%ZWLg0zOx$mQ)0Z;Qf;L(!m)+t84ufBeG;aL|9lO%ImPCxt zLz{=lJimu2Lv<^*i7K8X8|6IRFrL>E!c5+O<3~5LDw`(Sm~sXA{i=)z{6SuM=_@%r z=lY&pI{T^B_RzLS0xac?Gw?adKA3m0H>j5lif;ds$O{DTc3?;+ zUvN%4TH9~+kIE+3e6|%kH;hGPxMKhe?S@(`75qQ!9u!{j$B?~2VsXAF>Rw?> zfce=Do1qs1|C0;wfyDTMbj&I^fS7fRc$-Y=anOYH45aK6w}6KtyC@oV*yLzG2coTEKEh z!FLx;@`AmIg`Jt)DgX88Z4B8<4+Miy$p0^#Bc5zdU&*3~x?R8G#%mC-+D;qT7>1!# zvxlvI>ZYl}@fLCnpyyruBmn%e)rOb8I#VMViKGR9vK!Xwsp-y}KH~_scN02#29YVd zR+!BMZ@`i9Vwf$+EWa(*>BQPfEWbyAX^0^)$7jgnxdICXo(rq(V8Z&9xAQU%i+Nvm zcX001%@!uf7WD3k3#qTiE$#6=L5C&z>78IjhajXZp>wlkyr81Y5TPTkHZK#CydT$x z>N&;5QYiXLwsRQeG$ZLVw_lAyGbz6oDX0fUpO`A|)F@Hkrq61-!eX8;FVFnugrnQ* zSN+mtSav=nXRKqO>3C7aBgQ)ij zUb4NLL-M^78zv21h7-Kc8X~;(!lvH${G_xC!IAVmQuV2u`1^#WId(5z-&(xDN56UT zemN2rtjc?DEo{QCf`8JS)qF8R^xL3UbbYGS{m@y=7T+A%^>Ktq`oq#(Bt{=M($+@R z{?N4$($f6V-wdHaph7Z+L}d>)D(%_$#W(EjC822IKZ$?0@v!4E{qWT^sQ6H2d}4I-)EhRBni{Ta<0H)>`??(!b~ zWJ?vBl9hoTX@^fwo7k6+XTb#LBKB>go)eVJh9SL%qL~)Vx2+R!EUZI3 z;;0Ibpo!L4By68dtB4If5~-QhW{uY`i?%k3%0*mwk*xtO!D`f;-TH6K(X-w%TyQNP znIw8n_0~K~bdj(eXUv)k`BxiPj2XzS;BVEW$?shb&yeHnx#6_Z6*nZBs=bqwyt+D7 zR7*zv%f;OJLNs~SkpncF%ydeGkxJAbBs$eN+yJcI?~q#%o$9gF#|z0!uT~P2PaMHI7pP~u7@gCF zHgX9F*GINwzVa!Rw$q$qTX;{u>%o|eJJ-(lt0h%MjPDcM$-tr~%^!c)K2}&1FpbsZ zjDIr60ku?;D?Yl~`1iK#Yi%Qm76FO@nEN0rA)q1P!exIQ?5ISSIjPMZOgY*j53w)gC2qr=ISGip{-WW9_w|%@n{o=EIA^HZVxw>h~=o*pL(olEHJ zt1q*=rXn~BX1<|I;n=(#RFPE?ae-u&J)8~j%A~RCnva{Owq$CgR_c4bfk%u60(SI2y zxJ!ZV_o(dI-LjSYM$>VOKyc>w6P$*mh(#b&8onHr%K#_15YQeJ0X&}SZ*L=1Qjijt z%Myl?C*N~?2&h%Zi--#;m@0zJ%vj{c#Uodj8qNB`O}zt5TBWk6Zd0r6EnB#m$b(NB zNzW=|HRux0Dsmcba{P@hm9Gsq^W6eLS^hnSa#GXSukmzKtHe9;SGO?xi=Z(vK(&C* zaRmew^eKHWiM$^T0q5zJ39GnncrJ-HPFma!iz`dQiC`D8a!~BII-<<4ZZ?P8ZxS10 z;(28OQO{a!L5y`$Fujy{*QXwk8#&dLHd}Uwn8c%5GPNe-P=CD2kRY^QEy&Bor3Ary z#`gl^RklKP(H|c!-6Ro-X#I9TeaO$@AiV)H(MyH&hbWEZf0LOCi&!x$CoRO&CuG$n zgkLSsUjg)wrT}-WKNI}(lBAXsw}rLw&f3H`xK&raL3R@N!`!Ns#zrOFdM#@JRYORW zz@7O1pw&Jr5f6^$PTOFVzczh4X zno)D1wAXp&TRJ)en(g$JJ|=(+i0y(!{^NY_z45XdY-jiX7m?;|h+ofPhVa#Qr;1-x z6(={_;Fl3vuZ20f#w0bzI`4n#_$Q;X!)r$$0=$mw>^UroLgdhp00iQGoT2jbJCA|m zn&nr9Xk7F}TmNa33{)P+bWE%XF&4&5RRf?R+A+-J0s3>g7`2rFiiVi_i`CaUDJ)Sj zPv=q0%@sAFsx4(cl9F_l2TL|;TSKG4dCQuy=L5$E%_2P2mz5^bzf+!(p%7TEa~~gK6}gW4u2-%*s=hiL+d;f5VUJ*a(~nv{hWi!V-+*pg4&JV5vA!UZ7?p!%ml}vDB)kcR>vF z#C%yrpw6`=FJ|Q_|4)ghrkMQR3j1dW33LU!Gg-osWhPB95^$I{aW*($45@aQ(S|5_ne9(%K~cTHPQO;`)F{hmg~99m zYT8EpVS#-=I}F{mnRT9q@X%1%11ngw=_9E~i*x0W=2wz`zlnH|b?5PX;Naxsl*eja zqu@h8@#i^{f4((#?#Hy7{}3%U@&6si{_8^+!~fBuyS`R#tdmh-RS+-4zKF>&dPZz$ z%t!_lB85jI@3tmudR{ZT?@7`IV{t>qVXCz8 zXg7Zswk>EQ98?*g^?m{1akjkHk%v0q9KPYzs|j(&0{-3!BdSoYXUXT6GQvrKE4 zCClKIDZj9?Hri6_%w9vWC(lHG5Og9~!S=KoEP|>&q+03Rn1O;g3Ha+q#bGu{O987l zxmI=gTpUWuLj~OD>Int`I^)C3A-=FR`@Gv>Rw~ElsSM5cNS5?dpMR+G|6E&3s01m2 z?x{I;&srG2ytKKd+ffu%g<*TC9B=y9gO z3hIN3S1i9{6wUhziuoBsw^4!wEte++eh68|JB%{%$XsTBwb z`<{OKBB2--(Os0#;vh}7RcdUM3wG!cC`_IRll?f4EbmaBRJ>KB&O^YJtUNh=WK>9n zG|oqWe^(xC9UX?$U6xg}zyh~(FtxTQtH{1>Hgzr2C>`_B+~LK0d!#u5j9|ZzgJo(r zrcf$Xt;C9IMMAL_eqPq9>e%gEJ%t(6B+Dk0RB&JKo7(O;-CWjr>QO zRPO!YV;~0BjuV>IGonZwTS}TKW*0^me9uHi>DZBZhgijFuD%0FMeYyLAz3k8D z(r6Pbm}Od^Ne>JqrF75OBG9S2jDa~5i^uX8yNEii%`$T;4HNG4`&B`5d1UqZn5F_n z@pUb!tf(kU#=9IW`7BDx=P1bM-v>&lOz5?U2qBrPT53}B2ymidSt}2dcZbK9T8aeO zQ)TU{Rjw|WOK>!^3zqg@zT6XELkwyqTA!v(PcBo#ij8aPKsU|P_*QKBNJt*eA#;%l z#A{;;Z3G{ARjnqbZVktTkN9F(3U@wIY&-LxEUG8-sr3*~{8n<2{CFI1lR2tH>w9DQ zqjlamvf~NCu3CM2VD#KR1EwA95_T>#jx+bh~IlMPP^cSi$WOj;4mp`g5B*oS(-ymffSZ@2l$+$s(!hw=@z({7EQ@!G2@A3!gRm%GA*r$`h ztX^nPk0f1okHXgcoluBgC4$LI$|Y~Rh0T-DFU5)JPWmFI%1#DibLYnUsO2IacJCVo z1Z{>k(%TihyV$uF0ZsrAUP5^^vjtRcfS1|c?#vBL?D5S3*F?Cc6K*M`hYrrnK*cgf@{p)yE8ZA7bWYPT^);_RJF7y}}ZZM?9AUDokMxi7` zx(i$Bq|y-z8i^7LcD@dkp?A=q*g=Q9&hz-6J^;(X)RM3-eeE;Q1lggaxpEIQkk?zK ziEe8d+a``CFWaiEI8fS!MOJpHi};tlFL?ZLFYVBg-+OsGEOTC?2N%c}>fwcbE$#@! zS_$G@gCl*J*oAv`V7 zS_=Ux)T-Hf70wjsD&x4vdMqT(*Yq4yi1tM92?bcX{Iw^rs+hp|7!DXLE)<|aZL7{7 z&}akhK2wJ|nVHZlc~n-8SxheatcN9k-R+`MEuw8a1Pv64cnsYe^Y=N34oG|sfY|a7 zcR^uM&bpmLh&ml+N^F&1aiIpJm18f}U9p?>FAFArY!8(#9=TBz(Zs{O^R}GCReD_zzja|8y}inYJy_Wsm3MVq2xu!#`zKDw5F7)e?>)5o&LoZUx};;W}1A^uRZ9aY7P3t7hS`;BVEO{ z83OC}*3UvN+<(&Vy%Enki)ycg9RCy}O6Xd6atPlT>-H)<;B@rgyi9183Ur#|i=Lpc zh$WE19nFs15WN3n)0rf?;d6$6vm0;x7~{L_#<%nYS?l~gz`~b1qTb|=8#&(9X7d~z zwT{m$fOuLWmF4JeES2oLuCyfgTgc{U+ZZ6c+$g~!ixXA?ze%k|tnDUx70Hw>za!p7 zgP?C6pPQsMyY6?IxyW10-HrC0<*|(j3$64>Qfr4zS4nWq?yJSbehYvDY(Nr*AJS3d zRWPltA`)RNVg%dB{x*Z7Y|JiXW!H3bEn*yM-uLVrO=>o*a-KlE(jd)&?-Z@^dI!8; z2L7++;gCp#yW|3CaJEd-GKT$`^Xo%R-k6!`&#SCKYD^VuW;|MZIky4O5nt|8BS9G^ z9XDUb-^0eaxBJt0=&7KNlw>a>SS_s$Dk;=6zlzQq&Ncx_fiC%un~6An5I_Q7t`fuv zL{T-(IN&Z6;bJ+OA19$*1C;Lm_H1A*GliAx+^$ax>mb>6Y{nj2d_Qnz68pHH&&R`A zj=ohfz~g#=;icYJ9OD}ncCVdrgpf_{-vm`1T1H<~vlOfuY32z{y8Z8=bhoF%l9$9M zx6??%=4T7c%Y*$&ndo-cuKOktObRcj<%a2z0&XP6MYYR%LzoOn=3KL+cnRZRD;OA*g~I7jfp+`p6q3x94)NR*zc~2)xQV|`i$wl@Vdnhz?;&V zT`r)vNVpvj8JJQTkB;&%O~0Bo*S$Gx&^ML(_wP53hqE0(G5>=v4gFQ4d=`d02J;tb z;POKhX(~{|#Z%wtb7~KXqfEW*_oqdd&mld#a{6B@D5X-F5*nr(%+O3EAS}a{pX8q&_n^brmzz*EjF!*pRZa9{Mo6*f$oh*A5p`i z*WB)ReQIL5pG4rN4Ofs=8K8F}dkbC8pFSDmdXd8Q-{Iv3!hu&-*g-5vFJ`#G<#8ydWXbaojJ zJClHx#!}IN0YOoW1G`YqZU)am73YLrOMIqai)V!c^&rv54vbqHCjR~I;Nda!A^q?d zh~2u?a%fCSex_Bf0`P z-ESBIkx#tSc>9wKPE~sTOXSk3!|Inh|NF3GtPySbdj%uD>iXWH8S)*+hQ4S6d1(Kp z3+y3rqcG^D*0+Ehch>5(e2+|zs9xrjAkuL#(aM(Ab^(baST9(4!UNysEe*9jUQ;bE zR0PVLFxl|kd_=zUtbNedK0GAUaX*z_UPO(@`W>IP)D_y=rhcG_^?ei6-dH^${pDYh zT+l%cWlY$yacz0{Bf)o7jqjDo99Bp>5p+9ZP5jxP_A1iJI1T2}lbhl$va-bVH1yoZ!Yev`U9%Hx$TWnxLA#F#8 zoClhxyo*kS7mg3IK4=$x2LlUv5fLZxO;MFAPKCkX(M8Kyr}(ZwNcS7Ia~R!mYv}(m zR$h(bxEW_1qIctT%&!N6SPQIO$BHK!Z>z(TU3hA$y}cW`lBTCZbQ7m_Z`hX7D>B|Q z=BcaO7?+r#iXU#>35x2CTMRaj&V_eB0x&H8KJ;uF6&`(~bfE4IAZk=BxzP#%x?v{IsG z^8O)aMA7=KL?6saT@(>dy*%?8RVz@R+aI5X>0kWPmLQhjl5}Gs>u|OunaIV<(Z0RK z>5XU+nvFCVl4@(A|92&i>_)USj*0njgXH@A4fNt472_ub6z}^B=MZo{a!daiF#K9g zfih1cN&Ie+d7gOnl;;KIGze@Cj()Ist6s;ar9>o}^nu&&vF_R3nRrt3|i!)m{y_JKrv?ddip#+r_&Mq@nK z^P2qU;BMQ+_6FWsMIc<5wbPR)_X#6xRq5Gaw$NLk_$#>*=#yhX4>>(bZ4RoHr z;U-@a8{eyDch^@W#Lh)VU7RW;f01S1{9I%J|99ey+cOg<+a@AJiA@ms z;*sh29xoL=r}QJ|?q)pOB9dv^HYkV!Bjo6F9s)-hava_wm*K1hPCQU&`JK4$aO>@O z-0kI|?1YQVED-*K!2{y|V%t=-^Mgdjc@sa(Z>8m^Ndy6I_`H0fz-T_=xJ&P}SAM~EFqmC5Kf zP({`K>2?Rm=H0_iX$Zq(kNEu?9oXIMA#@P+FH&wWt#zPPj!WS0GMvhL9}pv%aUK_{ z)$pUIpW|f(_rqp=khs3R*a;64dU3Bo@?B|$x~=YW|EIw^)Mw0hAu@6P>rhZodlJF| zN~pK7bpPxUlo48`CJLUa{`YlvK)(WrfBc)c*k(^;z&ntvrB={hbWdQpADfxk@lr5M z?$PhiulPVjG}>Ud^Bzh1-<6XlfN%9jwF`i2#|-t~+%%L)FQWd2=QiOi&YBKmlkBEES{Cis@| z+WqlrX3=FQMKll?T2k^wX@Tkqcjb@3bpWpf^lzg#oRpC zKj&QU`{BLb4_*#?_UzfQ)_wnKO^C9h%;QJIj}Q8&REQ6{Jv?kub0k5$2a(Q{Hcq(sUMcaW=PeMEG7Z z@EUBwbOxIwO`MDzE$p2w>}(P6&?%|G_DAsT5_a|;juvL-&ImuS2l&BOtoyBwCLiFt zK6kdTF+t#hVWWe0(Bbc>+L=1LeQ-2E(6zsV?~ZYQa0@3R>knX8M}*p6RZ(Cw8ho?H z2S-~ATQh`TBx^xn8|uH$yEqz|Ae`R$Z~u2U2|F7b6I*A5vw`>)unh&i+dB(qYZHWm zy%Bl@gy#sdl49@NQ+MVd%J1Bgf8E&e3_Z^se~gURBl)YpVpxr{pYWkffBKG=gM4tV zdJI$DD(xS2y2H0gl4g(R39YhaUv3SY+u}R(l+hi<6F+h3hbAe?PMfEe;Ci_jHzAll zz#{XMwx%3-ehPY5fH& zYrcT2tSk*J?cqT?HXaGd%r1vG8f5^EIOaqCw311S`IaCFnYVMg*>l>_kCkaKJfm`3id>!lss@wkcYTCuFS_D4ouE9K{O7342_I@nzPNXuO~|A?+nBs zDERSXr($uBhK?>eF|nsWC5KSR^F%Z~4F3559PEHU=rxM@68WRJcz6=l)=VlYDrBQG zP$<4~%+AlB{7cKr?8FfPfq@T&9pPt(MoG>FE`^sA%bJ@69UYylw`O$n9fGBmmB;yF z5D}lFu`<%r`y(%jIbWUG+#V&gd`V11^V3to*I^-W+nc4NqoeCtM87}Sp+RU!$l{+g z0cdsDVrceX*_v;J=Vvywu5P)|Nfq(*q_zf zpW~;xKe2#1w{)5r`r-J{nt#^@>lUcRg8lh<)xPSu=*<7^0Sii?UTL=hTju1pKUpYz zrw;Gqy=O$qQ8oRm+26iNMO(9*uL#kC!v$w`G|+1ACkC4^q1gUJw3M{zc&!D(0YZ9Du#M{(~D4fg@1i{r;M zi~bjnlH3DuU_})b(Ka(RE&_J5bqr46e+)5^=EL~qugxC_AaEJ z*id#D^!%x#XLmo$~v;S+fDhHQinntgHkf6kUkM_W?{92hcwIK3A9`F#+BQj!2G$RAty9HC*3 zd`DR_c*wJ=iT>PwagH$C$n)F-R)lE1$(U_u7|hRe&MuALvV=DoymWb6>Sc>M%r5Z7 zNrTeU?9PkJ!op%_wkf8n>eYy={z1~-#q|4t3l3Ek8NYLIYAUItqoZbnE3=D>ix7+U z`}g0OAqRh3S&rYlc~gDC$Hx~NAHU?x&%ngAa(TL)%IEaiWqZQn>R=w0E(BR=yZg{4 zkbiddxAV`b!YiKdB5qC}bt=#5JZ?sB=e;v9_q%WoJ29#}3@r=WPNg0V^L0uh3-D5Y z&ZLspELQ(flxOZeH+`Y*qUFOa#mG-TDD_UH9HZ!zrhfBRcmIpm{NIIYtmouHic`p@ z<)(g)KX`LyRIN1~oJ6&Mu`1ww*5n&vrmd>!M3sPPU)u1QVT$2BS5#w#^_h0DrqW9E z;bDbdj2D=-9#GjDy9LD$A1E;hSd8a>y1Y|YcYQyxXn(MopTXg@CjaQsqeONi6th36 z!)qGq>J@ei!razVqVNwqWBR)>ob&3{t1mGz?R5^ziF{6UGqrZ~l$5Pz3y`y&R?|v{ zlZ|0fVQ<_AC+$CNR%WrRz3cdZb%klZZQ4os~K>Y$2eJ z`}FwH*J@pu4V&G^Sw80*s&xyU`b?gpnOBV@5+@A;!6Rprzt1egh!#i1-zphL`fBM0 zpqXg7KyOBm1HV?kOE_gK`jH$NrODBIh!mAm(W5^lZ{;Z3i3QaL>U#-?VOfmjARe88^u zCs>7e7#ZczK-&Z8Yq78`@z-5(%AJYbQm~eC(|c0!spiSv%v|PwEDcU>csQA$P$jQ{ zcZ4QNW>cTubNWW5*?OsAvp{yQLsxQ*G}q;lR7b`&%hwH;=E1sR)}ZIdnvOpLr7~{l zvFp)4A1lcA2C&-Vd~9fTQ3NJ%Ls^zYT<)zLr-ZaI+!a`8_5s8V3>%6bH zLB&cHf~cpE6A^8yqQiEsw#JLVJpF6WJJsk>se{9Z`H+3sRU=k4`ez!6iYnH7S?5>P zG+D+j12CfBD;lfrJT1HmDMQ{4p=evfx_upS?0G3d;bKY1KMRv>VWmYcKgt@R#%9)< zH2N(Gs|=~d{pEOgXQ)Ie{(k4Ufw!JLC#Mu5g$v4;tB?psRW|0vH2gVOd*G-2RcVRp!n5)Yz>W97>zRrOtsw zc7IS?zk)I|oFg;c>ssTwz)Ko zXg-3Hw2~Y8dc8Y!M(jkVZsvqraeo1^dJ>AP&pjNiIS?F@vG~(bxtL?p)pI~YvU5lL z;^^T?OZI4Iq~6b+_I4}%(S|M}mFrOcx3Y^=P_LS-nwE`uw)R=ox}Vk>Cv^P${8NBnY|nVA_2OG~PkFGF#ur87r2FZE>6*qL60ife0=C@3g&bab2uOuN?W zfOEjX#T7F)&b`*f6*tG1THKp!fNy;IbiCBd;jjspNR>LD=O7Q0X5BO~IPnuNHxxIU5cXor~q@a8l%r4He5u8h7O$Zv ze4jDTwq|_B$1DE3sYky1Zbqr;y!sp1%u{j9LV*9V$OU_pe2(zKrKu7A0Y<;=$x^HS zrpv7&(A65cZ5m+kO4=WynMz4L0MU-L#uu zyN;x+rPbH$ef4v$1ZQa;^F_nqtk4^Pyfsm_g>W=65M(Bz$+;HIA9+=L)=$vh0{oNj5p z&yB;5aV1^ZXi8)r(jXq(x+1HyKU=@dIR|jokOX$Q*&z8N3=DuIci4Mf`P014rp=gi z>b`vX^Z)?>>Z0GZ)7DIyWuh~Gf+&2ZY@&DXQD=uShl-|Vfz37mVK-1EyTN>Lxj8aX z72a2_;AkNc5#u$CfQlf=Ri!EBw=Chb&)ziEvKZVFR+trWEikaIMjw_Z{rR4MbNrxi zl+$w|cK6j<1*SZw;YUr51QVl+T?;`5dz*;B@Z1ic4*WN3wu}wwQRC!;o^(hhYDF_! zMk0V<#Bkr&aor3X3tS=+9!vDwSTz7&J%0dXzo%kh!LU71Y}6G_q`NlP?47c)VNOL& zeKo5nA%S#ydKyk40_K)qukjM-V$g-A6dt>yDWj;#a+ z;7{}30}oAAMWwYZ5ThE|7jy6aG~c>XSbTA^CCBSC1_U)#n`6Da zfZ`Uea)Wo%D@q5N%Ld8PF z(1we;DST7G-Op1@gPNrOHl^m~uF)@kT5Go;oj-a}Wie&Vt);CE&S+}ab!oZb#?o5U za|S$t?nQh1i=$QeF&6uaWFTH(@+>ub&=w!|IxFV0dL_#oaWIze>_AjEd(FAF1B^Ke zTty1L{lpCI8>wpE4v(O3Dx7Gl7hP1x0Qb`McO;@W>{WMnx7GOmS8ACfFrE;HpwQ6YrpKGZd&QG8Dea5DthtRi zlB#absxq3>2PLqDI(BDj-#570l-|sV2Y>vkBGWOX(Hvv4WA?l1YBmzw!sh}Da~a-L z1T}w*%sliN3vZxOoAuT^8gJ(bFg&h47}Yi{h@<%)zsnNx9#4aOLv35MADWu#`TUsV z1rw9;)!8nokY{XPU!SlM_?t#pxOqnX%g3Ki>sabVap1cbCXaE&&!Z)^F>&>ZsrCXi zP4bO>x$0S6G$@-v;dnJND^esxK^bsN>i zkt^`|=CLxYFkYX3b0TrZF<3KpYx{FkmO%VGC|?6Q+PG=W{ij(`AU;p+p5x2meu-GCirW@mo_#b%;Jx5%bH#!Dbg@#y#%@#niV z2vo_}{pIpJ{29*SA~`tlK~hyRR($kAaYHEswfYH_V>E@sh z0+@~syMud!KgEORFY2>}K2L~qmQcSz7g!f+fCbLP!9K8}R|3vmVTqwqS?-23j7GX5Z#qI1#BX8P>G`*E! zWq|50k!Kk{-+n}i;@`e#03M=N;PijksmIZZEhKq)X(>1|a_#!!7&Pty)5;oa6BAlc zNG4u($Hm0~7#x4N+|Xj%H~OdCez6U4H=iec_|1SRr((X7C^)R=`g$n$uhA-s9vZ_v zEX=)72gyUN>OP?W#_G>*3L8$pUqM8=JEXi|CXa`m?l9W3TT9Zh?Nrrw=>=?vEGYbw zUoULiyOkR^$Ao#@3Xard>zQwC7NysqSlud)jEq!$t2{0in*Y&t%`QrQJkn^jnVzzF zQjyV2<>f;_|9-A~j`pe?OK!gwCtCz`HoNAFyuk>gXH1$y%MZgr?IX~0{|MSzl=syc zJLqf0rTko6aS3{!A(MI#1#O@9&yT^u*N#^Eby|GVIL-c;k9J3pbf?%ghYXwVIEZ*3 zc7XAJB%Be2lYQsx+MsJ;XSWW>KyH3M?5Dkx)3MNASHt7%&jo~d?$zOv_$}fcBTr7n z;@whY^C!Y|IDca?M)J~n1s~t#D70=EmxA{7Fe`VS&-QNVOMP!jiFYAX&I+1xq@sII0fJzo)nrO^(blk_Zv=H<~D8X8`ce#Kc5n_OslYGPs{pUC#H ztgK8_7nASvgd6s+k?Qas6~-p52cEX5xNq_uCg=1V+(zC~%`#Ksc3PpQ7`xW$y&LxF zl^o+U*LMEWQ14FrO&@o44`yp?nSIf35uh+D)=i+NJ@l=BnUr~S-23yojpKghqt%i4 zNaexZ=hq{MP{G5McpUZfr}yM;<9E7ioac#t>|YKS#fpzml8qk8O>T5W@!kiz5&7P^ z$U;SP#k8o(M`P<7MsPYTEU{njxHrpi@}BiCvAFC#Zt76Rt5cDALNJ`J{b{dpmwZFIJX+8Yv}hX8RQbL(-SHl{oprkRP@dkA~UVw+1`DZM=}t zC{iz(!4jR4gf%8=%*xgRF~E_xA{K3s+i=V^CbF=c$0b8f?rnFjWN9K8B3U+O#rueI zss8;jza}R#N25;_pLAy{e=14Q%tD#NRgOlP$k=;jBM$3ipem4Y>xFfQ-E*OU^yg7I zLMSFrUZ6HgubEqB*MHA})!7V-*<8-eK53gEz#Fz;w2>Vho43udd3DOhl>SpmS52Wi z7fS4A$3yriA-kW;%Arc>NOy8n*pSU`v)Kk&nQ;hcGVXkCkAz^#=&-7&RDnQp3ldy7 z13_~UYxxi{T7^D0ayOzSMHQ+~$uGTIx+fTr5gm;l)8%TDlqlToh9>5w_VZ0?<)pBH z*4x=)nt7Hv<(LboVcU_H+4o&)y0&A_tyb54qb4Ga^j^0YEl@-0fm55fO_6GE8tc8c z&U0i)_YyPi+fV7{oHsU5tXRA~+sR8M;~39#sy#-lZf&{VbK|C|$|Ea{ zI<6x8tS8&0Z;Biiy0OWKk7eVwD5n0Ciu59#JN9(Q=XoXdA&T1-+R%Duu+r$ryTEOX z{hGu|NBlA4@vb(hV_0htDFXUipJK|`FNOvSzqnj)Hp@0;GX5Vv^vKWNN`#e>I zfb25SqPbZ+W2;RGZ@86VKE5HEFRianIykVe5BY?XEu)wp)8Mv$wr%%F^vxTL4<9~A zN;=!h;{$aA5F9|JB&DQI>#b|suc~WmF1dbXEi;~YwAK@{w;jD7Brw3j`}*}OU^#!` zx;JgW0Wc200psK25$E`44cLYzCZx5sQ{ar~9Pp55iE!9yIbC7ahIrnF8k`0oRsiV80Xep;9alUc5u7ln7ibt5+c195ru2e> z7paN>lZ&HK@TVzWkz`F`H!f?vsrts8OOe;2;50fTHdW65nKw{u$^{Jo=53fpn>gAq zMY?aUI2wCm)tJtozyF93pRy9B@_DwYLC@&@cV?J1- z=nOw=qgZMB=UYe<8~v9^{%=b8Kd=0M(LjONNQSq3>k-%kC66y+HVvprog8e?e@G*L zKVv9S!tU^P;q!?({|4xV3JO(Zeq|v7Y$tW%c{M*Sjk@B@qK&ohi-(}{b%r@T%Thz0 ze-&LJ_6&!fXcnoilG-jydfsXuVr-+Xkj6i?A^?pYaep|n%%zM}&2eS%zI<`Z7$+t*2d7 zP?RdiCvwj=EVmGYU+BG=qN!}C&J8{L!5r{(QUb1OY7b=`?;PV_Qm5D}p#J&SQf8SM z+~}EU8|!@RGjh-rRt2WtlkYqSmJE%gNDDwMK!isTz@+RDLR(qqu@7-wqH4AR{i+Yq z*-4;q0G17EV)CTOuFpIFyQevQ%VJ0Tvd7qGEj`;Q%$+stsw)&#o$LcTmEIbXbix23RnOjuO1 zJR=Zxr_AtUbT=yad(K z#d`IQ%iJOzxcYS85poH>>5?Bm;E0`)b^%f!YQ8EX_FD~& zZfLbtL)v=Nz}0@s!m7(lX69XohITbJ;TADMnFjJXTIILVmo0tusvEtMvhOCNuE(Fn zBB||7e8oPj_o$r^K6-j7=r$AFeNtOJEDyyp&d!*b*`QzgII)@WO4PMEj%)N2epE}Y z*)KaKH@R~~BNhyGQ3;KI96w~-veQyXmc?UWW>+?8H};wen>&4M&1To@f$_b$#gxXQ z(;VZWO$iHlS~T8wdpJKs)|FS>nw+uA$uQOHy6!uIK*DYPoQsR=HEsy1F0fSSVnW*5 z#DV34!0UPP0s+*?LE)=#;GbC@107(y(nnX9Y`+Oc4$RBLB)#|Vd;iIy0)c^n9bH|P zGh}}NkC`s};6M1vmwx6W(flA}XUFMIYU-=J4$+Ox%z0=*z4mjrYHmk#zmmc(E699* z!;H*Y@{k#AR$V^aTXRA*)*g9vkj(n|%VM-KQn(Ub{lI`l%4F3~OQts!y?YMd78g$^ z_4f;&H2CWI-kd___5SGsE+U~O6P!f$#acqWa3T}`(L$OD=gnG$HIp8_=>G@>y83Y# z-=vJKXJ4B(Ub^?aWSjsd;t{EYA{y;Xv@wPsnSiUgn&IGJB$>dT2c)#=jJVQl5apKv z8=J?G@s6tixFw%Iqik(&6N&f;qWB}m^mcTH5mfg%{~t<2jrKo@K=$=(1cQGf0q=`J z_AzAsX{><*AALn?>+A*-qrGQ3`s63F$=-3!OeA;`&f(~DA77TH@32=jm!luaZ+RV) z?yY&!&bxocL0+xrgGwdXgkd?t(WT%_nzrIq15(oq)quvuSYsrEwyKU#7uGVTC*l^k z)0GNo@!RI~D!#M37`j?SW2@qejF(q&X>(lPcWt4W1)IN<3;&x1xECc3^+x*&hf(A_ z4f*Jc)h7n_8kZgpP)Ho%m8Y4Vyb;YXDhm*;V3w`X;+w0ozyspGs7${EU^(Ds2tm#c zGVU%iv{EG2<72W$x(;?K2hXga25=jIKMgom1qzkZ)UT!)LXT#1WL?WEL zV>GBDA-umz)ST8m_jk|YcfwFd%HC9{shUDGlvoXJc}Z0B*RAio7(JF@ZdF3L1S$vh zWJ_ir^7S-etvD&!!&3h?x#|2?Q}eZ#*L7wp(?Y!y zDyTSTyE6?ZKCmE>bfW@b#d}?D<_nMNd7qApiG)l%*#)%&d+W1*=RrwTAf{RQ;Qm&u zwRTU6$XLv-Wb~ZcCYYzqYU)u(X?ix)58vgx4TPqBpjtNKB=Cb0V@y{D$tBOJERr?K zm8M0j9rsWt#58bvM^(BNz1DS^3?qkpZ5pU#u5KZLZ4XoU-;qj$7YB@6^dBfza&o7i zY$d>2rYp^^Xl5Qiehk-bqpe~7qnjPJwUxkNE_Q)C(PI-6!et>f`E3H4aeDcqvOYe- z2#o4K4!*yI)P~MBdpGn;MK!S}$%9){+;Rmd@Qv`A{|%{x0w|IsJhpIC9$KZL@2$3- zKq0@Ft}m#sAh?mbonl{t?TSy8Xqd6kDXR|h5%l9KF*b@jBP_fmT4ROIdYg*pyhx)V znj5b#5Cmwi!WyITxZb~ln061g#ij?<&mvQp8EHK|p#Q7kuicxTU-Q?wS(BYI3A4~U z-{ttXxJC#~{;0=qpOTpmJ?a$=MBizLWNU)fDGq?p>=$W#Ra`p{|EfpxzIWbw9;;8E zJb6+!ZLPK4)<_tBeQuke$}tR=u7U7Mn;S!Y~6hPoZ5>5G2^) zU|cXu{N{T`Sas> z_X^KpCEGWoIXZJo0rB}zlU#31rs=_3S}CTY?+=yQ+c5EnG(9!-5fVjEdW`h6(kI72 zo?((LP?KY!w^PuU+(P>!NV=SHQjX2%r|+^%M{x!B8gC?a9z_soRt?(O$5==GiQ6^H z@SZSx7mPZG!P@u>vftDV9tIhV3Fh|kOMS4+&rgvSx0oSHTqcl1_eSW(QVCy=a61@c6CB2P%cj>yq z=4!oYy07cYIX&4=mNL#_zZJ?EJ!jrpJU+x7q?dlz#R zd2h^h7!cb>)rhn#5r`wFd-m@e$lRlSp|{e2@qw3Z*uXsc|NRO@FcKu3+BTj0il;g= zhqh0_?5+P00Y9_PsfZ>#>Dpy)qM7061t&=C?;gJx28PIOs060d|In?!z=yhh{$H{+ zLdf|4#-;wV4Vi9O7^tv`gryl8!9R9Q>j9fMXIj4nu_C_!hWnj542TYRp)jiKJW|Ks zuS$J?QoJ!6@mYOd9FpD*(i=up$+so{4Y@s}8JAF*CT@_K30tJlP+PO#^&KpZOI3@=Mp=|i8cZH1MSxXvaUiDGrMnZO+mcrxW*OlgJ-@Gp@Hs_ zRt3d&pdm}Ii#cfMQmo#!zbf5(rdXmt{s)X==QjqA}T>#2G7de&Xa_mtbcRf zJlljHu1W|FHpv0i>k+}Q>%K||PQur8F_q1S6Y|G$FZ+J$-A(z^2*>D7$e+5wEyWb} zhg_|}v>t*h7o}*5l?!@79V>>T$$&sCEB4eq%W4?-Me?^G|=kmYPi4(Zd+z& z+?OxEf+z|f76YF^_;Q2V=O`uvnYopX5EB&1OVXl=3H9WZ6czkH092W4LPHX778#jGlR+rpe^|>mw@vIP7oH^Bg=|i*$M?ZJfK~ph%Z;-_>u1t zJIjcQ)aI;vN;=#i)P4Drz!C*7b_d z{%@+8oNR7uxwM!2EdZMr>rj*^L%yrql*L`4!dF+JE83dl)3bNx$s7VCC2B@6`4>E@ zRmOb%-P#2u$MRLcBdahA66bn%B4ZQrFh0>sF+8s^c4pNH*S^NGu=m%i_U%~k3|8MT zB@RL%daTHTM?KVVSOUx-^HGq>gx60(5X8ix#t?${3fo$sT-w+$FI>&T+?PV=;TScO zuF|z3?Yn9|3g{cc)n;|&KKmg?*!8LXe!wZ0OlAN>Rq9UWw zJcTjf^mMEb)=5W_$~rl50v*ZEQylK4vb$`(d-?LEU*yZ$b((J_C6U!ulhGhZ1DJEQ zyZ`1yu{PAI-s5;JlP+dHRgoS*>BXTe3E-50G-sCI4y?SJd>LRX;ciNBP8l~lW?DzO zAPU(8b8>Wi!OVOL(E%+pO>vU;yI!L^I~dUukqK^0>2i%C7b3%oIvs8bmfN4#9Uv@P z9J3;p9K|&Cct#m2@~&C^TbdQj%MW84RSA_L?YeYs;=(sJ$t|-hs_$FidIH*$q*Hlm znQU``2qL^nuV$eN)r!8Gr#0iDTp}siPqU(5p(tN7mBu`Qq4$Psav{QKEWxN8RTv0G zt^4)o!h>dAd#;-~sqvy!$(mWai2Z%BW-)!Q0;}QsOuWhp!8PE@rp4T3TlJ<^X(3J2 z;9gxzpYpmdy;u8WX9@Y3#t8hk599N9@x_6N?qvC8bRs1E6CPPkpJtRmFd3dGdV?=? z(*%@Az`_7&m#4!6EZlmk>|>Ph0Y-pX1F52S|5Xk80 zkb(e169fhd$8`YsEWCo0x$Vzq(%1N&w^O)-(#!DT#dBfdbUb=RWam2&zWe}eWvvk? z-*oNFEPXG*AP!fzff^mTgZE;LOOk7Y}I@#Q&C@cG+EdX8Y=8~UK&>PB~qEMs*$7dav zVBiA--GGg-ptzV8+~U|+d{H6W!^1;pEo!UbJ=uaDqgR1^;9F&7c+M66Smzt3^KFcd zR(cV47eJb*@eFDO63_6YMTuThADAE2ePzSuD`p~BNfUTBl@IqM(vp)4$?_j!JSzhc z>r7wHrMoanU?_RAY;}h2buW4(Rq1cq&2(u<{+@eKZ<>KCw!g>qofyjhVU#)A6q&f`8D&ig`p+8F$jh=&1j)m|;3E4%{(mKqxiN zE+NL~Wx`$zD}7+nw`0xpt$Od)8qW$L7$`Gkr$5qGz}uDMz8q(zMOin+^Gf#U$Z&=vERdtb5Yl~0vU>aXlm5UU|dR}SGo>9k|Vt_ zc|~ktZvGeejEf+-ktk1>aq%x4@$h=7S$V|*FC;38o|{`;fR2HIL8rkr0yH(tn`!Qp z2;foL1H7DJ1E$dQ`jRRxzaT-Zr?h<%zspOo@5=hRRq1jpLu-AB*+1zf5n!9cX|oJ4 z$nj!%fyk@mo3h3_u8uwUM@OIgltW%0{R5s+@L6&;X+ie;?R;{HZIYDWbSo-;>>e&B z9)dQZ5FX2`*Sxd`v!pifzJeAptk#KxTNw*dtff~rL@vfXDW5Dt0zWBXWHF_zHX!cD zz=IiVsy6-%?LyOvuj!VxxCo-hZmpxH=%dSH)4QCRNk$7JEpk)DEdw48Pd{|cd-`S8 z13&8AxT*-h52Kf{e~+-F+>74AhL1;Q~M&}S??K;C@%II_RlZ3OFeeVyQ?&E+q!o6d#QD|xcX*QVlcxN* zRh12krw;mr7nvv1SlC;#rt9+_SL+Y)zedQCaO&DTegKFy66d+e4xn@ttlQ3us}CR5 zYR&F)S#C$I*5=O%trD>Ll71PwwAmW_e!b_`vJ6?c(n~Pr2ecBzI?aoz)YQ~;nmotN zUImD5du1h>y%zTk3k!o60(dJFyzA(Y1oszyCxgSo$MUAFxj{tMFA{@VB5P2+K#)Eu z4YEF%A%dNm_KJ&}8^puy`O^}AulaRwgUSLITb;^t?t?R&KzIbsJRsvbjqbSlqap2! zf5C+JiDG=t^8>xkDSybUNi>CKht8y(K*$T@E_B=m;0L`G)7sMNfCPE+YCSWzV>fjSmf5{8(Rxb zZ?1__P38TlaOAMyIvyF}r^{P+9ND_1Gt|PW-#qR~$&e-|T3K6)IHaO1$gP8ZdsW%=NbgHE{iD_U*vb-i7MWCgli^T2l zImmqMK`7zWG#E!+UA-#+9S=BvB%V)gz)(&Ft7`sZ-R*ti2J*-~UzJGuKMb!YHcfg* zj*I`7iPu$)|9_cyV1a<_sR|~shZ1~|kYNGwK>>Ao$Lo8)32m5@f%*~r`_UFrqs=k? zKfOXCcaaQ6m6e#LC#~NYBBvkF>;3d@Fh?$Om-*WtE05(BCOyR{3{m5>Gn-V&iGHGv zQ?>;jTal}YHhLM>EVAluvr0#wmqUK5G1NMa&U&pqxq+-PhrxFeMS|rCBX*upyBFk~ zZpQNtZprI*%^4q&O-ptBG>rASe;hYHzgTQkDW!9bEow4>>%tf~rN_5mtFTYGyF zSm6QhfL>vp;@;ju2n%<&Fj+adN3V4NxEak?a@w9?MgVw2LRwlnVb#*ovY@cgaN@^% zv6dh)DXE9uQ55UHc@}6mI5-N*5kLUjKjZFt9SoC)e!f?=zD9sqibcw)0aYGM9K=Lk z2db9qRaPPaSL-i1M=r}oQ>1K7iyMKeMR$o`W`Fw+VHLSlm zO2BZp>cnBc?q*xNUu-qUKR?c{iNdN>Ki>#?QGHf4AC+X6y2ZY|>5k=NuJ1fu3u8a= zxp{D*b+(~&S8V+8L5p(VClc8xU^v797{>@Qi=o*s68P_@6E=)n`*z zFi~Fb%PPmq6ALL7eE3^^hs)h@fd6Hf6c!c5wFhA{wp`8a$4*R4_;rlO9345XQrs?5 z!~%T400bSe2>8bU9`D;OZ7GRONVpOdc36`9LaiE`oJ_o$FLLu8m^(QyLbJh|DshjS z)5$pPTHA+w6Gwyb@QCo+0u39) z#K1DsVUx9zV{ZE}fSyh7n)s^r7xm-oam22mId)f{;+w)+Ba}P0_KyxnB9?JWV-)gB z*LHVNpHF!2T44O%C~sAtykNd5x)jcdwptKv+Zl_ji`2`B9?N`JeRtg(CV19|>r;M8 zKsrqrfN;qGkQ`VYVHE{Nic0gv8cA|;a&SmUR!vR3N{%#qMWLi5GUypzSG%<(HI(56w?Uye_e8(o~1`W6fM9QD$J62}Wt3x=Q*i-rGy`!m3)fhW3Kv7}VB zwcmhjg0c~zvg@*Ay}5;@c%Zm2$DyRgg*h)9vSJ2$+&c@y9NN^n++V zMTiIv*Acj+zA7==FH2Qq9xO{x*Oic3R*;y-skt1SyPtAhO++G5`{HfmC3-GB!R!@T z&dV-ar0}o0gPg33+$8}GP&$e{0&vLc>Zduw8dACS3kUMgsgo$^Q5zMWvSI!TY8$se4T+`@% z$dnrJ!U6}(f@}~4VweQk~zA5o5zvP1q zgD1Z51l95Z_sjUtco4p&z3s>5E#$M-o`-_^tSGjP^eLc&*FWj~9b$U3Wrw8Tpr z3b6}53Hw@#gs-d-^#^S{a%T?!0npw1K}7!I7S=+MF7gH;OUqurNfi;;gONH z-zhxao>j+3NA4iMjYQn-#|RZa_g`4hj_c-i92RS{9_-Y6JVm0yDz9B19miOi*g+ea zT5w`Vs{6{|A~%+QndWv_z~Uw^){22~e9DwwS>qBt-cN&=kn=%g_s`v!qkxb5qeM5G6l!y+)7 z#~$v%qQAb8@psVqoDN*Sbl+PK)8EPW%W}VeM|XXl93GBYQBeWF(#px^=v$fwR4_mq z?{2RW<@3JqGY|^6GNEFVuN*A4TQ4-Hg@%S21a(A^@YI2|GjuTwQ(5PAF5Az5k^@rH zU@2Y@Hbq`p8Qb4(`Oh#siHwHib?v9>jG1IPA{}23-#zehium;nx~C$zkr!>7+JRa8 z-3=us9ILsRxW^O;W{y7>`6VkomnIjP{m?=rkW{dle_6nPW*FXEbP9*DAf zT0cFkibmD~8jh$aO9$yoLD@49ZAF?lWW!0nUCvMUd|BY|iktf_Xr{i`-M;7YzK5Lz zKrKM~ZigiJz}q4BT~+7MX>p*E-1h6lxjDi?%c9nDxzg@$E`;5;Hlj~5`|$SUT-}x# z@+0Y69YQM8r)F=4KGv5F&h;Ig@1%F*)!sb~Iz)G~b4E}jchab6kgZVdju9nW?+1ik zDZ^Q`aIcA?@^gjK)V77}yfT1T84(%+>c~|TL&7L;L&RXVWwwc55qbi6wo7p zN)1JOk!=Tbtm`$NmJguhQYIKL0Aw+#@0&)#Gxky*)K>yly_H`23`|R%^sib!)Qcw4 z;Y+@-D1=E*Xc|C}n`hqLzpG1nw|v?f>zp0KTB_l{N^?pHnGskqm759435nlq9&O_l z)dmZ-1Y_?3*ecy5*hkTX<0t;jR%>qVyVf9qP7B%oDt32^F9-)`1^62V) z|FNNr%LVbh??nJL1hzEaFc>1Ybv>;!vmGK}FTo|;1J=lUz&jDZA>6wFO*gx?C+FtU zfF(kF9!I&{tjZyK*ggkHiW$Pc!BPPPu>Ss)$ayRFgNpsEzk|NFobVe87S#zqh5q>Q zBXdF7Y-g$*UhNytm%^Y`pFVy1QpX@)a8z}By&)qqlJ{^qaT9=xk@@*Q<3$>>N=o}K z9|k9tVY%?zoRDp#8iif~mT|YSk2c;~z+y{-L#G2-Fm(3GbGgd%S5f4i>?-4vk&*4- z-1{(lZ{EKrf-kgXVq#(|rpE0o#SwB~klV}COK?i&Zv93g=}rgIo5F5fyD@S@7L!S1 zISt4xqfK=GmXnE}>l=7h#i)-?j7h%Hr*5I4%Od?Qw(diyq8b?;9ROmUO&5%?F(9dP zs8s2lfs+ZLgx=t}{DJs4{XTZImDxZ34`s;oqk-CtX6$X0?kW5y!G%;HbN8^0qpJYj zeVzdmp_*sNq{)v_MVF4FJ77=rDM+Th(&zKD-D8xTIO7@&o7mr-BLQJMKs!2a(92b1 zx-#V-=qd(GRgg|x~PGq=;_ckjPbtECS=$>!9_m2ge zH6a-UYX2CSNZS#Lm`~vqeHQg4ixM z^K12+k$%zDfn`gVEDrz3ii3#w{%5Wb*%t}62Co@pWG^&q96`>9Y9N0|7aCyIG+AN2 zTg4sWD9FfW=}tq)~rWDU>(Z>axjs zLX+jrx~=+Eoz;g_MQ7nkFyn@KX%7)iTYr`v8uE{L!5B`S*nnFA{UmIcJlR8qAp0WL z`NXUt!G`%&4wHgIZBXLSdh(o+5sZ6KVN9*;!`}Z7u_OVsKhCle_0Qj|F z^Y4>P1n5Q8;Iy?sp_!QokrYA4>sd9&i3x~rbx2chLKjyv?)au~fuYC_!iI!k0movR zTc#c~7k)h77)kBm#iaGfdp7zkall>O8x?i2|JV%GFb1k+PKId z<#_7Z+aKuL1L;?SLdVj<&lli`BhUI(kodR$E#>WCqu*y1VR-Qcg9417;O9j4QUWhu z$`wW#4)s9#1|uo3U6Jp42j9|!D9PDgP5B?DzPjZvP1z-LF#wb)yswhtD(QnHZ zM?L)RG3~4(o_8rizPGovSsr+|m%^!cM2W(L9lP^IjAaF?+5=lnU)cG17tiY+Qj`R6 z?gdfeYUC%rQfj|Drt3hVrn5`a8?@53iAhl3WBDpJ=W|ZWEMQ(ds;QRnGZfQ@($wg~{Z@f*if0 zeXuC7g)ZyBZVf@__Ch!_=pL^HUYyTy$^siOLH?l<(}iYlKv1a*93qIhLiKO9G~mCs zpw9R#Ebzw5ATL6%Oy}$tx{yP^2<(g%hOsOKi z=>P_0c8>BL!oaT|pukx$fJdalUWtGzqFxJ4s#^a|8A6e8ySf7rEec?WJqx4F+!v6o z>MT3l=nql})o)d$_c;k-jqaoNDFBc8BR(aO-5>e)JXF>7#aQ zWP889H5;e!l#286BT`S|_yI?e^a8r5EcLV|Ph_knWL8B?R~kQs;;QZjrC2(7l;%$@ z$eek%7vRYb019(%1|xd`yn+5w-<$0(1%Es_Q+^`=Z1-H|0U#~nD)`b->iYY@W_ki1 zkPBm-uK_U$30N}!w_D_v9VECVrKOLSDee;C(tudVI{5hnCf%R-$}J%WXJC)7U>OxT zU|wC|3#u$e&%vIACsW`E9?KCtKrC3wxZTWn@Jz|~><*+Lj`jh>0tbBX5wZYgn`FU7 z*TCW(PZ)tOFIq9R|LTz=??IS>%>U}_EyJqX!ggU41yN85X>cPYqLg$iNFx%`p>%hr zfg;@{rPAHqCEeXE%|huu&%*u2_nmXzA7@`)n+0nv)?~~%$9V2|?lIS)h$Z9s=7-zf zgCNqYuji*HKj@sRWyYr{>k58=dj_R&WZU%Dr;9cfE` z&x+T{&opk92%^Tg>9eoU9{fU_i;r$DcDqACO-gm4FYWEwf&T$HXMTqxsNJ*u1b*a#AlYRpe%l^LoZBkA_ zDCEq{%)YkZ!tZl*y!eRG*VjjWp?2%68K0QAoy=kKyV2vB-9wPN`xmdu;FvK#7(z(W z{MLKwGP6cU-IpNuT)T86|DaG9ljv9}u+e7wkNW6t-t_z3{%aQ~HIb`n9MjjUu$&C` zZcEAjVb7EB-i$MFO%j=CPQAdIiOF`rW9WW_VegqJazgiyp5ve)>c(VwC@7n|2gk~_x-&*AXr2jTEp?%h|lN-Dh}m(b-Id225r?Wpqgs|57g zex9IdQp#`L$MZ~%yC>TMskZ(ZULA(N%h1Eby%LUFU%Yb;w$5c7)aOY{eqioqk9VG% zyE|3~{cBGtVt|c93aLe!_W!_$BIOe}+%+i-)=#8~nDuH%oZ(pKMKLvdSB6!qo@sjydN};AN+?p|z`9IM)qlZ{> zbShuB=NT=f%M9Qx!s4IFcF>JKYFKQ|KWn->hnjzdHU2}$$=j^y_mjlX?*6$*!vw79 z(8<9`OYZaix5BN>TfE^uh8p}Vr1$Xff)WyXco0>IW1dSCxrt_lV=F5wb^3))l;q3} zg#IE|QBjM_-*yFe1q5&GQDN4UeqL)6_ohN%*llj$6v#b^vaw&$8n!O2U-D+mPTW+s z87m+DqoRB<)BeZOnS_G`XIM}+gys3fVSd5QHXifMY zd;Kcew}#>qls=@g=j=7q0wFL{5xXagp)$%m3VSeyT4ZWHg8SL(C}e& zbaZ!2V;V>Oc6ie;f#gl#k(5i#$ubqQuNGBWweBI=^VQYWZjyRkJ-s7g_3GxPraaRz z7Et-GEPZCHAxvdNQd0&!@pk*s?GqePEPx-!D=RCx9JWYd$wu9p93G~j9BZIo3`o?} zX2Prq)U>wQ3lQ|X763r5aM7VlKY}I z7R%)<3Jna;{giSH#?0S|a7SO2EvdBV`GT;Dr^N6w6*zG$lU3~2g62#l>ydne9ei2TMp{LGn8%#g3 z1QJ~$*3Su;W6{+5&!z*^zo@nBZ-$s6$$sLUY~sxo<&6l5!Eg`MM*{WyY!LxT{tT2; z0kY=H8G51^TcwZnzOfUuXgU}?hDkC!&cF}n-G z-jA!3y2J%}eS?88Yp`%x#Mb6i*BE+Hdk)x$?0ViutMyk{O~upVdV}uq5J2=3J8# z`PJgKIk6`k>XmJ=8;=h1TDaYhbJCmY=npHyybcY%Rk?p-NB?+z zNUuaXdDL5QX_W_Z`5Fv@$>p!x&z0)J%q3l#1A9dcKPV99=-;Qfu~ z8}zB%(;OHJpPwhYyVS8e#L)>f>Z^ErY`x&tRG<;eutLkK3d|wUqk9G!aqRFBbd=C< zcg>7e=q58tG$vgWQ}T#z>wBr#w5&WzT&hoZi3bc=k^nD#5BDXYpqE5IzZzxirF>>C zjedKD?EPJBPk>T>kCz{}_e|2!1!?#35Wmp8iN{uMVRBkV+pXo6C8PdrH!^jB!#&I5 z!pSFdMLM#F{d)H*wleN%#z8*W#9-NX9foqKoDm2?~+g0JHK7#KCJp@ zm+T=uz0J>J`%TqSL{2Gk;SBg0`1Z`B@t1mQ*Qc(Pn5GXQlczEWf9Y*4i^d-NXIl)j zn>F5L_}waD=WE%&bq+^LivvZM=yGiE5BKnvY`WlGGhTZZ&l4lwv(@Jg3ySADWnn>@wnrpt%7|*eN6zCM72~ zmuEw<1r0KJwySc`_1MPT|Zxc!?h4Z!(5KA`Q~Nc|uy5o$YTj zk`o*mDGGJ~D08wjt5pX^!8)c~Z2UT5b8Ku31@GRy-=G7-0-n3NyqewvG>_wIa%8OA zYcP2t6IVh)LO@FCd(1B5HhjVp6dv9TDivET%Jwc9QU?S*7Zx6_o_sj8G7T!nk5uE@ ziw^~EV)WFpw(J;**U9>aG7qWf+3wt*@$%G^_D}t`=pKcQ=2@RO!GBJl57M5O8TeF?7waErc3H zSXh|JW#1G?F*a{WGI3sybKXFpA8SueH!VDL>OWln+60cf3~eaz(Fdjq$H}KfQJHB0zVRt?js_X3Bj570LGDrqu==|XTzW~svhKr^xWJ7V<{nt zB7YGe9voI2%#EV__DZ-2+~WrwPQuaN-1M^NOVTuFwz5= z>-41df=5Q+%r>C}di6nQlD4$WOJPn2kD@5_>VYlMW&*m@pk($nCqO~ni_U-x7#00C z@&bM?B*f;MUCV##_H7y#mVPHI6%`eXhZv=bXeYPJD(pAEjxb*R95!_g4b7SUHgkiK zwfQHR_aUV&YX&{{9trGlth|b--;EEplfh|lId?I2yf|^{D00WCKQA#^at_qmHJCj? zJ^0vJ+9qBfvRzDfG;3%aE|f^^lK9P{3#Xp55bW2v*((BAVIa1`LBI*@Ex zD{m04@Ie04r)KT%RaK;~j=Qz<9nT0-DFO}A(a}3vOUjH``BGD&=L`-Som-NMWE$-b z%hesHxNe;uKQv{(Qy!CI>zQbkkK; z8-XAoGjItAQdbT41qb{6!Ilbh51i74^5yt}Dv^m$sI)=&hxz0l%*()j5EhP|T$~@> z*}HD6P1TfFw9TcQ#?N(&t}gNT^fBkRkk9c+^FBZIC>x`>S1oLEN)mqx{oXW~)e3Bo zzk|ttb4%L)expGAdtEY}m7YNTia`5|hqvNK(PrFkyD!DqO~hZjemx(`TYJQ`w2e(+ zPTMOdCoT{nk*con)%A>nrWUZF@BAdOc%`M4ySm6P106Q8iOtN+%#d-*6{=QUTv|HN z+gn$l*RgxMS^UX8tIfibt;#^~nHlld4~0@oMsO~_V&&injgQ~jJ14OQKJZCm{*|)( zKi9~_7Inks;52VP#=igE-g+VlU#8_R36jvR{O_bVSqM&H3wt*!Xipw zl&TWDyWDocrslw@B3owjkhgXjHDS47**QX}v+K2@(2-_}1=ZLmrMWe9hMob6jh%Co z3O8ZIUV2PS40Hm3FiD!u-^+sI933>N0Po1S@Vk@K+NkrNMA6-=PH=m`jIcEt> ztNmd(6g_6*M7WCeZ(3TL_XxLoy)$s5EGH5J6&5BRR#57ZK3HUUF#*ByX}anzz|kg~ z9=;a9`QSq|n0uaFVgVi$ZqZ?mlEp<`B!9WC+5My6c&zn1%-c&x%L%kRJQHIEu$1k1 z%f&=R5!UQwTOjk0O`PM2fX3RKnwpB`ad^3-lKC97?feW0cDAXgUm$KA8OU8JheR_XWdKS+NtyN$@`EvgcYaMc$8+7LdHnoKut6*3_;bgPv1-r1#LTA( zeA=AYL#7xb%RbM$^NLJX4^H<>q4$=;wLJ*xLBKZr6x^yR4Hjc8dh>~c$S3?@Nk3Gs zQAc9B_|_?cPj?$A%_K#Qt%>xU+5||&i4hik2o0S(THXr;HsC5{4jxjm^$y4L6P(ko7IF!=zc5D2( zK6=8xQ8?YGY}==&Mvc}XVoFkV@B3d-fg_Tgay(xkalknF$?CCvDYaSC_HrZN5@pM6 zoyoi}{I}}TlWE{!QWQQItCyzYR5i<*&&yfk1jYDxpalglvS*mJZjL!9Y&B1dB6A$T z;3dW?Uc|FJBeVQUlgR^{T~g*q?9CkgXvh|#ctG|;YHri{_i)IsLSl}o;^AXHzf(W> zcDT?b&wvWs6_Z=udSx8N^kLH8i#2i#|)E{m9ao;L z{qW{Kf?-YGxu3}8zVf47oqM7iD$Hv0#FguFZ^&(sIzoMy{@P2Af~Y<|rB_(U!qilLVtPt_a<- zc+s<6Nr9O=jG{mFNBGzGoHUgtx&Ip3r;m`OwaHAii$ks1^x))VC)lv#THN=Blpv7^ zQK$v0KRh7^3oP_6JuQJc>kgN>h1FRVc%ITTGOSC0dfJ=#Wrn(^f;e+O9!M}Ip4i)u z9zJ6qEg!7Z@I|Ed(2NT+Ht4%wM~*7~%Z&+sk6^WQF~P0eDG6~;%ZzRcCu`z}>4`v7 zAno=w^B_`=u7=jX71Lkd9~0G^vC_iVk>yV1)b!57wrea-=WREzC^KnksY8m+s@d<4 zN$IYs`)t~8>~rt`aD%aU`q^_=lSFcqmkY~!EsVc1NNQR)8%K0$)JAf!Co8Hm64wQ1 zZH+Wuv8V8s3&oyMSIEy}w>B#Gl1T2Ba)n4#qw167T7;JaB_%C&Fz(v&(7Jj>PMMvY zqM`^WDfeBsuRyg9b#*?Jn+6YL;m1HwA%6@bwJ}{C^Xr#>ZVQskgid+o3R`4t4~6`d zpt!gx+Vj_$icWmwN>HHw8-)rSC{oA~gx_)f`t=dA(o$$5=vO5zf`mK#`ctOjQ42G31QUzmf=c%l6NOYJeBB;LhTY1SLnZ= zY}~R{Z{cyEGE-0_`)#R1YGsl>6Y2NXn%IUzZ{LWXD=dJ^06jf4Y#D=OW0Zr+5HFhL zYviE{O*HECc7bOX#;R^amS|>cSYMY||5jU)L++4L?7JoTsH=k4#ATx93U79a6ic#T z65_lJDsS7EwoD4L9q|noPv@!mFMTrEMQH5tQKSnt+P55naHk;$0`L)N3O8!LTSb+ zx>>8}_#a+?T_|t50A@L@rKeVr2WIy6zCz}7tE0S`9g|boT0)a>=q?_TRQP7mU6 z+stG(&RQ)*6ak|v1gHxe`}pkQb0*w2$l5#5<5Z_w$V#pj6`FaRz4}{#Sx34d>g(&j zl8<Kh%a#+bN{S2#5(7|p>LSSTnk8j%!iZ{kJ#F7+`RdKmsdS7&k$l@K~Lqf`Nb(p zKGY{$4U7QfezpQwJ1%naQIiBgWi3=Hv$!9^MBa=Q=v6c=rT0Md5&TKFAtmW+%R+l` z&-nOw8gz;cWxVd@UYTBEQ2lMo0J*oJadA)B#-AHDJ|9=h6Y6nZc+c5R5yDE=MII$* z{HlH@V0uOPiZRrRYH3mJGd0X#Z6IhjsXydJ>FnJw=DIL_&?6}y#Sf#5eWHvRzuEvU5y zWVRr2{Bj$fDKD~FehH{^*~OYP-^jDv(oB7>QQHV`&uYdM)HHTo)uMNNY(=r^tD+eF4EgA7J%6oV)mdW zZGphOsqx)_N>JcIchGd%EOs}s*U{D%laQDPKjqivA*}@DmIE(*@mG(JoY$W2{SZET zxzcBV8Yih=7)|t4AB72K5B;9_E;y-G#DP6IiBCKoq~Eq%ugELU#;&At6rVeJO~1#K zzo)R_Ro-LFhL%A!Mr*y6cR(B-XB|mYV>zSNaSMf7B~CJ5qY9X*VM@Pp5VMPn$hBCnF%erjgmnZ38k>}|wBktO#0Z5Q% z_0Fv2hoIsVU^_rlt=LS6jotX&&_j|_+M}Q<9YDIG4lrUK8i(C97d8>8eulo-5-Lmo zoINRKsEm&-?JtfS<@k2<(SD5hd4z><;;ZA%kgrRmdk1mjV>s-US;guh!D(|;a-yq^ zDcXU1YuGaqTSR-g-ESv4h~0C#sUN#Bsyu14^wV`wU2XAN$oWf0WvP{RFSIVh9n#v< z1N)CegV!2tXOnBC)#4gIO#upgB}F)wGh`0)w4u2zFwoNjkruO@;87#fFzVvA1}}dZ z$K4DXP&GMlIVm|}KNu1sBO_a&n;&ct15|C~X+1~|t&>G1fe2Hg?1@Ru7uuaP%4jj6uLW=6GV2qYQc$wI>Z)s7 zE!q_7gy-@0pT1e;7U%Nigwx{4y5o>?LK>1+{9RH$o5anpHN>Xf-*`Mg8)54ks)-J3 z4~XS`K$ahEv&KsQ@gY}|>r10kSqZ6&WBx-ZY^& z?I}R@0$mJPlYpv1A{!;+fEyB_e%WdZaVq}GX z!`Ci-#azv7lS!n}0YaFlXlX0Wlte#!0Gz5U1~05p0nILqmV%u0T=S71 zJvqxfLDA9T&d%J_)YMW5{Bh7J(zU)E^*ukoZ+dE~3pSw(CELcvx7Y{ z3^!R3H6n9_iRD0tM9zBKb=TQijx`{g+e>$3lttpWNoS>Ws#1bQJupt{WwA-7i)l@t z0r_!<&c^gp%Y^a-udSIoxuWdb4zsQLk!2i-Q!4CbAe4ipA}$c_3zWZ%eYTpKt1B-M z(aGiIW9wFX{O7>cOSrgH7FI)VGf?sHdU0v#-t!P_?n#%~u@s%|LR1^%tJF>I~ejlI#teN4Um;k#9+a&P(tGhY?B#I^9{(oVHcOfeg;o)2-3R5Yc zrV|XH2IaBeu+;pv0hBN>fCdxiXJ5}hPKrXXH~8tlXJ$%{a4G;Lfy{vx52bm_9^vIyXD$0VQ{wy#hhJK!*d2Fm`|cL(RYB`=1Av*o{VcGX8tL_SM??F;iL# zsy_Yl8P>ty?rkO0A%$a8t_)tT{R*#?IEJ=MzWb4 zPFu&E@F)BWrRnui;hm>>YOX%_HH@H)0$oFAh_2)uy*q$ zQzRWRm3Q?E-e@mAj(Y~VZuCS?X-N|dFg{(@HsjMLi0zbT$DKpLT~sx(;`t&3w5SIv z*YBOY-NF;i{CkED$Q>^rFQJ%$i&g z2^O61y6A1r=<^vBS3CaDN%iprOb6hFamVU^oF#v{QxGG>)cXFOG^e;q>1J9>sUCOcs1vil%K=p!~5n5 z>PzZb;TxSibvhS6!y!4~mlp|7xOgD9T3DL$YWet9P)TsP8~THk&QE7X zy6MRRq6K0TxkHREh2;MNjOtQR5fLOJCHt`^zPsEREd*pLKvyJP00Pb3`}bv}rLh>R zcS9Hmt^nWw+an8HK}enJ&K+6-ff+72SJ>?fvSQez4MA^(IJVThydWUnc}i#OC(OE= zz{Kr0VO}X+80G965J1CZ`Ax<2xKK4)K}qQ;bl4_%7k~f$Uf^t1#ufS(q~f?=@01nM zkwsrT@45DK<3(?#dQ$2}BOh}Oe|5Xeq$1~0`N@64>KietsG9QL&$6+W-N&;&jk1I| zw~G#j;8>Y(7DTry+=`~I#>FW9ToO>7KyA#OFY|pcBZYCM(7MVanGC#u?^ozPnT zuyLJ^6m0_);bsDS>FIbA!4N`e`pAPiDPh z2gM+jl8JG(J?#2XXbKCQ5AY}jAYXup63t-|&k%Yt=)4IYeFM5SpL_Jk_M17c`!pa> z=j*h93s+fsL2f;7BwMY8(c?%`n$~Cf5xjnO_RSOn6CcK%JIh+|&ytJhU@scl`CB$=ty59Ol#E(EPXj9(z-r&*Y-p&1U;7Q+q%H?bqQ8*Y# z(Zr0M`p8FV^e!2#InP@6DOyWY#<__-rI;H#t|r5vrDsWeEMChs{zz`s0Nr5wK+VMU z3>FIjVc$Bn0=>0ewDRKz9{^%C}W$m(RZwqh-Lnycd{(P6sEHy(Nf-AJ(* zi5Y(tY-IR(*TR3tST;1r$Xty5jj`@)hR~Y|eo}7H#o}Jzu%Oh0`WB?_@p6r9MkU(d zX{Y5lm;$;y=FyY2{)JH}2XetM!PXqF(Rb+(--a!D4j~}%3UVx6^;sugJ34YgPjX_4 z$b`7#_+!K}OF5IJB#y`qc?B6Y37I$vbJl6KT({N6!C`s04d$;0&lq!>X8*XO#OBDY zWs>d9=7jwTraFB}-k1}?HMGdmZg*AJ7SmpRym{LWNgm>ER5Kkml^y%wep5Nir>rka z9erYTy`^=z!#e=yi&+2uM`|{?#y)%Mx4gmf4srB8hDs#aRDL#eB?l4(w9@q(Z#{N2 zR9}bQ={E@ALUA4pI+!r1Sij)u6}7ug+naj9OGi(y1A4~d($b!I!7~-PEZ9|WM_5+6 zps}&hj{eqa;8$Hnjf%l1ZTm^kB-z?3_Tl44HlG~ik^y~-kf!1E_@31hYV4bAZMT7o zprdP}4K;l=Z)#xyDmC+0a;1;LC+_3O34B#T{IkbTkqY(ogymYnkYJ zuc;HWk8dI&U7~z$v>Uvww0@KWhvkf=v~%+x_xGif>WyCjkdELc3U zSHW&5?ketCYja}9@>N{AE6UCzqQ^IgEhF*3$%%Vna5TeabiY6`R1JOYsn^=g183`O z%t3=&A+1Rc2}T@i{Jjo>Dv^_VL=6Ueu|jhIB7L&eN(-QQ9jtb|TR@$y$G%FXwxg@P zN3XbR6a(AbrM`^&0ebDbzeq8;Ev-_u9S77W^?S{)pFMkTv$+99SV3VSTa2)(qT(;b z=L@PfNEsQ_GcJgG`ZgFKgPihuhDOpQkJ2*>4}Bmk3M$z+6N8cAVe8Ftwk}$f6BFyO zzXr9LUjYQ!wpE;?F%Of;KKi_zGcob$_>9M`p1|GydPAO|T*jW1N`(1z@Z!mxTW`df zg0>2#V&z4rL$Q;7;mg1M(iF62II7^M5$bJ>q~n4_k|?_LTxgmrq(yAfVC5Ca6Toil zV3>%c7uZbwHT=v+GT{k=R`$<_5TW+eDE6^;YPsQ~Dz*RokTH#>wl~8me0Kc!YD+FP zch(S#Wde2Hd4pyMZRJ5UyX1r0f5@Vc$W-?M7Mfn+=jE|CK)^LZ)}uZLytARJ2noS~mMjB&dCwwDD7kfP$bg0Yp2% zwPiz?PQpB#oXR5io24n2!;qh9{#r=WPFULS@8{e-3wc=FK7!38{zY%@rT>rZYd5M2ne@ylD&1G{o-57zdaXbO!V}2AAQ@@)! zr*AnWy<9V5Xk!XGEci16m(MU`*%5`KqRdMPDx(uJ8IF58GeNx$rIazuRcxOsCKVnO z-OLtPLKLnqZbl`jw>nnqTq#p%su74!dEv&t`fT`d+;;juAhUzwVdhSiJDwpda6R4=&W)4$!kupEo z9k$fLHSG3?=JkJF6nN1M1Se9j!4d-%&1GN#IKcM8Qc@@_u|AS027CqzGQDTx)gdr;bx(#EC!*{qy5lns{#%Xtqt?V-GGI zzcSy+nQJ2oSgz#P*81%jFEx0?GAoCD!f*U`7}rFZ^9ln2qVZ450a58MS=U7tlrpKl zi};jJ%ur0*9!dCGXgqd9U0PZKsh-)rN=DsByIA%2!ND@m%u&FW_>athfZGA&d=g+g zmW*Ubh7t`BA?)P}Ro}=H256B5&^R@(z!*OA@>4Z}PYo%sS5J{_86%vv4aT#Sthx`Ogn^z@S}Co{IO=M{OiY;m-yi z?OrPigYE9F37pZ$IggTmIEx<%wQgYkP!rh{d*bg@Ae}z z(-&+acisUaieS*laA_D-1Lq0KQ~ec>-y>sV;xM_CPT7;7Knr8t%uE8b9%(GB!QTv- z7gAqY+nktLK#>4V$Ts~$o@zD(9l?gJM10OgYHHAp4_74k((V!xw!#pVyB-ycEQEo* zl5o$Xqp^TDI!PR5Pr()KS7l1srp=EZnqI9E4_%2^2rB)O85w?>_vj31aC;6+45F(P z{u0OcTqSGWwmq5@FeI`;zgT=qeRrwq0-N`+$6Wh7*@n~L`O_*;*D8FJbNR)4d(r&YE zX+E^5Q?nEEyj#5bqg6%c5PsU3Awea-T!~+_*>El93O5@oYwy&QG{`&z4C=i+q^XdB z%Ai^GrCIw*Zx+p-GvGig$m=lB$YmTNL3M>ZnrrCjxcBZQ1BC<*vyiYbVGu&Wk^?>K z=SK+_DhE9*OiV!_t3h%{`A#ROu~r@N?w#Zd z(u|6a%{38qn#Q*3L0ND86MH!Ie*5#22#boM!<`MqS!1e*A%s{PLa8?29%?!9~3Rfju6$gAsguu)I@B7Q+;=sf0 zM-S4{2lFHJj%fkg=10sX5qizOte2rLr%i8gH=OX;B;n#}oC|qlS+&x0x4$f8c-#km z0bopjCMm?vTwC>$h>dZUco8OtQ%#jM>FeY{{%PpAnTeM!^dA#9C!8tIPo2@%ikJ6# zh&uuk^gBssh%_9m)x$U$!(7vP(4Y$QO#rHEh#-^l+uGV4V`*dPkyp%oy}T0EXJ=Q$ z3EMA1qP4shf~nrI{V^b|Md3NaW(gF69)nHeCD=cD9Y9!+oE4 zOUxz-92qMn0r!k0`%oS9SCpdO#VdYJP(nQH7wVOQ4gVr*58fa3+i zYMsZ+zQ$?UTXa1roM$Z>>TZ_)7H7n>Or$iT!-Iom;Rf$mRx`lnOB=zt-nEx%Q#}bl zTD@k{VZMO7PsSpWK?A0s4qDvixmjRO|9J0YamavN)0E!z#eSn_rAXCClGwE6#OMUc zPSn!gy@Bj20JyT8xd{|<^bITC$qp$7oT4A8Pnwd2sV#lIWz{qd!o($BiG(4|AZ?3j ziA_kNz=GyTO@bvZj}uqY7@xYk1h^Gd(MqbucN9WoD!H`FPa^NVYO;fcg)oVq?<4!6$CE$JzPfm80 zBDMPa`syJehV6*okmbh|*TwnzjMMooTQjCP*in1~e}z9Y!cQGqQE)!4!__C~`Dc-?YAC$n^6Id>AU%MxS2CG$!~}M_%8% zdigWktzr49Ho+ehQ)4Nwf5hZ{52&UKCLC1FfXQyhwvl*lEV*_k5dYf}rG5GBo`C4& z3oJXD$BS*~xdrQim7JTSczd&7-=14^X``Ur2^JTAreL>ludB;3jIF9CN2BtUfb?o1 z3GC*lTx5t1F&n>-Dfrfu*ji;O(umR1von>vH}89>N+46=BO-}8v`rYMW?*FJd>Ly{ zTn(iMn6ca3Yvp4$@wsH)1qIn5=8+?4=FD>(Lwfg96R*XDC7rH^d0&H{$WUZ6 z-lmu%_<9QiqmSnrvM&8X0@C)sGR{t)T~VS=9_qeww`NFTn8-256y|WE<>-aGXLCPyEXWqIb#Au z|B<|X>pzpX{~sQGt_mmtqv6gUy^4pfZ-34Vww5xAR~UGuxo2;0UYk<1eVvFHML z5#Z0O9H##~q(#rs*ils1rXu9~nlq>{4tW~0eTmd#NRL_56FsqL>E)%4Yv=O>hlp`% z@scvDk({|&6N2~9TOJq5xK4JN>)j;HmLy!s!%27%ON!J%AHvsUJaOdNoyTV>nprzL z)1y+GbREeNudcluCoVa>e>1)R+Xx#*8D5~9Dbi2UK2Edqo>-ENkx8Ad z|LZeMNRs|h&7P2(El_vf$B4lkeFOd-KKzhF^0Fj+vD$1|+Q;UfE-wtrrW{`PKxSKP zjq5#zmX?} z5yJODfxCEb#!VP_u9mxLfs3bSO*2DAn_U!tddI-T;F+0>(a&+$8hg62S0Z@{->aed z7iHpRq^wz~n~9OudPQ}_{s-LdgQJRBqSAt(TnpCK8K;KqqNXGF0G-k}Te@dfM{41< z$+W*pLW|Ay=**Mp<#H}jB=ciOfj&(V-#C5D)Y?@NUZE34g14>qVWw4%geN|@w%hE_ zWNTY)5Ee>bySO$hU^vlVXi+EHTismDOC7fLg|hub_k!%?V{TtFeoIZ)=>5~VyAmqr zAGgqjn8VIKp|tFj+`~SsHneuSxL-jw@w2kKww~z>z1#O=_XmPiktfnl1Swwor25Mk z-1oCuW@HQIJ*=?f%*88^XU=o`MWg-@_CzhGh;=EWUYHTX`*{2DaugDemP6bnqq-0W z=07r{v22rFhiBc)1@0B(s9l6R;n;icGLGM)-p~+EozQK)|Hg*i>xkonwCpuArFgra z!n@9>kvbN+O|z5dm?fMeo*H!GvUZafGKBocGRre0hn0icJfh>PIzm)3}f_G2ec&Y^FGVmZWrGjZ-o%llqK6ibaQ!S(6K0gk(b_L|kTLt4>E zi5J|r$Q|gZ%cBQh%U4V?;0*@@`6h5iHhAkx!YQqL*LPbBtEP+8M#7xJCdxN$ z_>uil*9oDEBD`Er;*_U*ul~SOi(g{?AFuxo;V-`Z-1haaBhOSJ@S- zW?xb&pOM$mf2UNi5?+g%>ygoFjBMLKCQ;VPF_F3)x%r=m>tyd<8IRUZ{~^vE9tp!T z@Q`W6k;x3YoLTgZ%Ld=U7ELGgbSs@Gu(8rM#vJO_@aX6lz%`YXYKe8Ofe8us;R&mS zpHtf|;y*TTmB1yN^#FO78D`AMp=z> z8w^RyU)+I6TW~k^kB&MvLU!xs3*=nlXQ-HICrmYlLbiYVWs&O-zv%-YpsXQ!E^vj4 zq|T5P`S8xD(#V;n(0FC$Es?;QxsNyJ^mh%HE?0#jT?2S`#%-6DchoH4Jg4MuQzY{L z86(I4G--Ml_WP!1+xvXyk!L2%$*1GvySFcw%J~#xIe+`Q!{0^Kzd!$Jh$Stv@1lR^ zjjg?FSRp6B>bQXQVJQ*^d3=-FU|4`Oz zq9UFyN{tz^;^6Ub_cJ|LFP$(S01rFN+n=dKsF^(GdArq*Vn4q2GC!=IrcB6_+pWga|$DDqGI{zq*=WHjWUih}@&=l&nI~-;#&_57)@rIT7s72{w z_JYU2ss>RetD|CrFn$!18JoB$5W9z0JhEo)I5?>W`#VD_;}U!>1r^n`cR@jS$(MFsIYbaKacqU27Vz?b}vtUdh%+6@26#?v}Cs#73KbPWs!1_zt? z4kjBxaeXN$hys#5GSC*)()@t>Uz3WfP-u(PkHpH4^A$KhL_~4)tnUwz-{+0jAqcc7 z&i3}wA)gP9YIb!`RyQJHi?3BAo8O;h`t>qaNL%5gyx-Rz5TQOOYm(&-F zhsL&4FnB0w#lzUdct01JL*q83$)w@5Y#)X9q}M7U6gA~Mvg3PlU0+(6VT^F+?1}fA zWZNAQoksKO7d-ubuvf7;VNo0R?j1^?*_A6-kVggHpsVdq=7xeT_Kp_YBxa-&_@~ON zftG?%2I>vPaWPmlipPNgVE-G)s`C8w3H$EdIxv2LYci#uMJ7fHG`dYN(9Rh~%Yh}xH7d$nIdEoaxI3ifB~R58BVzPV88xuv``+^%cw3%Xyqmb%g2Lp~seAS8>Pgkbr-)mur5wy`wmv

@XVnRY6Cz@K|nzCAK#m0Z4+Eo7$J+62JZU+!_u#RhB+wUa+Kf9wT!;Y1IlCjO` z$S(IZCHw(b`&0WtuI~AvN~~k6z|>N52~I7 zD37SF6W-@_R}S-s=@)e09{3wvLXgHT?|^`xwIgRrK-IvTDG>NaX6cPtqY%N4d-9_IU4rtyR)gz_m;zeg2iW&129 z#CD}m63fb>j0RHXmX~RvlLooE)U3e$*hwznD<3Iy;yU(aTk2m{o$;_|;9|+@1kUHi zvF*XPTmfafRs)NdlsSP?pOI-(P)7U@wR=;m?mI!D8ItD7jH_7h->lS5_4M3{=}OTM z;Glh6;ySkbR z&4RTrmv2bg#%O=iNQwHOKF5Y>TK^S}(VoS=E_gtYae^8e(hd%#pX-nCA-oCpG63nb za_#^&Xh$A0rQ)HdWz;tZyc!*NIR|w;-pzk6xBtsuiriot>VF?0)sW9GvHqUqE*$<&hx9LPLe^ub~Ig3T{9$A>7NS zwGS&GZxUjwo_FQOg;F5ni~!O@5`9qczoxnzc_k$Rpy!bspC1{|aQRg4;GiyIYwPD_ z{Eq~z-N5m}XMnMWJq8OrHLfV#7j{cVF~}qJyxZuV`Uw`g^u!_9TrjckOZ^+mN;4N& gh+vls7@2bqo`5WJDT)pQ6!=g4#Y^Fw=WjmzFC(ssy8r+H literal 0 HcmV?d00001 diff --git a/public/images/no-time.png b/public/images/no-time.png new file mode 100644 index 0000000000000000000000000000000000000000..733521074ce028d120b692ef7458ed35529e2580 GIT binary patch literal 37837 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 literal 0 HcmV?d00001 diff --git a/public/images/ready-to-use.png b/public/images/ready-to-use.png new file mode 100644 index 0000000000000000000000000000000000000000..f96b07a7ee88aa3fa53cdb21b815c241dd49646f GIT binary patch literal 40890 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 Li)(a!kGuZ^lPq&u literal 0 HcmV?d00001 diff --git a/public/images/virtual-selection.gif b/public/images/virtual-selection.gif new file mode 100644 index 0000000000000000000000000000000000000000..d41450ad3b19cc2312c02e41194a2ecf39951a93 GIT binary patch literal 155022 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�aXF!v2dV1_ORCShX}?oH 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⩔PnMUJ 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 Date: Mon, 11 Mar 2019 16:09:50 +0100 Subject: [PATCH 19/31] demo image --- public/images/demo.png | Bin 0 -> 41197 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/images/demo.png diff --git a/public/images/demo.png b/public/images/demo.png new file mode 100644 index 0000000000000000000000000000000000000000..a122877496dc0a61f367d2e8ff46a4f78a5a7170 GIT binary patch literal 41197 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 F;y;e$*U$g} literal 0 HcmV?d00001 From 3f021d4df0ec4057640a1a38e2fe5111eef48d1f Mon Sep 17 00:00:00 2001 From: BuildTools Date: Mon, 11 Mar 2019 16:45:25 +0100 Subject: [PATCH 20/31] 1st full version --- README.md | 294 ++++++++++++------ license.md | 382 +++++++++++++++++++++++ package.json | 11 +- public/Date_Picker_Image.png | Bin 167732 -> 0 bytes public/index.html | 8 - src/DemoBase.jsx | 37 +++ src/Wrapper.jsx | 20 ++ src/index.jsx | 11 +- src/lib/DateTimeRangeComponent.css | 13 +- src/lib/DateTimeRangeComponent.jsx | 401 +++++++++++++------------ src/lib/DateTimeRangeContainer.jsx | 9 +- src/lib/DateTimeRangePicker.jsx | 62 ++-- src/lib/SmallGlyphicon.css | 0 src/lib/SmallGlyphicon.jsx | 8 + src/lib/calendar/MonthYearSelector.jsx | 5 +- src/lib/date_picker/DateField.jsx | 15 +- src/lib/date_picker/TimeField.jsx | 5 +- src/lib/style/DateTimeRange.css | 38 ++- 18 files changed, 953 insertions(+), 366 deletions(-) create mode 100644 license.md delete mode 100644 public/Date_Picker_Image.png create mode 100644 src/DemoBase.jsx create mode 100644 src/lib/SmallGlyphicon.css create mode 100644 src/lib/SmallGlyphicon.jsx diff --git a/README.md b/README.md index d9e4245..8b2421b 100644 --- a/README.md +++ b/README.md @@ -1,70 +1,70 @@ -# React Advanced Date Time Range Picker -[![CircleCI](https://circleci.com/gh/v0ltoz/react-datetimepicker.svg?style=svg)](https://circleci.com/gh/v0ltoz/react-datetimepicker) -[![](https://badge.fury.io/js/react-advanced-datetimerange-picker.svg)](https://www.npmjs.com/package/react-joyride) -[![Maintainability](https://api.codeclimate.com/v1/badges/3b5c72752ef7cf3932b9/maintainability)](https://codeclimate.com/github/v0ltoz/react-datetimepicker/maintainability) -[![Test Coverage](https://api.codeclimate.com/v1/badges/3b5c72752ef7cf3932b9/test_coverage)](https://codeclimate.com/github/v0ltoz/react-datetimepicker/test_coverage) -
- -Development still in progress, Stable release coming soon - -
+# anci Date Time Range Picker -This is a fully rewritten, keyboard friendly implementation of a date time range picker. It has been designed for selecting date ranges and does not currently include a single date picker. +React advanced Date-Time Range Picker -It has been designed currently to work with React Version 15 - -![Date Time Picker](https://raw.githubusercontent.com/v0ltoz/react-datetimepicker/master/public/Date_Picker_Image.png) +## General Info +This project is based upon dangrossman daterangepicker (https://github.com/dangrossman/daterangepicker) +The project has been rewritten in React, this is not a JQuery wrap around, thanks to v0ltoz to start this great project. +It is based off of the bootstrap UI with some slight adjustments and added keyboard accessibility such as Keyboard arrow key navigation and Tab navigation. This is a fully rewritten, keyboard friendly implementation of a date time range picker It has been designed for selecting date ranges and partially includes a single date picker. +![Date Time Picker](https://raw.githubusercontent.com/andreaci/react-datetimepicker/master/public/images/demo.png) ## Setup + Run the following command: -```bash -npm install react-advanced-datetimerange-picker + +``` +npm install react-anci-daterangepicker ``` -## Requirements +## Usage -This project requires react-bootstrap to be installed +The package exports two components: -## General Info +**DateTimeRangeComponent** +Simple, ready to use component. +It creates the two textboxes by himself and exposes two callbacks for the selected period. This component also manages all optional parameters and create a default ranges sets. -This project is based upon dangrossman daterangepicker (https://github.com/dangrossman/daterangepicker) +![Ready to use](https://raw.githubusercontent.com/andreaci/react-datetimepicker/master/public/images/ready-to-use.png) -The project has been rewritten in React, this is not a JQuery wrap around. +**DateTimeRangeContainer** +The component used by the DateTimeRangeComponent. Using this directly you can customize how the external textbox behaves. -It is based off of the V2 UI with some slight adjustments and added keyboard accessibility such as Keyboard arrow key navigation and Tab navigation. +![Classical](https://raw.githubusercontent.com/andreaci/react-datetimepicker/master/public/images/classical.png) ## Properties Required **ranges** {React.Object} Object of ranges that will be you default ranges. Example: + ```js let ranges = { - "Today Only": [moment(start), moment(end)], - "Yesterday Only": [moment(start).subtract(1, "days"), moment(end).subtract(1, "days")], - "3 Days": [moment(start).subtract(3, "days"), moment(end)] - } + 'Today Only': [moment(start), moment(end)], + 'Yesterday Only': [moment(start).subtract(1, 'days'), moment(end).subtract(1, 'days')], + '3 Days': [moment(start).subtract(3, 'days'), moment(end)] +}; ``` + **start (Required)** {Moment Object} Initial Start Date that will be selected, should be a moment object **end (Required)** {Moment Object} Initial End Date that will be selected, should be a moment object -**local (Required)** {Object} -Defines a local format for date labels to be shown as. Can also set Sunday to be first day or Monday. Local object accepts format and sunday first params. +**local (Required in _DateTimeRangeContainer_)** {Object} +Defines a local format for date labels to be shown as. Can also set Sunday to be first day or Monday. Local object accepts format and sunday first params. ---> format: moment display format
---> sundayFirst: True Sunday the first day of the week. False, Monday first day of the week. +--> format: moment display format +--> sundayFirst: True Sunday the first day of the week. False, Monday first day of the week. ```js let local = { - "format":"DD-MM-YYYY HH:mm", - "sundayFirst" : false -} + format: 'DD-MM-YYYY', // do not put HH:mm here to avoid strange behaviours in textboxes + sundayFirst: false +}; ``` **applyCallback (Required)** {React.func}
@@ -72,83 +72,172 @@ Function which is called when the apply button is clicked/pressed. Takes two par ```js func applyCallback(startDate, endDate){ - ... + ... } ``` +**rangeCallback** {React.func}
+Function which is called when a custom range is selected. Takes three params, the range id, the array from the definition and an object containing start date and end date. + +```js +func applyCallback(value, data, cbdata){ + alert(cbdata.start + ' ' + cbdata.end); +} +``` + +**useVirtualSelection (optional)** {bool}
+Better selection mode. + +![Virtual selection](https://raw.githubusercontent.com/andreaci/react-datetimepicker/master/public/images/virtual-selection.gif) + +**showCurrentState (optional)** {bool}
+Show the bottom bar with the text "Selecting From / To". + +**rangesOnTheRight (optional)** {bool}
+Put custom ranges on the right. + +**autoCloseOnSelection (optional)** {bool}
+Auto close the calendar on selection. + **maxDate (optional)** {Moment Object}
-Maximum date that can be selected. +Maximum date that can be selected. + +**maxDays (optional)** {bool}
+Maximum number of days. Setting to 1 shows only one calendar. +![One day](https://raw.githubusercontent.com/andreaci/react-datetimepicker/master/public/images/one-day.png) + +**minYear (optional)** {bool}
+Starting year for combobox. + +**maxYear (optional)** {bool}
+Ending year for combobox. + +**disabled (optional)** {bool}
+Disable the control. + +**enableTime (optional, in _DateTimeRangeComponent_ only)** {bool}
+Disable Time selector. _Used in this way to keep compatibility._ + +![No time](https://raw.githubusercontent.com/andreaci/react-datetimepicker/master/public/images/no-time.png) + +**disableTime (optional, in _DateTimeRangeContainer_ only)** {bool}
+Disable Time selector. _Used in this way to keep compatibility._ + +**disableDateBox (optional)** {bool}
+Disable the internal date textbox. + +**translations (optional)** {object}
+Object containing custom translations. + +```js +let my_translations = { + Apply: 'Apply', + Cancel: 'Cancel', + customRange: 'Custom Range', + FromDate: 'From date', + ToDate: 'To date', + SelectingFrom: 'Selecting from', + SelectingTo: 'Selecting to', + + MaxDays: 'Max days', + MaxDate: 'Max date', + + months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], + days: ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'] +}; +``` + +**calendarStyles (optional)** {object}
+Object containing custom styles for some components. + +```js +let my_styles = { + //RANGES SELECTOR + normalRangeStyle: () => { + return {}; + }, + selectedRangeStyle: () => { + return {}; + }, + + //CALENDAR CELLS STYLE + startDateStyle: () => { + return {}; + }, + + endDateStyle: () => { + return {}; + }, + + inBetweenStyle: () => { + return {}; + }, + + normalCellStyle: () => { + return {}; + }, + + hoverCellStyle: between => { + return {}; + }, + + greyCellStyle: () => { + return {}; + }, + + invalidStyle: () => { + return {}; + } +}; +``` + +![Colors styles](https://raw.githubusercontent.com/andreaci/react-datetimepicker/master/public/images/colors-styles.png) ## Getting Started +This is the base example. Please check Wrapper.jsx for more examples. + ```js -import React from 'react'; -import DateTimeRangeContainer from 'react-advanced-datetimerange-picker' -import {FormControl} from 'react-bootstrap' -import moment from "moment" - -class Wrapper extends React.Component { - - constructor(props){ - super(props); - let now = new Date(); - let start = moment(new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0,0,0,0)); - let end = moment(start).add(1, "days").subtract(1, "seconds"); - this.state = { - start : start, - end : end - } - - this.applyCallback = this.applyCallback.bind(this); - } - - applyCallback(startDate, endDate){ - this.setState({ - start: startDate, - end : endDate - } - ) - } - - render(){ - let now = new Date(); - let start = moment(new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0,0,0,0)); - let end = moment(start).add(1, "days").subtract(1, "seconds"); - let ranges = { - "Today Only": [moment(start), moment(end)], - "Yesterday Only": [moment(start).subtract(1, "days"), moment(end).subtract(1, "days")], - "3 Days": [moment(start).subtract(3, "days"), moment(end)] - } - let local = { - "format":"DD-MM-YYYY HH:mm", - "sundayFirst" : false - } - let maxDate = moment(start).add(24, "hour") - return( -

- - - -
- ); - } +import React, { Component } from 'react'; +import { DateTimeRangeComponent } from './lib'; +import moment from 'moment'; + +export default class DemoBase extends Component { + constructor(props) { + super(props); + + let now = new Date(); + let start = moment(new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0, 0)); + let end = moment(start) + .add(1, 'days') + .subtract(1, 'seconds'); + + this.state = { + start: start, + end: end + }; + + this.applyCallback = this.applyCallback.bind(this); + } + + applyCallback(startDate, endDate) { + this.setState({ + start: startDate, + end: endDate + }); + } + + render() { + return ( +
+ +
+ ); + } } ``` - ## Available Scripts In the project directory, you can run: @@ -168,9 +257,16 @@ See the section about [running tests](https://facebook.github.io/create-react-ap ### `npm run build` +### `npm run build-win` + Builds the app for production to the `build` folder.
It correctly bundles React in production mode and optimizes the build for the best performance. +the -win version is obviously for windows. + +### `npm package` + +Create .tgz package ### npm test -- --coverage -Gets test coverage when running tests to see how much of the code is covered by your tests. \ No newline at end of file +Gets test coverage when running tests to see how much of the code is covered by your tests. diff --git a/license.md b/license.md new file mode 100644 index 0000000..5d00544 --- /dev/null +++ b/license.md @@ -0,0 +1,382 @@ +# Mozilla Public License Version 2.0 + +1. Definitions + +--- + +1.1. "Contributor" +means each individual or legal entity that creates, contributes to +the creation of, or owns Covered Software. + +1.2. "Contributor Version" +means the combination of the Contributions of others (if any) used +by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" +means Covered Software of a particular Contributor. + +1.4. "Covered Software" +means Source Code Form to which the initial Contributor has attached +the notice in Exhibit A, the Executable Form of such Source Code +Form, and Modifications of such Source Code Form, in each case +including portions thereof. + +1.5. "Incompatible With Secondary Licenses" +means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" +means any form of the work other than Source Code Form. + +1.7. "Larger Work" +means a work that combines Covered Software with other material, in +a separate file or files, that is not Covered Software. + +1.8. "License" +means this document. + +1.9. "Licensable" +means having the right to grant, to the maximum extent possible, +whether at the time of the initial grant or subsequently, any and +all of the rights conveyed by this License. + +1.10. "Modifications" +means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor +means any patent claim(s), including without limitation, method, +process, and apparatus claims, in any patent Licensable by such +Contributor that would be infringed, but for the grant of the +License, by the making, using, selling, offering for sale, having +made, import, or transfer of either its Contributions or its +Contributor Version. + +1.12. "Secondary License" +means either the GNU General Public License, Version 2.0, the GNU +Lesser General Public License, Version 2.1, the GNU Affero General +Public License, Version 3.0, or any later versions of those +licenses. + +1.13. "Source Code Form" +means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") +means an individual or a legal entity exercising rights under this +License. For legal entities, "You" includes any entity that +controls, is controlled by, or is under common control with You. For +purposes of this definition, "control" means (a) the power, direct +or indirect, to cause the direction or management of such entity, +whether by contract or otherwise, or (b) ownership of more than +fifty percent (50%) of the outstanding shares or beneficial +ownership of such entity. + +2. License Grants and Conditions + +--- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) +Licensable by such Contributor to use, reproduce, make available, +modify, display, perform, distribute, and otherwise exploit its +Contributions, either on an unmodified basis, with Modifications, or +as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer +for sale, have made, import, and otherwise transfer either its +Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; +or + +(b) for infringements caused by: (i) Your and any other third party's +modifications of Covered Software, or (ii) the combination of its +Contributions with other software (except as part of its Contributor +Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of +its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities + +--- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code +Form, as described in Section 3.1, and You must inform recipients of +the Executable Form how they can obtain a copy of such Source Code +Form by reasonable means in a timely manner, at a charge no more +than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this +License, or sublicense it under different terms, provided that the +license for the Executable Form does not attempt to limit or alter +the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation + +--- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination + +--- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +--- + +- * +- 6. Disclaimer of Warranty \* +- ------------------------- \* +- * +- Covered Software is provided under this License on an "as is" \* +- basis, without warranty of any kind, either expressed, implied, or \* +- statutory, including, without limitation, warranties that the \* +- Covered Software is free of defects, merchantable, fit for a \* +- particular purpose or non-infringing. The entire risk as to the \* +- quality and performance of the Covered Software is with You. \* +- Should any Covered Software prove defective in any respect, You \* +- (not any Contributor) assume the cost of any necessary servicing, \* +- repair, or correction. This disclaimer of warranty constitutes an \* +- essential part of this License. No use of any Covered Software is \* +- authorized under this License except under this disclaimer. \* +- * + +--- + +--- + +- * +- 7. Limitation of Liability \* +- -------------------------- \* +- * +- Under no circumstances and under no legal theory, whether tort \* +- (including negligence), contract, or otherwise, shall any \* +- Contributor, or anyone who distributes Covered Software as \* +- permitted above, be liable to You for any direct, indirect, \* +- special, incidental, or consequential damages of any character \* +- including, without limitation, damages for lost profits, loss of \* +- goodwill, work stoppage, computer failure or malfunction, or any \* +- and all other commercial damages or losses, even if such party \* +- shall have been informed of the possibility of such damages. This \* +- limitation of liability shall not apply to liability for death or \* +- personal injury resulting from such party's negligence to the \* +- extent applicable law prohibits such limitation. Some \* +- jurisdictions do not allow the exclusion or limitation of \* +- incidental or consequential damages, so this exclusion and \* +- limitation may not apply to You. \* +- * + +--- + +8. Litigation + +--- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous + +--- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License + +--- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +## Exhibit A - Source Code Form License Notice + +This Source Code Form is subject to the terms of the Mozilla Public +License, v. 2.0. If a copy of the MPL was not distributed with this +file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +## Exhibit B - "Incompatible With Secondary Licenses" Notice + +This Source Code Form is "Incompatible With Secondary Licenses", as +defined by the Mozilla Public License, v. 2.0. diff --git a/package.json b/package.json index 6290c35..89c87c6 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "react-advanced-datetimerange-picker", - "version": "0.1.10", - "license": "GNU", + "name": "react-anci-daterangepicker", + "version": "0.2.00", + "license": "MPL-2.0", "main": "dist/index.js", "module": "dist/index.js", "files": [ @@ -10,7 +10,7 @@ ], "repository": { "type": "git", - "url": "https://github.com/v0ltoz/react-datetimepicker" + "url": "https://github.com/andreaci/react-datetimepicker" }, "jest": { "collectCoverageFrom": [ @@ -23,9 +23,8 @@ "dependencies": { "moment": "2.22.2", "prop-types": "15.6.2", - "react-bootstrap": "0.31.3", "react-dot-fragment": "0.2.7", - "react-moment-proptypes": "1.6.0", + "react-moment-proptypes": "^1.6.0", "react-scripts": "2.1.1" }, "scripts": { diff --git a/public/Date_Picker_Image.png b/public/Date_Picker_Image.png deleted file mode 100644 index 083a5bf982cba746af6f438a927e44ad3ceb791d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167732 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%0D6$HDXQAu1nK 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 L9Db=h>~;QM9D|X_ diff --git a/public/index.html b/public/index.html index 6e99a33..8299071 100644 --- a/public/index.html +++ b/public/index.html @@ -27,14 +27,6 @@ crossorigin="anonymous" /> - - -