2014-01-01 19:11:14 -05:00
|
|
|
/* global setUserSetting, ajaxurl, commonL10n, alert, confirm, pagenow */
|
2013-11-26 03:57:10 -05:00
|
|
|
var showNotice, adminMenu, columns, validateForm, screenMeta;
|
|
|
|
( function( $, window, undefined ) {
|
2015-10-20 23:41:24 -04:00
|
|
|
var $document = $( document ),
|
|
|
|
$window = $( window ),
|
|
|
|
$body = $( document.body );
|
|
|
|
|
2012-08-22 20:04:18 -04:00
|
|
|
// Removed in 3.3.
|
|
|
|
// (perhaps) needed for back-compat
|
|
|
|
adminMenu = {
|
|
|
|
init : function() {},
|
|
|
|
fold : function() {},
|
|
|
|
restoreMenuState : function() {},
|
|
|
|
toggle : function() {},
|
|
|
|
favorites : function() {}
|
|
|
|
};
|
|
|
|
|
|
|
|
// show/hide/save table columns
|
|
|
|
columns = {
|
|
|
|
init : function() {
|
|
|
|
var that = this;
|
|
|
|
$('.hide-column-tog', '#adv-settings').click( function() {
|
|
|
|
var $t = $(this), column = $t.val();
|
|
|
|
if ( $t.prop('checked') )
|
|
|
|
that.checked(column);
|
|
|
|
else
|
|
|
|
that.unchecked(column);
|
|
|
|
|
|
|
|
columns.saveManageColumnsState();
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
saveManageColumnsState : function() {
|
2014-07-24 01:26:15 -04:00
|
|
|
var hidden = this.hidden();
|
2012-08-22 20:04:18 -04:00
|
|
|
$.post(ajaxurl, {
|
|
|
|
action: 'hidden-columns',
|
|
|
|
hidden: hidden,
|
|
|
|
screenoptionnonce: $('#screenoptionnonce').val(),
|
2014-07-24 01:26:15 -04:00
|
|
|
page: pagenow
|
2012-08-22 20:04:18 -04:00
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
checked : function(column) {
|
2015-06-10 15:47:27 -04:00
|
|
|
$('.column-' + column).removeClass( 'hidden' );
|
2012-08-22 20:04:18 -04:00
|
|
|
this.colSpanChange(+1);
|
|
|
|
},
|
|
|
|
|
|
|
|
unchecked : function(column) {
|
2015-06-10 15:47:27 -04:00
|
|
|
$('.column-' + column).addClass( 'hidden' );
|
2012-08-22 20:04:18 -04:00
|
|
|
this.colSpanChange(-1);
|
|
|
|
},
|
|
|
|
|
|
|
|
hidden : function() {
|
2015-06-13 11:00:25 -04:00
|
|
|
return $( '.manage-column[id]' ).filter( ':hidden' ).map(function() {
|
|
|
|
return this.id;
|
|
|
|
}).get().join( ',' );
|
2012-08-22 20:04:18 -04:00
|
|
|
},
|
|
|
|
|
|
|
|
useCheckboxesForHidden : function() {
|
|
|
|
this.hidden = function(){
|
|
|
|
return $('.hide-column-tog').not(':checked').map(function() {
|
|
|
|
var id = this.id;
|
|
|
|
return id.substring( id, id.length - 5 );
|
|
|
|
}).get().join(',');
|
|
|
|
};
|
|
|
|
},
|
|
|
|
|
|
|
|
colSpanChange : function(diff) {
|
|
|
|
var $t = $('table').find('.colspanchange'), n;
|
|
|
|
if ( !$t.length )
|
|
|
|
return;
|
|
|
|
n = parseInt( $t.attr('colspan'), 10 ) + diff;
|
|
|
|
$t.attr('colspan', n.toString());
|
|
|
|
}
|
2013-11-12 18:56:09 -05:00
|
|
|
};
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2015-10-20 23:41:24 -04:00
|
|
|
$document.ready(function(){columns.init();});
|
2012-08-22 20:04:18 -04:00
|
|
|
|
|
|
|
validateForm = function( form ) {
|
2013-11-12 18:56:09 -05:00
|
|
|
return !$( form )
|
|
|
|
.find( '.form-required' )
|
2017-05-11 15:18:42 -04:00
|
|
|
.filter( function() { return $( ':input:visible', this ).val() === ''; } )
|
2013-11-12 18:56:09 -05:00
|
|
|
.addClass( 'form-invalid' )
|
2017-05-11 15:18:42 -04:00
|
|
|
.find( ':input:visible' )
|
2013-11-12 18:56:09 -05:00
|
|
|
.change( function() { $( this ).closest( '.form-invalid' ).removeClass( 'form-invalid' ); } )
|
2016-01-13 11:17:27 -05:00
|
|
|
.length;
|
2013-11-12 18:56:09 -05:00
|
|
|
};
|
2012-08-22 20:04:18 -04:00
|
|
|
|
|
|
|
// stub for doing better warnings
|
|
|
|
showNotice = {
|
|
|
|
warn : function() {
|
|
|
|
var msg = commonL10n.warnDelete || '';
|
|
|
|
if ( confirm(msg) ) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
},
|
|
|
|
|
|
|
|
note : function(text) {
|
|
|
|
alert(text);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
screenMeta = {
|
|
|
|
element: null, // #screen-meta
|
|
|
|
toggles: null, // .screen-meta-toggle
|
|
|
|
page: null, // #wpcontent
|
|
|
|
|
|
|
|
init: function() {
|
|
|
|
this.element = $('#screen-meta');
|
2015-06-18 12:36:25 -04:00
|
|
|
this.toggles = $( '#screen-meta-links' ).find( '.show-settings' );
|
2012-08-22 20:04:18 -04:00
|
|
|
this.page = $('#wpcontent');
|
|
|
|
|
|
|
|
this.toggles.click( this.toggleEvent );
|
|
|
|
},
|
|
|
|
|
2015-06-18 12:36:25 -04:00
|
|
|
toggleEvent: function() {
|
|
|
|
var panel = $( '#' + $( this ).attr( 'aria-controls' ) );
|
2012-08-22 20:04:18 -04:00
|
|
|
|
|
|
|
if ( !panel.length )
|
|
|
|
return;
|
|
|
|
|
|
|
|
if ( panel.is(':visible') )
|
|
|
|
screenMeta.close( panel, $(this) );
|
|
|
|
else
|
|
|
|
screenMeta.open( panel, $(this) );
|
|
|
|
},
|
|
|
|
|
2015-06-18 12:36:25 -04:00
|
|
|
open: function( panel, button ) {
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2015-06-18 12:36:25 -04:00
|
|
|
$( '#screen-meta-links' ).find( '.screen-meta-toggle' ).not( button.parent() ).css( 'visibility', 'hidden' );
|
2012-08-22 20:04:18 -04:00
|
|
|
|
|
|
|
panel.parent().show();
|
|
|
|
panel.slideDown( 'fast', function() {
|
|
|
|
panel.focus();
|
2015-06-18 12:36:25 -04:00
|
|
|
button.addClass( 'screen-meta-active' ).attr( 'aria-expanded', true );
|
2012-08-22 20:04:18 -04:00
|
|
|
});
|
2014-07-11 01:34:14 -04:00
|
|
|
|
2015-10-20 23:41:24 -04:00
|
|
|
$document.trigger( 'screen:options:open' );
|
2012-08-22 20:04:18 -04:00
|
|
|
},
|
|
|
|
|
2015-06-18 12:36:25 -04:00
|
|
|
close: function( panel, button ) {
|
2012-08-22 20:04:18 -04:00
|
|
|
panel.slideUp( 'fast', function() {
|
2015-06-18 12:36:25 -04:00
|
|
|
button.removeClass( 'screen-meta-active' ).attr( 'aria-expanded', false );
|
2012-08-22 20:04:18 -04:00
|
|
|
$('.screen-meta-toggle').css('visibility', '');
|
|
|
|
panel.parent().hide();
|
|
|
|
});
|
2014-07-11 01:34:14 -04:00
|
|
|
|
2015-10-20 23:41:24 -04:00
|
|
|
$document.trigger( 'screen:options:close' );
|
2012-08-22 20:04:18 -04:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Help tabs.
|
|
|
|
*/
|
2014-06-27 15:10:16 -04:00
|
|
|
$('.contextual-help-tabs').delegate('a', 'click', function(e) {
|
2012-08-22 20:04:18 -04:00
|
|
|
var link = $(this),
|
|
|
|
panel;
|
|
|
|
|
|
|
|
e.preventDefault();
|
|
|
|
|
|
|
|
// Don't do anything if the click is for the tab already showing.
|
|
|
|
if ( link.is('.active a') )
|
|
|
|
return false;
|
|
|
|
|
|
|
|
// Links
|
|
|
|
$('.contextual-help-tabs .active').removeClass('active');
|
|
|
|
link.parent('li').addClass('active');
|
|
|
|
|
|
|
|
panel = $( link.attr('href') );
|
|
|
|
|
|
|
|
// Panels
|
|
|
|
$('.help-tab-content').not( panel ).removeClass('active').hide();
|
|
|
|
panel.addClass('active').show();
|
|
|
|
});
|
|
|
|
|
2017-07-28 13:43:45 -04:00
|
|
|
/**
|
|
|
|
* Update custom permalink structure via buttons.
|
|
|
|
*/
|
|
|
|
|
|
|
|
var permalinkStructureFocused = false,
|
|
|
|
$permalinkStructure = $( '#permalink_structure' ),
|
2017-09-26 04:24:46 -04:00
|
|
|
$permalinkStructureInputs = $( '.permalink-structure input:radio' ),
|
|
|
|
$permalinkCustomSelection = $( '#custom_selection' ),
|
2017-07-28 13:43:45 -04:00
|
|
|
$availableStructureTags = $( '.form-table.permalink-structure .available-structure-tags button' );
|
|
|
|
|
2017-09-26 04:24:46 -04:00
|
|
|
// Change permalink structure input when selecting one of the common structures.
|
|
|
|
$permalinkStructureInputs.on( 'change', function() {
|
|
|
|
if ( 'custom' === this.value ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
$permalinkStructure.val( this.value );
|
|
|
|
|
|
|
|
// Update button states after selection.
|
|
|
|
$availableStructureTags.each( function() {
|
|
|
|
changeStructureTagButtonState( $( this ) );
|
|
|
|
} );
|
|
|
|
} );
|
|
|
|
|
|
|
|
$permalinkStructure.on( 'click input', function() {
|
|
|
|
$permalinkCustomSelection.prop( 'checked', true );
|
|
|
|
} );
|
|
|
|
|
2017-07-28 13:43:45 -04:00
|
|
|
// Check if the permalink structure input field has had focus at least once.
|
|
|
|
$permalinkStructure.on( 'focus', function( event ) {
|
|
|
|
permalinkStructureFocused = true;
|
|
|
|
$( this ).off( event );
|
|
|
|
} );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Enables or disables a structure tag button depending on its usage.
|
|
|
|
*
|
|
|
|
* If the structure is already used in the custom permalink structure,
|
|
|
|
* it will be disabled.
|
|
|
|
*
|
|
|
|
* @param {object} button Button jQuery object.
|
|
|
|
*/
|
|
|
|
function changeStructureTagButtonState( button ) {
|
|
|
|
if ( -1 !== $permalinkStructure.val().indexOf( button.text().trim() ) ) {
|
|
|
|
button.attr( 'data-label', button.attr( 'aria-label' ) );
|
|
|
|
button.attr( 'aria-label', button.attr( 'data-used' ) );
|
|
|
|
button.attr( 'aria-pressed', true );
|
|
|
|
button.addClass( 'active' );
|
|
|
|
} else if ( button.attr( 'data-label' ) ) {
|
|
|
|
button.attr( 'aria-label', button.attr( 'data-label' ) );
|
|
|
|
button.attr( 'aria-pressed', false );
|
|
|
|
button.removeClass( 'active' );
|
|
|
|
}
|
2017-07-28 13:55:46 -04:00
|
|
|
}
|
2017-07-28 13:43:45 -04:00
|
|
|
|
|
|
|
// Check initial button state.
|
|
|
|
$availableStructureTags.each( function() {
|
|
|
|
changeStructureTagButtonState( $( this ) );
|
|
|
|
} );
|
|
|
|
|
|
|
|
// Observe permalink structure field and disable buttons of tags that are already present.
|
|
|
|
$permalinkStructure.on( 'change', function() {
|
|
|
|
$availableStructureTags.each( function() {
|
|
|
|
changeStructureTagButtonState( $( this ) );
|
|
|
|
} );
|
|
|
|
} );
|
|
|
|
|
|
|
|
$availableStructureTags.on( 'click', function() {
|
|
|
|
var permalinkStructureValue = $permalinkStructure.val(),
|
|
|
|
selectionStart = $permalinkStructure[ 0 ].selectionStart,
|
|
|
|
selectionEnd = $permalinkStructure[ 0 ].selectionEnd,
|
|
|
|
textToAppend = $( this ).text().trim(),
|
|
|
|
textToAnnounce = $( this ).attr( 'data-added' );
|
|
|
|
|
|
|
|
// Remove structure tag if already part of the structure.
|
|
|
|
if ( -1 !== permalinkStructureValue.indexOf( textToAppend ) ) {
|
|
|
|
permalinkStructureValue = permalinkStructureValue.replace( textToAppend + '/', '' );
|
|
|
|
|
|
|
|
$permalinkStructure.val( '/' === permalinkStructureValue ? '' : permalinkStructureValue );
|
|
|
|
|
|
|
|
// Announce change to screen readers.
|
|
|
|
$( '#custom_selection_updated' ).text( textToAnnounce );
|
|
|
|
|
|
|
|
// Disable button.
|
|
|
|
changeStructureTagButtonState( $( this ) );
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Input field never had focus, move selection to end of input.
|
|
|
|
if ( ! permalinkStructureFocused && 0 === selectionStart && 0 === selectionEnd ) {
|
|
|
|
selectionStart = selectionEnd = permalinkStructureValue.length;
|
|
|
|
}
|
|
|
|
|
2017-09-26 04:24:46 -04:00
|
|
|
$permalinkCustomSelection.prop( 'checked', true );
|
2017-07-28 13:43:45 -04:00
|
|
|
|
|
|
|
// Prepend and append slashes if necessary.
|
|
|
|
if ( '/' !== permalinkStructureValue.substr( 0, selectionStart ).substr( -1 ) ) {
|
|
|
|
textToAppend = '/' + textToAppend;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( '/' !== permalinkStructureValue.substr( selectionEnd, 1 ) ) {
|
|
|
|
textToAppend = textToAppend + '/';
|
|
|
|
}
|
|
|
|
|
|
|
|
// Insert structure tag at the specified position.
|
|
|
|
$permalinkStructure.val( permalinkStructureValue.substr( 0, selectionStart ) + textToAppend + permalinkStructureValue.substr( selectionEnd ) );
|
|
|
|
|
|
|
|
// Announce change to screen readers.
|
|
|
|
$( '#custom_selection_updated' ).text( textToAnnounce );
|
|
|
|
|
|
|
|
// Disable button.
|
|
|
|
changeStructureTagButtonState( $( this ) );
|
|
|
|
} );
|
|
|
|
|
2015-10-20 23:41:24 -04:00
|
|
|
$document.ready( function() {
|
2015-10-17 03:11:24 -04:00
|
|
|
var checks, first, last, checked, sliced, mobileEvent, transitionTimeout, focusedRowActions,
|
2013-11-12 18:56:09 -05:00
|
|
|
lastClicked = false,
|
|
|
|
pageInput = $('input.current-page'),
|
2014-09-26 19:02:16 -04:00
|
|
|
currentPage = pageInput.val(),
|
|
|
|
isIOS = /iPhone|iPad|iPod/.test( navigator.userAgent ),
|
2014-10-15 02:05:18 -04:00
|
|
|
isAndroid = navigator.userAgent.indexOf( 'Android' ) !== -1,
|
2014-10-21 02:12:20 -04:00
|
|
|
isIE8 = $( document.documentElement ).hasClass( 'ie8' ),
|
2014-10-15 02:05:18 -04:00
|
|
|
$adminMenuWrap = $( '#adminmenuwrap' ),
|
|
|
|
$wpwrap = $( '#wpwrap' ),
|
|
|
|
$adminmenu = $( '#adminmenu' ),
|
|
|
|
$overlay = $( '#wp-responsive-overlay' ),
|
|
|
|
$toolbar = $( '#wp-toolbar' ),
|
|
|
|
$toolbarPopups = $toolbar.find( 'a[aria-haspopup="true"]' ),
|
|
|
|
$sortables = $('.meta-box-sortables'),
|
|
|
|
wpResponsiveActive = false,
|
|
|
|
$adminbar = $( '#wpadminbar' ),
|
|
|
|
lastScrollPosition = 0,
|
|
|
|
pinnedMenuTop = false,
|
|
|
|
pinnedMenuBottom = false,
|
|
|
|
menuTop = 0,
|
2016-11-04 13:18:57 -04:00
|
|
|
menuState,
|
2014-12-14 19:11:24 -05:00
|
|
|
menuIsPinned = false,
|
2014-10-15 02:05:18 -04:00
|
|
|
height = {
|
|
|
|
window: $window.height(),
|
2014-10-21 02:12:20 -04:00
|
|
|
wpwrap: $wpwrap.height(),
|
2014-10-15 02:05:18 -04:00
|
|
|
adminbar: $adminbar.height(),
|
|
|
|
menu: $adminMenuWrap.height()
|
2016-10-27 16:39:39 -04:00
|
|
|
},
|
|
|
|
$headerEnd = $( '.wp-header-end' );
|
2014-10-15 02:05:18 -04:00
|
|
|
|
2012-08-22 20:04:18 -04:00
|
|
|
|
|
|
|
// when the menu is folded, make the fly-out submenu header clickable
|
2014-10-15 02:05:18 -04:00
|
|
|
$adminmenu.on('click.wp-submenu-head', '.wp-submenu-head', function(e){
|
2012-08-22 20:04:18 -04:00
|
|
|
$(e.target).parent().siblings('a').get(0).click();
|
|
|
|
});
|
|
|
|
|
2016-11-04 13:18:57 -04:00
|
|
|
$( '#collapse-button' ).on( 'click.collapse-menu', function() {
|
|
|
|
var viewportWidth = getViewportWidth() || 961;
|
2012-08-22 20:04:18 -04:00
|
|
|
|
|
|
|
// reset any compensation for submenus near the bottom of the screen
|
|
|
|
$('#adminmenu div.wp-submenu').css('margin-top', '');
|
|
|
|
|
2016-11-04 13:18:57 -04:00
|
|
|
if ( viewportWidth < 960 ) {
|
2015-10-20 23:41:24 -04:00
|
|
|
if ( $body.hasClass('auto-fold') ) {
|
|
|
|
$body.removeClass('auto-fold').removeClass('folded');
|
2012-08-22 20:04:18 -04:00
|
|
|
setUserSetting('unfold', 1);
|
2013-08-30 13:11:08 -04:00
|
|
|
setUserSetting('mfold', 'o');
|
2016-11-04 13:18:57 -04:00
|
|
|
menuState = 'open';
|
2012-08-22 20:04:18 -04:00
|
|
|
} else {
|
2015-10-20 23:41:24 -04:00
|
|
|
$body.addClass('auto-fold');
|
2013-08-30 13:11:08 -04:00
|
|
|
setUserSetting('unfold', 0);
|
2016-11-04 13:18:57 -04:00
|
|
|
menuState = 'folded';
|
2012-08-22 20:04:18 -04:00
|
|
|
}
|
|
|
|
} else {
|
2015-10-20 23:41:24 -04:00
|
|
|
if ( $body.hasClass('folded') ) {
|
|
|
|
$body.removeClass('folded');
|
2013-08-30 13:11:08 -04:00
|
|
|
setUserSetting('mfold', 'o');
|
2016-11-04 13:18:57 -04:00
|
|
|
menuState = 'open';
|
2012-08-22 20:04:18 -04:00
|
|
|
} else {
|
2015-10-20 23:41:24 -04:00
|
|
|
$body.addClass('folded');
|
2012-08-22 20:04:18 -04:00
|
|
|
setUserSetting('mfold', 'f');
|
2016-11-04 13:18:57 -04:00
|
|
|
menuState = 'folded';
|
2012-08-22 20:04:18 -04:00
|
|
|
}
|
|
|
|
}
|
2014-07-09 18:06:15 -04:00
|
|
|
|
2016-11-04 13:18:57 -04:00
|
|
|
$document.trigger( 'wp-collapse-menu', { state: menuState } );
|
2012-08-22 20:04:18 -04:00
|
|
|
});
|
|
|
|
|
2015-10-20 23:41:24 -04:00
|
|
|
// Handle the `aria-haspopup` attribute on the current menu item when it has a sub-menu.
|
|
|
|
function currentMenuItemHasPopup() {
|
2016-11-04 13:18:57 -04:00
|
|
|
var $current = $( 'a.wp-has-current-submenu' );
|
2015-10-20 23:41:24 -04:00
|
|
|
|
2016-11-04 13:18:57 -04:00
|
|
|
if ( 'folded' === menuState ) {
|
2015-10-20 23:41:24 -04:00
|
|
|
// When folded or auto-folded and not responsive view, the current menu item does have a fly-out sub-menu.
|
|
|
|
$current.attr( 'aria-haspopup', 'true' );
|
|
|
|
} else {
|
|
|
|
// When expanded or in responsive view, reset aria-haspopup.
|
|
|
|
$current.attr( 'aria-haspopup', 'false' );
|
|
|
|
}
|
2015-10-21 01:33:24 -04:00
|
|
|
}
|
2015-10-20 23:41:24 -04:00
|
|
|
|
2016-11-04 13:18:57 -04:00
|
|
|
$document.on( 'wp-menu-state-set wp-collapse-menu wp-responsive-activate wp-responsive-deactivate', currentMenuItemHasPopup );
|
2015-10-20 23:41:24 -04:00
|
|
|
|
2014-12-03 21:04:22 -05:00
|
|
|
/**
|
|
|
|
* Ensure an admin submenu is within the visual viewport.
|
|
|
|
*
|
|
|
|
* @since 4.1.0
|
|
|
|
*
|
|
|
|
* @param {jQuery} $menuItem The parent menu item containing the submenu.
|
|
|
|
*/
|
2014-10-15 02:05:18 -04:00
|
|
|
function adjustSubmenu( $menuItem ) {
|
|
|
|
var bottomOffset, pageHeight, adjustment, theFold, menutop, wintop, maxtop,
|
|
|
|
$submenu = $menuItem.find( '.wp-submenu' );
|
|
|
|
|
|
|
|
menutop = $menuItem.offset().top;
|
|
|
|
wintop = $window.scrollTop();
|
|
|
|
maxtop = menutop - wintop - 30; // max = make the top of the sub almost touch admin bar
|
|
|
|
|
|
|
|
bottomOffset = menutop + $submenu.height() + 1; // Bottom offset of the menu
|
|
|
|
pageHeight = $wpwrap.height(); // Height of the entire page
|
|
|
|
adjustment = 60 + bottomOffset - pageHeight;
|
|
|
|
theFold = $window.height() + wintop - 50; // The fold
|
|
|
|
|
|
|
|
if ( theFold < ( bottomOffset - adjustment ) ) {
|
|
|
|
adjustment = bottomOffset - theFold;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( adjustment > maxtop ) {
|
|
|
|
adjustment = maxtop;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( adjustment > 1 ) {
|
|
|
|
$submenu.css( 'margin-top', '-' + adjustment + 'px' );
|
|
|
|
} else {
|
|
|
|
$submenu.css( 'margin-top', '' );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-10-19 14:31:21 -04:00
|
|
|
if ( 'ontouchstart' in window || /IEMobile\/[1-9]/.test(navigator.userAgent) ) { // touch screen device
|
2012-11-17 15:14:17 -05:00
|
|
|
// iOS Safari works with touchstart, the rest work with click
|
2014-09-26 19:02:16 -04:00
|
|
|
mobileEvent = isIOS ? 'touchstart' : 'click';
|
2012-11-17 15:14:17 -05:00
|
|
|
|
2012-10-19 14:31:21 -04:00
|
|
|
// close any open submenus when touch/click is not on the menu
|
2015-10-20 23:41:24 -04:00
|
|
|
$body.on( mobileEvent+'.wp-mobile-hover', function(e) {
|
2014-10-15 02:05:18 -04:00
|
|
|
if ( $adminmenu.data('wp-responsive') ) {
|
2013-11-26 03:57:10 -05:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2014-10-15 02:05:18 -04:00
|
|
|
if ( ! $( e.target ).closest( '#adminmenu' ).length ) {
|
|
|
|
$adminmenu.find( 'li.opensub' ).removeClass( 'opensub' );
|
2013-11-26 03:57:10 -05:00
|
|
|
}
|
2012-10-19 14:31:21 -04:00
|
|
|
});
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2014-10-15 02:05:18 -04:00
|
|
|
$adminmenu.find( 'a.wp-has-submenu' ).on( mobileEvent + '.wp-mobile-hover', function( event ) {
|
|
|
|
var $menuItem = $(this).parent();
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2014-10-15 02:05:18 -04:00
|
|
|
if ( $adminmenu.data( 'wp-responsive' ) ) {
|
2013-11-26 03:57:10 -05:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2012-11-17 15:14:17 -05:00
|
|
|
// Show the sub instead of following the link if:
|
|
|
|
// - the submenu is not open
|
|
|
|
// - the submenu is not shown inline or the menu is not folded
|
2014-10-15 02:05:18 -04:00
|
|
|
if ( ! $menuItem.hasClass( 'opensub' ) && ( ! $menuItem.hasClass( 'wp-menu-open' ) || $menuItem.width() < 40 ) ) {
|
|
|
|
event.preventDefault();
|
|
|
|
adjustSubmenu( $menuItem );
|
|
|
|
$adminmenu.find( 'li.opensub' ).removeClass( 'opensub' );
|
|
|
|
$menuItem.addClass('opensub');
|
2012-10-19 14:31:21 -04:00
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2014-09-26 19:02:16 -04:00
|
|
|
if ( ! isIOS && ! isAndroid ) {
|
2014-10-15 02:05:18 -04:00
|
|
|
$adminmenu.find( 'li.wp-has-submenu' ).hoverIntent({
|
2014-09-26 19:02:16 -04:00
|
|
|
over: function() {
|
2014-10-15 02:05:18 -04:00
|
|
|
var $menuItem = $( this ),
|
|
|
|
$submenu = $menuItem.find( '.wp-submenu' ),
|
|
|
|
top = parseInt( $submenu.css( 'top' ), 10 );
|
2012-11-17 15:14:17 -05:00
|
|
|
|
2014-10-15 02:05:18 -04:00
|
|
|
if ( isNaN( top ) || top > -5 ) { // the submenu is visible
|
2014-09-26 19:02:16 -04:00
|
|
|
return;
|
|
|
|
}
|
2012-11-17 15:14:17 -05:00
|
|
|
|
2014-10-15 02:05:18 -04:00
|
|
|
if ( $adminmenu.data( 'wp-responsive' ) ) {
|
2014-09-26 19:02:16 -04:00
|
|
|
// The menu is in responsive mode, bail
|
|
|
|
return;
|
|
|
|
}
|
2013-12-01 22:19:11 -05:00
|
|
|
|
2014-10-15 02:05:18 -04:00
|
|
|
adjustSubmenu( $menuItem );
|
|
|
|
$adminmenu.find( 'li.opensub' ).removeClass( 'opensub' );
|
|
|
|
$menuItem.addClass( 'opensub' );
|
2014-09-26 19:02:16 -04:00
|
|
|
},
|
|
|
|
out: function(){
|
2014-10-15 02:05:18 -04:00
|
|
|
if ( $adminmenu.data( 'wp-responsive' ) ) {
|
2014-09-26 19:02:16 -04:00
|
|
|
// The menu is in responsive mode, bail
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2014-10-15 02:05:18 -04:00
|
|
|
$( this ).removeClass( 'opensub' ).find( '.wp-submenu' ).css( 'margin-top', '' );
|
2014-09-26 19:02:16 -04:00
|
|
|
},
|
|
|
|
timeout: 200,
|
|
|
|
sensitivity: 7,
|
|
|
|
interval: 90
|
|
|
|
});
|
2012-11-17 15:14:17 -05:00
|
|
|
|
2014-10-15 02:05:18 -04:00
|
|
|
$adminmenu.on( 'focus.adminmenu', '.wp-submenu a', function( event ) {
|
|
|
|
if ( $adminmenu.data( 'wp-responsive' ) ) {
|
2013-12-01 22:19:11 -05:00
|
|
|
// The menu is in responsive mode, bail
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2014-10-15 02:05:18 -04:00
|
|
|
$( event.target ).closest( 'li.menu-top' ).addClass( 'opensub' );
|
|
|
|
}).on( 'blur.adminmenu', '.wp-submenu a', function( event ) {
|
|
|
|
if ( $adminmenu.data( 'wp-responsive' ) ) {
|
2014-09-26 19:02:16 -04:00
|
|
|
return;
|
|
|
|
}
|
2013-12-01 22:19:11 -05:00
|
|
|
|
2014-10-15 02:05:18 -04:00
|
|
|
$( event.target ).closest( 'li.menu-top' ).removeClass( 'opensub' );
|
2014-11-15 21:22:21 -05:00
|
|
|
}).find( 'li.wp-has-submenu.wp-not-current-submenu' ).on( 'focusin.adminmenu', function() {
|
2014-10-15 02:05:18 -04:00
|
|
|
adjustSubmenu( $( this ) );
|
2014-09-26 19:02:16 -04:00
|
|
|
});
|
|
|
|
}
|
2012-11-17 15:14:17 -05:00
|
|
|
|
2015-11-04 16:27:26 -05:00
|
|
|
/*
|
2016-05-13 14:41:31 -04:00
|
|
|
* The `.below-h2` class is here just for backward compatibility with plugins
|
2015-11-04 16:27:26 -05:00
|
|
|
* that are (incorrectly) using it. Do not use. Use `.inline` instead. See #34570.
|
2016-10-27 16:39:39 -04:00
|
|
|
* If '.wp-header-end' is found, append the notices after it otherwise
|
|
|
|
* after the first h1 or h2 heading found within the main content.
|
2015-11-04 16:27:26 -05:00
|
|
|
*/
|
2016-10-27 16:39:39 -04:00
|
|
|
if ( ! $headerEnd.length ) {
|
|
|
|
$headerEnd = $( '.wrap h1, .wrap h2' ).first();
|
|
|
|
}
|
|
|
|
$( 'div.updated, div.error, div.notice' ).not( '.inline, .below-h2' ).insertAfter( $headerEnd );
|
2012-08-22 20:04:18 -04:00
|
|
|
|
2015-04-01 18:06:28 -04:00
|
|
|
// Make notices dismissible
|
2015-11-18 15:10:26 -05:00
|
|
|
function makeNoticesDismissible() {
|
|
|
|
$( '.notice.is-dismissible' ).each( function() {
|
|
|
|
var $el = $( this ),
|
|
|
|
$button = $( '<button type="button" class="notice-dismiss"><span class="screen-reader-text"></span></button>' ),
|
|
|
|
btnText = commonL10n.dismiss || '';
|
|
|
|
|
|
|
|
// Ensure plain text
|
|
|
|
$button.find( '.screen-reader-text' ).text( btnText );
|
|
|
|
$button.on( 'click.wp-dismiss-notice', function( event ) {
|
|
|
|
event.preventDefault();
|
|
|
|
$el.fadeTo( 100, 0, function() {
|
|
|
|
$el.slideUp( 100, function() {
|
|
|
|
$el.remove();
|
|
|
|
});
|
2015-04-01 18:06:28 -04:00
|
|
|
});
|
|
|
|
});
|
2015-11-18 15:10:26 -05:00
|
|
|
|
|
|
|
$el.append( $button );
|
2015-04-01 18:06:28 -04:00
|
|
|
});
|
2015-11-18 15:10:26 -05:00
|
|
|
}
|
|
|
|
|
Update/Install: Shiny Updates v2.
Gone are the days of isolation and feelings of "meh", brought on by The Bleak Screen of Sadness. For a shiny knight has arrived to usher our plugins and themes along their arduous journey of installation, updates, and the inevitable fate of ultimate deletion.
Props swissspidy, adamsilverstein, mapk, afragen, ocean90, ryelle, j-falk, michael-arestad, melchoyce, DrewAPicture, AdamSoucie, ethitter, pento, dd32, kraftbj, Ipstenu, jorbin, afercia, stephdau, paulwilde, jipmoors, khag7, svovaf, jipmoors, obenland.
Fixes #22029, #25828, #31002, #31529, #31530, #31773, #33637, #35032.
Built from https://develop.svn.wordpress.org/trunk@37714
git-svn-id: http://core.svn.wordpress.org/trunk@37680 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-06-15 12:37:29 -04:00
|
|
|
$document.on( 'wp-updates-notice-added wp-plugin-install-error wp-plugin-update-error wp-plugin-delete-error wp-theme-install-error wp-theme-delete-error', makeNoticesDismissible );
|
2015-04-01 18:06:28 -04:00
|
|
|
|
2012-08-22 20:04:18 -04:00
|
|
|
// Init screen meta
|
|
|
|
screenMeta.init();
|
|
|
|
|
2016-10-03 02:37:30 -04:00
|
|
|
// This event needs to be delegated. Ticket #37973.
|
2017-03-10 14:14:46 -05:00
|
|
|
$body.on( 'click', 'tbody > tr > .check-column :checkbox', function( event ) {
|
2016-10-03 02:37:30 -04:00
|
|
|
// Shift click to select a range of checkboxes.
|
|
|
|
if ( 'undefined' == event.shiftKey ) { return true; }
|
|
|
|
if ( event.shiftKey ) {
|
2012-08-22 20:04:18 -04:00
|
|
|
if ( !lastClicked ) { return true; }
|
2015-09-19 12:41:24 -04:00
|
|
|
checks = $( lastClicked ).closest( 'form' ).find( ':checkbox' ).filter( ':visible:enabled' );
|
2012-08-22 20:04:18 -04:00
|
|
|
first = checks.index( lastClicked );
|
|
|
|
last = checks.index( this );
|
|
|
|
checked = $(this).prop('checked');
|
|
|
|
if ( 0 < first && 0 < last && first != last ) {
|
2013-08-27 16:50:10 -04:00
|
|
|
sliced = ( last > first ) ? checks.slice( first, last ) : checks.slice( last, first );
|
|
|
|
sliced.prop( 'checked', function() {
|
2012-08-22 20:04:18 -04:00
|
|
|
if ( $(this).closest('tr').is(':visible') )
|
|
|
|
return checked;
|
|
|
|
|
|
|
|
return false;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
lastClicked = this;
|
|
|
|
|
2016-10-03 02:37:30 -04:00
|
|
|
// Toggle the "Select all" checkboxes depending if the other ones are all checked or not.
|
2015-09-19 12:41:24 -04:00
|
|
|
var unchecked = $(this).closest('tbody').find(':checkbox').filter(':visible:enabled').not(':checked');
|
2012-08-22 20:04:18 -04:00
|
|
|
$(this).closest('table').children('thead, tfoot').find(':checkbox').prop('checked', function() {
|
2013-11-12 18:56:09 -05:00
|
|
|
return ( 0 === unchecked.length );
|
2012-08-22 20:04:18 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
return true;
|
|
|
|
});
|
|
|
|
|
2016-10-03 02:37:30 -04:00
|
|
|
// This event needs to be delegated. Ticket #37973.
|
|
|
|
$body.on( 'click.wp-toggle-checkboxes', 'thead .check-column :checkbox, tfoot .check-column :checkbox', function( event ) {
|
2014-01-01 19:11:14 -05:00
|
|
|
var $this = $(this),
|
|
|
|
$table = $this.closest( 'table' ),
|
|
|
|
controlChecked = $this.prop('checked'),
|
|
|
|
toggle = event.shiftKey || $this.data('wp-toggle');
|
|
|
|
|
|
|
|
$table.children( 'tbody' ).filter(':visible')
|
|
|
|
.children().children('.check-column').find(':checkbox')
|
|
|
|
.prop('checked', function() {
|
2015-09-19 12:41:24 -04:00
|
|
|
if ( $(this).is(':hidden,:disabled') ) {
|
2014-01-01 19:11:14 -05:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( toggle ) {
|
|
|
|
return ! $(this).prop( 'checked' );
|
|
|
|
} else if ( controlChecked ) {
|
|
|
|
return true;
|
|
|
|
}
|
2012-08-22 20:04:18 -04:00
|
|
|
|
|
|
|
return false;
|
2014-01-01 19:11:14 -05:00
|
|
|
});
|
|
|
|
|
|
|
|
$table.children('thead, tfoot').filter(':visible')
|
|
|
|
.children().children('.check-column').find(':checkbox')
|
|
|
|
.prop('checked', function() {
|
|
|
|
if ( toggle ) {
|
|
|
|
return false;
|
|
|
|
} else if ( controlChecked ) {
|
|
|
|
return true;
|
|
|
|
}
|
2012-08-22 20:04:18 -04:00
|
|
|
|
|
|
|
return false;
|
2014-01-01 19:11:14 -05:00
|
|
|
});
|
2012-08-22 20:04:18 -04:00
|
|
|
});
|
|
|
|
|
2013-09-23 22:50:09 -04:00
|
|
|
// Show row actions on keyboard focus of its parent container element or any other elements contained within
|
2015-02-22 15:14:25 -05:00
|
|
|
$( '#wpbody-content' ).on({
|
|
|
|
focusin: function() {
|
|
|
|
clearTimeout( transitionTimeout );
|
|
|
|
focusedRowActions = $( this ).find( '.row-actions' );
|
|
|
|
// transitionTimeout is necessary for Firefox, but Chrome won't remove the CSS class without a little help.
|
|
|
|
$( '.row-actions' ).not( this ).removeClass( 'visible' );
|
|
|
|
focusedRowActions.addClass( 'visible' );
|
|
|
|
},
|
|
|
|
focusout: function() {
|
|
|
|
// Tabbing between post title and .row-actions links needs a brief pause, otherwise
|
|
|
|
// the .row-actions div gets hidden in transit in some browsers (ahem, Firefox).
|
|
|
|
transitionTimeout = setTimeout( function() {
|
|
|
|
focusedRowActions.removeClass( 'visible' );
|
|
|
|
}, 30 );
|
|
|
|
}
|
2015-07-07 11:26:24 -04:00
|
|
|
}, '.has-row-actions' );
|
2013-09-23 22:50:09 -04:00
|
|
|
|
List tables: A better responsive view.
Instead of truncating columns, the data that's already in the markup can now be toggled into view. Only seems appropriate to celebrate four years of contributing by finally doing the first thing I ever mocked up.
Known issues / concerns:
* Custom list tables that don't define a primary column will show nothing at all. These are not extremely common, as `WP_List_Table` isn't really recommended for plugin consumption, but it happens. We need to come up with some kind of fallback.
* Some visual elements, particularly whitespace, could use refining.
* Needs a11y review.
* Touch performance on iOS feels sluggish - is there anything we can do about that?
* Would this be better accordion-style (only one expanded at a time)?
* Is `wp_strip_all_tags()` good enough for column titles that have HTML in them? It's essentially a workaround for the fact that core's comments column does that for the icon, which maybe it shouldn't. Perhaps worth another ticket, as a markup change would be fairly independent.
* Visual hierarchy is not great when expanded (also worthy of another ticket).
* Quick edit now becomes noticeably more annoying to cancel out of, as you have to scroll all the way down and you lose your position from before it was opened. Again, worthy of another ticket.
props Michael Arestad, helen.
see #32395.
Built from https://develop.svn.wordpress.org/trunk@33016
git-svn-id: http://core.svn.wordpress.org/trunk@32987 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-06-30 21:31:25 -04:00
|
|
|
// Toggle list table rows on small screens
|
|
|
|
$( 'tbody' ).on( 'click', '.toggle-row', function() {
|
|
|
|
$( this ).closest( 'tr' ).toggleClass( 'is-expanded' );
|
|
|
|
});
|
|
|
|
|
2012-08-22 20:04:18 -04:00
|
|
|
$('#default-password-nag-no').click( function() {
|
|
|
|
setUserSetting('default_password_nag', 'hide');
|
|
|
|
$('div.default-password-nag').hide();
|
|
|
|
return false;
|
|
|
|
});
|
|
|
|
|
|
|
|
// tab in textareas
|
|
|
|
$('#newcontent').bind('keydown.wpevent_InsertTab', function(e) {
|
|
|
|
var el = e.target, selStart, selEnd, val, scroll, sel;
|
|
|
|
|
|
|
|
if ( e.keyCode == 27 ) { // escape key
|
2015-03-26 18:35:27 -04:00
|
|
|
// when pressing Escape: Opera 12 and 27 blur form fields, IE 8 clears them
|
|
|
|
e.preventDefault();
|
2012-08-22 20:04:18 -04:00
|
|
|
$(el).data('tab-out', true);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( e.keyCode != 9 || e.ctrlKey || e.altKey || e.shiftKey ) // tab key
|
|
|
|
return;
|
|
|
|
|
|
|
|
if ( $(el).data('tab-out') ) {
|
|
|
|
$(el).data('tab-out', false);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
selStart = el.selectionStart;
|
|
|
|
selEnd = el.selectionEnd;
|
|
|
|
val = el.value;
|
|
|
|
|
|
|
|
if ( document.selection ) {
|
|
|
|
el.focus();
|
|
|
|
sel = document.selection.createRange();
|
|
|
|
sel.text = '\t';
|
|
|
|
} else if ( selStart >= 0 ) {
|
|
|
|
scroll = this.scrollTop;
|
|
|
|
el.value = val.substring(0, selStart).concat('\t', val.substring(selEnd) );
|
|
|
|
el.selectionStart = el.selectionEnd = selStart + 1;
|
|
|
|
this.scrollTop = scroll;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( e.stopPropagation )
|
|
|
|
e.stopPropagation();
|
|
|
|
if ( e.preventDefault )
|
|
|
|
e.preventDefault();
|
|
|
|
});
|
|
|
|
|
|
|
|
if ( pageInput.length ) {
|
2013-11-12 18:56:09 -05:00
|
|
|
pageInput.closest('form').submit( function() {
|
2012-08-22 20:04:18 -04:00
|
|
|
|
|
|
|
// Reset paging var for new filters/searches but not for bulk actions. See #17685.
|
|
|
|
if ( $('select[name="action"]').val() == -1 && $('select[name="action2"]').val() == -1 && pageInput.val() == currentPage )
|
|
|
|
pageInput.val('1');
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2013-10-02 21:09:10 -04:00
|
|
|
$('.search-box input[type="search"], .search-box input[type="submit"]').mousedown(function () {
|
|
|
|
$('select[name^="action"]').val('-1');
|
|
|
|
});
|
|
|
|
|
2012-10-16 17:26:59 -04:00
|
|
|
// Scroll into view when focused
|
|
|
|
$('#contextual-help-link, #show-settings-link').on( 'focus.scroll-into-view', function(e){
|
|
|
|
if ( e.target.scrollIntoView )
|
|
|
|
e.target.scrollIntoView(false);
|
|
|
|
});
|
2012-11-07 18:54:03 -05:00
|
|
|
|
|
|
|
// Disable upload buttons until files are selected
|
|
|
|
(function(){
|
|
|
|
var button, input, form = $('form.wp-upload-form');
|
|
|
|
if ( ! form.length )
|
|
|
|
return;
|
|
|
|
button = form.find('input[type="submit"]');
|
|
|
|
input = form.find('input[type="file"]');
|
2012-11-19 01:07:04 -05:00
|
|
|
|
2012-11-07 18:54:03 -05:00
|
|
|
function toggleUploadButton() {
|
2012-11-19 01:07:04 -05:00
|
|
|
button.prop('disabled', '' === input.map( function() {
|
|
|
|
return $(this).val();
|
|
|
|
}).get().join(''));
|
2012-11-07 18:54:03 -05:00
|
|
|
}
|
|
|
|
toggleUploadButton();
|
|
|
|
input.on('change', toggleUploadButton);
|
|
|
|
})();
|
2013-11-26 03:57:10 -05:00
|
|
|
|
2014-12-14 19:11:24 -05:00
|
|
|
function pinMenu( event ) {
|
|
|
|
var windowPos = $window.scrollTop(),
|
|
|
|
resizing = ! event || event.type !== 'scroll';
|
2014-10-04 23:09:20 -04:00
|
|
|
|
2014-10-21 02:12:20 -04:00
|
|
|
if ( isIOS || isIE8 || $adminmenu.data( 'wp-responsive' ) ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2014-12-14 19:11:24 -05:00
|
|
|
if ( height.menu + height.adminbar < height.window ||
|
|
|
|
height.menu + height.adminbar + 20 > height.wpwrap ) {
|
2014-10-21 02:12:20 -04:00
|
|
|
unpinMenu();
|
2014-10-04 23:09:20 -04:00
|
|
|
return;
|
|
|
|
}
|
2013-11-12 23:30:10 -05:00
|
|
|
|
2014-12-14 19:11:24 -05:00
|
|
|
menuIsPinned = true;
|
|
|
|
|
2014-10-04 23:09:20 -04:00
|
|
|
if ( height.menu + height.adminbar > height.window ) {
|
2014-12-13 20:47:23 -05:00
|
|
|
// Check for overscrolling
|
|
|
|
if ( windowPos < 0 ) {
|
|
|
|
if ( ! pinnedMenuTop ) {
|
|
|
|
pinnedMenuTop = true;
|
|
|
|
pinnedMenuBottom = false;
|
|
|
|
|
|
|
|
$adminMenuWrap.css({
|
|
|
|
position: 'fixed',
|
|
|
|
top: '',
|
|
|
|
bottom: ''
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
return;
|
2014-12-14 19:11:24 -05:00
|
|
|
} else if ( windowPos + height.window > $document.height() - 1 ) {
|
2014-12-13 20:47:23 -05:00
|
|
|
if ( ! pinnedMenuBottom ) {
|
|
|
|
pinnedMenuBottom = true;
|
|
|
|
pinnedMenuTop = false;
|
|
|
|
|
|
|
|
$adminMenuWrap.css({
|
|
|
|
position: 'fixed',
|
|
|
|
top: '',
|
|
|
|
bottom: 0
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2014-10-04 23:09:20 -04:00
|
|
|
if ( windowPos > lastScrollPosition ) {
|
|
|
|
// Scrolling down
|
2014-10-15 02:05:18 -04:00
|
|
|
if ( pinnedMenuTop ) {
|
2014-10-04 23:09:20 -04:00
|
|
|
// let it scroll
|
2014-10-15 02:05:18 -04:00
|
|
|
pinnedMenuTop = false;
|
2014-10-21 02:12:20 -04:00
|
|
|
menuTop = $adminMenuWrap.offset().top - height.adminbar - ( windowPos - lastScrollPosition );
|
|
|
|
|
|
|
|
if ( menuTop + height.menu + height.adminbar < windowPos + height.window ) {
|
|
|
|
menuTop = windowPos + height.window - height.menu - height.adminbar;
|
|
|
|
}
|
2014-10-04 23:09:20 -04:00
|
|
|
|
|
|
|
$adminMenuWrap.css({
|
|
|
|
position: 'absolute',
|
|
|
|
top: menuTop,
|
|
|
|
bottom: ''
|
|
|
|
});
|
2014-10-15 02:05:18 -04:00
|
|
|
} else if ( ! pinnedMenuBottom && $adminMenuWrap.offset().top + height.menu < windowPos + height.window ) {
|
2014-10-04 23:09:20 -04:00
|
|
|
// pin the bottom
|
2014-10-15 02:05:18 -04:00
|
|
|
pinnedMenuBottom = true;
|
2014-10-04 23:09:20 -04:00
|
|
|
|
|
|
|
$adminMenuWrap.css({
|
|
|
|
position: 'fixed',
|
|
|
|
top: '',
|
|
|
|
bottom: 0
|
|
|
|
});
|
2013-11-26 03:57:10 -05:00
|
|
|
}
|
2014-10-04 23:09:20 -04:00
|
|
|
} else if ( windowPos < lastScrollPosition ) {
|
|
|
|
// Scrolling up
|
2014-10-15 02:05:18 -04:00
|
|
|
if ( pinnedMenuBottom ) {
|
2014-10-04 23:09:20 -04:00
|
|
|
// let it scroll
|
2014-10-15 02:05:18 -04:00
|
|
|
pinnedMenuBottom = false;
|
2014-10-21 02:12:20 -04:00
|
|
|
menuTop = $adminMenuWrap.offset().top - height.adminbar + ( lastScrollPosition - windowPos );
|
|
|
|
|
|
|
|
if ( menuTop + height.menu > windowPos + height.window ) {
|
|
|
|
menuTop = windowPos;
|
|
|
|
}
|
2014-10-04 23:09:20 -04:00
|
|
|
|
|
|
|
$adminMenuWrap.css({
|
|
|
|
position: 'absolute',
|
|
|
|
top: menuTop,
|
|
|
|
bottom: ''
|
|
|
|
});
|
2014-10-15 02:05:18 -04:00
|
|
|
} else if ( ! pinnedMenuTop && $adminMenuWrap.offset().top >= windowPos + height.adminbar ) {
|
2014-10-04 23:09:20 -04:00
|
|
|
// pin the top
|
2014-10-15 02:05:18 -04:00
|
|
|
pinnedMenuTop = true;
|
2014-10-04 23:09:20 -04:00
|
|
|
|
|
|
|
$adminMenuWrap.css({
|
|
|
|
position: 'fixed',
|
|
|
|
top: '',
|
|
|
|
bottom: ''
|
|
|
|
});
|
2013-11-12 23:30:10 -05:00
|
|
|
}
|
2014-12-14 19:11:24 -05:00
|
|
|
} else if ( resizing ) {
|
2014-10-15 02:05:18 -04:00
|
|
|
// Resizing
|
|
|
|
pinnedMenuTop = pinnedMenuBottom = false;
|
2014-10-21 02:12:20 -04:00
|
|
|
menuTop = windowPos + height.window - height.menu - height.adminbar - 1;
|
2014-10-15 02:05:18 -04:00
|
|
|
|
2014-10-21 02:12:20 -04:00
|
|
|
if ( menuTop > 0 ) {
|
|
|
|
$adminMenuWrap.css({
|
|
|
|
position: 'absolute',
|
|
|
|
top: menuTop,
|
|
|
|
bottom: ''
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
unpinMenu();
|
|
|
|
}
|
2013-11-12 23:30:10 -05:00
|
|
|
}
|
2013-11-26 03:57:10 -05:00
|
|
|
}
|
2014-10-04 23:09:20 -04:00
|
|
|
|
|
|
|
lastScrollPosition = windowPos;
|
|
|
|
}
|
|
|
|
|
2014-12-13 20:47:23 -05:00
|
|
|
function resetHeights() {
|
|
|
|
height = {
|
|
|
|
window: $window.height(),
|
|
|
|
wpwrap: $wpwrap.height(),
|
|
|
|
adminbar: $adminbar.height(),
|
|
|
|
menu: $adminMenuWrap.height()
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2014-10-15 02:05:18 -04:00
|
|
|
function unpinMenu() {
|
2014-12-14 19:11:24 -05:00
|
|
|
if ( isIOS || ! menuIsPinned ) {
|
2014-10-15 02:05:18 -04:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2014-12-14 19:11:24 -05:00
|
|
|
pinnedMenuTop = pinnedMenuBottom = menuIsPinned = false;
|
2014-10-15 02:05:18 -04:00
|
|
|
$adminMenuWrap.css({
|
|
|
|
position: '',
|
|
|
|
top: '',
|
|
|
|
bottom: ''
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2014-10-04 23:09:20 -04:00
|
|
|
function setPinMenu() {
|
2014-12-13 20:47:23 -05:00
|
|
|
resetHeights();
|
|
|
|
|
2014-10-04 23:09:20 -04:00
|
|
|
if ( $adminmenu.data('wp-responsive') ) {
|
|
|
|
$body.removeClass( 'sticky-menu' );
|
2014-10-15 02:05:18 -04:00
|
|
|
unpinMenu();
|
2014-10-04 23:09:20 -04:00
|
|
|
} else if ( height.menu + height.adminbar > height.window ) {
|
|
|
|
pinMenu();
|
2014-10-15 02:05:18 -04:00
|
|
|
$body.removeClass( 'sticky-menu' );
|
2014-10-04 23:09:20 -04:00
|
|
|
} else {
|
|
|
|
$body.addClass( 'sticky-menu' );
|
2014-10-15 02:05:18 -04:00
|
|
|
unpinMenu();
|
2014-10-04 23:09:20 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-10-15 02:05:18 -04:00
|
|
|
if ( ! isIOS ) {
|
2014-12-14 19:11:24 -05:00
|
|
|
$window.on( 'scroll.pin-menu', pinMenu );
|
|
|
|
$document.on( 'tinymce-editor-init.pin-menu', function( event, editor ) {
|
|
|
|
editor.on( 'wp-autoresize', resetHeights );
|
2014-12-13 20:47:23 -05:00
|
|
|
});
|
2014-10-15 02:05:18 -04:00
|
|
|
}
|
2014-10-04 23:09:20 -04:00
|
|
|
|
2013-11-26 03:57:10 -05:00
|
|
|
window.wpResponsive = {
|
|
|
|
init: function() {
|
2015-03-27 13:48:30 -04:00
|
|
|
var self = this;
|
2013-11-26 03:57:10 -05:00
|
|
|
|
|
|
|
// Modify functionality based on custom activate/deactivate event
|
|
|
|
$document.on( 'wp-responsive-activate.wp-responsive', function() {
|
|
|
|
self.activate();
|
|
|
|
}).on( 'wp-responsive-deactivate.wp-responsive', function() {
|
|
|
|
self.deactivate();
|
|
|
|
});
|
|
|
|
|
2014-01-22 15:08:11 -05:00
|
|
|
$( '#wp-admin-bar-menu-toggle a' ).attr( 'aria-expanded', 'false' );
|
|
|
|
|
2013-11-26 03:57:10 -05:00
|
|
|
// Toggle sidebar when toggle is clicked
|
|
|
|
$( '#wp-admin-bar-menu-toggle' ).on( 'click.wp-responsive', function( event ) {
|
|
|
|
event.preventDefault();
|
2015-07-02 23:29:25 -04:00
|
|
|
|
|
|
|
// close any open toolbar submenus
|
|
|
|
$adminbar.find( '.hover' ).removeClass( 'hover' );
|
|
|
|
|
2013-11-26 03:57:10 -05:00
|
|
|
$wpwrap.toggleClass( 'wp-responsive-open' );
|
2015-03-27 13:48:30 -04:00
|
|
|
if ( $wpwrap.hasClass( 'wp-responsive-open' ) ) {
|
2014-01-22 15:08:11 -05:00
|
|
|
$(this).find('a').attr( 'aria-expanded', 'true' );
|
|
|
|
$( '#adminmenu a:first' ).focus();
|
|
|
|
} else {
|
|
|
|
$(this).find('a').attr( 'aria-expanded', 'false' );
|
|
|
|
}
|
2013-11-26 03:57:10 -05:00
|
|
|
} );
|
|
|
|
|
|
|
|
// Add menu events
|
2014-07-19 14:55:16 -04:00
|
|
|
$adminmenu.on( 'click.wp-responsive', 'li.wp-has-submenu > a', function( event ) {
|
|
|
|
if ( ! $adminmenu.data('wp-responsive') ) {
|
2013-11-26 03:57:10 -05:00
|
|
|
return;
|
|
|
|
}
|
2013-11-12 23:30:10 -05:00
|
|
|
|
2013-12-01 22:19:11 -05:00
|
|
|
$( this ).parent( 'li' ).toggleClass( 'selected' );
|
2013-11-26 03:57:10 -05:00
|
|
|
event.preventDefault();
|
|
|
|
});
|
2013-11-13 13:00:10 -05:00
|
|
|
|
2013-11-26 03:57:10 -05:00
|
|
|
self.trigger();
|
|
|
|
$document.on( 'wp-window-resized.wp-responsive', $.proxy( this.trigger, this ) );
|
2013-12-01 22:19:11 -05:00
|
|
|
|
|
|
|
// This needs to run later as UI Sortable may be initialized later on $(document).ready()
|
|
|
|
$window.on( 'load.wp-responsive', function() {
|
|
|
|
var width = navigator.userAgent.indexOf('AppleWebKit/') > -1 ? $window.width() : window.innerWidth;
|
|
|
|
|
|
|
|
if ( width <= 782 ) {
|
|
|
|
self.disableSortables();
|
|
|
|
}
|
|
|
|
});
|
2013-11-26 03:57:10 -05:00
|
|
|
},
|
2013-11-13 13:00:10 -05:00
|
|
|
|
2013-11-26 03:57:10 -05:00
|
|
|
activate: function() {
|
2014-10-04 23:09:20 -04:00
|
|
|
setPinMenu();
|
2013-11-13 13:00:10 -05:00
|
|
|
|
2013-11-26 03:57:10 -05:00
|
|
|
if ( ! $body.hasClass( 'auto-fold' ) ) {
|
|
|
|
$body.addClass( 'auto-fold' );
|
|
|
|
}
|
2013-11-13 13:00:10 -05:00
|
|
|
|
2013-11-26 03:57:10 -05:00
|
|
|
$adminmenu.data( 'wp-responsive', 1 );
|
|
|
|
this.disableSortables();
|
|
|
|
},
|
2013-11-13 13:00:10 -05:00
|
|
|
|
2013-11-26 03:57:10 -05:00
|
|
|
deactivate: function() {
|
2014-10-04 23:09:20 -04:00
|
|
|
setPinMenu();
|
2013-11-26 03:57:10 -05:00
|
|
|
$adminmenu.removeData('wp-responsive');
|
|
|
|
this.enableSortables();
|
|
|
|
},
|
2013-11-13 13:00:10 -05:00
|
|
|
|
2013-11-26 03:57:10 -05:00
|
|
|
trigger: function() {
|
2016-11-04 13:18:57 -04:00
|
|
|
var viewportWidth = getViewportWidth();
|
2013-12-06 15:50:10 -05:00
|
|
|
|
2016-11-04 13:18:57 -04:00
|
|
|
// Exclude IE < 9, it doesn't support @media CSS rules.
|
|
|
|
if ( ! viewportWidth ) {
|
2013-12-06 15:50:10 -05:00
|
|
|
return;
|
|
|
|
}
|
2013-11-13 13:00:10 -05:00
|
|
|
|
2016-11-04 13:18:57 -04:00
|
|
|
if ( viewportWidth <= 782 ) {
|
2013-11-26 03:57:10 -05:00
|
|
|
if ( ! wpResponsiveActive ) {
|
|
|
|
$document.trigger( 'wp-responsive-activate' );
|
|
|
|
wpResponsiveActive = true;
|
|
|
|
}
|
2013-11-13 13:00:10 -05:00
|
|
|
} else {
|
2013-11-26 03:57:10 -05:00
|
|
|
if ( wpResponsiveActive ) {
|
|
|
|
$document.trigger( 'wp-responsive-deactivate' );
|
|
|
|
wpResponsiveActive = false;
|
|
|
|
}
|
2013-11-13 13:00:10 -05:00
|
|
|
}
|
|
|
|
|
2016-11-04 13:18:57 -04:00
|
|
|
if ( viewportWidth <= 480 ) {
|
2013-11-26 03:57:10 -05:00
|
|
|
this.enableOverlay();
|
2013-11-13 13:00:10 -05:00
|
|
|
} else {
|
2013-11-26 03:57:10 -05:00
|
|
|
this.disableOverlay();
|
2013-11-13 13:00:10 -05:00
|
|
|
}
|
2013-11-26 03:57:10 -05:00
|
|
|
},
|
2013-11-13 13:00:10 -05:00
|
|
|
|
2013-11-26 03:57:10 -05:00
|
|
|
enableOverlay: function() {
|
|
|
|
if ( $overlay.length === 0 ) {
|
|
|
|
$overlay = $( '<div id="wp-responsive-overlay"></div>' )
|
|
|
|
.insertAfter( '#wpcontent' )
|
|
|
|
.hide()
|
|
|
|
.on( 'click.wp-responsive', function() {
|
|
|
|
$toolbar.find( '.menupop.hover' ).removeClass( 'hover' );
|
|
|
|
$( this ).hide();
|
|
|
|
});
|
|
|
|
}
|
2013-11-13 13:00:10 -05:00
|
|
|
|
2013-11-26 03:57:10 -05:00
|
|
|
$toolbarPopups.on( 'click.wp-responsive', function() {
|
|
|
|
$overlay.show();
|
|
|
|
});
|
|
|
|
},
|
2013-11-13 13:00:10 -05:00
|
|
|
|
2013-11-26 03:57:10 -05:00
|
|
|
disableOverlay: function() {
|
|
|
|
$toolbarPopups.off( 'click.wp-responsive' );
|
|
|
|
$overlay.hide();
|
|
|
|
},
|
2013-11-13 13:00:10 -05:00
|
|
|
|
2013-11-26 03:57:10 -05:00
|
|
|
disableSortables: function() {
|
|
|
|
if ( $sortables.length ) {
|
|
|
|
try {
|
|
|
|
$sortables.sortable('disable');
|
|
|
|
} catch(e) {}
|
|
|
|
}
|
|
|
|
},
|
2013-11-13 13:00:10 -05:00
|
|
|
|
2013-11-26 03:57:10 -05:00
|
|
|
enableSortables: function() {
|
|
|
|
if ( $sortables.length ) {
|
|
|
|
try {
|
|
|
|
$sortables.sortable('enable');
|
|
|
|
} catch(e) {}
|
|
|
|
}
|
2013-11-13 13:00:10 -05:00
|
|
|
}
|
2013-11-26 03:57:10 -05:00
|
|
|
};
|
2013-11-13 13:00:10 -05:00
|
|
|
|
2015-12-15 08:25:28 -05:00
|
|
|
// Add an ARIA role `button` to elements that behave like UI controls when JavaScript is on.
|
|
|
|
function aria_button_if_js() {
|
|
|
|
$( '.aria-button-if-js' ).attr( 'role', 'button' );
|
|
|
|
}
|
|
|
|
|
|
|
|
$( document ).ajaxComplete( function() {
|
|
|
|
aria_button_if_js();
|
|
|
|
});
|
|
|
|
|
2016-11-04 13:18:57 -04:00
|
|
|
/**
|
|
|
|
* @summary Get the viewport width.
|
|
|
|
*
|
2016-11-17 13:28:30 -05:00
|
|
|
* @since 4.7.0
|
2016-11-04 13:18:57 -04:00
|
|
|
*
|
|
|
|
* @returns {number|boolean} The current viewport width or false if the
|
|
|
|
* browser doesn't support innerWidth (IE < 9).
|
|
|
|
*/
|
|
|
|
function getViewportWidth() {
|
|
|
|
var viewportWidth = false;
|
|
|
|
|
|
|
|
if ( window.innerWidth ) {
|
|
|
|
// On phones, window.innerWidth is affected by zooming.
|
|
|
|
viewportWidth = Math.max( window.innerWidth, document.documentElement.clientWidth );
|
|
|
|
}
|
|
|
|
|
|
|
|
return viewportWidth;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @summary Set the admin menu collapsed/expanded state.
|
|
|
|
*
|
|
|
|
* Sets the global variable `menuState` and triggers a custom event passing
|
|
|
|
* the current menu state.
|
|
|
|
*
|
2016-11-17 13:28:30 -05:00
|
|
|
* @since 4.7.0
|
2016-11-04 13:18:57 -04:00
|
|
|
*
|
|
|
|
* @returns {void}
|
|
|
|
*/
|
|
|
|
function setMenuState() {
|
|
|
|
var viewportWidth = getViewportWidth() || 961;
|
|
|
|
|
|
|
|
if ( viewportWidth <= 782 ) {
|
|
|
|
menuState = 'responsive';
|
|
|
|
} else if ( $body.hasClass( 'folded' ) || ( $body.hasClass( 'auto-fold' ) && viewportWidth <= 960 && viewportWidth > 782 ) ) {
|
|
|
|
menuState = 'folded';
|
|
|
|
} else {
|
|
|
|
menuState = 'open';
|
|
|
|
}
|
|
|
|
|
|
|
|
$document.trigger( 'wp-menu-state-set', { state: menuState } );
|
|
|
|
}
|
|
|
|
|
|
|
|
// Set the menu state when the window gets resized.
|
|
|
|
$document.on( 'wp-window-resized.set-menu-state', setMenuState );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @summary Set ARIA attributes on the collapse/expand menu button.
|
|
|
|
*
|
|
|
|
* When the admin menu is open or folded, updates the `aria-expanded` and
|
|
|
|
* `aria-label` attributes of the button to give feedback to assistive
|
|
|
|
* technologies. In the responsive view, the button is always hidden.
|
|
|
|
*
|
2016-11-17 13:28:30 -05:00
|
|
|
* @since 4.7.0
|
2016-11-04 13:18:57 -04:00
|
|
|
*
|
|
|
|
* @returns {void}
|
|
|
|
*/
|
|
|
|
$document.on( 'wp-menu-state-set wp-collapse-menu', function( event, eventData ) {
|
|
|
|
var $collapseButton = $( '#collapse-button' ),
|
|
|
|
ariaExpanded = 'true',
|
|
|
|
ariaLabelText = commonL10n.collapseMenu;
|
|
|
|
|
|
|
|
if ( 'folded' === eventData.state ) {
|
|
|
|
ariaExpanded = 'false';
|
|
|
|
ariaLabelText = commonL10n.expandMenu;
|
|
|
|
}
|
|
|
|
|
|
|
|
$collapseButton.attr({
|
|
|
|
'aria-expanded': ariaExpanded,
|
|
|
|
'aria-label': ariaLabelText
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2013-11-26 03:57:10 -05:00
|
|
|
window.wpResponsive.init();
|
2014-10-21 02:12:20 -04:00
|
|
|
setPinMenu();
|
2016-11-04 13:18:57 -04:00
|
|
|
setMenuState();
|
2015-10-20 23:41:24 -04:00
|
|
|
currentMenuItemHasPopup();
|
2015-11-18 15:10:26 -05:00
|
|
|
makeNoticesDismissible();
|
2015-12-15 08:25:28 -05:00
|
|
|
aria_button_if_js();
|
2014-10-21 02:12:20 -04:00
|
|
|
|
2015-05-09 20:32:31 -04:00
|
|
|
$document.on( 'wp-pin-menu wp-window-resized.pin-menu postboxes-columnchange.pin-menu postbox-toggled.pin-menu wp-collapse-menu.pin-menu wp-scroll-start.pin-menu', setPinMenu );
|
2016-01-22 09:26:27 -05:00
|
|
|
|
|
|
|
// Set initial focus on a specific element.
|
|
|
|
$( '.wp-initial-focus' ).focus();
|
2017-05-11 19:50:41 -04:00
|
|
|
|
|
|
|
// Toggle update details on update-core.php.
|
|
|
|
$body.on( 'click', '.js-update-details-toggle', function() {
|
|
|
|
var $updateNotice = $( this ).closest( '.js-update-details' ),
|
|
|
|
$progressDiv = $( '#' + $updateNotice.data( 'update-details' ) );
|
|
|
|
|
|
|
|
/*
|
|
|
|
* When clicking on "Show details" move the progress div below the update
|
|
|
|
* notice. Make sure it gets moved just the first time.
|
|
|
|
*/
|
|
|
|
if ( ! $progressDiv.hasClass( 'update-details-moved' ) ) {
|
|
|
|
$progressDiv.insertAfter( $updateNotice ).addClass( 'update-details-moved' );
|
|
|
|
}
|
|
|
|
|
|
|
|
// Toggle the progress div visibility.
|
|
|
|
$progressDiv.toggle();
|
|
|
|
// Toggle the Show Details button expanded state.
|
2017-05-12 03:05:41 -04:00
|
|
|
$( this ).attr( 'aria-expanded', $progressDiv.is( ':visible' ) );
|
|
|
|
});
|
2013-11-26 03:57:10 -05:00
|
|
|
});
|
2013-11-13 13:00:10 -05:00
|
|
|
|
2014-10-15 02:05:18 -04:00
|
|
|
// Fire a custom jQuery event at the end of window resize
|
|
|
|
( function() {
|
|
|
|
var timeout;
|
|
|
|
|
|
|
|
function triggerEvent() {
|
2015-10-20 23:41:24 -04:00
|
|
|
$document.trigger( 'wp-window-resized' );
|
2014-10-15 02:05:18 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
function fireOnce() {
|
|
|
|
window.clearTimeout( timeout );
|
|
|
|
timeout = window.setTimeout( triggerEvent, 200 );
|
|
|
|
}
|
|
|
|
|
2015-10-20 23:41:24 -04:00
|
|
|
$window.on( 'resize.wp-fire-once', fireOnce );
|
2014-10-15 02:05:18 -04:00
|
|
|
}());
|
|
|
|
|
2014-07-09 18:06:15 -04:00
|
|
|
// Make Windows 8 devices play along nicely.
|
2013-11-15 01:37:09 -05:00
|
|
|
(function(){
|
|
|
|
if ( '-ms-user-select' in document.documentElement.style && navigator.userAgent.match(/IEMobile\/10\.0/) ) {
|
|
|
|
var msViewportStyle = document.createElement( 'style' );
|
|
|
|
msViewportStyle.appendChild(
|
|
|
|
document.createTextNode( '@-ms-viewport{width:auto!important}' )
|
|
|
|
);
|
|
|
|
document.getElementsByTagName( 'head' )[0].appendChild( msViewportStyle );
|
|
|
|
}
|
|
|
|
})();
|
2013-11-13 13:00:10 -05:00
|
|
|
|
2013-11-26 03:57:10 -05:00
|
|
|
}( jQuery, window ));
|