2019-11-02 10:38:58 +01:00
/ * *
* This file contains the functions needed for the inline editing of posts .
*
* @ since 2.7 . 0
* @ output wp - admin / js / inline - edit - post . js
* /
2020-09-15 14:29:22 +02:00
/* global ajaxurl, typenow, inlineEditPost */
2019-11-02 10:38:58 +01:00
window . wp = window . wp || { } ;
/ * *
* Manages the quick edit and bulk edit windows for editing posts or pages .
*
* @ namespace inlineEditPost
*
* @ since 2.7 . 0
*
* @ type { Object }
*
* @ property { string } type The type of inline editor .
2020-09-15 14:29:22 +02:00
* @ property { string } what The prefix before the post ID .
2019-11-02 10:38:58 +01:00
*
* /
( function ( $ , wp ) {
window . inlineEditPost = {
/ * *
* Initializes the inline and bulk post editor .
*
2020-05-06 17:23:38 +02:00
* Binds event handlers to the Escape key to close the inline editor
2019-11-02 10:38:58 +01:00
* and to the save and close buttons . Changes DOM to be ready for inline
* editing . Adds event handler to bulk edit .
*
* @ since 2.7 . 0
*
2020-05-06 17:23:38 +02:00
* @ memberof inlineEditPost
*
* @ return { void }
2019-11-02 10:38:58 +01:00
* /
init : function ( ) {
var t = this , qeRow = $ ( '#inline-edit' ) , bulkRow = $ ( '#bulk-edit' ) ;
t . type = $ ( 'table.widefat' ) . hasClass ( 'pages' ) ? 'page' : 'post' ;
2020-05-06 17:23:38 +02:00
// Post ID prefix.
2019-11-02 10:38:58 +01:00
t . what = '#post-' ;
/ * *
2020-05-06 17:23:38 +02:00
* Binds the Escape key to revert the changes and close the quick editor .
2019-11-02 10:38:58 +01:00
*
2020-05-06 17:23:38 +02:00
* @ return { boolean } The result of revert .
2019-11-02 10:38:58 +01:00
* /
2021-04-27 08:32:47 +02:00
qeRow . on ( 'keyup' , function ( e ) {
2020-05-06 17:23:38 +02:00
// Revert changes if Escape key is pressed.
2019-11-02 10:38:58 +01:00
if ( e . which === 27 ) {
return inlineEditPost . revert ( ) ;
}
} ) ;
/ * *
2020-05-06 17:23:38 +02:00
* Binds the Escape key to revert the changes and close the bulk editor .
2019-11-02 10:38:58 +01:00
*
2020-05-06 17:23:38 +02:00
* @ return { boolean } The result of revert .
2019-11-02 10:38:58 +01:00
* /
2021-04-27 08:32:47 +02:00
bulkRow . on ( 'keyup' , function ( e ) {
2020-05-06 17:23:38 +02:00
// Revert changes if Escape key is pressed.
2019-11-02 10:38:58 +01:00
if ( e . which === 27 ) {
return inlineEditPost . revert ( ) ;
}
} ) ;
/ * *
* Reverts changes and close the quick editor if the cancel button is clicked .
*
2020-05-06 17:23:38 +02:00
* @ return { boolean } The result of revert .
2019-11-02 10:38:58 +01:00
* /
2021-04-27 08:32:47 +02:00
$ ( '.cancel' , qeRow ) . on ( 'click' , function ( ) {
2019-11-02 10:38:58 +01:00
return inlineEditPost . revert ( ) ;
} ) ;
/ * *
* Saves changes in the quick editor if the save ( named : update ) button is clicked .
*
2020-05-06 17:23:38 +02:00
* @ return { boolean } The result of save .
2019-11-02 10:38:58 +01:00
* /
2021-04-27 08:32:47 +02:00
$ ( '.save' , qeRow ) . on ( 'click' , function ( ) {
2019-11-02 10:38:58 +01:00
return inlineEditPost . save ( this ) ;
} ) ;
/ * *
2020-05-06 17:23:38 +02:00
* If Enter is pressed , and the target is not the cancel button , save the post .
2019-11-02 10:38:58 +01:00
*
2020-05-06 17:23:38 +02:00
* @ return { boolean } The result of save .
2019-11-02 10:38:58 +01:00
* /
2021-04-27 08:32:47 +02:00
$ ( 'td' , qeRow ) . on ( 'keydown' , function ( e ) {
2019-11-02 10:38:58 +01:00
if ( e . which === 13 && ! $ ( e . target ) . hasClass ( 'cancel' ) ) {
return inlineEditPost . save ( this ) ;
}
} ) ;
/ * *
* Reverts changes and close the bulk editor if the cancel button is clicked .
*
2020-05-06 17:23:38 +02:00
* @ return { boolean } The result of revert .
2019-11-02 10:38:58 +01:00
* /
2021-04-27 08:32:47 +02:00
$ ( '.cancel' , bulkRow ) . on ( 'click' , function ( ) {
2019-11-02 10:38:58 +01:00
return inlineEditPost . revert ( ) ;
} ) ;
/ * *
* Disables the password input field when the private post checkbox is checked .
* /
2021-04-27 08:32:47 +02:00
$ ( '#inline-edit .inline-edit-private input[value="private"]' ) . on ( 'click' , function ( ) {
2019-11-02 10:38:58 +01:00
var pw = $ ( 'input.inline-edit-password-input' ) ;
if ( $ ( this ) . prop ( 'checked' ) ) {
pw . val ( '' ) . prop ( 'disabled' , true ) ;
} else {
pw . prop ( 'disabled' , false ) ;
}
} ) ;
/ * *
* Binds click event to the . editinline button which opens the quick editor .
* /
$ ( '#the-list' ) . on ( 'click' , '.editinline' , function ( ) {
$ ( this ) . attr ( 'aria-expanded' , 'true' ) ;
inlineEditPost . edit ( this ) ;
} ) ;
2025-02-28 08:42:11 +01:00
// Clone quick edit categories for the bulk editor.
var beCategories = $ ( '#inline-edit fieldset.inline-edit-categories' ) . clone ( ) ;
// Make "id" attributes globally unique.
beCategories . find ( '*[id]' ) . each ( function ( ) {
this . id = 'bulk-edit-' + this . id ;
} ) ;
2019-11-02 10:38:58 +01:00
$ ( '#bulk-edit' ) . find ( 'fieldset:first' ) . after (
2025-02-28 08:42:11 +01:00
beCategories
2019-11-02 10:38:58 +01:00
) . siblings ( 'fieldset:last' ) . prepend (
2022-06-16 14:03:35 +02:00
$ ( '#inline-edit .inline-edit-tags-wrap' ) . clone ( )
2019-11-02 10:38:58 +01:00
) ;
$ ( 'select[name="_status"] option[value="future"]' , bulkRow ) . remove ( ) ;
/ * *
* Adds onclick events to the apply buttons .
* /
2021-04-27 08:32:47 +02:00
$ ( '#doaction' ) . on ( 'click' , function ( e ) {
2025-02-28 08:42:11 +01:00
var n ,
$itemsSelected = $ ( '#posts-filter .check-column input[type="checkbox"]:checked' ) ;
if ( $itemsSelected . length < 1 ) {
return ;
}
2019-11-02 10:38:58 +01:00
t . whichBulkButtonId = $ ( this ) . attr ( 'id' ) ;
n = t . whichBulkButtonId . substr ( 2 ) ;
if ( 'edit' === $ ( 'select[name="' + n + '"]' ) . val ( ) ) {
e . preventDefault ( ) ;
t . setBulk ( ) ;
} else if ( $ ( 'form#posts-filter tr.inline-editor' ) . length > 0 ) {
t . revert ( ) ;
}
} ) ;
} ,
/ * *
* Toggles the quick edit window , hiding it when it ' s active and showing it when
* inactive .
*
* @ since 2.7 . 0
*
2020-05-06 17:23:38 +02:00
* @ memberof inlineEditPost
*
2019-11-02 10:38:58 +01:00
* @ param { Object } el Element within a post table row .
* /
toggle : function ( el ) {
var t = this ;
$ ( t . what + t . getId ( el ) ) . css ( 'display' ) === 'none' ? t . revert ( ) : t . edit ( el ) ;
} ,
/ * *
* Creates the bulk editor row to edit multiple posts at once .
*
* @ since 2.7 . 0
2020-05-06 17:23:38 +02:00
*
* @ memberof inlineEditPost
2019-11-02 10:38:58 +01:00
* /
setBulk : function ( ) {
var te = '' , type = this . type , c = true ;
2024-04-17 11:32:24 +02:00
var checkedPosts = $ ( 'tbody th.check-column input[type="checkbox"]:checked' ) ;
var categories = { } ;
2019-11-02 10:38:58 +01:00
this . revert ( ) ;
$ ( '#bulk-edit td' ) . attr ( 'colspan' , $ ( 'th:visible, td:visible' , '.widefat:first thead' ) . length ) ;
// Insert the editor at the top of the table with an empty row above to maintain zebra striping.
$ ( 'table.widefat tbody' ) . prepend ( $ ( '#bulk-edit' ) ) . prepend ( '<tr class="hidden"></tr>' ) ;
$ ( '#bulk-edit' ) . addClass ( 'inline-editor' ) . show ( ) ;
/ * *
* Create a HTML div with the title and a link ( delete - icon ) for each selected
* post .
*
* Get the selected posts based on the checked checkboxes in the post table .
* /
$ ( 'tbody th.check-column input[type="checkbox"]' ) . each ( function ( ) {
// If the checkbox for a post is selected, add the post to the edit list.
if ( $ ( this ) . prop ( 'checked' ) ) {
c = false ;
2022-06-16 14:03:35 +02:00
var id = $ ( this ) . val ( ) ,
theTitle = $ ( '#inline_' + id + ' .post_title' ) . html ( ) || wp . i18n . _ _ ( '(no title)' ) ,
buttonVisuallyHiddenText = wp . i18n . sprintf (
/* translators: %s: Post title. */
wp . i18n . _ _ ( 'Remove “%s” from Bulk Edit' ) ,
theTitle
) ;
te += '<li class="ntdelitem"><button type="button" id="_' + id + '" class="button-link ntdelbutton"><span class="screen-reader-text">' + buttonVisuallyHiddenText + '</span></button><span class="ntdeltitle" aria-hidden="true">' + theTitle + '</span></li>' ;
2019-11-02 10:38:58 +01:00
}
} ) ;
// If no checkboxes where checked, just hide the quick/bulk edit rows.
if ( c ) {
return this . revert ( ) ;
}
2022-06-16 14:03:35 +02:00
// Populate the list of items to bulk edit.
$ ( '#bulk-titles' ) . html ( '<ul id="bulk-titles-list" role="list">' + te + '</ul>' ) ;
2024-04-17 11:32:24 +02:00
// Gather up some statistics on which of these checked posts are in which categories.
checkedPosts . each ( function ( ) {
var id = $ ( this ) . val ( ) ;
var checked = $ ( '#category_' + id ) . text ( ) . split ( ',' ) ;
checked . map ( function ( cid ) {
categories [ cid ] || ( categories [ cid ] = 0 ) ;
// Just record that this category is checked.
categories [ cid ] ++ ;
} ) ;
} ) ;
// Compute initial states.
$ ( '.inline-edit-categories input[name="post_category[]"]' ) . each ( function ( ) {
if ( categories [ $ ( this ) . val ( ) ] == checkedPosts . length ) {
// If the number of checked categories matches the number of selected posts, then all posts are in this category.
$ ( this ) . prop ( 'checked' , true ) ;
} else if ( categories [ $ ( this ) . val ( ) ] > 0 ) {
// If the number is less than the number of selected posts, then it's indeterminate.
$ ( this ) . prop ( 'indeterminate' , true ) ;
if ( ! $ ( this ) . parent ( ) . find ( 'input[name="indeterminate_post_category[]"]' ) . length ) {
// Get the term label text.
var label = $ ( this ) . parent ( ) . text ( ) ;
2025-02-28 08:42:11 +01:00
// Set indeterminate states for the backend. Add accessible text for indeterminate inputs.
2024-04-17 11:32:24 +02:00
$ ( this ) . after ( '<input type="hidden" name="indeterminate_post_category[]" value="' + $ ( this ) . val ( ) + '">' ) . attr ( 'aria-label' , label . trim ( ) + ': ' + wp . i18n . _ _ ( 'Some selected posts have this category' ) ) ;
}
}
} ) ;
$ ( '.inline-edit-categories input[name="post_category[]"]:indeterminate' ) . on ( 'change' , function ( ) {
// Remove accessible label text. Remove the indeterminate flags as there was a specific state change.
$ ( this ) . removeAttr ( 'aria-label' ) . parent ( ) . find ( 'input[name="indeterminate_post_category[]"]' ) . remove ( ) ;
} ) ;
$ ( '.inline-edit-save button' ) . on ( 'click' , function ( ) {
$ ( '.inline-edit-categories input[name="post_category[]"]' ) . prop ( 'indeterminate' , false ) ;
} ) ;
2019-11-02 10:38:58 +01:00
/ * *
2022-06-16 14:03:35 +02:00
* Binds on click events to handle the list of items to bulk edit .
2019-11-02 10:38:58 +01:00
*
* @ listens click
* /
2022-06-16 14:03:35 +02:00
$ ( '#bulk-titles .ntdelbutton' ) . click ( function ( ) {
var $this = $ ( this ) ,
id = $this . attr ( 'id' ) . substr ( 1 ) ,
$prev = $this . parent ( ) . prev ( ) . children ( '.ntdelbutton' ) ,
$next = $this . parent ( ) . next ( ) . children ( '.ntdelbutton' ) ;
2024-04-17 11:32:24 +02:00
$ ( 'input#cb-select-all-1, input#cb-select-all-2' ) . prop ( 'checked' , false ) ;
2022-06-16 14:03:35 +02:00
$ ( 'table.widefat input[value="' + id + '"]' ) . prop ( 'checked' , false ) ;
$ ( '#_' + id ) . parent ( ) . remove ( ) ;
wp . a11y . speak ( wp . i18n . _ _ ( 'Item removed.' ) , 'assertive' ) ;
// Move focus to a proper place when items are removed.
if ( $next . length ) {
$next . focus ( ) ;
} else if ( $prev . length ) {
$prev . focus ( ) ;
} else {
$ ( '#bulk-titles-list' ) . remove ( ) ;
inlineEditPost . revert ( ) ;
wp . a11y . speak ( wp . i18n . _ _ ( 'All selected items have been removed. Select new items to use Bulk Actions.' ) ) ;
}
2019-11-02 10:38:58 +01:00
} ) ;
// Enable auto-complete for tags when editing posts.
if ( 'post' === type ) {
$ ( 'tr.inline-editor textarea[data-wp-taxonomy]' ) . each ( function ( i , element ) {
/ *
* While Quick Edit clones the form each time , Bulk Edit always re - uses
* the same form . Let ' s check if an autocomplete instance already exists .
* /
if ( $ ( element ) . autocomplete ( 'instance' ) ) {
// jQuery equivalent of `continue` within an `each()` loop.
return ;
}
$ ( element ) . wpTagsSuggest ( ) ;
} ) ;
}
2022-06-16 14:03:35 +02:00
// Set initial focus on the Bulk Edit region.
$ ( '#bulk-edit .inline-edit-wrapper' ) . attr ( 'tabindex' , '-1' ) . focus ( ) ;
2019-11-02 10:38:58 +01:00
// Scrolls to the top of the table where the editor is rendered.
$ ( 'html, body' ) . animate ( { scrollTop : 0 } , 'fast' ) ;
} ,
/ * *
* Creates a quick edit window for the post that has been clicked .
*
* @ since 2.7 . 0
*
2020-05-06 17:23:38 +02:00
* @ memberof inlineEditPost
*
2020-09-15 14:29:22 +02:00
* @ param { number | Object } id The ID of the clicked post or an element within a post
2019-11-02 10:38:58 +01:00
* table row .
2020-05-06 17:23:38 +02:00
* @ return { boolean } Always returns false at the end of execution .
2019-11-02 10:38:58 +01:00
* /
edit : function ( id ) {
var t = this , fields , editRow , rowData , status , pageOpt , pageLevel , nextPage , pageLoop = true , nextLevel , f , val , pw ;
t . revert ( ) ;
if ( typeof ( id ) === 'object' ) {
id = t . getId ( id ) ;
}
fields = [ 'post_title' , 'post_name' , 'post_author' , '_status' , 'jj' , 'mm' , 'aa' , 'hh' , 'mn' , 'ss' , 'post_password' , 'post_format' , 'menu_order' , 'page_template' ] ;
if ( t . type === 'page' ) {
fields . push ( 'post_parent' ) ;
}
// Add the new edit row with an extra blank row underneath to maintain zebra striping.
editRow = $ ( '#inline-edit' ) . clone ( true ) ;
$ ( 'td' , editRow ) . attr ( 'colspan' , $ ( 'th:visible, td:visible' , '.widefat:first thead' ) . length ) ;
2022-06-16 14:03:35 +02:00
// Remove the ID from the copied row and let the `for` attribute reference the hidden ID.
$ ( 'td' , editRow ) . find ( '#quick-edit-legend' ) . removeAttr ( 'id' ) ;
$ ( 'td' , editRow ) . find ( 'p[id^="quick-edit-"]' ) . removeAttr ( 'id' ) ;
2019-11-02 10:38:58 +01:00
$ ( t . what + id ) . removeClass ( 'is-expanded' ) . hide ( ) . after ( editRow ) . after ( '<tr class="hidden"></tr>' ) ;
// Populate fields in the quick edit window.
rowData = $ ( '#inline_' + id ) ;
if ( ! $ ( ':input[name="post_author"] option[value="' + $ ( '.post_author' , rowData ) . text ( ) + '"]' , editRow ) . val ( ) ) {
// The post author no longer has edit capabilities, so we need to add them to the list of authors.
2023-04-26 17:39:43 +02:00
$ ( ':input[name="post_author"]' , editRow ) . prepend ( '<option value="' + $ ( '.post_author' , rowData ) . text ( ) + '">' + $ ( '#post-' + id + ' .author' ) . text ( ) + '</option>' ) ;
2019-11-02 10:38:58 +01:00
}
if ( $ ( ':input[name="post_author"] option' , editRow ) . length === 1 ) {
$ ( 'label.inline-edit-author' , editRow ) . hide ( ) ;
}
for ( f = 0 ; f < fields . length ; f ++ ) {
val = $ ( '.' + fields [ f ] , rowData ) ;
/ * *
* Replaces the image for a Twemoji ( Twitter emoji ) with it ' s alternate text .
*
2020-05-06 17:23:38 +02:00
* @ return { string } Alternate text from the image .
2019-11-02 10:38:58 +01:00
* /
val . find ( 'img' ) . replaceWith ( function ( ) { return this . alt ; } ) ;
val = val . text ( ) ;
$ ( ':input[name="' + fields [ f ] + '"]' , editRow ) . val ( val ) ;
}
if ( $ ( '.comment_status' , rowData ) . text ( ) === 'open' ) {
$ ( 'input[name="comment_status"]' , editRow ) . prop ( 'checked' , true ) ;
}
if ( $ ( '.ping_status' , rowData ) . text ( ) === 'open' ) {
$ ( 'input[name="ping_status"]' , editRow ) . prop ( 'checked' , true ) ;
}
if ( $ ( '.sticky' , rowData ) . text ( ) === 'sticky' ) {
$ ( 'input[name="sticky"]' , editRow ) . prop ( 'checked' , true ) ;
}
/ * *
* Creates the select boxes for the categories .
* /
$ ( '.post_category' , rowData ) . each ( function ( ) {
var taxname ,
term _ids = $ ( this ) . text ( ) ;
if ( term _ids ) {
taxname = $ ( this ) . attr ( 'id' ) . replace ( '_' + id , '' ) ;
$ ( 'ul.' + taxname + '-checklist :checkbox' , editRow ) . val ( term _ids . split ( ',' ) ) ;
}
} ) ;
/ * *
* Gets all the taxonomies for live auto - fill suggestions when typing the name
* of a tag .
* /
$ ( '.tags_input' , rowData ) . each ( function ( ) {
var terms = $ ( this ) ,
taxname = $ ( this ) . attr ( 'id' ) . replace ( '_' + id , '' ) ,
textarea = $ ( 'textarea.tax_input_' + taxname , editRow ) ,
2020-09-15 14:29:22 +02:00
comma = wp . i18n . _x ( ',' , 'tag delimiter' ) . trim ( ) ;
2019-11-02 10:38:58 +01:00
2020-12-10 14:06:04 +01:00
// Ensure the textarea exists.
if ( ! textarea . length ) {
return ;
}
2019-11-02 10:38:58 +01:00
terms . find ( 'img' ) . replaceWith ( function ( ) { return this . alt ; } ) ;
terms = terms . text ( ) ;
if ( terms ) {
if ( ',' !== comma ) {
terms = terms . replace ( /,/g , comma ) ;
}
textarea . val ( terms ) ;
}
textarea . wpTagsSuggest ( ) ;
} ) ;
// Handle the post status.
2023-09-26 10:33:34 +02:00
var post _date _string = $ ( ':input[name="aa"]' ) . val ( ) + '-' + $ ( ':input[name="mm"]' ) . val ( ) + '-' + $ ( ':input[name="jj"]' ) . val ( ) ;
post _date _string += ' ' + $ ( ':input[name="hh"]' ) . val ( ) + ':' + $ ( ':input[name="mn"]' ) . val ( ) + ':' + $ ( ':input[name="ss"]' ) . val ( ) ;
var post _date = new Date ( post _date _string ) ;
2019-11-02 10:38:58 +01:00
status = $ ( '._status' , rowData ) . text ( ) ;
2023-09-26 10:33:34 +02:00
if ( 'future' !== status && Date . now ( ) > post _date ) {
2019-11-02 10:38:58 +01:00
$ ( 'select[name="_status"] option[value="future"]' , editRow ) . remove ( ) ;
2023-09-26 10:33:34 +02:00
} else {
$ ( 'select[name="_status"] option[value="publish"]' , editRow ) . remove ( ) ;
2019-11-02 10:38:58 +01:00
}
pw = $ ( '.inline-edit-password-input' ) . prop ( 'disabled' , false ) ;
if ( 'private' === status ) {
$ ( 'input[name="keep_private"]' , editRow ) . prop ( 'checked' , true ) ;
pw . val ( '' ) . prop ( 'disabled' , true ) ;
}
// Remove the current page and children from the parent dropdown.
pageOpt = $ ( 'select[name="post_parent"] option[value="' + id + '"]' , editRow ) ;
if ( pageOpt . length > 0 ) {
pageLevel = pageOpt [ 0 ] . className . split ( '-' ) [ 1 ] ;
nextPage = pageOpt ;
while ( pageLoop ) {
nextPage = nextPage . next ( 'option' ) ;
if ( nextPage . length === 0 ) {
break ;
}
nextLevel = nextPage [ 0 ] . className . split ( '-' ) [ 1 ] ;
if ( nextLevel <= pageLevel ) {
pageLoop = false ;
} else {
nextPage . remove ( ) ;
nextPage = pageOpt ;
}
}
pageOpt . remove ( ) ;
}
$ ( editRow ) . attr ( 'id' , 'edit-' + id ) . addClass ( 'inline-editor' ) . show ( ) ;
2021-04-27 08:32:47 +02:00
$ ( '.ptitle' , editRow ) . trigger ( 'focus' ) ;
2019-11-02 10:38:58 +01:00
return false ;
} ,
/ * *
* Saves the changes made in the quick edit window to the post .
2020-09-15 14:29:22 +02:00
* Ajax saving is only for Quick Edit and not for bulk edit .
2019-11-02 10:38:58 +01:00
*
* @ since 2.7 . 0
*
2020-09-15 14:29:22 +02:00
* @ param { number } id The ID for the post that has been changed .
* @ return { boolean } False , so the form does not submit when pressing
* Enter on a focused field .
2019-11-02 10:38:58 +01:00
* /
save : function ( id ) {
var params , fields , page = $ ( '.post_status_page' ) . val ( ) || '' ;
if ( typeof ( id ) === 'object' ) {
id = this . getId ( id ) ;
}
$ ( 'table.widefat .spinner' ) . addClass ( 'is-active' ) ;
params = {
action : 'inline-save' ,
post _type : typenow ,
post _ID : id ,
edit _date : 'true' ,
post _status : page
} ;
fields = $ ( '#edit-' + id ) . find ( ':input' ) . serialize ( ) ;
params = fields + '&' + $ . param ( params ) ;
2020-05-06 17:23:38 +02:00
// Make Ajax request.
2019-11-02 10:38:58 +01:00
$ . post ( ajaxurl , params ,
function ( r ) {
var $errorNotice = $ ( '#edit-' + id + ' .inline-edit-save .notice-error' ) ,
$error = $errorNotice . find ( '.error' ) ;
$ ( 'table.widefat .spinner' ) . removeClass ( 'is-active' ) ;
if ( r ) {
if ( - 1 !== r . indexOf ( '<tr' ) ) {
$ ( inlineEditPost . what + id ) . siblings ( 'tr.hidden' ) . addBack ( ) . remove ( ) ;
$ ( '#edit-' + id ) . before ( r ) . remove ( ) ;
$ ( inlineEditPost . what + id ) . hide ( ) . fadeIn ( 400 , function ( ) {
// Move focus back to the Quick Edit button. $( this ) is the row being animated.
$ ( this ) . find ( '.editinline' )
. attr ( 'aria-expanded' , 'false' )
2021-04-27 08:32:47 +02:00
. trigger ( 'focus' ) ;
2020-09-15 14:29:22 +02:00
wp . a11y . speak ( wp . i18n . _ _ ( 'Changes saved.' ) ) ;
2019-11-02 10:38:58 +01:00
} ) ;
} else {
r = r . replace ( /<.[^<>]*?>/g , '' ) ;
$errorNotice . removeClass ( 'hidden' ) ;
$error . html ( r ) ;
wp . a11y . speak ( $error . text ( ) ) ;
}
} else {
$errorNotice . removeClass ( 'hidden' ) ;
2020-09-15 14:29:22 +02:00
$error . text ( wp . i18n . _ _ ( 'Error while saving the changes.' ) ) ;
wp . a11y . speak ( wp . i18n . _ _ ( 'Error while saving the changes.' ) ) ;
2019-11-02 10:38:58 +01:00
}
} ,
'html' ) ;
// Prevent submitting the form when pressing Enter on a focused field.
return false ;
} ,
/ * *
* Hides and empties the Quick Edit and / or Bulk Edit windows .
*
* @ since 2.7 . 0
*
2020-05-06 17:23:38 +02:00
* @ memberof inlineEditPost
*
* @ return { boolean } Always returns false .
2019-11-02 10:38:58 +01:00
* /
revert : function ( ) {
var $tableWideFat = $ ( '.widefat' ) ,
id = $ ( '.inline-editor' , $tableWideFat ) . attr ( 'id' ) ;
if ( id ) {
$ ( '.spinner' , $tableWideFat ) . removeClass ( 'is-active' ) ;
if ( 'bulk-edit' === id ) {
// Hide the bulk editor.
$ ( '#bulk-edit' , $tableWideFat ) . removeClass ( 'inline-editor' ) . hide ( ) . siblings ( '.hidden' ) . remove ( ) ;
$ ( '#bulk-titles' ) . empty ( ) ;
// Store the empty bulk editor in a hidden element.
$ ( '#inlineedit' ) . append ( $ ( '#bulk-edit' ) ) ;
// Move focus back to the Bulk Action button that was activated.
2021-04-27 08:32:47 +02:00
$ ( '#' + inlineEditPost . whichBulkButtonId ) . trigger ( 'focus' ) ;
2019-11-02 10:38:58 +01:00
} else {
// Remove both the inline-editor and its hidden tr siblings.
$ ( '#' + id ) . siblings ( 'tr.hidden' ) . addBack ( ) . remove ( ) ;
id = id . substr ( id . lastIndexOf ( '-' ) + 1 ) ;
// Show the post row and move focus back to the Quick Edit button.
$ ( this . what + id ) . show ( ) . find ( '.editinline' )
. attr ( 'aria-expanded' , 'false' )
2021-04-27 08:32:47 +02:00
. trigger ( 'focus' ) ;
2019-11-02 10:38:58 +01:00
}
}
return false ;
} ,
/ * *
2020-09-15 14:29:22 +02:00
* Gets the ID for a the post that you want to quick edit from the row in the quick
2019-11-02 10:38:58 +01:00
* edit table .
*
* @ since 2.7 . 0
*
2020-05-06 17:23:38 +02:00
* @ memberof inlineEditPost
*
2020-09-15 14:29:22 +02:00
* @ param { Object } o DOM row object to get the ID for .
* @ return { string } The post ID extracted from the table row in the object .
2019-11-02 10:38:58 +01:00
* /
getId : function ( o ) {
var id = $ ( o ) . closest ( 'tr' ) . attr ( 'id' ) ,
parts = id . split ( '-' ) ;
return parts [ parts . length - 1 ] ;
}
} ;
2021-07-23 11:58:50 +02:00
$ ( function ( ) { inlineEditPost . init ( ) ; } ) ;
2019-11-02 10:38:58 +01:00
// Show/hide locks on posts.
2021-07-23 11:58:50 +02:00
$ ( function ( ) {
2025-02-28 08:42:11 +01:00
// Set the heartbeat interval to 10 seconds.
2021-07-23 11:58:50 +02:00
if ( typeof wp !== 'undefined' && wp . heartbeat ) {
2025-02-28 08:42:11 +01:00
wp . heartbeat . interval ( 10 ) ;
2021-07-23 11:58:50 +02:00
}
} ) . on ( 'heartbeat-tick.wp-check-locked-posts' , function ( e , data ) {
2019-11-02 10:38:58 +01:00
var locked = data [ 'wp-check-locked-posts' ] || { } ;
$ ( '#the-list tr' ) . each ( function ( i , el ) {
var key = el . id , row = $ ( el ) , lock _data , avatar ;
if ( locked . hasOwnProperty ( key ) ) {
if ( ! row . hasClass ( 'wp-locked' ) ) {
lock _data = locked [ key ] ;
row . find ( '.column-title .locked-text' ) . text ( lock _data . text ) ;
row . find ( '.check-column checkbox' ) . prop ( 'checked' , false ) ;
if ( lock _data . avatar _src ) {
2020-09-15 14:29:22 +02:00
avatar = $ ( '<img />' , {
'class' : 'avatar avatar-18 photo' ,
width : 18 ,
height : 18 ,
alt : '' ,
src : lock _data . avatar _src ,
srcset : lock _data . avatar _src _2x ? lock _data . avatar _src _2x + ' 2x' : undefined
} ) ;
2019-11-02 10:38:58 +01:00
row . find ( '.column-title .locked-avatar' ) . empty ( ) . append ( avatar ) ;
}
row . addClass ( 'wp-locked' ) ;
}
} else if ( row . hasClass ( 'wp-locked' ) ) {
2019-11-15 22:59:44 +01:00
row . removeClass ( 'wp-locked' ) . find ( '.locked-info span' ) . empty ( ) ;
2019-11-02 10:38:58 +01:00
}
} ) ;
} ) . on ( 'heartbeat-send.wp-check-locked-posts' , function ( e , data ) {
var check = [ ] ;
$ ( '#the-list tr' ) . each ( function ( i , el ) {
if ( el . id ) {
check . push ( el . id ) ;
}
} ) ;
if ( check . length ) {
data [ 'wp-check-locked-posts' ] = check ;
}
} ) ;
} ) ( jQuery , window . wp ) ;