Changeset 42042
- Timestamp:
- 10/30/2017 04:39:06 PM (8 years ago)
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/wp-admin/js/customize-controls.js
r42040 r42042 5543 5543 control.invalidDate = false; 5544 5544 5545 _.bindAll( control, 'populateSetting', 'updateDaysForMonth', ' updateMinutesForHour', 'populateDateInputs' );5545 _.bindAll( control, 'populateSetting', 'updateDaysForMonth', 'populateDateInputs' ); 5546 5546 5547 5547 if ( ! control.setting ) { … … 5553 5553 component = input.data( 'component' ); 5554 5554 element = new api.Element( input ); 5555 if ( 'meridian' === component ) {5556 element.validate = function( value ) {5557 if ( 'am' !== value && 'pm' !== value ) {5558 return null;5559 }5560 return value;5561 };5562 } else {5563 element.validate = function( value ) {5564 var val = parseInt( value, 10 );5565 if ( isNaN( val ) ) {5566 return null;5567 }5568 return val;5569 };5570 }5571 element.bind( control.populateSetting );5572 5555 control.inputElements[ component ] = element; 5573 5556 control.elements.push( element ); 5557 5558 // Add invalid date error once user changes (and has blurred the input). 5559 input.on( 'change', function() { 5560 if ( control.invalidDate ) { 5561 control.notifications.add( new api.Notification( 'invalid_date', { 5562 message: api.l10n.invalidDate 5563 } ) ); 5564 } 5565 } ); 5566 5567 // Remove the error immediately after validity change. 5568 input.on( 'input', _.debounce( function() { 5569 if ( ! control.invalidDate ) { 5570 control.notifications.remove( 'invalid_date' ); 5571 } 5572 } ) ); 5574 5573 } ); 5575 5574 5576 5575 control.inputElements.month.bind( control.updateDaysForMonth ); 5577 5576 control.inputElements.year.bind( control.updateDaysForMonth ); 5578 if ( control.params.includeTime ) {5579 control.inputElements.hour.bind( control.updateMinutesForHour );5580 }5581 5577 control.populateDateInputs(); 5582 5578 control.setting.bind( control.populateDateInputs ); 5579 5580 // Start populating setting after inputs have been populated. 5581 _.each( control.inputElements, function( element ) { 5582 element.bind( control.populateSetting ); 5583 } ); 5583 5584 }, 5584 5585 … … 5630 5631 */ 5631 5632 validateInputs: function validateInputs() { 5632 var control = this, errorMessage, components;5633 var control = this, components, validityInput; 5633 5634 5634 5635 control.invalidDate = false; … … 5639 5640 } 5640 5641 5641 _.each( components, function( component ) { 5642 var element, el, max, min, value; 5642 _.find( components, function( component ) { 5643 var element, max, min, value; 5644 5645 element = control.inputElements[ component ]; 5646 validityInput = element.element.get( 0 ); 5647 max = parseInt( element.element.attr( 'max' ), 10 ); 5648 min = parseInt( element.element.attr( 'min' ), 10 ); 5649 value = parseInt( element(), 10 ); 5650 control.invalidDate = isNaN( value ) || value > max || value < min; 5643 5651 5644 5652 if ( ! control.invalidDate ) { 5645 element = control.inputElements[ component ]; 5646 el = element.element.get( 0 ); 5647 max = parseInt( element.element.attr( 'max' ), 10 ); 5648 min = parseInt( element.element.attr( 'min' ), 10 ); 5649 value = element(); 5650 control.invalidDate = value > max || value < min; 5651 errorMessage = control.invalidDate ? api.l10n.invalid + ' ' + component : ''; 5652 5653 el.setCustomValidity( errorMessage ); 5654 if ( ! control.section() || api.section.has( control.section() ) && api.section( control.section() ).expanded() ) { 5655 _.result( el, 'reportValidity' ); 5656 } 5657 } 5653 validityInput.setCustomValidity( '' ); 5654 } 5655 5656 return control.invalidDate; 5658 5657 } ); 5658 5659 if ( control.inputElements.meridian && ! control.invalidDate ) { 5660 validityInput = control.inputElements.meridian.element.get( 0 ); 5661 if ( 'am' !== control.inputElements.meridian.get() && 'pm' !== control.inputElements.meridian.get() ) { 5662 control.invalidDate = true; 5663 } else { 5664 validityInput.setCustomValidity( '' ); 5665 } 5666 } 5667 5668 if ( control.invalidDate ) { 5669 validityInput.setCustomValidity( api.l10n.invalidValue ); 5670 } else { 5671 validityInput.setCustomValidity( '' ); 5672 } 5673 if ( ! control.section() || api.section.has( control.section() ) && api.section( control.section() ).expanded() ) { 5674 _.result( validityInput, 'reportValidity' ); 5675 } 5659 5676 5660 5677 return control.invalidDate; … … 5670 5687 var control = this, daysInMonth, year, month, day; 5671 5688 5672 month = control.inputElements.month();5673 year = control.inputElements.year();5674 day = control.inputElements.day();5689 month = parseInt( control.inputElements.month(), 10 ); 5690 year = parseInt( control.inputElements.year(), 10 ); 5691 day = parseInt( control.inputElements.day(), 10 ); 5675 5692 5676 5693 if ( month && year ) { … … 5679 5696 5680 5697 if ( day > daysInMonth ) { 5681 control.inputElements.day( daysInMonth ); 5682 } 5683 } 5684 }, 5685 5686 /** 5687 * Updates number of minutes according to the hour selected. 5688 * 5689 * @since 4.9.0 5690 * @return {void} 5691 */ 5692 updateMinutesForHour: function updateMinutesForHour() { 5693 var control = this, maxHours = 24, minuteEl; 5694 5695 if ( control.inputElements.meridian ) { 5696 return; 5697 } 5698 5699 minuteEl = control.inputElements.minute.element; 5700 5701 if ( maxHours === control.inputElements.hour() ) { 5702 control.inputElements.minute( 0 ); 5703 minuteEl.data( 'default-max', minuteEl.attr( 'max' ) ); 5704 minuteEl.attr( 'max', '0' ); 5705 } else if ( minuteEl.data( 'default-max' ) ) { 5706 minuteEl.attr( 'max', minuteEl.data( 'default-max' ) ); 5698 control.inputElements.day( String( daysInMonth ) ); 5699 } 5707 5700 } 5708 5701 }, … … 5746 5739 5747 5740 getElementValue = function( component ) { 5748 var value = control.inputElements[ component ].get();5741 var value = parseInt( control.inputElements[ component ].get(), 10 ); 5749 5742 5750 5743 if ( _.contains( [ 'month', 'day', 'hour', 'minute' ], component ) ) { … … 5823 5816 5824 5817 _.each( control.inputElements, function( element, component ) { 5825 element.set( parsed[ component ] ); 5818 if ( 'meridian' === component || parseInt( parsed[ component ], 10 ) !== parseInt( element(), 10 ) ) { 5819 element.set( parsed[ component ] ); 5820 } 5826 5821 } ); 5827 5822 -
trunk/src/wp-includes/customize/class-wp-customize-date-time-control.php
r41750 r42042 142 142 <div class="time-fields clear"> 143 143 <label for="{{ idPrefix }}date-time-hour" class="screen-reader-text"><?php esc_html_e( 'Hour' ); ?></label> 144 <# var maxHour = data.twelveHourFormat ? 12 : 24; #> 145 <input id="{{ idPrefix }}date-time-hour" type="number" size="2" autocomplete="off" class="date-input hour" data-component="hour" min="1" max="{{ maxHour }}"> 144 <# var maxHour = data.twelveHourFormat ? 12 : 23; #> 145 <# var minHour = data.twelveHourFormat ? 1 : 0; #> 146 <input id="{{ idPrefix }}date-time-hour" type="number" size="2" autocomplete="off" class="date-input hour" data-component="hour" min="{{ minHour }}" max="{{ maxHour }}"> 146 147 <span class="time-special-char date-time-separator">:</span> 147 148 <label for="{{ idPrefix }}date-time-minute" class="screen-reader-text"><?php esc_html_e( 'Minute' ); ?></label> -
trunk/src/wp-includes/script-loader.php
r42025 r42042 600 600 ), 601 601 'publishSettings' => __( 'Publish Settings' ), 602 'invalidDate' => __( 'Invalid date.' ), 603 'invalidValue' => __( 'Invalid value.' ), 602 604 ) ); 603 605 $scripts->add( 'customize-selective-refresh', "/wp-includes/js/customize-selective-refresh$suffix.js", array( 'jquery', 'wp-util', 'customize-preview' ), false, 1 ); -
trunk/tests/qunit/wp-admin/js/customize-controls.js
r41750 r42042 733 733 734 734 year( '23' ); 735 assert.equal( typeof year(), 'number', 'Should always return integer' ); 736 735 assert.ok( control.invalidDate ); 736 737 year( '2100' ); 737 738 month( '8' ); 738 month( 'test' ); 739 assert.equal( 8, month(), 'Should not accept text' ); 739 assert.ok( ! control.invalidDate ); 740 day( 'test' ); 741 assert.ok( control.invalidDate ); 742 day( '3' ); 743 assert.ok( ! control.invalidDate ); 740 744 741 745 // Test control.parseDateTime(); … … 785 789 year( 2017 ); 786 790 month( 2 ); 791 day( 28 ); 792 assert.ok( ! control.invalidDate ); 787 793 day( 31 ); 788 control.updateDaysForMonth(); 789 assert.deepEqual( day(), 28, 'Should update to the correct days' ); 794 assert.ok( control.invalidDate ); 790 795 791 796 day( 20 ); 792 assert. deepEqual( day(), 20, 'Should not update if its less the correct number of days' );797 assert.equal( day(), 20, 'Should not update if its less the correct number of days' ); 793 798 794 799 // Test control.convertHourToTwentyFourHourFormat(). … … 855 860 assert.notOk( control.isFutureDate() ); 856 861 857 /**858 * Test control.updateMinutesForHour().859 * Run this at the end or else the above tests may fail.860 */861 hour( 24 );862 minute( 32 );863 control.inputElements.meridian = false; // Because it works only when the time is twenty four hour format.864 control.updateMinutesForHour();865 assert.deepEqual( minute(), 0 );866 867 862 // Tear Down. 868 863 wp.customize.control.remove( controlId );
Note: See TracChangeset
for help on using the changeset viewer.