Skip to content

WeDatePicker

A versatile date and time picker component that wraps vuepic/vue-datepicker with Vuetify integration. Supports date, time, datetime selection with various formatting options, validation rules, and range selection.

Usage

vue
<template>
  <!-- Basic date picker -->
  <WeDatePicker
    v-model="selectedDate"
    label="Select Date"
  />
  
  <!-- Time picker -->
  <WeDatePicker
    v-model="selectedTime"
    type="time"
    label="Select Time"
  />
  
  <!-- DateTime picker -->
  <WeDatePicker
    v-model="selectedDateTime"
    type="datetime"
    label="Select Date and Time"
  />
  
  <!-- Date range picker -->
  <WeDatePicker
    v-model="dateRange"
    range
    label="Select Date Range"
  />
  
  <!-- With validation -->
  <WeDatePicker
    v-model="appointmentDate"
    label="Appointment Date"
    :rules="[validatorRequired]"
  />

  <!-- min date -->
  <WeDatePicker
    v-model="minDate"
    label="Min Date"
    :min="startOfWeek"
    :rules="[validatorRequired]"
  />

  <!-- max date -->
  <WeDatePicker
    v-model="maxDate"
    label="Max Date"
    :max="endOfWeek"
    :rules="[validatorRequired]"
  />
</template>

Props

PropTypeDefaultDescription
modelValueString | Arrayundefinedv-model value (formatted date string or array for range)
typeString'date'Picker type: 'date', 'time', or 'datetime'
minString | DatenullMinimum selectable date
maxString | DatenullMaximum selectable dat
minDateString | DatenullMinimum selectable date
maxDateString | DatenullMaximum selectable date
minTimeString | DatenullMinimum selectable time
maxTimeString | DatenullMaximum selectable time
startDateString | DatenullInitial date to display in the calendar when opened. For ranges, the first element is used
localeString'it'Localization for the calendar
rangeBooleanfalseEnable date range selection
monthChangeOnArrowsBooleantrueNavigate between months using arrow keys
showSecondsBooleanfalseShow seconds in time picker
disabledDateBooleanfalseDisable date
disabledDatesArrayundefinedDisable a series of dates
presetDatesArray[]Provide a sidebar with a configured range / date that the user can select
allowedDatesArrayundefinedAllow a series of dates
clearableBooleanfalseAllow clearing the input
rulesArray[]Validation rules (compatible with Vuetify)

Note: It is recommended to use min and max instead of minDate and maxDate.

Note: The component also accepts all Vuetify v-text-field props through v-bind="$attrs" Note: The component also accepts all Vvuepic/vue-datepicker props through v-bind="$attrs"

Events

EventPayloadDescription
update:modelValueString | ArrayEmitted when the date selection changes

Format Handling

The component handles two types of formats:

  1. Display Format: How dates are shown to the user

    • Date: dd/MM/yyyy
    • Time: HH:mm (or HH:mm:ss with showSeconds)
    • DateTime: dd/MM/yyyy HH:mm (or dd/MM/yyyy HH:mm:ss with showSeconds)
  2. Model Format: How dates are stored in the model

    • Date: yyyy-MM-dd
    • Time: HH:mm (or HH:mm:ss with showSeconds)
    • DateTime: yyyy-MM-dd HH:mm (or yyyy-MM-dd HH:mm:ss with showSeconds)

Examples

Basic Date Selection

vue
<script setup>
import { ref } from 'vue'

const selectedDate = ref(null)
</script>

<template>
  <WeDatePicker
    v-model="selectedDate"
    label="Select Date"
    clearable
  />
  
  <div v-if="selectedDate">
    Selected date: {{ selectedDate }} <!-- Will be in yyyy-MM-dd format -->
  </div>
</template>

Time Selection

vue
<script setup>
import { ref } from 'vue'

const meetingTime = ref(null)
</script>

<template>
  <WeDatePicker
    v-model="meetingTime"
    type="time"
    label="Meeting Time"
    show-seconds
  />
</template>

Date Range for Booking

vue
<script setup>
import { ref } from 'vue'
import { useValidators } from '#imports'

const { validatorRequired } = useValidators()
const bookingDateRange = ref(null) // Will be an array of two dates

const rules = [
  validatorRequired
]
</script>

<template>
  <WeDatePicker
    v-model="bookingDateRange"
    label="Booking Period"
    range
    :rules="rules"
  />
</template>

Date Constraints

vue
<script setup>
import { ref } from 'vue'

// Don't allow selecting dates before today or after one year from now
const today = new Date()
const nextYear = new Date(today)
nextYear.setFullYear(nextYear.getFullYear() + 1)

const constrainedDate = ref(null)
</script>

<template>
  <WeDatePicker
    v-model="constrainedDate"
    label="Select Date (Limited Range)"
    :min-date="today"
    :max-date="nextYear"
  />
</template>

Advanced DateTime Selector

vue
<script setup>
import { ref } from 'vue'

const appointmentDateTime = ref(null)
const workHoursStart = { hours: '09', minutes: '00' }
const workHoursEnd = { hours: '17', minutes: '00' }
</script>

<template>
  <WeDatePicker
    v-model="appointmentDateTime"
    type="datetime"
    label="Appointment Date & Time"
    :min-time="workHoursStart"
    :max-time="workHoursEnd"
    clearable
  />
</template>

Source Code