dtd
Version:
根据数梦工场视觉规范打造的组件库,感谢react-components和ant design
1 lines • 11.5 kB
JavaScript
import _extends from"babel-runtime/helpers/extends";import*as React from"react";import createReactClass from"create-react-class";import*as PropTypes from"prop-types";import*as moment from"moment";import classnames from"classnames";import CalendarPart from"./range-calendar/CalendarPart";import TodayButton from"./calendar/TodayButton";import OkButton from"./calendar/OkButton";import TimePickerButton from"./calendar/TimePickerButton";import CommonMixin from"./mixin/CommonMixin";import{getTodayTime,isAllowedDate,syncTime}from"./util/";function noop(){}function isEmptyArray(e){return Array.isArray(e)&&(0===e.length||e.every(function(e){return!e}))}function isArraysEqual(e,t){if(e===t)return!0;if(null===e||void 0===e||null===t||void 0===t)return!1;if(e.length!==t.length)return!1;for(var a=0;a<e.length;++a)if(e[a]!==t[a])return!1;return!0}function getValueFromSelectedValue(e){var t=e[0],a=e[1];return[t,a&&a.isSame(t,"month")?a.clone().add(1,"month"):a]}function normalizeAnchor(e,t){var a=e.selectedValue||t&&e.defaultSelectedValue,n=e.value||t&&e.defaultValue,o=getValueFromSelectedValue(n||a);return isEmptyArray(o)?t&&[moment(),moment().add(1,"months")]:o}function generateOptions(e,t){for(var a=t?t():[],n=0;n<e;n++)-1===a.indexOf(n)&&a.push(n);return a}function onInputSelect(e,t){if(t){var a=this.state.selectedValue.concat(),n="left"===e?0:1;a[n]=t,a[0]&&this.compare(a[0],a[1])>0&&(a[1-n]=this.state.showTimePicker?a[n]:void 0),this.props.onInputSelect(a),this.fireSelectValueChange(a)}}var RangeCalendar=createReactClass({displayName:"RangeCalendar",propTypes:{prefixCls:PropTypes.string,dateInputPlaceholder:PropTypes.any,defaultValue:PropTypes.any,value:PropTypes.any,hoverValue:PropTypes.any,mode:PropTypes.arrayOf(PropTypes.oneOf(["date","month"])),showDateInput:PropTypes.bool,timePicker:PropTypes.any,showOk:PropTypes.bool,showToday:PropTypes.bool,defaultSelectedValue:PropTypes.array,selectedValue:PropTypes.array,onOk:PropTypes.func,showClear:PropTypes.bool,locale:PropTypes.object,onChange:PropTypes.func,onSelect:PropTypes.func,onValueChange:PropTypes.func,onHoverChange:PropTypes.func,onPanelChange:PropTypes.func,format:PropTypes.oneOfType([PropTypes.object,PropTypes.string]),onClear:PropTypes.func,type:PropTypes.any,disabledDate:PropTypes.func,disabledTime:PropTypes.func},mixins:[CommonMixin],getDefaultProps:function(){return{type:"both",defaultSelectedValue:[],onValueChange:noop,onHoverChange:noop,onPanelChange:noop,disabledTime:noop,onInputSelect:noop,showToday:!0,showDateInput:!0}},getInitialState:function(){var e=this.props,t=e.selectedValue||e.defaultSelectedValue,a=normalizeAnchor(e,1);return{selectedValue:t,prevSelectedValue:t,firstSelectedValue:null,hoverValue:e.hoverValue||[],value:a,showTimePicker:!1,mode:e.mode||["date","date"]}},componentWillReceiveProps:function(e){var t=this.state,a={};"value"in e&&(a.value=normalizeAnchor(e,0),this.setState(a)),"hoverValue"in e&&!isArraysEqual(t.hoverValue,e.hoverValue)&&this.setState({hoverValue:e.hoverValue}),"selectedValue"in e&&(a.selectedValue=e.selectedValue,a.prevSelectedValue=e.selectedValue,this.setState(a)),"mode"in e&&!isArraysEqual(t.mode,e.mode)&&this.setState({mode:e.mode})},onDatePanelEnter:function(){this.hasSelectedValue()&&this.fireHoverValueChange(this.state.selectedValue.concat())},onDatePanelLeave:function(){this.hasSelectedValue()&&this.fireHoverValueChange([])},onSelect:function(e){var t=this.props.type,a=this.state,n=a.selectedValue,o=a.prevSelectedValue,s=a.firstSelectedValue,r=void 0;if("both"===t)s?this.compare(s,e)<0?(syncTime(o[1],e),r=[s,e]):(syncTime(o[0],e),syncTime(o[1],s),r=[e,s]):(syncTime(o[0],e),r=[e]);else if("start"===t){syncTime(o[0],e);var i=n[1];r=i&&this.compare(i,e)>0?[e,i]:[e]}else{var l=n[0];l&&this.compare(l,e)<=0?(syncTime(o[1],e),r=[l,e]):(syncTime(o[0],e),r=[e])}this.fireSelectValueChange(r)},onDayHover:function(e){var t=[],a=this.state,n=a.selectedValue,o=a.firstSelectedValue,s=this.props.type;if("start"===s&&n[1])t=this.compare(e,n[1])<0?[e,n[1]]:[e];else if("end"===s&&n[0])t=this.compare(e,n[0])>0?[n[0],e]:[];else{if(!o)return;t=this.compare(e,o)<0?[e,o]:[o,e]}this.fireHoverValueChange(t)},onToday:function(){var e=getTodayTime(this.state.value[0]),t=e.clone().add(1,"months");this.setState({value:[e,t]})},onOpenTimePicker:function(){this.setState({showTimePicker:!0})},onCloseTimePicker:function(){this.setState({showTimePicker:!1})},onOk:function(){var e=this.state.selectedValue;this.isAllowedDateAndTime(e)&&this.props.onOk(this.state.selectedValue)},onStartInputSelect:function(){for(var e=arguments.length,t=Array(e),a=0;a<e;a++)t[a]=arguments[a];var n=["left"].concat(t);return onInputSelect.apply(this,n)},onEndInputSelect:function(){for(var e=arguments.length,t=Array(e),a=0;a<e;a++)t[a]=arguments[a];var n=["right"].concat(t);return onInputSelect.apply(this,n)},onStartValueChange:function(e){var t=[].concat(this.state.value);return t[0]=e,this.fireValueChange(t,"start")},onEndValueChange:function(e){var t=[].concat(this.state.value);return t[1]=e,this.fireValueChange(t,"end")},onStartPanelChange:function(e,t){var a=this.props,n=this.state,o=[t,n.mode[1]];"mode"in a||this.setState({mode:o});var s=[e||n.value[0],n.value[1]];a.onPanelChange(s,o)},onEndPanelChange:function(e,t){var a=this.props,n=this.state,o=[n.mode[0],t];"mode"in a||this.setState({mode:o});var s=[n.value[0],e||n.value[1]];a.onPanelChange(s,o)},getStartValue:function(){var e=this.state.value[0],t=this.state.selectedValue;return t[0]&&this.props.timePicker&&(e=e.clone(),syncTime(t[0],e)),this.state.showTimePicker&&t[0]?t[0]:e},getEndValue:function(){var e=this.state,t=e.value,a=e.selectedValue,n=e.showTimePicker,o=t[1]?t[1].clone():t[0].clone().add(1,"month");return a[1]&&this.props.timePicker&&syncTime(a[1],o),n?a[1]?a[1]:this.getStartValue():o},getEndDisableTime:function(){var e=this.state,t=e.selectedValue,a=e.value,n=(0,this.props.disabledTime)(null,"end")||{},o=t&&t[0]||a[0].clone();if(!t[1]||o.isSame(t[1],"day")){var s=o.hour(),r=o.minute(),i=o.second(),l=n.disabledHours,u=n.disabledMinutes,c=n.disabledSeconds;return l=generateOptions(s,l),u=generateOptions(r,u),c=generateOptions(i,c),{disabledHours:function(){return l},disabledMinutes:function(e){return e===s?u:[]},disabledSeconds:function(e,t){return e===s&&t===r?c:[]}}}return n},isAllowedDateAndTime:function(e){return isAllowedDate(e[0],this.props.disabledDate,this.disabledStartTime)&&isAllowedDate(e[1],this.props.disabledDate,this.disabledEndTime)},isMonthYearPanelShow:function(e){return["month"].indexOf(e)>-1},hasSelectedValue:function(){var e=this.state.selectedValue;return!!e[1]&&!!e[0]},compare:function(e,t){return this.props.timePicker?e.diff(t):e.diff(t,"days")},fireSelectValueChange:function(e,t){var a=this.props.timePicker,n=this.state.prevSelectedValue;if(a&&a.props.defaultValue){var o=a.props.defaultValue;!n[0]&&e[0]&&syncTime(o[0],e[0]),!n[1]&&e[1]&&syncTime(o[1],e[1])}if("selectedValue"in this.props||this.setState({selectedValue:e}),!this.state.selectedValue[0]||!this.state.selectedValue[1]){var s=e[0]||moment(),r=e[1]||s.clone().add(1,"months");this.setState({selectedValue:e,value:getValueFromSelectedValue([s,r])})}e[0]&&!e[1]&&(this.setState({firstSelectedValue:e[0]}),this.fireHoverValueChange(e.concat())),this.props.onChange(e),(t||e[0]&&e[1])&&(this.setState({prevSelectedValue:e,firstSelectedValue:null}),this.fireHoverValueChange([]),this.props.onSelect(e))},fireValueChange:function(e,t){var a=this.props;"value"in a||this.setState({value:e}),a.onValueChange(e),"month"===a.mode[0]&&"month"===a.mode[1]&&"end"===t&&a.onSelect(e)},fireHoverValueChange:function(e){var t=this.props;"hoverValue"in t||this.setState({hoverValue:e}),t.onHoverChange(e)},clear:function(){this.fireSelectValueChange([],!0),this.props.onClear()},disabledStartTime:function(e){return this.props.disabledTime(e,"start")},disabledEndTime:function(e){return this.props.disabledTime(e,"end")},disabledStartMonth:function(e){var t=this.state.value,a=this.props;return"month"===a.mode[0]&&"month"===a.mode[1]?e.isSameOrAfter(t[1],"month")||this.props.disabledDate&&this.props.disabledDate(e,"start"):e.isSameOrAfter(t[1],"month")},disabledEndMonth:function(e){var t=this.state.value,a=this.props;return"month"===a.mode[0]&&"month"===a.mode[1]?e.isSameOrBefore(t[0],"month")||this.props.disabledDate&&this.props.disabledDate(e,"end"):e.isSameOrBefore(t[0],"month")},render:function(){var e=void 0,t=void 0,a=this.props,n=this.state,o=a.prefixCls,s=a.dateInputPlaceholder,r=a.timePicker,i=a.showOk,l=a.locale,u=a.showClear,c=a.showToday,d=a.type,h=n.hoverValue,m=n.selectedValue,p=n.mode,f=n.showTimePicker,v=((e={})[a.className]=!!a.className,e[o]=1,e[o+"-hidden"]=!a.visible,e[o+"-range"]=1,e[o+"-show-time-picker"]=f,e[o+"-week-number"]=a.showWeekNumber,e),y=classnames(v),T={selectedValue:n.selectedValue,onSelect:this.onSelect,onDayHover:"start"===d&&m[1]||"end"===d&&m[0]||h.length?this.onDayHover:void 0},V=void 0,P=void 0;s&&(Array.isArray(s)?(V=s[0],P=s[1]):V=P=s);var S=!0===i||!1!==i&&!!r,g=classnames(((t={})[o+"-footer"]=!0,t[o+"-range-bottom"]=!0,t[o+"-footer-show-ok"]=S,t)),b=this.getStartValue(),C=this.getEndValue(),k=getTodayTime(b),w=k.month(),E=k.year(),D=b.year()===E&&b.month()===w||C.year()===E&&C.month()===w,O=b.clone().add(1,"months"),A=O.year()===C.year()&&O.month()===C.month();return React.createElement("div",{ref:this.saveRoot,className:y,style:a.style,tabIndex:"0"},a.renderSidebar(),React.createElement("div",{className:o+"-panel"},u&&m[0]&&m[1]?React.createElement("a",{className:o+"-clear-btn",role:"button",title:l.clear,onClick:this.clear}):null,React.createElement("div",{className:o+"-date-panel",onMouseLeave:"both"!==d?this.onDatePanelLeave:void 0,onMouseEnter:"both"!==d?this.onDatePanelEnter:void 0},React.createElement(CalendarPart,_extends({},a,T,{hoverValue:h,direction:"left",disabledTime:this.disabledStartTime,disabledMonth:this.disabledStartMonth,format:this.getFormat(),value:b,mode:p[0],placeholder:V,onInputSelect:this.onStartInputSelect,onValueChange:this.onStartValueChange,onPanelChange:this.onStartPanelChange,showDateInput:this.props.showDateInput,timePicker:r,showTimePicker:f,enablePrev:!0,enableNext:!A||this.isMonthYearPanelShow(p[1])})),React.createElement("span",{className:o+"-range-middle"},"~"),React.createElement(CalendarPart,_extends({},a,T,{hoverValue:h,direction:"right",format:this.getFormat(),timePickerDisabledTime:this.getEndDisableTime(),placeholder:P,value:C,mode:p[1],onInputSelect:this.onEndInputSelect,onValueChange:this.onEndValueChange,onPanelChange:this.onEndPanelChange,showDateInput:this.props.showDateInput,timePicker:r,showTimePicker:f,disabledTime:this.disabledEndTime,disabledMonth:this.disabledEndMonth,enablePrev:!A||this.isMonthYearPanelShow(p[0]),enableNext:!0}))),React.createElement("div",{className:g},a.renderFooter(),c||a.timePicker||S?React.createElement("div",{className:o+"-footer-btn"},c?React.createElement(TodayButton,_extends({},a,{disabled:D,value:n.value[0],onToday:this.onToday,text:l.backToToday})):null,a.timePicker?React.createElement(TimePickerButton,_extends({},a,{showTimePicker:f,onOpenTimePicker:this.onOpenTimePicker,onCloseTimePicker:this.onCloseTimePicker,timePickerDisabled:!this.hasSelectedValue()||h.length})):null,S?React.createElement(OkButton,_extends({},a,{onOk:this.onOk,okDisabled:!this.isAllowedDateAndTime(m)||!this.hasSelectedValue()||h.length})):null):null)))}});export default RangeCalendar;