diff --git src/wp-admin/js/customize-controls.js src/wp-admin/js/customize-controls.js
index 8f1b9a1..a6ede27 100644
|
|
|
74 | 74 | * @since 4.1.0 |
75 | 75 | * |
76 | 76 | * @param {Object} [params] |
77 | | * @param {Callback} [params.completeCallback] |
| 77 | * @param {Function} [params.completeCallback] |
78 | 78 | */ |
79 | 79 | focus = function ( params ) { |
80 | 80 | var construct, completeCallback, focus; |
diff --git src/wp-admin/js/customize-nav-menus.js src/wp-admin/js/customize-nav-menus.js
index 9db1664..bcebb65 100644
|
|
|
1363 | 1363 | |
1364 | 1364 | /** |
1365 | 1365 | * Expand the menu item form control. |
| 1366 | * |
| 1367 | * @since 4.5.0 Added params.completeCallback. |
| 1368 | * |
| 1369 | * @param {Object} [params] - Optional params. |
| 1370 | * @param {Function} [params.completeCallback] - Function to call when the form toggle has finished animating. |
1366 | 1371 | */ |
1367 | | expandForm: function() { |
1368 | | this.toggleForm( true ); |
| 1372 | expandForm: function( params ) { |
| 1373 | this.toggleForm( true, params ); |
1369 | 1374 | }, |
1370 | 1375 | |
1371 | 1376 | /** |
1372 | 1377 | * Collapse the menu item form control. |
| 1378 | * |
| 1379 | * @since 4.5.0 Added params.completeCallback. |
| 1380 | * |
| 1381 | * @param {Object} [params] - Optional params. |
| 1382 | * @param {Function} [params.completeCallback] - Function to call when the form toggle has finished animating. |
1373 | 1383 | */ |
1374 | | collapseForm: function() { |
1375 | | this.toggleForm( false ); |
| 1384 | collapseForm: function( params ) { |
| 1385 | this.toggleForm( false, params ); |
1376 | 1386 | }, |
1377 | 1387 | |
1378 | 1388 | /** |
1379 | 1389 | * Expand or collapse the menu item control. |
1380 | 1390 | * |
1381 | | * @param {boolean|undefined} [showOrHide] If not supplied, will be inverse of current visibility |
| 1391 | * @since 4.5.0 Added params.completeCallback. |
| 1392 | * |
| 1393 | * @param {boolean} [showOrHide] - If not supplied, will be inverse of current visibility |
| 1394 | * @param {Object} [params] - Optional params. |
| 1395 | * @param {Function} [params.completeCallback] - Function to call when the form toggle has finished animating. |
1382 | 1396 | */ |
1383 | | toggleForm: function( showOrHide ) { |
| 1397 | toggleForm: function( showOrHide, params ) { |
1384 | 1398 | var self = this, $menuitem, $inside, complete; |
1385 | 1399 | |
1386 | 1400 | $menuitem = this.container; |
… |
… |
|
1391 | 1405 | |
1392 | 1406 | // Already expanded or collapsed. |
1393 | 1407 | if ( $inside.is( ':visible' ) === showOrHide ) { |
| 1408 | if ( params && params.completeCallback ) { |
| 1409 | params.completeCallback(); |
| 1410 | } |
1394 | 1411 | return; |
1395 | 1412 | } |
1396 | 1413 | |
… |
… |
|
1407 | 1424 | .removeClass( 'menu-item-edit-inactive' ) |
1408 | 1425 | .addClass( 'menu-item-edit-active' ); |
1409 | 1426 | self.container.trigger( 'expanded' ); |
| 1427 | |
| 1428 | if ( params && params.completeCallback ) { |
| 1429 | params.completeCallback(); |
| 1430 | } |
1410 | 1431 | }; |
1411 | 1432 | |
1412 | 1433 | $menuitem.find( '.item-edit' ).attr( 'aria-expanded', 'true' ); |
… |
… |
|
1419 | 1440 | .addClass( 'menu-item-edit-inactive' ) |
1420 | 1441 | .removeClass( 'menu-item-edit-active' ); |
1421 | 1442 | self.container.trigger( 'collapsed' ); |
| 1443 | |
| 1444 | if ( params && params.completeCallback ) { |
| 1445 | params.completeCallback(); |
| 1446 | } |
1422 | 1447 | }; |
1423 | 1448 | |
1424 | 1449 | self.container.trigger( 'collapse' ); |
… |
… |
|
1431 | 1456 | /** |
1432 | 1457 | * Expand the containing menu section, expand the form, and focus on |
1433 | 1458 | * the first input in the control. |
| 1459 | * |
| 1460 | * @since 4.5.0 Added params.completeCallback. |
| 1461 | * |
| 1462 | * @param {Object} [params] - Params object. |
| 1463 | * @param {Function} [params.completeCallback] - Optional callback function when focus has completed. |
1434 | 1464 | */ |
1435 | | focus: function() { |
1436 | | var control = this, focusable; |
| 1465 | focus: function( params ) { |
| 1466 | params = params || {}; |
| 1467 | var control = this, originalCompleteCallback = params.completeCallback; |
| 1468 | |
1437 | 1469 | control.expandControlSection(); |
1438 | | control.expandForm(); |
1439 | | // Note that we can't use :focusable due to a jQuery UI issue. See: https://github.com/jquery/jquery-ui/pull/1583 |
1440 | | focusable = control.container.find( '.menu-item-settings' ).find( 'input, select, textarea, button, object, a[href], [tabindex]' ).filter( ':visible' ); |
1441 | | focusable.first().focus(); |
| 1470 | |
| 1471 | params.completeCallback = function() { |
| 1472 | var focusable; |
| 1473 | |
| 1474 | // Note that we can't use :focusable due to a jQuery UI issue. See: https://github.com/jquery/jquery-ui/pull/1583 |
| 1475 | focusable = control.container.find( '.menu-item-settings' ).find( 'input, select, textarea, button, object, a[href], [tabindex]' ).filter( ':visible' ); |
| 1476 | focusable.first().focus(); |
| 1477 | |
| 1478 | if ( originalCompleteCallback ) { |
| 1479 | originalCompleteCallback(); |
| 1480 | } |
| 1481 | }; |
| 1482 | |
| 1483 | control.expandForm( params ); |
1442 | 1484 | }, |
1443 | 1485 | |
1444 | 1486 | /** |
… |
… |
|
2445 | 2487 | api.previewer.bind( 'refresh', function() { |
2446 | 2488 | api.previewer.refresh(); |
2447 | 2489 | }); |
| 2490 | |
| 2491 | // Open and focus menu control. |
| 2492 | api.previewer.bind( 'focus-nav-menu-item-control', api.Menus.focusMenuItemControl ); |
2448 | 2493 | } ); |
2449 | 2494 | |
2450 | 2495 | /** |
diff --git src/wp-includes/class-wp-customize-nav-menus.php src/wp-includes/class-wp-customize-nav-menus.php
index f6be209..4e92166 100644
|
|
final class WP_Customize_Nav_Menus { |
950 | 950 | ), |
951 | 951 | 'previewCustomizeNonce' => wp_create_nonce( 'preview-customize_' . $this->manager->get_stylesheet() ), |
952 | 952 | 'navMenuInstanceArgs' => $this->preview_nav_menu_instance_args, |
| 953 | 'l10n' => array( |
| 954 | 'editNavMenuItemTooltip' => __( 'Shift-click to edit this menu item.' ), |
| 955 | ), |
953 | 956 | ); |
954 | 957 | |
955 | 958 | printf( '<script>var _wpCustomizePreviewNavMenusExports = %s;</script>', wp_json_encode( $exports ) ); |
diff --git src/wp-includes/js/customize-preview-nav-menus.js src/wp-includes/js/customize-preview-nav-menus.js
index 814c6f2..257cf19 100644
|
|
|
19 | 19 | active: false, |
20 | 20 | stylesheet: '' |
21 | 21 | }, |
22 | | navMenuInstanceArgs: {} |
| 22 | navMenuInstanceArgs: {}, |
| 23 | l10n: {} |
23 | 24 | }; |
24 | 25 | |
25 | 26 | api.MenusCustomizerPreview = { |
… |
… |
|
63 | 64 | } |
64 | 65 | } |
65 | 66 | } ); |
| 67 | |
| 68 | self.highlightControls(); |
66 | 69 | }, |
67 | 70 | |
68 | 71 | /** |
… |
… |
|
272 | 275 | }, this ), |
273 | 276 | refreshDebounceDelay |
274 | 277 | ); |
| 278 | }, |
| 279 | |
| 280 | /** |
| 281 | * Connect nav menu items with their corresponding controls in the pane. |
| 282 | */ |
| 283 | highlightControls: function() { |
| 284 | var selector = '.menu-item[id^=menu-item-]', |
| 285 | navMenuItemParts, |
| 286 | addTooltips; |
| 287 | |
| 288 | // Open expand the menu item control when shift+clicking the menu item |
| 289 | $( document ).on( 'click', selector, function( e ) { |
| 290 | if ( ! e.shiftKey ) { |
| 291 | return; |
| 292 | } |
| 293 | |
| 294 | navMenuItemParts = $( this ).attr( 'id' ).match( /^menu-item-(\d+)$/ ); |
| 295 | if ( navMenuItemParts ) { |
| 296 | e.preventDefault(); |
| 297 | e.stopPropagation(); // Make sure a sub-nav menu item will get focused instead of parent items. |
| 298 | api.preview.send( 'focus-nav-menu-item-control', parseInt( navMenuItemParts[1], 10 ) ); |
| 299 | } |
| 300 | }); |
| 301 | |
| 302 | addTooltips = function( e, params ) { |
| 303 | params.newContainer.find( selector ).attr( 'title', settings.l10n.editNavMenuItemTooltip ); |
| 304 | }; |
| 305 | |
| 306 | addTooltips( null, { newContainer: $( document.body ) } ); |
| 307 | $( document ).on( 'customize-preview-menu-refreshed', addTooltips ); |
275 | 308 | } |
276 | 309 | }; |
277 | 310 | |