A responsive Vue.js datepicker component
TRVLPicker
TRVLPicker is a responsive Vue.js datepicker component. From mobile to desktop it has a full-screen vertical layout, a single month layout, a double month layout, and a triple month layout.
Install
npm install @trvl/picker
import TRVLPicker from '@trvl/picker'
export default {
// …
components: {
TRVLPicker,
},
// …
}
Usage
Basic
In its most basic form, TRVLPicker only requires the checkin
and checkout
props.
Both should be a Date
object and have a sync modifier:
<template>
<TRVLPicker
:checkin.sync="checkin"
:checkout.sync="checkout"
/>
</template>
<script>
import TRVLPicker from '@trvl/picker'
export default {
components: {
TRVLPicker,
},
data() {
return {
checkin: new Date(2019, 2, 13),
checkout: new Date(2019, 2, 15),
}
},
}
</script>
Advanced
To ensure a correct positioning of the datepicker in the full-screen layout it makes use of a Portal. Although not required, it is recommended to place a Portal target element outside your Vue app:
<body>
<div id="app">
…
</div>
<div id="portal"></div>
</body>
Props
Prop | Type | Default | Description |
---|---|---|---|
breakpointSingle |
Number | 580 |
Point at which the layout goes to a single month layout |
breakpointDouble |
Number | 740 |
Point at which the layout goes to a double month layout |
breakpointTriple |
Number | 0 (disabled) |
Point at which the layout goes to a triple month layout |
checkin |
Date | Check-in date | |
checkout |
Date | Check-out date | |
maxDate |
Date | new Date() + 1 year |
Last possible check-out date |
maxStay |
Number | 30 |
Maximum date range in days |
minDate |
Date | new Date() |
First posssible check-in date |
portal |
String | portal |
The ID of the portal |
Slots
All slots are optional, but the checkin
and checkout
slots are highly recommended so as to customize their appearance.
Check-in
The template used for the check-in button.
<template slot="checkin" slot-scope="{ isActive, value }">
<div :class="{ active: isActive }">
<label for="checkin">Check-in</label>
<input id="checkin" type="text" :value="value">
</div>
</template>
The following data is available in the slot-scope
:
Data | Type | Description |
---|---|---|
isActive |
Boolean | Whether the check-in input is active |
value |
Date | The raw check-in value |
Check-out
The template used for the check-out button.
<template slot="checkout" slot-scope="{ isActive, value }">
<div :class="{ active: isActive }">
<label for="checkout">Check-in</label>
<input id="checkout" type="text" :value="value">
</div>
</template>
The following data is available in the slot-scope
:
Data | Type | Description |
---|---|---|
isActive |
Boolean | Whether the check-out input is active |
value |
Date | The raw check-out value |
Close
The template used for the close button in the vertical layout.
<template slot="close">
<icon name="close" />
</template>
Next
The template used for the navigation button to go to the next month.
<template slot="next">
<icon name="next" />
</template>
Previous
The template used for the navigation button to go to the previous month.
<template slot="previous">
<icon name="previous" />
</template>
Methods
By adding a ref
to the datepicker a couple of methods can be accessed:
<template>
<TRVLPicker
ref="picker"
…
/>
</template>
<script>
export default {
mounted() {
this.$refs.picker.callMethod()
},
}
</script>
Method | Parameters | Description |
---|---|---|
close |
Close the datepicker | |
open |
checkin | checkout |
Open the datepicker on the given input (defaults to checkin ) |
Events
Event | Description |
---|---|
close |
The datepicker is closed |
open |
The datepicker is opened |
Contributing
# Project setup
npm install
# Compiles and hot-reloads for development
npm run serve
# Compiles and minifies for production
npm run build
# Lints and fixes files
npm run lint
# Runs unit tests
npm run test:unit