diff --git a/Calendar.js b/Calendar.js index 8eff679..8f9592f 100644 --- a/Calendar.js +++ b/Calendar.js @@ -25,6 +25,7 @@ export default class Calendar extends Component { format: PropTypes.string, customI18n: PropTypes.object, color: PropTypes.object, + singleDate: PropTypes.bool, minDate: PropTypes.oneOfType([PropTypes.string, PropTypes.instanceOf(Date)]), maxDate: PropTypes.oneOfType([PropTypes.string, PropTypes.instanceOf(Date)]) } @@ -32,7 +33,8 @@ export default class Calendar extends Component { format: 'YYYY-MM-DD', i18n: 'en', customI18n: {}, - color: {} + color: {}, + singleDate:false } static I18N_MAP = { 'zh': { @@ -43,7 +45,8 @@ export default class Calendar extends Component { 'end': '结 束', 'date': '日 期', 'save': '保 存', - 'clear': '清除' + 'clear': '清除', + 'selected': '选' }, 'date': 'M月D日' }, @@ -55,7 +58,8 @@ export default class Calendar extends Component { 'end': 'End', 'date': 'Date', 'save': 'Save', - 'clear': 'Reset' + 'clear': 'Reset', + 'selected': 'Selected' }, 'date': 'DD / MM' }, @@ -67,7 +71,8 @@ export default class Calendar extends Component { 'end': 'エンド', 'date': '時 間', 'save': '確 認', - 'clear': 'クリア' + 'clear': 'クリア', + 'selected': '選択' }, 'date': 'M月D日' } @@ -153,6 +158,16 @@ export default class Calendar extends Component { startDate, endDate } = this.state; + if(this.props.singleDate==true){ + this.setState({ + startDate: day, + startDateText: this._i18n(day, 'date'), + startWeekdayText: this._i18n(day.isoWeekday(), 'weekday'), + endDate: day, + endDateText: this._i18n(day, 'date'), + endWeekdayText: this._i18n(day.isoWeekday(), 'weekday') + }); + }else{ if ((!startDate && !endDate) || day < startDate || (startDate && endDate)) { this.setState({ startDate: day, @@ -169,6 +184,7 @@ export default class Calendar extends Component { endWeekdayText: this._i18n(day.isoWeekday(), 'weekday') }); } + } } cancel () { this.close(); @@ -194,6 +210,7 @@ export default class Calendar extends Component { endWeekdayText: '' }); } + confirm () { const { startDate, @@ -209,6 +226,57 @@ export default class Calendar extends Component { }); this.close(); } + _renderReturn(){ + const { + startDate, + endDate, + startDateText, + startWeekdayText, + endDateText, + endWeekdayText + } = this.state; + const { + mainColor = '#15aaaa', + subColor = '#fff', + borderColor = 'rgba(255, 255, 255, 0.50)' + } = this.props.color; + let color = {mainColor, subColor, borderColor}; + let subFontColor = {color: subColor}; + let subBack = {backgroundColor: subColor}; + if(this.props.singleDate==true){ + return ( + + + + {endDateText || this._i18n('selected', 'text')} + + + {endWeekdayText || this._i18n('date', 'text')} + + + ) + }else{ + return ( + + + {startDateText || this._i18n('start', 'text')} + + + {startWeekdayText || this._i18n('date', 'text')} + + + + + + {endDateText || this._i18n('end', 'text')} + + + {endWeekdayText || this._i18n('date', 'text')} + + + ) + } + } render () { const { startDate, @@ -228,11 +296,11 @@ export default class Calendar extends Component { let subBack = {backgroundColor: subColor}; let mainFontColor = {color: mainColor}; let subFontColor = {color: subColor}; - let isValid = !startDate || endDate; + let isValid = (this.props.singleDate==true)? startDate!=null : !startDate || endDate; let isClearVisible = startDate || endDate; return ( @@ -253,25 +321,7 @@ export default class Calendar extends Component { {this._i18n('clear', 'text')} } - - - - {startDateText || this._i18n('start', 'text')} - - - {startWeekdayText || this._i18n('date', 'text')} - - - - - - {endDateText || this._i18n('end', 'text')} - - - {endWeekdayText || this._i18n('date', 'text')} - - - + {this._renderReturn()} {[7, 1, 2, 3, 4, 5, 6].map(item => {this._i18n(item, 'w')} diff --git a/readme.md b/readme.md index 9fd6907..3472138 100644 --- a/readme.md +++ b/readme.md @@ -104,6 +104,69 @@ render() { } ``` + +```js +constructor (props) { + super(props); + this.state = { + startDate: new Date(2017, 6, 12), + endDate: new Date(2017, 8, 2) + }; + this.confirmDate = this.confirmDate.bind(this); + this.openCalendar = this.openCalendar.bind(this); +} +// when confirm button is clicked, an object is conveyed to outer component +// contains following property: +// startDate [Date Object], endDate [Date Object] +// startMoment [Moment Object], endMoment [Moment Object] +confirmDate({startDate, endDate, startMoment, endMoment}) { + this.setState({ + startDate, + endDate + }); +} +openCalendar() { + this.calendar && this.calendar.open(); +} +// in render function +render() { + // It's an optional property, I use this to show the structure of customI18n object. + let customI18n = { + 'w': ['', 'Mon', 'Tues', 'Wed', 'Thur', 'Fri', 'Sat', 'Sun'], + 'weekday': ['', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'], + 'text': { + 'start': 'Check in', + 'end': 'Check out', + 'date': 'Date', + 'save': 'Confirm', + 'clear': 'Reset' + }, + 'date': 'DD / MM' // date format + }; + // optional property, too. + let color = { + subColor: '#f0f0f0' + }; + return ( + +