123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- import React, { Component } from 'react';
- import moment from 'moment';
- import './index.less';
- import { DatePicker, Calendar, Icon } from 'antd';
- export default class extends Component {
- constructor(props) {
- super(props);
- this.state = { key: 0 };
- this.loading = false;
- }
- dateRender(date) {
- const { dateRender, checkRefresh } = this.props;
- if (!this.loading && checkRefresh) {
- if (checkRefresh(date, () => this.needRefresh())) {
- this.loading = true;
- }
- }
- if (dateRender) return dateRender(date);
- return <div className="ant-calendar-date">{date.get('date')}</div>;
- }
- needRefresh() {
- this.setState({ key: this.state.key + 1 });
- this.loading = false;
- setTimeout(() => {
- this.setState({ key: this.state.key + 1 });
- }, 1);
- }
- render() {
- const { show, hideInput, disabledDate, theme = '', value, onChange } = this.props;
- return (
- <div
- ref={ref => {
- if (!this.ref) {
- this.ref = ref;
- this.setState({ load: false });
- }
- }}
- className={`g-date-block ${hideInput ? 'hide-input' : ''}`}
- >
- <DatePicker
- open={show && this.ref}
- value={value}
- getCalendarContainer={() => this.ref.parentNode}
- dropdownClassName={`g-date ${theme} ${hideInput ? 'hide-input' : ''}`}
- disabledDate={disabledDate}
- dateRender={date => this.dateRender(date)}
- onChange={date => onChange(date)}
- />
- </div>
- );
- }
- }
- export class TwoDate extends Component {
- constructor(props) {
- super(props);
- const today = moment();
- this.state = {
- key: 0,
- value: today,
- leftValue: today.clone().subtract(1, 'month'),
- rightValue: today,
- };
- }
- dateRender(date) {
- const { checkRefresh } = this.props;
- if (!this.loading && checkRefresh) {
- if (checkRefresh(date, () => this.needRefresh())) {
- this.loading = true;
- }
- }
- return this.renderItem(date);
- }
- needRefresh() {
- this.setState({ key: this.state.key + 1 });
- this.loading = false;
- setTimeout(() => {
- this.setState({ key: this.state.key + 1 });
- }, 1);
- }
- renderItem(date) {
- const { value } = this.state;
- const { getType } = this.props;
- return (
- <div
- className={`ant-fullcalendar-date ${getType ? getType(date) : ''} ${value.diff(date) === 0 ? 'selected' : ''}`}
- >
- <div className="ant-fullcalendar-value">{date.get('date')}</div>
- </div>
- );
- }
- onLeftSelect(date) {
- const { onChange, startDate } = this.props;
- if (startDate && date.isBefore(startDate)) return;
- this.setState({
- value: date,
- leftValue: date,
- rightValue: date.clone().add(1, 'month'),
- });
- if (onChange) onChange(date);
- }
- onRightSelect(date) {
- const { onChange, endDate } = this.props;
- if (endDate && date.isAfter(endDate)) return;
- this.setState({
- value: date,
- rightValue: date,
- leftValue: date.clone().subtract(1, 'month'),
- });
- if (onChange) onChange(date);
- }
- leftHeadRender() {
- const { leftValue } = this.state;
- const { extendInfo } = this.props;
- return (
- <div className="t-c">
- <div style={{ left: 15, top: 0 }} className="p-a">
- <Icon
- className="m-r-5"
- type="double-left"
- onClick={() => this.onLeftSelect(leftValue.clone().subtract(1, 'year'))}
- />
- <Icon type="left" onClick={() => this.onLeftSelect(leftValue.clone().subtract(1, 'month'))} />
- </div>
- <span>{leftValue.year()}年 </span>
- <span>{leftValue.month() + 1}月 </span>
- <span className="t-4">{extendInfo && extendInfo(leftValue)}</span>
- </div>
- );
- }
- rightHeadRender() {
- const { rightValue } = this.state;
- const { extendInfo } = this.props;
- return (
- <div className="t-c">
- <span>{rightValue.year()}年 </span>
- <span>{rightValue.month() + 1}月 </span>
- <span className="t-4">{extendInfo && extendInfo(rightValue)}</span>
- <div style={{ right: 15, top: 0 }} className="p-a">
- <Icon type="right" onClick={() => this.onRightSelect(rightValue.clone().add(1, 'month'))} />
- <Icon
- className="m-l-5"
- type="double-right"
- onClick={() => this.onRightSelect(rightValue.clone().add(1, 'year'))}
- />
- </div>
- </div>
- );
- }
- render() {
- const { disabledDate } = this.props;
- const { leftValue, rightValue } = this.state;
- return (
- <div className="g-two-date">
- <div className="g-two-head">
- {this.leftHeadRender()}
- {this.rightHeadRender()}
- </div>
- <div className="g-two-body">
- <Calendar
- fullscreen={false}
- headerRender={data => this.leftHeadRender(data)}
- value={leftValue}
- disabledDate={disabledDate}
- dateFullCellRender={date => this.dateRender(date)}
- onSelect={date => this.onLeftSelect(date)}
- onPanelChange={date => this.onLeftSelect(date)}
- />
- <Calendar
- fullscreen={false}
- headerRender={data => this.rightHeadRender(data)}
- value={rightValue}
- disabledDate={disabledDate}
- dateFullCellRender={date => this.dateRender(date)}
- onSelect={date => this.onRightSelect(date)}
- onPanelChange={date => this.onRightSelect(date)}
- />
- </div>
- </div>
- );
- }
- }
|