Basculer le menu
Changer de menu des préférences
Basculer le menu personnel
Non connecté(e)
Votre adresse IP sera visible au public si vous faites des modifications.

« MediaWiki:Gadget-explorer.js » : différence entre les versions

Page de l’interface de MediaWiki
m squelette minimal
mAucun résumé des modifications
Ligne 1 : Ligne 1 :
console.log('explorer gadget - BEGIN');
/**
/**
  * MediaWiki:Gadget-explorer.js
  * MediaWiki:Gadget-explorer.js
  * Explorateur de wiki — étape 1 : squelette minimal.
  * Explorateur de wiki — étape 3 : fetch et injection du shell.
  *
  *
  * Injecte un bouton déclencheur dans le header Citizen et un panneau
  * Au premier clic sur le déclencheur, fetch le HTML rendu de Modèle:Explorer
  * conteneur vide dans le body. Toggle au clic.
  * via l'API MediaWiki et l'injecte dans le panneau. Les ouvertures suivantes
  *
  * réutilisent le contenu déjà chargé.
* Aucune logique de fetch ni de templates à ce stade.
  */
  */
( function () {
( function () {
Ligne 17 : Ligne 15 :
     var TRIGGER_CLASS = 'explorer-trigger';
     var TRIGGER_CLASS = 'explorer-trigger';
     var ROOT_ID = 'explorer-root';
     var ROOT_ID = 'explorer-root';
    var SHELL_PAGE = 'Modèle:Explorer';
    // --- Internal state -----------------------------------------------------
    var shellLoaded = false;
    var shellLoading = false;


     // --- DOM construction ---------------------------------------------------
     // --- DOM construction ---------------------------------------------------
Ligne 27 : Ligne 31 :
         btn.setAttribute( 'aria-controls', ROOT_ID );
         btn.setAttribute( 'aria-controls', ROOT_ID );
         btn.setAttribute( 'aria-label', 'Ouvrir l\'explorateur' );
         btn.setAttribute( 'aria-label', 'Ouvrir l\'explorateur' );
        // Placeholder textuel, à remplacer par icône via CSS ou markup.
         btn.textContent = '☰';
         btn.textContent = '☰';
         return btn;
         return btn;
Ligne 38 : Ligne 41 :
         root.dataset.state = 'closed';
         root.dataset.state = 'closed';
         return root;
         return root;
    }
    // --- Shell loading ------------------------------------------------------
    function loadShell( root ) {
        if ( shellLoaded || shellLoading ) {
            return;
        }
        shellLoading = true;
        root.dataset.loading = 'true';
        var api = new mw.Api();
        api.get( {
            action: 'parse',
            page: SHELL_PAGE,
            prop: 'text',
            disablelimitreport: 1,
            disabletoc: 1,
            formatversion: 2
        } ).then( function ( data ) {
            root.innerHTML = data.parse.text;
            shellLoaded = true;
        } ).catch( function ( code, info ) {
            mw.log.error( '[explorer] failed to load shell', code, info );
            root.innerHTML = '<div class="explorer-error">Impossible de charger l\'explorateur.</div>';
        } ).always( function () {
            shellLoading = false;
            delete root.dataset.loading;
        } );
     }
     }


     // --- State management ---------------------------------------------------
     // --- State management ---------------------------------------------------
    function open( trigger, root ) {
        root.dataset.state = 'open';
        trigger.setAttribute( 'aria-expanded', 'true' );
        loadShell( root );
    }
    function close( trigger, root ) {
        root.dataset.state = 'closed';
        trigger.setAttribute( 'aria-expanded', 'false' );
    }


     function toggle( trigger, root ) {
     function toggle( trigger, root ) {
         var isOpen = root.dataset.state === 'open';
         if ( root.dataset.state === 'open' ) {
        root.dataset.state = isOpen ? 'closed' : 'open';
            close( trigger, root );
         trigger.setAttribute( 'aria-expanded', String( !isOpen ) );
         } else {
            open( trigger, root );
        }
     }
     }


Ligne 51 : Ligne 96 :


     function init() {
     function init() {
    console.log('explorer gadget - INIT...');
         var slot = document.querySelector( HEADER_SLOT_SELECTOR );
         var slot = document.querySelector( HEADER_SLOT_SELECTOR );
         if ( !slot ) {
         if ( !slot ) {
Ligne 67 : Ligne 111 :
             toggle( trigger, root );
             toggle( trigger, root );
         } );
         } );
    console.log('explorer gadget - INIT DONE');
     }
     }


Ligne 75 : Ligne 118 :
         init();
         init();
     }
     }
    console.log('explorer gadget - END');


}() );
}() );

Version du 28 mai 2026 à 01:15

/**
 * MediaWiki:Gadget-explorer.js
 * Explorateur de wiki — étape 3 : fetch et injection du shell.
 *
 * Au premier clic sur le déclencheur, fetch le HTML rendu de Modèle:Explorer
 * via l'API MediaWiki et l'injecte dans le panneau. Les ouvertures suivantes
 * réutilisent le contenu déjà chargé.
 */
( function () {
    'use strict';

    // --- Configuration ------------------------------------------------------

    var HEADER_SLOT_SELECTOR = '.citizen-header__start';
    var TRIGGER_CLASS = 'explorer-trigger';
    var ROOT_ID = 'explorer-root';
    var SHELL_PAGE = 'Modèle:Explorer';

    // --- Internal state -----------------------------------------------------

    var shellLoaded = false;
    var shellLoading = false;

    // --- DOM construction ---------------------------------------------------

    function createTrigger() {
        var btn = document.createElement( 'button' );
        btn.type = 'button';
        btn.className = TRIGGER_CLASS;
        btn.setAttribute( 'aria-expanded', 'false' );
        btn.setAttribute( 'aria-controls', ROOT_ID );
        btn.setAttribute( 'aria-label', 'Ouvrir l\'explorateur' );
        btn.textContent = '☰';
        return btn;
    }

    function createRoot() {
        var root = document.createElement( 'div' );
        root.id = ROOT_ID;
        root.className = 'explorer-root';
        root.dataset.state = 'closed';
        return root;
    }

    // --- Shell loading ------------------------------------------------------

    function loadShell( root ) {
        if ( shellLoaded || shellLoading ) {
            return;
        }
        shellLoading = true;
        root.dataset.loading = 'true';

        var api = new mw.Api();
        api.get( {
            action: 'parse',
            page: SHELL_PAGE,
            prop: 'text',
            disablelimitreport: 1,
            disabletoc: 1,
            formatversion: 2
        } ).then( function ( data ) {
            root.innerHTML = data.parse.text;
            shellLoaded = true;
        } ).catch( function ( code, info ) {
            mw.log.error( '[explorer] failed to load shell', code, info );
            root.innerHTML = '<div class="explorer-error">Impossible de charger l\'explorateur.</div>';
        } ).always( function () {
            shellLoading = false;
            delete root.dataset.loading;
        } );
    }

    // --- State management ---------------------------------------------------

    function open( trigger, root ) {
        root.dataset.state = 'open';
        trigger.setAttribute( 'aria-expanded', 'true' );
        loadShell( root );
    }

    function close( trigger, root ) {
        root.dataset.state = 'closed';
        trigger.setAttribute( 'aria-expanded', 'false' );
    }

    function toggle( trigger, root ) {
        if ( root.dataset.state === 'open' ) {
            close( trigger, root );
        } else {
            open( trigger, root );
        }
    }

    // --- Bootstrap ----------------------------------------------------------

    function init() {
        var slot = document.querySelector( HEADER_SLOT_SELECTOR );
        if ( !slot ) {
            mw.log.warn( '[explorer] header slot not found: ' + HEADER_SLOT_SELECTOR );
            return;
        }

        var trigger = createTrigger();
        var root = createRoot();

        slot.appendChild( trigger );
        document.body.appendChild( root );

        trigger.addEventListener( 'click', function () {
            toggle( trigger, root );
        } );
    }

    if ( document.readyState === 'loading' ) {
        document.addEventListener( 'DOMContentLoaded', init );
    } else {
        init();
    }

}() );
Les témoins (''cookies'') nous aident à fournir nos services. En utilisant nos services, vous acceptez notre utilisation de témoins.