Skip to content

Commit b0e3e96

Browse files
author
Lionel Bijaoui
committed
🆕 new: new field type: Pikaday.
1 parent c6e3f5e commit b0e3e96

File tree

3 files changed

+152
-2
lines changed

3 files changed

+152
-2
lines changed

dev/index.html

+2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/ion-rangeslider/2.1.4/css/ion.rangeSlider.css">
1212
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/ion-rangeslider/2.1.4/css/ion.rangeSlider.skinHTML5.css">
1313
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/noUiSlider/8.5.1/nouislider.min.css">
14+
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/pikaday/1.4.0/css/pikaday.min.css">
1415

1516

1617
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.3/jquery.js"></script>
@@ -28,6 +29,7 @@
2829
<script type="text/javascript" src="https://rawgit.com/nosir/cleave.js/master/dist/cleave.min.js"></script>
2930
<script type="text/javascript" src="https://nosir.github.io/cleave.js/lib/cleave-phone.i18n.js"></script>
3031
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/noUiSlider/8.5.1/nouislider.js"></script>
32+
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/pikaday/1.4.0/pikaday.min.js"></script>
3133

3234
</head>
3335
<body>

dev/schema.js

+50-2
Original file line numberDiff line numberDiff line change
@@ -288,9 +288,57 @@ module.exports = {
288288
model.age = moment().year() - moment(newVal).year();
289289
}
290290

291-
},
291+
}, {
292+
type: "pikaday",
293+
label: "DOB (pikaday field)",
294+
model: "dob",
295+
required: true,
296+
placeholder: "User's birth of date",
297+
min: moment("1900-01-01").toDate(),
298+
max: moment("2016-01-01").toDate(),
299+
validator: [
300+
validators.date
301+
],
302+
pikadayOptions: {
303+
bound: true,
304+
position: 'bottom left',
305+
reposition: true,
306+
// container: ,
307+
format: 'YYYY-MM-DD HH:mm:ss',
308+
// formatStrict: ,
309+
// defaultDate: ,
310+
// setDefaultDate: ,
311+
firstDay: 1,
312+
// minDate: ,
313+
// maxDate: ,
314+
disableWeekends: false,
315+
// disableDayFn: ,
316+
// yearRange: ,
317+
showWeekNumber: false,
318+
isRTL: false,
319+
i18n: {
320+
previousMonth : 'Previous Month',
321+
nextMonth : 'Next Month',
322+
months : ['January','February','March','April','May','June','July','August','September','October','November','December'],
323+
weekdays : ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],
324+
weekdaysShort : ['Sun','Mon','Tue','Wed','Thu','Fri','Sat']
325+
},
326+
// yearSuffix: ,
327+
showMonthAfterYear: false,
328+
showDaysInNextAndPreviousMonths: false,
329+
// numberOfMonths: ,
330+
// mainCalendar: ,
331+
theme: null,
332+
// onSelect: ,
333+
// onOpen: ,
334+
// onClose: ,
335+
// onDraw: ,
336+
},
337+
onChanged(model, newVal, oldVal, field) {
338+
model.age = moment().year() - moment(newVal).year();
339+
}
292340

293-
{
341+
},{
294342
type: "dateTime",
295343
label: "DT",
296344
model: "dt",

src/fields/fieldPikaday.vue

+100
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
<template lang="jade">
2+
input.form-control(type="text")
3+
</template>
4+
5+
<script>
6+
import abstractField from "./abstractField";
7+
import moment from "moment";
8+
import { defaults } from "lodash";
9+
10+
let inputFormat = "YYYY-MM-DD HH:mm:ss";
11+
12+
export default {
13+
mixins: [ abstractField ],
14+
data(){
15+
return {picker: null};
16+
},
17+
18+
methods: {
19+
20+
getDateFormat() {
21+
if (this.schema.pikadayOptions && this.schema.pikadayOptions.format)
22+
return this.schema.pikadayOptions.format;
23+
else
24+
return inputFormat;
25+
},
26+
27+
formatValueToField(value) {
28+
if (value != null)
29+
return moment(value, this.schema.format).format(this.getDateFormat());
30+
31+
return value;
32+
},
33+
34+
formatValueToModel(value) {
35+
if (value != null) {
36+
let m = moment(value, this.getDateFormat());
37+
if (this.schema.format)
38+
value = m.format(this.schema.format);
39+
else
40+
value = m.toDate().valueOf();
41+
}
42+
console.log(this.value);
43+
// this.value = value;
44+
return value;
45+
}
46+
47+
},
48+
49+
ready() {
50+
if (window.Pikaday){
51+
this.picker = new Pikaday(defaults(this.schema.pikadayOptions || {}, {
52+
field: this.$el, // bind the datepicker to a form field
53+
// trigger: , // use a different element to trigger opening the datepicker, see [trigger example][] (default to `field`)
54+
bound: true, // automatically show/hide the datepicker on `field` focus (default `true` if `field` is set)
55+
position: 'bottom left', // preferred position of the datepicker relative to the form field, e.g.: `top right`, `bottom right` **Note:** automatic adjustment may occur to avoid datepicker from being displayed outside the viewport, see [positions example][] (default to 'bottom left')
56+
reposition: true, // can be set to false to not reposition datepicker within the viewport, forcing it to take the configured `position` (default: true)
57+
// container: , // DOM node to render calendar into, see [container example][] (default: undefined)
58+
// format: , // the default output format for `.toString()` and `field` value (requires [Moment.js][moment] for custom formatting)
59+
// formatStrict: , // the default flag for moment's strict date parsing (requires [Moment.js][moment] for custom formatting)
60+
// defaultDate: , // the initial date to view when first opened
61+
// setDefaultDate: , // make the `defaultDate` the initial selected value
62+
firstDay: 1, // first day of the week (0: Sunday, 1: Monday, etc)
63+
// minDate: , // the minimum/earliest date that can be selected (this should be a native Date object - e.g. `new Date()` or `moment().toDate()`)
64+
// maxDate: , // the maximum/latest date that can be selected (this should be a native Date object - e.g. `new Date()` or `moment().toDate()`)
65+
disableWeekends: false, // disallow selection of Saturdays or Sundays
66+
// disableDayFn: , // callback function that gets passed a Date object for each day in view. Should return true to disable selection of that day.
67+
// yearRange: , // number of years either side (e.g. `10`) or array of upper/lower range (e.g. `[1900,2015]`)
68+
showWeekNumber: false, // show the ISO week number at the head of the row (default `false`)
69+
isRTL: false, // reverse the calendar for right-to-left languages
70+
i18n: {
71+
previousMonth : 'Previous Month',
72+
nextMonth : 'Next Month',
73+
months : ['January','February','March','April','May','June','July','August','September','October','November','December'],
74+
weekdays : ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],
75+
weekdaysShort : ['Sun','Mon','Tue','Wed','Thu','Fri','Sat']
76+
}, // language defaults for month and weekday names (see internationalization below)
77+
// yearSuffix: , // additional text to append to the year in the title
78+
showMonthAfterYear: false, // render the month after year in the title (default `false`)
79+
showDaysInNextAndPreviousMonths: false, // render days of the calendar grid that fall in the next or previous months to the current month instead of rendering an empty table cell (default: false)
80+
// numberOfMonths: , // number of visible calendars
81+
// mainCalendar: , // when `numberOfMonths` is used, this will help you to choose where the main calendar will be (default `left`, can be set to `right`). Only used for the first display or when a selected date is not already visible
82+
theme: null, // define a classname that can be used as a hook for styling different themes, see [theme example][] (default `null`)
83+
// onSelect: , // callback function for when a date is selected
84+
// onOpen: , // callback function for when the picker becomes visible
85+
// onClose: , // callback function for when the picker is hidden
86+
// onDraw: , // callback function for when the picker draws a new month
87+
}));
88+
}
89+
// this.slider.noUiSlider.on("change", this.onChange.bind(this));
90+
else{
91+
console.warn("Pikaday is missing. Please download from https://github.com/dbushell/Pikaday/ and load the script and CSS in the HTML head section!");
92+
}
93+
94+
}
95+
};
96+
</script>
97+
98+
99+
<style lang="sass">
100+
</style>

0 commit comments

Comments
 (0)