Created
November 4, 2016 10:46
-
-
Save sweeneyapps/0ce8b7e5cc6f2b9543dac62d36808590 to your computer and use it in GitHub Desktop.
cleaned up code for Rainforest job history page.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name Rainforest Jobs | |
// @namespace http://tampermonkey.net/ | |
// @version 0.5 | |
// @description collect info from job page | |
// @author Paul Sweeney Jr. | |
// @modifier JrRandy | |
// @match https://portal.rainforestqa.com/* | |
// ==/UserScript== | |
(function() { | |
'use strict'; | |
var EasyCopy = true; //adjust this variables to control the easy copy/paste stats under the tables (true/false) | |
var isCF = false; //adjust this variable for CrowdFlower of non-crowdflower (true/false) | |
var rfLinks = document.querySelectorAll("a.primary"); | |
if (rfLinks) { | |
for (var i = 0; i < rfLinks.length; i++) { | |
var link = rfLinks[i]; | |
if (link.innerHTML === "History" && !link.href.includes("&page_size=100")) { | |
link.href = link.href + "&page_size=100"; | |
} | |
} | |
} | |
var curURL = window.location.href; | |
if (!curURL.includes("&page_size=100")) { | |
if (curURL.includes("/profile") && !curURL.includes("/edit") || curURL.includes('/tester')) { | |
var stats = document.querySelectorAll("span.tester-stat-number"); | |
var earned = stats[0], jobs = stats[1], bugs = stats[2]; | |
if (isCF) earned.innerHTML = "$" + (Number(earned.innerHTML.replace("c", "")) / 100); | |
var percent = ((parseInt(bugs.innerHTML) / parseInt(jobs.innerHTML)) * 100).toFixed(2); | |
bugs.innerHTML = bugs.innerHTML + " | " + percent + "%"; | |
} | |
return; // skip the script below | |
} | |
var rfTable = document.getElementsByTagName('table')[0]; | |
/** Running the Script **/ | |
var yesterday = new Date(new Date().setDate(new Date().getDate()-1)); | |
createTable({date: new Date(), text: 'Today'}); | |
createTable({date: yesterday, text: 'Yesterday'}); | |
/** End Script **/ | |
/** Bunch of Functions Below **/ | |
function createTable(day) { | |
var requestDate = day.date; | |
var paid = 0; | |
var pending = 0; | |
var jobCount = 0; | |
var reCurr = /\d+\.\d{1,2}|\d+/; | |
var reCF = /\d+\.0c/; | |
var CFFIXED = 2; | |
var CFCENT = ""; | |
var DOLLAR = "$"; | |
var trainingJobs = 0; | |
var STEPPAY = 0.04; | |
var timeSpent = 0; | |
var ts,a,seconds; | |
function cleanCurrency(currStr) { | |
if (reCF.test(currStr)) isCF = true; | |
var cleanCur = currStr.match(reCurr); | |
return cleanCur ? Number(cleanCur[0]) : 0; | |
} | |
function isToday(dateStr) { | |
if (dateStr === '—') return false; | |
var submitDateUTC = dateStr.replace(/ UTC/, ""); | |
var submitDate = new Date(submitDateUTC); | |
return requestDate.getUTCDate() === submitDate.getDate(); | |
} | |
function getCell(row, cell) { | |
return rfTable.rows[row].cells[cell].innerHTML; | |
} | |
for (var i = 1; i < rfTable.rows.length; i++) { | |
if(isToday(getCell(i, 1) + ' 00:00:01')) { | |
if (cleanCurrency(getCell(i,6)) === 0 && cleanCurrency(getCell(i,5)) === 0) { | |
trainingJobs += 1; | |
ts = getCell(i,4); | |
a = ts.split(':'); | |
seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2]); | |
timeSpent += seconds; | |
} else { | |
paid += cleanCurrency(getCell(i,6)); | |
pending += cleanCurrency(getCell(i,5)); | |
ts = getCell(i,4); | |
a = ts.split(':'); | |
seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2]); | |
timeSpent += seconds; | |
jobCount += 1; | |
} | |
} | |
} | |
if(isCF) { CFFIXED = 1; CFCENT = "c"; DOLLAR = ""; STEPPAY = 4; } | |
var TotalPay = Number(paid) + Number(pending); | |
var Steps = TotalPay/STEPPAY; | |
var Bonus = TotalPay/10; | |
function formatSeconds(seconds) { | |
var date = new Date(1970,0,1); | |
date.setSeconds(seconds); | |
return date.toTimeString().replace(/.*(\d{2}:\d{2}:\d{2}).*/, "$1"); | |
} | |
function formatText(txt) { | |
return DOLLAR + txt.toFixed(CFFIXED) + CFCENT; | |
} | |
/** Data Section **/ | |
var tableData = [ | |
{ | |
heading: 'Paid', | |
value: formatText(paid) | |
}, | |
{ | |
heading: 'Pending', | |
value: formatText(pending) | |
}, | |
{ | |
heading: 'Total', | |
value: formatText(TotalPay) | |
}, | |
{ | |
heading: 'Est. Bonus', | |
value: formatText(Bonus) | |
}, | |
{ | |
heading: 'Job Count', | |
value: jobCount | |
}, | |
{ | |
heading: 'Training', | |
value: trainingJobs | |
}, | |
{ | |
heading: 'Steps', | |
value: Steps.toFixed(0) | |
}, | |
{ | |
heading: 'Time', | |
value: formatSeconds(timeSpent) | |
} | |
]; | |
var cssData = [ | |
{ | |
selector: 'table#info', | |
rules: [ | |
'border-collapse:collapse;', | |
'border-color:#ccc;', | |
'border:none;' | |
] | |
}, | |
{ | |
selector: 'table#info tr th', | |
rules: [ | |
'background-color:#f0f0f0;' | |
] | |
}, | |
{ | |
selector: 'table#info tr th, table#info tr td', | |
rules: [ | |
'font-family:Arial, sans-serif;', | |
'font-size:14px;', | |
'font-weight:normal;', | |
'padding:10px 5px;', | |
'padding:10px 5px;', | |
'border-style:solid;', | |
'border-width:0px;', | |
'overflow:hidden;', | |
'word-break:normal;', | |
'border-color:#ccc;', | |
'color:#333;', | |
'text-align:center;', | |
'vertical-align:top;' | |
] | |
}, | |
{ | |
selector: 'table#info tr td:nth-child(even)', | |
rules: [ | |
'background-color:#fff;' | |
] | |
}, | |
{ | |
selector: 'table#info tr td:nth-child(odd)', | |
rules: [ | |
'background-color:#f9f9f9;' | |
] | |
} | |
]; | |
if (day.text === "Today") { // only need to run this once | |
var style = generateCSS(cssData); | |
$(style).insertBefore(rfTable); | |
} | |
var div = document.createElement('div'); | |
var br = document.createElement('br'); | |
div.appendChild(br); | |
var title = document.createElement('center'); | |
title.innerHTML = day.text + "'s Summary"; | |
div.appendChild(title); | |
var table = generateTable(day, tableData); | |
table.id = "info"; | |
div.appendChild(table); | |
if (EasyCopy) { | |
var textDiv = document.createElement('div'); | |
textDiv.innerHTML = generateText(day, tableData, ["Paid", "Pending", "Total", "Est. Bonus"]); | |
div.appendChild(textDiv); | |
} | |
$(div).insertBefore(rfTable); | |
} // end createTable | |
/** Generators for HTML / TEXT / CSS **/ | |
function generateText(day, data, skip) { | |
var text = day.text; | |
for (var i = 0; i < data.length; i++) { | |
if (skip.indexOf(data[i].heading) !== -1) continue; | |
text += " " + data[i].heading + ": " + data[i].value + " |"; | |
} | |
return text; | |
} | |
function generateTable(day, data) { | |
var table = document.createElement('table'); | |
var headingRow = document.createElement('tr'); | |
var valueRow = document.createElement('tr'); | |
table.appendChild(headingRow); | |
table.appendChild(valueRow); | |
for (var i = 0; i < data.length; i++) { | |
var cell = data[i]; | |
var headingCell = document.createElement('th'); | |
var valueCell = document.createElement('td'); | |
headingCell.innerHTML = cell.heading; | |
valueCell.innerHTML = cell.value; | |
headingRow.appendChild(headingCell); | |
valueRow.appendChild(valueCell); | |
} | |
return table; | |
} | |
function generateCSS(data) { | |
var style = document.createElement('style'); | |
var cssBody = ""; | |
for (var i = 0; i < data.length; i++) { | |
var selector = data[i].selector; | |
var rules = data[i].rules; | |
cssBody += selector + " { "; | |
for (var r = 0; r < rules.length; r++){ | |
var rule = rules[r]; | |
cssBody += rule; | |
} | |
cssBody += " } "; | |
} | |
style.innerText = cssBody; | |
return style; | |
} | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment