MediaWiki:Common.js:修订间差异

Add JS to hide 首页 from AllPages list
 
Fix: check exclusion list on load so button reflects correct state after refresh
 
(未显示同一用户的1个中间版本)
第1行: 第1行:
/* Common.js — site-wide JavaScript */
/* ── AllPages: filter excluded pages from homepage list ───────────── */
$( function () {
    var chunk = document.querySelector( '.mw-allpages-chunk' );
    if ( !chunk ) { return; }


/* Hide the main page (首页) entry from the AllPages list on the homepage */
    // Always hide the main page entry
$( function () {
     chunk.querySelectorAll( 'li' ).forEach( function ( li ) {
     var allpages = document.querySelector( '.mw-allpages-chunk' );
    if ( !allpages ) { return; }
    allpages.querySelectorAll( 'li' ).forEach( function ( li ) {
         var a = li.querySelector( 'a' );
         var a = li.querySelector( 'a' );
         if ( a && ( a.title === '首页' || a.title === 'Main Page' ) ) {
         if ( a && ( a.title === '首页' || a.title === 'Main Page' ) ) {
             li.remove();
             li.remove();
         }
         }
    } );
    // Fetch server-side exclusion list and apply
    new mw.Api().get( {
        action: 'query', prop: 'revisions', rvprop: 'content',
        titles: 'MediaWiki:Allpages-exclude', format: 'json'
    } ).done( function ( data ) {
        var page = Object.values( data.query.pages )[ 0 ];
        if ( !page || page.missing !== undefined || !page.revisions ) { return; }
        var excluded = page.revisions[ 0 ][ '*' ]
            .split( '\n' ).map( function ( s ) { return s.trim(); } ).filter( Boolean );
        chunk.querySelectorAll( 'li' ).forEach( function ( li ) {
            var a = li.querySelector( 'a' );
            if ( a && excluded.indexOf( a.title ) !== -1 ) { li.remove(); }
        } );
    } );
} );
/* ── "Hide from homepage" button — visible to sysops only ─────────── */
$( function () {
    var groups = mw.config.get( 'wgUserGroups' ) || [];
    if ( groups.indexOf( 'sysop' ) === -1 ) { return; }
    var pageTitle = mw.config.get( 'wgPageName' ).replace( /_/g, ' ' );
    if ( pageTitle === '首页' ) { return; }
    var btn = document.createElement( 'button' );
    btn.id = 'hp-hide-btn';
    btn.disabled = true;                      // disabled until state is known
    btn.innerHTML = '…';
    document.body.appendChild( btn );
    var api = new mw.Api();
    /* ── Read exclusion list; set initial button state ────────────── */
    function loadExclusionList( cb ) {
        api.get( {
            action: 'query', prop: 'revisions', rvprop: 'content',
            titles: 'MediaWiki:Allpages-exclude', format: 'json'
        } ).done( function ( data ) {
            var page  = Object.values( data.query.pages )[ 0 ];
            var lines = [];
            if ( page && page.revisions ) {
                lines = page.revisions[ 0 ][ '*' ]
                    .split( '\n' ).map( function ( s ) { return s.trim(); } ).filter( Boolean );
            }
            cb( lines );
        } ).fail( function () { cb( [] ); } );
    }
    function setHidden() {
        btn.innerHTML      = '✓ Hidden from homepage';
        btn.style.background = '#38a169';
        btn.disabled      = true;
    }
    function setVisible() {
        btn.innerHTML = '🚫 Hide from homepage';
        btn.style.background = '';
        btn.disabled  = false;
    }
    /* ── On load: check if already excluded ──────────────────────── */
    loadExclusionList( function ( lines ) {
        if ( lines.indexOf( pageTitle ) !== -1 ) {
            setHidden();
        } else {
            setVisible();
        }
    } );
    /* ── On click: add to exclusion list ─────────────────────────── */
    btn.addEventListener( 'click', function () {
        btn.disabled  = true;
        btn.innerHTML = 'Saving…';
        loadExclusionList( function ( lines ) {
            if ( lines.indexOf( pageTitle ) !== -1 ) {
                setHidden();
                return;
            }
            lines.push( pageTitle );
            api.postWithToken( 'csrf', {
                action: 'edit',
                title: 'MediaWiki:Allpages-exclude',
                text: lines.join( '\n' ),
                summary: 'Hide "' + pageTitle + '" from homepage list'
            } ).done( function () {
                mw.notify( '"' + pageTitle + '" hidden from homepage.', { type: 'success' } );
                setHidden();
            } ).fail( function () {
                mw.notify( 'Failed — check interface-admin rights.', { type: 'error' } );
                setVisible();
            } );
        } );
     } );
     } );
} );
} );