jenkins-bot has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/375973 )
Change subject: Add tooltips when attaching the handler ...................................................................... Add tooltips when attaching the handler The tooltips are not right while loading and for clients with disabled JavaScript. Add the title attribute with JavaScript instead of PHP. Centralize attaching in new function attachHandler. Change-Id: I2a1b29ca204b61b5fec1d3244528e3f3d8ed6ad7 --- M CategoryTreeFunctions.php M modules/ext.categoryTree.js 2 files changed, 147 insertions(+), 139 deletions(-) Approvals: Krinkle: Looks good to me, approved jenkins-bot: Verified diff --git a/CategoryTreeFunctions.php b/CategoryTreeFunctions.php index 52a4f00..2ac0cd7 100644 --- a/CategoryTreeFunctions.php +++ b/CategoryTreeFunctions.php @@ -629,11 +629,9 @@ $tag = 'span'; if ( $children == 0 ) { $txt = wfMessage( 'categorytree-expand-bullet' )->plain(); - $linkattr[ 'title' ] = wfMessage( 'categorytree-expand' )->plain(); $linkattr[ 'data-ct-state' ] = 'collapsed'; } else { $txt = wfMessage( 'categorytree-collapse-bullet' )->plain(); - $linkattr[ 'title' ] = wfMessage( 'categorytree-collapse' )->plain(); $linkattr[ 'data-ct-loaded' ] = true; $linkattr[ 'data-ct-state' ] = 'expanded'; } diff --git a/modules/ext.categoryTree.js b/modules/ext.categoryTree.js index a30ee38..9e48711 100644 --- a/modules/ext.categoryTree.js +++ b/modules/ext.categoryTree.js @@ -12,158 +12,168 @@ ( function ( $, mw ) { - mw.hook( 'wikipage.content' ).add( function ( $content ) { + /** + * Attach click handler to buttons + * + * @param {jQuery} $content + */ + function attachHandler( $content ) { + $content.find( '.CategoryTreeToggle' ) + .click( handleNode ) + .attr( 'title', function () { + return mw.msg( + $( this ).data( 'ct-state' ) === 'collapsed' ? + 'categorytree-expand' : + 'categorytree-collapse' + ); + } ) + .addClass( 'CategoryTreeToggleHandlerAttached' ); + } + + /** + * Handles clicks on the expand buttons, and calls the appropriate function + * + * @context {Element} CategoryTreeToggle + */ + function handleNode() { + var $link = $( this ); + if ( $link.data( 'ct-state' ) === 'collapsed' ) { + expandNode( $link ); + } else { + collapseNode( $link ); + } + } + + /** + * Expands a given node (loading it's children if not loaded) + * + * @param {jQuery} $link + */ + function expandNode( $link ) { + // Show the children node + var $children = $link.parents( '.CategoryTreeItem' ) + .siblings( '.CategoryTreeChildren' ); + $children.show(); + + $link + .text( mw.msg( 'categorytree-collapse-bullet' ) ) + .attr( 'title', mw.msg( 'categorytree-collapse' ) ) + .data( 'ct-state', 'expanded' ); + + if ( !$link.data( 'ct-loaded' ) ) { + loadChildren( $link, $children ); + } + } + + /** + * Collapses a node + * + * @param {jQuery} $link + */ + function collapseNode( $link ) { + // Hide the children node + $link.parents( '.CategoryTreeItem' ) + .siblings( '.CategoryTreeChildren' ).hide(); + + $link + .text( mw.msg( 'categorytree-expand-bullet' ) ) + .attr( 'title', mw.msg( 'categorytree-expand' ) ) + .data( 'ct-state', 'collapsed' ); + } + + /** + * Loads children for a node via an HTTP call + * + * @param {jQuery} $link + * @param {jQuery} $children + */ + function loadChildren( $link, $children ) { + var $linkParentCTTag, ctTitle, ctMode, ctOptions; /** - * Handles clicks on the expand buttons, and calls the appropriate function - * - * @context {Element} CategoryTreeToggle + * Error callback */ - function handleNode() { - var $link = $( this ); - if ( $link.data( 'ct-state' ) === 'collapsed' ) { - expandNode( $link ); - } else { - collapseNode( $link ); - } + function error() { + var $retryLink; + + $retryLink = $( '<a>' ) + .text( mw.msg( 'categorytree-retry' ) ) + .attr( 'href', '#' ) + .click( function ( e ) { + e.preventDefault(); + loadChildren( $link, $children ); + } ); + + $children + .text( mw.msg( 'categorytree-error' ) + ' ' ) + .append( $retryLink ); } - /** - * Expands a given node (loading it's children if not loaded) - * - * @param {jQuery} $link - */ - function expandNode( $link ) { - // Show the children node - var $children = $link.parents( '.CategoryTreeItem' ) - .siblings( '.CategoryTreeChildren' ); - $children.show(); + $link.data( 'ct-loaded', true ); - $link - .text( mw.msg( 'categorytree-collapse-bullet' ) ) - .attr( 'title', mw.msg( 'categorytree-collapse' ) ) - .data( 'ct-state', 'expanded' ); + $children.append( + $( '<i class="CategoryTreeNotice"></i>' ) + .text( mw.msg( 'categorytree-loading' ) ) + ); - if ( !$link.data( 'ct-loaded' ) ) { - loadChildren( $link, $children ); - } + $linkParentCTTag = $link.parents( '.CategoryTreeTag' ); + + // Element may not have a .CategoryTreeTag parent, fallback to defauls + // Probably a CategoryPage (@todo: based on what?) + ctTitle = $link.data( 'ct-title' ); + ctMode = $linkParentCTTag.data( 'ct-mode' ); + ctMode = typeof ctMode === 'number' ? ctMode : undefined; + ctOptions = JSON.stringify( $linkParentCTTag.data( 'ct-options' ) ); + if ( !ctOptions ) { + ctOptions = mw.config.get( 'wgCategoryTreePageCategoryOptions' ); } - /** - * Collapses a node - * - * @param {jQuery} $link - */ - function collapseNode( $link ) { - // Hide the children node - $link.parents( '.CategoryTreeItem' ) - .siblings( '.CategoryTreeChildren' ).hide(); - - $link - .text( mw.msg( 'categorytree-expand-bullet' ) ) - .attr( 'title', mw.msg( 'categorytree-expand' ) ) - .data( 'ct-state', 'collapsed' ); + // Mode and options have defaults or fallbacks, title does not. + // Don't make a request if there is no title. + if ( typeof ctTitle !== 'string' ) { + error(); + return; } - /** - * Loads children for a node via an HTTP call - * - * @param {jQuery} $link - * @param {jQuery} $children - */ - function loadChildren( $link, $children ) { - var $linkParentCTTag, ctTitle, ctMode, ctOptions; + new mw.Api().get( { + action: 'categorytree', + category: ctTitle, + options: ctOptions, + uselang: mw.config.get( 'wgUserLanguage' ), + formatversion: 2 + } ).done( function ( data ) { + data = data.categorytree.html; - /** - * Error callback - */ - function error() { - var $retryLink; - - $retryLink = $( '<a>' ) - .text( mw.msg( 'categorytree-retry' ) ) - .attr( 'href', '#' ) - .click( function ( e ) { - e.preventDefault(); - loadChildren( $link, $children ); - } ); - - $children - .text( mw.msg( 'categorytree-error' ) + ' ' ) - .append( $retryLink ); - } - - $link.data( 'ct-loaded', true ); - - $children.append( - $( '<i class="CategoryTreeNotice"></i>' ) - .text( mw.msg( 'categorytree-loading' ) ) - ); - - $linkParentCTTag = $link.parents( '.CategoryTreeTag' ); - - // Element may not have a .CategoryTreeTag parent, fallback to defauls - // Probably a CategoryPage (@todo: based on what?) - ctTitle = $link.data( 'ct-title' ); - ctMode = $linkParentCTTag.data( 'ct-mode' ); - ctMode = typeof ctMode === 'number' ? ctMode : undefined; - ctOptions = JSON.stringify( $linkParentCTTag.data( 'ct-options' ) ); - if ( !ctOptions ) { - ctOptions = mw.config.get( 'wgCategoryTreePageCategoryOptions' ); - } - - // Mode and options have defaults or fallbacks, title does not. - // Don't make a request if there is no title. - if ( typeof ctTitle !== 'string' ) { - error(); - return; - } - - new mw.Api().get( { - action: 'categorytree', - category: ctTitle, - options: ctOptions, - uselang: mw.config.get( 'wgUserLanguage' ), - formatversion: 2 - } ).done( function ( data ) { - data = data.categorytree.html; - - if ( data === '' ) { - switch ( ctMode ) { - // CategoryTreeMode::CATEGORIES = 0 - case 0: - data = mw.msg( 'categorytree-no-subcategories' ); - break; - // CategoryTreeMode::PAGES = 10 - case 10: - data = mw.msg( 'categorytree-no-pages' ); - break; - // CategoryTreeMode::PARENTS = 100 - case 100: - data = mw.msg( 'categorytree-no-parent-categories' ); - break; - // CategoryTreeMode::ALL = 20 - default: - data = mw.msg( 'categorytree-nothing-found' ); - } - - data = $( '<i class="CategoryTreeNotice"></i>' ).text( data ); + if ( data === '' ) { + switch ( ctMode ) { + // CategoryTreeMode::CATEGORIES = 0 + case 0: + data = mw.msg( 'categorytree-no-subcategories' ); + break; + // CategoryTreeMode::PAGES = 10 + case 10: + data = mw.msg( 'categorytree-no-pages' ); + break; + // CategoryTreeMode::PARENTS = 100 + case 100: + data = mw.msg( 'categorytree-no-parent-categories' ); + break; + // CategoryTreeMode::ALL = 20 + default: + data = mw.msg( 'categorytree-nothing-found' ); } - $children - .html( data ) - .find( '.CategoryTreeToggle' ) - .click( handleNode ) - .addClass( 'CategoryTreeToggleHandlerAttached' ); + data = $( '<i class="CategoryTreeNotice"></i>' ).text( data ); + } - } ) - .fail( error ); - } + $children.html( data ); + attachHandler( $children ); - // Register click events - $content.find( '.CategoryTreeToggle' ) - .click( handleNode ) - .addClass( 'CategoryTreeToggleHandlerAttached' ); - } ); + } ) + .fail( error ); + } + + // Register click events + mw.hook( 'wikipage.content' ).add( attachHandler ); }( jQuery, mediaWiki ) ); -- To view, visit https://gerrit.wikimedia.org/r/375973 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I2a1b29ca204b61b5fec1d3244528e3f3d8ed6ad7 Gerrit-PatchSet: 2 Gerrit-Project: mediawiki/extensions/CategoryTree Gerrit-Branch: master Gerrit-Owner: Fomafix <foma...@googlemail.com> Gerrit-Reviewer: Fomafix <foma...@googlemail.com> Gerrit-Reviewer: Krinkle <krinklem...@gmail.com> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits