index.vue 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. <template>
  2. <div class="vertical-date-range">
  3. <div class="flex items-center">
  4. <span class="label">开始时间:</span>
  5. <date-picker
  6. v-model:value="startTime"
  7. placeholder="开始时间"
  8. :show-time="showTimeStart"
  9. :size="props.size || 'large'"
  10. :locale="locale"
  11. :disabled-date="disabledDateStart"
  12. :show-now="false"
  13. ></date-picker>
  14. </div>
  15. <div class="flex items-center mt-8px">
  16. <span class="label">结束时间:</span>
  17. <date-picker
  18. v-model:value="endTime"
  19. placeholder="结束时间"
  20. :show-time="showTimeEnd"
  21. :size="props.size || 'large'"
  22. :locale="locale"
  23. :disabled-date="disabledDateEnd"
  24. :show-now="false"
  25. ></date-picker>
  26. </div>
  27. </div>
  28. </template>
  29. <script lang="ts" name="VerticalDateRange" setup>
  30. import { DatePicker, FormItemRest } from "ant-design-vue";
  31. import locale from "ant-design-vue/es/date-picker/locale/zh_CN";
  32. import dayjs from "dayjs";
  33. import "dayjs/locale/zh-cn";
  34. import { ref, watch } from "vue";
  35. import { useVModel } from "@/hooks/useVModal";
  36. const emit = defineEmits(["change"]);
  37. const props = withDefaults(
  38. defineProps<{
  39. modelValue: any;
  40. size?: "large" | "middle" | "small";
  41. splitText?: string;
  42. valueFormat?: "timestamp" | string;
  43. type?: "date" | "datetime";
  44. }>(),
  45. {
  46. modelValue: () => [],
  47. size: "middle",
  48. splitText: "至",
  49. // valueFormat: "YYYYMMDDHHmmss",
  50. valueFormat: "timestamp",
  51. type: "datetime",
  52. }
  53. );
  54. const time = useVModel(props);
  55. const _time = ref([]);
  56. const startTime = ref(dayjs(time.value[0]));
  57. const endTime = ref(dayjs(time.value[1]));
  58. const showTimeStart =
  59. props.type === "datetime"
  60. ? { defaultValue: dayjs("00:00:00", "HH:mm:ss") }
  61. : undefined;
  62. const showTimeEnd =
  63. props.type === "datetime"
  64. ? { defaultValue: dayjs("23:59:59", "HH:mm:ss") }
  65. : undefined;
  66. watch([startTime, endTime], (arr: any) => {
  67. _time.value = arr.map((item: any) => (item ? item.toDate() : undefined));
  68. time.value = arr.map((item: any) =>
  69. item
  70. ? props.valueFormat === "timestamp"
  71. ? props.type === "datetime"
  72. ? item.toDate().getTime()
  73. : item.startOf("date").toDate().getTime()
  74. : props.type === "datetime"
  75. ? item.format(props.valueFormat)
  76. : item.endOf("date").format(props.valueFormat)
  77. : undefined
  78. );
  79. emit("change", [...time.value]);
  80. });
  81. const disabledDateStart = (current: any) => {
  82. if (!_time.value[0] && !_time.value[1]) {
  83. return false;
  84. } else {
  85. if (_time.value[1]) {
  86. return current > _time.value[1];
  87. } else {
  88. return false;
  89. }
  90. }
  91. };
  92. const disabledDateEnd = (current: any) => {
  93. if (!_time.value[0] && !_time.value[1]) {
  94. return false;
  95. } else {
  96. if (_time.value[0]) {
  97. return current < _time.value[0];
  98. } else {
  99. return false;
  100. }
  101. }
  102. };
  103. </script>
  104. <style lang="less" scoped>
  105. .vertical-date-range {
  106. span.label {
  107. color: @text-color2;
  108. }
  109. }
  110. .split-txt {
  111. margin-left: 11px;
  112. margin-right: 11px;
  113. font-size: 14px;
  114. color: rgba(0, 0, 0, 0.88);
  115. }
  116. </style>