MediaWiki:Common.js: Difference between revisions

m Avoid reinitializing standard collapsible tables
m Add floating table of contents
Line 128: Line 128:
         mw.hook('wikipage.content').add(addCollapsibleControls);
         mw.hook('wikipage.content').add(addCollapsibleControls);
     });
     });
}());
(function () {
    function addFloatingToc($content) {
        var $toc = $content.find('#toc').first();
        var $tocList;
        var $button;
        var $panel;
        var $wrapper;
        if ($('#muhro-floating-toc').length || !$toc.length) {
            return;
        }
        $tocList = $toc.find('> ul, .toc > ul').first().clone(false);
        if (!$tocList.length) {
            $tocList = $toc.find('ul').first().clone(false);
        }
        if (!$tocList.length) {
            return;
        }
        $tocList.find('[id]').removeAttr('id');
        $tocList.find('.tocnumber').attr('aria-hidden', 'true');
        $button = $('<button>')
            .attr({
                type: 'button',
                'aria-expanded': 'false',
                'aria-controls': 'muhro-floating-toc-panel'
            })
            .addClass('muhro-floating-toc-button')
            .text('Contents');
        $panel = $('<nav>')
            .attr({
                id: 'muhro-floating-toc-panel',
                'aria-label': 'Page contents'
            })
            .addClass('muhro-floating-toc-panel')
            .append($tocList);
        $wrapper = $('<div>')
            .attr('id', 'muhro-floating-toc')
            .addClass('muhro-floating-toc noprint')
            .append($button, $panel);
        $button.on('click', function () {
            var open = !$wrapper.hasClass('is-open');
            $wrapper.toggleClass('is-open', open);
            $button.attr('aria-expanded', open ? 'true' : 'false');
        });
        $panel.on('click', 'a', function () {
            if (window.matchMedia('(max-width: 720px)').matches) {
                $wrapper.removeClass('is-open');
                $button.attr('aria-expanded', 'false');
            }
        });
        $('body').append($wrapper);
    }
    mw.hook('wikipage.content').add(addFloatingToc);
}());
}());