NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name More Header Buttons for ConnectWise Manage
// @namespace https://na.myconnectwise.net/
// @version 0.3
// @description Adds "My Timesheet" and "Today" buttons to the Manage header
// @author Jonathon Braswell <jonathon.braswell@twinoakstech.com>
// @match https://na.myconnectwise.net/*
// @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant none
// @license GPL-3.0-or-later; http://www.gnu.org/licenses/gpl-3.0.txt
// ==/UserScript==
(() => {
'use strict';
// Main namespace
window.MoreButtons = function () {
// Button urls
this.tsUrl = 'https://na.myconnectwise.net/v2021_1/connectwise.aspx?fullscreen=false&locale=en_US#startscreen=my_time_sheets';
this.tdUrl = 'https://na.myconnectwise.net/v2021_1/connectwise.aspx?fullscreen=false&locale=en_US#startscreen=cw_today';
// Things to help us locate where we are inserting buttons
this.insertPos = 5;
this.chatBtnClass = '.cw_ChatAssistButton';
// Creates an <a> Element with the given properties and styles it
// returns HTMLElement
this.makeLink = function (text, url) {
let link = document.createElement('a');
link.setAttribute('style', 'font-family: "Roboto", sans-serif; text-decoration: unset; font-weight: 500;');
link.setAttribute('href', url);
link.setAttribute('target', '_blank');
link.innerHTML = text;
return link;
};
// Creates a <td> Element and styles it
// returns HTMLElement
this.makeCell = function () {
let cell = document.createElement('td');
cell.setAttribute('style', 'text-align: center; width: 100px;');
return cell;
};
// Initialize!
this.init = function () {
// Make the links
let todayLink = this.makeLink('Today', this.tdUrl);
let timeLink = this.makeLink('My Timesheet', this.tsUrl);
// Find the header
let header = document.querySelector(this.chatBtnClass).parentElement.parentElement;
// Make and insert the parent cells into the bar
let todayBtn = header.insertBefore(this.makeCell(), header.childNodes[this.insertPos]);
let timeBtn = header.insertBefore(this.makeCell(), header.childNodes[this.insertPos]);
// Put the links in their cells
todayBtn.appendChild(todayLink);
timeBtn.appendChild(timeLink);
};
};
// Invoke on load
window.onload = event => {
let mb = new window.MoreButtons();
// The Web GUI is built asynchronously so we need to check every few millis
// to see if our anchor element is present on the page before init
let interval = setInterval(() => {
if (document.querySelector(mb.chatBtnClass) !== null) {
// Found it! Tear down the interval and init
clearInterval(interval);
mb.init();
}
}, 500);
};
})();