From cd3832011d74f117347df350bea8b373ce6f2e2b Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Wed, 27 Jul 2011 16:01:39 -0500 Subject: [PATCH 001/107] Mask: Adding some widget/unit test boilerplates --- tests/unit/mask/mask.html | 46 ++++++++++++++++++++++++++++++++ tests/unit/mask/mask_core.js | 5 ++++ tests/unit/mask/mask_defaults.js | 10 +++++++ tests/unit/mask/mask_events.js | 5 ++++ tests/unit/mask/mask_methods.js | 5 ++++ tests/unit/mask/mask_options.js | 5 ++++ ui/jquery.ui.mask.js | 25 +++++++++++++++++ 7 files changed, 101 insertions(+) create mode 100644 tests/unit/mask/mask.html create mode 100644 tests/unit/mask/mask_core.js create mode 100644 tests/unit/mask/mask_defaults.js create mode 100644 tests/unit/mask/mask_events.js create mode 100644 tests/unit/mask/mask_methods.js create mode 100644 tests/unit/mask/mask_options.js create mode 100644 ui/jquery.ui.mask.js diff --git a/tests/unit/mask/mask.html b/tests/unit/mask/mask.html new file mode 100644 index 00000000000..36bfdb5a30a --- /dev/null +++ b/tests/unit/mask/mask.html @@ -0,0 +1,46 @@ + + + + + jQuery UI Mask Test Suite + + + + + + + + + + + + + + + + + + + + + + + + + +

jQuery UI Mask Test Suite

+

+
+

+
    +
+ + +
+ +
+ + + diff --git a/tests/unit/mask/mask_core.js b/tests/unit/mask/mask_core.js new file mode 100644 index 00000000000..7c4ffb7c238 --- /dev/null +++ b/tests/unit/mask/mask_core.js @@ -0,0 +1,5 @@ +(function( $ ) { + +module( "mask: core" ); + +})( jQuery ); \ No newline at end of file diff --git a/tests/unit/mask/mask_defaults.js b/tests/unit/mask/mask_defaults.js new file mode 100644 index 00000000000..5963342c1b6 --- /dev/null +++ b/tests/unit/mask/mask_defaults.js @@ -0,0 +1,10 @@ +commonWidgetTests( "mask", { + defaults: { + disabled: false, + mask: null, + placeholder: "_", + + // callbacks + create: null + } +}); diff --git a/tests/unit/mask/mask_events.js b/tests/unit/mask/mask_events.js new file mode 100644 index 00000000000..1e625c95677 --- /dev/null +++ b/tests/unit/mask/mask_events.js @@ -0,0 +1,5 @@ +(function( $ ) { + +module( "mask: events" ); + +})( jQuery ); \ No newline at end of file diff --git a/tests/unit/mask/mask_methods.js b/tests/unit/mask/mask_methods.js new file mode 100644 index 00000000000..7fdedc75d3f --- /dev/null +++ b/tests/unit/mask/mask_methods.js @@ -0,0 +1,5 @@ +(function( $ ) { + +module( "mask: methods" ); + +})( jQuery ); \ No newline at end of file diff --git a/tests/unit/mask/mask_options.js b/tests/unit/mask/mask_options.js new file mode 100644 index 00000000000..34927583ba3 --- /dev/null +++ b/tests/unit/mask/mask_options.js @@ -0,0 +1,5 @@ +(function( $ ) { + +module( "mask: options" ); + +})( jQuery ); \ No newline at end of file diff --git a/ui/jquery.ui.mask.js b/ui/jquery.ui.mask.js new file mode 100644 index 00000000000..a7ccbdf414e --- /dev/null +++ b/ui/jquery.ui.mask.js @@ -0,0 +1,25 @@ +/*! + * jQuery UI Mask @VERSION + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Mask + */ +(function( $, undefined ) { + +$.widget( "ui.mask", { + version: "@VERSION", + defaultElement: "", + options: { + mask: null, + placeholder: "_" + }, + _create: function() { + + } +}); + + +})( jQuery ); \ No newline at end of file From 936193f49899300913f63dd1d5d8ad6f6fff93ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Scott=20Gonz=C3=A1lez?= Date: Wed, 27 Jul 2011 17:11:28 -0400 Subject: [PATCH 002/107] Mask tests: cleanup. --- tests/unit/mask/mask.html | 44 ++++++++++++++------------------- tests/unit/mask/mask_core.js | 2 +- tests/unit/mask/mask_events.js | 2 +- tests/unit/mask/mask_methods.js | 2 +- tests/unit/mask/mask_options.js | 2 +- 5 files changed, 22 insertions(+), 30 deletions(-) diff --git a/tests/unit/mask/mask.html b/tests/unit/mask/mask.html index 36bfdb5a30a..24cc12b6a67 100644 --- a/tests/unit/mask/mask.html +++ b/tests/unit/mask/mask.html @@ -1,32 +1,28 @@ - + - + jQuery UI Mask Test Suite - + - - - - + + + + - - - - + + + + - - - - - + + + + + - - - + @@ -34,13 +30,9 @@

jQuery UI Mask Test Suite

-
    -
- - +
    - diff --git a/tests/unit/mask/mask_core.js b/tests/unit/mask/mask_core.js index 7c4ffb7c238..ac0896c579e 100644 --- a/tests/unit/mask/mask_core.js +++ b/tests/unit/mask/mask_core.js @@ -2,4 +2,4 @@ module( "mask: core" ); -})( jQuery ); \ No newline at end of file +}( jQuery ) ); diff --git a/tests/unit/mask/mask_events.js b/tests/unit/mask/mask_events.js index 1e625c95677..78efc381b40 100644 --- a/tests/unit/mask/mask_events.js +++ b/tests/unit/mask/mask_events.js @@ -2,4 +2,4 @@ module( "mask: events" ); -})( jQuery ); \ No newline at end of file +}( jQuery ) ); diff --git a/tests/unit/mask/mask_methods.js b/tests/unit/mask/mask_methods.js index 7fdedc75d3f..5d52b45900b 100644 --- a/tests/unit/mask/mask_methods.js +++ b/tests/unit/mask/mask_methods.js @@ -2,4 +2,4 @@ module( "mask: methods" ); -})( jQuery ); \ No newline at end of file +}( jQuery ) ); diff --git a/tests/unit/mask/mask_options.js b/tests/unit/mask/mask_options.js index 34927583ba3..5f3f04378b4 100644 --- a/tests/unit/mask/mask_options.js +++ b/tests/unit/mask/mask_options.js @@ -2,4 +2,4 @@ module( "mask: options" ); -})( jQuery ); \ No newline at end of file +}( jQuery ) ); From 5b7fa9737fb5abddca2beb27908d4e70cc3ccb24 Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Wed, 27 Jul 2011 17:00:58 -0500 Subject: [PATCH 003/107] Unit Tests: Adding mask to all.html --- tests/unit/all.html | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/unit/all.html b/tests/unit/all.html index a36c9e00478..1bd40a05939 100644 --- a/tests/unit/all.html +++ b/tests/unit/all.html @@ -22,6 +22,7 @@ //"draggable/draggable.html", //"droppable/droppable.html", "effects/effects.html", + "mask/mask.html", "menu/menu.html", "position/position.html", "progressbar/progressbar.html", From 9dacfd1c7268c94c014173337ed51889cf25f43a Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Wed, 27 Jul 2011 17:01:47 -0500 Subject: [PATCH 004/107] Mask: Initial draft of _caret, implementation borrowed from @digitalBush maskedInput plugin --- tests/unit/mask/mask.html | 2 +- tests/unit/mask/mask_core.js | 26 +++++++++++++++++++++++ ui/jquery.ui.mask.js | 41 ++++++++++++++++++++++++++++++++++-- 3 files changed, 66 insertions(+), 3 deletions(-) diff --git a/tests/unit/mask/mask.html b/tests/unit/mask/mask.html index 24cc12b6a67..f4c0d617249 100644 --- a/tests/unit/mask/mask.html +++ b/tests/unit/mask/mask.html @@ -32,7 +32,7 @@

      - +
      diff --git a/tests/unit/mask/mask_core.js b/tests/unit/mask/mask_core.js index ac0896c579e..c86e22eb3fe 100644 --- a/tests/unit/mask/mask_core.js +++ b/tests/unit/mask/mask_core.js @@ -2,4 +2,30 @@ module( "mask: core" ); +test( "_caret() can move and read the text cursor", function() { + expect( 3 ); + + var input = $( "#mask1" ).val("This string is 33 characters long").mask(), + instance = input.data( "mask" ); + input.focus(); + + instance._caret( 0 ); + deepEqual( instance._caret(), { + begin: 0, + end: 0 + }, "Caret position set to 0 results in 0, 0" ); + + instance._caret( 34 ); + deepEqual( instance._caret(), { + begin: 33, + end: 33 + }, "Caret position set beyond bounds (34) results in 33, 33" ); + + instance._caret( 0, 2 ); + deepEqual( instance._caret(), { + begin: 0, + end: 2 + }, "Caret position set to 0, 2 results in 0, 2" ); +}); + }( jQuery ) ); diff --git a/ui/jquery.ui.mask.js b/ui/jquery.ui.mask.js index a7ccbdf414e..6957ed23982 100644 --- a/ui/jquery.ui.mask.js +++ b/ui/jquery.ui.mask.js @@ -18,8 +18,45 @@ $.widget( "ui.mask", { }, _create: function() { + }, + + // helper function to get or set position of text cursor (caret) + _caret: function( begin, end ) { + var range, + elem = this.element, + dom = elem[0]; + + // if begin is defined, we are setting a range + if ( begin !== undefined ) { + end = ( end === undefined ) ? begin : end; + if ( dom.setSelectionRange ) { + dom.setSelectionRange( begin, end ); + } else if ( dom.createTextRange ) { + range = dom.createTextRange(); + range.collapse( true ); + range.moveEnd( "character", end ); + range.moveStart( "character", begin ); + range.select(); + } + } else { + + // begin is undefined, we are reading the range + if ( dom.setSelectionRange ) { + begin = dom.selectionStart; + end = dom.selectionEnd; + } else if ( document.selection && document.selection.createRange ) { + range = document.selection.createRange(); + + // the moveStart returns the number of characters it moved as a negative number + begin = 0 - range.duplicate().moveStart( "character", -100000 ); + end = begin + range.text.length; + } + return { + begin: begin, + end: end + }; + } } }); - -})( jQuery ); \ No newline at end of file +}( jQuery ) ); From deb60238d1e3e34d5cc431aa694b71e14187f55f Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Fri, 29 Jul 2011 13:09:34 -0500 Subject: [PATCH 005/107] Mask: First draft of parsing the mask into a 'buffer' --- tests/unit/mask/mask_core.js | 84 ++++++++++++++++++++++++++++++++ tests/unit/mask/mask_defaults.js | 5 ++ ui/jquery.ui.mask.js | 42 +++++++++++++++- 3 files changed, 130 insertions(+), 1 deletion(-) diff --git a/tests/unit/mask/mask_core.js b/tests/unit/mask/mask_core.js index c86e22eb3fe..18a9d7d8428 100644 --- a/tests/unit/mask/mask_core.js +++ b/tests/unit/mask/mask_core.js @@ -28,4 +28,88 @@ test( "_caret() can move and read the text cursor", function() { }, "Caret position set to 0, 2 results in 0, 2" ); }); +test( "Mask Parsed Properly", function() { + var defs = { + hh: function( value ) { + value = parseInt( value, 10 ); + if ( value >= 1 || value <= 12 ) { + return ( value < 10 ? "0" : "" ) + value; + } + }, + ss: function( value ) { + value = parseInt( value, 10 ); + if ( value >= 0 || value <= 59 ) { + return ( value < 10 ? "0" : "" ) + value; + } + } + }, + input = $( "#mask1" ).mask({ + mask: "hh:ss:ss.999", + definitions: defs + }), + instance = input.data( "mask" ); + deepEqual( instance.buffer, [ + { + valid: defs.hh, + start: 0, + length: 2 + }, + { + valid: defs.hh, + start: 0, + length: 2 + }, + { + literal: ":", + start: 2, + length: 1 + }, + { + valid: defs.ss, + start: 3, + length: 2 + }, + { + valid: defs.ss, + start: 3, + length: 2 + }, + { + literal: ":", + start: 5, + length: 1 + }, + { + valid: defs.ss, + start: 6, + length: 2 + }, + { + valid: defs.ss, + start: 6, + length: 2 + }, + { + literal: ".", + start: 8, + length: 1 + }, + { + valid: instance.options.definitions[ 9 ], + start: 9, + length: 1 + }, + { + valid: instance.options.definitions[ 9 ], + start: 10, + length: 1 + }, + { + valid: instance.options.definitions[ 9 ], + start: 11, + length: 1 + } + ], "Buffer Calculated correctly" ); +}); + }( jQuery ) ); diff --git a/tests/unit/mask/mask_defaults.js b/tests/unit/mask/mask_defaults.js index 5963342c1b6..af6cd3db3e5 100644 --- a/tests/unit/mask/mask_defaults.js +++ b/tests/unit/mask/mask_defaults.js @@ -1,5 +1,10 @@ commonWidgetTests( "mask", { defaults: { + definitions: { + '9': /[0-9]/, + 'a': /[A-Za-z]/, + '*': /[A-Za-z0-9]/ + }, disabled: false, mask: null, placeholder: "_", diff --git a/ui/jquery.ui.mask.js b/ui/jquery.ui.mask.js index 6957ed23982..ba54deb711d 100644 --- a/ui/jquery.ui.mask.js +++ b/ui/jquery.ui.mask.js @@ -13,11 +13,16 @@ $.widget( "ui.mask", { version: "@VERSION", defaultElement: "", options: { + definitions: { + '9': /[0-9]/, + 'a': /[A-Za-z]/, + '*': /[A-Za-z0-9]/ + }, mask: null, placeholder: "_" }, _create: function() { - + this._parseMask(); }, // helper function to get or set position of text cursor (caret) @@ -56,6 +61,41 @@ $.widget( "ui.mask", { end: end }; } + }, + _parseMask: function() { + var key, x, bufferObject, + index = -1, + options = this.options, + mask = options.mask ; + + this.buffer = []; + if ( !mask ) { + return; + } + // search for definied "masks" + for ( key in options.definitions ) { + while ( ( index = mask.indexOf( key, index + 1 ) ) > -1 ) { + bufferObject = { + start: index, + length: key.length, + valid: options.definitions[ key ] + }; + for ( x = index ; x < index + key.length ; x++ ) { + this.buffer[ x ] = bufferObject; + } + } + } + + // anything we didn't find is a literal + for ( index = 0 ; index < mask.length ; index++ ) { + if ( !this.buffer[ index ] ) { + this.buffer[ index ] = { + start: index, + literal: mask.charAt( index ), + length: 1 + }; + } + } } }); From 3dd3425afcdb10206340b26f804f0472733437fd Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Sun, 31 Jul 2011 04:24:57 -0500 Subject: [PATCH 006/107] Mask: First Draft - Structuring key handling methods based on the maskedInput plugin by @digitalBush --- tests/unit/mask/mask_core.js | 25 +++- ui/jquery.ui.mask.js | 224 +++++++++++++++++++++++++++++++++++ 2 files changed, 244 insertions(+), 5 deletions(-) diff --git a/tests/unit/mask/mask_core.js b/tests/unit/mask/mask_core.js index 18a9d7d8428..ff5aee216a3 100644 --- a/tests/unit/mask/mask_core.js +++ b/tests/unit/mask/mask_core.js @@ -5,7 +5,9 @@ module( "mask: core" ); test( "_caret() can move and read the text cursor", function() { expect( 3 ); - var input = $( "#mask1" ).val("This string is 33 characters long").mask(), + var input = $( "#mask1" ).val("1234").mask({ + mask: "9999" + }), instance = input.data( "mask" ); input.focus(); @@ -15,11 +17,11 @@ test( "_caret() can move and read the text cursor", function() { end: 0 }, "Caret position set to 0 results in 0, 0" ); - instance._caret( 34 ); + instance._caret( 5 ); deepEqual( instance._caret(), { - begin: 33, - end: 33 - }, "Caret position set beyond bounds (34) results in 33, 33" ); + begin: 4, + end: 4 + }, "Caret position set beyond bounds (5) results in 4, 4" ); instance._caret( 0, 2 ); deepEqual( instance._caret(), { @@ -112,4 +114,17 @@ test( "Mask Parsed Properly", function() { ], "Buffer Calculated correctly" ); }); +test( "Parsing initial value skips literals", function() { + expect( 2 ); + var input = $( "#mask1" ); + input.val("123456").mask({ + mask: "99/99/99" + }); + + equal( input.val(), "12/34/56", "Literals were inserted into val"); + input.mask( "option", "mask", "99-99-99" ); + equal( input.val(), "12-34-56", "Old literals were ignored, and new ones inserted into val"); + +}); + }( jQuery ) ); diff --git a/ui/jquery.ui.mask.js b/ui/jquery.ui.mask.js index ba54deb711d..b1def73dd97 100644 --- a/ui/jquery.ui.mask.js +++ b/ui/jquery.ui.mask.js @@ -9,6 +9,8 @@ */ (function( $, undefined ) { +var keyCode = $.ui.keyCode; + $.widget( "ui.mask", { version: "@VERSION", defaultElement: "", @@ -23,6 +25,20 @@ $.widget( "ui.mask", { }, _create: function() { this._parseMask(); + this._parseValue(); + this._paint(); + this._keyBinding(); + }, + _setOption: function( key, value ) { + this._super( "_setOption", key, value ); + if ( key === "mask" ) { + this._parseMask(); + this._parseValue(); + this._paint(); + } + if ( key === "placeholder" ) { + this._paint(); + } }, // helper function to get or set position of text cursor (caret) @@ -96,6 +112,214 @@ $.widget( "ui.mask", { }; } } + }, + _keyBinding: function() { + var cancelKeypress, + lastUnsavedValue, + that = this, + elem = that.element; + + this._bind({ + focus: function( event ) { + lastUnsavedValue = elem.val(); + }, + keydown: function( event ) { + var key = event.which, + position = that._caret(); + + if ( key === keyCode.ESCAPE ) { + elem.val( lastUnsavedValue ); + that._caret( 0, that._parseValue() ); + event.preventDefault(); + } + + if ( key === keyCode.BACKSPACE || key === keyCode.DELETE ) { + if ( position.begin == position.end ) { + position.begin = position.end = Math.max( that._seekRight( -1 ), that[ key === keyCode.BACKSPACE ? + "_seekLeft" : + "_seekRight" ]( position.begin )); + } + that._removeValues( position.begin, position.end ); + that._paint(); + that._caret( position.begin ); + event.preventDefault(); + } + }, + keypress: function( event ) { + var key = event.which, + position = that._caret(), + bufferPosition = that._seekRight( position.begin - 1 ), + bufferObject = that.buffer[ bufferPosition ]; + + // ignore keypresses with special keys, or control characters + if ( event.metaKey || event.altKey || event.ctrlKey || key < 32 ) { + return; + } + if ( position.begin != position.end ) { + that._removeValues( position.begin, position.end ); + } + if ( bufferObject ) { + key = String.fromCharCode( key ); + if ( $.isFunction( bufferObject.valid ) && bufferObject.valid( key ) || + bufferObject.valid.test && bufferObject.valid.test( key ) ) { + that._shiftRight( position.begin ); + bufferObject.value = key; + that._paint(); + that._caret( that._seekRight( bufferPosition ) ); + } + } + event.preventDefault(); + } + }); + }, + + // _seekLeft and _seekRight will tell the next non-literal position in the buffer + _seekLeft: function( position ) { + while ( --position >= 0 ) { + if ( this.buffer[ position ] && !this.buffer[ position ].literal ) { + return position; + } + } + return -1; + }, + _seekRight: function( position ) { + var length = this.buffer.length; + while ( ++position < length ) { + if ( this.buffer[ position ] && !this.buffer[ position ].literal ) { + return position; + } + } + + return length; + }, + + // _shiftLeft and _shiftRight will move values in the buffer over to the left/right + _shiftLeft: function( begin, end ) { + var bufferPosition, + bufferObject, + destPosition, + destObject, + caretPosition = this._seekLeft( begin + 1 ), + bufferLength = this.buffer.length; + + for ( destPosition = begin, bufferPosition = this._seekRight( end - 1 ); + destPosition < bufferLength; + destPosition += destObject.length ) { + destObject = this.buffer[ destPosition ]; + bufferObject = this.buffer[ bufferPosition ]; + if ( destObject.valid ) { + if ( bufferPosition < bufferLength ) { + if ( $.isFunction( destObject.valid ) && destObject.valid( bufferObject.value ) || + destObject.valid.test && destObject.valid.test( bufferObject.value ) ) { + destObject.value = bufferObject.value; + delete bufferObject.value; + bufferPosition = this._seekRight( bufferPosition ); + } else { + + // once we find a value that doesn't fit anymore, we stop this shift + break; + } + } + } + } + this._caret( caretPosition < 0 ? this._seekRight( 0 ) : caretPosition ); + }, + _shiftRight: function ( bufferPosition ) { + var bufferObject, + destPosition = this._seekRight( bufferPosition ), + destObject, + bufferLength = this.buffer.length; + + for ( ; bufferPosition < bufferLength ; bufferPosition += bufferObject.length ) { + bufferObject = this.buffer[ bufferPosition ]; + if ( bufferObject.valid ) { + if ( destPosition < bufferLength ) { + destObject = this.buffer[ destPosition ]; + if ( $.isFunction( destObject.valid ) && destObject.valid( bufferObject.value ) || + destObject.valid.test && destObject.valid.test( bufferObject.value ) ) { + destObject.value = bufferObject.value; + destPosition = this._seekRight( destPosition ); + } + delete bufferObject.value; + } + } + } + }, + _removeValues: function( begin, end ) { + var position, + bufferObject; + for ( position = begin; position <= end; position++ ) { + bufferObject = this.buffer[ position ]; + if ( bufferObject && bufferObject.value ) { + delete bufferObject.value; + } + } + this._shiftLeft( begin, end ); + return this; + }, + + // parses the .val() and places it into the buffer + // returns the total length of the displayed values in the buffer + _parseValue: function() { + var bufferPosition, + bufferObject, + character, + valuePosition = 0, + value = this.element.val(), + bufferLength = this.buffer.length, + valueLength = value.length; + + // remove all current values from the buffer + this._removeValues( 0, bufferLength ); + + // seek through the buffer pulling characters from the value + for ( bufferPosition = 0; bufferPosition < bufferLength; bufferPosition += bufferObject.length ) { + bufferObject = this.buffer[ bufferPosition ]; + while ( valuePosition < value.length ) { + if ( bufferObject.valid ) { + character = value.substr( valuePosition++, bufferObject.length ); + if ( $.isFunction( bufferObject.valid ) ) { + character = bufferObject.valid( character ); + if ( character !== undefined ) { + bufferObject.value = character; + break; + } + } else { + if ( bufferObject.valid.test( character ) ) { + bufferObject.value = character; + break; + } + } + } else { + if ( bufferObject.literal === value.charAt( valuePosition ) ) { + valuePosition++; + } + + // when parsing a literal from a raw .val() if it doesn't match, + // assume that the literal is missing from the val() + break; + } + } + } + return bufferLength; + }, + _paint: function() { + var bufferPosition, + bufferObject, + bufferLength = this.buffer.length, + value = ""; + + for ( bufferPosition = 0; bufferPosition < bufferLength; bufferPosition += bufferObject.length ) { + bufferObject = this.buffer[ bufferPosition ]; + if ( bufferObject.literal ) { + value += bufferObject.literal; + } else if ( bufferObject.value ) { + value += bufferObject.value; + } else { + value += this.options.placeholder; + } + } + this.element.val( value ); } }); From e30e09da671b4cb49f3751c51c8192d3dd7e3ad0 Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Sun, 31 Jul 2011 04:48:35 -0500 Subject: [PATCH 007/107] Mask: adding a _validValue helper --- ui/jquery.ui.mask.js | 51 +++++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/ui/jquery.ui.mask.js b/ui/jquery.ui.mask.js index b1def73dd97..bfd4d063613 100644 --- a/ui/jquery.ui.mask.js +++ b/ui/jquery.ui.mask.js @@ -23,12 +23,14 @@ $.widget( "ui.mask", { mask: null, placeholder: "_" }, + _create: function() { this._parseMask(); this._parseValue(); this._paint(); this._keyBinding(); }, + _setOption: function( key, value ) { this._super( "_setOption", key, value ); if ( key === "mask" ) { @@ -160,8 +162,7 @@ $.widget( "ui.mask", { } if ( bufferObject ) { key = String.fromCharCode( key ); - if ( $.isFunction( bufferObject.valid ) && bufferObject.valid( key ) || - bufferObject.valid.test && bufferObject.valid.test( key ) ) { + if ( this._validValue( bufferObject, key ) ) { that._shiftRight( position.begin ); bufferObject.value = key; that._paint(); @@ -209,8 +210,7 @@ $.widget( "ui.mask", { bufferObject = this.buffer[ bufferPosition ]; if ( destObject.valid ) { if ( bufferPosition < bufferLength ) { - if ( $.isFunction( destObject.valid ) && destObject.valid( bufferObject.value ) || - destObject.valid.test && destObject.valid.test( bufferObject.value ) ) { + if ( this._validValue( destObject, bufferObject.value ) ) { destObject.value = bufferObject.value; delete bufferObject.value; bufferPosition = this._seekRight( bufferPosition ); @@ -235,8 +235,7 @@ $.widget( "ui.mask", { if ( bufferObject.valid ) { if ( destPosition < bufferLength ) { destObject = this.buffer[ destPosition ]; - if ( $.isFunction( destObject.valid ) && destObject.valid( bufferObject.value ) || - destObject.valid.test && destObject.valid.test( bufferObject.value ) ) { + if ( this._validValue( destObject, bufferObject.value ) ) { destObject.value = bufferObject.value; destPosition = this._seekRight( destPosition ); } @@ -275,29 +274,24 @@ $.widget( "ui.mask", { // seek through the buffer pulling characters from the value for ( bufferPosition = 0; bufferPosition < bufferLength; bufferPosition += bufferObject.length ) { bufferObject = this.buffer[ bufferPosition ]; + while ( valuePosition < value.length ) { - if ( bufferObject.valid ) { - character = value.substr( valuePosition++, bufferObject.length ); - if ( $.isFunction( bufferObject.valid ) ) { - character = bufferObject.valid( character ); - if ( character !== undefined ) { - bufferObject.value = character; - break; - } - } else { - if ( bufferObject.valid.test( character ) ) { - bufferObject.value = character; - break; - } - } - } else { - if ( bufferObject.literal === value.charAt( valuePosition ) ) { + character = value.substr( valuePosition, bufferObject.length ); + if ( bufferObject.literal ) { + if ( this._validValue( bufferObject, character ) ) { valuePosition++; } // when parsing a literal from a raw .val() if it doesn't match, // assume that the literal is missing from the val() break; + } else { + valuePosition++; + character = this._validValue( bufferObject, character ); + if ( character ) { + bufferObject.value = character; + break; + } } } } @@ -320,6 +314,19 @@ $.widget( "ui.mask", { } } this.element.val( value ); + }, + + // returns the value if valid, otherwise returns false + _validValue: function( bufferObject, value ) { + if ( bufferObject.valid ) { + if ( $.isFunction( bufferObject.valid ) ) { + return bufferObject.valid( value ) || false; + } else { + return bufferObject.valid.test( value ) && value; + } + } else { + return ( bufferObject.literal === value ) && value ; + } } }); From d86229da692c4e98c16356ec5c23398b0276bb1b Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Sun, 31 Jul 2011 05:33:38 -0500 Subject: [PATCH 008/107] Mask: Adding refresh method, Adding unit tests for mask/placeholder option, backspace & delete behavior. --- tests/unit/mask/mask_events.js | 37 +++++++++++++++++++++++++++++++++ tests/unit/mask/mask_options.js | 27 ++++++++++++++++++++++++ ui/jquery.ui.mask.js | 22 ++++++++++++++------ 3 files changed, 80 insertions(+), 6 deletions(-) diff --git a/tests/unit/mask/mask_events.js b/tests/unit/mask/mask_events.js index 78efc381b40..45bbf5044c0 100644 --- a/tests/unit/mask/mask_events.js +++ b/tests/unit/mask/mask_events.js @@ -2,4 +2,41 @@ module( "mask: events" ); +test( "keydown: delete and backspace behaviors", function() { + expect( 11 ); + var input = $( "#mask1" ).val( "1234" ).mask({ mask: "99/99/99" }), + mask = input.data( "mask" ); + + equal( input.val(), "12/34/__", "Initial Value" ); + mask._caret( 0 ); + input.simulate( "keydown", { keyCode: $.ui.keyCode.DELETE }); + equal( input.val(), "23/4_/__", "Deleted first value" ); + mask._caret( 2 ); + input.simulate( "keydown", { keyCode: $.ui.keyCode.DELETE }); + equal( input.val(), "23/__/__", "Deleted value after literal" ); + + input.val( "123456" ).mask( "refresh" ); + equal( input.val(), "12/34/56", "New Initial Value" ); + mask._caret( 2, 4 ); + input.simulate( "keydown", { keyCode: $.ui.keyCode.DELETE }); + equal( input.val(), "12/56/__", "Deleted 34 out of the middle" ); + deepEqual( mask._caret(), { begin: 2, end: 2 }, "Caret position" ); + + input.val( "123456" ).mask( "refresh" ); + equal( input.val(), "12/34/56", "New Initial Value" ); + mask._caret( 2, 4 ); + input.simulate( "keydown", { keyCode: $.ui.keyCode.BACKSPACE }); + equal( input.val(), "12/56/__", "Backspaced 34 out of the middle" ); + deepEqual( mask._caret(), { begin: 2, end: 2 }, "Caret position" ); + + mask._caret( 6 ); + input.simulate( "keydown", { keyCode: $.ui.keyCode.BACKSPACE }); + equal( input.val(), "12/5_/__", "Backspaced last value" ); + + mask._caret( 2 ); + input.simulate( "keydown", { keyCode: $.ui.keyCode.BACKSPACE }); + equal( input.val(), "15/__/__", "Backspaced value from middle" ); + +}); + }( jQuery ) ); diff --git a/tests/unit/mask/mask_options.js b/tests/unit/mask/mask_options.js index 5f3f04378b4..7ab042080c7 100644 --- a/tests/unit/mask/mask_options.js +++ b/tests/unit/mask/mask_options.js @@ -2,4 +2,31 @@ module( "mask: options" ); +test( "placeholder", function() { + expect( 2 ); + var input = $( "#mask1" ).mask({ + mask: "99/99/99", + placeholder: "_" + }); + + equal( input.val(), "__/__/__", "Initial value" ); + input.mask( "option", "placeholder", " " ); + equal( input.val(), " / / ", "Placeholder changed" ); + +}); + +test( "mask", function() { + expect( 2 ); + var input = $( "#mask1" ).val("1234").mask({ + mask: "99/99/99", + placeholder: "_" + }); + + equal( input.val(), "12/34/__", "Initial value" ); + input.mask( "option", "mask", "(999)999-9999" ); + equal( input.val(), "(123)4__-____", "Mask changed" ); + +}); + + }( jQuery ) ); diff --git a/ui/jquery.ui.mask.js b/ui/jquery.ui.mask.js index bfd4d063613..1eb9366df0f 100644 --- a/ui/jquery.ui.mask.js +++ b/ui/jquery.ui.mask.js @@ -31,6 +31,11 @@ $.widget( "ui.mask", { this._keyBinding(); }, + refresh: function() { + this._parseValue(); + this._paint(); + }, + _setOption: function( key, value ) { this._super( "_setOption", key, value ); if ( key === "mask" ) { @@ -126,7 +131,7 @@ $.widget( "ui.mask", { lastUnsavedValue = elem.val(); }, keydown: function( event ) { - var key = event.which, + var key = event.keyCode, position = that._caret(); if ( key === keyCode.ESCAPE ) { @@ -136,15 +141,20 @@ $.widget( "ui.mask", { } if ( key === keyCode.BACKSPACE || key === keyCode.DELETE ) { + event.preventDefault(); if ( position.begin == position.end ) { - position.begin = position.end = Math.max( that._seekRight( -1 ), that[ key === keyCode.BACKSPACE ? - "_seekLeft" : - "_seekRight" ]( position.begin )); + position.begin = position.end = ( key === keyCode.DELETE ? + that._seekRight( position.begin - 1) : + that._seekLeft( position.begin ) + ); + if ( position.begin < 0 ) { + that._caret( that.seekLeft( -1 ) ); + return; + } } that._removeValues( position.begin, position.end ); that._paint(); that._caret( position.begin ); - event.preventDefault(); } }, keypress: function( event ) { @@ -253,7 +263,7 @@ $.widget( "ui.mask", { delete bufferObject.value; } } - this._shiftLeft( begin, end ); + this._shiftLeft( begin, end + 1 ); return this; }, From d40039507efb910349cc70e37b4bfcc98f71fb46 Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Sun, 31 Jul 2011 05:39:41 -0500 Subject: [PATCH 009/107] Mask: Adding a unit test for refresh method --- tests/unit/mask/mask_methods.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/unit/mask/mask_methods.js b/tests/unit/mask/mask_methods.js index 5d52b45900b..0e8f4ec60d9 100644 --- a/tests/unit/mask/mask_methods.js +++ b/tests/unit/mask/mask_methods.js @@ -2,4 +2,15 @@ module( "mask: methods" ); +test( "refresh", function() { + expect( 1 ); + + var input = $( "#mask1" ).mask({ + mask: "99/99/99" + }); + + input.val( "123456" ).mask( "refresh" ); + equal( input.val(), "12/34/56", "Refresh re-parsed the value of the input" ); +}); + }( jQuery ) ); From 96d7949f436a29e2a23d1e926ab4debf5b363465 Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Sun, 31 Jul 2011 14:40:58 -0500 Subject: [PATCH 010/107] Mask: Adding in paste/blur handlers, minor adjustments to backspace unit tests --- tests/unit/mask/mask_events.js | 13 +++++++++---- ui/jquery.ui.mask.js | 29 ++++++++++++++++++++++++++--- 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/tests/unit/mask/mask_events.js b/tests/unit/mask/mask_events.js index 45bbf5044c0..ec8d984beca 100644 --- a/tests/unit/mask/mask_events.js +++ b/tests/unit/mask/mask_events.js @@ -3,7 +3,7 @@ module( "mask: events" ); test( "keydown: delete and backspace behaviors", function() { - expect( 11 ); + expect( 12 ); var input = $( "#mask1" ).val( "1234" ).mask({ mask: "99/99/99" }), mask = input.data( "mask" ); @@ -24,18 +24,23 @@ test( "keydown: delete and backspace behaviors", function() { input.val( "123456" ).mask( "refresh" ); equal( input.val(), "12/34/56", "New Initial Value" ); + mask._caret( 4 ); + input.simulate( "keydown", { keyCode: $.ui.keyCode.BACKSPACE }); + equal( input.val(), "12/45/6_", "Backspaced 3 out of the middle" ); + + mask._caret( 2, 4 ); input.simulate( "keydown", { keyCode: $.ui.keyCode.BACKSPACE }); - equal( input.val(), "12/56/__", "Backspaced 34 out of the middle" ); + equal( input.val(), "12/6_/__", "Backspaced 45 out of the middle" ); deepEqual( mask._caret(), { begin: 2, end: 2 }, "Caret position" ); mask._caret( 6 ); input.simulate( "keydown", { keyCode: $.ui.keyCode.BACKSPACE }); - equal( input.val(), "12/5_/__", "Backspaced last value" ); + equal( input.val(), "12/6_/__", "Backspaced last value" ); mask._caret( 2 ); input.simulate( "keydown", { keyCode: $.ui.keyCode.BACKSPACE }); - equal( input.val(), "15/__/__", "Backspaced value from middle" ); + equal( input.val(), "16/__/__", "Backspaced value from middle" ); }); diff --git a/ui/jquery.ui.mask.js b/ui/jquery.ui.mask.js index 1eb9366df0f..d23e07b877d 100644 --- a/ui/jquery.ui.mask.js +++ b/ui/jquery.ui.mask.js @@ -126,10 +126,28 @@ $.widget( "ui.mask", { that = this, elem = that.element; + function handlePaste() { + setTimeout( function() { + var position = that._parseValue(); + that._paint(); + that._caret( that._seekRight( position ) ); + }, 0 ); + } + this._bind({ focus: function( event ) { lastUnsavedValue = elem.val(); }, + blur: function( event ) { + + // because we are constantly setting the value of the input, the change event + // never fires - we re-introduce the change event here + that._parseValue(); + that._paint(); + if ( elem.val() !== lastUnsavedValue ) { + elem.trigger( "change" ); + } + }, keydown: function( event ) { var key = event.keyCode, position = that._caret(); @@ -180,7 +198,9 @@ $.widget( "ui.mask", { } } event.preventDefault(); - } + }, + paste: handlePaste, + input: handlePaste }); }, @@ -268,12 +288,13 @@ $.widget( "ui.mask", { }, // parses the .val() and places it into the buffer - // returns the total length of the displayed values in the buffer + // returns the last filled in value position _parseValue: function() { var bufferPosition, bufferObject, character, valuePosition = 0, + lastFilledPosition = 0, value = this.element.val(), bufferLength = this.buffer.length, valueLength = value.length; @@ -291,6 +312,7 @@ $.widget( "ui.mask", { if ( this._validValue( bufferObject, character ) ) { valuePosition++; } + lastFilledPosition = bufferPosition; // when parsing a literal from a raw .val() if it doesn't match, // assume that the literal is missing from the val() @@ -300,12 +322,13 @@ $.widget( "ui.mask", { character = this._validValue( bufferObject, character ); if ( character ) { bufferObject.value = character; + lastFilledPosition = bufferPosition; break; } } } } - return bufferLength; + return lastFilledPosition; }, _paint: function() { var bufferPosition, From 719aae5bac73819a85b7f574e790ce543b3ce5f4 Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Mon, 1 Aug 2011 18:21:49 -0500 Subject: [PATCH 011/107] Mask: Adding more unit tests copied from the specs used for maskedInput --- tests/unit/mask/mask_events.js | 187 ++++++++++++++++++++++++++++----- ui/jquery.ui.mask.js | 5 +- 2 files changed, 162 insertions(+), 30 deletions(-) diff --git a/tests/unit/mask/mask_events.js b/tests/unit/mask/mask_events.js index ec8d984beca..251edf17a52 100644 --- a/tests/unit/mask/mask_events.js +++ b/tests/unit/mask/mask_events.js @@ -2,46 +2,179 @@ module( "mask: events" ); -test( "keydown: delete and backspace behaviors", function() { +/* TODO: Descide behavior of bluring non-valid inputs */ + +test( "focus: Initial Caret Positioning", function() { + var input = $( "#mask1" ).val("").mask({ mask: "9" }), + mask = input.data( "mask" ); + + equal( input.val(), "_", "Initial Value Expected" ); + input.focus(); + deepEqual( mask._caret(), { begin: 0, end: 0 }, "Caret position correct"); + + input.mask( "option", "mask", "(9)" ); + equal( input.val(), "(_)", "Initial Value Expected" ); + input.focus(); + deepEqual( mask._caret(), { begin: 1, end: 1 }, "Caret position correct"); + +}); + +test( "keydown: Backspace pulls values from right", function() { expect( 12 ); - var input = $( "#mask1" ).val( "1234" ).mask({ mask: "99/99/99" }), + var input = $( "#mask1" ).val("123").mask({ mask: "999" }), mask = input.data( "mask" ); - equal( input.val(), "12/34/__", "Initial Value" ); - mask._caret( 0 ); - input.simulate( "keydown", { keyCode: $.ui.keyCode.DELETE }); - equal( input.val(), "23/4_/__", "Deleted first value" ); + equal( input.val(), "123", "Initial Value Expected" ); + mask._caret( 2 ); - input.simulate( "keydown", { keyCode: $.ui.keyCode.DELETE }); - equal( input.val(), "23/__/__", "Deleted value after literal" ); + input.simulate( "keydown", { keyCode: $.ui.keyCode.BACKSPACE }); + equal( input.val(), "13_", "Backspaced the second character"); + deepEqual( mask._caret(), { begin: 1, end: 1 }, "Caret position correct"); - input.val( "123456" ).mask( "refresh" ); - equal( input.val(), "12/34/56", "New Initial Value" ); - mask._caret( 2, 4 ); - input.simulate( "keydown", { keyCode: $.ui.keyCode.DELETE }); - equal( input.val(), "12/56/__", "Deleted 34 out of the middle" ); - deepEqual( mask._caret(), { begin: 2, end: 2 }, "Caret position" ); - - input.val( "123456" ).mask( "refresh" ); - equal( input.val(), "12/34/56", "New Initial Value" ); - mask._caret( 4 ); + input.val( "1z" ).mask( "option", "mask", "9a" ); + equal( input.val(), "1z", "Initial Value Expected" ); + + mask._caret( 1 ); input.simulate( "keydown", { keyCode: $.ui.keyCode.BACKSPACE }); - equal( input.val(), "12/45/6_", "Backspaced 3 out of the middle" ); - + equal( input.val(), "_z", "Backspace did not pull value because it wasn't valid" ); + deepEqual( mask._caret(), { begin: 0, end: 0 }, "Caret position correct"); + + input.val( "12" ).mask( "option", "mask", "9-9" ); + equal( input.val(), "1-2", "Initial Value Expected" ); - mask._caret( 2, 4 ); + mask._caret( 1 ); input.simulate( "keydown", { keyCode: $.ui.keyCode.BACKSPACE }); - equal( input.val(), "12/6_/__", "Backspaced 45 out of the middle" ); - deepEqual( mask._caret(), { begin: 2, end: 2 }, "Caret position" ); - - mask._caret( 6 ); + equal( input.val(), "2-_", "Backspace pulled value because it was valid" ); + deepEqual( mask._caret(), { begin: 0, end: 0 }, "Caret position correct"); + + + input.val( "1z" ).mask( "option", "mask", "9-a" ); + equal( input.val(), "1-z", "Initial Value Expected" ); + + mask._caret( 1 ); + input.simulate( "keydown", { keyCode: $.ui.keyCode.BACKSPACE }); + equal( input.val(), "_-z", "Backspace did not pull value because it wasn't valid" ); + deepEqual( mask._caret(), { begin: 0, end: 0 }, "Caret position correct"); +}); + +test( "keydown: Backspace with the cursor to the right of a mask literal", function() { + expect( 6 ); + var input = $( "#mask1" ).val("123").mask({ mask: "9-99" }), + mask = input.data( "mask" ); + + equal( input.val(), "1-23", "Initial Value Expected" ); + + mask._caret( 2 ); input.simulate( "keydown", { keyCode: $.ui.keyCode.BACKSPACE }); - equal( input.val(), "12/6_/__", "Backspaced last value" ); + equal( input.val(), "2-3_", "Backspaced across the literal -, brought values with"); + deepEqual( mask._caret(), { begin: 0, end: 0 }, "Caret position correct"); + + input.val("z12").mask( "option", "mask", "a-99" ); + equal( input.val(), "z-12", "New Initial Value Expected"); mask._caret( 2 ); input.simulate( "keydown", { keyCode: $.ui.keyCode.BACKSPACE }); - equal( input.val(), "16/__/__", "Backspaced value from middle" ); + equal( input.val(), "_-12", "Backspaced across the literal -, values held position"); + deepEqual( mask._caret(), { begin: 0, end: 0 }, "Caret position correct"); +}); + +test( "keydown: Delete pulling values", function() { + expect( 18 ); + var input = $( "#mask1" ).val("123").mask({ mask: "9-99" }), + mask = input.data( "mask" ); + equal( input.val(), "1-23", "Initial value expected" ); + + mask._caret( 1 ); + input.simulate( "keydown", { keyCode: $.ui.keyCode.DELETE }); + equal( input.val(), "1-3_", "Delete across the literal -, brought values with"); + deepEqual( mask._caret(), { begin: 2, end: 2 }, "Caret position correct"); + + input.val("12z").mask( "option", "mask", "9-9a" ); + equal( input.val(), "1-2z", "Initial value expected" ); + + mask._caret( 1 ); + input.simulate( "keydown", { keyCode: $.ui.keyCode.DELETE }); + equal( input.val(), "1-_z", "Deleted across the literal -, z was not pulled"); + deepEqual( mask._caret(), { begin: 2, end: 2 }, "Caret position correct"); + input.val("12").mask( "option", "mask", "99" ); + equal( input.val(), "12", "Initial value expected" ); + + mask._caret( 0 ); + input.simulate( "keydown", { keyCode: $.ui.keyCode.DELETE }); + equal( input.val(), "2_", "Deleted value, pulled values from the right"); + deepEqual( mask._caret(), { begin: 0, end: 0 }, "Caret position correct"); + + input.val("1z").mask( "option", "mask", "9a" ); + equal( input.val(), "1z", "Initial value expected" ); + + mask._caret( 0 ); + input.simulate( "keydown", { keyCode: $.ui.keyCode.DELETE }); + equal( input.val(), "_z", "Deleted value, couldn't pull values from the right"); + deepEqual( mask._caret(), { begin: 0, end: 0 }, "Caret position correct"); + + input.val("12").mask( "option", "mask", "9-9" ); + equal( input.val(), "1-2", "Initial value expected" ); + + mask._caret( 0 ); + input.simulate( "keydown", { keyCode: $.ui.keyCode.DELETE }); + equal( input.val(), "2-_", "Deleted value, pulled values from the right across the literal"); + deepEqual( mask._caret(), { begin: 0, end: 0 }, "Caret position correct"); + + + input.val("1z").mask( "option", "mask", "9-a" ); + equal( input.val(), "1-z", "Initial value expected" ); + + mask._caret( 0 ); + input.simulate( "keydown", { keyCode: $.ui.keyCode.DELETE }); + equal( input.val(), "_-z", "Deleted value, couldn't pull values from the right"); + deepEqual( mask._caret(), { begin: 0, end: 0 }, "Caret position correct"); +}); + +test( "keydown: escape returns to original value", function() { + expect( 3 ); + var input = $( "#mask1" ).val("6").mask({ mask: "9" }), + mask = input.data( "mask" ); + + equal( input.val(), "6", "Initial value expected" ); + input.focus(); + + mask._caret( 0 ); + input.simulate( "keypress", { keyCode: "1".charCodeAt(0) }); + equal( input.val(), "1", "Typed over" ); + + input.simulate( "keydown", { keyCode: $.ui.keyCode.ESCAPE }); + equal( input.val(), "6", "Reverted value after pressing escape" ); + +}); + +test( "keypress: typing behaviors", function() { + expect( 8 ); + var input = $( "#mask1" ).mask({ mask: "9-9" }), + mask = input.data( "mask" ); + + equal( input.val(), "_-_", "Initial value expected" ); + + mask._caret( 0 ); + input.simulate( "keypress", { keyCode: "1".charCodeAt( 0 ) }); + equal( input.val(), "1-_", "Typed a 1" ); + + mask._caret( 0 ); + input.simulate( "keypress", { keyCode: "2".charCodeAt( 0 ) }); + equal( input.val(), "2-1", "Typed a 2 before the 1" ); + deepEqual( mask._caret(), { begin: 2, end: 2 }, "Caret position correct"); + + input.val("").mask( "option", "mask", "9-a" ); + equal( input.val(), "_-_", "Initial value expected" ); + + mask._caret( 0 ); + input.simulate( "keypress", { keyCode: "1".charCodeAt( 0 ) }); + equal( input.val(), "1-_", "Typed a 1" ); + + mask._caret( 0 ); + input.simulate( "keypress", { keyCode: "2".charCodeAt( 0 ) }); + equal( input.val(), "2-_", "Typed a 2 before the 1 - 1 is lost because not valid" ); + deepEqual( mask._caret(), { begin: 2, end: 2 }, "Caret position correct"); }); }( jQuery ) ); diff --git a/ui/jquery.ui.mask.js b/ui/jquery.ui.mask.js index d23e07b877d..ab290b0b6bb 100644 --- a/ui/jquery.ui.mask.js +++ b/ui/jquery.ui.mask.js @@ -137,6 +137,7 @@ $.widget( "ui.mask", { this._bind({ focus: function( event ) { lastUnsavedValue = elem.val(); + that._caret( that._seekRight( that._parseValue() - 1 ) ); }, blur: function( event ) { @@ -176,7 +177,7 @@ $.widget( "ui.mask", { } }, keypress: function( event ) { - var key = event.which, + var key = event.keyCode, position = that._caret(), bufferPosition = that._seekRight( position.begin - 1 ), bufferObject = that.buffer[ bufferPosition ]; @@ -312,8 +313,6 @@ $.widget( "ui.mask", { if ( this._validValue( bufferObject, character ) ) { valuePosition++; } - lastFilledPosition = bufferPosition; - // when parsing a literal from a raw .val() if it doesn't match, // assume that the literal is missing from the val() break; From 9d7ea7973b5bb8d3b008bbce70c669c00439095f Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Mon, 1 Aug 2011 18:41:20 -0500 Subject: [PATCH 012/107] Mask: adding a value method to get and set raw value without mask literals / placeholders --- tests/unit/mask/mask_core.js | 4 ++-- tests/unit/mask/mask_methods.js | 12 ++++++++++++ ui/jquery.ui.mask.js | 21 +++++++++++++++++---- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/tests/unit/mask/mask_core.js b/tests/unit/mask/mask_core.js index ff5aee216a3..0b628e3ac38 100644 --- a/tests/unit/mask/mask_core.js +++ b/tests/unit/mask/mask_core.js @@ -120,11 +120,11 @@ test( "Parsing initial value skips literals", function() { input.val("123456").mask({ mask: "99/99/99" }); - + equal( input.val(), "12/34/56", "Literals were inserted into val"); input.mask( "option", "mask", "99-99-99" ); equal( input.val(), "12-34-56", "Old literals were ignored, and new ones inserted into val"); - + }); }( jQuery ) ); diff --git a/tests/unit/mask/mask_methods.js b/tests/unit/mask/mask_methods.js index 0e8f4ec60d9..eb8dd5f6a24 100644 --- a/tests/unit/mask/mask_methods.js +++ b/tests/unit/mask/mask_methods.js @@ -13,4 +13,16 @@ test( "refresh", function() { equal( input.val(), "12/34/56", "Refresh re-parsed the value of the input" ); }); +test( "value: able to get (and set) raw values", function() { + expect( 3 ); + var input = $( "#mask1" ).mask({ + mask: "99/99/99" + }); + + equal( input.mask( "value" ), "", "Reading empty raw value" ); + input.mask( "value", "123456" ); + equal( input.val(), "12/34/56", "Raw value set properly" ); + equal( input.mask( "value" ), "123456", "Raw value read correctly" ); +}); + }( jQuery ) ); diff --git a/ui/jquery.ui.mask.js b/ui/jquery.ui.mask.js index ab290b0b6bb..1d1cd512f62 100644 --- a/ui/jquery.ui.mask.js +++ b/ui/jquery.ui.mask.js @@ -36,6 +36,16 @@ $.widget( "ui.mask", { this._paint(); }, + // returns (or sets) the value without the mask + value: function( value ) { + if ( value !== undefined ) { + this.element.val( value ); + this.refresh(); + } else { + return this._getValue( true ); + } + }, + _setOption: function( key, value ) { this._super( "_setOption", key, value ); if ( key === "mask" ) { @@ -329,7 +339,7 @@ $.widget( "ui.mask", { } return lastFilledPosition; }, - _paint: function() { + _getValue: function( raw ) { var bufferPosition, bufferObject, bufferLength = this.buffer.length, @@ -337,15 +347,18 @@ $.widget( "ui.mask", { for ( bufferPosition = 0; bufferPosition < bufferLength; bufferPosition += bufferObject.length ) { bufferObject = this.buffer[ bufferPosition ]; - if ( bufferObject.literal ) { + if ( bufferObject.literal && !raw ) { value += bufferObject.literal; } else if ( bufferObject.value ) { value += bufferObject.value; - } else { + } else if ( !raw ) { value += this.options.placeholder; } } - this.element.val( value ); + return value; + }, + _paint: function() { + this.element.val( this._getValue() ); }, // returns the value if valid, otherwise returns false From af2edfe97d22f8fbb59d800b574e8f4c55ae7505 Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Mon, 1 Aug 2011 19:01:04 -0500 Subject: [PATCH 013/107] Mask: Adding a valid method which can tell if a mask has been completed --- tests/unit/mask/mask_methods.js | 11 +++++++++++ ui/jquery.ui.mask.js | 14 ++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/tests/unit/mask/mask_methods.js b/tests/unit/mask/mask_methods.js index eb8dd5f6a24..ca2c7c5480e 100644 --- a/tests/unit/mask/mask_methods.js +++ b/tests/unit/mask/mask_methods.js @@ -25,4 +25,15 @@ test( "value: able to get (and set) raw values", function() { equal( input.mask( "value" ), "123456", "Raw value read correctly" ); }); +test( "valid: returns true when all required placeholders are filled", function() { + expect( 2 ); + var input = $( "#mask1" ).mask({ + mask: "99/99/99" + }); + + equal( input.mask( "valid" ), false, "Empty value is invalid" ); + input.mask( "value", "123456" ); + equal( input.mask( "valid" ), true, "All placheholders are full" ); +}); + }( jQuery ) ); diff --git a/ui/jquery.ui.mask.js b/ui/jquery.ui.mask.js index 1d1cd512f62..cf9e56684a3 100644 --- a/ui/jquery.ui.mask.js +++ b/ui/jquery.ui.mask.js @@ -36,6 +36,20 @@ $.widget( "ui.mask", { this._paint(); }, + valid: function() { + var bufferPosition, + bufferObject, + bufferLength = this.buffer.length; + + for ( bufferPosition = 0; bufferPosition < bufferLength; bufferPosition++ ) { + bufferObject = this.buffer[ bufferPosition ]; + if ( !( bufferObject.value || bufferObject.literal ) ) { + return false; + } + } + return true; + }, + // returns (or sets) the value without the mask value: function( value ) { if ( value !== undefined ) { From af9da8fe770fc35f387bf3c5fbb3172db60bfbf4 Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Tue, 2 Aug 2011 10:44:20 -0500 Subject: [PATCH 014/107] =?UTF-8?q?Mask:=20Updating=20regexp=20to=20includ?= =?UTF-8?q?e=20=C3=B6=20and=20=C3=A5=20(etc),=20also=20making=20sure=20inp?= =?UTF-8?q?uts=20have=20focus=20in=20the=20tests=20to=20stop=20an=20odd=20?= =?UTF-8?q?sometimes=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/unit/mask/mask_defaults.js | 4 ++-- tests/unit/mask/mask_events.js | 6 ++++++ ui/jquery.ui.mask.js | 7 +++---- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/tests/unit/mask/mask_defaults.js b/tests/unit/mask/mask_defaults.js index af6cd3db3e5..8b66957b82f 100644 --- a/tests/unit/mask/mask_defaults.js +++ b/tests/unit/mask/mask_defaults.js @@ -2,8 +2,8 @@ commonWidgetTests( "mask", { defaults: { definitions: { '9': /[0-9]/, - 'a': /[A-Za-z]/, - '*': /[A-Za-z0-9]/ + 'a': /[A-Za-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]/, + '*': /[A-Za-z0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]/ }, disabled: false, mask: null, diff --git a/tests/unit/mask/mask_events.js b/tests/unit/mask/mask_events.js index 251edf17a52..c6deb7daa12 100644 --- a/tests/unit/mask/mask_events.js +++ b/tests/unit/mask/mask_events.js @@ -24,6 +24,8 @@ test( "keydown: Backspace pulls values from right", function() { var input = $( "#mask1" ).val("123").mask({ mask: "999" }), mask = input.data( "mask" ); + + input.focus(); equal( input.val(), "123", "Initial Value Expected" ); mask._caret( 2 ); @@ -62,6 +64,7 @@ test( "keydown: Backspace with the cursor to the right of a mask literal", funct var input = $( "#mask1" ).val("123").mask({ mask: "9-99" }), mask = input.data( "mask" ); + input.focus(); equal( input.val(), "1-23", "Initial Value Expected" ); mask._caret( 2 ); @@ -82,6 +85,8 @@ test( "keydown: Delete pulling values", function() { expect( 18 ); var input = $( "#mask1" ).val("123").mask({ mask: "9-99" }), mask = input.data( "mask" ); + + input.focus(); equal( input.val(), "1-23", "Initial value expected" ); mask._caret( 1 ); @@ -153,6 +158,7 @@ test( "keypress: typing behaviors", function() { var input = $( "#mask1" ).mask({ mask: "9-9" }), mask = input.data( "mask" ); + input.focus(); equal( input.val(), "_-_", "Initial value expected" ); mask._caret( 0 ); diff --git a/ui/jquery.ui.mask.js b/ui/jquery.ui.mask.js index cf9e56684a3..a264441f90c 100644 --- a/ui/jquery.ui.mask.js +++ b/ui/jquery.ui.mask.js @@ -17,8 +17,8 @@ $.widget( "ui.mask", { options: { definitions: { '9': /[0-9]/, - 'a': /[A-Za-z]/, - '*': /[A-Za-z0-9]/ + 'a': /[A-Za-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]/, + '*': /[A-Za-z0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]/ }, mask: null, placeholder: "_" @@ -168,10 +168,10 @@ $.widget( "ui.mask", { // because we are constantly setting the value of the input, the change event // never fires - we re-introduce the change event here that._parseValue(); - that._paint(); if ( elem.val() !== lastUnsavedValue ) { elem.trigger( "change" ); } + return; }, keydown: function( event ) { var key = event.keyCode, @@ -277,7 +277,6 @@ $.widget( "ui.mask", { } } } - this._caret( caretPosition < 0 ? this._seekRight( 0 ) : caretPosition ); }, _shiftRight: function ( bufferPosition ) { var bufferObject, From a84baa575afed3e2f3ce3f59b80473bd593d0b2b Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Tue, 2 Aug 2011 10:44:48 -0500 Subject: [PATCH 015/107] Mask: Visual Test --- tests/visual/mask/mask.html | 52 +++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 tests/visual/mask/mask.html diff --git a/tests/visual/mask/mask.html b/tests/visual/mask/mask.html new file mode 100644 index 00000000000..c90481fdd45 --- /dev/null +++ b/tests/visual/mask/mask.html @@ -0,0 +1,52 @@ + + + + Mask Visual Test: Default + + + + + + + + + + +
      + + + + + + + + + + + + + + +
      + + \ No newline at end of file From 548ccaed10c9def7f86124c068d810435a2a9d8c Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Tue, 2 Aug 2011 10:59:26 -0500 Subject: [PATCH 016/107] Mask: Adding a short delay to setting the caret position on focus --- tests/unit/mask/mask_events.js | 21 ++++++++++++++------- ui/jquery.ui.mask.js | 4 +++- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/tests/unit/mask/mask_events.js b/tests/unit/mask/mask_events.js index c6deb7daa12..7ba6b3db215 100644 --- a/tests/unit/mask/mask_events.js +++ b/tests/unit/mask/mask_events.js @@ -4,18 +4,25 @@ module( "mask: events" ); /* TODO: Descide behavior of bluring non-valid inputs */ -test( "focus: Initial Caret Positioning", function() { +asyncTest( "focus: Initial Caret Positioning", function() { var input = $( "#mask1" ).val("").mask({ mask: "9" }), mask = input.data( "mask" ); equal( input.val(), "_", "Initial Value Expected" ); input.focus(); - deepEqual( mask._caret(), { begin: 0, end: 0 }, "Caret position correct"); + setTimeout( function() { + deepEqual( mask._caret(), { begin: 0, end: 0 }, "Caret position correct"); - input.mask( "option", "mask", "(9)" ); - equal( input.val(), "(_)", "Initial Value Expected" ); - input.focus(); - deepEqual( mask._caret(), { begin: 1, end: 1 }, "Caret position correct"); + input.mask( "option", "mask", "(9)" ); + equal( input.val(), "(_)", "Initial Value Expected" ); + input.focus(); + + setTimeout( function() { + deepEqual( mask._caret(), { begin: 1, end: 1 }, "Caret position correct"); + start(); + }, 0); + + }, 0); }); @@ -169,7 +176,7 @@ test( "keypress: typing behaviors", function() { input.simulate( "keypress", { keyCode: "2".charCodeAt( 0 ) }); equal( input.val(), "2-1", "Typed a 2 before the 1" ); deepEqual( mask._caret(), { begin: 2, end: 2 }, "Caret position correct"); - + input.val("").mask( "option", "mask", "9-a" ); equal( input.val(), "_-_", "Initial value expected" ); diff --git a/ui/jquery.ui.mask.js b/ui/jquery.ui.mask.js index a264441f90c..8bbc6106917 100644 --- a/ui/jquery.ui.mask.js +++ b/ui/jquery.ui.mask.js @@ -161,7 +161,9 @@ $.widget( "ui.mask", { this._bind({ focus: function( event ) { lastUnsavedValue = elem.val(); - that._caret( that._seekRight( that._parseValue() - 1 ) ); + setTimeout( function() { + that._caret( that._seekRight( that._parseValue() - 1 ) ); + }, 0); }, blur: function( event ) { From 3ac0bb4243ad4cd6f086f4a8e7344acc5cc0e030 Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Tue, 2 Aug 2011 11:34:57 -0500 Subject: [PATCH 017/107] Mask: Handling overtyping multiple values better - rewrote shiftRight function to make more sense --- tests/unit/mask/mask_events.js | 28 ++++++++++++++++++++++++++++ ui/jquery.ui.mask.js | 27 +++++++++++++++------------ 2 files changed, 43 insertions(+), 12 deletions(-) diff --git a/tests/unit/mask/mask_events.js b/tests/unit/mask/mask_events.js index 7ba6b3db215..e1541eff482 100644 --- a/tests/unit/mask/mask_events.js +++ b/tests/unit/mask/mask_events.js @@ -88,6 +88,34 @@ test( "keydown: Backspace with the cursor to the right of a mask literal", funct deepEqual( mask._caret(), { begin: 0, end: 0 }, "Caret position correct"); }); +test( "keydown: Backspace with multiple values higlighted", function() { + expect( 3 ); + var input = $( "#mask1" ).val("1234567890").mask({ mask: "(999)999-9999" }), + mask = input.data( "mask" ); + + input.focus(); + equal( input.val(), "(123)456-7890", "Initial Value Expected" ); + + mask._caret( 5, 8 ); + input.simulate( "keydown", { keyCode: $.ui.keyCode.BACKSPACE }); + equal( input.val(), "(123)789-0___", "Deleted three highlighted values, pulled values from right" ); + deepEqual( mask._caret(), { begin: 5, end: 5 }, "Caret position correct"); +}); + +test( "keypress: Typing with multiple values higlighted", function() { + expect( 3 ); + var input = $( "#mask1" ).val("1234567890").mask({ mask: "(999)999-9999" }), + mask = input.data( "mask" ); + + input.focus(); + equal( input.val(), "(123)456-7890", "Initial Value Expected" ); + + mask._caret( 5, 8 ); + input.simulate( "keypress", { keyCode: "0".charCodeAt( 0 ) }); + equal( input.val(), "(123)078-90__", "Deleted three highlighted values, pulled values from right" ); + deepEqual( mask._caret(), { begin: 6, end: 6 }, "Caret position correct"); +}); + test( "keydown: Delete pulling values", function() { expect( 18 ); var input = $( "#mask1" ).val("123").mask({ mask: "9-99" }), diff --git a/ui/jquery.ui.mask.js b/ui/jquery.ui.mask.js index 8bbc6106917..6458123a7af 100644 --- a/ui/jquery.ui.mask.js +++ b/ui/jquery.ui.mask.js @@ -212,7 +212,7 @@ $.widget( "ui.mask", { if ( event.metaKey || event.altKey || event.ctrlKey || key < 32 ) { return; } - if ( position.begin != position.end ) { + if ( position.begin !== position.end ) { that._removeValues( position.begin, position.end ); } if ( bufferObject ) { @@ -282,20 +282,23 @@ $.widget( "ui.mask", { }, _shiftRight: function ( bufferPosition ) { var bufferObject, - destPosition = this._seekRight( bufferPosition ), - destObject, + temp, + shiftingValue = false, bufferLength = this.buffer.length; - for ( ; bufferPosition < bufferLength ; bufferPosition += bufferObject.length ) { + bufferPosition--; + while ( ( bufferPosition = this._seekRight( bufferPosition ) ) < bufferLength ) + { bufferObject = this.buffer[ bufferPosition ]; - if ( bufferObject.valid ) { - if ( destPosition < bufferLength ) { - destObject = this.buffer[ destPosition ]; - if ( this._validValue( destObject, bufferObject.value ) ) { - destObject.value = bufferObject.value; - destPosition = this._seekRight( destPosition ); - } - delete bufferObject.value; + if ( shiftingValue === false ) { + shiftingValue = bufferObject.value; + } else { + if ( this._validValue( bufferObject, shiftingValue ) ) { + temp = bufferObject.value; + bufferObject.value = shiftingValue; + shiftingValue = temp; + } else { + return; } } } From 1441608706fa54445be2e87366abec83d0f3afc7 Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Wed, 10 Aug 2011 03:28:55 -0500 Subject: [PATCH 018/107] Mask: Adding the complete event --- tests/unit/mask/mask_events.js | 21 +++++++++++++++++++-- ui/jquery.ui.mask.js | 28 ++++++++++++++-------------- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/tests/unit/mask/mask_events.js b/tests/unit/mask/mask_events.js index e1541eff482..65cb387b29c 100644 --- a/tests/unit/mask/mask_events.js +++ b/tests/unit/mask/mask_events.js @@ -4,6 +4,23 @@ module( "mask: events" ); /* TODO: Descide behavior of bluring non-valid inputs */ +test( "complete: Complete event fires when typing last character of mask", function() { + expect( 3 ); + var input = $( "#mask1" ).val("").mask({ + mask: "9", + complete: function( event, ui ) { + equal( this, input[0], "Complete event fired with correct context" ); + } + }), + mask = input.data( "mask" ); + + input.focus(); + mask._caret( 0 ); + deepEqual( mask._caret(), { begin: 0, end: 0 }, "Caret position correct" ); + input.simulate( "keypress", { keyCode: "1".charCodeAt( 0 ) } ); + equal( input.val(), "1", "Value is valid" ); +}); + asyncTest( "focus: Initial Caret Positioning", function() { var input = $( "#mask1" ).val("").mask({ mask: "9" }), mask = input.data( "mask" ); @@ -20,9 +37,9 @@ asyncTest( "focus: Initial Caret Positioning", function() { setTimeout( function() { deepEqual( mask._caret(), { begin: 1, end: 1 }, "Caret position correct"); start(); - }, 0); + }, 15); - }, 0); + }, 15); }); diff --git a/ui/jquery.ui.mask.js b/ui/jquery.ui.mask.js index 6458123a7af..930df5d672a 100644 --- a/ui/jquery.ui.mask.js +++ b/ui/jquery.ui.mask.js @@ -28,7 +28,7 @@ $.widget( "ui.mask", { this._parseMask(); this._parseValue(); this._paint(); - this._keyBinding(); + this._events(); }, refresh: function() { @@ -37,17 +37,7 @@ $.widget( "ui.mask", { }, valid: function() { - var bufferPosition, - bufferObject, - bufferLength = this.buffer.length; - - for ( bufferPosition = 0; bufferPosition < bufferLength; bufferPosition++ ) { - bufferObject = this.buffer[ bufferPosition ]; - if ( !( bufferObject.value || bufferObject.literal ) ) { - return false; - } - } - return true; + return this.isValid; }, // returns (or sets) the value without the mask @@ -144,17 +134,19 @@ $.widget( "ui.mask", { } } }, - _keyBinding: function() { + _events: function() { var cancelKeypress, lastUnsavedValue, that = this, elem = that.element; function handlePaste() { + that.currentEvent = event; setTimeout( function() { var position = that._parseValue(); that._paint(); that._caret( that._seekRight( position ) ); + that.currentEvent = false; }, 0 ); } @@ -208,6 +200,7 @@ $.widget( "ui.mask", { bufferPosition = that._seekRight( position.begin - 1 ), bufferObject = that.buffer[ bufferPosition ]; + that.currentEvent = event; // ignore keypresses with special keys, or control characters if ( event.metaKey || event.altKey || event.ctrlKey || key < 32 ) { return; @@ -225,6 +218,7 @@ $.widget( "ui.mask", { } } event.preventDefault(); + that.currentEvent = false; }, paste: handlePaste, input: handlePaste @@ -358,11 +352,13 @@ $.widget( "ui.mask", { return lastFilledPosition; }, _getValue: function( raw ) { - var bufferPosition, + var wasValid = this.isValid, + bufferPosition, bufferObject, bufferLength = this.buffer.length, value = ""; + this.isValid = true; for ( bufferPosition = 0; bufferPosition < bufferLength; bufferPosition += bufferObject.length ) { bufferObject = this.buffer[ bufferPosition ]; if ( bufferObject.literal && !raw ) { @@ -371,8 +367,12 @@ $.widget( "ui.mask", { value += bufferObject.value; } else if ( !raw ) { value += this.options.placeholder; + this.isValid = false; } } + if ( !wasValid && this.isValid ) { + this._trigger( "complete", this.currentEvent ); + } return value; }, _paint: function() { From 75ab04a49aebe23a72c65359bce77ea42993c989 Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Wed, 10 Aug 2011 03:36:28 -0500 Subject: [PATCH 019/107] Mask: Cleaning up whitespace in tests --- tests/unit/mask/mask_options.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/unit/mask/mask_options.js b/tests/unit/mask/mask_options.js index 7ab042080c7..81f00d18cca 100644 --- a/tests/unit/mask/mask_options.js +++ b/tests/unit/mask/mask_options.js @@ -12,7 +12,6 @@ test( "placeholder", function() { equal( input.val(), "__/__/__", "Initial value" ); input.mask( "option", "placeholder", " " ); equal( input.val(), " / / ", "Placeholder changed" ); - }); test( "mask", function() { @@ -25,8 +24,6 @@ test( "mask", function() { equal( input.val(), "12/34/__", "Initial value" ); input.mask( "option", "mask", "(999)999-9999" ); equal( input.val(), "(123)4__-____", "Mask changed" ); - }); - }( jQuery ) ); From 2414a943e33a5975c686e23e64fc5fb7730f7c78 Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Wed, 10 Aug 2011 04:10:52 -0500 Subject: [PATCH 020/107] Mask: Optional mask position with marked with a ? --- tests/unit/mask/mask_events.js | 23 ++++++++++++++++++++--- ui/jquery.ui.mask.js | 22 +++++++++++++++++----- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/tests/unit/mask/mask_events.js b/tests/unit/mask/mask_events.js index 65cb387b29c..23d536a5d4e 100644 --- a/tests/unit/mask/mask_events.js +++ b/tests/unit/mask/mask_events.js @@ -4,10 +4,26 @@ module( "mask: events" ); /* TODO: Descide behavior of bluring non-valid inputs */ +test( "complete: Complete event fires when typing last non-optional character of mask", function() { + expect( 2 ); + var input = $( "#mask1" ).val("").mask({ + mask: "9?9", + complete: function( event, ui ) { + equal( this, input[0], "Complete event fired with correct context" ); + } + }), + mask = input.data( "mask" ); + + input.focus(); + mask._caret( 0 ); + input.simulate( "keypress", { keyCode: "1".charCodeAt( 0 ) } ); + equal( input.val(), "1_", "Value with optional character" ); +}); + test( "complete: Complete event fires when typing last character of mask", function() { expect( 3 ); var input = $( "#mask1" ).val("").mask({ - mask: "9", + mask: "99", complete: function( event, ui ) { equal( this, input[0], "Complete event fired with correct context" ); } @@ -16,9 +32,10 @@ test( "complete: Complete event fires when typing last character of mask", funct input.focus(); mask._caret( 0 ); - deepEqual( mask._caret(), { begin: 0, end: 0 }, "Caret position correct" ); input.simulate( "keypress", { keyCode: "1".charCodeAt( 0 ) } ); - equal( input.val(), "1", "Value is valid" ); + equal( input.mask( "valid" ), false, "Mask is not yet valid" ); + input.simulate( "keypress", { keyCode: "2".charCodeAt( 0 ) } ); + equal( input.val(), "12", "Value with optional character" ); }); asyncTest( "focus: Initial Caret Positioning", function() { diff --git a/ui/jquery.ui.mask.js b/ui/jquery.ui.mask.js index 930df5d672a..0217decd482 100644 --- a/ui/jquery.ui.mask.js +++ b/ui/jquery.ui.mask.js @@ -100,15 +100,25 @@ $.widget( "ui.mask", { } }, _parseMask: function() { - var key, x, bufferObject, + var key, x, bufferObject, originalPosition, index = -1, options = this.options, - mask = options.mask ; + mask = options.mask; this.buffer = []; if ( !mask ) { return; } + + optionalPosition = mask.indexOf( "?" ); + if ( optionalPosition === -1 ) { + this.optionalPosition = mask.length; + } else { + this.optionalPosition = optionalPosition; + + // remove the ? from the mask + mask = mask.substr( 0, optionalPosition ) + mask.substr( optionalPosition + 1 ); + } // search for definied "masks" for ( key in options.definitions ) { while ( ( index = mask.indexOf( key, index + 1 ) ) > -1 ) { @@ -367,11 +377,13 @@ $.widget( "ui.mask", { value += bufferObject.value; } else if ( !raw ) { value += this.options.placeholder; - this.isValid = false; + if ( bufferPosition < this.optionalPosition ) { + this.isValid = false; + } } } - if ( !wasValid && this.isValid ) { - this._trigger( "complete", this.currentEvent ); + if ( this.currentEvent && !wasValid && this.isValid ) { + this._trigger( "complete", this.currentEvent, {} ); } return value; }, From 84c16bd8baf5ce5c2675f64d07bc753a7f1512d6 Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Wed, 10 Aug 2011 04:17:29 -0500 Subject: [PATCH 021/107] Mask: Updating visual test --- tests/visual/mask/mask.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/visual/mask/mask.html b/tests/visual/mask/mask.html index c90481fdd45..ec38a25c1ae 100644 --- a/tests/visual/mask/mask.html +++ b/tests/visual/mask/mask.html @@ -37,7 +37,7 @@ - + From 9a1bcc5467ceafbb28687b18bcfc18cf0dff2489 Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Wed, 10 Aug 2011 07:29:17 -0500 Subject: [PATCH 022/107] Mask: More work on multi-character fields. Reorganizing methods alphabetically. --- tests/visual/mask/mask.html | 47 +++++- ui/jquery.ui.mask.js | 303 ++++++++++++++++++++---------------- 2 files changed, 209 insertions(+), 141 deletions(-) diff --git a/tests/visual/mask/mask.html b/tests/visual/mask/mask.html index ec38a25c1ae..6292c163097 100644 --- a/tests/visual/mask/mask.html +++ b/tests/visual/mask/mask.html @@ -22,6 +22,37 @@ "~": /\+|-/ } }); + $( "#mask8" ).mask({ + mask: "hh:mm:ss pp", + definitions: { + hh: function( value ) { + value = parseInt( value, 10 ); + if ( value >= 1 || value <= 12 ) { + return ( value < 10 ? "0" : "" ) + value; + } + }, + mm: sixty, + ss: sixty, + pp: function( value ) { + var character = value.toLowerCase().charAt( 0 ); + switch ( character ) { + case "a": + case "A": + return "am"; + case "p": + case "P": + return "pm"; + } + } + } + }); + + function sixty( value ) { + value = parseInt( value, 10 ); + if ( value >= 0 || value <= 59 ) { + return ( value < 10 ? "0" : "" ) + value; + } + } }); + + +
      +
      + + \ No newline at end of file diff --git a/ui/jquery.ui.timepicker.js b/ui/jquery.ui.timepicker.js new file mode 100644 index 00000000000..bfda392230a --- /dev/null +++ b/ui/jquery.ui.timepicker.js @@ -0,0 +1,19 @@ +/*! + * jQuery UI Time Picker @VERSION + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Mask + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + * jquery.ui.spinner.js + * jquery.ui.mask.js + * + */ +(function( $, undefined ) { + +}( jQuery )); \ No newline at end of file From 620964250575aeb9a27fc6e7e161ceaed92555af Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Wed, 14 Sep 2011 05:50:49 -0500 Subject: [PATCH 035/107] Mask: Adding a unit test for parsing multi-character fields from input --- tests/unit/mask/mask_core.js | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/tests/unit/mask/mask_core.js b/tests/unit/mask/mask_core.js index 0b628e3ac38..79b17d5f8d3 100644 --- a/tests/unit/mask/mask_core.js +++ b/tests/unit/mask/mask_core.js @@ -127,4 +127,33 @@ test( "Parsing initial value skips literals", function() { }); +test( "Parsing initial value with multi-character fields", function() { + expect( 2 ); + var defs = { + hh: function( value ) { + value = parseInt( value, 10 ); + if ( value >= 1 || value <= 12 ) { + return ( value < 10 ? "0" : "" ) + value; + } + }, + ss: function( value ) { + value = parseInt( value, 10 ); + if ( value >= 0 || value <= 59 ) { + return ( value < 10 ? "0" : "" ) + value; + } + } + }, + input = $( "#mask1" ); + + input.val("123456").mask({ + mask: "hh:ss:ss", + definitions: defs + }); + + equal( input.val(), "12:34:56", "Literals were inserted into val"); + input.mask( "option", "mask", "99-99-99" ); + equal( input.val(), "12-34-56", "Old literals were ignored, and new ones inserted into val"); + +}); + }( jQuery ) ); From 889ce2b54486d07ec832b18e0b6045336d979dfb Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Wed, 14 Sep 2011 06:05:07 -0500 Subject: [PATCH 036/107] Mask: fixing some merge conflicts --- ui/jquery.ui.mask.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/ui/jquery.ui.mask.js b/ui/jquery.ui.mask.js index 1a67f888f1d..04e6fb65945 100644 --- a/ui/jquery.ui.mask.js +++ b/ui/jquery.ui.mask.js @@ -185,22 +185,20 @@ $.widget( "ui.mask", { return; case keyCode.LEFT: - bufferObject = that.buffer[ position.begin ]; + bufferObject = this.buffer[ position.begin ]; if ( bufferObject && bufferObject.length > 1 ) { bufferObject.value = this._validValue( bufferObject, bufferObject.value ); this._paint(); event.preventDefault(); } - position = that._seekLeft( bufferObject.start ); - if ( position < 0 ) { - position = that._seekLeft( that.buffer.length ); - } - bufferObject = that.buffer[ position ]; + position = this._seekLeft( bufferObject.start ); + bufferObject = this.buffer[ position ]; if ( bufferObject && bufferObject.length > 1 ) { this._caret( bufferObject.start, bufferObject.start + ( bufferObject && bufferObject.length > 1 ? bufferObject.length : 0 ) ); event.preventDefault(); } return; + case keyCode.RIGHT: bufferObject = this.buffer[ position.begin ]; if ( bufferObject && bufferObject.length > 1 ) { From 4bcc41cb5bd122cb45414d20702494219f409b1a Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Wed, 14 Sep 2011 06:09:46 -0500 Subject: [PATCH 037/107] Mask: fixing some more bugs in the key events --- ui/jquery.ui.mask.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ui/jquery.ui.mask.js b/ui/jquery.ui.mask.js index 04e6fb65945..aee221fe041 100644 --- a/ui/jquery.ui.mask.js +++ b/ui/jquery.ui.mask.js @@ -191,7 +191,7 @@ $.widget( "ui.mask", { this._paint(); event.preventDefault(); } - position = this._seekLeft( bufferObject.start ); + position = this._seekLeft( bufferObject ? bufferObject.start : position.begin ); bufferObject = this.buffer[ position ]; if ( bufferObject && bufferObject.length > 1 ) { this._caret( bufferObject.start, bufferObject.start + ( bufferObject && bufferObject.length > 1 ? bufferObject.length : 0 ) ); @@ -206,7 +206,9 @@ $.widget( "ui.mask", { this._paint(); event.preventDefault(); } - position = this._seekRight( bufferObject.start + bufferObject.length - 1 ); + position = this._seekRight( bufferObject ? + bufferObject.start + bufferObject.length - 1 : + position.end ); bufferObject = this.buffer[ position ]; if ( bufferObject && bufferObject.length > 1 ) { this._caret( position, position + ( bufferObject && bufferObject.length > 1 ? bufferObject.length : 0 ) ); From c7fce88720ba78d76ae5bbd7bd73bcef50b1d813 Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Wed, 14 Sep 2011 07:07:45 -0500 Subject: [PATCH 038/107] Timepicker: First draft of functionality --- tests/unit/timepicker/timepicker.html | 1 + tests/visual/timepicker/timepicker.html | 4 + ui/jquery.ui.timepicker.js | 115 +++++++++++++++++++++++- 3 files changed, 119 insertions(+), 1 deletion(-) diff --git a/tests/unit/timepicker/timepicker.html b/tests/unit/timepicker/timepicker.html index ef3b0992cdc..d989b2dacc0 100644 --- a/tests/unit/timepicker/timepicker.html +++ b/tests/unit/timepicker/timepicker.html @@ -9,6 +9,7 @@ + diff --git a/tests/visual/timepicker/timepicker.html b/tests/visual/timepicker/timepicker.html index 677aa53f1bb..25277355255 100644 --- a/tests/visual/timepicker/timepicker.html +++ b/tests/visual/timepicker/timepicker.html @@ -7,11 +7,13 @@ + + + + +
      + Phone Number: (999) 999-9999
      +
      + +
      + +

      A few simple masks

      + +
      + + + + + diff --git a/demos/mask/functiondefinition.html b/demos/mask/functiondefinition.html new file mode 100644 index 00000000000..a9ef4f69695 --- /dev/null +++ b/demos/mask/functiondefinition.html @@ -0,0 +1,93 @@ + + + + + jQuery UI Mask - Function Definition Demo + + + + + + + + + + + +
      + Date: Format: yyyy/mm/dd
      +
      + +
      + +

      An example of using functions to define new mask definitions. These definitions are "multiple character" fields that allow us to have a date formatted input that validates.

      + +
      + + + + + diff --git a/demos/mask/index.html b/demos/mask/index.html new file mode 100644 index 00000000000..73d98e6125b --- /dev/null +++ b/demos/mask/index.html @@ -0,0 +1,18 @@ + + + + + jQuery UI Mask Demos + + + + + + diff --git a/demos/mask/regulardefinition.html b/demos/mask/regulardefinition.html new file mode 100644 index 00000000000..18dc91b77cb --- /dev/null +++ b/demos/mask/regulardefinition.html @@ -0,0 +1,41 @@ + + + + + jQuery UI Mask - Regular Expressions Demo + + + + + + + + + + + +
      + Lens Perscription: Format: ~9.99 ~9.99 999
      +
      + +
      + +

      An example of using a regular expression to define a new mask definition. Using the definitions option we define the ~ in the mask to only accept a + or a -.

      + +
      + + + + + From b230414b6fe07cda59fcb22ca00a4e55c4b12058 Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Thu, 27 Oct 2011 23:35:28 -0500 Subject: [PATCH 078/107] Mask: Don't interfere with the natural behavior of shift+arrows --- ui/jquery.ui.mask.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ui/jquery.ui.mask.js b/ui/jquery.ui.mask.js index 735bae23065..974a2446da9 100644 --- a/ui/jquery.ui.mask.js +++ b/ui/jquery.ui.mask.js @@ -179,6 +179,11 @@ $.widget( "ui.mask", { key = event.keyCode, position = this._caret(); + if ( event.shiftKey || event.metaKey || event.altKey || event.ctrlKey ) { + return; + } + + switch ( key ) { case keyCode.ESCAPE: this.element.val( this.lastUnsavedValue ); From 45d6cb5f0e924b13ea699f93f0c4f9af3fd70dad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=CC=88rn=20Zaefferer?= Date: Fri, 18 Nov 2011 17:16:03 +0100 Subject: [PATCH 079/107] Remove method argument from _super and _superApply. --- ui/jquery.ui.mask.js | 4 ++-- ui/jquery.ui.timepicker.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ui/jquery.ui.mask.js b/ui/jquery.ui.mask.js index 974a2446da9..124609be199 100644 --- a/ui/jquery.ui.mask.js +++ b/ui/jquery.ui.mask.js @@ -59,14 +59,14 @@ $.widget( "ui.mask", { }, _setOption: function( key, value ) { - this._super( "_setOption", key, value ); + this._super( key, value ); if ( key === "mask" ) { this._parseMask(); this._parseValue(); } }, _setOptions: function( options ) { - this._super( "_setOptions", options ); + this._super( options ); this._paint(); }, diff --git a/ui/jquery.ui.timepicker.js b/ui/jquery.ui.timepicker.js index ac4907a60b9..3b13b4ee965 100644 --- a/ui/jquery.ui.timepicker.js +++ b/ui/jquery.ui.timepicker.js @@ -224,7 +224,7 @@ $.widget( "ui.timepicker", { var currentValue = this.value(); // change the option - this._super( "_setOptions", options ); + this._super( options ); // update the mask, all of the option changes have a chance of changing it this.element.mask( "option", "mask", this._generateMask() ); From 9c1991abca5364188859a0ff6e0d9749bd7dce40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=CC=88rn=20Zaefferer?= Date: Thu, 24 Nov 2011 11:34:33 +0100 Subject: [PATCH 080/107] Upgrade jQuery to 1.7.1. --- demos/mask/default.html | 4 ++-- demos/mask/functiondefinition.html | 10 +++++----- demos/mask/regulardefinition.html | 4 ++-- tests/unit/mask/all.html | 2 +- tests/unit/timepicker/all.html | 2 +- tests/unit/timepicker/timepicker.html | 2 +- tests/visual/mask/mask.html | 4 ++-- tests/visual/timepicker/timepicker.html | 2 +- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/demos/mask/default.html b/demos/mask/default.html index aeb9bb42c14..023cd687b06 100644 --- a/demos/mask/default.html +++ b/demos/mask/default.html @@ -4,7 +4,7 @@ jQuery UI Mask - Simple Mask Demo - + @@ -17,7 +17,7 @@ }); diff --git a/demos/mask/functiondefinition.html b/demos/mask/functiondefinition.html index a9ef4f69695..b2ee5fef1ce 100644 --- a/demos/mask/functiondefinition.html +++ b/demos/mask/functiondefinition.html @@ -4,18 +4,18 @@ jQuery UI Mask - Function Definition Demo - + diff --git a/demos/mask/regulardefinition.html b/demos/mask/regulardefinition.html index 18dc91b77cb..eb40eb05dd8 100644 --- a/demos/mask/regulardefinition.html +++ b/demos/mask/regulardefinition.html @@ -4,7 +4,7 @@ jQuery UI Mask - Regular Expressions Demo - + @@ -20,7 +20,7 @@ }); diff --git a/tests/unit/mask/all.html b/tests/unit/mask/all.html index 4c569556b1d..d73a9591205 100644 --- a/tests/unit/mask/all.html +++ b/tests/unit/mask/all.html @@ -4,7 +4,7 @@ jQuery UI Mask Test Suite - + diff --git a/tests/unit/timepicker/all.html b/tests/unit/timepicker/all.html index 7570190aa83..8201a708be0 100644 --- a/tests/unit/timepicker/all.html +++ b/tests/unit/timepicker/all.html @@ -4,7 +4,7 @@ jQuery UI Timepicker Test Suite - + diff --git a/tests/unit/timepicker/timepicker.html b/tests/unit/timepicker/timepicker.html index e67e6e0dc0a..ff9f1ab27f2 100644 --- a/tests/unit/timepicker/timepicker.html +++ b/tests/unit/timepicker/timepicker.html @@ -6,7 +6,7 @@ - + diff --git a/tests/visual/mask/mask.html b/tests/visual/mask/mask.html index 34f6448029f..eb262a38818 100644 --- a/tests/visual/mask/mask.html +++ b/tests/visual/mask/mask.html @@ -4,7 +4,7 @@ Mask Visual Test: Default - + @@ -48,7 +48,7 @@ } } }); - + function sixty( value ) { value = parseInt( value, 10 ); if ( value >= 0 || value <= 59 ) { diff --git a/tests/visual/timepicker/timepicker.html b/tests/visual/timepicker/timepicker.html index c544a9a7a0b..51fa67e2922 100644 --- a/tests/visual/timepicker/timepicker.html +++ b/tests/visual/timepicker/timepicker.html @@ -4,7 +4,7 @@ Timepicker Visual Test: Default - + From e3db34b0d958df1c743b143861b8aabd8088d9e9 Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Fri, 3 Aug 2012 16:27:00 -0500 Subject: [PATCH 081/107] Mask: Bringing branch up to date with master --- tests/unit/mask/all.html | 6 +- tests/unit/mask/mask.html | 2 +- .../mask/{mask_defaults.js => mask_common.js} | 2 +- tests/unit/mask/mask_events.js | 66 ++++++----- tests/unit/mask/mask_options.js | 6 +- tests/unit/mask/mask_test_helpers.js | 89 +++++++-------- tests/unit/timepicker/all.html | 6 +- tests/unit/timepicker/timepicker.html | 4 +- ...icker_defaults.js => timepicker_common.js} | 2 +- tests/unit/timepicker/timepicker_events.js | 18 +-- tests/unit/timepicker/timepicker_methods.js | 2 +- .../timepicker/timepicker_test_helpers.js | 103 +++++++++--------- tests/visual/mask/mask.html | 5 +- tests/visual/timepicker/timepicker.html | 5 +- ui/jquery.ui.mask.js | 2 +- ui/jquery.ui.timepicker.js | 2 +- 16 files changed, 167 insertions(+), 153 deletions(-) rename tests/unit/mask/{mask_defaults.js => mask_common.js} (87%) rename tests/unit/timepicker/{timepicker_defaults.js => timepicker_common.js} (68%) diff --git a/tests/unit/mask/all.html b/tests/unit/mask/all.html index d73a9591205..46690c4c787 100644 --- a/tests/unit/mask/all.html +++ b/tests/unit/mask/all.html @@ -4,12 +4,12 @@ jQuery UI Mask Test Suite - + - + - + + - diff --git a/tests/unit/mask/mask_defaults.js b/tests/unit/mask/mask_common.js similarity index 87% rename from tests/unit/mask/mask_defaults.js rename to tests/unit/mask/mask_common.js index 31488d388ee..c5d4cd0a00a 100644 --- a/tests/unit/mask/mask_defaults.js +++ b/tests/unit/mask/mask_common.js @@ -1,4 +1,4 @@ -commonWidgetTests( "mask", { +TestHelpers.commonWidgetTests( "mask", { defaults: { clearEmpty: true, definitions: { diff --git a/tests/unit/mask/mask_events.js b/tests/unit/mask/mask_events.js index 8877659a63d..48c3723b4a4 100644 --- a/tests/unit/mask/mask_events.js +++ b/tests/unit/mask/mask_events.js @@ -2,7 +2,7 @@ module( "mask: events" ); -test( "focus: Initial Caret Positioning", function() { +test( "focus: Initial Caret Positioning", 4, function() { var input = $( "#mask1" ).val("").mask({ mask: "9", clearEmpty: false @@ -10,13 +10,13 @@ test( "focus: Initial Caret Positioning", function() { mask = input.data( "mask" ); equal( input.val(), "_", "Initial Value Expected" ); - focus( input ); + TestHelpers.focus( input ); deepEqual( mask._caret(), { begin: 0, end: 0 }, "Caret position correct"); - blur( input ); + TestHelpers.blur( input ); input.mask( "option", "mask", "(9)" ); equal( input.val(), "(_)", "Initial Value Expected" ); - focus( input ); + TestHelpers.focus( input ); deepEqual( mask._caret(), { begin: 1, end: 1 }, "Caret position correct"); }); @@ -27,7 +27,7 @@ test( "keydown: Backspace pulls values from right", function() { mask = input.data( "mask" ); - focus( input ); + TestHelpers.focus( input ); equal( input.val(), "123", "Initial Value Expected" ); mask._caret( 2 ); @@ -66,7 +66,7 @@ test( "keydown: Backspace with the cursor to the right of a mask literal", funct var input = $( "#mask1" ).val("123").mask({ mask: "9-99" }), mask = input.data( "mask" ); - focus( input ); + TestHelpers.focus( input ); equal( input.val(), "1-23", "Initial Value Expected" ); mask._caret( 2 ); @@ -88,7 +88,7 @@ test( "keydown: Backspace with multiple values higlighted", function() { var input = $( "#mask1" ).val("1234567890").mask({ mask: "(999)999-9999" }), mask = input.data( "mask" ); - focus( input ); + TestHelpers.focus( input ); equal( input.val(), "(123)456-7890", "Initial Value Expected" ); mask._caret( 5, 8 ); @@ -102,11 +102,11 @@ test( "keypress: Typing with multiple values higlighted", function() { var input = $( "#mask1" ).val("1234567890").mask({ mask: "(999)999-9999" }), mask = input.data( "mask" ); - focus( input ); + TestHelpers.focus( input ); equal( input.val(), "(123)456-7890", "Initial Value Expected" ); mask._caret( 5, 8 ); - press( input, "0" ); + TestHelpers.press( input, "0" ); equal( input.val(), "(123)078-90__", "Deleted three highlighted values, pulled values from right" ); deepEqual( mask._caret(), { begin: 6, end: 6 }, "Caret position correct"); }); @@ -123,44 +123,52 @@ test( "keypress: Typing with multi-character fields", function() { }), mask = input.data( "mask" ); - focus( input ); + TestHelpers.focus( input ); equal( input.val(), "__-__-__", "Initial Value Expected" ); mask._caret( 0 ); - press( input, "0" ); + TestHelpers.press( input, "0" ); equal( input.val(), "0_-__-__", "typed a 0" ); deepEqual( mask._caret(), { begin: 1, end: 1 }, "Caret position correct"); - press( input, "z" ); + TestHelpers.press( input, "z" ); equal( input.val(), "0z-__-__", "typed a z" ); deepEqual( mask._caret(), { begin: 3, end: 5 }, "Caret position correct"); }); test( "keypress: Typing with multi-character only accepts valid values", function() { expect( 8 ); - var input = $( "#mask1" ).val("").mask({ + var input = $( "#mask1" ).val( "" ).mask({ mask: "aa-aa-aa", definitions: { aa: function( value ) { - if ( !value.length ) return; - if ( value.charAt( 0 ) == "_" ) return; - if ( value.length == 1 ) return value+value; - if ( value.charAt( 0 ) == value.charAt( 1 ) ) return value; + if ( !value.length ) { + return; + } + if ( value.charAt( 0 ) === "_" ) { + return; + } + if ( value.length === 1 ) { + return value+value; + } + if ( value.charAt( 0 ) === value.charAt( 1 ) ) { + return value; + } } } }), mask = input.data( "mask" ); - focus( input ); + TestHelpers.focus( input ); equal( input.val(), "__-__-__", "Initial Value Expected" ); deepEqual( mask._caret(), { begin: 0, end: 2 }, "Caret position correct"); - press( input, "0" ); + TestHelpers.press( input, "0" ); equal( input.val(), "0_-__-__", "typed a 0" ); deepEqual( mask._caret(), { begin: 1, end: 1 }, "Caret position correct"); - press( input, "z" ); + TestHelpers.press( input, "z" ); equal( input.val(), "0_-__-__", "typed a z, wasn't allowed" ); deepEqual( mask._caret(), { begin: 1, end: 1 }, "Caret position correct"); - press( input, "0" ); + TestHelpers.press( input, "0" ); equal( input.val(), "00-__-__", "typed a 0, was allowed" ); deepEqual( mask._caret(), { begin: 3, end: 5 }, "Caret position correct"); }); @@ -171,7 +179,7 @@ test( "keydown: Delete pulling values", function() { var input = $( "#mask1" ).val("123").mask({ mask: "9-99" }), mask = input.data( "mask" ); - focus( input ); + TestHelpers.focus( input ); equal( input.val(), "1-23", "Initial value expected" ); mask._caret( 1 ); @@ -227,10 +235,10 @@ test( "keydown: escape returns to original value", function() { mask = input.data( "mask" ); equal( input.val(), "6", "Initial value expected" ); - focus( input ); + TestHelpers.focus( input ); mask._caret( 0 ); - press( input, "1" ); + TestHelpers.press( input, "1" ); equal( input.val(), "1", "Typed over" ); input.simulate( "keydown", { keyCode: $.ui.keyCode.ESCAPE }); @@ -246,15 +254,15 @@ test( "keypress: typing behaviors", function() { }), mask = input.data( "mask" ); - focus( input ); + TestHelpers.focus( input ); equal( input.val(), "_-_", "Initial value expected" ); mask._caret( 0 ); - press( input, "1" ); + TestHelpers.press( input, "1" ); equal( input.val(), "1-_", "Typed a 1" ); mask._caret( 0 ); - press( input, "2" ); + TestHelpers.press( input, "2" ); equal( input.val(), "2-1", "Typed a 2 before the 1" ); deepEqual( mask._caret(), { begin: 2, end: 2 }, "Caret position correct"); @@ -262,11 +270,11 @@ test( "keypress: typing behaviors", function() { equal( input.val(), "_-_", "Initial value expected" ); mask._caret( 0 ); - press( input, "1" ); + TestHelpers.press( input, "1" ); equal( input.val(), "1-_", "Typed a 1" ); mask._caret( 0 ); - press( input, "2" ); + TestHelpers.press( input, "2" ); equal( input.val(), "2-_", "Typed a 2 before the 1 - 1 is lost because not valid" ); deepEqual( mask._caret(), { begin: 2, end: 2 }, "Caret position correct"); }); diff --git a/tests/unit/mask/mask_options.js b/tests/unit/mask/mask_options.js index b4ac8889734..e3bcebdbf28 100644 --- a/tests/unit/mask/mask_options.js +++ b/tests/unit/mask/mask_options.js @@ -12,9 +12,9 @@ test( "clearEmpty", function() { mask = input.data( "mask" ); equal( input.val(), "", "Empty value with clearEmpty displays no mask" ); - focus( input ); + TestHelpers.focus( input ); equal( input.val(), "__/__/__", "Empty value with clearEmpty & element focus displays mask" ); - blur( input ); + TestHelpers.blur( input ); equal( input.val(), "", "Empty value with clearEmpty displays no mask after blur" ); input.mask( "option", "clearEmpty", false ); equal( input.val(), "__/__/__", "Disabling clearEmpty displays mask" ); @@ -45,7 +45,7 @@ test( "mask", function() { equal( input.val(), "(123)4__-____", "Mask changed" ); }); -test( "mask option parser", function() { +test( "mask option parser", 1, function() { var defs = { hh: function( value ) { value = parseInt( value, 10 ); diff --git a/tests/unit/mask/mask_test_helpers.js b/tests/unit/mask/mask_test_helpers.js index a9e6cd02b23..97df3800f59 100644 --- a/tests/unit/mask/mask_test_helpers.js +++ b/tests/unit/mask/mask_test_helpers.js @@ -1,45 +1,46 @@ -function press( input, key ) { - var code = key.charCodeAt( 0 ); - - input.simulate( "keypress", { - charCode: code, - which: code - }); -} - -function focus( element ) { - var triggered = false; - - function trigger() { - triggered = true; - } - - element.bind( "focus", trigger ); - element[ 0 ].focus(); - - if ( !triggered ) { - element.triggerHandler( "focus" ); - } - element.unbind( "focus", trigger ); -} - -function blur( element ) { - var triggered = false; - - function trigger() { - triggered = true; - } - - element.bind( "blur", trigger ); - element[ 0 ].blur(); - - // Some versions of IE don't actually .blur() on an element - so we focus the body - if ( element[ 0 ].ownerDocument.activeElement === element[ 0 ] ) { - element[ 0 ].ownerDocument.body.focus(); - } - - if ( !triggered ) { - element.triggerHandler( "blur" ); +jQuery.extend( TestHelpers, { + press: function( input, key ) { + var code = key.charCodeAt( 0 ); + + input.simulate( "keypress", { + charCode: code, + which: code + }); + }, + focus: function( element ) { + var triggered = false; + + function trigger() { + triggered = true; + } + + element.bind( "focus", trigger ); + element[ 0 ].focus(); + + if ( !triggered ) { + element.triggerHandler( "focus" ); + } + element.unbind( "focus", trigger ); + }, + + blur: function( element ) { + var triggered = false; + + function trigger() { + triggered = true; + } + + element.bind( "blur", trigger ); + element[ 0 ].blur(); + + // Some versions of IE don't actually .blur() on an element - so we focus the body + if ( element[ 0 ].ownerDocument.activeElement === element[ 0 ] ) { + element[ 0 ].ownerDocument.body.focus(); + } + + if ( !triggered ) { + element.triggerHandler( "blur" ); + } + element.unbind( "blur", trigger ); } - element.unbind( "blur", trigger ); -} +}); \ No newline at end of file diff --git a/tests/unit/timepicker/all.html b/tests/unit/timepicker/all.html index 8201a708be0..b4b86b3d5e8 100644 --- a/tests/unit/timepicker/all.html +++ b/tests/unit/timepicker/all.html @@ -4,12 +4,12 @@ jQuery UI Timepicker Test Suite - + - + - + + @@ -21,8 +21,8 @@ + - diff --git a/tests/unit/timepicker/timepicker_defaults.js b/tests/unit/timepicker/timepicker_common.js similarity index 68% rename from tests/unit/timepicker/timepicker_defaults.js rename to tests/unit/timepicker/timepicker_common.js index a8ab4086613..133f57e53e3 100644 --- a/tests/unit/timepicker/timepicker_defaults.js +++ b/tests/unit/timepicker/timepicker_common.js @@ -1,4 +1,4 @@ -commonWidgetTests( "timepicker", { +TestHelpers.commonWidgetTests( "timepicker", { defaults: { ampm: true, disabled: false, diff --git a/tests/unit/timepicker/timepicker_events.js b/tests/unit/timepicker/timepicker_events.js index 9e011b854d6..9aec325430f 100644 --- a/tests/unit/timepicker/timepicker_events.js +++ b/tests/unit/timepicker/timepicker_events.js @@ -15,31 +15,31 @@ test( "keydown: Up/Down/Left/Right behaviors", function() { timepicker._setField( 0 ); deepEqual( mask._caret(), { begin: 0, end: 0 }, "Caret position correct" ); - downup( input, $.ui.keyCode.UP ); + TestHelpers.downup( input, $.ui.keyCode.UP ); equal( input.val(), " 1:00:00 PM", "After up keypress in hours field, value went to proper value" ); - downup( input, $.ui.keyCode.DOWN ); + TestHelpers.downup( input, $.ui.keyCode.DOWN ); equal( input.val(), "12:00:00 PM", "After down keypress in hours field, value went to proper value" ); - downup( input, $.ui.keyCode.DOWN ); + TestHelpers.downup( input, $.ui.keyCode.DOWN ); equal( input.val(), "11:00:00 PM", "After down keypress in hours field, value went to proper value" ); deepEqual( mask._caret(), { begin: 0, end: 2 }, "Caret position selects hours" ); - downup( input, $.ui.keyCode.RIGHT ); + TestHelpers.downup( input, $.ui.keyCode.RIGHT ); deepEqual( mask._caret(), { begin: 3, end: 5 }, "After Right - Caret position selects minutes" ); for ( i = 0; i < 10; i++ ) { - downup( input, $.ui.keyCode.DOWN ); + TestHelpers.downup( input, $.ui.keyCode.DOWN ); } equal( input.val(), "11:50:00 PM", "After 10 down keypress in minutes field, value went to proper value" ); - downup( input, $.ui.keyCode.RIGHT ); + TestHelpers.downup( input, $.ui.keyCode.RIGHT ); deepEqual( mask._caret(), { begin: 6, end: 8 }, "After Right - Caret position selects seconds" ); - downup( input, $.ui.keyCode.RIGHT ); + TestHelpers.downup( input, $.ui.keyCode.RIGHT ); deepEqual( mask._caret(), { begin: 9, end: 11 }, "After Right - Caret position selects am/pm" ); - downup( input, $.ui.keyCode.DOWN ); + TestHelpers.downup( input, $.ui.keyCode.DOWN ); equal( input.val(), "11:50:00 AM", "After down keypress in am/pm field, value went to proper value" ); input.timepicker( "destroy" ).val( "23:00:00" ).timepicker({ ampm: false }); @@ -47,7 +47,7 @@ test( "keydown: Up/Down/Left/Right behaviors", function() { timepicker._setField( 0 ); equal( input.val(), "23:00:00", "Sanity Check" ); - downup( input, $.ui.keyCode.UP ); + TestHelpers.downup( input, $.ui.keyCode.UP ); equal( input.val(), " 0:00:00", "After up keypress in hours field, value went to proper value" ); diff --git a/tests/unit/timepicker/timepicker_methods.js b/tests/unit/timepicker/timepicker_methods.js index dbc45c7f8ac..391f4b301f6 100644 --- a/tests/unit/timepicker/timepicker_methods.js +++ b/tests/unit/timepicker/timepicker_methods.js @@ -3,7 +3,7 @@ module( "timepicker: methods" ); test( "value - get and set value", function() { - expect( ); + expect( 3 ); var i, input = $( "#timepicker1" ).val( "12:00:00 AM" ).timepicker(); diff --git a/tests/unit/timepicker/timepicker_test_helpers.js b/tests/unit/timepicker/timepicker_test_helpers.js index d0b7cfcb047..ae5eac7addd 100644 --- a/tests/unit/timepicker/timepicker_test_helpers.js +++ b/tests/unit/timepicker/timepicker_test_helpers.js @@ -1,51 +1,54 @@ -// helper funciton to quick "press" a key - keydown/keyup -function downup( element, key ) { - element.simulate( "keydown", { keyCode: key } ); - element.simulate( "keyup", { keyCode: key } ); -} - -function press( element, key ) { - var code = key.charCodeAt( 0 ); - - element.simulate( "keypress", { - charCode: code, - which: code - }); -} - -function focus( element ) { - var triggered = false; - - function trigger() { - triggered = true; +jQuery.extend( TestHelpers, { + // helper funciton to quick "press" a key - keydown/keyup + downup: function( element, key ) { + element.simulate( "keydown", { keyCode: key } ); + element.simulate( "keyup", { keyCode: key } ); + }, + + press: function( element, key ) { + var code = key.charCodeAt( 0 ); + + element.simulate( "keypress", { + charCode: code, + which: code + }); + }, + + focus: function( element ) { + var triggered = false; + + function trigger() { + triggered = true; + } + + element.bind( "focus", trigger ); + element[ 0 ].focus(); + + if ( !triggered ) { + element.triggerHandler( "focus" ); + } + element.unbind( "focus", trigger ); + }, + + blur: function( element ) { + var triggered = false; + + function trigger() { + triggered = true; + } + + element.bind( "blur", trigger ); + element[ 0 ].blur(); + + // Some versions of IE don't actually .blur() on an element - so we focus the body + if ( element[ 0 ].ownerDocument.activeElement === element[ 0 ] ) { + element[ 0 ].ownerDocument.body.focus(); + } + + if ( !triggered ) { + element.triggerHandler( "blur" ); + } + element.unbind( "blur", trigger ); } - - element.bind( "focus", trigger ); - element[ 0 ].focus(); - - if ( !triggered ) { - element.triggerHandler( "focus" ); - } - element.unbind( "focus", trigger ); -} - -function blur( element ) { - var triggered = false; - - function trigger() { - triggered = true; - } - - element.bind( "blur", trigger ); - element[ 0 ].blur(); - - // Some versions of IE don't actually .blur() on an element - so we focus the body - if ( element[ 0 ].ownerDocument.activeElement === element[ 0 ] ) { - element[ 0 ].ownerDocument.body.focus(); - } - - if ( !triggered ) { - element.triggerHandler( "blur" ); - } - element.unbind( "blur", trigger ); -} + +}); diff --git a/tests/visual/mask/mask.html b/tests/visual/mask/mask.html index eb262a38818..d32b0baa309 100644 --- a/tests/visual/mask/mask.html +++ b/tests/visual/mask/mask.html @@ -1,10 +1,11 @@ + Mask Visual Test: Default - + @@ -80,7 +81,7 @@ - + diff --git a/tests/visual/timepicker/timepicker.html b/tests/visual/timepicker/timepicker.html index 51fa67e2922..64b304b7764 100644 --- a/tests/visual/timepicker/timepicker.html +++ b/tests/visual/timepicker/timepicker.html @@ -1,11 +1,12 @@ + Timepicker Visual Test: Default - - + + diff --git a/ui/jquery.ui.mask.js b/ui/jquery.ui.mask.js index 124609be199..06389100325 100644 --- a/ui/jquery.ui.mask.js +++ b/ui/jquery.ui.mask.js @@ -32,7 +32,7 @@ $.widget( "ui.mask", { this._parseMask(); this.refresh(); this.element.addClass( "ui-mask" ); - this._bind( this._events ); + this._on( this._events ); }, _destroy: function() { diff --git a/ui/jquery.ui.timepicker.js b/ui/jquery.ui.timepicker.js index 3b13b4ee965..1cd7bbe68c9 100644 --- a/ui/jquery.ui.timepicker.js +++ b/ui/jquery.ui.timepicker.js @@ -73,7 +73,7 @@ $.widget( "ui.timepicker", { } }); this._setField( 0 ); - this._bind( this._events ); + this._on( this._events ); }, _destroy: function() { this.element.mask( "destroy" ); From 76db764c28e84ad8950f9f6ac0ab86ed2ace2f11 Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Tue, 7 Aug 2012 13:18:05 -0500 Subject: [PATCH 082/107] Mask: making sure fields are reformated as you leave them in multi character input --- tests/unit/mask/mask_core.js | 10 +++++++--- tests/unit/mask/mask_events.js | 18 ++++++++++++++---- ui/jquery.ui.mask.js | 9 ++++++--- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/tests/unit/mask/mask_core.js b/tests/unit/mask/mask_core.js index 1a417461673..d95120112d4 100644 --- a/tests/unit/mask/mask_core.js +++ b/tests/unit/mask/mask_core.js @@ -12,8 +12,7 @@ test( "masked inputs get the '.ui-mask' class", function() { ok( !input.is( ".ui-mask" ), "destroy clears masked class" ); }); -test( "_caret() can move and read the text cursor", function() { - expect( 3 ); +test( "_caret() can move and read the text cursor", 4, function() { var input = $( "#mask1" ).val("1234").mask({ mask: "9999" @@ -21,13 +20,18 @@ test( "_caret() can move and read the text cursor", function() { instance = input.data( "mask" ); focus( input ); - instance._caret( 0 ); deepEqual( instance._caret(), { begin: 0, end: 0 }, "Caret position set to 0 results in 0, 0" ); + instance._caret( 1 ); + deepEqual( instance._caret(), { + begin: 1, + end: 1 + }, "Caret position set 1 results in 1, 1" ); + instance._caret( 5 ); deepEqual( instance._caret(), { begin: 4, diff --git a/tests/unit/mask/mask_events.js b/tests/unit/mask/mask_events.js index 48c3723b4a4..880d13b0318 100644 --- a/tests/unit/mask/mask_events.js +++ b/tests/unit/mask/mask_events.js @@ -136,7 +136,7 @@ test( "keypress: Typing with multi-character fields", function() { }); test( "keypress: Typing with multi-character only accepts valid values", function() { - expect( 8 ); + expect( 12 ); var input = $( "#mask1" ).val( "" ).mask({ mask: "aa-aa-aa", definitions: { @@ -147,8 +147,8 @@ test( "keypress: Typing with multi-character only accepts valid values", functio if ( value.charAt( 0 ) === "_" ) { return; } - if ( value.length === 1 ) { - return value+value; + if ( value.charAt( 1 ) === "-" || value.length === 1 ) { + return value.charAt(0) + value.charAt( 0 ); } if ( value.charAt( 0 ) === value.charAt( 1 ) ) { return value; @@ -162,17 +162,27 @@ test( "keypress: Typing with multi-character only accepts valid values", functio equal( input.val(), "__-__-__", "Initial Value Expected" ); deepEqual( mask._caret(), { begin: 0, end: 2 }, "Caret position correct"); + TestHelpers.press( input, "0" ); equal( input.val(), "0_-__-__", "typed a 0" ); deepEqual( mask._caret(), { begin: 1, end: 1 }, "Caret position correct"); + TestHelpers.press( input, "z" ); equal( input.val(), "0_-__-__", "typed a z, wasn't allowed" ); deepEqual( mask._caret(), { begin: 1, end: 1 }, "Caret position correct"); + TestHelpers.press( input, "0" ); equal( input.val(), "00-__-__", "typed a 0, was allowed" ); deepEqual( mask._caret(), { begin: 3, end: 5 }, "Caret position correct"); -}); + TestHelpers.press( input, "1" ); + equal( input.val(), "00-1_-__", "typed a 1, was allowed" ); + deepEqual( mask._caret(), { begin: 4, end: 4 }, "Caret position correct"); + + TestHelpers.press( input, "-" ); + equal( input.val(), "00-11-__", "typed a 1, was replaced with correct value" ); + deepEqual( mask._caret(), { begin: 6, end: 8 }, "Caret position correct"); +}); test( "keydown: Delete pulling values", function() { expect( 18 ); diff --git a/ui/jquery.ui.mask.js b/ui/jquery.ui.mask.js index 06389100325..e10f2901caa 100644 --- a/ui/jquery.ui.mask.js +++ b/ui/jquery.ui.mask.js @@ -236,7 +236,7 @@ $.widget( "ui.mask", { } }, keypress: function( event ) { - var tempValue, + var tempValue, valid, key = event.which, position = this._caret(), bufferPosition = this._seekRight( position.begin - 1 ), @@ -257,14 +257,17 @@ $.widget( "ui.mask", { bufferObject.value.substr( bufferPosition - bufferObject.start + 1 ); tempValue = tempValue.substr( 0, bufferObject.length ); } - if ( this._validValue( bufferObject, tempValue ) ) { + valid = this._validValue( bufferObject, tempValue ); + if ( valid ) { this._shiftRight( position.begin ); bufferObject.value = tempValue; - this._paint(); position = this._seekRight( bufferPosition ); if ( position <= bufferObject.start + bufferObject.length ) { + this._paint(); this._caret( position ); } else { + bufferObject.value = valid; + this._paint(); this._caretSelect( position ); } } From 371146999b9465f3538f7a97bf3e1b8e05f4be79 Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Tue, 7 Aug 2012 13:25:51 -0500 Subject: [PATCH 083/107] Mask: Handle backspacing when in an already deleted field --- tests/unit/mask/mask_events.js | 38 ++++++++++++++++++++++++++++++++++ ui/jquery.ui.mask.js | 17 ++++++++++++++- 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/tests/unit/mask/mask_events.js b/tests/unit/mask/mask_events.js index 880d13b0318..21ba054fe9d 100644 --- a/tests/unit/mask/mask_events.js +++ b/tests/unit/mask/mask_events.js @@ -184,6 +184,44 @@ test( "keypress: Typing with multi-character only accepts valid values", functio deepEqual( mask._caret(), { begin: 6, end: 8 }, "Caret position correct"); }); +test( "keypress: Backspace with multi-character ", 6, function() { + var input = $( "#mask1" ).val( "aa-bb-cc" ).mask({ + mask: "aa-aa-aa", + definitions: { + aa: function( value ) { + if ( !value.length ) { + return; + } + if ( value.charAt( 0 ) === "_" ) { + return; + } + if ( value.length === 1 ) { + return value+value; + } + if ( value.charAt( 0 ) === value.charAt( 1 ) ) { + return value; + } + } + } + }), + mask = input.data( "mask" ); + + TestHelpers.focus( input ); + equal( input.val(), "aa-bb-cc", "Initial Value Expected" ); + mask._caret( 6, 8 ); + + deepEqual( mask._caret(), { begin: 6, end: 8 }, "Caret position correct"); + + input.simulate( "keydown", { keyCode: $.ui.keyCode.BACKSPACE }); + equal( input.val(), "aa-bb-__", "Deleted Value Expected" ); + deepEqual( mask._caret(), { begin: 6, end: 8 }, "Caret position correct"); + + input.simulate( "keydown", { keyCode: $.ui.keyCode.BACKSPACE }); + equal( input.val(), "aa-__-__", "Deleted Value Expected" ); + deepEqual( mask._caret(), { begin: 3, end: 5 }, "Caret position correct"); + +}); + test( "keydown: Delete pulling values", function() { expect( 18 ); var input = $( "#mask1" ).val("123").mask({ mask: "9-99" }), diff --git a/ui/jquery.ui.mask.js b/ui/jquery.ui.mask.js index e10f2901caa..5597f1acabc 100644 --- a/ui/jquery.ui.mask.js +++ b/ui/jquery.ui.mask.js @@ -197,7 +197,7 @@ $.widget( "ui.mask", { // if the caret is not "selecting" values, we need to find the proper // character in the buffer to delete/backspace over. - if ( position.begin === position.end ) { + if ( position.begin === position.end || this._isEmpty( position.begin, position.end ) ) { if ( key === keyCode.DELETE ) { position.begin = position.end = this._seekRight( position.begin - 1 ); } else { @@ -277,6 +277,21 @@ $.widget( "ui.mask", { paste: "_paste", input: "_paste" }, + _isEmpty: function( begin, end ) { + var index; + if ( begin === undefined ) { + begin = 0; + end = this.buffer.length - 1; + } else if ( end === undefined ) { + end = begin; + } + for ( index = begin; index <= end; index++ ) { + if ( this.buffer[ index ] && this.buffer[ index ].value ) { + return false; + } + } + return true; + }, _paste: function(event) { this._delay( function() { var position = this._parseValue(); From 3f90530664bf3fa8db789755b9887ea9f89dc6c1 Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Tue, 4 Sep 2012 14:39:06 -0500 Subject: [PATCH 084/107] Adding mask/timepicker to swarm for mask branch --- build/tasks/testswarm.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build/tasks/testswarm.js b/build/tasks/testswarm.js index 46f152e7f46..f64208eab9e 100644 --- a/build/tasks/testswarm.js +++ b/build/tasks/testswarm.js @@ -18,6 +18,7 @@ var versions = { //"draggable/draggable.html", //"droppable/droppable.html", "Effects": "effects/effects.html", + "Mask": "mask/mask.html", "Menu": "menu/menu.html", "Position": "position/position.html", "Position_deprecated": "position/position_deprecated.html", @@ -29,6 +30,7 @@ var versions = { "Spinner": "spinner/spinner.html", "Tabs": "tabs/tabs.html", "Tabs_deprecated": "tabs/tabs_deprecated.html", + "Timepicker": "timepicker/timepicker.html", "Tooltip": "tooltip/tooltip.html", "Widget": "widget/widget.html" }; From 38931cf7d1d9f1037abc213807052e08c102007a Mon Sep 17 00:00:00 2001 From: Zach Shepherd Date: Mon, 15 Oct 2012 11:52:04 -0400 Subject: [PATCH 085/107] mask/timepicker: use jquery files from tests directory, which actually exist --- tests/visual/mask/mask.html | 4 ++-- tests/visual/timepicker/timepicker.html | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/visual/mask/mask.html b/tests/visual/mask/mask.html index d32b0baa309..ed7f55f864c 100644 --- a/tests/visual/mask/mask.html +++ b/tests/visual/mask/mask.html @@ -5,7 +5,7 @@ Mask Visual Test: Default - + @@ -85,4 +85,4 @@ - \ No newline at end of file + diff --git a/tests/visual/timepicker/timepicker.html b/tests/visual/timepicker/timepicker.html index 64b304b7764..9548d5495c5 100644 --- a/tests/visual/timepicker/timepicker.html +++ b/tests/visual/timepicker/timepicker.html @@ -5,7 +5,7 @@ Timepicker Visual Test: Default - + @@ -58,4 +58,4 @@ - \ No newline at end of file + From dd0b0b60ef534a9e24815edcc1bba018fc332db1 Mon Sep 17 00:00:00 2001 From: Zach Shepherd Date: Mon, 15 Oct 2012 13:41:08 -0400 Subject: [PATCH 086/107] mask: update demos following merge --- demos/mask/default.html | 2 +- demos/mask/functiondefinition.html | 2 +- demos/mask/index.html | 1 - demos/mask/regulardefinition.html | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/demos/mask/default.html b/demos/mask/default.html index 023cd687b06..0409b145ea6 100644 --- a/demos/mask/default.html +++ b/demos/mask/default.html @@ -4,7 +4,7 @@ jQuery UI Mask - Simple Mask Demo - + diff --git a/demos/mask/functiondefinition.html b/demos/mask/functiondefinition.html index b2ee5fef1ce..3266f903a1b 100644 --- a/demos/mask/functiondefinition.html +++ b/demos/mask/functiondefinition.html @@ -4,7 +4,7 @@ jQuery UI Mask - Function Definition Demo - + diff --git a/demos/mask/index.html b/demos/mask/index.html index 73d98e6125b..c860d9ddfc2 100644 --- a/demos/mask/index.html +++ b/demos/mask/index.html @@ -3,7 +3,6 @@ jQuery UI Mask Demos -
      diff --git a/demos/mask/regulardefinition.html b/demos/mask/regulardefinition.html index eb40eb05dd8..9dcd226acbf 100644 --- a/demos/mask/regulardefinition.html +++ b/demos/mask/regulardefinition.html @@ -4,7 +4,7 @@ jQuery UI Mask - Regular Expressions Demo - + From 9d038dd60b2fdda442cd4bbfe984e95b4353affe Mon Sep 17 00:00:00 2001 From: Zach Shepherd Date: Mon, 15 Oct 2012 12:09:48 -0400 Subject: [PATCH 087/107] Mask: fix bug in visual test case --- tests/visual/mask/mask.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/visual/mask/mask.html b/tests/visual/mask/mask.html index ed7f55f864c..5bcc6679871 100644 --- a/tests/visual/mask/mask.html +++ b/tests/visual/mask/mask.html @@ -28,7 +28,7 @@ definitions: { hh: function( value ) { value = parseInt( value, 10 ); - if ( value >= 1 || value <= 12 ) { + if ( value >= 1 && value <= 12 ) { return ( value < 10 ? "0" : "" ) + value; } }, @@ -52,7 +52,7 @@ function sixty( value ) { value = parseInt( value, 10 ); - if ( value >= 0 || value <= 59 ) { + if ( value >= 0 && value <= 59 ) { return ( value < 10 ? "0" : "" ) + value; } } From 26c18642135df237fa60e06f328d6c3bb9ef8850 Mon Sep 17 00:00:00 2001 From: Zach Shepherd Date: Mon, 15 Oct 2012 12:42:34 -0400 Subject: [PATCH 088/107] Mask: add visual display of field's value and validity in visual test case --- tests/visual/mask/mask.html | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/visual/mask/mask.html b/tests/visual/mask/mask.html index 5bcc6679871..06e9b2cd204 100644 --- a/tests/visual/mask/mask.html +++ b/tests/visual/mask/mask.html @@ -50,6 +50,16 @@ } }); + $("input").each(function( index, value ) { + var span = $(""); + + value = $(value); + value.after(span); + value.keyup(function(event) { + span.text("Value: " + $(event.target).mask('value') + " Valid: " + $(event.target).mask('valid')); + }); + }); + function sixty( value ) { value = parseInt( value, 10 ); if ( value >= 0 && value <= 59 ) { From 74f44396b5a5f37fee8c77532cd05f33399c5546 Mon Sep 17 00:00:00 2001 From: Zach Shepherd Date: Mon, 15 Oct 2012 15:19:43 -0400 Subject: [PATCH 089/107] Mask: fix isValid logic; previously, any call to getValue(true) resulted in isValid being set to true --- ui/jquery.ui.mask.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/ui/jquery.ui.mask.js b/ui/jquery.ui.mask.js index 5597f1acabc..c4d09acbbfa 100644 --- a/ui/jquery.ui.mask.js +++ b/ui/jquery.ui.mask.js @@ -124,8 +124,8 @@ $.widget( "ui.mask", { this.isEmpty = this.isValid = true; for ( bufferPosition = 0; bufferPosition < bufferLength; bufferPosition += bufferObject.length ) { bufferObject = this.buffer[ bufferPosition ]; - if ( bufferObject.literal && !raw ) { - if ( bufferPosition < this.optionalPosition || this.isValid ) { + if ( bufferObject.literal ) { + if ( !raw && bufferPosition < this.optionalPosition || this.isValid ) { value += bufferObject.literal; } } else if ( bufferObject.value ) { @@ -135,9 +135,11 @@ $.widget( "ui.mask", { for ( counter = bufferObject.value.length; counter < bufferObject.length; counter++ ) { value += this.options.placeholder; } - } else if ( !raw ) { - for ( counter = bufferObject.length ; counter; counter-- ) { - value += this.options.placeholder; + } else { + if ( !raw ) { + for ( counter = bufferObject.length ; counter; counter-- ) { + value += this.options.placeholder; + } } if ( bufferPosition < this.optionalPosition ) { this.isValid = false; From 2a0385908a4643de57636eee5578b1fbcdeae5d5 Mon Sep 17 00:00:00 2001 From: Zach Shepherd Date: Mon, 15 Oct 2012 15:20:03 -0400 Subject: [PATCH 090/107] Mask: add visual test for removing an invalid value on blur This change adds a test for the functionality to remove an invalid value on blur as described in section 3 of http://wiki.jqueryui.com/w/page/12137996/Mask: Removing an incomplete value can be done by binding to the regular blur event, checking !mask("valid"), then using .val("") to clear the input. --- tests/visual/mask/mask.html | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/tests/visual/mask/mask.html b/tests/visual/mask/mask.html index 06e9b2cd204..571c2bebc0e 100644 --- a/tests/visual/mask/mask.html +++ b/tests/visual/mask/mask.html @@ -13,17 +13,22 @@ $(function() { $( "#mask1" ).mask({ mask: "99/99/9999" }); $( "#mask2" ).mask({ mask: "(999) 999-9999" }); - $( "#mask3" ).mask({ mask: "(999) 999-9999?x999999" }); - $( "#mask4" ).mask({ mask: "99-9999999", clearEmpty: false }); - $( "#mask5" ).mask({ mask: "999-99-9999", clearEmpty: false }); - $( "#mask6" ).mask({ mask: "a*-999-a999" }); - $( "#mask7" ).mask({ + $( "#mask3" ).mask({ mask: "(999) 999-9999" }).change(function(event) { + if (!$(event.target).mask("valid")) { + $(event.target).val("") + } + });; + $( "#mask4" ).mask({ mask: "(999) 999-9999?x999999" }); + $( "#mask5" ).mask({ mask: "99-9999999", clearEmpty: false }); + $( "#mask6" ).mask({ mask: "999-99-9999", clearEmpty: false }); + $( "#mask7" ).mask({ mask: "a*-999-a999" }); + $( "#mask8" ).mask({ mask: "~9.99 ~9.99 999", definitions: { "~": /\+|-/ } }); - $( "#mask8" ).mask({ + $( "#mask9" ).mask({ mask: "hh:mm:ss pp", definitions: { hh: function( value ) { @@ -81,18 +86,20 @@ - + - + - + - + - + - + + + From dab7f29580e0bb5578d95b7483c6f8bcf86dbf88 Mon Sep 17 00:00:00 2001 From: Zach Shepherd Date: Mon, 15 Oct 2012 16:10:32 -0400 Subject: [PATCH 091/107] Mask: fix focus-related test bug which causes false-negatives in Chrome --- tests/unit/mask/mask_core.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/mask/mask_core.js b/tests/unit/mask/mask_core.js index d95120112d4..c9d8410a6b6 100644 --- a/tests/unit/mask/mask_core.js +++ b/tests/unit/mask/mask_core.js @@ -19,7 +19,7 @@ test( "_caret() can move and read the text cursor", 4, function() { }), instance = input.data( "mask" ); - focus( input ); + input.focus(); instance._caret( 0 ); deepEqual( instance._caret(), { begin: 0, From 8cca5e5f94876e1f274401d17b9b51f1ec0d9e34 Mon Sep 17 00:00:00 2001 From: Zach Shepherd Date: Mon, 15 Oct 2012 16:15:42 -0400 Subject: [PATCH 092/107] Mask: fix bug in raw-value-retrieval logic --- ui/jquery.ui.mask.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/jquery.ui.mask.js b/ui/jquery.ui.mask.js index c4d09acbbfa..2885c1496d7 100644 --- a/ui/jquery.ui.mask.js +++ b/ui/jquery.ui.mask.js @@ -125,7 +125,7 @@ $.widget( "ui.mask", { for ( bufferPosition = 0; bufferPosition < bufferLength; bufferPosition += bufferObject.length ) { bufferObject = this.buffer[ bufferPosition ]; if ( bufferObject.literal ) { - if ( !raw && bufferPosition < this.optionalPosition || this.isValid ) { + if ( !raw && ( bufferPosition < this.optionalPosition || this.isValid ) ) { value += bufferObject.literal; } } else if ( bufferObject.value ) { From 3f23f5e0bc73f00224fd3094a5d8fe8d12ee042b Mon Sep 17 00:00:00 2001 From: Zach Shepherd Date: Tue, 16 Oct 2012 09:42:41 -0400 Subject: [PATCH 093/107] Mask: add unit tests for optional section --- tests/unit/mask/mask_methods.js | 19 +++++++++++++++++++ tests/unit/mask/mask_options.js | 9 +++++++++ 2 files changed, 28 insertions(+) diff --git a/tests/unit/mask/mask_methods.js b/tests/unit/mask/mask_methods.js index ca2c7c5480e..daf964e32b7 100644 --- a/tests/unit/mask/mask_methods.js +++ b/tests/unit/mask/mask_methods.js @@ -25,6 +25,25 @@ test( "value: able to get (and set) raw values", function() { equal( input.mask( "value" ), "123456", "Raw value read correctly" ); }); +test( "value: able to get (and set) raw values with optional section", function() { + expect( 5 ); + var input = $( "#mask1" ).val("1234").mask({ + mask: "(999) 999-9999?x9999", + }); + + equal( input.mask('value'), "1234", "Reading initial value" ); + + input.mask( "value", "123456" ); + + equal( input.val(), "(123) 456-____", "Raw value set properly" ); + equal( input.mask( "value" ), "123456", "Raw value read correctly" ); + + input.mask( "value", "12345678901234" ); + + equal( input.val(), "(123) 456-7890x1234", "Raw value with optional set properly" ); + equal( input.mask( "value" ), "12345678901234", "Raw value read correctly" ); +}); + test( "valid: returns true when all required placeholders are filled", function() { expect( 2 ); var input = $( "#mask1" ).mask({ diff --git a/tests/unit/mask/mask_options.js b/tests/unit/mask/mask_options.js index e3bcebdbf28..49ce9e61a03 100644 --- a/tests/unit/mask/mask_options.js +++ b/tests/unit/mask/mask_options.js @@ -45,6 +45,15 @@ test( "mask", function() { equal( input.val(), "(123)4__-____", "Mask changed" ); }); +test( "mask with optional input", function() { + expect( 1 ); + var input = $( "#mask1" ).val("1234").mask({ + mask: "(999) 999-9999?x9999", + }); + + equal( input.val(), "(123) 4__-____", "Initial value" ); +}); + test( "mask option parser", 1, function() { var defs = { hh: function( value ) { From 5cacdcaebe1363c6434eae21f8c78925b5e11254 Mon Sep 17 00:00:00 2001 From: Zach Shepherd Date: Tue, 16 Oct 2012 10:31:33 -0400 Subject: [PATCH 094/107] Mask: use setTimeout to work around Chrome caret positioning issue --- ui/jquery.ui.mask.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/ui/jquery.ui.mask.js b/ui/jquery.ui.mask.js index 2885c1496d7..4fac395517f 100644 --- a/ui/jquery.ui.mask.js +++ b/ui/jquery.ui.mask.js @@ -80,7 +80,16 @@ $.widget( "ui.mask", { if ( begin !== undefined ) { end = ( end === undefined ) ? begin : end; if ( dom.setSelectionRange ) { - dom.setSelectionRange( begin, end ); + /* Chrome fires off the focus events before positioning the + cursor based on where the user clicked. This is annoying + because, in the case of tyring to position the cursor at + the beginning of an empty input, the eventual positioning + based on the user's click overrides whatever we do here. + There's no good fix for this except to wait until the + click processesing resolves and _then_ reposition things. */ + setTimeout(function(){ + dom.setSelectionRange( begin, end ); + }, /* yes, zero is long enough */ 0); } else if ( dom.createTextRange ) { range = dom.createTextRange(); range.collapse( true ); From 9d768f6cff189cab41d6de03f272726f93fe768d Mon Sep 17 00:00:00 2001 From: Zach Shepherd Date: Tue, 16 Oct 2012 10:31:33 -0400 Subject: [PATCH 095/107] Mask: address Chrome timing issue in qunit-friendly way --- ui/jquery.ui.mask.js | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/ui/jquery.ui.mask.js b/ui/jquery.ui.mask.js index 4fac395517f..62ec592dd72 100644 --- a/ui/jquery.ui.mask.js +++ b/ui/jquery.ui.mask.js @@ -80,16 +80,7 @@ $.widget( "ui.mask", { if ( begin !== undefined ) { end = ( end === undefined ) ? begin : end; if ( dom.setSelectionRange ) { - /* Chrome fires off the focus events before positioning the - cursor based on where the user clicked. This is annoying - because, in the case of tyring to position the cursor at - the beginning of an empty input, the eventual positioning - based on the user's click overrides whatever we do here. - There's no good fix for this except to wait until the - click processesing resolves and _then_ reposition things. */ - setTimeout(function(){ - dom.setSelectionRange( begin, end ); - }, /* yes, zero is long enough */ 0); + dom.setSelectionRange( begin, end ); } else if ( dom.createTextRange ) { range = dom.createTextRange(); range.collapse( true ); @@ -174,8 +165,25 @@ $.widget( "ui.mask", { this.lastUnsavedValue = this.element.val(); this._paint( true ); this._caretSelect( this._seekRight( this._parseValue() ) ); + + this._justFocused = true; + this._delay(function(){ + this._justFocused = false; + }, 100); + }, + click: function( event ) { + /* Normally, the call to handle this in the focus event handler would be + sufficient, but Chrome fires the focus events before positioning the + cursor based on where the user clicked (and then fires the click event). */ + + // We only want to move the caret on clicks that resulted in focus + if ( this._justFocused ) { + this._caretSelect( this._seekRight( this._parseValue() ) ); + this._justFocused = false; + } }, blur: function( event ) { + this._justFocused = false; // because we are constantly setting the value of the input, the change event // never fires - we re-introduce the change event here From 2d5ed8e5247d13e5ec563c906ad751228dd59fe3 Mon Sep 17 00:00:00 2001 From: Zach Shepherd Date: Wed, 17 Oct 2012 08:32:20 -0400 Subject: [PATCH 096/107] Mask: fix visual test to bind to blur as stated in the test's textual description --- tests/visual/mask/mask.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/visual/mask/mask.html b/tests/visual/mask/mask.html index 571c2bebc0e..25ee1f75577 100644 --- a/tests/visual/mask/mask.html +++ b/tests/visual/mask/mask.html @@ -13,7 +13,7 @@ $(function() { $( "#mask1" ).mask({ mask: "99/99/9999" }); $( "#mask2" ).mask({ mask: "(999) 999-9999" }); - $( "#mask3" ).mask({ mask: "(999) 999-9999" }).change(function(event) { + $( "#mask3" ).mask({ mask: "(999) 999-9999" }).blur(function(event) { if (!$(event.target).mask("valid")) { $(event.target).val("") } From 26b70dfd216ff3189b0634666c90ed441d1a4f3b Mon Sep 17 00:00:00 2001 From: Zach Shepherd Date: Tue, 16 Oct 2012 17:19:46 -0400 Subject: [PATCH 097/107] Mask: Add support for '<...>' placeholders --- tests/unit/mask/mask_options.js | 35 +++++++++++++++++++++++++++++++++ tests/visual/mask/mask.html | 31 +++++++++++++++++++++++++++++ ui/jquery.ui.mask.js | 34 +++++++++++++++++++++++++++++++- 3 files changed, 99 insertions(+), 1 deletion(-) diff --git a/tests/unit/mask/mask_options.js b/tests/unit/mask/mask_options.js index 49ce9e61a03..de3f80fd104 100644 --- a/tests/unit/mask/mask_options.js +++ b/tests/unit/mask/mask_options.js @@ -54,6 +54,41 @@ test( "mask with optional input", function() { equal( input.val(), "(123) 4__-____", "Initial value" ); }); +test( "custom mask with wrapper", function() { + expect( 1 ); + var input = $( "#mask1" ).val("monA0").mask({ + mask: ":a:", + definitions: { + day: function ( value ) { + if ( $.inArray(value, ["mon", "tue", "wed", "thu", "fri", "sat", "sun"]) ) { + return value; + } else if ($.inArray(value, ["m", "mo"])) { + return "mon"; + } else if (value === "t") { + return "t"; + } else if (value === "tu") { + return "tue"; + } else if (value === "thu") { + return "thu"; + } else if ($.inArray(value, ["w", "we"])) { + return "wed"; + } else if ($.inArray(value, ["f", "fr"])) { + return "fri"; + } else if (value === "s") { + return "s"; + } else if (value === "sa") { + return "sat"; + } else if (value === "su") { + return "sun"; + } + }, + d: /[0-9]/ + } + }); + + equal( input.val(), "mon:A:0", "Initial value" ); +}); + test( "mask option parser", 1, function() { var defs = { hh: function( value ) { diff --git a/tests/visual/mask/mask.html b/tests/visual/mask/mask.html index 25ee1f75577..42ef508bed4 100644 --- a/tests/visual/mask/mask.html +++ b/tests/visual/mask/mask.html @@ -54,6 +54,35 @@ } } }); + var input = $( "#mask10" ).mask({ + mask: "day", + definitions: { + day: function ( value ) { + if ( $.inArray(value, ["mon", "tue", "wed", "thu", "fri", "sat", "sun"]) !== -1 ) { + return value; + } else if ( $.inArray(value, ["m", "mo"]) !== -1 ) { + return "mon"; + } else if ( value === "t" ) { + return "t"; + } else if ( value === "tu" ) { + return "tue"; + } else if ( value === "thu" ) { + return "thu"; + } else if ( $.inArray(value, ["w", "we"]) !== -1 ) { + return "wed"; + } else if ( $.inArray(value, ["f", "fr"]) !== -1 ) { + return "fri"; + } else if ( value === "s" ) { + return "s"; + } else if ( value === "sa" ) { + return "sat"; + } else if ( value === "su" ) { + return "sun"; + } + }, + d: /[0-9]/ + } + }); $("input").each(function( index, value ) { var span = $(""); @@ -100,6 +129,8 @@ + + diff --git a/ui/jquery.ui.mask.js b/ui/jquery.ui.mask.js index 62ec592dd72..804dc4bdec9 100644 --- a/ui/jquery.ui.mask.js +++ b/ui/jquery.ui.mask.js @@ -325,7 +325,7 @@ $.widget( "ui.mask", { this.element.val( this._getValue( false, focused ) ); }, _parseMask: function() { - var key, x, bufferObject, optionalPosition, + var key, x, bufferObject, optionalPosition, builder, index = -1, options = this.options, mask = options.mask; @@ -344,6 +344,38 @@ $.widget( "ui.mask", { // remove the ? from the mask mask = mask.substr( 0, optionalPosition ) + mask.substr( optionalPosition + 1 ); } + + // search for strictly definied "masks" + for ( x = 0 ; x < mask.length ; x++ ) { + if ( mask.charAt(x) === "<" ) { + index = x; + for ( ; x < mask.length ; x++ ) { + if ( mask.charAt(x) === ">" ) { + key = mask.substring( index + 1 , x ); + if ( $.inArray( key, options.definitions ) ) { + bufferObject = { + start: index, + length: key.length, + valid: options.definitions[ key ] + }; + for ( x = index ; x < index + key.length ; x++ ) { + this.buffer[ x ] = bufferObject; + } + } + // "zero" the range + builder = mask.substring( 0, index ); + index++; + for ( x = index; x < index + key.length; x++ ) { + builder += " "; + } + mask = builder + mask.substring( x + 1 ); + x--; + break; + } + } + } + } + // search for definied "masks" for ( key in options.definitions ) { while ( ( index = mask.indexOf( key, index + 1 ) ) > -1 ) { From 14a8967af9c1d44e1ad32c727b61e57a44828841 Mon Sep 17 00:00:00 2001 From: Zach Shepherd Date: Tue, 16 Oct 2012 15:51:19 -0400 Subject: [PATCH 098/107] Timepicker: use proposed syntax --- tests/unit/timepicker/timepicker.html | 2 +- ui/jquery.ui.timepicker.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/unit/timepicker/timepicker.html b/tests/unit/timepicker/timepicker.html index 707a2bc2672..4a416a77b2d 100644 --- a/tests/unit/timepicker/timepicker.html +++ b/tests/unit/timepicker/timepicker.html @@ -6,7 +6,7 @@ - + diff --git a/ui/jquery.ui.timepicker.js b/ui/jquery.ui.timepicker.js index 1cd7bbe68c9..515200ec6f5 100644 --- a/ui/jquery.ui.timepicker.js +++ b/ui/jquery.ui.timepicker.js @@ -174,8 +174,8 @@ $.widget( "ui.timepicker", { // minimal calendar object for timepicker return { patterns: { - t: "h:mm tt", - T: "h:mm:ss tt" + t: ": ", + T: ":: " }, AM: [ "AM", "am" ], PM: [ "PM", "pm" ] @@ -188,7 +188,7 @@ $.widget( "ui.timepicker", { mask = mask.replace( formatNonPaddedHours, "_$1" ); if ( !this.options.ampm ) { - mask = mask.replace( format12Hour, "H" ).replace( " tt", "" ); + mask = mask.replace( format12Hour, "H" ).replace( / ?/, "" ); } return mask; From f6e5c2dab378cecaa2efbb1f35df544e29e52abb Mon Sep 17 00:00:00 2001 From: Zach Shepherd Date: Thu, 18 Oct 2012 22:24:21 -0400 Subject: [PATCH 099/107] Mask: remove 'aa' defininitions from event test cases for simplicity --- tests/unit/mask/mask_events.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/unit/mask/mask_events.js b/tests/unit/mask/mask_events.js index 21ba054fe9d..8afa84833e5 100644 --- a/tests/unit/mask/mask_events.js +++ b/tests/unit/mask/mask_events.js @@ -114,9 +114,9 @@ test( "keypress: Typing with multiple values higlighted", function() { test( "keypress: Typing with multi-character fields", function() { expect( 5 ); var input = $( "#mask1" ).val("").mask({ - mask: "aa-aa-aa", + mask: "xx-xx-xx", definitions: { - aa: function( value ) { + xx: function( value ) { return value; } } @@ -138,9 +138,9 @@ test( "keypress: Typing with multi-character fields", function() { test( "keypress: Typing with multi-character only accepts valid values", function() { expect( 12 ); var input = $( "#mask1" ).val( "" ).mask({ - mask: "aa-aa-aa", + mask: "xx-xx-xx", definitions: { - aa: function( value ) { + xx: function( value ) { if ( !value.length ) { return; } @@ -186,9 +186,9 @@ test( "keypress: Typing with multi-character only accepts valid values", functio test( "keypress: Backspace with multi-character ", 6, function() { var input = $( "#mask1" ).val( "aa-bb-cc" ).mask({ - mask: "aa-aa-aa", + mask: "xx-xx-xx", definitions: { - aa: function( value ) { + xx: function( value ) { if ( !value.length ) { return; } From e880b345e2e66a81415d0a387ca8577d92dac336 Mon Sep 17 00:00:00 2001 From: Zach Shepherd Date: Thu, 18 Oct 2012 22:26:17 -0400 Subject: [PATCH 100/107] Mask: add test cases for masks with multiple optional inputs and escaped characters --- tests/unit/mask/mask_options.js | 61 ++++++++++++++++++++++++--------- tests/visual/mask/mask.html | 21 ++++++------ 2 files changed, 55 insertions(+), 27 deletions(-) diff --git a/tests/unit/mask/mask_options.js b/tests/unit/mask/mask_options.js index de3f80fd104..1a87ebd328a 100644 --- a/tests/unit/mask/mask_options.js +++ b/tests/unit/mask/mask_options.js @@ -4,7 +4,7 @@ module( "mask: options" ); test( "clearEmpty", function() { expect( 4 ); - var input = $( "#mask1" ).val("").mask({ + var input = $( "#mask1" ).val( "" ).mask({ mask: "99/99/99", placeholder: "_", clearEmpty: true @@ -35,7 +35,7 @@ test( "placeholder", function() { test( "mask", function() { expect( 2 ); - var input = $( "#mask1" ).val("1234").mask({ + var input = $( "#mask1" ).val( "1234" ).mask({ mask: "99/99/99", placeholder: "_" }); @@ -47,38 +47,65 @@ test( "mask", function() { test( "mask with optional input", function() { expect( 1 ); - var input = $( "#mask1" ).val("1234").mask({ + var input = $( "#mask1" ).val( "1234" ).mask({ mask: "(999) 999-9999?x9999", }); equal( input.val(), "(123) 4__-____", "Initial value" ); }); -test( "custom mask with wrapper", function() { +test( "mask with multiple optional inputs", function() { expect( 1 ); - var input = $( "#mask1" ).val("monA0").mask({ - mask: ":a:", + var input = $( "#mask1" ).val( "1234" ).mask({ + mask: "(999) 999-9999?x9?9?9?9", + }); + + equal( input.val(), "(123) 4__-____", "Initial value" ); +}); + +test( "mask with escaped characters", function() { + expect( 1 ); + var input = $( "#mask1" ).val( "1234" ).mask({ + mask: "(\\9\\9\\9)\\\\ 999-99\\a\\*\\?x9999", + }); + + equal( input.val(), "(999)\\ 123-4_a*?x____", "Initial value" ); +}); + +test( "escaped use of custom mask with wrapper ", function() { + expect( 1 ); + var input = $( "#mask1" ).val( "1" ).mask({ + mask: "9\\", + }); + + equal( input.val(), "1", "Initial value" ); +}); + +test( "custom mask with wrapper and escape", function() { + expect( 1 ); + var input = $( "#mask1" ).val( "monA0" ).mask({ + mask: ":a\\?:?x", definitions: { day: function ( value ) { - if ( $.inArray(value, ["mon", "tue", "wed", "thu", "fri", "sat", "sun"]) ) { + if ( $.inArray(value, [ "mon", "tue", "wed", "thu", "fri", "sat", "sun" ]) ) { return value; - } else if ($.inArray(value, ["m", "mo"])) { + } else if ( $.inArray(value, [ "m", "mo" ])) { return "mon"; - } else if (value === "t") { + } else if ( value === "t" ) { return "t"; - } else if (value === "tu") { + } else if ( value === "tu" ) { return "tue"; - } else if (value === "thu") { + } else if ( value === "thu" ) { return "thu"; - } else if ($.inArray(value, ["w", "we"])) { + } else if ( $.inArray(value, [ "w", "we" ]) ) { return "wed"; - } else if ($.inArray(value, ["f", "fr"])) { + } else if ( $.inArray(value, [ "f", "fr" ]) ) { return "fri"; - } else if (value === "s") { + } else if ( value === "s" ) { return "s"; - } else if (value === "sa") { + } else if ( value === "sa" ) { return "sat"; - } else if (value === "su") { + } else if ( value === "su" ) { return "sun"; } }, @@ -86,7 +113,7 @@ test( "custom mask with wrapper", function() { } }); - equal( input.val(), "mon:A:0", "Initial value" ); + equal( input.val(), "mon:A?:0", "Initial value" ); }); test( "mask option parser", 1, function() { diff --git a/tests/visual/mask/mask.html b/tests/visual/mask/mask.html index 42ef508bed4..a4031ad887b 100644 --- a/tests/visual/mask/mask.html +++ b/tests/visual/mask/mask.html @@ -58,9 +58,9 @@ mask: "day", definitions: { day: function ( value ) { - if ( $.inArray(value, ["mon", "tue", "wed", "thu", "fri", "sat", "sun"]) !== -1 ) { + if ( $.inArray(value, [ "mon", "tue", "wed", "thu", "fri", "sat", "sun" ]) !== -1 ) { return value; - } else if ( $.inArray(value, ["m", "mo"]) !== -1 ) { + } else if ( $.inArray(value, [ "m", "mo" ]) !== -1 ) { return "mon"; } else if ( value === "t" ) { return "t"; @@ -68,9 +68,9 @@ return "tue"; } else if ( value === "thu" ) { return "thu"; - } else if ( $.inArray(value, ["w", "we"]) !== -1 ) { + } else if ( $.inArray(value, [ "w", "we" ]) !== -1 ) { return "wed"; - } else if ( $.inArray(value, ["f", "fr"]) !== -1 ) { + } else if ( $.inArray(value, [ "f", "fr" ]) !== -1 ) { return "fri"; } else if ( value === "s" ) { return "s"; @@ -84,13 +84,14 @@ } }); - $("input").each(function( index, value ) { - var span = $(""); + $( "input" ).each(function( index, value ) { + var span = $( "" ); - value = $(value); - value.after(span); - value.keyup(function(event) { - span.text("Value: " + $(event.target).mask('value') + " Valid: " + $(event.target).mask('valid')); + value = $( value ); + value.after( span ); + value.keyup(function( event ) { + span.text( "Value: " + $( event.target ).mask("value") + + " Valid: " + $( event.target ).mask("valid") ); }); }); From a1d4d9b073f52dce51e994aab2b1729c08faed01 Mon Sep 17 00:00:00 2001 From: Zach Shepherd Date: Thu, 18 Oct 2012 22:29:35 -0400 Subject: [PATCH 101/107] Mask: add support for escaped characters and processes additional optional markers --- ui/jquery.ui.mask.js | 123 ++++++++++++++++++++++++++++++------------- 1 file changed, 86 insertions(+), 37 deletions(-) diff --git a/ui/jquery.ui.mask.js b/ui/jquery.ui.mask.js index 804dc4bdec9..60835de6af0 100644 --- a/ui/jquery.ui.mask.js +++ b/ui/jquery.ui.mask.js @@ -20,9 +20,9 @@ $.widget( "ui.mask", { options: { clearEmpty: true, definitions: { - '9': /[0-9]/, - 'a': /[A-Za-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]/, - '*': /[A-Za-z0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]/ + "9": /[0-9]/, + "a": /[A-Za-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]/, + "*": /[A-Za-z0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]/ }, mask: null, placeholder: "_" @@ -324,25 +324,83 @@ $.widget( "ui.mask", { } this.element.val( this._getValue( false, focused ) ); }, + _addBuffer: function( bufferObject ) { + var x, + begin = bufferObject.start, + end = bufferObject.start + bufferObject.length; + + for ( x = begin; x < end; x++ ) { + if ( this.buffer[ x ] !== undefined ) { + return false; + } + } + + for ( x = begin; x < end; x++ ) { + this.buffer[ x ] = bufferObject; + } + + return true; + }, + _removeCharacter: function( mask, index ) { + var x, bufferObject; + + for ( x = index ; x < mask.length - 1 ; x++ ) { + bufferObject = this.buffer[ x + 1 ]; + this.buffer[ x ] = bufferObject; + if ( bufferObject !== undefined ) { + bufferObject.start = bufferObject.start - 1; + x += bufferObject.length - 1; + } + } + this.buffer.splice( x, 1 ); + + if ( this.optionalPosition > index ) { + this.optionalPosition--; + } + + return mask.substring( 0, index ) + mask.substring( index + 1 ); + }, _parseMask: function() { var key, x, bufferObject, optionalPosition, builder, index = -1, options = this.options, - mask = options.mask; + mask = options.mask, + reservedChars = [ "a", "9", "*", "?", "<", ">", "\\" ]; this.buffer = []; if ( !mask ) { return; } - optionalPosition = mask.indexOf( "?" ); - if ( optionalPosition === -1 ) { - this.optionalPosition = mask.length; - } else { - this.optionalPosition = optionalPosition; + // search for escaped reserved characters + for ( index = 0 ; index < mask.length - 1 ; index++ ) { + if ( mask.charAt( index ) === "\\" && + $.inArray( mask.charAt( index + 1 ), reservedChars ) !== -1 ) { + // remove escape character + mask = mask.substring( 0, index ) + mask.substring( index + 1 ); - // remove the ? from the mask - mask = mask.substr( 0, optionalPosition ) + mask.substr( optionalPosition + 1 ); + this._addBuffer({ + start: index, + literal: mask.charAt( index ), + length: 1 + }); + } + } + // locate unescaped optional markers ; use attention to the first, remove all others + optionalPosition = -1; + this.optionalPosition = undefined; + while ( ( optionalPosition = mask.indexOf( "?", optionalPosition + 1 ) ) > -1 ) { + if ( this.buffer[ optionalPosition ] === undefined ) { + if ( this.optionalPosition === undefined ) { + this.optionalPosition = optionalPosition; + } + + // remove the ? from the mask + mask = this._removeCharacter( mask, optionalPosition ); + } + } + if ( this.optionalPosition === undefined ) { + this.optionalPosition = mask.length; } // search for strictly definied "masks" @@ -352,24 +410,19 @@ $.widget( "ui.mask", { for ( ; x < mask.length ; x++ ) { if ( mask.charAt(x) === ">" ) { key = mask.substring( index + 1 , x ); - if ( $.inArray( key, options.definitions ) ) { - bufferObject = { - start: index, + if ( options.definitions[key] !== undefined ) { + if (this._addBuffer({ + start: index + 1, length: key.length, valid: options.definitions[ key ] - }; - for ( x = index ; x < index + key.length ; x++ ) { - this.buffer[ x ] = bufferObject; + })) { + mask = this._removeCharacter( mask, x ); + mask = this._removeCharacter( mask, index ); + for ( x = index ; x < index + key.length ; x++ ) { + mask[x] = " "; + } } } - // "zero" the range - builder = mask.substring( 0, index ); - index++; - for ( x = index; x < index + key.length; x++ ) { - builder += " "; - } - mask = builder + mask.substring( x + 1 ); - x--; break; } } @@ -377,28 +430,24 @@ $.widget( "ui.mask", { } // search for definied "masks" + index = -1; for ( key in options.definitions ) { while ( ( index = mask.indexOf( key, index + 1 ) ) > -1 ) { - bufferObject = { + this._addBuffer({ start: index, length: key.length, valid: options.definitions[ key ] - }; - for ( x = index ; x < index + key.length ; x++ ) { - this.buffer[ x ] = bufferObject; - } + }); } } // anything we didn't find is a literal for ( index = 0 ; index < mask.length ; index++ ) { - if ( !this.buffer[ index ] ) { - this.buffer[ index ] = { - start: index, - literal: mask.charAt( index ), - length: 1 - }; - } + this._addBuffer({ + start: index, + literal: mask.charAt( index ), + length: 1 + }); } }, From 54ddbf4428baa114527a95f7e5549ef3eddb4e56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Zaefferer?= Date: Sun, 4 Nov 2012 17:30:48 +0100 Subject: [PATCH 102/107] Timepicker: Use multi-version jquery.js --- tests/unit/timepicker/timepicker.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/timepicker/timepicker.html b/tests/unit/timepicker/timepicker.html index 4a416a77b2d..e8739ef7821 100644 --- a/tests/unit/timepicker/timepicker.html +++ b/tests/unit/timepicker/timepicker.html @@ -6,7 +6,7 @@ - + From 62eb6662f494d0b56ab04a36337db1d636a58eda Mon Sep 17 00:00:00 2001 From: Corey Frang Date: Mon, 12 Nov 2012 12:26:31 +0900 Subject: [PATCH 103/107] Tests: Adding links to mask and timepicker visual tests --- tests/visual/index.html | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/visual/index.html b/tests/visual/index.html index 2dfb1f1ed22..18b5de59ee7 100644 --- a/tests/visual/index.html +++ b/tests/visual/index.html @@ -42,6 +42,11 @@

      Effects

    1. Scale
    2. +

      Mask

      + +

      Menu

      +

      Timepicker

      + +

      Tooltip

      • General
      • From 4f5a83c4699f32d8b0c4ea0bcd01d6b64938bbe3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Zaefferer?= Date: Sat, 17 Nov 2012 23:26:46 +0100 Subject: [PATCH 104/107] Mask/Timepicker: Lint fixes. Units still fail. --- tests/unit/mask/mask_methods.js | 2 +- tests/unit/mask/mask_options.js | 35 ++++++++++----------- tests/unit/timepicker/timepicker_core.js | 4 +-- tests/unit/timepicker/timepicker_methods.js | 5 ++- ui/jquery.ui.mask.js | 20 ++++++------ ui/jquery.ui.timepicker.js | 4 +-- 6 files changed, 34 insertions(+), 36 deletions(-) diff --git a/tests/unit/mask/mask_methods.js b/tests/unit/mask/mask_methods.js index daf964e32b7..d10db426316 100644 --- a/tests/unit/mask/mask_methods.js +++ b/tests/unit/mask/mask_methods.js @@ -28,7 +28,7 @@ test( "value: able to get (and set) raw values", function() { test( "value: able to get (and set) raw values with optional section", function() { expect( 5 ); var input = $( "#mask1" ).val("1234").mask({ - mask: "(999) 999-9999?x9999", + mask: "(999) 999-9999?x9999" }); equal( input.mask('value'), "1234", "Reading initial value" ); diff --git a/tests/unit/mask/mask_options.js b/tests/unit/mask/mask_options.js index 1a87ebd328a..ac081a1a270 100644 --- a/tests/unit/mask/mask_options.js +++ b/tests/unit/mask/mask_options.js @@ -5,11 +5,10 @@ module( "mask: options" ); test( "clearEmpty", function() { expect( 4 ); var input = $( "#mask1" ).val( "" ).mask({ - mask: "99/99/99", - placeholder: "_", - clearEmpty: true - }), - mask = input.data( "mask" ); + mask: "99/99/99", + placeholder: "_", + clearEmpty: true + }); equal( input.val(), "", "Empty value with clearEmpty displays no mask" ); TestHelpers.focus( input ); @@ -48,7 +47,7 @@ test( "mask", function() { test( "mask with optional input", function() { expect( 1 ); var input = $( "#mask1" ).val( "1234" ).mask({ - mask: "(999) 999-9999?x9999", + mask: "(999) 999-9999?x9999" }); equal( input.val(), "(123) 4__-____", "Initial value" ); @@ -57,7 +56,7 @@ test( "mask with optional input", function() { test( "mask with multiple optional inputs", function() { expect( 1 ); var input = $( "#mask1" ).val( "1234" ).mask({ - mask: "(999) 999-9999?x9?9?9?9", + mask: "(999) 999-9999?x9?9?9?9" }); equal( input.val(), "(123) 4__-____", "Initial value" ); @@ -66,7 +65,7 @@ test( "mask with multiple optional inputs", function() { test( "mask with escaped characters", function() { expect( 1 ); var input = $( "#mask1" ).val( "1234" ).mask({ - mask: "(\\9\\9\\9)\\\\ 999-99\\a\\*\\?x9999", + mask: "(\\9\\9\\9)\\\\ 999-99\\a\\*\\?x9999" }); equal( input.val(), "(999)\\ 123-4_a*?x____", "Initial value" ); @@ -75,7 +74,7 @@ test( "mask with escaped characters", function() { test( "escaped use of custom mask with wrapper ", function() { expect( 1 ); var input = $( "#mask1" ).val( "1" ).mask({ - mask: "9\\", + mask: "9\\" }); equal( input.val(), "1", "Initial value" ); @@ -90,23 +89,23 @@ test( "custom mask with wrapper and escape", function() { if ( $.inArray(value, [ "mon", "tue", "wed", "thu", "fri", "sat", "sun" ]) ) { return value; } else if ( $.inArray(value, [ "m", "mo" ])) { - return "mon"; + return "mon"; } else if ( value === "t" ) { - return "t"; + return "t"; } else if ( value === "tu" ) { - return "tue"; + return "tue"; } else if ( value === "thu" ) { - return "thu"; + return "thu"; } else if ( $.inArray(value, [ "w", "we" ]) ) { - return "wed"; + return "wed"; } else if ( $.inArray(value, [ "f", "fr" ]) ) { - return "fri"; + return "fri"; } else if ( value === "s" ) { - return "s"; + return "s"; } else if ( value === "sa" ) { - return "sat"; + return "sat"; } else if ( value === "su" ) { - return "sun"; + return "sun"; } }, d: /[0-9]/ diff --git a/tests/unit/timepicker/timepicker_core.js b/tests/unit/timepicker/timepicker_core.js index 9609d39bb55..94654064d1e 100644 --- a/tests/unit/timepicker/timepicker_core.js +++ b/tests/unit/timepicker/timepicker_core.js @@ -1,5 +1,5 @@ -(function( $ ) { +(function() { module( "timepicker: core" ); -}( jQuery ) ); +}()); diff --git a/tests/unit/timepicker/timepicker_methods.js b/tests/unit/timepicker/timepicker_methods.js index 391f4b301f6..8678461fea0 100644 --- a/tests/unit/timepicker/timepicker_methods.js +++ b/tests/unit/timepicker/timepicker_methods.js @@ -5,8 +5,7 @@ module( "timepicker: methods" ); test( "value - get and set value", function() { expect( 3 ); - var i, - input = $( "#timepicker1" ).val( "12:00:00 AM" ).timepicker(); + var input = $( "#timepicker1" ).val( "12:00:00 AM" ).timepicker(); equal( input.timepicker( "value" ), "00:00:00", "Expected value for 12am" ); @@ -17,7 +16,7 @@ test( "value - get and set value", function() { input.timepicker( "value", "12:34:56" ); equal( input.val(), "12:34:56 PM", "Expected val() for 12:34:56" ); - + }); }( jQuery ) ); diff --git a/ui/jquery.ui.mask.js b/ui/jquery.ui.mask.js index 60835de6af0..0f3bcd7c8ca 100644 --- a/ui/jquery.ui.mask.js +++ b/ui/jquery.ui.mask.js @@ -161,7 +161,7 @@ $.widget( "ui.mask", { return value; }, _events: { - focus: function( event ) { + focus: function() { this.lastUnsavedValue = this.element.val(); this._paint( true ); this._caretSelect( this._seekRight( this._parseValue() ) ); @@ -171,10 +171,10 @@ $.widget( "ui.mask", { this._justFocused = false; }, 100); }, - click: function( event ) { - /* Normally, the call to handle this in the focus event handler would be - sufficient, but Chrome fires the focus events before positioning the - cursor based on where the user clicked (and then fires the click event). */ + click: function() { + // Normally, the call to handle this in the focus event handler would be + // sufficient, but Chrome fires the focus events before positioning the + // cursor based on where the user clicked (and then fires the click event). // We only want to move the caret on clicks that resulted in focus if ( this._justFocused ) { @@ -182,7 +182,7 @@ $.widget( "ui.mask", { this._justFocused = false; } }, - blur: function( event ) { + blur: function() { this._justFocused = false; // because we are constantly setting the value of the input, the change event @@ -311,7 +311,7 @@ $.widget( "ui.mask", { } return true; }, - _paste: function(event) { + _paste: function() { this._delay( function() { var position = this._parseValue(); this._paint(); @@ -342,7 +342,7 @@ $.widget( "ui.mask", { return true; }, _removeCharacter: function( mask, index ) { - var x, bufferObject; + var x, bufferObject; for ( x = index ; x < mask.length - 1 ; x++ ) { bufferObject = this.buffer[ x + 1 ]; @@ -361,7 +361,7 @@ $.widget( "ui.mask", { return mask.substring( 0, index ) + mask.substring( index + 1 ); }, _parseMask: function() { - var key, x, bufferObject, optionalPosition, builder, + var key, x, optionalPosition, index = -1, options = this.options, mask = options.mask, @@ -375,7 +375,7 @@ $.widget( "ui.mask", { // search for escaped reserved characters for ( index = 0 ; index < mask.length - 1 ; index++ ) { if ( mask.charAt( index ) === "\\" && - $.inArray( mask.charAt( index + 1 ), reservedChars ) !== -1 ) { + $.inArray( mask.charAt( index + 1 ), reservedChars ) !== -1 ) { // remove escape character mask = mask.substring( 0, index ) + mask.substring( index + 1 ); diff --git a/ui/jquery.ui.timepicker.js b/ui/jquery.ui.timepicker.js index 515200ec6f5..c8aab68f582 100644 --- a/ui/jquery.ui.timepicker.js +++ b/ui/jquery.ui.timepicker.js @@ -193,7 +193,7 @@ $.widget( "ui.timepicker", { return mask; }, - _highlightField: function( field ) { + _highlightField: function() { this.mask._caretSelect( this.currentField * 3 ); }, _setField: function( field ) { @@ -267,4 +267,4 @@ $.widget( "ui.timepicker", { } }); -}( jQuery )); \ No newline at end of file +}( jQuery )); From 6efbdbfc5286dd87a417bcd298dd81b245ca02a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Zaefferer?= Date: Sun, 18 Nov 2012 11:36:53 +0100 Subject: [PATCH 105/107] Mask: Update unit tests to use namespaced data property --- tests/unit/mask/mask_core.js | 4 ++-- tests/unit/mask/mask_events.js | 22 +++++++++++----------- tests/unit/mask/mask_options.js | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/tests/unit/mask/mask_core.js b/tests/unit/mask/mask_core.js index c9d8410a6b6..1b63f5145aa 100644 --- a/tests/unit/mask/mask_core.js +++ b/tests/unit/mask/mask_core.js @@ -17,7 +17,7 @@ test( "_caret() can move and read the text cursor", 4, function() { var input = $( "#mask1" ).val("1234").mask({ mask: "9999" }), - instance = input.data( "mask" ); + instance = input.data( "ui-mask" ); input.focus(); instance._caret( 0 ); @@ -102,7 +102,7 @@ test( "Default values provided by function", function() { definitions: defs }); equal( input.val(), "11", "No value was accepted, so the 'default' from the mask was provided" ); - + }); }( jQuery ) ); diff --git a/tests/unit/mask/mask_events.js b/tests/unit/mask/mask_events.js index 8afa84833e5..f524d627f82 100644 --- a/tests/unit/mask/mask_events.js +++ b/tests/unit/mask/mask_events.js @@ -7,7 +7,7 @@ test( "focus: Initial Caret Positioning", 4, function() { mask: "9", clearEmpty: false }), - mask = input.data( "mask" ); + mask = input.data( "ui-mask" ); equal( input.val(), "_", "Initial Value Expected" ); TestHelpers.focus( input ); @@ -24,7 +24,7 @@ test( "focus: Initial Caret Positioning", 4, function() { test( "keydown: Backspace pulls values from right", function() { expect( 12 ); var input = $( "#mask1" ).val("123").mask({ mask: "999" }), - mask = input.data( "mask" ); + mask = input.data( "ui-mask" ); TestHelpers.focus( input ); @@ -64,7 +64,7 @@ test( "keydown: Backspace pulls values from right", function() { test( "keydown: Backspace with the cursor to the right of a mask literal", function() { expect( 6 ); var input = $( "#mask1" ).val("123").mask({ mask: "9-99" }), - mask = input.data( "mask" ); + mask = input.data( "ui-mask" ); TestHelpers.focus( input ); equal( input.val(), "1-23", "Initial Value Expected" ); @@ -86,7 +86,7 @@ test( "keydown: Backspace with the cursor to the right of a mask literal", funct test( "keydown: Backspace with multiple values higlighted", function() { expect( 3 ); var input = $( "#mask1" ).val("1234567890").mask({ mask: "(999)999-9999" }), - mask = input.data( "mask" ); + mask = input.data( "ui-mask" ); TestHelpers.focus( input ); equal( input.val(), "(123)456-7890", "Initial Value Expected" ); @@ -100,7 +100,7 @@ test( "keydown: Backspace with multiple values higlighted", function() { test( "keypress: Typing with multiple values higlighted", function() { expect( 3 ); var input = $( "#mask1" ).val("1234567890").mask({ mask: "(999)999-9999" }), - mask = input.data( "mask" ); + mask = input.data( "ui-mask" ); TestHelpers.focus( input ); equal( input.val(), "(123)456-7890", "Initial Value Expected" ); @@ -121,7 +121,7 @@ test( "keypress: Typing with multi-character fields", function() { } } }), - mask = input.data( "mask" ); + mask = input.data( "ui-mask" ); TestHelpers.focus( input ); equal( input.val(), "__-__-__", "Initial Value Expected" ); @@ -156,7 +156,7 @@ test( "keypress: Typing with multi-character only accepts valid values", functio } } }), - mask = input.data( "mask" ); + mask = input.data( "ui-mask" ); TestHelpers.focus( input ); equal( input.val(), "__-__-__", "Initial Value Expected" ); @@ -204,7 +204,7 @@ test( "keypress: Backspace with multi-character ", 6, function() { } } }), - mask = input.data( "mask" ); + mask = input.data( "ui-mask" ); TestHelpers.focus( input ); equal( input.val(), "aa-bb-cc", "Initial Value Expected" ); @@ -225,7 +225,7 @@ test( "keypress: Backspace with multi-character ", 6, function() { test( "keydown: Delete pulling values", function() { expect( 18 ); var input = $( "#mask1" ).val("123").mask({ mask: "9-99" }), - mask = input.data( "mask" ); + mask = input.data( "ui-mask" ); TestHelpers.focus( input ); equal( input.val(), "1-23", "Initial value expected" ); @@ -280,7 +280,7 @@ test( "keydown: Delete pulling values", function() { test( "keydown: escape returns to original value", function() { expect( 3 ); var input = $( "#mask1" ).val("6").mask({ mask: "9" }), - mask = input.data( "mask" ); + mask = input.data( "ui-mask" ); equal( input.val(), "6", "Initial value expected" ); TestHelpers.focus( input ); @@ -300,7 +300,7 @@ test( "keypress: typing behaviors", function() { mask: "9-9", clearEmpty: false }), - mask = input.data( "mask" ); + mask = input.data( "ui-mask" ); TestHelpers.focus( input ); equal( input.val(), "_-_", "Initial value expected" ); diff --git a/tests/unit/mask/mask_options.js b/tests/unit/mask/mask_options.js index ac081a1a270..f651d90caeb 100644 --- a/tests/unit/mask/mask_options.js +++ b/tests/unit/mask/mask_options.js @@ -134,7 +134,7 @@ test( "mask option parser", 1, function() { mask: "hh:ss:ss.999", definitions: defs }), - instance = input.data( "mask" ); + instance = input.data( "ui-mask" ); deepEqual( instance.buffer, [ { valid: defs.hh, From 8edaf1448ed7850a95f6dc76e9fe7735b289af2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Zaefferer?= Date: Sun, 18 Nov 2012 14:27:37 +0100 Subject: [PATCH 106/107] Mask: Disable timepicker tests for phantomjs --- grunt.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grunt.js b/grunt.js index 524421be79c..96818bba719 100644 --- a/grunt.js +++ b/grunt.js @@ -281,7 +281,7 @@ grunt.initConfig({ files: grunt.file.expandFiles( "tests/unit/**/*.html" ).filter(function( file ) { // disabling everything that doesn't (quite) work with PhantomJS for now // TODO except for all|index|test, try to include more as we go - return !( /(all|index|test|dialog|tabs|tooltip)\.html$/ ).test( file ); + return !( /(all|index|test|dialog|tabs|timepicker|tooltip)\.html$/ ).test( file ); }) }, lint: { From c0bb9bee4dad2b592d939fe7cc02821212dd3baf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Zaefferer?= Date: Sun, 18 Nov 2012 23:52:48 +0100 Subject: [PATCH 107/107] Timepicker: Use namespaced data property --- tests/unit/timepicker/timepicker_events.js | 4 ++-- ui/jquery.ui.timepicker.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/unit/timepicker/timepicker_events.js b/tests/unit/timepicker/timepicker_events.js index 9aec325430f..dcedbc3f09c 100644 --- a/tests/unit/timepicker/timepicker_events.js +++ b/tests/unit/timepicker/timepicker_events.js @@ -7,7 +7,7 @@ test( "keydown: Up/Down/Left/Right behaviors", function() { var i, input = $( "#timepicker1" ).val( "12:00:00 PM" ).timepicker(), - timepicker = input.data( "timepicker" ), + timepicker = input.data( "ui-timepicker" ), mask = timepicker.mask; mask._caret( 0, 0 ); @@ -43,7 +43,7 @@ test( "keydown: Up/Down/Left/Right behaviors", function() { equal( input.val(), "11:50:00 AM", "After down keypress in am/pm field, value went to proper value" ); input.timepicker( "destroy" ).val( "23:00:00" ).timepicker({ ampm: false }); - timepicker = input.data( "timepicker" ); + timepicker = input.data( "ui-timepicker" ); timepicker._setField( 0 ); equal( input.val(), "23:00:00", "Sanity Check" ); diff --git a/ui/jquery.ui.timepicker.js b/ui/jquery.ui.timepicker.js index c8aab68f582..eb055886e43 100644 --- a/ui/jquery.ui.timepicker.js +++ b/ui/jquery.ui.timepicker.js @@ -54,9 +54,9 @@ $.widget( "ui.timepicker", { tt: $.proxy( this, "_validAmPm" ) }, maskDefinitions ) }); - this.mask = this.element.data( "mask" ); + this.mask = this.element.data( "ui-mask" ); this.element.spinner(); - this.spinner = this.element.data( "spinner" ); + this.spinner = this.element.data( "ui-spinner" ); $.extend( this.spinner, { _parse: $.proxy( this, "_spinnerParse" ), _value: $.proxy( this, "_spinnerValue" ),