Confluence - remember opened branches in pagetree

Confluence does not remember which branches of the pagetree you opened - this script records the opened and closed branches in LocalStorage and restores them on page change, reload or on other tabs/windows

// ==UserScript==
// @name         Confluence - remember opened branches in pagetree
// @namespace    http://netresearch.de/
// @version      0.1
// @description  Confluence does not remember which branches of the pagetree you opened - this script records the opened and closed branches in LocalStorage and restores them on page change, reload or on other tabs/windows
// @author       Christian Opitz
// @include      *.atlassian.net/wiki/*
// @grant        none
// @run-at       document-body
// ==/UserScript==

(function() {
    'use strict';
    AJS.toInit(function() {
        var spaceKey = AJS.Meta.get('space-key');
        if (!spaceKey) {
            return;
        }
        var $ = AJS.$,
            saveKey = 'netresearch-opened-' + spaceKey,
            load = function() {
                var data = localStorage.getItem(saveKey);
                return data ? JSON.parse(data) : [];
            },
            opened = load(),
            toBeOpened = opened.slice(0),
            open = function() {
                var remove = [];
                for (var id of toBeOpened) {
                    var el = $('#' + id);
                    if (el.length) {
                        if (!el.hasClass('icon-section-opened')) {
                            el.trigger('click', [true]);
                        }
                        remove.push(id);
                    }
                }
                for (id of remove) {
                    toBeOpened.splice(toBeOpened.indexOf(id), 1);
                }
            },
            thisIsUsSaving = false;

        AJS.bind('pagetree-children-loaded', function() {
            open();
            $('.plugin_pagetree_childtoggle:not(.nr-registered)').addClass('nr-registered').click(function(e, thisIsUsClicking) {
                if (thisIsUsClicking) {
                    return;
                }
                var $this = $(this),
                    id = $this.attr('id'),
                    pos = opened.indexOf(id),
                    // Class is set, when elements are loaded - if there are no elements we can assume they are about to be:
                    isOpen = $this.hasClass('icon-section-opened') || $('#child_ul' + id.substring(9)).length === 0;
                
                if (isOpen && pos < 0) {
                    opened.push(id);
                } else if (!isOpen && pos >= 0) {
                    opened.splice(pos, 1);
                }
                thisIsUsSaving = true;
                localStorage.setItem(saveKey, JSON.stringify(opened));
                thisIsUsSaving = false;
            });
        });

        window.addEventListener("storage", function(e) {
            if (thisIsUsSaving || e.key != saveKey) {
                return;
            }
            var newOpened = load();
            $('.icon-section-opened').each(function() {
                var $open = $(this);
                if (newOpened.indexOf($open.attr('id')) < 0) {
                    $open.trigger('click', [true]);
                }
            });
            toBeOpened = newOpened;
            open();
        }, false);
    });
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址