DatePicker.vue 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. <template>
  2. <main>
  3. <v-menu
  4. v-model="dateOpen"
  5. :close-on-content-click="false"
  6. :nudge-right="40"
  7. transition="scale-transition"
  8. offset-y
  9. min-width="auto"
  10. >
  11. <template v-slot:activator="{ on, attrs }">
  12. <v-text-field
  13. v-model="datesFormatted"
  14. autocomplete="off"
  15. :label="$t(label_field)"
  16. prepend-icon="mdi-calendar"
  17. :disabled="readOnly"
  18. v-bind="attrs"
  19. v-on="on"
  20. ></v-text-field>
  21. </template>
  22. <v-date-picker
  23. v-model="datesParsed"
  24. @input="dateOpen = range && datesParsed.length < 2"
  25. locale="fr"
  26. :range="range"
  27. color="ot_green lighten-1"
  28. ></v-date-picker>
  29. </v-menu>
  30. </main>
  31. </template>
  32. <script lang="ts">
  33. import {defineComponent, watch, ref, useContext, onUnmounted} from '@nuxtjs/composition-api'
  34. import {$useDate} from "~/use/utils/useDate";
  35. export default defineComponent({
  36. props: {
  37. field: {
  38. type: String,
  39. required: false
  40. },
  41. label: {
  42. type: String,
  43. required: false
  44. },
  45. data: {
  46. type: [String, Array],
  47. required: false
  48. },
  49. readOnly: {
  50. type: Boolean,
  51. required: false
  52. },
  53. range: {
  54. type: Boolean,
  55. required: false
  56. }
  57. },
  58. setup(props, {emit}){
  59. const {data, field, range} = props
  60. const {$moment} = useContext()
  61. const useDate = $useDate($moment)
  62. const datesFormatted = ref()
  63. const datesParsed = range ? ref(Array<string>()) : ref()
  64. if(range){
  65. for(const date of data as Array<string>){
  66. datesParsed.value.push($moment(date).format('YYYY-MM-DD'))
  67. }
  68. }else{
  69. datesParsed.value = $moment(data as string).format('YYYY-MM-DD')
  70. }
  71. datesFormatted.value = datesFormatted.value = useDate.handleFormattedDate(data)
  72. const unwatch = watch(datesParsed, (newValue) => {
  73. if(range && newValue.length < 2) return
  74. datesFormatted.value = useDate.handleFormattedDate(newValue)
  75. emit('update', newValue, field)
  76. })
  77. onUnmounted(()=>{
  78. unwatch()
  79. })
  80. return {
  81. label_field : props.label ?? props.field,
  82. datesParsed,
  83. datesFormatted,
  84. dateOpen: ref(false)
  85. }
  86. }
  87. })
  88. </script>
  89. <style scoped>
  90. </style>