Update Compass QoL Enhancer to 1.5.0
- Make links inside lesson plans open in the parent instead of a new tab - Rearrange the code a little bit
This commit is contained in:
parent
7e87996b41
commit
7bef678880
|
@ -2,7 +2,7 @@
|
|||
// @name Compass QoL Enhancer
|
||||
// @namespace blankie-scripts
|
||||
// @match http*://*.compass.education/*
|
||||
// @version 1.4.0
|
||||
// @version 1.5.0
|
||||
// @author blankie
|
||||
// @description A userscript that adds small but useful features for Compass, such as the ability to close windows by clicking on the background
|
||||
// @inject-into page
|
||||
|
@ -12,6 +12,9 @@
|
|||
"use strict";
|
||||
|
||||
let qolTabOpened = false;
|
||||
// we make a copy of window.location.hash because the dashboard tab on a user's page would set the fragment to #dsh for some reason
|
||||
let hashCopy = window.location.hash;
|
||||
|
||||
// needed because .toString() adds a trailing = for empty values
|
||||
function serializeURLSearchParams(query) {
|
||||
let out = "";
|
||||
|
@ -46,65 +49,6 @@ function getPanelItemHash(panelId, isDefault) {
|
|||
return `#${encodeURIComponent(panelId)}`;
|
||||
}
|
||||
|
||||
let observer = new MutationObserver(function(mutations) {
|
||||
for (let mutation of mutations) {
|
||||
if (mutation.type !== "childList") {
|
||||
continue;
|
||||
}
|
||||
for (let node of mutation.addedNodes) {
|
||||
handleNewNode(node);
|
||||
}
|
||||
}
|
||||
});
|
||||
observer.observe(document.body, {childList: true, subtree: true});
|
||||
|
||||
// we make a copy of window.location.hash because the dashboard tab on a user's page would set the fragment to #dsh for some reason
|
||||
let hashCopy = window.location.hash;
|
||||
function handleNewNode(node) {
|
||||
if (node.nodeType !== 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (node.parentElement && (node.classList.contains("ext-cal-hd-ct") || node.classList.contains("ext-cal-bg-tbl") || node.classList.contains("ext-cal-inner-ct"))) {
|
||||
for (let element of node.querySelectorAll("div.ext-cal-evt")) {
|
||||
handleNewCalendarEvent(element);
|
||||
}
|
||||
} else if (!qolTabOpened && node.classList.contains("x-panel")) {
|
||||
qolTabOpened = true;
|
||||
let tabToOpen = hashCopy.substring(1) || null;
|
||||
if (window.location.pathname === "/Organise/Activities/Activity.aspx") {
|
||||
tabToOpen = (new URLSearchParams(tabToOpen)).get("qol_open_tab");
|
||||
}
|
||||
let panel = unsafeWindow.Ext.getCmp(node.id);
|
||||
for (let i = 0; i < panel.items.items.length; i++) {
|
||||
handlePanelItem(panel, panel.items.items[i], i === 0, tabToOpen);
|
||||
}
|
||||
} else if (node.closest("[id^='wikibrowserpanel-'], #CompassWidgetsWikiBrowserPanel")) {
|
||||
// Make files and folders in wiki/resources clickable for Link Hints
|
||||
if (node.localName === "td") {
|
||||
node.setAttribute("role", "button");
|
||||
}
|
||||
for (let element of node.querySelectorAll("td, .x-tree-expander")) {
|
||||
element.setAttribute("role", "button");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
document.body.addEventListener("click", function(event) {
|
||||
// Add the ability to close windows by clicking on the background
|
||||
if (!event.target.classList.contains("x-mask")) {
|
||||
return;
|
||||
}
|
||||
let maskZIndex = BigInt(event.target.style.zIndex);
|
||||
for (let maskMsg of document.querySelectorAll(".x-mask-msg")) {
|
||||
if (BigInt(maskMsg.style.zIndex) >= maskZIndex && maskMsg.style.display !== "none") {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
document.querySelector(".x-window-closable.x-window-active .x-tool-close").click();
|
||||
}, {passive: true});
|
||||
|
||||
function handleNewCalendarEvent(element) {
|
||||
// Turn each calendar event into a link so that Link Hints can recognize it
|
||||
let a = document.createElement("a");
|
||||
|
@ -189,6 +133,89 @@ function handlePanelItem(panel, panelItem, isDefault, tabToOpen) {
|
|||
});
|
||||
}
|
||||
|
||||
function handleCKEditor(instance) {
|
||||
instance.on("contentDom", function() {
|
||||
let editable = instance.editable();
|
||||
for (let element of editable.$.querySelectorAll("a")) {
|
||||
handleCKEditorLink(element);
|
||||
}
|
||||
observer.observe(editable.$, {childList: true, subtree: true});
|
||||
});
|
||||
}
|
||||
|
||||
function handleCKEditorLink(element) {
|
||||
// Make links inside lesson plans open in the parent instead of a new tab
|
||||
if (element.target !== "_blank" && element.target) {
|
||||
return;
|
||||
}
|
||||
|
||||
element.target = "_parent";
|
||||
element.addEventListener("click", function(event) {
|
||||
event.stopImmediatePropagation();
|
||||
}, {passive: true});
|
||||
}
|
||||
|
||||
function handleNewNode(node, observer) {
|
||||
if (node.nodeType !== 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (node.parentElement && (node.classList.contains("ext-cal-hd-ct") || node.classList.contains("ext-cal-bg-tbl") || node.classList.contains("ext-cal-inner-ct"))) {
|
||||
for (let element of node.querySelectorAll("div.ext-cal-evt")) {
|
||||
handleNewCalendarEvent(element);
|
||||
}
|
||||
} else if (!qolTabOpened && node.classList.contains("x-panel")) {
|
||||
qolTabOpened = true;
|
||||
let tabToOpen = hashCopy.substring(1) || null;
|
||||
if (window.location.pathname === "/Organise/Activities/Activity.aspx") {
|
||||
tabToOpen = (new URLSearchParams(tabToOpen)).get("qol_open_tab");
|
||||
}
|
||||
let panel = unsafeWindow.Ext.getCmp(node.id);
|
||||
for (let i = 0; i < panel.items.items.length; i++) {
|
||||
handlePanelItem(panel, panel.items.items[i], i === 0, tabToOpen);
|
||||
}
|
||||
} else if (node.closest("[id^='wikibrowserpanel-'], #CompassWidgetsWikiBrowserPanel")) {
|
||||
// Make files and folders in wiki/resources clickable for Link Hints
|
||||
if (node.localName === "td") {
|
||||
node.setAttribute("role", "button");
|
||||
}
|
||||
for (let element of node.querySelectorAll("td, .x-tree-expander")) {
|
||||
element.setAttribute("role", "button");
|
||||
}
|
||||
} else if (node.classList.contains("cke")) {
|
||||
let instance = unsafeWindow.CKEDITOR.instances[node.id.substring(4)];
|
||||
handleCKEditor(instance);
|
||||
} else if (node.localName === "a" && /\bcke_/.test(node.closest("body").className)) {
|
||||
handleCKEditorLink(node);
|
||||
}
|
||||
}
|
||||
|
||||
let observer = new MutationObserver(function(mutations, observer) {
|
||||
for (let mutation of mutations) {
|
||||
if (mutation.type !== "childList") {
|
||||
continue;
|
||||
}
|
||||
for (let node of mutation.addedNodes) {
|
||||
handleNewNode(node, observer);
|
||||
}
|
||||
}
|
||||
});
|
||||
observer.observe(document.body, {childList: true, subtree: true});
|
||||
document.body.addEventListener("click", function(event) {
|
||||
// Add the ability to close windows by clicking on the background
|
||||
if (!event.target.classList.contains("x-mask")) {
|
||||
return;
|
||||
}
|
||||
let maskZIndex = BigInt(event.target.style.zIndex);
|
||||
for (let maskMsg of document.querySelectorAll(".x-mask-msg")) {
|
||||
if (BigInt(maskMsg.style.zIndex) >= maskZIndex && maskMsg.style.display !== "none") {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
document.querySelector(".x-window-closable.x-window-active .x-tool-close").click();
|
||||
}, {passive: true});
|
||||
|
||||
// Suppress that annoying barebones context menu that only has Copy
|
||||
// why is it not obvious that you can just hold ctrl or shift to suppress it???
|
||||
// i know it's compass' fault but i'm still frustrated
|
||||
|
|
|
@ -27,6 +27,8 @@ A userscript that adds small but useful features for Compass. Features include:
|
|||
open. you can also ctrl+click on them)
|
||||
- Files and folders in Resources is now marked clickable ([Link Hints] can now
|
||||
open them!)
|
||||
- Links inside lesson plans now open in the parent tab by default instead of
|
||||
creating a new tab
|
||||
- The context menu that only says "Copy" is now suppressed
|
||||
- The option to remember logins is unchecked by default
|
||||
|
||||
|
|
Loading…
Reference in New Issue