index.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. import React, { Component } from 'react';
  2. import moment from 'moment';
  3. import './index.less';
  4. import { DatePicker, Calendar, Icon } from 'antd';
  5. export default class extends Component {
  6. constructor(props) {
  7. super(props);
  8. this.state = { key: 0 };
  9. this.loading = false;
  10. }
  11. dateRender(date) {
  12. const { dateRender, checkRefresh } = this.props;
  13. if (!this.loading && checkRefresh) {
  14. if (checkRefresh(date, () => this.needRefresh())) {
  15. this.loading = true;
  16. }
  17. }
  18. if (dateRender) return dateRender(date);
  19. return <div className="ant-calendar-date">{date.get('date')}</div>;
  20. }
  21. needRefresh() {
  22. this.setState({ key: this.state.key + 1 });
  23. this.loading = false;
  24. setTimeout(() => {
  25. this.setState({ key: this.state.key + 1 });
  26. }, 1);
  27. }
  28. render() {
  29. const { show, hideInput, disabledDate, theme = '', value, onChange } = this.props;
  30. return (
  31. <div
  32. ref={ref => {
  33. if (!this.ref) {
  34. this.ref = ref;
  35. this.setState({ load: false });
  36. }
  37. }}
  38. className={`g-date-block ${hideInput ? 'hide-input' : ''}`}
  39. >
  40. <DatePicker
  41. open={show && this.ref}
  42. value={value}
  43. getCalendarContainer={() => this.ref.parentNode}
  44. dropdownClassName={`g-date ${theme} ${hideInput ? 'hide-input' : ''}`}
  45. disabledDate={disabledDate}
  46. dateRender={date => this.dateRender(date)}
  47. onChange={date => onChange(date)}
  48. />
  49. </div>
  50. );
  51. }
  52. }
  53. export class TwoDate extends Component {
  54. constructor(props) {
  55. super(props);
  56. const today = moment();
  57. this.state = {
  58. key: 0,
  59. value: today,
  60. leftValue: today.clone().subtract(1, 'month'),
  61. rightValue: today,
  62. };
  63. }
  64. dateRender(date) {
  65. const { checkRefresh } = this.props;
  66. if (!this.loading && checkRefresh) {
  67. if (checkRefresh(date, () => this.needRefresh())) {
  68. this.loading = true;
  69. }
  70. }
  71. return this.renderItem(date);
  72. }
  73. needRefresh() {
  74. this.setState({ key: this.state.key + 1 });
  75. this.loading = false;
  76. setTimeout(() => {
  77. this.setState({ key: this.state.key + 1 });
  78. }, 1);
  79. }
  80. renderItem(date) {
  81. const { value } = this.state;
  82. const { getType } = this.props;
  83. return (
  84. <div
  85. className={`ant-fullcalendar-date ${getType ? getType(date) : ''} ${value.diff(date) === 0 ? 'selected' : ''}`}
  86. >
  87. <div className="ant-fullcalendar-value">{date.get('date')}</div>
  88. </div>
  89. );
  90. }
  91. onLeftSelect(date) {
  92. const { onChange } = this.props;
  93. this.setState({
  94. value: date,
  95. leftValue: date,
  96. rightValue: date.clone().add(1, 'month'),
  97. });
  98. if (onChange) onChange(date);
  99. }
  100. onRightSelect(date) {
  101. const { onChange } = this.props;
  102. this.setState({
  103. value: date,
  104. rightValue: date,
  105. leftValue: date.clone().subtract(1, 'month'),
  106. });
  107. if (onChange) onChange(date);
  108. }
  109. leftHeadRender() {
  110. const { leftValue } = this.state;
  111. const { extendInfo } = this.props;
  112. return (
  113. <div className="t-c">
  114. <div style={{ left: 15, top: 0 }} className="p-a">
  115. <Icon
  116. className="m-r-5"
  117. type="double-left"
  118. onClick={() => this.onLeftSelect(leftValue.clone().subtract(1, 'year'))}
  119. />
  120. <Icon type="left" onClick={() => this.onLeftSelect(leftValue.clone().subtract(1, 'month'))} />
  121. </div>
  122. <span>{leftValue.year()}年 </span>
  123. <span>{leftValue.month()}月 </span>
  124. <span className="t-4">{extendInfo && extendInfo(leftValue)}</span>
  125. </div>
  126. );
  127. }
  128. rightHeadRender() {
  129. const { rightValue } = this.state;
  130. const { extendInfo } = this.props;
  131. return (
  132. <div className="t-c">
  133. <span>{rightValue.year()}年 </span>
  134. <span>{rightValue.month()}月 </span>
  135. <span className="t-4">{extendInfo && extendInfo(rightValue)}</span>
  136. <div style={{ right: 15, top: 0 }} className="p-a">
  137. <Icon type="right" onClick={() => this.onRightSelect(rightValue.clone().add(1, 'year'))} />
  138. <Icon
  139. className="m-l-5"
  140. type="double-right"
  141. onClick={() => this.onRightSelect(rightValue.clone().add(1, 'month'))}
  142. />
  143. </div>
  144. </div>
  145. );
  146. }
  147. render() {
  148. const { disabledDate } = this.props;
  149. const { leftValue, rightValue } = this.state;
  150. return (
  151. <div className="g-two-date">
  152. <div className="g-two-head">
  153. {this.leftHeadRender()}
  154. {this.rightHeadRender()}
  155. </div>
  156. <div className="g-two-body">
  157. <Calendar
  158. fullscreen={false}
  159. headerRender={data => this.leftHeadRender(data)}
  160. value={leftValue}
  161. disabledDate={disabledDate}
  162. dateFullCellRender={date => this.dateRender(date)}
  163. onSelect={date => this.onLeftSelect(date)}
  164. onPanelChange={date => this.onLeftSelect(date)}
  165. />
  166. <Calendar
  167. fullscreen={false}
  168. headerRender={data => this.rightHeadRender(data)}
  169. value={rightValue}
  170. disabledDate={disabledDate}
  171. dateFullCellRender={date => this.dateRender(date)}
  172. onSelect={date => this.onRightSelect(date)}
  173. onPanelChange={date => this.onRightSelect(date)}
  174. />
  175. </div>
  176. </div>
  177. );
  178. }
  179. }