mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/CategoryTree
synced 2024-11-30 19:16:15 +00:00
070e6af90c
The extension CT_* defines are replaced by class constants. We currently keep the former defines in CategoryTree.php, to help to set the default configuration. When the code will be migrated to use the extension registration, we'll remove the defines. Bug: T87888 Change-Id: I59e6b9319fd5130c51a23f21ea81d4dbf3f28b8e
175 lines
4.2 KiB
JavaScript
175 lines
4.2 KiB
JavaScript
/**
|
|
* JavaScript for the CategoryTree extension.
|
|
*
|
|
* @file
|
|
* @ingroup Extensions
|
|
* @author Daniel Kinzler, brightbyte.de
|
|
* @copyright © 2006 Daniel Kinzler
|
|
* @licence GNU General Public Licence 2.0 or later
|
|
*/
|
|
|
|
( function ( $, mw ) {
|
|
|
|
mw.hook( 'wikipage.content' ).add( function ( $content ) {
|
|
|
|
/**
|
|
* Sets display inline to tree toggle
|
|
*/
|
|
function showToggles() {
|
|
$content.find( 'span.CategoryTreeToggle' ).css( 'display', 'inline' );
|
|
}
|
|
|
|
/**
|
|
* Handles clicks on the expand buttons, and calls the appropriate function
|
|
*
|
|
* @context {Element} CategoryTreeToggle
|
|
* @param e {jQuery.Event}
|
|
*/
|
|
function handleNode( /*e*/ ) {
|
|
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;
|
|
|
|
/**
|
|
* 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 );
|
|
}
|
|
|
|
$children
|
|
.html( data )
|
|
.find( '.CategoryTreeToggle' )
|
|
.click( handleNode );
|
|
|
|
showToggles();
|
|
} )
|
|
.fail( error );
|
|
}
|
|
|
|
// Register click events and show toggle buttons
|
|
$content.find( '.CategoryTreeToggle' ).click( handleNode );
|
|
showToggles();
|
|
} );
|
|
|
|
}( jQuery, mediaWiki ) );
|