DateSelector.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. <template>
  2. <view class="date-selector">
  3. <view style="padding: 0 26%;">
  4. <u-tabs
  5. :list="list"
  6. :is-scroll="false"
  7. :current="currentTab"
  8. @change="tabChange"
  9. activeColor="#00C18A"
  10. inactiveColor="#999999"
  11. bgColor="transparent"
  12. ></u-tabs>
  13. </view>
  14. <view class="date-control-box">
  15. <view class="contol-btn">
  16. <view class="left-btn" @click="onClickLeft" :class="startDisabled ? 'disable' : ''">
  17. <view class="left-bracket bracket"></view>
  18. </view>
  19. <view class="right-btn" @click="onClickRight" :class="endDisabled ? 'disable' : ''">
  20. <view class="right-bracket bracket"></view>
  21. </view>
  22. </view>
  23. <view>{{ currentSelect.start}} - {{ currentSelect.end }}</view>
  24. </view>
  25. </view>
  26. </template>
  27. <script>
  28. import {
  29. isSameDay,
  30. getCurrentWeekDates, getLastWeekDates,
  31. getMonthlyDates, getLastMonthDates ,
  32. getNextWeekDates, getNextMonthDates
  33. } from '@/utils/dateUtil.js'
  34. export default {
  35. name: 'DateSelector',
  36. data() {
  37. return {
  38. list: [
  39. { name: '周统计' },
  40. { name: '月统计' },
  41. ],
  42. currentTab: 0,
  43. currentSelect: {},
  44. startDisabled: false,
  45. endDisabled: false,
  46. }
  47. },
  48. methods: {
  49. initDate(param) {
  50. if(this.currentTab === 0) {
  51. this.currentSelect = getCurrentWeekDates(param)
  52. } else {
  53. this.currentSelect = getMonthlyDates(param)
  54. }
  55. this.fetchData()
  56. },
  57. tabChange(index) {
  58. this.currentTab = index
  59. this.initDate(new Date())
  60. },
  61. onClickLeft() {
  62. const start = this.currentSelect.start
  63. const startDate = new Date(start)
  64. if(start) {
  65. if(this.currentTab === 0) {
  66. // 周统计
  67. this.currentSelect = getLastWeekDates(startDate)
  68. } else {
  69. // 月统计
  70. this.currentSelect = getLastMonthDates(startDate)
  71. }
  72. this.fetchData()
  73. }
  74. },
  75. onClickRight() {
  76. const end = this.currentSelect.end
  77. const endDate = new Date(end)
  78. const isSame = isSameDay(new Date(), endDate)
  79. if(isSame) {
  80. return
  81. }
  82. if(end) {
  83. if(this.currentTab === 0) {
  84. // 周统计
  85. this.currentSelect = getNextWeekDates(endDate)
  86. } else {
  87. // 月统计
  88. this.currentSelect = getNextMonthDates(endDate)
  89. }
  90. this.fetchData()
  91. }
  92. },
  93. fetchData() {
  94. this.$emit('dateChange', this.currentSelect)
  95. },
  96. },
  97. }
  98. </script>
  99. <style lang="scss">
  100. .date-selector {
  101. .date-control-box {
  102. height: 80rpx;
  103. display: flex;
  104. align-items: center;
  105. justify-content: center;
  106. font-size: 28rpx;
  107. line-height: 42rpx;
  108. font-weight: 700;
  109. color: #00C18A;
  110. position: relative;
  111. .contol-btn {
  112. position: absolute;
  113. left: 0;
  114. top: 0;
  115. width: 100%;
  116. display: flex;
  117. justify-content: space-between;
  118. .left-btn, .right-btn {
  119. height: 80rpx;
  120. width: 80rpx;
  121. border-radius: 40rpx;
  122. color: #00C18A;
  123. background-color: #E8FBF6;
  124. // background-color: red;
  125. display: flex;
  126. justify-content: center;
  127. align-items: center;
  128. &:active {
  129. opacity: .5;
  130. }
  131. }
  132. .bracket {
  133. position: relative;
  134. width: 40rpx;
  135. height: 40rpx;
  136. display: flex;
  137. align-items: center;
  138. justify-content: center;
  139. }
  140. .left-bracket {
  141. margin-right: 8rpx;
  142. }
  143. .right-bracket {
  144. margin-left: 8rpx;
  145. }
  146. .left-bracket::before,
  147. .right-bracket::after {
  148. content: '';
  149. position: absolute;
  150. width: 0;
  151. height: 0;
  152. border-style: solid;
  153. }
  154. .left-bracket::before {
  155. border-width: 20rpx 20rpx 20rpx 0;
  156. border-color: transparent #00C18A transparent transparent;
  157. }
  158. .right-bracket::after {
  159. border-width: 20rpx 0 20rpx 20rpx;
  160. border-color: transparent transparent transparent #00C18A;
  161. }
  162. }
  163. }
  164. }
  165. </style>