r2460 - Datepicker: Fixed #3861 Manually entered date does not update altField

r2460 - Datepicker: Fixed #3861 Manually entered date does not update altField


Author: kbwood.au
Date: Thu Apr 16 03:42:04 2009
New Revision: 2460
Modified:
trunk/tests/unit/datepicker/datepicker_options.js
trunk/ui/ui.datepicker.js
Log:
Datepicker: Fixed #3861 Manually entered date does not update altField
Modified: trunk/tests/unit/datepicker/datepicker_options.js
==============================================================================
--- trunk/tests/unit/datepicker/datepicker_options.js    (original)
+++ trunk/tests/unit/datepicker/datepicker_options.js    Thu Apr 16 03:42:04
2009
@@ -452,6 +452,17 @@
    inp.simulate('keydown', {ctrlKey: true, keyCode: $.simulate.VK_END});
    equals(inp.val(), '', 'Alt field - dp - ctrl+end');
    equals(alt.val(), '', 'Alt field - alt - ctrl+end');
+    // Verify alt field is updated on keyup
+    alt.val('');
+    inp.val('06/04/2008').datepicker('show');
+    inp.simulate('keyup', {keyCode: $.simulate.VK_ENTER});
+    equals(inp.val(), '06/04/2008', 'Alt field - dp - manual entry');
+    equals(alt.val(), '2008-06-04', 'Alt field - manual entry');
+    // Verify alt field is not updated on keyup if date is invalid
+    inp.val('12/04/');
+    inp.simulate('keyup', {keyCode: $.simulate.VK_ENTER});
+    equals(inp.val(), '12/04/', 'Alt field - dp - manual entry incomplete');
+    equals(alt.val(), '2008-06-04', 'Alt field - manual entry - not updated');
});
test('daylightSaving', function() {
Modified: trunk/ui/ui.datepicker.js
==============================================================================
--- trunk/ui/ui.datepicker.js    (original)
+++ trunk/ui/ui.datepicker.js    Thu Apr 16 03:42:04 2009
@@ -198,7 +198,8 @@
                return false;
            });
        }
-        
input.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).
+        input.addClass(this.markerClassName).keydown(this._doKeyDown).
+            keypress(this._doKeyPress).keyup(this._doKeyUp).
            bind("setData.datepicker", function(event, key, value) {
                inst.settings[key] = value;
            }).bind("getData.datepicker", function(event, key) {
@@ -286,7 +287,8 @@
            $target.removeClass(this.markerClassName).
                unbind('focus', this._showDatepicker).
                unbind('keydown', this._doKeyDown).
-                unbind('keypress', this._doKeyPress);
+                unbind('keypress', this._doKeyPress).
+                unbind('keyup', this._doKeyUp);
        } else if (nodeName == 'div' || nodeName == 'span')
            $target.removeClass(this.markerClassName).empty();
    },
@@ -509,6 +511,27 @@
            var chr = String.fromCharCode(event.charCode == undefined ?
event.keyCode : event.charCode);
            return event.ctrlKey || (chr < ' ' || !chars || chars.indexOf(chr) >
-1);
        }
+    },
+
+    /* Synchronise manual entry and alternate field. */
+    _doKeyUp: function(event) {
+        var inst = $.datepicker._getInst(event.target);
+        if (!$.datepicker._get(inst, 'altField'))
+            return true;
+        try {
+            var date = $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
+                (inst.input ? inst.input.val() : null),
+                $.datepicker._getFormatConfig(inst));
+            if (date) { // only if valid
+                $.datepicker._setDateFromField(inst);
+                $.datepicker._updateAlternate(inst);
+                $.datepicker._updateDatepicker(inst);
+            }
+        }
+        catch (event) {
+            $.datepicker.log(event);
+        }
+        return true;
    },
    /* Pop-up the date picker for a given input field.