NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Flatten Zimbra Calendar Background Colors // @version 1.3 // @author You // @match https://partage.unistra.fr/* // @grant none // @license MIT // ==/UserScript== //Observer that checks if the calendar node exists var calendarObserver = new MutationObserver(function (mutations, observer) { console.log("Document mutation detected"); //If the calendar node exists if (document.getElementsByClassName("ZmCalViewMgr").length > 0) { console.log("Calendar detected"); //regex to identify if the correct style is applied afterwards var re = /rgb\((\d{1,3}), (\d{1,3}), (\d{1,3})\) none repeat scroll 0% 0%/; //Create an events observer that will change all backgrounds when triggered var eventsObserver = new MutationObserver(function (mutations, observer) { console.log("Event mutation detected"); changeBackgroundStyle(eventsObserver, re); }); //Events observer is triggered when background attributes of calendar node or any of its children are modified eventsObserver.observe(document.getElementsByClassName("ZmCalViewMgr")[0], { subtree: true, attributes: true, attributesFilter: ['background'], childList: true }); //We disconnect the calendar observer since the events observer is now up and running calendarObserver.disconnect(); } }); //Calendar observer is triggered whenever a change is made in the document calendarObserver.observe(document, { subtree: true, attributes: true }); //Function to change the backgrounds to a flatter, easier to read format function changeBackgroundStyle(eventsObserver, re) { //Start timer let start = new Date(); //Temporarily disconnect the events observer otherwise our background manipulations will trigger an infinite loop (not needed for firefox 66+, how come ? eventsObserver.disconnect(); //Retrieve all events which all seem to have IDs ending with "_tableBody" var events = document.querySelectorAll('*[id$="_tableBody"]'); //For all events events.forEach(function (event) { //Delete the very small and useless border between the vertical bar and the event box itself event.style.border = 0; //If the correct style is not applied to the event background if (!re.test(event.style.background)) { //Retrieve the color of the event let eventColor = event.style.background.split("rgb(")[2].split(")")[0]; //Set the background style to a flat version of that color event.style.background = "rgba(" + eventColor + ", 1) repeat scroll 0% 0%"; //Set the background style of the events for which the previous line didn't work because their apperance is linked to the style of a child node (no idea why) event.firstChild.firstChild.style.background = "rgba(" + eventColor + ", 1)"; } //If the correct style is not applied to the state side bar if (event.firstChild.firstChild.firstChild.style.background!="" && !re.test(event.firstChild.firstChild.firstChild.style.background)) { //Set the background style of the small "state" vertical bar let eventStateColor = event.firstChild.firstChild.firstChild.style.background.split("rgb(")[2].split(")")[0]; event.firstChild.firstChild.firstChild.style.background = "rgba(" + eventStateColor + ", 1) repeat scroll 0% 0%"; } }); //Reconnect the events observer eventsObserver.observe(document.getElementsByClassName("ZmCalViewMgr")[0], { subtree: true, attributes: true, attributesFilter: ['background'], childList: true }); //Stop timer let time = new Date() - start; //Log time it took in ms console.log(time + "ms"); }