// ==UserScript== // @name New script - myconnectwise.net // @namespace Violentmonkey Scripts // @match https://na.myconnectwise.net/* // @match https://app.powerbi.com/* // @grant GM.openInTab // @grant GM.getValue // @grant GM.setValue // @grant GM.setClipboard // @version 1.0 // @author - // @require https://cdn.jsdelivr.net/npm/@violentmonkey/shortcut@1 // ==/UserScript== //Declare global variables var contact = "" var contactinput = "" var company = "" var detailLabel = "" var initialDescription = "" var internalNote = "" var assignedTech = "" var assignedPod = "" var ticketlink = "" var ticketnumber = "" var detailLabelSplit = "" var oldTime = "" var newTime = "" //Hotkeys VM.shortcut.register('c-a-s', () => { company = getByClass('cw_company', 0); GM.setClipboard("https://hudu.247mgmt.com/c?tab=&page=&sort_direction=&sort_column=&tag=&folder=&query="+company); }); VM.shortcut.register('a-i', () => { document.querySelector('[data-id="internal"]').click(); }); VM.shortcut.register('a-s-i', () => { document.querySelector('[data-id="discussion"]').click(); }); VM.shortcut.register('a-r', () => { document.querySelector('[data-id="resolution"]').click(); }); VM.shortcut.register('a-1', () => { setStatus("In Progress") }); VM.shortcut.register('a-s-!', () => { setStatus("In Queue") }); VM.shortcut.register('c-s-!', () => { setStatus("In Chat") }); VM.shortcut.register('a-2', () => { setStatus("New Via Phone") }); VM.shortcut.register('a-s-@', () => { setStatus("New Transfer From Triage") }); VM.shortcut.register('a-3', () => { setStatus("Pending Tech Assignment") }); VM.shortcut.register('a-s-#', () => { setStatus("Agent Responded") }); VM.shortcut.register('a-4', () => { setStatus("Completed (Closed)") }); VM.shortcut.register('a-s-$', () => { setStatus("Enter Time") }); VM.shortcut.register('a-5', () => { setStatus("Waiting on client") }); VM.shortcut.register('a-s-%', () => { setStatus("Canceled") }); VM.shortcut.register('a-6', () => { setStatus("Scheduled for Remote") }); VM.shortcut.register('a-s-^', () => { putTextIntoClass("cw_workType", 0, "Voicemail/Email") focusClass("cw_workType", 0) focusClass("public-DraftEditor-content", 0) }); VM.shortcut.register('c-a-1', () => { document.title="Contact" }); VM.shortcut.register('c-a-2', () => { document.title="Companies" }); VM.shortcut.register('c-a-3', () => { document.title="In Queue" }); VM.shortcut.register('c-a-4', () => { document.title="SLA" focusSlaMonitoring(); }); VM.shortcut.register('c-a-5', () => { document.title="Triage" }); VM.shortcut.register('c-a-6', () => { document.title="Ticket Search" }); VM.shortcut.register('c-a-s-W', () => { company = getByClass('cw_company', 0); GM.setValue('company', company); GM.setValue('pod', ""); }); VM.shortcut.register('c-a-s-R', () => { clickClass("multilineClickable", 1) }); VM.shortcut.register('c-a-s', () => { assignedPod = "" async function setPod(){ assignedPod = await GM.getValue("pod", 0); await focusClass("cw_serviceBoard", 0); await putTextIntoClass("cw_serviceBoard", 0, assignedPod + " - *Support"); }setPod(); }); VM.shortcut.register('a-s-s', () => { clickClass("cw_ToolbarButton_Save", 0); }); VM.shortcut.register('m--', () => { clickClass("cw-gxt-wnd-cls", 0); }); VM.shortcut.register('a-Delete', () => { clickClass("cw-gxt-wnd-cls", 0); }); VM.shortcut.register('a-s-Delete', () => { clickClass("cw_CwNegativeActionButton", 0); }); //TICKET NOTE SHORTCUTS START VM.shortcut.register('a-contextmenu', () => { clickClass('TicketNote-newNoteButton', 0); }); VM.shortcut.register('f3', () => { clickClass('TicketNote-newNoteButton', 0); }); VM.shortcut.register('s-f3', () => { clickClass('cw_isEnteringTime', 0); clickClass('DraftEditor-editorContainer', 0); }); VM.shortcut.register('c-f3', () => { clickClass('cw_isDiscussion', 0); }); VM.shortcut.register('a-f3', () => { clickClass('cw_isInternal', 0); }); VM.shortcut.register('c-a-f3', () => { clickClass('cw_isResolution', 0); }); VM.shortcut.register('m-s-f4', () => { clickClass('cw_isToContact', 0); }); VM.shortcut.register('c-s-f4', () => { clickClass('cw_isToResources', 0); }); VM.shortcut.register('m-f4', () => { clickClass('cw_isToCcs', 0); }); VM.shortcut.register('m-[', () => { getElementByClass("cw_btnStartTime", 0).children[0].click() }); VM.shortcut.register('m-s-{', () => { document.querySelector('[title="Start Time"]').click() }); VM.shortcut.register('m-]', () => { getElementByClass("cw_btnEndTime", 0).children[0].click() }); VM.shortcut.register('m-s-}', () => { //window.alert(getElementByClass("cw_endTime", 0).value) getElementByClass("cw_btnEndTime", 0).children[0].click() oldTime = getElementByClass("cw_endTime", 0).value let newTime = addMinute(oldTime); focusClass("cw_endTime", 0); putTextIntoClass("cw_endTime", 0, newTime); focusClass("public-DraftEditor-content", 0) }); //TICKET NOTE SHORTCUTS END VM.shortcut.register('f10', () => { getTicketInfo(); copyPodPost(contact+" @ "+company+"

"+detailLabel+"

"+initialDescription+"

"); }); VM.shortcut.register('a-f10', () => { getTicketInfo(); getMoreTicketInfo(); copyPodPost(contact+" @ "+company+"

"+detailLabel+"

"+initialDescription+"

"+internalNote+"

"); }); VM.shortcut.register('c-f10', () => { getTicketInfo(); copyPodPost(contact+" @ "+company+"

"+detailLabel+"

"); }); VM.shortcut.register('c-a-f10', () => { getTicketInfo(); copyPodPost(contact+" @ "+company+"

"+detailLabel+"

Client is calling to get in touch with @"+assignedTech+" "); }); VM.shortcut.register('m-f10', () => { getTicketInfo(); copyPodPost(detailLabel); }); VM.shortcut.register('m-s-f10', () => { ticketLabel = getInnerTextByClass('detailLabel', 0); GM.setClipboard(ticketLabel); window.alert("Copied to clipboard: "+ticketLabel); }); VM.shortcut.register('f6', () => { clickClass('cw-toolbar-clear', 0); clickClass('cw-ml-search-button', 0); }); VM.shortcut.register('s-f6', () => { clickClass('cw_ToolbarButton_Refresh', 0); }); VM.shortcut.register('f7', () => { clickClass('cw_ToolbarButton_Refresh', 0); }); VM.shortcut.register('c-a-BackSpace', () => { clickClass('cw_ToolbarButton_Back', 0); clickClass('cw-gxt-wnd-cls', 0); }); VM.shortcut.register('a--', () => { clickClass('cw_ToolbarButton_Back', 0); clickClass('cw-gxt-wnd-cls', 0); }); VM.shortcut.register('f12', () => { doTimeSheet("9:00 AM", "2:30 PM", "Mentoring"); }); VM.shortcut.register('a-f12', () => { doTimeSheet("3:30 PM", "4:30 PM", "Lunch Break"); }); VM.shortcut.register('s-f12', () => { doTimeSheet("4:30 PM", "6:00 PM", "Mentoring"); }); VM.shortcut.register('c-a-f12', () => { doTimeSheetMini("Call Queue"); }); //PowerBI Script Start var pod VM.shortcut.register('f2', () => { document.querySelector('[aria-label="Navigating to visual"]').focus(); document.querySelector('[aria-label="enter your search"]').focus(); }); VM.shortcut.register('s-f2', () => { async function pasteCompany(){ company = await GM.getValue('company', 0); document.querySelector('[aria-label="Enter your search"]').value = company; }pasteCompany(); }); VM.shortcut.register('c-f2', () => { //pod = document.querySelector("#pvExplorationHost > div > div > exploration > div > explore-canvas > div > div.canvasFlexBox > div > div.displayArea.disableAnimations.fitToPage > div.visualContainerHost.visualContainerOutOfFocus > visual-container-repeat > visual-container:nth-child(2) > transform > div > div.visualContent > div > div > visual-modern > div > div > div.pivotTable > div.interactive-grid.innerContainer > div.mid-viewport > div > div:nth-child(1) > div.scrollable-cells-viewport > div > div:nth-child(2)").innerText pod = document.querySelector("#pvExplorationHost > div > div > exploration > div > explore-canvas > div > div.canvasFlexBox > div > div.displayArea.disableAnimations.fitToPage > div.visualContainerHost.visualContainerOutOfFocus > visual-container-repeat > visual-container:nth-child(3) > transform > div > div.visualContent > div > div > visual-modern > div > div > div.pivotTable > div.interactive-grid.innerContainer > div.mid-viewport > div > div > div.scrollable-cells-viewport > div > div:nth-child(2)").innerText pod = pod.replace(/\u00a0/g, " "); podFirst = pod.split(" ")[0]; podFirstUp = podFirst.toUpperCase(); GM.setValue('pod', podFirstUp) }); //PowerBI Script END //Functions function addMinute(timeStr) { // Parse the time string let [time, modifier] = timeStr.split(' '); let [hours, minutes] = time.split(':').map(Number); // Add one minute minutes += 1; // Handle minute overflow if (minutes === 60) { minutes = 0; hours += 1; } // Handle hour overflow and AM/PM switch if (hours === 12) { modifier = modifier === 'AM' ? 'PM' : 'AM'; } else if (hours === 13) { hours = 1; } // Format the new time string let newTimeStr = `${hours}:${minutes.toString().padStart(2, '0')} ${modifier}`; return newTimeStr; } function focusSlaMonitoring(){ putTextIntoClass('cw_CwComboBox', 2, 'Response SLA Monitoring'); clickClass('cw-ml-search-button', 0); } async function doTimeSheet(startTime, endTime, chargeTo){ await putTextIntoClass("cw_ChargeToTextBox", 0, chargeTo); await focusClass("cw_startTime", 0); await putTextIntoClass("cw_startTime", 0, startTime); await focusClass("cw_endTime", 0); await putTextIntoClass("cw_endTime", 0, endTime); await focusClass("cw_ChargeToTextBox", 0); await new Promise(r => setTimeout(r, 800)); await clickClass("cw_Refresh", 0); await new Promise(r => setTimeout(r, 1200)); await contains("span", chargeTo)[0].click(); await new Promise(r => setTimeout(r, 500)); // await clickClass("cw_ToolbarButton_SaveAndClose", 0); }; async function doTimeSheetMini(chargeTo){ await putTextIntoClass("cw_ChargeToTextBox", 0, chargeTo); await focusClass("cw_ChargeToTextBox", 0); await new Promise(r => setTimeout(r, 800)); await clickClass("cw_Refresh", 0); await new Promise(r => setTimeout(r, 1200)); await contains("span", chargeTo)[0].click(); //await new Promise(r => setTimeout(r, 500)); //await clickClass("cw_ToolbarButton_SaveAndClose", 0); }; function contains(selector, text) { var elements = document.querySelectorAll(selector); return Array.prototype.filter.call(elements, function(element){ return RegExp(text).test(element.textContent); }); } function getTicketInfo(){ contactinput = null; document.querySelector('[data-id="internal"]').click(); // click internal note so we can pull it later contact = getByClass('cw_contact', 0); company = getByClass('cw_company', 0); detailLabel = getInnerTextByClass('detailLabel', 0); detailLabelSplit = detailLabel.split(" "); ticketnumber = detailLabelSplit[2].replace("#", ""); ticketlink = "TICKETLINKNUMBER".replace(/TICKETLINKNUMBER/g, ticketnumber); detailLabel = detailLabel.replace(ticketnumber,ticketlink); assignedTech = getByClass('cw_ticketOwner', 0); initialDescription = getInnerTextByClass('TicketNote-rowNote', 0); contactinput = prompt("What is the caller's name?", contact); contact = contactinput; }; function getMoreTicketInfo(){ internalNote = getInnerTextByClass('TicketNote-noteLabel', 1); }; function copyPodPost(podPost){ if (contactinput === null){ //terminate function if user hits cancel button or provides no input return; } GM.setClipboard(podPost, 'text/html') window.alert(podPost); }; function clickClass(theClass, elementIndex){ var elements = document.getElementsByClassName(theClass); var requiredElement = elements[elementIndex]; requiredElement.click(); }; function focusClass(theClass, elementIndex){ var elements = document.getElementsByClassName(theClass); var requiredElement = elements[elementIndex]; requiredElement.focus(); }; function getElementByClass(theClass, elementIndex){ var elements = document.getElementsByClassName(theClass); var requiredElement = elements[elementIndex]; return requiredElement; }; function getByClass(theClass, elementIndex){ var elements = document.getElementsByClassName(theClass); var requiredElement = elements[elementIndex]; return requiredElement.value; }; function getInnerTextByClass(theClass, elementIndex){ var elements = document.getElementsByClassName(theClass); var requiredElement = elements[elementIndex]; return requiredElement.innerText; }; function putTextIntoClass(theClass, elementIndex, text){ var elements = document.getElementsByClassName(theClass); var requiredElement = elements[elementIndex]; requiredElement.value = text; }; function setStatus(desiredStatus){ if (window.location.href.indexOf("timeexpensemodule.html") > -1) { putTextIntoClass("cw_ticketStatus", 0, desiredStatus); focusClass("cw_ticketStatus", 0); }else{ putTextIntoClass("cw_status", 0, desiredStatus); focusClass("cw_status", 0); } }