| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div |
| | | class="gantt-timeline" |
| | | :style="{'margin-left':-cellWidth/2+'px'}" |
| | | > |
| | | <div |
| | | v-for="(day,index) in getDays" |
| | | :key="index" |
| | | class="gantt-timeline-block" |
| | | :style="{width:getTimeScales(day).length*cellWidth+'px'}" |
| | | > |
| | | <div |
| | | class="gantt-timeline-day " |
| | | :style="heightStyle" |
| | | > |
| | | {{ day.format('YYYY-MM-DD') }} |
| | | {{ getDayMy(day.format('YYYY-MM-DD')) }} |
| | | </div> |
| | | <div |
| | | class="gantt-timeline-scale" |
| | | :style="heightStyle" |
| | | style="border-right: 1px solid #eee" |
| | | > |
| | | <div |
| | | v-for="(hour,ind) in getTimeScales(day)" |
| | | :key="ind" |
| | | :style="cellWidthStyle" |
| | | > |
| | | {{ hour }} |
| | | <!-- <span v-if="hour !='01' ">{{hour}}</span> --> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import dayjs from 'dayjs' |
| | | import { getBeginTimeOfTimeLine } from '../../utils/timeLineUtils.js' |
| | | |
| | | const START_DAY = Symbol() |
| | | const MIDDLE_DAY = Symbol() |
| | | const END_DAY = Symbol() |
| | | |
| | | function isSameDay(one, two) { |
| | | return one.isSame(two, 'day') |
| | | } |
| | | |
| | | export default { |
| | | name: 'Timeline', |
| | | |
| | | props: { |
| | | start: { |
| | | type: dayjs |
| | | }, |
| | | end: { |
| | | type: dayjs |
| | | }, |
| | | cellWidth: { |
| | | type: Number |
| | | }, |
| | | titleHeight: { |
| | | type: Number |
| | | }, |
| | | scale: { |
| | | type: Number |
| | | } |
| | | }, |
| | | |
| | | computed: { |
| | | /** |
| | | * 天å表 |
| | | * @returns {[dayjs]} 该data䏿æéè¦æ¸²æçæ°æ® |
| | | */ |
| | | getDays() { |
| | | const temp = [] |
| | | let { start, end } = this |
| | | |
| | | for (; !isSameDay(start, end); start = start.add(1, 'day')) { |
| | | temp.push(start) |
| | | } |
| | | temp.push(start) |
| | | |
| | | return temp |
| | | }, |
| | | cellWidthStyle() { |
| | | return { |
| | | width: `${this.cellWidth}px` |
| | | } |
| | | }, |
| | | heightStyle() { |
| | | return { |
| | | height: this.titleHeight + 'px', |
| | | 'line-height': this.titleHeight + 'px' |
| | | } |
| | | } |
| | | }, |
| | | |
| | | methods: { |
| | | // ç®åºææ |
| | | getDayMy(day) { |
| | | const weekArray = new Array('æææ¥', 'ææä¸', 'ææäº', 'ææä¸', 'ææå', 'ææäº', 'ææå
') |
| | | return weekArray[new Date(day).getDay()] |
| | | }, |
| | | /** |
| | | * è·åæ¶é´å»åº¦æ°ç» |
| | | * |
| | | * @param {dayjs} date |
| | | * @returns {[string]} 该data䏿æéè¦æ¸²æçæ°æ® |
| | | */ |
| | | getTimeScales(date) { |
| | | const { start, end } = this |
| | | if (isSameDay(date, start)) { |
| | | return this.generateTimeScale(START_DAY) |
| | | } else if (isSameDay(date, end)) { |
| | | return this.generateTimeScale(END_DAY) |
| | | } else { |
| | | return this.generateTimeScale(MIDDLE_DAY) |
| | | } |
| | | }, |
| | | /** |
| | | * çææ¶é´å»åº¦æ°ç» |
| | | * |
| | | * @param {Symbol} type |
| | | * @returns {[string]} 该data䏿æéè¦æ¸²æçæ°æ® |
| | | */ |
| | | generateTimeScale(type) { |
| | | const totalblock = [] |
| | | const { start, end, scale } = this |
| | | let a, b |
| | | switch (type) { |
| | | case START_DAY: // åstartåä¸å¤© |
| | | a = getBeginTimeOfTimeLine(start, scale) |
| | | // startåendåä¸å¤©ç¹æ®å¤ç |
| | | if (isSameDay(start, end)) { |
| | | b = end |
| | | } else { |
| | | b = start.endOf('day') |
| | | } |
| | | break |
| | | case END_DAY: // åend åä¸å¤© |
| | | a = end.startOf('day') |
| | | b = end |
| | | break |
| | | case MIDDLE_DAY: // startåendä¸é´ç天 |
| | | a = start.startOf('day') |
| | | b = start.endOf('day') |
| | | break |
| | | default: |
| | | throw new TypeError('é误ç计ç®ç±»å') |
| | | } |
| | | while (!a.isAfter(b)) { |
| | | // if (scale >= 60) { |
| | | // totalblock.push(a.format('HH')) |
| | | // } else { |
| | | totalblock.push(a.format('HH:mm')) |
| | | // } |
| | | a = a.add(scale, 'minute') |
| | | } |
| | | // console.log(1, totalblock) |
| | | return totalblock |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | <style lang="scss" scoped> |
| | | .gantt-timeline-day { |
| | | border-right: 1px solid #ebeef5; |
| | | border-bottom: 1px solid #ebeef5; |
| | | //background: rgb(245, 245, 245); |
| | | background: #fff; |
| | | color: #909399; |
| | | font-size: 14px; |
| | | } |
| | | </style> |