Sidebar Customization for Outlook

Customize the Outlook sidebar with a draggable button.

Version vom 01.11.2024. Aktuellste Version

Du musst eine Erweiterung wie Tampermonkey, Greasemonkey oder Violentmonkey installieren, um dieses Skript zu installieren.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

Sie müssten eine Skript Manager Erweiterung installieren damit sie dieses Skript installieren können

(Ich habe schon ein Skript Manager, Lass mich es installieren!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         Sidebar Customization for Outlook
// @version      1.3
// @license      MIT 
// @description  Customize the Outlook sidebar with a draggable button.
// @author       "[email protected]" - by the help of ChatGPT
// @match        *://*.outlook.office.com/mail*
// @match        *://*.outlook.office365.com/mail*
// @match        *://outlook.live.com/mail*
// @grant        none
// @namespace https://greasyfork.org/users/1388250
// ==/UserScript==

(function () {
    'use strict';

    function isInboxDetailView() {
        const url = window.location.href;
        const inboxDetailPattern = /\/inbox\/id\//;
        return inboxDetailPattern.test(url);
    }

    function setupSidebar() {
        const sidebar = document.querySelector('[aria-label="Navigation pane"]');
        const content = document.querySelector('._3K3vkj8V');
        const flvp1Element = document.querySelector('.Flvp1'); // Select the element to modify

        if (!sidebar) {
            console.warn("Sidebar not found.");
            return;
        }

        sidebar.style.position = 'fixed';
        sidebar.style.top = '40px';
        sidebar.style.right = '0';
        sidebar.style.left = 'auto';
        sidebar.style.height = '96%';
        sidebar.style.width = '175px';
        sidebar.style.zIndex = '1000';
        sidebar.style.overflowY = 'auto';
        sidebar.style.transition = 'all 0.3s ease';

        if (content) {
            content.style.marginLeft = '0';
            content.style.marginRight = '0';
        }

        const toggleButton = document.createElement('button');
        toggleButton.style.position = 'fixed';
        toggleButton.style.top = '53px';
        toggleButton.style.right = '192px';
        toggleButton.style.cursor = 'pointer';
        toggleButton.style.border = 'none';
        toggleButton.style.backgroundColor = '#0078D4';
        toggleButton.style.color = 'white';
        toggleButton.style.padding = '5px 10px';
        toggleButton.style.borderRadius = '4px';
        toggleButton.style.fontSize = '12px';
        toggleButton.style.zIndex = '1001';
        toggleButton.style.display = 'flex';
        toggleButton.style.alignItems = 'center';
        toggleButton.style.gap = '10px';

        const dragHandle = document.createElement('div');
        dragHandle.style.display = 'grid';
        dragHandle.style.gridTemplateColumns = 'repeat(2, auto)';
        dragHandle.style.gap = '2px';
        dragHandle.style.cursor = 'grab';

        for (let i = 0; i < 6; i++) {
            const dot = document.createElement('div');
            dot.style.width = '3px';
            dot.style.height = '3px';
            dot.style.backgroundColor = 'white';
            dot.style.borderRadius = '50%';
            dragHandle.appendChild(dot);
        }

        const buttonText = document.createElement('span');
        buttonText.textContent = 'Show Sidebar';

        toggleButton.appendChild(dragHandle);
        toggleButton.appendChild(buttonText);
        document.body.appendChild(toggleButton);

        let isSidebarVisible = !isInboxDetailView();

        function updateSidebarVisibility() {
            sidebar.style.display = isSidebarVisible ? '' : 'none';
            buttonText.textContent = isSidebarVisible ? 'Hide Sidebar' : 'Show Sidebar';
            if (content) {
                content.style.marginRight = isSidebarVisible ? '0' : '0';
            }

            // Adjust the .Flvp1 element's padding-right
            if (flvp1Element) {
                flvp1Element.style.paddingRight = isSidebarVisible ? '170px' : '0';
            }
        }

        toggleButton.addEventListener('click', (event) => {
            if (event.target !== dragHandle) {
                isSidebarVisible = !isSidebarVisible;
                updateSidebarVisibility();
            }
        });

        updateSidebarVisibility();

        let isDragging = false;
        let offsetX, offsetY;

        dragHandle.addEventListener('mousedown', (event) => {
            isDragging = true;
            offsetX = event.clientX - toggleButton.getBoundingClientRect().left;
            offsetY = event.clientY - toggleButton.getBoundingClientRect().top;
            document.body.style.userSelect = 'none';
            dragHandle.style.cursor = 'grabbing';
        });

        document.addEventListener('mousemove', (event) => {
            if (isDragging) {
                toggleButton.style.top = `${event.clientY - offsetY}px`;
                toggleButton.style.left = `${event.clientX - offsetX}px`;
                toggleButton.style.right = 'auto';
            }
        });

        document.addEventListener('mouseup', () => {
            isDragging = false;
            document.body.style.userSelect = '';
            dragHandle.style.cursor = 'grab';
        });
    }

    const observer = new MutationObserver(() => {
        const sidebar = document.querySelector('[aria-label="Navigation pane"]');
        if (sidebar) {
            observer.disconnect();
            setupSidebar();
        }
    });

    observer.observe(document.body, { childList: true, subtree: true });
})();

(function () {
    'use strict';

    function removeElements() {
        const hamburgerButton = document.querySelector('button.ms-Button[aria-label="Hide navigation pane"]');
        const leftRailPane = document.querySelector('#LeftRail');

        if (hamburgerButton) {
            hamburgerButton.closest('div.ms-TooltipHost').remove();
            console.log('Hamburger button removed.');
        } else {
            console.warn('Hamburger button not found.');
        }

        if (leftRailPane) {
            leftRailPane.remove();
            console.log('Left rail pane removed.');
        } else {
            console.warn('Left rail pane not found.');
        }
    }

    const observer = new MutationObserver(() => {
        const hamburgerButton = document.querySelector('button.ms-Button[aria-label="Hide navigation pane"]');
        const leftRailPane = document.querySelector('#LeftRail');
        if (hamburgerButton || leftRailPane) {
            observer.disconnect();
            removeElements();
        }
    });

    observer.observe(document.body, { childList: true, subtree: true });
})();