Changeset 41352
- Timestamp:
- 09/08/2017 07:10:59 PM (7 years ago)
- Location:
- trunk/src
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/wp-admin/css/widgets.css
r41339 r41352 41 41 padding: 1px 15px 15px 15px; 42 42 line-height: 16px; 43 } 44 45 .widget.widget-dirty .widget-control-close-wrapper { 46 display: none; 43 47 } 44 48 -
trunk/src/wp-admin/includes/widgets.php
r40480 r41352 254 254 <div class="widget-control-actions"> 255 255 <div class="alignleft"> 256 <button type="button" class="button-link button-link-delete widget-control-remove"><?php _e( 'Delete' ); ?></button> | 257 <button type="button" class="button-link widget-control-close"><?php _e( 'Close' ); ?></button> 256 <button type="button" class="button-link button-link-delete widget-control-remove"><?php _e( 'Delete' ); ?></button> 257 <span class="widget-control-close-wrapper"> 258 | 259 <button type="button" class="button-link widget-control-close"><?php _e( 'Done' ); ?></button> 260 </span> 258 261 </div> 259 262 <div class="alignright<?php if ( 'noform' === $has_form ) echo ' widget-control-noform'; ?>"> -
trunk/src/wp-admin/js/widgets.js
r40480 r41352 8 8 * A closed Sidebar that gets a Widget dragged over it. 9 9 * 10 * @var element|null10 * @var {element|null} 11 11 */ 12 12 hoveredSidebar: null, 13 14 /** 15 * Translations. 16 * 17 * Exported from PHP in wp_default_scripts(). 18 * 19 * @var {object} 20 */ 21 l10n: { 22 save: '{save}', 23 saved: '{saved}', 24 saveAlert: '{saveAlert}' 25 }, 26 27 /** 28 * Lookup of which widgets have had change events triggered. 29 * 30 * @var {object} 31 */ 32 dirtyWidgets: {}, 13 33 14 34 init : function() { … … 34 54 }); 35 55 56 // Show AYS dialog when there are unsaved widget changes. 57 $( window ).on( 'beforeunload.widgets', function( event ) { 58 var dirtyWidgetIds = [], unsavedWidgetsElements; 59 $.each( self.dirtyWidgets, function( widgetId, dirty ) { 60 if ( dirty ) { 61 dirtyWidgetIds.push( widgetId ); 62 } 63 }); 64 if ( 0 !== dirtyWidgetIds.length ) { 65 unsavedWidgetsElements = $( '#widgets-right' ).find( '.widget' ).filter( function() { 66 return -1 !== dirtyWidgetIds.indexOf( $( this ).prop( 'id' ).replace( /^widget-\d+_/, '' ) ); 67 }); 68 unsavedWidgetsElements.each( function() { 69 if ( ! $( this ).hasClass( 'open' ) ) { 70 $( this ).find( '.widget-title-action:first' ).click(); 71 } 72 }); 73 74 // Bring the first unsaved widget into view and focus on the first tabbable field. 75 unsavedWidgetsElements.first().each( function() { 76 if ( this.scrollIntoViewIfNeeded ) { 77 this.scrollIntoViewIfNeeded(); 78 } else { 79 this.scrollIntoView(); 80 } 81 $( this ).find( '.widget-inside :tabbable:first' ).focus(); 82 } ); 83 84 event.returnValue = wpWidgets.l10n.saveAlert; 85 return event.returnValue; 86 } 87 }); 88 36 89 $('#widgets-left .sidebar-name').click( function() { 37 90 $(this).closest('.widgets-holder-wrap').toggleClass('closed'); … … 42 95 var target = $(e.target), 43 96 css = { 'z-index': 100 }, 44 widget, inside, targetWidth, widgetWidth, margin, 97 widget, inside, targetWidth, widgetWidth, margin, saveButton, widgetId, 45 98 toggleBtn = target.closest( '.widget' ).find( '.widget-top button.widget-action' ); 46 99 … … 48 101 widget = target.closest('div.widget'); 49 102 inside = widget.children('.widget-inside'); 50 targetWidth = parseInt( widget.find('input.widget-width').val(), 10 ) ,103 targetWidth = parseInt( widget.find('input.widget-width').val(), 10 ); 51 104 widgetWidth = widget.parent().width(); 105 widgetId = inside.find( '.widget-id' ).val(); 106 107 // Save button is initially disabled, but is enabled when a field is changed. 108 if ( ! widget.data( 'dirty-state-initialized' ) ) { 109 saveButton = inside.find( '.widget-control-save' ); 110 saveButton.prop( 'disabled', true ).val( wpWidgets.l10n.saved ); 111 inside.on( 'input change', function() { 112 self.dirtyWidgets[ widgetId ] = true; 113 widget.addClass( 'widget-dirty' ); 114 saveButton.prop( 'disabled', false ).val( wpWidgets.l10n.save ); 115 }); 116 widget.data( 'dirty-state-initialized', true ); 117 } 52 118 53 119 if ( inside.is(':hidden') ) { … … 411 477 412 478 save : function( widget, del, animate, order ) { 413 var sidebarId = widget.closest('div.widgets-sortables').attr('id'), 414 data = widget.find('form').serialize(), a; 479 var self = this, data, a, 480 sidebarId = widget.closest( 'div.widgets-sortables' ).attr( 'id' ), 481 form = widget.find( 'form' ); 482 483 if ( form.prop( 'checkValidity' ) && ! form[0].checkValidity() ) { 484 return; 485 } 486 487 data = form.serialize(); 415 488 416 489 widget = $(widget); … … 430 503 431 504 $.post( ajaxurl, data, function(r) { 432 var id ;505 var id = $('input.widget-id', widget).val(); 433 506 434 507 if ( del ) { 435 508 if ( ! $('input.widget_number', widget).val() ) { 436 id = $('input.widget-id', widget).val();437 509 $('#available-widgets').find('input.widget-id').each(function(){ 438 510 if ( $(this).val() === id ) { … … 460 532 $( 'div.widget-content', widget ).html( r ); 461 533 wpWidgets.appendTitle( widget ); 534 535 // Re-disable the save button. 536 widget.find( '.widget-control-save' ).prop( 'disabled', true ).val( wpWidgets.l10n.saved ); 537 538 widget.removeClass( 'widget-dirty' ); 539 540 // Clear the dirty flag from the widget. 541 delete self.dirtyWidgets[ id ]; 542 462 543 $document.trigger( 'widget-updated', [ widget ] ); 463 544 -
trunk/src/wp-admin/js/widgets/text-widgets.js
r41350 r41352 166 166 */ 167 167 initializeEditor: function initializeEditor() { 168 var control = this, changeDebounceDelay = 1000, id, textarea, triggerChangeIfDirty, restoreTextMode = false, needsTextareaChangeTrigger = false ;168 var control = this, changeDebounceDelay = 1000, id, textarea, triggerChangeIfDirty, restoreTextMode = false, needsTextareaChangeTrigger = false, previousValue; 169 169 textarea = control.fields.text; 170 170 id = textarea.attr( 'id' ); 171 previousValue = textarea.val(); 171 172 172 173 /** … … 203 204 } 204 205 205 // Trigger change on textarea when it is dirty for sake of widgets in the Customizer needing to sync form inputs to setting models.206 if ( needsTextareaChangeTrigger ) {206 // Trigger change on textarea when it has changed so the widget can enter a dirty state. 207 if ( needsTextareaChangeTrigger && previousValue !== textarea.val() ) { 207 208 textarea.trigger( 'change' ); 208 209 needsTextareaChangeTrigger = false; 210 previousValue = textarea.val(); 209 211 } 210 212 }; -
trunk/src/wp-includes/script-loader.php
r41329 r41352 673 673 674 674 $scripts->add( 'admin-widgets', "/wp-admin/js/widgets$suffix.js", array( 'jquery-ui-sortable', 'jquery-ui-draggable', 'jquery-ui-droppable' ), false, 1 ); 675 $scripts->add_inline_script( 'admin-widgets', sprintf( 'wpWidgets.l10n = %s;', wp_json_encode( array( 676 'save' => __( 'Save' ), 677 'saved' => __( 'Saved' ), 678 'saveAlert' => __( 'The changes you made will be lost if you navigate away from this page.' ), 679 ) ) ) ); 680 675 681 $scripts->add( 'media-widgets', "/wp-admin/js/widgets/media-widgets$suffix.js", array( 'jquery', 'media-models', 'media-views', 'wp-api-request' ) ); 676 682 $scripts->add_inline_script( 'media-widgets', 'wp.mediaWidgets.init();', 'after' );
Note: See TracChangeset
for help on using the changeset viewer.