Allows creation of csv ticket reports
// ==UserScript== // @name Freshdesk Ticket Report // @namespace http://tampermonkey.net/ // @version 1.8 // @description Allows creation of csv ticket reports // @author Adrian Bradfield // @match http://*.pastel.co.uk/* // @match https://pastel.freshdesk.com/* // @grant unsafeWindow // ==/UserScript== (function() { var r###lt = []; var curLowLim = 1; function nextPage(callback){ function upperLim(){ return parseInt(unsafeWindow.$J("div.ticketlist-total-count").first().find("b")[1].innerHTML);} function lowerLim(){ return parseInt(unsafeWindow.$J("div.ticketlist-total-count").first().find("b")[0].innerHTML);} function total(){return parseInt(unsafeWindow.$J("#ticket_list_count").first().html());} function waitForLoad(callback, timer){ if(lowerLim() > curLowLim){ curLowLim = lowerLim(); callback(); clearInterval(timer); } } console.log('' + upperLim() + ' ' + total()); if(upperLim() === total()){ return false; } else{ unsafeWindow.$J("a.next_page").click(); var checker = setInterval(function(){waitForLoad(callback, checker);}); return true; } } function collectR###lt(r###lt){ var re = /<script\b[^>]*>([\s\S]*?)<\/script>/gm; function getDate(str){ var re = new RegExp('^([\\s\\S]*?)T', "gm"); var ret = re.exec(str); if(ret){ return ret[1].split("-").reverse().join("/"); //Convert US to UK } } function getVarStr(needle, haystack){ var re = new RegExp('"'+needle+'":"([\\s\\S]*?)"', "gm"); var res = re.exec(haystack); return res[1]; } function getVarInt(needle, haystack){ var re = new RegExp("\""+needle+"\":([\\s\\S]*?),", "gm"); var res = re.exec(haystack); return res[1]; } function getCompany(r###lt, haystack){ var re1 = new RegExp('<div class="break-word user-company-name" title="([\\s\\S]*?)"', "gm"); var company = re1.exec(r###lt); if(!company){ company = getVarStr("requester_name", haystack); } else{ company = company[1]; } return company; } var match; while (match = re.exec(r###lt)) { if(match[1].indexOf("dom_helper_data = {") > -1){ var obj = { "id": getVarInt("display_id", match[1]), "created": getDate(getVarStr("created_at", match[1])), "updated": getDate(getVarStr("updated_at", match[1])), "status": getVarStr("status_name", match[1]), "subject": getVarStr("subject", match[1]), "company": getCompany(r###lt, match[1]), "agent": getVarStr("responder_name", match[1]) }; if(obj.status === "Closed"){obj.status = "Resolved";} return obj; } } } function generateAction(){ var currentR###lts = []; if(r###lt.length > 0){ currentR###lts = r###lt; } function createCSV(objs){ var ret = "Agent,Updated,Company,Ticket no,Status,Created,Comment\r\n"; for(var i = 0; i < objs.length; i++){ ret += '"'+objs[i].agent+'","'+objs[i].updated + '","' + objs[i].company + '","' + objs[i].id + '","' + objs[i].status + '","' + objs[i].created + '","' + objs[i].subject + '"\r\n'; } return ret; } function download(text, name, type) { var a = document.createElement("a"); var file = new Blob([text], {type: type}); a.href = URL.createObjectURL(file); a.download = name; a.click(); } var queue = []; var tickets = unsafeWindow.$J("table.tickets tr"); tickets.each(function(index){ var link = unsafeWindow.$J( this ).find("a").first(); var str = link.attr("href"); if(!isNaN(str.substring(str.lastIndexOf('/') + 1))){ queue.push(unsafeWindow.$J.ajax({url: link.attr("href"), error: function(){ alert("Report Failed: Some lines may be missing from report. Please try running it again."); }})); } }); unsafeWindow.$J.when.apply(unsafeWindow.$J, queue).done(function(){ var r###lts = []; if(currentR###lts.length > 0){ r###lts = currentR###lts; } for(var i = 0; i < arguments.length; i++){ r###lts.push(collectR###lt(arguments[i][0])); } r###lts.sort(function(a,b){ function getStatusNum(status){ switch(status){ case "Closed": return 4; case "Resolved": return 3; case "Open": return 2; default: return 1; } } if(a.status !== b.status){ return getStatusNum(b.status) - getStatusNum(a.status); } else{ if(a.updated === b.updated){ return 0; } var splita = a.updated.split("/"); var datea = new Date(splita[2], splita[1], splita[0]); var splitb = b.updated.split("/"); var dateb = new Date(splitb[2], splitb[1], splitb[0]); return(dateb < datea)?1:-1; } }); if(!nextPage(generateAction)){ download(createCSV(r###lts), "TicketReport.csv", "csv"); r###lt = []; curLowLim = 1; } else{ r###lt = r###lts; } }); } //Insert button onto ticket view page, if it doesn't already exist window.setInterval(function(){ if(window.location.pathname.startsWith("/helpdesk/tickets")){ if(unsafeWindow.$J("#GENERATE_REPORT").length === 0){ //Insert Button unsafeWindow.$J("#ticket-sub-toolbar").append("<input id=\"GENERATE_REPORT\" class=\"btn tooltip\" title=\"Generate Ticket Report\" type=\"button\" value=\"Generate Report\" data-highlight=\"true\">"); unsafeWindow.$J("#GENERATE_REPORT").click(generateAction); //unsafeWindow.$J("#GENERATE_REPORT").click(function(){nextPage(function(){alert("NEXT");});}); } } }, 1000); })();