Advertisement
aivavic

date-range-picker

Mar 2nd, 2018
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
HTML 5.98 KB | None | 0 0
  1. <template>
  2.   <div class="date-rang-picker">
  3.     <section>
  4.       <div>
  5.         <label for="filter_date_start">Початкова дата</label>
  6.         <div class="position-relative" style="position: relative;">
  7.           <input id="filter_date_start" type="text" class="form-control" placeholder="дд.мм.рррр" readonly
  8.                  v-model="dateStartStr">
  9.           <fp-icon class="calendar-icon" :name="'calendarToday'" @click="toggleStartDateCalendar"></fp-icon>
  10.         </div>
  11.         <div class="calendar-picker">
  12.           <calendar :value="dateStartStr" :has-input="false"
  13.                    :disable-before="dateStartDisableBefore"
  14.                    :disable-after="dateStartDisableAfter"
  15.                    :on-day-click="onStartDayClick"
  16.                    v-if="showStartDateCalendar">
  17.           </calendar>
  18.         </div>
  19.       </div>
  20.  
  21.       <div class="pad"><span class="line"></span></div>
  22.  
  23.       <div>
  24.         <label for="filter_date_end">Кінцева дата</label>
  25.         <div class="position-relative" style="position: relative;">
  26.           <input id="filter_date_end" type="text" class="form-control" placeholder="дд.мм.рррр" readonly
  27.                  v-model="dateEndStr">
  28.           <fp-icon class="calendar-icon" :name="'calendarToday'" @click="toggleEndDateCalendar"></fp-icon>
  29.         </div>
  30.         <div class="calendar-picker">
  31.           <calendar :value="dateEndStr" :has-input="false"
  32.                    :disable-before="dateEndDisableBefore"
  33.                    :disable-after="dateEndDisableAfter"
  34.                    :on-day-click="onEndDayClick"
  35.                    v-if="showEndDateCalendar">
  36.           </calendar>
  37.         </div>
  38.       </div>
  39.     </section>
  40.   </div>
  41. </template>
  42.  
  43. <script>
  44. import dateUtil from '@/util/date'
  45. import calendar from '@/components/common/calendar'
  46.  
  47. const msInDay = 24 * 3600 * 1000
  48. const msInMonth = msInDay * 30
  49. const today = new Date()
  50.  
  51. export default {
  52.   name: 'DaterangePicker',
  53.   components: {
  54.     calendar
  55.   },
  56.   data () {
  57.     return {
  58.       dateStartStr: '',
  59.       dateEndStr: '',
  60.       dateStart: '',
  61.       dateEnd: '',
  62.       dirty: false,
  63.       showStartDateCalendar: false,
  64.       showEndDateCalendar: false,
  65.       dateStartDisableBefore: null,
  66.       dateStartDisableAfter: today,
  67.       dateEndDisableBefore: null,
  68.       dateEndDisableAfter: today
  69.     }
  70.   },
  71.   props: {
  72.     title: {
  73.       type: String,
  74.       default: ''
  75.     },
  76.     dateFrom: {
  77.       type: String,
  78.       default: ''
  79.     },
  80.     dateTo: {
  81.       type: String,
  82.       default: ''
  83.     },
  84.     dateFromDefault: {
  85.       type: String,
  86.       default: ''
  87.     },
  88.     dateToDefault: {
  89.       type: String,
  90.       default: ''
  91.     }
  92.   },
  93.   created () {
  94.     this.dateStartStr = this.dateFrom || this.dateFromDefault || ''
  95.     this.dateStart = dateUtil.parse(this.dateStartStr)
  96.     this.dateEndStr = this.dateTo || this.dateToDefault || ''
  97.     this.dateEnd = dateUtil.parse(this.dateEndStr)
  98.  
  99.     if (!this.dateFrom && !this.dateTo && this.dateFromDefault && this.dateToDefault &&
  100.        this.dateFrom !== this.dateFromDefault && this.dateTo !== this.dateToDefault) {
  101.      this.dirty = true
  102.    }
  103.  },
  104.  methods: {
  105.    onStartDayClick (date, dateStr) {
  106.      this.dateStart = date
  107.      this.dateStartStr = dateStr
  108.      this.showStartDateCalendar = false
  109.      this.$emit('onDateStart', dateStr)
  110.      // update end date threshold
  111.      let threashold = new Date(date.getTime() + msInMonth)
  112.      if (threashold > today) {
  113.        threashold = today
  114.      }
  115.      this.dateEndDisableBefore = date
  116.      this.dateEndDisableAfter = threashold
  117.  
  118.      if (!this.dateEnd) {
  119.        this.dirty = true
  120.        return
  121.      }
  122.  
  123.      // update end date
  124.  
  125.      // can't be ealier than start date
  126.      if (this.dateEnd < this.dateStart) {
  127.        this.dateEnd = this.dateStart
  128.      } else { // can't be later than today or start date + 30 days
  129.        let maxEndDate = new Date(this.dateStart.getTime() + msInMonth)
  130.        if (maxEndDate > today) {
  131.          maxEndDate = today
  132.        }
  133.        // if (this.dateEnd > maxEndDate) {
  134.        //   this.dateEnd = maxEndDate
  135.        // }
  136.      }
  137.  
  138.      this.dateEndStr = dateUtil.format(this.dateEnd, true)
  139.  
  140.      this.dirty = true
  141.    },
  142.    onEndDayClick (date, dateStr) {
  143.      this.dateEnd = date
  144.      this.dateEndStr = dateStr
  145.      this.$emit('onDateEnd', dateStr)
  146.      this.showEndDateCalendar = false
  147.      this.dirty = !!this.dateStart
  148.    },
  149.    toggleStartDateCalendar () {
  150.      if (!this.showStartDateCalendar) {
  151.        this.showEndDateCalendar = false
  152.      }
  153.      this.showStartDateCalendar = !this.showStartDateCalendar
  154.    },
  155.    toggleEndDateCalendar () {
  156.  
  157.      if (!this.showEndDateCalendar) {
  158.        this.showStartDateCalendar = false
  159.      }
  160.      this.showEndDateCalendar = !this.showEndDateCalendar
  161.    },
  162.    applyFilter () {
  163.      const data = {
  164.        from: this.dateStartStr,
  165.        to: this.dateEndStr
  166.      }
  167.  
  168.      this.$parent.$emit('applyDaterangeFilter', data)
  169.      this.dirty = false
  170.    },
  171.    close () {
  172.      this.$parent.$emit('closeDaterangeDialog')
  173.    }
  174.  }
  175. }
  176. </script>
  177.  
  178. <style scoped>
  179.  
  180. header h5 {
  181.  margin-top: 10px;
  182.   text-align: center;
  183. }
  184. section {
  185.   display: flex;
  186. }
  187. input {
  188.   width: 160px;
  189.   position: relative;
  190. }
  191. footer {
  192.   display: flex;
  193.   justify-content: space-between;
  194. }
  195. footer button {
  196.   padding: 7px 25px;
  197.   border-radius: 0.10rem;
  198. }
  199. footer button:nth-last-child(1) {
  200.   margin-left: 20px;
  201. }
  202. .calendar-icon {
  203.   position: absolute;
  204.   width: 24px;
  205.   top: 0.5rem;
  206.   right: 0.5rem;
  207.   height: 24px;
  208. }
  209. .pad {
  210.   width: 50px;
  211.   padding: 0 7px;
  212.   position: relative;
  213.   box-sizing: border-box;
  214. }
  215. .line {
  216.   width: 60%;
  217.   height: 1px;
  218.   background: #000;
  219.   position: absolute;
  220.   left: 20%;
  221.   top: 50px;
  222.   box-sizing: border-box;
  223. }
  224. .form-control::placeholder {
  225.   color: gray;
  226.   font-style: italic;
  227. }
  228. .form-control[readonly] {
  229.   background-color: #fff;
  230. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement