MediaWiki:Common.js:修订间差异

Add AllPages exclusion filter + sysop hide-from-homepage button
Fix: check exclusion list on load so button reflects correct state after refresh
 
第34行: 第34行:


     var pageTitle = mw.config.get( 'wgPageName' ).replace( /_/g, ' ' );
     var pageTitle = mw.config.get( 'wgPageName' ).replace( /_/g, ' ' );
    var mainPage  = '首页';
     if ( pageTitle === '首页' ) { return; }
     if ( pageTitle === mainPage ) { return; }   // don't show on the main page itself


     var btn = document.createElement( 'button' );
     var btn = document.createElement( 'button' );
     btn.id       = 'hp-hide-btn';
     btn.id = 'hp-hide-btn';
     btn.innerHTML = '🚫 Hide from homepage';
     btn.disabled = true;                       // disabled until state is known
     btn.title    = 'Add this page to the homepage AllPages exclusion list';
     btn.innerHTML = '';
     document.body.appendChild( btn );
     document.body.appendChild( btn );


     btn.addEventListener( 'click', function () {
     var api = new mw.Api();
        btn.disabled = true;
        btn.textContent = 'Saving…';


        var api = new mw.Api();
    /* ── Read exclusion list; set initial button state ────────────── */
    function loadExclusionList( cb ) {
         api.get( {
         api.get( {
             action: 'query', prop: 'revisions', rvprop: 'content',
             action: 'query', prop: 'revisions', rvprop: 'content',
第58行: 第56行:
                     .split( '\n' ).map( function ( s ) { return s.trim(); } ).filter( Boolean );
                     .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 ) {
             if ( lines.indexOf( pageTitle ) !== -1 ) {
                 mw.notify( '"' + pageTitle + '" is already hidden from the homepage.', { type: 'info' } );
                 setHidden();
                btn.textContent = '✓ Already hidden';
                 return;
                 return;
             }
             }
第70行: 第98行:
                 summary: 'Hide "' + pageTitle + '" from homepage list'
                 summary: 'Hide "' + pageTitle + '" from homepage list'
             } ).done( function () {
             } ).done( function () {
                 mw.notify( '"' + pageTitle + '" hidden from homepage list.', { type: 'success' } );
                 mw.notify( '"' + pageTitle + '" hidden from homepage.', { type: 'success' } );
                 btn.innerHTML = '✓ Hidden';
                 setHidden();
                btn.style.background = '#38a169';
             } ).fail( function () {
             } ).fail( function () {
                 mw.notify( 'Failed — check you have interface-admin rights.', { type: 'error' } );
                 mw.notify( 'Failed — check interface-admin rights.', { type: 'error' } );
                 btn.disabled = false;
                 setVisible();
                btn.innerHTML = '🚫 Hide from homepage';
             } );
             } );
         } );
         } );
     } );
     } );
} );
} );