From 0f431a683968e9e9d30120eb3bf09a3f13da8814 Mon Sep 17 00:00:00 2001
From: Felix Nagel
Date: Fri, 16 May 2014 00:19:32 +0200
Subject: [PATCH 01/26] Datepicker: Introduce value option
Change status caching, fix existing value related methods, introduce
$.date construction with date object, selected property is null by
default, add selected getter
---
external/date.js | 7 +
tests/unit/datepicker/datepicker_core.js | 477 ++++++++------------
tests/unit/datepicker/datepicker_methods.js | 47 +-
ui/datepicker.js | 85 ++--
4 files changed, 256 insertions(+), 360 deletions(-)
diff --git a/external/date.js b/external/date.js
index 06a67553205..8df3f63de92 100644
--- a/external/date.js
+++ b/external/date.js
@@ -26,9 +26,13 @@ $.date = function( date, globalFormat ) {
if ( typeof date === "string" && date.length ) {
this.dateObject = Globalize.parseDate( date, globalFormat );
}
+ if ( $.type( date ) === "date" ) {
+ this.dateObject = date;
+ }
this.dateObject = this.dateObject || new Date();
this.globalFormat = globalFormat;
+ this.selected = null;
};
$.date.prototype = {
@@ -180,6 +184,9 @@ $.date.prototype = {
this.selected = this.clone();
return this;
},
+ selectedDate: function() {
+ return this.selected.date();
+ },
clone: function() {
var date = this.dateObject;
return new $.date( new Date( date.getFullYear(), date.getMonth(),
diff --git a/tests/unit/datepicker/datepicker_core.js b/tests/unit/datepicker/datepicker_core.js
index 189f03d932a..5031fb33bff 100644
--- a/tests/unit/datepicker/datepicker_core.js
+++ b/tests/unit/datepicker/datepicker_core.js
@@ -64,7 +64,7 @@ asyncTest( "baseStructure", function() {
inp.datepicker( "close" ).datepicker( "destroy" );
step2();
- });
+ }, 50 );
}
function step2() {
@@ -217,269 +217,223 @@ asyncTest( "baseStructure", function() {
step1();
});
-test( "Keyboard handling", function() {
+asyncTest( "Keyboard handling: input", function() {
expect( 9 );
var input = $( "#datepicker" ).datepicker(),
- instance = input.datepicker( "instance" ),
- date = new Date();
-
- input.datepicker( "open" )
- .simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
- TestHelpers.datepicker.equalsDate( input.datepicker( "valueAsDate" ), date, "Keystroke enter" );
-
- // Enter = Select today's date by default
- input.val( "1/1/14" ).datepicker( "open" )
- .simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
- TestHelpers.datepicker.equalsDate( input.datepicker( "valueAsDate" ), new Date( 2014, 0, 1 ),
- "Keystroke enter - preset" );
-
- // Control + Home = Change the calendar to the current month
- input.val( "1/1/14" ).datepicker( "open" )
- .simulate( "keydown", { ctrlKey: true, keyCode: $.ui.keyCode.HOME } )
- .simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
- TestHelpers.datepicker.equalsDate( input.datepicker( "valueAsDate" ), date, "Keystroke ctrl+home" );
-
- // Control + End = Close the calendar and clear the input
- input.val( "1/1/14" ).datepicker( "open" )
- .simulate( "keydown", { ctrlKey: true, keyCode: $.ui.keyCode.END } );
- equal( input.val(), "", "Keystroke ctrl+end" );
-
- input.val( "" ).datepicker( "open" );
- ok( instance.isOpen, "datepicker is open before escape" );
- input.simulate( "keydown", { keyCode: $.ui.keyCode.ESCAPE } );
- ok( !instance.isOpen, "escape closes the datepicker" );
-
- input.val( "1/1/14" ).datepicker( "open" )
- .simulate( "keydown", { keyCode: $.ui.keyCode.ESCAPE } );
- TestHelpers.datepicker.equalsDate( input.datepicker( "valueAsDate" ), new Date( 2014, 0, 1 ),
- "Keystroke esc - preset" );
-
- input.val( "1/1/14" ).datepicker( "open" )
- .simulate( "keydown", { ctrlKey: true, keyCode: $.ui.keyCode.PAGE_UP } )
- .simulate( "keydown", { keyCode: $.ui.keyCode.ESCAPE } );
- TestHelpers.datepicker.equalsDate( input.datepicker( "valueAsDate" ), new Date( 2014, 0, 1 ),
- "Keystroke esc - abandoned" );
-
- input.val( "1/2/14" )
- .simulate( "keyup" );
- TestHelpers.datepicker.equalsDate( input.datepicker( "valueAsDate" ), new Date( 2014, 0, 2 ),
- "Picker updated as user types into input" );
-
- input.datepicker( "destroy" );
-});
-
-asyncTest( "keyboard handling", function() {
- expect( 14 );
- var picker,
- input = $( "#datepicker" ),
- date = new Date();
+ picker, instance;
function step1() {
- input.datepicker();
+ TestHelpers.datepicker.init( input );
picker = input.datepicker( "widget" );
+
ok( !picker.is( ":visible" ), "datepicker closed" );
- input.val( "" )
- .simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } );
+ input.val( "" ).simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } );
setTimeout(function() {
ok( picker.is( ":visible" ), "Keystroke down opens datepicker" );
input.datepicker( "destroy" );
step2();
- });
+ }, 100 );
}
function step2() {
- input.datepicker();
+ TestHelpers.datepicker.init( input );
picker = input.datepicker( "widget" );
+
ok( !picker.is( ":visible" ), "datepicker closed" );
- input.val( "" )
- .simulate( "keydown", { keyCode: $.ui.keyCode.UP } );
+ input.val( "" ).simulate( "keydown", { keyCode: $.ui.keyCode.UP } );
setTimeout(function() {
ok( picker.is( ":visible" ), "Keystroke up opens datepicker" );
input.datepicker( "destroy" );
step3();
- });
+ }, 100 );
}
function step3() {
- input.datepicker()
- .val( "1/1/14" )
- .simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } );
+ TestHelpers.datepicker.init( input );
+ instance = input.datepicker( "instance" );
- setTimeout(function() {
- $( ":focus" )
- .simulate( "keydown", { keyCode: $.ui.keyCode.LEFT } )
- .simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
- date = new Date( 2013, 12 - 1, 31 );
- TestHelpers.datepicker.equalsDate( input.datepicker( "valueAsDate" ), date,
- "Keystroke left to switch to previous day" );
+ input
+ .val( "" )
+ .datepicker( "open" );
+ ok( instance.isOpen, "datepicker is open before escape" );
- input.datepicker( "destroy" );
- step4();
- }, 100 );
- }
+ input.simulate( "keydown", { keyCode: $.ui.keyCode.ESCAPE } );
+ ok( !instance.isOpen, "escape closes the datepicker" );
- function step4() {
- input.datepicker()
+ input
.val( "1/1/14" )
- .simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } );
+ .datepicker( "open" )
+ .simulate( "keydown", { keyCode: $.ui.keyCode.ESCAPE } );
+ TestHelpers.datepicker.equalsDate( input.datepicker( "valueAsDate" ), new Date( 2014, 0, 1 ),
+ "Keystroke esc - preset" );
- setTimeout(function() {
- $( ":focus" )
- .simulate( "keydown", { keyCode: $.ui.keyCode.RIGHT } )
- .simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
- date = new Date( 2014, 1 - 1, 2 );
- TestHelpers.datepicker.equalsDate( input.datepicker( "valueAsDate" ), date,
- "Keystroke right to switch to next day" );
-
- input.datepicker( "destroy" );
- step5();
- }, 100 );
+ input
+ .val( "1/1/14" )
+ .datepicker( "open" )
+ .simulate( "keydown", { ctrlKey: true, keyCode: $.ui.keyCode.PAGE_UP } )
+ .simulate( "keydown", { keyCode: $.ui.keyCode.ESCAPE } );
+ TestHelpers.datepicker.equalsDate( input.datepicker( "valueAsDate" ), new Date( 2014, 0, 1 ),
+ "Keystroke esc - abandoned" );
+
+ input
+ .val( "1/2/14" )
+ .simulate( "keyup" );
+ TestHelpers.datepicker.equalsDate( input.datepicker( "valueAsDate" ), new Date( 2014, 0, 2 ),
+ "Picker updated as user types into input" );
+
+ input.datepicker( "destroy" );
+ start();
}
- function step5() {
- input.datepicker()
- .val( "1/1/14" )
- .simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } );
+ step1();
+});
- setTimeout(function() {
- $( ":focus" )
- .simulate( "keydown", { keyCode: $.ui.keyCode.UP } )
- .simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
- date = new Date( 2013, 12 - 1, 25 );
- TestHelpers.datepicker.equalsDate( input.datepicker( "valueAsDate" ), date,
- "Keystroke up to move to the previous week" );
+asyncTest( "keyboard handling: calendar", function() {
+ expect( 7 );
- input.datepicker( "destroy" );
- step6();
- }, 100 );
- }
+ var input = $( "#datepicker" );
- function step6() {
- input.datepicker()
- .val( "1/1/14" )
- .simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } );
+ function step1() {
+ input.val( "1/1/14" );
+ TestHelpers.datepicker.init( input );
+ input.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } );
setTimeout(function() {
- $( ":focus" )
- .simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } )
- .simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
- date = new Date( 2014, 1 - 1, 8 );
- TestHelpers.datepicker.equalsDate( input.datepicker( "valueAsDate" ), date,
- "Keystroke down to move to the next week" );
-
- input.datepicker( "destroy" );
- step7();
+ $( ":focus" ).simulate( "keydown", { keyCode: $.ui.keyCode.LEFT } );
+ setTimeout(function() {
+ $( ":focus" ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
+ TestHelpers.datepicker.equalsDate(
+ input.datepicker( "valueAsDate" ),
+ new Date( 2013, 12 - 1, 31 ),
+ "Keystroke left to switch to previous day"
+ );
+ input.datepicker( "destroy" );
+ step2();
+ }, 50 );
}, 100 );
}
- function step7() {
- input.datepicker()
- .val( "1/1/14" )
- .simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } );
+ function step2() {
+ input.val( "1/1/14" );
+ TestHelpers.datepicker.init( input );
+ input.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } );
setTimeout(function() {
$( ":focus" )
- .simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_UP } )
+ .simulate( "keydown", { keyCode: $.ui.keyCode.RIGHT } )
.simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
- date = new Date( 2013, 12 - 1, 1 );
- TestHelpers.datepicker.equalsDate( input.datepicker( "valueAsDate" ), date,
- "Keystroke Page Up moves date to previous month" );
+ TestHelpers.datepicker.equalsDate(
+ input.datepicker( "valueAsDate" ),
+ new Date( 2014, 1 - 1, 2 ),
+ "Keystroke right to switch to next day"
+ );
input.datepicker( "destroy" );
- step8();
+ step3();
}, 100 );
}
- function step8() {
- input.datepicker()
- .val( "1/1/14" )
- .simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } );
+ function step3() {
+ input.val( "1/1/14" );
+ TestHelpers.datepicker.init( input );
+ input.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } );
setTimeout(function() {
- $( ":focus" )
- .simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_UP, altKey: true } )
- .simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
- date = new Date( 2013, 1 - 1, 1 );
- TestHelpers.datepicker.equalsDate( input.datepicker( "valueAsDate" ), date,
- "Keystroke Page Up + Ctrl moves date to previous year" );
-
- input.datepicker( "destroy" );
- step9();
+ $( ":focus" ).simulate( "keydown", { keyCode: $.ui.keyCode.UP } );
+ setTimeout(function() {
+ $( ":focus" ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
+ TestHelpers.datepicker.equalsDate(
+ input.datepicker( "valueAsDate" ),
+ new Date( 2013, 12 - 1, 25 ),
+ "Keystroke up to move to the previous week"
+ );
+ input.datepicker( "destroy" );
+ step4();
+ }, 50 );
}, 100 );
}
- function step9() {
- input.datepicker()
- .val( "1/1/14" )
- .simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } );
+ function step4() {
+ input.val( "1/1/14" );
+ TestHelpers.datepicker.init( input );
+ input.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } );
setTimeout(function() {
- $( ":focus" )
- .simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_DOWN } )
- .simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
- date = new Date( 2014, 2 - 1, 1 );
- TestHelpers.datepicker.equalsDate( input.datepicker( "valueAsDate" ), date,
- "Keystroke Page Down moves date to next month" );
-
- input.datepicker( "destroy" );
- step10();
+ $( ":focus" ).simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } );
+ setTimeout(function() {
+ $( ":focus" ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
+
+ TestHelpers.datepicker.equalsDate(
+ input.datepicker( "valueAsDate" ),
+ new Date( 2014, 1 - 1, 8 ),
+ "Keystroke down to move to the next week"
+ );
+ input.datepicker( "destroy" );
+ step5();
+ }, 50 );
}, 100 );
}
- function step10() {
- input.datepicker()
- .val( "1/1/14" )
- .simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } );
+ function step5() {
+ input.val( "1/1/14" );
+ TestHelpers.datepicker.init( input );
+ input.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } );
setTimeout(function() {
- $( ":focus" )
- .simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_DOWN, altKey: true } )
- .simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
- date = new Date( 2015, 1 - 1, 1 );
- TestHelpers.datepicker.equalsDate( input.datepicker( "valueAsDate" ), date,
- "Keystroke Page Down + Ctrl moves date to next year" );
-
- input.datepicker( "destroy" );
- step11();
+ $( ":focus" ).simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_DOWN } );
+ setTimeout(function() {
+ $( ":focus" ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
+ TestHelpers.datepicker.equalsDate(
+ input.datepicker( "valueAsDate" ),
+ new Date( 2014, 2 - 1, 1 ),
+ "Keystroke Page Down moves date to next month"
+ );
+ input.datepicker( "destroy" );
+ step6();
+ }, 50 );
}, 100 );
}
- // Check for moving to short months
- function step11() {
- input.datepicker()
- .val( "3/31/14" )
- .simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } );
+ function step6() {
+ input.val( "1/1/14" );
+ TestHelpers.datepicker.init( input );
+ input.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } );
setTimeout(function() {
- $( ":focus" )
- .simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_UP } )
- .simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
- date = new Date( 2014, 2 - 1, 28 );
- TestHelpers.datepicker.equalsDate( input.datepicker( "valueAsDate" ), date,
- "Keystroke Page Up and short months" );
-
- input.datepicker( "destroy" );
- step12();
+ $( ":focus" ).simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_DOWN, altKey: true } );
+ setTimeout(function() {
+ $( ":focus" ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
+ TestHelpers.datepicker.equalsDate(
+ input.datepicker( "valueAsDate" ),
+ new Date( 2015, 1 - 1, 1 ),
+ "Keystroke Page Down + Ctrl moves date to next year"
+ );
+ input.datepicker( "destroy" );
+ step7();
+ }, 50 );
}, 100 );
}
- function step12() {
- input.datepicker()
- .val( "1/30/16" )
- .simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } );
+ // Check for moving to short months
+ function step7() {
+ input.val( "3/31/14" );
+ TestHelpers.datepicker.init( input );
+ input.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } );
setTimeout(function() {
- $( ":focus" )
- .simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_DOWN } )
- .simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
- date = new Date( 2016, 2 - 1, 29 );
- TestHelpers.datepicker.equalsDate( input.datepicker( "valueAsDate" ), date,
- "Keystroke Page Down and leap years" );
-
- input.datepicker( "destroy" );
- start();
+ $( ":focus" ).simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_UP } );
+ setTimeout(function() {
+ $( ":focus" ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
+ TestHelpers.datepicker.equalsDate(
+ input.datepicker( "valueAsDate" ),
+ new Date( 2014, 2 - 1, 28 ),
+ "Keystroke Page Up and short months"
+ );
+ input.datepicker( "destroy" );
+ start();
+ }, 50 );
}, 100 );
}
@@ -502,110 +456,37 @@ asyncTest( "keyboard handling", function() {
"Keystroke pgdn step 2" );
*/
-test( "mouse", function() {
- expect( 13 );
- var input = $( "#datepicker" ).datepicker(),
- picker = input.datepicker( "widget" ),
- inline = $( "#inline" ).datepicker,
- date = new Date();
-
- input.val( "" ).datepicker( "open" );
- $( ".ui-datepicker-calendar tbody a:contains(10)", picker ).simulate( "mousedown", {} );
- date.setDate( 10 );
- TestHelpers.datepicker.equalsDate( input.datepicker( "valueAsDate" ), date, "Mouse click" );
-
- input.val( "2/4/08" ).datepicker( "open" );
- $( ".ui-datepicker-calendar tbody a:contains(12)", picker ).simulate( "mousedown", {} );
- TestHelpers.datepicker.equalsDate( input.datepicker( "valueAsDate" ), new Date( 2008, 2 - 1, 12 ),
- "Mouse click - preset" ) ;
-
- input.val( "" ).datepicker( "open" );
- $( "button.ui-datepicker-close", picker ).simulate( "click", {} );
- ok( input.datepicker( "valueAsDate" ) == null, "Mouse click - close" );
-
- input.val( "2/4/08" ).datepicker( "open" );
- $( "button.ui-datepicker-close", picker ).simulate( "click", {} );
- TestHelpers.datepicker.equalsDate( input.datepicker( "valueAsDate" ), new Date( 2008, 2 - 1, 4 ),
- "Mouse click - close + preset" );
-
- input.val( "2/4/08" ).datepicker( "open" );
- $( "a.ui-datepicker-prev", picker ).simulate( "click", {} );
- $( "button.ui-datepicker-close", picker ).simulate( "click", {} );
- TestHelpers.datepicker.equalsDate( input.datepicker( "valueAsDate" ), new Date( 2008, 2 - 1, 4 ),
- "Mouse click - abandoned" );
-
- // Current/previous/next
- input.val( "" ).datepicker( "open" );
- $( ".ui-datepicker-current", picker ).simulate( "click", {} );
- date.setDate( new Date().getDate() );
- TestHelpers.datepicker.equalsDate( input.datepicker( "valueAsDate" ), date, "Mouse click - current" );
-
- input.val( "2/4/08" ).datepicker( "open" );
- $( ".ui-datepicker-prev", picker ).simulate( "click" );
- $( ".ui-datepicker-calendar tbody a:contains(16)", picker ).simulate( "mousedown" );
- TestHelpers.datepicker.equalsDate( input.datepicker( "valueAsDate" ), new Date( 2008, 1 - 1, 16 ),
- "Mouse click - previous" );
-
- input.val( "2/4/08" ).datepicker( "open" );
- $( ".ui-datepicker-next", picker ).simulate( "click" );
- $( ".ui-datepicker-calendar tbody a:contains(18)", picker ).simulate( "mousedown" );
- TestHelpers.datepicker.equalsDate( input.datepicker( "valueAsDate" ), new Date( 2008, 3 - 1, 18 ),
- "Mouse click - next" );
-
- /*
- // TODO: Re-add when min and max options are introduced.
- // Previous/next with minimum/maximum
- input.datepicker( "option", {
- minDate: new Date( 2008, 2 - 1, 2 ),
- maxDate: new Date( 2008, 2 - 1, 26 )
- }).val( "2/4/08" ).datepicker( "open" );
- $( ".ui-datepicker-prev", picker ).simulate( "click" );
- $( ".ui-datepicker-calendar tbody a:contains(16)", picker ).simulate( "mousedown" );
- TestHelpers.datepicker.equalsDate( input.datepicker( "valueAsDate" ), new Date( 2008, 2 - 1, 16 ),
- "Mouse click - previous + min/max" );
-
- input.val( "2/4/08" ).datepicker( "open" );
- $( ".ui-datepicker-next", picker ).simulate( "click" );
- $( ".ui-datepicker-calendar tbody a:contains(18)", picker ).simulate( "mousedown" );
- TestHelpers.datepicker.equalsDate(input.datepicker( "valueAsDate" ), new Date( 2008, 2 - 1, 18 ),
- "Mouse click - next + min/max" );
- */
-
- // Inline
- inline = TestHelpers.datepicker.init( "#inline" );
- picker = $( ".ui-datepicker-inline", inline );
- date = new Date();
- inline.datepicker( "valueAsDate", date );
- $( ".ui-datepicker-calendar tbody a:contains(10)", picker ).simulate( "mousedown", {} );
- date.setDate( 10 );
- TestHelpers.datepicker.equalsDate( inline.datepicker( "valueAsDate" ), date, "Mouse click inline" );
-
- inline.datepicker( "option", { showButtonPanel: true } )
- .datepicker( "valueAsDate", new Date( 2008, 2 - 1, 4 ));
- $( ".ui-datepicker-calendar tbody a:contains(12)", picker ).simulate( "mousedown", {} );
- TestHelpers.datepicker.equalsDate( inline.datepicker( "valueAsDate" ), new Date( 2008, 2 - 1, 12 ),
- "Mouse click inline - preset" );
-
- inline.datepicker( "option", { showButtonPanel: true } );
- $( ".ui-datepicker-current", picker ).simulate( "click", {} );
- $( ".ui-datepicker-calendar tbody a:contains(14)", picker ).simulate( "mousedown", {} );
- date.setDate( 14 );
- TestHelpers.datepicker.equalsDate( inline.datepicker( "valueAsDate" ), date, "Mouse click inline - current" );
-
- inline.datepicker( "valueAsDate", new Date( 2008, 2 - 1, 4) );
- $( ".ui-datepicker-prev", picker ).simulate( "click" );
- $( ".ui-datepicker-calendar tbody a:contains(16)", picker ).simulate( "mousedown" );
- TestHelpers.datepicker.equalsDate( inline.datepicker( "valueAsDate" ), new Date( 2008, 1 - 1, 16 ),
- "Mouse click inline - previous" );
-
- inline.datepicker( "valueAsDate", new Date( 2008, 2 - 1, 4) );
- $( ".ui-datepicker-next", picker ).simulate( "click" );
- $( ".ui-datepicker-calendar tbody a:contains(18)", picker ).simulate( "mousedown" );
- TestHelpers.datepicker.equalsDate( inline.datepicker( "valueAsDate" ), new Date( 2008, 3 - 1, 18 ),
- "Mouse click inline - next" );
-
- input.datepicker( "destroy" );
- inline.datepicker( "destroy" );
+asyncTest( "mouse", function() {
+ expect( 3 );
+
+ var input = TestHelpers.datepicker.init( $( "#datepicker" ).val( "" ) ),
+ picker = input.datepicker( "widget" );
+
+ input.datepicker( "open" );
+
+ setTimeout(function() {
+ input.simulate( "click" );
+ ok( input.datepicker( "valueAsDate" ) === null, "Mouse click - close" );
+
+ input.val( "2/4/08" ).datepicker( "refresh" ).datepicker( "open" );
+ input.simulate( "click" );
+ TestHelpers.datepicker.equalsDate(
+ input.datepicker( "valueAsDate" ),
+ new Date( 2008, 2 - 1, 4 ),
+ "Mouse click - close + preset"
+ );
+
+ input.val( "2/4/08" ).datepicker( "refresh" ).datepicker( "open" );
+ $( "a.ui-calendar-prev", picker ).simulate( "click", {} );
+ input.simulate( "click" );
+ TestHelpers.datepicker.equalsDate(
+ input.datepicker( "valueAsDate" ),
+ new Date( 2008, 2 - 1, 4 ),
+ "Mouse click - abandoned"
+ );
+
+ start();
+ }, 100 );
});
})( jQuery );
diff --git a/tests/unit/datepicker/datepicker_methods.js b/tests/unit/datepicker/datepicker_methods.js
index 7efea106918..c69f15dac4d 100644
--- a/tests/unit/datepicker/datepicker_methods.js
+++ b/tests/unit/datepicker/datepicker_methods.js
@@ -64,54 +64,43 @@ test( "open", function() {
});
test( "value", function() {
- expect( 6 );
+ expect( 4 );
+
var input = $( "#datepicker" ).datepicker(),
- picker = input.datepicker( "widget" ),
- inline = $( "#inline" ).datepicker();
+ picker = input.datepicker( "widget" );
input.datepicker( "value", "1/1/14" );
equal( input.val(), "1/1/14", "input's value set" );
- ok( picker.find( "a[data-timestamp]:first" ).hasClass( "ui-state-focus" ),
- "first day marked as selected" );
+
+ input.datepicker( "open" );
+ ok( picker.find( "a[data-timestamp]:first" ).hasClass( "ui-state-active" ), "first day marked as selected" );
equal( input.datepicker( "value" ), "1/1/14", "getter" );
input.val( "abc" );
- equal( input.datepicker( "value" ), "abc",
- "Invalid values should be returned without formatting." );
-
- inline.datepicker( "value", "1/1/14" );
- ok( inline.find( "a[data-timestamp]:first" ).hasClass( "ui-state-focus" ),
- "first day marked as selected" );
- equal( inline.datepicker( "value" ), "1/1/14", "getter" );
-
- input.datepicker( "destroy" );
- inline.datepicker( "destroy" );
+ equal( input.datepicker( "value" ), "abc", "Invalid values should be returned without formatting." );
});
test( "valueAsDate", function() {
expect( 6 );
- var input = $( "#datepicker" ).datepicker(),
+
+ var input = TestHelpers.datepicker.init( "#datepicker" ),
picker = input.datepicker( "widget" ),
- inline = $( "#inline" ).datepicker();
+ date1 = new Date( 2008, 6 - 1, 4 );
input.datepicker( "valueAsDate", new Date( 2014, 0, 1 ) );
- equal( input.val(), "1/1/14", "input's value set" );
- ok( picker.find( "a[data-timestamp]:first" ).hasClass( "ui-state-focus" ),
- "first day marked as selected" );
- TestHelpers.datepicker.equalsDate( input.datepicker( "valueAsDate" ),
- new Date( 2014, 0, 1 ), "getter" );
+ equal( input.val(), "1/1/14", "Input's value set" );
+ ok( picker.find( "a[data-timestamp]:first" ).hasClass( "ui-state-active" ), "First day marked as selected" );
+ TestHelpers.datepicker.equalsDate( input.datepicker( "valueAsDate" ), new Date( 2014, 0, 1 ), "Getter" );
input.val( "a/b/c" );
equal( input.datepicker( "valueAsDate" ), null, "Invalid dates return null" );
- inline.datepicker( "valueAsDate", new Date( 2014, 0, 1 ) );
- ok( inline.find( "a[data-timestamp]:first" ).hasClass( "ui-state-focus" ),
- "first day marked as selected" );
- TestHelpers.datepicker.equalsDate( inline.datepicker( "valueAsDate" ),
- new Date( 2014, 0, 1 ), "getter" );
+ input.val( "" ).datepicker( "destroy" );
+ input = TestHelpers.datepicker.init( "#datepicker" );
- input.datepicker( "destroy" );
- inline.datepicker( "destroy" );
+ ok(input.datepicker( "valueAsDate" ) === null, "Set date - default" );
+ input.datepicker( "valueAsDate", date1 );
+ TestHelpers.datepicker.equalsDate(input.datepicker( "valueAsDate" ), date1, "Set date - 2008-06-04" );
});
test( "isValid", function() {
diff --git a/ui/datepicker.js b/ui/datepicker.js
index f2dfa2d1594..f564bf9a39b 100644
--- a/ui/datepicker.js
+++ b/ui/datepicker.js
@@ -45,6 +45,7 @@ $.widget( "ui.datepicker", {
showWeek: false,
show: true,
hide: true,
+ value: null,
// callbacks
beforeOpen: null,
@@ -54,17 +55,22 @@ $.widget( "ui.datepicker", {
},
_create: function() {
- this.date = $.date( null, this.options.dateFormat );
-
- this.date.eachDay = this.options.eachDay;
this.id = "ui-datepicker-" + idIncrement;
idIncrement++;
+
if ( this.element.is( "input" ) ) {
+ if ( !this.options.value && this.isValid() ) {
+ this.options.value = this._getParsedValue();
+ }
this._createPicker();
} else {
this.inline = true;
this.picker = this.element;
}
+
+ this.date = $.date( this.options.value, this.options.dateFormat ).select();
+ this.date.eachDay = this.options.eachDay;
+
this._on( this.picker, {
"click .ui-datepicker-prev": function( event ) {
event.preventDefault();
@@ -106,7 +112,7 @@ $.widget( "ui.datepicker", {
_handleKeydown: function( event ) {
if ( jQuery.inArray( event.keyCode, [ 13, 33, 34, 35, 36, 37, 38, 39, 40 ] ) === -1 ) {
- //only interested navigation keys
+ // only interested navigation keys
return;
}
event.preventDefault();
@@ -171,7 +177,7 @@ $.widget( "ui.datepicker", {
_createPicker: function() {
this.picker = $( "" )
.addClass( "ui-front" )
- // TODO add a ui-datepicker-popup class, move position:absolte to that
+ // TODO add a ui-datepicker-popup class, move position:absolute to that
.css( "position", "absolute" )
.uniqueId()
.hide();
@@ -217,6 +223,7 @@ $.widget( "ui.datepicker", {
}
}
break;
+ // TODO this is not in specs, keep?
case $.ui.keyCode.END:
if ( event.ctrlKey ) {
this.element.val( "" );
@@ -230,12 +237,12 @@ $.widget( "ui.datepicker", {
},
keyup: function() {
if ( this.isValid() && !this.inline ) {
- this.date.setTime( this.element.val() ).select();
+ this.date.setTime( this._getParsedValue() ).select();
this.refresh();
}
},
mousedown: function( event ) {
- if (this.isOpen) {
+ if ( this.isOpen ) {
suppressExpandOnFocus = true;
this.close();
return;
@@ -312,6 +319,7 @@ $.widget( "ui.datepicker", {
return element;
},
+
_createTmpl: function() {
this._createDatepicker();
this.picker.find( "button" ).button();
@@ -323,6 +331,7 @@ $.widget( "ui.datepicker", {
this.picker.find( ".ui-datepicker" ).css( "display", "block" );
this.grid = this.picker.find( ".ui-datepicker-calendar" );
},
+
_createDatepicker: function() {
var multiClasses = [],
pickerHtml = "";
@@ -345,6 +354,7 @@ $.widget( "ui.datepicker", {
.html( pickerHtml )
.appendTo( this.picker );
},
+
_buildMultiplePicker: function() {
var headerClass,
html = "",
@@ -572,8 +582,8 @@ $.widget( "ui.datepicker", {
// with the prev and next links would cause loss of focus issues because the links being
// interacted with will disappear while focused.
refresh: function() {
- //determine which day gridcell to focus after refresh
- //TODO: Prevent disabled cells from being focused
+ // determine which day gridcell to focus after refresh
+ // TODO: Prevent disabled cells from being focused
if ( this.options.numberOfMonths === 1 ) {
this.grid = $( this._buildGrid() );
$( ".ui-datepicker-title", this.picker ).html( this._buildTitle() );
@@ -605,10 +615,6 @@ $.widget( "ui.datepicker", {
return;
}
- // TODO explain this
- this.date = $.date( this.element.val(), this.options.dateFormat );
- this.date.eachDay = this.options.eachDay;
- this.date.select();
this.refresh();
this.picker
@@ -649,46 +655,38 @@ $.widget( "ui.datepicker", {
},
_buildPosition: function() {
- return $.extend( {}, {
- of: this.element
- }, this.options.position );
+ return $.extend( { of: this.element }, this.options.position );
},
_select: function( event, time ) {
- this.date.setTime( time ).select();
- this.refresh();
+ this._setOption( "value", new Date( time ) );
if ( !this.inline ) {
- this.element.val( this.date.format() );
this.close();
this._focusTrigger();
}
this._trigger( "select", event, {
// TODO replace with value option to initialise and read
- date: this.date.format()
+ date: this.value()
});
},
- _value: function( value ) {
- this.date.setTime( value ).select();
- if ( !this.inline ) {
- this.element.val( this.date.format() );
- }
- this.refresh();
- },
-
value: function( value ) {
if ( arguments.length ) {
- this._value( value );
+ this._setOption( "value", Globalize.parseDate( value, this.options.dateFormat ) );
} else {
- return this.isValid() ? this.date.format() : this.element.val();
+ if ( this.inline ) {
+ return Globalize.format( this.date.selected(), this.options.dateFormat );
+ } else {
+ return this.element.val();
+ }
}
},
valueAsDate: function( value ) {
if ( arguments.length ) {
- this._value( value );
+ this._setOption( "value", value );
} else {
- return this.isValid() ? this.date.date() : null;
+ return this.option( "value" );
}
},
@@ -697,7 +695,7 @@ $.widget( "ui.datepicker", {
return true;
}
- return Globalize.parseDate( this.element.val(), this.options.dateFormat ) !== null;
+ return this._getParsedValue() !== null;
},
_destroy: function() {
@@ -715,7 +713,28 @@ $.widget( "ui.datepicker", {
return this.picker;
},
+ _getParsedValue: function() {
+ return Globalize.parseDate( this.element.val(), this.options.dateFormat );
+ },
+
+ option: function( key ) {
+ if ( arguments.length === 0 || ( arguments.length === 1 && key === "value" ) ) {
+ this.options.value = this.inline ? this.date.selected() : this._getParsedValue();
+ }
+ return this._superApply( arguments );
+ },
+
_setOption: function( key, value ) {
+ if ( key === "value" ) {
+ if ( $.type( value ) === "date" ) {
+ this.date.setTime( value.getTime() ).select();
+ this.refresh();
+ if ( !this.inline ) {
+ this.element.val( this.date.format() );
+ }
+ }
+ }
+
this._super( key, value );
if ( key === "appendTo" ) {
From 6d393eae7c8afa2a885630dc5dc5e8ffe5980f0a Mon Sep 17 00:00:00 2001
From: Felix Nagel
Date: Tue, 3 Jun 2014 23:18:51 +0200
Subject: [PATCH 02/26] Calendar: Add calendar widget
Add calendar widget by copying and renaming datepicker widget files.
Remove datepicker functionality, options and methods from Calendar.
Remove calendar functionality, options and methods from Datepicker.
Adjust tests due to split and changed specification. Remove duplicated
demo files and fix some demos. Simplify calendar generation, use CSS
instead of inline styles. Fix destroy method. Make use of uniqueId
method. Fix focus highlighting when month is changed. Add version
property. Add common unit tests. Fix input keyboard handling.
---
Gruntfile.js | 1 +
build/tasks/testswarm.js | 1 +
demos/{datepicker => calendar}/buttonbar.html | 8 +-
.../inline.html => calendar/default.html} | 10 +-
.../dropdown-month-year.html | 8 +-
demos/calendar/index.html | 22 +
demos/calendar/localization.html | 41 +
demos/{datepicker => calendar}/min-max.html | 8 +-
.../multiple-calendars.html | 10 +-
demos/calendar/multiple-months.html | 33 +
.../other-months.html | 10 +-
demos/{datepicker => calendar}/show-week.html | 10 +-
demos/datepicker/alt-field.html | 5 +-
demos/datepicker/animation.html | 1 +
demos/datepicker/date-formats.html | 26 +-
demos/datepicker/date-range.html | 49 -
demos/datepicker/default.html | 1 +
demos/datepicker/icon-trigger.html | 1 +
demos/datepicker/index.html | 14 +-
demos/datepicker/localization.html | 1 +
demos/index.html | 1 +
tests/unit/all.html | 1 +
tests/unit/calendar/all.html | 26 +
tests/unit/calendar/calendar.html | 46 +
tests/unit/calendar/calendar_common.js | 14 +
tests/unit/calendar/calendar_core.js | 370 ++++++
tests/unit/calendar/calendar_events.js | 150 +++
tests/unit/calendar/calendar_methods.js | 78 ++
tests/unit/calendar/calendar_options.js | 351 +++++
tests/unit/calendar/calendar_test_helpers.js | 22 +
tests/unit/datepicker/datepicker.html | 5 +-
tests/unit/datepicker/datepicker_common.js | 22 +-
tests/unit/datepicker/datepicker_core.js | 406 +-----
tests/unit/datepicker/datepicker_methods.js | 29 +-
tests/unit/datepicker/datepicker_options.js | 1129 +----------------
.../datepicker/datepicker_test_helpers.js | 2 +-
tests/unit/index.html | 1 +
themes/base/base.css | 1 +
themes/base/calendar.css | 178 +++
themes/base/datepicker.css | 172 +--
ui/calendar.js | 481 +++++++
ui/datepicker.js | 570 ++-------
42 files changed, 2039 insertions(+), 2276 deletions(-)
rename demos/{datepicker => calendar}/buttonbar.html (84%)
rename demos/{datepicker/inline.html => calendar/default.html} (69%)
rename demos/{datepicker => calendar}/dropdown-month-year.html (82%)
create mode 100644 demos/calendar/index.html
create mode 100644 demos/calendar/localization.html
rename demos/{datepicker => calendar}/min-max.html (81%)
rename demos/{datepicker => calendar}/multiple-calendars.html (75%)
create mode 100644 demos/calendar/multiple-months.html
rename demos/{datepicker => calendar}/other-months.html (77%)
rename demos/{datepicker => calendar}/show-week.html (77%)
delete mode 100644 demos/datepicker/date-range.html
create mode 100644 tests/unit/calendar/all.html
create mode 100644 tests/unit/calendar/calendar.html
create mode 100644 tests/unit/calendar/calendar_common.js
create mode 100644 tests/unit/calendar/calendar_core.js
create mode 100644 tests/unit/calendar/calendar_events.js
create mode 100644 tests/unit/calendar/calendar_methods.js
create mode 100644 tests/unit/calendar/calendar_options.js
create mode 100644 tests/unit/calendar/calendar_test_helpers.js
create mode 100644 themes/base/calendar.css
create mode 100644 ui/calendar.js
diff --git a/Gruntfile.js b/Gruntfile.js
index b8610b6f641..3d9a11963db 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -28,6 +28,7 @@ var
"core",
"accordion",
"autocomplete",
+ "calendar",
"button",
"datepicker",
"dialog",
diff --git a/build/tasks/testswarm.js b/build/tasks/testswarm.js
index a147b8f573c..0d500ef09dd 100644
--- a/build/tasks/testswarm.js
+++ b/build/tasks/testswarm.js
@@ -14,6 +14,7 @@ var versions = {
"Accordion": "accordion/accordion.html",
"Autocomplete": "autocomplete/autocomplete.html",
"Button": "button/button.html",
+ "Calendar": "calendar/calendar.html",
"Core": "core/core.html",
"Core_deprecated": "core/core_deprecated.html",
"Datepicker": "datepicker/datepicker.html",
diff --git a/demos/datepicker/buttonbar.html b/demos/calendar/buttonbar.html
similarity index 84%
rename from demos/datepicker/buttonbar.html
rename to demos/calendar/buttonbar.html
index 446bc9fe495..498fe1041f4 100644
--- a/demos/datepicker/buttonbar.html
+++ b/demos/calendar/buttonbar.html
@@ -2,7 +2,7 @@
- jQuery UI Datepicker - Display button bar
+ jQuery UI Calendar - Display button bar
@@ -11,12 +11,12 @@
+
-
@@ -11,21 +11,21 @@
+
-
-Date:
+
-
Display the datepicker embedded in the page instead of in an overlay. Simply call .datepicker() on a div instead of an input.
+
The calendar is a widget for selecting a date using a visual calendar representation.
diff --git a/demos/datepicker/dropdown-month-year.html b/demos/calendar/dropdown-month-year.html
similarity index 82%
rename from demos/datepicker/dropdown-month-year.html
rename to demos/calendar/dropdown-month-year.html
index c6102917f43..050a89157ff 100644
--- a/demos/datepicker/dropdown-month-year.html
+++ b/demos/calendar/dropdown-month-year.html
@@ -2,7 +2,7 @@
- jQuery UI Datepicker - Display month & year menus
+ jQuery UI Calendar - Display month & year menus
@@ -11,12 +11,12 @@
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ German (Deutsch)
+ English
+
+
+
+
Localize the calendar calendar language and format (English / Western formatting is the default). The calendar includes built-in support for languages that read right-to-left, such as Arabic and Hebrew.
+
+
+
diff --git a/demos/datepicker/min-max.html b/demos/calendar/min-max.html
similarity index 81%
rename from demos/datepicker/min-max.html
rename to demos/calendar/min-max.html
index 6dcc16a48bc..c449bbdd55c 100644
--- a/demos/datepicker/min-max.html
+++ b/demos/calendar/min-max.html
@@ -2,7 +2,7 @@
- jQuery UI Datepicker - Restrict date range
+ jQuery UI Calendar - Restrict date range
@@ -11,18 +11,18 @@
+
-
-Date:
+
Restrict the range of selectable dates with the minDate
and maxDate
options. Set the beginning and end dates as actual dates (new Date(2009, 1 - 1, 26)), as a numeric offset from today (-20), or as a string of periods and units ('+1M +10D'). For the last, use 'D' for days, 'W' for weeks, 'M' for months, or 'Y' for years.
diff --git a/demos/datepicker/multiple-calendars.html b/demos/calendar/multiple-calendars.html
similarity index 75%
rename from demos/datepicker/multiple-calendars.html
rename to demos/calendar/multiple-calendars.html
index 3d8278cd625..f67609d143e 100644
--- a/demos/datepicker/multiple-calendars.html
+++ b/demos/calendar/multiple-calendars.html
@@ -2,7 +2,7 @@
-
jQuery UI Datepicker - Display multiple months
+
jQuery UI Calendar - Display multiple months
@@ -11,12 +11,12 @@
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Set the numberOfMonths
option to an integer of 2 or more to show multiple months in a single calendar.
+
+
+
diff --git a/demos/datepicker/other-months.html b/demos/calendar/other-months.html
similarity index 77%
rename from demos/datepicker/other-months.html
rename to demos/calendar/other-months.html
index bfb3f1af36f..0228c62df5b 100644
--- a/demos/datepicker/other-months.html
+++ b/demos/calendar/other-months.html
@@ -2,7 +2,7 @@
-
jQuery UI Datepicker - Dates in other months
+
jQuery UI Calendar - Dates in other months
@@ -11,12 +11,12 @@
+
-
@@ -11,12 +11,12 @@
+
-
+
+
diff --git a/demos/datepicker/date-formats.html b/demos/datepicker/date-formats.html
index 2c5045b6f33..4e9346456b9 100644
--- a/demos/datepicker/date-formats.html
+++ b/demos/datepicker/date-formats.html
@@ -12,28 +12,22 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
From
-
-
to
-
-
-
-
Select the date range to search for.
-
-
-
diff --git a/demos/datepicker/default.html b/demos/datepicker/default.html
index be0c453c2b3..b2439b29ab3 100644
--- a/demos/datepicker/default.html
+++ b/demos/datepicker/default.html
@@ -12,6 +12,7 @@
+
+
diff --git a/demos/datepicker/index.html b/demos/datepicker/index.html
index d9c8dfc10da..5587564831f 100644
--- a/demos/datepicker/index.html
+++ b/demos/datepicker/index.html
@@ -9,19 +9,11 @@
diff --git a/demos/datepicker/localization.html b/demos/datepicker/localization.html
index 61aa7c9a2da..701e5c36b66 100644
--- a/demos/datepicker/localization.html
+++ b/demos/datepicker/localization.html
@@ -11,6 +11,7 @@
+
diff --git a/demos/index.html b/demos/index.html
index f37874a4481..c4a0fdf9501 100644
--- a/demos/index.html
+++ b/demos/index.html
@@ -11,6 +11,7 @@
accordion
autocomplete
button
+
calendar
datepicker
dialog
draggable
diff --git a/tests/unit/all.html b/tests/unit/all.html
index f8a4636d051..85e21077412 100644
--- a/tests/unit/all.html
+++ b/tests/unit/all.html
@@ -21,6 +21,7 @@
"button/button.html",
"core/core.html",
"core/core_deprecated.html",
+ "calendar/calendar.html",
"datepicker/datepicker.html",
"dialog/dialog.html",
"draggable/draggable.html",
diff --git a/tests/unit/calendar/all.html b/tests/unit/calendar/all.html
new file mode 100644
index 00000000000..5b22b047024
--- /dev/null
+++ b/tests/unit/calendar/all.html
@@ -0,0 +1,26 @@
+
+
+
+
+
jQuery UI Calendar Test Suite
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/unit/calendar/calendar.html b/tests/unit/calendar/calendar.html
new file mode 100644
index 00000000000..ed536414fbc
--- /dev/null
+++ b/tests/unit/calendar/calendar.html
@@ -0,0 +1,46 @@
+
+
+
+
+
jQuery UI Calendar Test Suite
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/unit/calendar/calendar_common.js b/tests/unit/calendar/calendar_common.js
new file mode 100644
index 00000000000..f3a01171ba5
--- /dev/null
+++ b/tests/unit/calendar/calendar_common.js
@@ -0,0 +1,14 @@
+TestHelpers.commonWidgetTests( "calendar", {
+ defaults: {
+ dateFormat: { date: "short" },
+ disabled: false,
+ eachDay: $.noop,
+ numberOfMonths: 1,
+ showWeek: false,
+ value: null,
+
+ // callbacks
+ create: null,
+ select: null
+ }
+});
diff --git a/tests/unit/calendar/calendar_core.js b/tests/unit/calendar/calendar_core.js
new file mode 100644
index 00000000000..c9198ac87b7
--- /dev/null
+++ b/tests/unit/calendar/calendar_core.js
@@ -0,0 +1,370 @@
+(function( $ ) {
+
+module( "calendar: core" );
+
+TestHelpers.testJshint( "calendar" );
+
+test( "baseStructure", function() {
+ expect( 22 );
+
+ var header, title, table, thead, week, child, buttonpane,
+ element = $( "#calendar" ).calendar(),
+ dp = element.calendar( "widget" );
+
+ function step1() {
+ ok( !dp.is( ".ui-calendar-rtl" ), "Structure - not right-to-left" );
+ ok( !dp.is( ".ui-calendar-multi" ), "Structure - not multi-month" );
+ equal( dp.children().length, 3, "Structure - child count (header, calendar)" );
+
+ header = dp.children( ":first" );
+ ok( header.is( "div.ui-calendar-header" ), "Structure - header division" );
+ equal( header.children().length, 3, "Structure - header child count" );
+ ok( header.children( ":first" ).is( ".ui-calendar-prev" ) && header.children( ":first" ).html() !== "", "Structure - prev link" );
+ ok( header.children( ":eq(1)" ).is( ".ui-calendar-next" ) && header.children( ":eq(1)" ).html() !== "", "Structure - next link" );
+
+ title = header.children( ":last" ).children( ":first" );
+ ok( title.is( "div.ui-calendar-title" ) && title.html() !== "", "Structure - title division" );
+ equal( title.children().length, 2, "Structure - title child count" );
+ ok( title.children( ":first" ).is( "span.ui-calendar-month" ) && title.children( ":first" ).text() !== "", "Structure - month text" );
+ ok( title.children( ":last" ).is( "span.ui-calendar-year" ) && title.children( ":last" ).text() !== "", "Structure - year text" );
+
+ table = dp.children( ":eq(1)" );
+ ok( table.is( "table.ui-calendar-calendar" ), "Structure - month table" );
+ ok( table.children( ":first" ).is( "thead" ), "Structure - month table thead" );
+
+ thead = table.children( ":first" ).children( ":first" );
+ ok( thead.is( "tr" ), "Structure - month table title row" );
+ equal( thead.find( "th" ).length, 7, "Structure - month table title cells" );
+ ok( table.children( ":eq(1)" ).is( "tbody" ), "Structure - month table body" );
+ ok( table.children( ":eq(1)" ).children( "tr" ).length >= 4, "Structure - month table week count" );
+
+ week = table.children( ":eq(1)" ).children( ":first" );
+ ok( week.is( "tr" ), "Structure - month table week row" );
+ equal( week.children().length, 7, "Structure - week child count" );
+
+ element.calendar( "destroy" );
+
+ step2();
+ }
+
+ function step2() {
+ // Multi-month 2
+ element = $( "#calendar" ).calendar( { numberOfMonths: 2 } );
+ dp = element.calendar( "widget" );
+
+ ok( dp.is( ".ui-calendar-multi" ), "Structure multi [2] - multi-month" );
+ equal( dp.children().length, 4, "Structure multi [2] - child count" );
+
+ child = dp.children( ":eq(2)" );
+ ok( child.is( "div.ui-calendar-row-break" ), "Structure multi [2] - row break" );
+
+ element.calendar( "destroy" );
+ }
+
+ step1();
+});
+
+test( "Localization", function() {
+ expect( 5 );
+
+ var defaultLocale = Globalize.locale(),
+ element = $( "#calendar" ),
+ date = new Date( 2014, 0, 1 ),
+ initCalendar = function() {
+ element
+ .calendar()
+ .calendar( "valueAsDate", date );
+ },
+ testLocalization = function( message ) {
+ equal( element.find( ".ui-calendar-month" ).text(), "Januar", message + "titlebar year" );
+ equal( element.find( "thead th:first" ).text(), "Mo.", message + "teader first day" );
+ equal( element.find( "thead th:last" ).text(), "So.", message + "header last day" );
+ equal( element.find( ".ui-calendar-prev" ).text(), "
", message + "header next" );
+ };
+
+ Globalize.locale( "de-DE" );
+ initCalendar();
+ testLocalization( "Init: " );
+ element.calendar( "destroy" );
+
+ Globalize.locale( defaultLocale.locale );
+});
+
+asyncTest( "keyboard handling", function() {
+ expect( 10 );
+
+ var element = $( "#calendar" );
+
+ function step1() {
+ element.calendar({ value: new Date( 2014, 1 - 1, 1 ) });
+
+ TestHelpers.calendar.focusGrid( element ).simulate( "keydown", { keyCode: $.ui.keyCode.LEFT } );
+ setTimeout(function() {
+ $( ":focus" ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
+ TestHelpers.calendar.equalsDate(
+ element.calendar( "valueAsDate" ),
+ new Date( 2013, 12 - 1, 31 ),
+ "Keystroke left to switch to previous day"
+ );
+ element.calendar( "destroy" );
+ step2();
+ }, 50 );
+ }
+
+ function step2() {
+ element.calendar({ value: new Date( 2014, 1 - 1, 1 ) });
+
+ TestHelpers.calendar.focusGrid( element )
+ .simulate( "keydown", { keyCode: $.ui.keyCode.RIGHT } )
+ .simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
+
+ TestHelpers.calendar.equalsDate(
+ element.calendar( "valueAsDate" ),
+ new Date( 2014, 1 - 1, 2 ),
+ "Keystroke right to switch to next day"
+ );
+ step3();
+ }
+
+ function step3() {
+ element.calendar({ value: new Date( 2014, 1 - 1, 1 ) });
+
+ TestHelpers.calendar.focusGrid( element ).simulate( "keydown", { keyCode: $.ui.keyCode.UP } );
+ setTimeout(function() {
+ $( ":focus" ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
+ TestHelpers.calendar.equalsDate(
+ element.calendar( "valueAsDate" ),
+ new Date( 2013, 12 - 1, 25 ),
+ "Keystroke up to move to the previous week"
+ );
+ element.calendar( "destroy" );
+ step4();
+ }, 50 );
+ }
+
+ function step4() {
+ element.calendar({ value: new Date( 2014, 1 - 1, 1 ) });
+
+ TestHelpers.calendar.focusGrid( element ).simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } );
+ setTimeout(function() {
+ $( ":focus" ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
+ TestHelpers.calendar.equalsDate(
+ element.calendar( "valueAsDate" ),
+ new Date( 2014, 1 - 1, 8 ),
+ "Keystroke down to move to the next week"
+ );
+ element.calendar( "destroy" );
+ step5();
+ }, 50 );
+ }
+
+ function step5() {
+ element.calendar({ value: new Date( 2014, 1 - 1, 1 ) });
+
+ TestHelpers.calendar.focusGrid( element ).simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_UP } );
+ setTimeout(function() {
+ $( ":focus" ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
+ TestHelpers.calendar.equalsDate(
+ element.calendar( "valueAsDate" ),
+ new Date( 2013, 12 - 1, 1 ),
+ "Keystroke Page Up moves date to previous month"
+ );
+ element.calendar( "destroy" );
+ step6();
+ }, 50 );
+ }
+
+ function step6() {
+ element.calendar({ value: new Date( 2014, 1 - 1, 1 ) });
+
+ TestHelpers.calendar.focusGrid( element )
+ .simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_UP, altKey: true } );
+ setTimeout(function() {
+ $( ":focus" ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
+ TestHelpers.calendar.equalsDate(
+ element.calendar( "valueAsDate" ),
+ new Date( 2013, 1 - 1, 1 ),
+ "Keystroke Page Up + Ctrl moves date to previous year"
+ );
+ element.calendar( "destroy" );
+ step7();
+ }, 50 );
+ }
+
+ function step7() {
+ element.calendar({ value: new Date( 2014, 1 - 1, 1 ) });
+
+ TestHelpers.calendar.focusGrid( element ).simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_DOWN } );
+ setTimeout(function() {
+ $( ":focus" ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
+ TestHelpers.calendar.equalsDate(
+ element.calendar( "valueAsDate" ),
+ new Date( 2014, 2 - 1, 1 ),
+ "Keystroke Page Down moves date to next month"
+ );
+ element.calendar( "destroy" );
+ step8();
+ }, 50 );
+ }
+
+ function step8() {
+ element.calendar({ value: new Date( 2014, 1 - 1, 1 ) });
+
+ TestHelpers.calendar.focusGrid( element )
+ .simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_DOWN, altKey: true } );
+ setTimeout(function() {
+ $( ":focus" ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
+ TestHelpers.calendar.equalsDate(
+ element.calendar( "valueAsDate" ),
+ new Date( 2015, 1 - 1, 1 ),
+ "Keystroke Page Down + Ctrl moves date to next year"
+ );
+ element.calendar( "destroy" );
+ step9();
+ }, 50 );
+ }
+
+ // Check for moving to short months
+ function step9() {
+ element.calendar({ value: new Date( 2014, 3 - 1, 31 ) });
+
+ TestHelpers.calendar.focusGrid( element ).simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_UP } );
+ setTimeout(function() {
+ $( ":focus" ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
+ TestHelpers.calendar.equalsDate(
+ element.calendar( "valueAsDate" ),
+ new Date( 2014, 2 - 1, 28 ),
+ "Keystroke Page Up and short months"
+ );
+ element.calendar( "destroy" );
+ step10();
+ }, 50 );
+ }
+
+ function step10() {
+ element.calendar({ value: new Date( 2016, 1 - 1, 30 ) });
+
+ TestHelpers.calendar.focusGrid( element ).simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_DOWN } );
+ setTimeout(function() {
+ $( ":focus" ).simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
+ TestHelpers.calendar.equalsDate(
+ element.calendar( "valueAsDate" ),
+ new Date( 2016, 2 - 1, 29 ),
+ "Keystroke Page Down and leap years"
+ );
+ element.calendar( "destroy" );
+ start();
+ }, 50 );
+ }
+
+ step1();
+});
+
+/*
+ // TODO: Re-add tests if we implement a stepMonths option
+ input.calendar( "option", { stepMonths: 2, gotoCurrent: false } )
+ .calendar( "close" ).val( "02/04/2008" ).calendar( "open" )
+ .late( "keydown", { keyCode: $.ui.keyCode.PAGE_UP } )
+ .simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
+ TestHelpers.datepicker.equalsDate( input.calendar( "valueAsDate" ), new Date( 2007, 12 - 1, 4 ),
+ "Keystroke pgup step 2" );
+
+ input.val( "02/04/2008" ).calendar( "open" )
+ .simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_DOWN } )
+ .simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
+ TestHelpers.datepicker.equalsDate( input.calendar( "valueAsDate" ), new Date( 2008, 4 - 1, 4 ),
+ "Keystroke pgdn step 2" );
+ */
+
+// TODO: implement
+test( "ARIA", function() {
+ expect( 0 );
+});
+
+asyncTest( "mouse", function() {
+ expect( 6 );
+
+ var element = $( "#calendar" ).calendar(),
+ date = new Date();
+
+ function step1() {
+ $( "tbody a:contains(10)", element ).simulate( "mousedown", {} );
+ date.setDate( 10 );
+ TestHelpers.calendar.equalsDate(
+ element.calendar( "valueAsDate" ),
+ date,
+ "Mouse click"
+ );
+
+ element.calendar( "option", "value", new Date( 2008, 2 - 1, 4) );
+ $( ".ui-calendar-calendar tbody a:contains(12)", element ).simulate( "mousedown" );
+ TestHelpers.calendar.equalsDate(
+ element.calendar( "valueAsDate" ),
+ new Date( 2008, 2 - 1, 12 ),
+ "Mouse click - preset"
+ );
+
+ // Previous/next
+ element.calendar( "option", "value", new Date( 2008, 2 - 1, 4) );
+ $( ".ui-calendar-prev", element ).simulate( "click" );
+ $( ".ui-calendar-calendar tbody a:contains(16)", element ).simulate( "mousedown" );
+ TestHelpers.calendar.equalsDate(
+ element.calendar( "valueAsDate" ),
+ new Date( 2008, 1 - 1, 16 ),
+ "Mouse click - previous"
+ );
+
+ element.calendar( "option", "value", new Date( 2008, 2 - 1, 4) );
+ $( ".ui-calendar-next", element ).simulate( "click" );
+ $( ".ui-calendar-calendar tbody a:contains(18)", element ).simulate( "mousedown" );
+ TestHelpers.calendar.equalsDate(
+ element.calendar( "valueAsDate" ),
+ new Date( 2008, 3 - 1, 18 ),
+ "Mouse click - next"
+ );
+
+ step2();
+ }
+
+ // Previous/next with minimum/maximum
+ function step2() {
+ element.calendar( "destroy" );
+ element.calendar({
+ value: new Date( 2008, 3 - 1, 4),
+ min: new Date( 2008, 2 - 1, 2 ),
+ max: new Date( 2008, 2 - 1, 26 )
+ });
+
+ $( ".ui-calendar-prev", element ).simulate( "click" );
+ $( "tbody a:contains(16)", element ).simulate( "mousedown" );
+ TestHelpers.calendar.equalsDate(
+ element.calendar( "valueAsDate" ),
+ new Date( 2008, 2 - 1, 16 ),
+ "Mouse click - previous + min/max"
+ );
+ step3();
+ }
+
+ function step3() {
+ element.calendar( "destroy" );
+ element.calendar({
+ value: new Date( 2008, 1 - 1, 4),
+ min: new Date( 2008, 2 - 1, 2 ),
+ max: new Date( 2008, 2 - 1, 26 )
+ });
+
+ $( ".ui-calendar-next", element ).simulate( "click" );
+ $( "tbody a:contains(18)", element ).simulate( "mousedown" );
+ TestHelpers.calendar.equalsDate(
+ element.calendar( "valueAsDate" ),
+ new Date( 2008, 2 - 1, 18 ),
+ "Mouse click - next + min/max"
+ );
+ start();
+ }
+
+ step1();
+});
+
+})( jQuery );
diff --git a/tests/unit/calendar/calendar_events.js b/tests/unit/calendar/calendar_events.js
new file mode 100644
index 00000000000..2d03801fadb
--- /dev/null
+++ b/tests/unit/calendar/calendar_events.js
@@ -0,0 +1,150 @@
+// The implement of events is completely changing therefore these tests are no longer directly
+// relevant. Leaving them around commented out so we can ensure the functionality is replicated.
+// For example:
+// TODO: In the old implementation the Enter key select's today's date when the has
+// focus and is empty. Do we want to replicate this behavior in the rewrite?
+/*
+
+(function( $ ) {
+
+module( "calendar: events" );
+
+test( "beforeOpen", function() {
+ expect( 0 );
+});
+
+test( "close", function() {
+ expect( 0 );
+});
+
+test( "open", function() {
+ expect( 0 );
+});
+
+test( "select", function() {
+ expect( 0 );
+});
+
+var selectedThis = null,
+selectedDate = null,
+selectedInst = null;
+
+function callback(date, inst) {
+ selectedThis = this;
+ selectedDate = date;
+ selectedInst = inst;
+}
+
+function callback2(year, month, inst) {
+ selectedThis = this;
+ selectedDate = year + "/" + month;
+ selectedInst = inst;
+}
+
+test( "events", function() {
+ expect( 26 );
+ var dateStr, newMonthYear, inp2,
+ inp = TestHelpers.calendar.init( "#inp", {onSelect: callback}),
+ date = new Date();
+ // onSelect
+ inp.val( "" ).calendar( "show" ).
+ simulate( "keydown", {keyCode: $.ui.keyCode.ENTER});
+ equal(selectedThis, inp[0], "Callback selected this" );
+ equal(selectedInst, $.data(inp[0], TestHelpers.calendar.PROP_NAME), "Callback selected inst" );
+ equal(selectedDate, $.calendar.formatDate( "mm/dd/yy", date),
+ "Callback selected date" );
+ inp.val( "" ).calendar( "show" ).
+ simulate( "keydown", {ctrlKey: true, keyCode: $.ui.keyCode.DOWN}).
+ simulate( "keydown", {keyCode: $.ui.keyCode.ENTER});
+ date.setDate(date.getDate() + 7);
+ equal(selectedDate, $.calendar.formatDate( "mm/dd/yy", date),
+ "Callback selected date - ctrl+down" );
+ inp.val( "" ).calendar( "show" ).
+ simulate( "keydown", {keyCode: $.ui.keyCode.ESCAPE});
+ equal(selectedDate, $.calendar.formatDate( "mm/dd/yy", date),
+ "Callback selected date - esc" );
+ dateStr = "02/04/2008";
+ inp.val(dateStr).calendar( "show" ).
+ simulate( "keydown", {keyCode: $.ui.keyCode.ENTER});
+ equal(dateStr, selectedDate,
+ "onSelect is called after enter keydown" );
+ // onChangeMonthYear
+ inp.calendar( "option", {onChangeMonthYear: callback2, onSelect: null}).
+ val( "" ).calendar( "show" );
+ newMonthYear = function(date) {
+ return date.getFullYear() + "/" + (date.getMonth() + 1);
+ };
+ date = new Date();
+ date.setDate(1);
+ inp.simulate( "keydown", {keyCode: $.ui.keyCode.PAGE_UP});
+ date.setMonth(date.getMonth() - 1);
+ equal(selectedThis, inp[0], "Callback change month/year this" );
+ equal(selectedInst, $.data(inp[0], TestHelpers.calendar.PROP_NAME), "Callback change month/year inst" );
+ equal(selectedDate, newMonthYear(date),
+ "Callback change month/year date - pgup" );
+ inp.simulate( "keydown", {keyCode: $.ui.keyCode.PAGE_DOWN});
+ date.setMonth(date.getMonth() + 1);
+ equal(selectedDate, newMonthYear(date),
+ "Callback change month/year date - pgdn" );
+ inp.simulate( "keydown", {ctrlKey: true, keyCode: $.ui.keyCode.PAGE_UP});
+ date.setFullYear(date.getFullYear() - 1);
+ equal(selectedDate, newMonthYear(date),
+ "Callback change month/year date - ctrl+pgup" );
+ inp.simulate( "keydown", {ctrlKey: true, keyCode: $.ui.keyCode.HOME});
+ date.setFullYear(date.getFullYear() + 1);
+ equal(selectedDate, newMonthYear(date),
+ "Callback change month/year date - ctrl+home" );
+ inp.simulate( "keydown", {ctrlKey: true, keyCode: $.ui.keyCode.PAGE_DOWN});
+ date.setFullYear(date.getFullYear() + 1);
+ equal(selectedDate, newMonthYear(date),
+ "Callback change month/year date - ctrl+pgdn" );
+ inp.calendar( "setDate", new Date(2007, 1 - 1, 26));
+ equal(selectedDate, "2007/1", "Callback change month/year date - setDate" );
+ selectedDate = null;
+ inp.calendar( "setDate", new Date(2007, 1 - 1, 12));
+ ok(selectedDate == null, "Callback change month/year date - setDate no change" );
+ // onChangeMonthYear step by 2
+ inp.calendar( "option", {stepMonths: 2}).
+ calendar( "hide" ).val( "" ).calendar( "show" ).
+ simulate( "keydown", {keyCode: $.ui.keyCode.PAGE_UP});
+ date.setMonth(date.getMonth() - 14);
+ equal(selectedDate, newMonthYear(date),
+ "Callback change month/year by 2 date - pgup" );
+ inp.simulate( "keydown", {ctrlKey: true, keyCode: $.ui.keyCode.PAGE_UP});
+ date.setMonth(date.getMonth() - 12);
+ equal(selectedDate, newMonthYear(date),
+ "Callback change month/year by 2 date - ctrl+pgup" );
+ inp.simulate( "keydown", {keyCode: $.ui.keyCode.PAGE_DOWN});
+ date.setMonth(date.getMonth() + 2);
+ equal(selectedDate, newMonthYear(date),
+ "Callback change month/year by 2 date - pgdn" );
+ inp.simulate( "keydown", {ctrlKey: true, keyCode: $.ui.keyCode.PAGE_DOWN});
+ date.setMonth(date.getMonth() + 12);
+ equal(selectedDate, newMonthYear(date),
+ "Callback change month/year by 2 date - ctrl+pgdn" );
+ // onClose
+ inp.calendar( "option", {onClose: callback, onChangeMonthYear: null, stepMonths: 1}).
+ val( "" ).calendar( "show" ).
+ simulate( "keydown", {keyCode: $.ui.keyCode.ESCAPE});
+ equal(selectedThis, inp[0], "Callback close this" );
+ equal(selectedInst, $.data(inp[0], TestHelpers.calendar.PROP_NAME), "Callback close inst" );
+ equal(selectedDate, "", "Callback close date - esc" );
+ inp.val( "" ).calendar( "show" ).
+ simulate( "keydown", {keyCode: $.ui.keyCode.ENTER});
+ equal(selectedDate, $.calendar.formatDate( "mm/dd/yy", new Date()),
+ "Callback close date - enter" );
+ inp.val( "02/04/2008" ).calendar( "show" ).
+ simulate( "keydown", {keyCode: $.ui.keyCode.ESCAPE});
+ equal(selectedDate, "02/04/2008", "Callback close date - preset" );
+ inp.val( "02/04/2008" ).calendar( "show" ).
+ simulate( "keydown", {ctrlKey: true, keyCode: $.ui.keyCode.END});
+ equal(selectedDate, "", "Callback close date - ctrl+end" );
+
+ inp2 = TestHelpers.calendar.init( "#inp2" );
+ inp2.calendar().calendar( "option", {onClose: callback}).calendar( "show" );
+ inp.calendar( "show" );
+ equal(selectedThis, inp2[0], "Callback close this" );
+});
+
+})( jQuery );
+ */
diff --git a/tests/unit/calendar/calendar_methods.js b/tests/unit/calendar/calendar_methods.js
new file mode 100644
index 00000000000..ce53be1c119
--- /dev/null
+++ b/tests/unit/calendar/calendar_methods.js
@@ -0,0 +1,78 @@
+(function( $ ) {
+
+module( "calendar: methods" );
+
+test( "destroy", function() {
+ expect( 4 );
+
+ var element = $( "#calendar" ).calendar();
+
+ ok( element.calendar( "instance" ), "instance created" );
+ element.calendar( "destroy" );
+ ok( !element.calendar( "instance" ), "instance removed" );
+ ok( !element.attr( "role" ), "role attribute removed" );
+ ok( !element.attr( "aria-labelledby" ), "aria-labelledby attribute removed" );
+});
+
+test( "enable / disable", function() {
+ expect( 6 );
+
+ var element = $( "#calendar" ).calendar();
+
+ ok( !element.calendar( "option", "disabled" ), "initially enabled" );
+ ok( !element.hasClass( "ui-calendar-disabled" ), "does not have disabled class name" );
+
+ element.calendar( "disable" );
+ ok( element.calendar( "option", "disabled" ), "disabled option is set" );
+ ok( element.hasClass( "ui-calendar-disabled" ), "calendar has disabled class name" );
+
+ element.calendar( "enable" );
+ ok( !element.calendar( "option", "disabled" ), "enabled after enable() call" );
+ ok( !element.hasClass( "ui-calendar-disabled" ), "no longer has disabled class name" );
+});
+
+test( "widget", function() {
+ expect( 1 );
+
+ var element = $( "#calendar" ).calendar(),
+ widget = element.calendar( "widget" );
+
+ deepEqual( widget[ 0 ], element[ 0 ] );
+});
+
+test( "value", function() {
+ expect( 3 );
+ var element = $( "#calendar" ).calendar();
+
+ element.calendar( "value", "1/1/14" );
+ ok( element.find( "a[data-timestamp]:first" ).hasClass( "ui-state-active" ), "first day marked as selected" );
+ equal( element.calendar( "value" ), "1/1/14", "getter" );
+
+ element.calendar( "value", "abc" );
+ equal( element.calendar( "value" ), "1/1/14", "Setting invalid values should be ignored." );
+});
+
+test( "valueAsDate", function() {
+ expect( 5 );
+
+ var element = $( "#calendar" ).calendar(),
+ date1 = new Date( 2008, 6 - 1, 4 ),
+ date2 = new Date();
+
+ element.calendar( "valueAsDate", new Date( 2014, 0, 1 ) );
+ ok( element.find( "a[data-timestamp]:first" ).hasClass( "ui-state-active" ), "First day marked as selected" );
+ TestHelpers.calendar.equalsDate( element.calendar( "valueAsDate" ), new Date( 2014, 0, 1 ), "Getter" );
+
+ element.calendar( "destroy" );
+
+ element.calendar();
+ TestHelpers.calendar.equalsDate( element.calendar( "valueAsDate" ), new Date(), "Set date - default" );
+
+ element.calendar( "valueAsDate", date1 );
+ TestHelpers.calendar.equalsDate(element.calendar( "valueAsDate" ), date1, "Set date - 2008-06-04" );
+
+ element.calendar( "valueAsDate", date1, date2 );
+ TestHelpers.calendar.equalsDate(element.calendar( "valueAsDate" ), date1, "Set date - two dates" );
+});
+
+})( jQuery );
diff --git a/tests/unit/calendar/calendar_options.js b/tests/unit/calendar/calendar_options.js
new file mode 100644
index 00000000000..ea8483bbcd1
--- /dev/null
+++ b/tests/unit/calendar/calendar_options.js
@@ -0,0 +1,351 @@
+(function( $ ) {
+
+module( "calendar: options" );
+
+test( "dateFormat", function() {
+ expect( 2 );
+ var element = $( "#calendar" ).calendar({
+ value: "1/1/14"
+ }),
+ firstDayLink = element.calendar( "widget" ).find( "td[id]:first a" );
+
+ firstDayLink.trigger( "mousedown" );
+ equal( element.calendar( "value" ), "1/1/14", "default formatting" );
+
+ element.calendar( "option", "dateFormat", { date: "full" } );
+ equal( element.calendar( "value" ), "Wednesday, January 1, 2014", "updated formatting" );
+
+ element.calendar( "destroy" );
+});
+
+test( "eachDay", function() {
+ expect( 5 );
+ var timestamp,
+ input = $( "#calendar" ).calendar(),
+ picker = input.calendar( "widget" ),
+ firstCell = picker.find( "td[id]:first" );
+
+ equal( firstCell.find( "a" ).length, 1, "days are selectable by default" );
+ timestamp = parseInt( firstCell.find( "a" ).attr( "data-timestamp" ), 10 );
+ equal( new Date( timestamp ).getDate(), 1, "first available day is the 1st by default" );
+
+ // Do not render the 1st of the month
+ input.calendar( "option", "eachDay", function( day ) {
+ if ( day.date === 1 ) {
+ day.render = false;
+ }
+ });
+ firstCell = picker.find( "td[id]:first" );
+ timestamp = parseInt( firstCell.find( "a" ).attr( "data-timestamp" ), 10 );
+ equal( new Date( timestamp ).getDate(), 2, "first available day is the 2nd" );
+
+ // Display the 1st of the month but make it not selectable.
+ input.calendar( "option", "eachDay", function( day ) {
+ if ( day.date === 1 ) {
+ day.selectable = false;
+ }
+ });
+ firstCell = picker.find( "td[id]:first" );
+ equal( firstCell.find( "a" ).length, 0, "the 1st is not selectable" );
+
+ input.calendar( "option", "eachDay", function( day ) {
+ if ( day.date === 1 ) {
+ day.extraClasses = "ui-custom";
+ }
+ });
+ ok( picker.find( "td[id]:first a" ).hasClass( "ui-custom" ), "extraClasses applied" );
+
+ input.calendar( "destroy" );
+});
+
+test( "numberOfMonths", function() {
+ // TODO implement this
+ expect( 0 );
+});
+
+test( "showWeek", function() {
+ expect( 7 );
+ var input = $( "#calendar" ).calendar(),
+ container = input.calendar( "widget" );
+
+ equal( container.find( "thead th" ).length, 7, "just 7 days, no column cell" );
+ equal( container.find( ".ui-calendar-week-col" ).length, 0,
+ "no week column cells present" );
+ input.calendar( "destroy" );
+
+ input = $( "#calendar" ).calendar({ showWeek: true });
+ container = input.calendar( "widget" );
+ equal( container.find( "thead th" ).length, 8, "7 days + a column cell" );
+ ok( container.find( "thead th:first" ).is( ".ui-calendar-week-col" ),
+ "first cell should have ui-datepicker-week-col class name" );
+ equal( container.find( ".ui-calendar-week-col" ).length,
+ container.find( "tr" ).length, "one week cell for each week" );
+ input.calendar( "destroy" );
+
+ input = $( "#calendar" ).calendar();
+ container = input.calendar( "widget" );
+ equal( container.find( "thead th" ).length, 7, "no week column" );
+ input.calendar( "option", "showWeek", true );
+ equal( container.find( "thead th" ).length, 8, "supports changing option after init" );
+});
+
+/*
+// TODO: Rewrite for value option
+test( "defaultDate", function() {
+ expect( 16 );
+ var inp = TestHelpers.calendar.init( "#inp" ),
+ date = new Date();
+ inp.val( "" ).calendar( "show" ).
+ simulate( "keydown", {keyCode: $.ui.keyCode.ENTER});
+ TestHelpers.calendar.equalsDate(inp.calendar( "getDate" ), date, "Default date null" );
+
+ // Numeric values
+ inp.calendar( "option", {defaultDate: -2}).
+ datepicker( "hide" ).val( "" ).calendar( "show" ).
+ simulate( "keydown", {keyCode: $.ui.keyCode.ENTER});
+ date.setDate(date.getDate() - 2);
+ TestHelpers.calendar.equalsDate(inp.calendar( "getDate" ), date, "Default date -2" );
+
+ date = new Date();
+ inp.calendar( "option", {defaultDate: 3}).
+ datepicker( "hide" ).val( "" ).calendar( "show" ).
+ simulate( "keydown", {keyCode: $.ui.keyCode.ENTER});
+ date.setDate(date.getDate() + 3);
+ TestHelpers.calendar.equalsDate(inp.calendar( "getDate" ), date, "Default date 3" );
+
+ date = new Date();
+ inp.calendar( "option", {defaultDate: 1 / "a"}).
+ datepicker( "hide" ).val( "" ).calendar( "show" ).
+ simulate( "keydown", {keyCode: $.ui.keyCode.ENTER});
+ TestHelpers.calendar.equalsDate(inp.calendar( "getDate" ), date, "Default date NaN" );
+
+ // String offset values
+ inp.calendar( "option", {defaultDate: "-1d"}).
+ datepicker( "hide" ).val( "" ).calendar( "show" ).
+ simulate( "keydown", {keyCode: $.ui.keyCode.ENTER});
+ date.setDate(date.getDate() - 1);
+ TestHelpers.calendar.equalsDate(inp.calendar( "getDate" ), date, "Default date -1d" );
+ inp.calendar( "option", {defaultDate: "+3D"}).
+ datepicker( "hide" ).val( "" ).calendar( "show" ).
+ simulate( "keydown", {keyCode: $.ui.keyCode.ENTER});
+ date.setDate(date.getDate() + 4);
+ TestHelpers.calendar.equalsDate(inp.calendar( "getDate" ), date, "Default date +3D" );
+ inp.calendar( "option", {defaultDate: " -2 w "}).
+ datepicker( "hide" ).val( "" ).calendar( "show" ).
+ simulate( "keydown", {keyCode: $.ui.keyCode.ENTER});
+ date = new Date();
+ date.setDate(date.getDate() - 14);
+ TestHelpers.calendar.equalsDate(inp.calendar( "getDate" ), date, "Default date -2 w" );
+ inp.calendar( "option", {defaultDate: "+1 W"}).
+ datepicker( "hide" ).val( "" ).calendar( "show" ).
+ simulate( "keydown", {keyCode: $.ui.keyCode.ENTER});
+ date.setDate(date.getDate() + 21);
+ TestHelpers.calendar.equalsDate(inp.calendar( "getDate" ), date, "Default date +1 W" );
+ inp.calendar( "option", {defaultDate: " -1 m "}).
+ datepicker( "hide" ).val( "" ).calendar( "show" ).
+ simulate( "keydown", {keyCode: $.ui.keyCode.ENTER});
+ date = TestHelpers.calendar.addMonths(new Date(), -1);
+ TestHelpers.calendar.equalsDate(inp.calendar( "getDate" ), date, "Default date -1 m" );
+ inp.calendar( "option", {defaultDate: "+2M"}).
+ datepicker( "hide" ).val( "" ).calendar( "show" ).
+ simulate( "keydown", {keyCode: $.ui.keyCode.ENTER});
+ date = TestHelpers.calendar.addMonths(new Date(), 2);
+ TestHelpers.calendar.equalsDate(inp.calendar( "getDate" ), date, "Default date +2M" );
+ inp.calendar( "option", {defaultDate: "-2y"}).
+ datepicker( "hide" ).val( "" ).calendar( "show" ).
+ simulate( "keydown", {keyCode: $.ui.keyCode.ENTER});
+ date = new Date();
+ date.setFullYear(date.getFullYear() - 2);
+ TestHelpers.calendar.equalsDate(inp.calendar( "getDate" ), date, "Default date -2y" );
+ inp.calendar( "option", {defaultDate: "+1 Y "}).
+ datepicker( "hide" ).val( "" ).calendar( "show" ).
+ simulate( "keydown", {keyCode: $.ui.keyCode.ENTER});
+ date.setFullYear(date.getFullYear() + 3);
+ TestHelpers.calendar.equalsDate(inp.calendar( "getDate" ), date, "Default date +1 Y" );
+ inp.calendar( "option", {defaultDate: "+1M +10d"}).
+ datepicker( "hide" ).val( "" ).calendar( "show" ).
+ simulate( "keydown", {keyCode: $.ui.keyCode.ENTER});
+ date = TestHelpers.calendar.addMonths(new Date(), 1);
+ date.setDate(date.getDate() + 10);
+ TestHelpers.calendar.equalsDate(inp.calendar( "getDate" ), date, "Default date +1M +10d" );
+ // String date values
+ inp.calendar( "option", {defaultDate: "07/04/2007"}).
+ datepicker( "hide" ).val( "" ).calendar( "show" ).
+ simulate( "keydown", {keyCode: $.ui.keyCode.ENTER});
+ date = new Date(2007, 7 - 1, 4);
+ TestHelpers.calendar.equalsDate(inp.calendar( "getDate" ), date, "Default date 07/04/2007" );
+ inp.calendar( "option", {dateFormat: "yy-mm-dd", defaultDate: "2007-04-02"}).
+ datepicker( "hide" ).val( "" ).calendar( "show" ).
+ simulate( "keydown", {keyCode: $.ui.keyCode.ENTER});
+ date = new Date(2007, 4 - 1, 2);
+ TestHelpers.calendar.equalsDate(inp.calendar( "getDate" ), date, "Default date 2007-04-02" );
+ // Date value
+ date = new Date(2007, 1 - 1, 26);
+ inp.calendar( "option", {dateFormat: "mm/dd/yy", defaultDate: date}).
+ datepicker( "hide" ).val( "" ).calendar( "show" ).
+ simulate( "keydown", {keyCode: $.ui.keyCode.ENTER});
+ TestHelpers.calendar.equalsDate(inp.calendar( "getDate" ), date, "Default date 01/26/2007" );
+ });
+ */
+
+test( "min / max", function() {
+ expect( 0 );
+
+ /*
+ // TODO CTRL + PgUp / PgDn is not implemented yet, see wiki
+ var date,
+ inp = TestHelpers.calendar.init( "#calendar" ),
+ dp = inp.calendar( "widget" ),
+ lastYear = new Date( 2007, 6 - 1, 4 ),
+ nextYear = new Date( 2009, 6 - 1, 4 ),
+ minDate = new Date( 2008, 2 - 1, 29 ),
+ maxDate = new Date( 2008, 12 - 1, 7 );
+
+ inp.val( "06/04/2008" ).calendar( "refresh" ).calendar( "open" );
+ inp.simulate( "keydown", { ctrlKey: true, keyCode: $.ui.keyCode.PAGE_UP } ).
+ simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
+ TestHelpers.calendar.equalsDate( inp.calendar( "valueAsDate" ), lastYear, "Min/max - null, null - ctrl+pgup" );
+
+ inp.val( "06/04/2008" ).calendar( "refresh" ).calendar( "open" );
+ inp.simulate( "keydown", { ctrlKey: true, keyCode: $.ui.keyCode.PAGE_DOWN } ).
+ simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
+ TestHelpers.calendar.equalsDate( inp.calendar( "valueAsDate" ), nextYear, "Min/max - null, null - ctrl+pgdn" );
+
+ inp.calendar( "option", { min: minDate } ).
+ datepicker( "close" ).val( "06/04/2008" ).calendar( "refresh" ).calendar( "open" );
+ inp.simulate( "keydown", { ctrlKey: true, keyCode: $.ui.keyCode.PAGE_UP } ).
+ simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
+ TestHelpers.calendar.equalsDate( inp.calendar( "valueAsDate" ), minDate, "Min/max - 02/29/2008, null - ctrl+pgup" );
+
+ inp.val( "06/04/2008" ).calendar( "refresh" ).calendar( "open" );
+ inp.simulate( "keydown", {ctrlKey: true, keyCode: $.ui.keyCode.PAGE_DOWN}).
+ simulate( "keydown", {keyCode: $.ui.keyCode.ENTER});
+ TestHelpers.calendar.equalsDate(inp.calendar( "getDate" ), nextYear, "Min/max - 02/29/2008, null - ctrl+pgdn" );
+
+ inp.calendar( "option", { max: maxDate } ).
+ datepicker( "hide" ).val( "06/04/2008" ).calendar( "open" );
+ inp.simulate( "keydown", { ctrlKey: true, keyCode: $.ui.keyCode.PAGE_UP } ).
+ simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } );
+ TestHelpers.calendar.equalsDate(inp.calendar( "getDate" ), minDate, "Min/max - 02/29/2008, 12/07/2008 - ctrl+pgup" );
+
+ inp.val( "06/04/2008" ).calendar( "open" );
+ inp.simulate( "keydown", {ctrlKey: true, keyCode: $.ui.keyCode.PAGE_DOWN}).
+ simulate( "keydown", {keyCode: $.ui.keyCode.ENTER});
+ TestHelpers.calendar.equalsDate(inp.calendar( "valueAsDate" ), maxDate, "Min/max - 02/29/2008, 12/07/2008 - ctrl+pgdn" );
+
+ inp.calendar( "option", {minDate: null}).
+ datepicker( "hide" ).val( "06/04/2008" ).calendar( "open" );
+ inp.simulate( "keydown", {ctrlKey: true, keyCode: $.ui.keyCode.PAGE_UP}).
+ simulate( "keydown", {keyCode: $.ui.keyCode.ENTER});
+ TestHelpers.calendar.equalsDate(inp.calendar( "valueAsDate" ), lastYear, "Min/max - null, 12/07/2008 - ctrl+pgup" );
+
+ inp.val( "06/04/2008" ).calendar( "open" );
+ inp.simulate( "keydown", {ctrlKey: true, keyCode: $.ui.keyCode.PAGE_DOWN}).
+ simulate( "keydown", {keyCode: $.ui.keyCode.ENTER});
+ TestHelpers.calendar.equalsDate(inp.calendar( "valueAsDate" ), maxDate, "Min/max - null, 12/07/2008 - ctrl+pgdn" );
+
+ // Relative dates
+ date = new Date();
+ date.setDate(date.getDate() - 7);
+ inp.calendar( "option", {minDate: "-1w", maxDate: "+1 M +10 D "}).
+ datepicker( "hide" ).val( "" ).calendar( "open" );
+ inp.simulate( "keydown", {ctrlKey: true, keyCode: $.ui.keyCode.PAGE_UP}).
+ simulate( "keydown", {keyCode: $.ui.keyCode.ENTER});
+ TestHelpers.calendar.equalsDate(inp.calendar( "valueAsDate" ), date, "Min/max - -1w, +1 M +10 D - ctrl+pgup" );
+
+ date = TestHelpers.calendar.addMonths(new Date(), 1);
+ date.setDate(date.getDate() + 10);
+ inp.val( "" ).calendar( "show" );
+ inp.simulate( "keydown", {ctrlKey: true, keyCode: $.ui.keyCode.PAGE_DOWN}).
+ simulate( "keydown", {keyCode: $.ui.keyCode.ENTER});
+ TestHelpers.calendar.equalsDate(inp.calendar( "valueAsDate" ), date, "Min/max - -1w, +1 M +10 D - ctrl+pgdn" );
+ */
+});
+
+/*
+// TODO: Move this to $.date, Globalize or calendar widget
+test( "daylightSaving", function() {
+ expect( 25 );
+ var inp = TestHelpers.calendar.init( "#inp" ),
+ dp = $( "#ui-datepicker-div" );
+ ok(true, "Daylight saving - " + new Date());
+ // Australia, Sydney - AM change, southern hemisphere
+ inp.val( "04/01/2008" ).calendar( "show" );
+ $( ".ui-calendar-calendar td:eq(6) a", dp).simulate( "click" );
+ equal(inp.val(), "04/05/2008", "Daylight saving - Australia 04/05/2008" );
+ inp.val( "04/01/2008" ).calendar( "show" );
+ $( ".ui-calendar-calendar td:eq(7) a", dp).simulate( "click" );
+ equal(inp.val(), "04/06/2008", "Daylight saving - Australia 04/06/2008" );
+ inp.val( "04/01/2008" ).calendar( "show" );
+ $( ".ui-calendar-calendar td:eq(8) a", dp).simulate( "click" );
+ equal(inp.val(), "04/07/2008", "Daylight saving - Australia 04/07/2008" );
+ inp.val( "10/01/2008" ).calendar( "show" );
+ $( ".ui-calendar-calendar td:eq(6) a", dp).simulate( "click" );
+ equal(inp.val(), "10/04/2008", "Daylight saving - Australia 10/04/2008" );
+ inp.val( "10/01/2008" ).calendar( "show" );
+ $( ".ui-calendar-calendar td:eq(7) a", dp).simulate( "click" );
+ equal(inp.val(), "10/05/2008", "Daylight saving - Australia 10/05/2008" );
+ inp.val( "10/01/2008" ).calendar( "show" );
+ $( ".ui-calendar-calendar td:eq(8) a", dp).simulate( "click" );
+ equal(inp.val(), "10/06/2008", "Daylight saving - Australia 10/06/2008" );
+ // Brasil, Brasilia - midnight change, southern hemisphere
+ inp.val( "02/01/2008" ).calendar( "show" );
+ $( ".ui-calendar-calendar td:eq(20) a", dp).simulate( "click" );
+ equal(inp.val(), "02/16/2008", "Daylight saving - Brasil 02/16/2008" );
+ inp.val( "02/01/2008" ).calendar( "show" );
+ $( ".ui-calendar-calendar td:eq(21) a", dp).simulate( "click" );
+ equal(inp.val(), "02/17/2008", "Daylight saving - Brasil 02/17/2008" );
+ inp.val( "02/01/2008" ).calendar( "show" );
+ $( ".ui-calendar-calendar td:eq(22) a", dp).simulate( "click" );
+ equal(inp.val(), "02/18/2008", "Daylight saving - Brasil 02/18/2008" );
+ inp.val( "10/01/2008" ).calendar( "show" );
+ $( ".ui-calendar-calendar td:eq(13) a", dp).simulate( "click" );
+ equal(inp.val(), "10/11/2008", "Daylight saving - Brasil 10/11/2008" );
+ inp.val( "10/01/2008" ).calendar( "show" );
+ $( ".ui-calendar-calendar td:eq(14) a", dp).simulate( "click" );
+ equal(inp.val(), "10/12/2008", "Daylight saving - Brasil 10/12/2008" );
+ inp.val( "10/01/2008" ).calendar( "show" );
+ $( ".ui-calendar-calendar td:eq(15) a", dp).simulate( "click" );
+ equal(inp.val(), "10/13/2008", "Daylight saving - Brasil 10/13/2008" );
+ // Lebanon, Beirut - midnight change, northern hemisphere
+ inp.val( "03/01/2008" ).calendar( "show" );
+ $( ".ui-calendar-calendar td:eq(34) a", dp).simulate( "click" );
+ equal(inp.val(), "03/29/2008", "Daylight saving - Lebanon 03/29/2008" );
+ inp.val( "03/01/2008" ).calendar( "show" );
+ $( ".ui-calendar-calendar td:eq(35) a", dp).simulate( "click" );
+ equal(inp.val(), "03/30/2008", "Daylight saving - Lebanon 03/30/2008" );
+ inp.val( "03/01/2008" ).calendar( "show" );
+ $( ".ui-calendar-calendar td:eq(36) a", dp).simulate( "click" );
+ equal(inp.val(), "03/31/2008", "Daylight saving - Lebanon 03/31/2008" );
+ inp.val( "10/01/2008" ).calendar( "show" );
+ $( ".ui-calendar-calendar td:eq(27) a", dp).simulate( "click" );
+ equal(inp.val(), "10/25/2008", "Daylight saving - Lebanon 10/25/2008" );
+ inp.val( "10/01/2008" ).calendar( "show" );
+ $( ".ui-calendar-calendar td:eq(28) a", dp).simulate( "click" );
+ equal(inp.val(), "10/26/2008", "Daylight saving - Lebanon 10/26/2008" );
+ inp.val( "10/01/2008" ).calendar( "show" );
+ $( ".ui-calendar-calendar td:eq(29) a", dp).simulate( "click" );
+ equal(inp.val(), "10/27/2008", "Daylight saving - Lebanon 10/27/2008" );
+ // US, Eastern - AM change, northern hemisphere
+ inp.val( "03/01/2008" ).calendar( "show" );
+ $( ".ui-calendar-calendar td:eq(13) a", dp).simulate( "click" );
+ equal(inp.val(), "03/08/2008", "Daylight saving - US 03/08/2008" );
+ inp.val( "03/01/2008" ).calendar( "show" );
+ $( ".ui-calendar-calendar td:eq(14) a", dp).simulate( "click" );
+ equal(inp.val(), "03/09/2008", "Daylight saving - US 03/09/2008" );
+ inp.val( "03/01/2008" ).calendar( "show" );
+ $( ".ui-calendar-calendar td:eq(15) a", dp).simulate( "click" );
+ equal(inp.val(), "03/10/2008", "Daylight saving - US 03/10/2008" );
+ inp.val( "11/01/2008" ).calendar( "show" );
+ $( ".ui-calendar-calendar td:eq(6) a", dp).simulate( "click" );
+ equal(inp.val(), "11/01/2008", "Daylight saving - US 11/01/2008" );
+ inp.val( "11/01/2008" ).calendar( "show" );
+ $( ".ui-calendar-calendar td:eq(7) a", dp).simulate( "click" );
+ equal(inp.val(), "11/02/2008", "Daylight saving - US 11/02/2008" );
+ inp.val( "11/01/2008" ).calendar( "show" );
+ $( ".ui-calendar-calendar td:eq(8) a", dp).simulate( "click" );
+ equal(inp.val(), "11/03/2008", "Daylight saving - US 11/03/2008" );
+ });
+ */
+
+})(jQuery);
diff --git a/tests/unit/calendar/calendar_test_helpers.js b/tests/unit/calendar/calendar_test_helpers.js
new file mode 100644
index 00000000000..7fb80bb58e9
--- /dev/null
+++ b/tests/unit/calendar/calendar_test_helpers.js
@@ -0,0 +1,22 @@
+TestHelpers.calendar = {
+ addMonths: function( date, offset ) {
+ var maxDay = 32 - new Date( date.getFullYear(), date.getMonth() + offset, 32 ).getDate();
+ date.setDate( Math.min( date.getDate(), maxDay ) );
+ date.setMonth( date.getMonth() + offset );
+ return date;
+ },
+ equalsDate: function( d1, d2, message ) {
+ if ( !d1 || !d2 ) {
+ ok( false, message + " - missing date" );
+ return;
+ }
+ d1 = new Date( d1.getFullYear(), d1.getMonth(), d1.getDate() );
+ d2 = new Date( d2.getFullYear(), d2.getMonth(), d2.getDate() );
+ equal( d1.toString(), d2.toString(), message );
+ },
+ focusGrid: function( element ) {
+ element.find( "table:tabbable" ).simulate( "focus" );
+
+ return $( ":focus" );
+ }
+};
\ No newline at end of file
diff --git a/tests/unit/datepicker/datepicker.html b/tests/unit/datepicker/datepicker.html
index f55dd97900c..c43eee8d959 100644
--- a/tests/unit/datepicker/datepicker.html
+++ b/tests/unit/datepicker/datepicker.html
@@ -14,11 +14,12 @@
@@ -25,7 +32,7 @@
-
Restrict the range of selectable dates with the minDate
and maxDate
options. Set the beginning and end dates as actual dates (new Date(2009, 1 - 1, 26)), as a numeric offset from today (-20), or as a string of periods and units ('+1M +10D'). For the last, use 'D' for days, 'W' for weeks, 'M' for months, or 'Y' for years.
+
Restrict the range of selectable dates with the min
and max
options. Set the beginning and end dates as actual dates (new Date(2009, 1 - 1, 26)).