From 41239717c4446af79268b968557274f88a0afaeb Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期六, 15 八月 2020 10:16:07 +0800
Subject: [PATCH] 2020-08-15

---
 src/tabviews/zshare/calendar/index.jsx |  171 ++++++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 139 insertions(+), 32 deletions(-)

diff --git a/src/tabviews/zshare/calendar/index.jsx b/src/tabviews/zshare/calendar/index.jsx
index abb13ee..6616507 100644
--- a/src/tabviews/zshare/calendar/index.jsx
+++ b/src/tabviews/zshare/calendar/index.jsx
@@ -12,7 +12,8 @@
 class Calendar extends Component {
   static propTpyes = {
     data: PropTypes.any,            // 浜嬩欢鏁版嵁
-    levels: PropTypes.any
+    calendar: PropTypes.any,
+    loading: false
   }
 
   state = {
@@ -22,11 +23,11 @@
     selectYear: moment().format('YYYY'),
     selectMonth: moment().format('MM'),
     datelist: null,
-    monthlist: null,
+    monthlist: null
   }
 
   UNSAFE_componentWillMount() {
-    const { levels } = this.props
+    const { calendar, data } = this.props
 
     let yearlist = []
     let _selectYear = +this.state.selectYear
@@ -38,17 +39,14 @@
     }
 
     let datelist = this.getDateList(this.state.selectYear)
-    let _levels = null
 
-    if (!levels) {
-      _levels = ['day', 'month', 'year']
-    } else {
-      _levels = levels
+    if (data && data.length > 0) {
+      datelist = this.mountdata(datelist, data)
     }
-
+    
+    let _levels = calendar.levels
     let level = _levels[0]
     let monthlist = null
-    level = 'month'
 
     if (_levels.includes('month')) {
       monthlist = datelist.filter(item => item.month === moment().format('MM'))[0]
@@ -65,12 +63,112 @@
 
   UNSAFE_componentWillReceiveProps(nextProps) {
     if (!is(fromJS(this.props.data), fromJS(nextProps.data))) {
-      
+      let datelist = this.mountdata(this.state.datelist, nextProps.data)
+      let monthlist = null
+
+      if (this.state.levels.includes('month')) {
+        monthlist = datelist.filter(item => item.month === this.state.selectMonth)[0]
+      }
+
+      this.setState({
+        datelist: datelist,
+        monthlist
+      })
+    } else if (!is(fromJS(this.props.calendar), fromJS(nextProps.calendar))) {
+      this.setState({
+        levels: nextProps.calendar.levels
+      })
     }
   }
 
   shouldComponentUpdate (nextProps, nextState) {
-    return !is(fromJS(this.state), fromJS(nextState))
+    return !is(fromJS(this.props), fromJS(nextProps)) || !is(fromJS(this.state), fromJS(nextState))
+  }
+
+  mountdata = (datelist, data) => {
+    const { calendar } = this.props
+
+    let datalist = []
+    let levels = {
+      black: 1,
+      red: 2,
+      orange: 3,
+      yellow: 4,
+      green: 5,
+      lightgreen: 6,
+      cyan: 7,
+      blue: 8,
+      purple: 9,
+      white: 10
+    }
+
+    data.forEach(item => {
+      let startTime = item[calendar.startfield]
+      let endTime = item[calendar.endfield]
+      let color = item[calendar.colorfield]
+
+      if (!startTime || !/^(1|2)\d{3}(-|\/)\d{2}(-|\/)\d{2}/.test(startTime)) return
+      if (!endTime || !/^(1|2)\d{3}(-|\/)\d{2}(-|\/)\d{2}/.test(endTime)) return
+      if (!item[calendar.remarkfield]) return
+
+      datalist.push({
+        color: color,
+        level: color && levels[color] ? levels[color] : 100,
+        remark: item[calendar.remarkfield],
+        startMonth: startTime.substr(0, 4) + startTime.substr(5, 2),
+        endMonth: endTime.substr(0, 4) + endTime.substr(5, 2),
+        start: startTime.substr(0, 4) + startTime.substr(5, 2) + startTime.substr(8, 2),
+        startTime: `${startTime.substr(5, 2)}-${startTime.substr(8, 2)}`,
+        end: endTime.substr(0, 4) + endTime.substr(5, 2) + endTime.substr(8, 2),
+        endTime: `${endTime.substr(5, 2)}-${endTime.substr(8, 2)}`
+      })
+    })
+
+    if (datalist.length === 0) return datelist
+
+    datalist.sort((a, b) => a.level - b.level)
+
+    let styles = [
+      {background: 'black', color: '#ffffff'},
+      {background: 'red', color: '#ffffff'},
+      {background: 'orange', color: '#ffffff'},
+      {background: 'yellow', color: 'rgba(0,0,0,.65)'},
+      {background: 'green', color: '#ffffff'},
+      {background: 'lightgreen', color: 'rgba(0,0,0,.65)'},
+      {background: 'cyan', color: 'rgba(0,0,0,.65)'},
+      {background: 'blue', color: '#ffffff'},
+      {background: 'purple', color: '#ffffff'},
+      {background: 'white', color: 'rgba(0,0,0,.65)'},
+    ]
+
+    return datelist.map(month => {
+      datalist.forEach(item => {
+        if (item.startMonth <= month.time && item.endMonth >= month.time) {
+          month.subData.push(item)
+        }
+      })
+      month.sublist = month.sublist.map(week => {
+        week.sublist = week.sublist.map(day => {
+          if (!day) return null
+
+          datalist.forEach(item => {
+            if (item.start <= day.time && item.end >= day.time) {
+              day.subData.push(item)
+            }
+          })
+
+          if (day.subData[0]) {
+            day.style = styles[day.subData[0].level - 1] || null
+          }
+
+          return day
+        })
+
+        return week
+      })
+
+      return month
+    })
   }
 
   getDateList = (selectYear) => {
@@ -91,10 +189,12 @@
       }
 
       for (let i = 1; i <= end; i++) {
+        let _day = i < 10 ? `0${i}` : `${i}`
+
         if (_weeklist[_weeklist.length - 1].sublist.length < 7) {
-          _weeklist[_weeklist.length - 1].sublist.push({day: i < 10 ? `0${i}` : `${i}`, label: i})
+          _weeklist[_weeklist.length - 1].sublist.push({day: _day, time: selectYear + month + _day, label: i, subData: []})
         } else {
-          let _week = {week: _weeklist.length + 1, sublist: [{day: i < 10 ? `0${i}` : `${i}`, label: i}]}
+          let _week = {week: _weeklist.length + 1, sublist: [{day: _day, time: selectYear + month + _day, label: i, subData: []}]}
           _weeklist.push(_week)
         }
       }
@@ -106,8 +206,10 @@
 
       datelist.push({
         month: month,
+        time: selectYear + month,
         label: monthName[month],
-        sublist: _weeklist
+        sublist: _weeklist,
+        subData: []
       })
     })
 
@@ -128,6 +230,10 @@
     }
 
     this.setState({ selectYear: value, datelist, monthlist })
+
+    if (this.props.changeDate) {
+      this.props.changeDate(value)
+    }
   }
 
   monthChange = (value) => {
@@ -144,14 +250,10 @@
   }
 
   render() {
+    const { loading } = this.props
     const { level, selectMonth, selectYear, yearlist, levels, datelist, monthlist } = this.state
     const _levelName = {day: '鏃�', month: '鏈�', year: '骞�'}
-    const listData = [
-      { type: 'orange', content: 'This is error event 2.' },
-      { type: 'cyan', content: 'This is error event 3.' },
-      { type: 'green', content: 'This is error event 4.' },
-    ]
-    
+    console.log(loading)
     return (
       <div className="mk-calendar">
         <div className="mk-calendar-control">
@@ -194,12 +296,17 @@
                       <tr key={cell.week}>
                         {cell.sublist.map((d, i) => (
                           <td key={i}>
-                            {d ? <div className={'day-wrap ' + d.class} onClick={() => this.triggerDay(d)}>
-                              {d.label ? <Popover mouseEnterDelay={0.3} overlayClassName="calendar-day-pop" content={
+                            {d ? <div className={'day-wrap ' + d.class} style={d.style || null} onClick={() => this.triggerDay(d)}>
+                              {d.subData.length > 0 ? <Popover mouseEnterDelay={0.3} overlayClassName="calendar-day-pop" content={
                                 <div>
-                                  {listData.map((data, index) => (
+                                  {d.subData.map((data, index) => (
                                     <div key={index} className="message">
-                                      <Badge color={data.type} text={data.content} />
+                                      <Badge color={data.color} text={
+                                        <span>
+                                          {data.remark}
+                                          <span style={{color: 'rgba(0,0,0,.45)'}}>({data.startTime + ' ~ ' + data.endTime})</span>
+                                        </span>}
+                                      />
                                     </div>
                                   ))}
                                 </div>
@@ -228,14 +335,14 @@
                   <tr key={cell.week}>
                     {cell.sublist.map((d, i) => (
                       <td key={i}>
-                        {d ? <div className="month-wrap" onClick={() => this.triggerDay(d)}>
+                        {d ? <div className="month-wrap" style={d.style || null} onClick={() => this.triggerDay(d)}>
                           <div className="header">
                             {d.label}
                           </div>
                           <ul className="content">
-                            {[1,3,7,18,22].includes(d.label) && listData.map((data, index) => (
-                              <li key={index} className="message" title={data.content}>
-                                <Badge color={data.type} text={data.content} />
+                            {d.subData.map((data, index) => (
+                              <li key={index} className="message" title={data.remark}>
+                                <Badge color={data.color} text={data.remark} />
                               </li>
                             ))}
                           </ul>
@@ -255,9 +362,9 @@
                     {item.label}
                   </div>
                   <ul className="content">
-                    {['01', '05', '10'].includes(item.month) && listData.map((data, index) => (
-                      <li key={index} className="message" title={data.content}>
-                        <Badge color={data.type} text={data.content} />
+                    {item.subData.map((data, index) => (
+                      <li key={index} className="message" title={data.remark}>
+                        <Badge color={data.color} text={data.remark} />
                       </li>
                     ))}
                   </ul>

--
Gitblit v1.8.0