picker.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <template>
  2. <div class="cl-date-picker">
  3. <el-date-picker
  4. v-model="date"
  5. :type="type"
  6. :default-time="defaultTime"
  7. :value-format="valueFormat"
  8. :style="{ width }"
  9. @change="onChange"
  10. />
  11. <el-radio-group v-model="btnType" @change="onBtnTypeChange" v-if="quickBtn && isRange">
  12. <el-radio-button label="day">今日</el-radio-button>
  13. <el-radio-button label="week">本周</el-radio-button>
  14. <el-radio-button label="month">本月</el-radio-button>
  15. <el-radio-button label="year">今年</el-radio-button>
  16. </el-radio-group>
  17. </div>
  18. </template>
  19. <script lang="ts" setup name="cl-date-picker">
  20. import { useCrud } from "@cool-vue/crud";
  21. import dayjs from "dayjs";
  22. import { computed, ref, watch } from "vue";
  23. const props = defineProps({
  24. modelValue: Array,
  25. type: {
  26. type: String,
  27. default: "datetimerange"
  28. },
  29. valueFormat: {
  30. type: String,
  31. default: "YYYY-MM-DD HH:mm:ss"
  32. },
  33. prop: {
  34. type: String
  35. },
  36. width: String,
  37. quickBtn: Boolean
  38. });
  39. const emit = defineEmits(["update:modelValue", "change"]);
  40. const Crud = useCrud();
  41. // 是否是范围
  42. const isRange = computed(() => props.type.includes("range"));
  43. // 默认时间
  44. const defaultTime = ref(
  45. isRange.value ? [new Date("2000-01-01 00:00:00"), new Date("2000-01-01 23:59:59")] : undefined
  46. );
  47. // 日期
  48. const date = ref();
  49. // 按钮类型
  50. const btnType = ref("month");
  51. // 日期改变
  52. function onChange(value: any[]) {
  53. // 重置按钮类型
  54. btnType.value = "";
  55. // 参数
  56. let params = {};
  57. if (isRange.value) {
  58. let [startTime, endTime] = value || [];
  59. if (props.type == "monthrange") {
  60. startTime = dayjs(startTime).format("YYYY-MM-01 00:00:00");
  61. endTime = dayjs(endTime).endOf("month").format("YYYY-MM-DD 23:59:59");
  62. }
  63. params = {
  64. [props.prop ? `${props.prop}StartTime` : "startTime"]: startTime,
  65. [props.prop ? `${props.prop}EndTime` : "endTime"]: endTime
  66. };
  67. } else {
  68. params = {
  69. // @ts-ignore
  70. [props.prop]: value
  71. };
  72. }
  73. Crud.value?.refresh({
  74. ...params,
  75. page: 1
  76. });
  77. emit("update:modelValue", value);
  78. emit("change", value);
  79. }
  80. // 按钮类型改变
  81. function onBtnTypeChange() {
  82. date.value = isRange.value ? [] : undefined;
  83. let start = dayjs();
  84. let end = dayjs();
  85. switch (btnType.value) {
  86. case "day":
  87. break;
  88. case "week":
  89. start = dayjs().startOf("week").add(1, "day");
  90. break;
  91. case "month":
  92. start = dayjs().startOf("month");
  93. break;
  94. case "year":
  95. start = dayjs().startOf("year");
  96. break;
  97. }
  98. const startTime = start.format("YYYY-MM-DD");
  99. const endTime = end.format("YYYY-MM-DD");
  100. Crud.value?.refresh({
  101. page: 1,
  102. startTime,
  103. endTime
  104. });
  105. emit("update:modelValue", [startTime, endTime]);
  106. emit("change", [startTime, endTime]);
  107. }
  108. function init() {
  109. onBtnTypeChange();
  110. }
  111. watch(
  112. () => props.modelValue,
  113. (val) => {
  114. date.value = val;
  115. },
  116. {
  117. immediate: true
  118. }
  119. );
  120. defineExpose({
  121. init
  122. });
  123. </script>
  124. <style lang="scss" scoped>
  125. .cl-date-picker {
  126. display: inline-flex;
  127. :deep(.el-date-editor) {
  128. box-sizing: border-box;
  129. margin-right: 10px;
  130. }
  131. }
  132. </style>