date-time-pc.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. // var dateTimeComponentTemplate = `
  2. // <div class="selector-content time-content">
  3. // <div class="select-group-container" v-show="showSelectGroup">
  4. // <div
  5. // v-for="(item, index) in timeSelectList"
  6. // :key="index"
  7. // class="j-button-item bgc"
  8. // :class="{
  9. // active: item.selected
  10. // }"
  11. // @click="clickTimeButton(item)"
  12. // >{{ item.name }}</div>
  13. // </div>
  14. // <div class="date-time-container section-d">
  15. // <el-date-picker
  16. // v-model="dateTimePickerState.start"
  17. // class="date-time-item section-d-item left"
  18. // :type="dateTimePickerConf.type"
  19. // :editable="dateTimePickerConf.editable"
  20. // :align="dateTimePickerConf.align"
  21. // :prefix-icon="dateTimePickerConf.prefixIcon"
  22. // :format="dateTimePickerConf.format"
  23. // :placeholder="dateTimePickerState.startPlaceHolder"
  24. // :picker-options="startPickerOptions"
  25. // @change="startDatePickerChange">
  26. // </el-date-picker>
  27. // <el-date-picker
  28. // v-model="dateTimePickerState.end"
  29. // class="date-time-item section-d-item right"
  30. // :type="dateTimePickerConf.type"
  31. // :editable="dateTimePickerConf.editable"
  32. // :align="dateTimePickerConf.align"
  33. // :prefix-icon="dateTimePickerConf.prefixIcon"
  34. // :format="dateTimePickerConf.format"
  35. // :placeholder="dateTimePickerState.endPlaceHolder"
  36. // :picker-options="endPickerOptions"
  37. // @change="endDatePickerChange">
  38. // </el-date-picker>
  39. // </div>
  40. // </div>
  41. // `
  42. var dateTimeComponentTemplate = "\n<div class=\"selector-content time-content\">\n <div class=\"select-group-container\" v-show=\"showSelectGroup\">\n <div\n v-for=\"(item, index) in timeSelectList\"\n :key=\"index\"\n class=\"j-button-item bgc\"\n :class=\"{\n active: item.selected\n }\"\n @click=\"clickTimeButton(item)\"\n >{{ item.name }}</div>\n </div>\n <div class=\"date-time-container section-d\">\n <el-date-picker\n v-model=\"dateTimePickerState.start\"\n class=\"date-time-item section-d-item left\"\n :type=\"dateTimePickerConf.type\"\n :editable=\"dateTimePickerConf.editable\"\n :align=\"dateTimePickerConf.align\"\n :prefix-icon=\"dateTimePickerConf.prefixIcon\"\n :format=\"dateTimePickerConf.format\"\n :placeholder=\"dateTimePickerState.startPlaceHolder\"\n :picker-options=\"startPickerOptions\"\n @change=\"startDatePickerChange\">\n </el-date-picker>\n <el-date-picker\n v-model=\"dateTimePickerState.end\"\n class=\"date-time-item section-d-item right\"\n :type=\"dateTimePickerConf.type\"\n :editable=\"dateTimePickerConf.editable\"\n :align=\"dateTimePickerConf.align\"\n :prefix-icon=\"dateTimePickerConf.prefixIcon\"\n :format=\"dateTimePickerConf.format\"\n :placeholder=\"dateTimePickerState.endPlaceHolder\"\n :picker-options=\"endPickerOptions\"\n @change=\"endDatePickerChange\">\n </el-date-picker>\n </div>\n</div>\n";
  43. var dateTimeComponent = {
  44. name: 'date-time-pc',
  45. template: dateTimeComponentTemplate,
  46. props: {
  47. showSelectGroup: {
  48. type: Boolean,
  49. default: true
  50. }
  51. },
  52. data: function () {
  53. return {
  54. timeSelectList: [
  55. {
  56. name: '全部',
  57. value: 'all',
  58. selected: true
  59. },
  60. {
  61. name: '最近7天',
  62. value: 'lately7',
  63. selected: false
  64. },
  65. {
  66. name: '最近30天',
  67. value: 'lately30',
  68. selected: false
  69. },
  70. {
  71. name: '去年',
  72. value: 'lastYear',
  73. selected: false
  74. }
  75. ],
  76. dateTimePickerConf: {
  77. type: 'date',
  78. editable: false,
  79. align: 'center',
  80. prefixIcon: 'clear-icon',
  81. format: 'yyyy-MM-dd'
  82. },
  83. dateTimePickerState: {
  84. start: '',
  85. end: '',
  86. startPlaceHolder: '', // 开始日期
  87. endPlaceHolder: '' // 结束日期
  88. },
  89. startPickerOptions: {
  90. disabledDate: function (time) {
  91. var end = this.dateTimePickerState.end
  92. if (end) {
  93. return time.getTime() > +new Date(end)
  94. }
  95. }.bind(this)
  96. },
  97. endPickerOptions: {
  98. disabledDate: function (time) {
  99. var start = this.dateTimePickerState.start
  100. if (start) {
  101. return time.getTime() < +new Date(start)
  102. }
  103. }.bind(this)
  104. }
  105. }
  106. },
  107. created: function () {},
  108. methods: {
  109. setState: function () {
  110. // {
  111. // start: 1620230400000, // 2021-5-6
  112. // end: 1620489600000, // 2021-5-9
  113. // exact: 'all'
  114. // }
  115. if (!data || Object.keys(data).length === 0) {
  116. this.setTimeSelectListState('all')
  117. } else {
  118. switch (data.exact) {
  119. case 'all': {
  120. this.setTimeSelectListState('all')
  121. this.clearDateTimePicker()
  122. break
  123. }
  124. case 'lately7': {
  125. this.setTimeSelectListState('lately7')
  126. this.clearDateTimePicker()
  127. break
  128. }
  129. case 'lately30': {
  130. this.setTimeSelectListState('lately30')
  131. this.clearDateTimePicker()
  132. break
  133. }
  134. case 'lastYear': {
  135. this.setTimeSelectListState('lastYear')
  136. this.clearDateTimePicker()
  137. break
  138. }
  139. case 'exact': {
  140. if (!data.start || !data.end) break
  141. if (data.start < data.end) {
  142. this.dateTimePickerState.start = new Date(data.start)
  143. this.dateTimePickerState.end = new Date(data.end)
  144. }
  145. break
  146. }
  147. default: {
  148. console.warn('exact值为空')
  149. }
  150. }
  151. }
  152. },
  153. getState: function () {
  154. // timeState.exact: all/lately7/lately30/lastYear/exact5种状态
  155. // 为true时候表示精确筛选,从时间选择器中获取值(其他为根据当前时间计算出的值)
  156. var timeState = {
  157. start: 0,
  158. end: 0,
  159. exact: 'exact'
  160. }
  161. var selectButton = this.timeSelectList.find(function (item) { return item.selected })
  162. if (selectButton) {
  163. timeState.exact = selectButton.value
  164. Object.assign(timeState, this.calcNotExactTime(timeState.exact))
  165. } else {
  166. timeState.exact = 'exact'
  167. timeState.start = this.dateTimePickerState.start.getTime()
  168. timeState.end = this.dateTimePickerState.end.getTime()
  169. }
  170. return timeState
  171. },
  172. onChange: function () {
  173. var state = this.getState()
  174. this.$emit('change', state)
  175. },
  176. setTimeSelectListState: function (value, callback) {
  177. this.timeSelectList.forEach(function (item) {
  178. item.selected = item.value === value
  179. callback && callback(item)
  180. })
  181. },
  182. clearDateTimePicker: function () {
  183. this.dateTimePickerState.start = ''
  184. this.dateTimePickerState.end = ''
  185. },
  186. // 计算lately7/lately30/lastYear的开始和结束时间
  187. // endTime传入一个时间戳
  188. calcNotExactTime: function (exact, endTime) {
  189. exact = exact || 'lately7'
  190. endTime = endTime || Date.now()
  191. var t = {
  192. start: 0,
  193. end: +new Date(endTime)
  194. }
  195. var durations = {
  196. hour1: 60 * 60 * 1000,
  197. day1: 60 * 60 * 1000 * 24 * 1,
  198. day7: 60 * 60 * 1000 * 24 * 7,
  199. day30: 60 * 60 * 1000 * 24 * 30
  200. }
  201. switch (exact) {
  202. case 'lately7': {
  203. t.start = t.end - durations.day7
  204. break
  205. }
  206. case 'lately30': {
  207. t.start = t.end - durations.day30
  208. break
  209. }
  210. case 'lastYear': {
  211. var year = new Date(t.end).getFullYear()
  212. var lastYear = year - 1
  213. t.start = +new Date(`${lastYear}`)
  214. t.end = +new Date(`${year}`) - durations.hour1 * 8 - 1
  215. break
  216. }
  217. default: {
  218. t.start = 0
  219. t.end = 0
  220. break
  221. }
  222. }
  223. return t
  224. },
  225. clickTimeButton: function (item) {
  226. if (item.selected) return
  227. this.timeSelectList.forEach(v => (v.selected = false))
  228. item.selected = true
  229. this.onChange()
  230. },
  231. startDatePickerChange: function (start) {
  232. var end = this.dateTimePickerState.end
  233. if (start && end) { // start和end都有值
  234. this.setTimeSelectListState()
  235. this.onChange()
  236. } else if (!start && !end) { // start和end都没值
  237. this.setTimeSelectListState('all')
  238. this.onChange()
  239. }
  240. },
  241. endDatePickerChange: function (end) {
  242. var start = this.dateTimePickerState.start
  243. if (start && end) { // start和end都有值
  244. this.setTimeSelectListState()
  245. this.onChange()
  246. } else if (!start && !end) { // start和end都没值
  247. this.setTimeSelectListState('all')
  248. this.onChange()
  249. }
  250. }
  251. }
  252. }