Untitled
unknown
plain_text
2 years ago
8.7 kB
11
Indexable
// ==UserScript==
// @name Telus - Task Script
// @namespace Scripts->Telus->Raters
// @version 2022.02.07.1
// @description Do some super interesting stuff for Tig.
// @author Snowey Ohioan, INC
// @include https://www.raterhub.com/evaluation/rater/task/show*
// ==/UserScript==
/* jshint esnext: true */
/* jshint expr: true */ // Make JSHint shut up about short circuiting
/* eslint no-undef: 0*/
const domReady = cb=>{
(document.readyState === "interactive" || document.readyState === "complete") ? cb() : document.addEventListener("DOMContentLoaded", cb);
};
// Set data to a valid value if it doesn't exist (not in a task)
if (typeof(data) == "undefined") data = 0;
// some custom styling for pages.
const styles = `
body { background-color: #c3c3c3;}
[data-helpme=obscured] {display: none !important;}
[data-helpme=visible] { display: inherit;}
#customInstructionButton { box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2), 0 6px 20px 0 rgba(0,0,0,0.19); border-radius: 10px; background-color: rgba(197, 181, 197, 0.69); font-size: 11px; width: 100px; outline:none; z-index: 128; position:absolute; top:50px; right:1px;}
:focus {background: #EAFDF5 !important; color:black !important;}
.button:focus {background: #771D64 !important; color:black !important;}
.hidden-scrollbar::-webkit-scrollbar { visibility: hidden; }
textarea:focus { background: #EAFDF5 !important;}
input:focus { background: #EAFDF5 !important;}
input:blur { background: #FFEFFF !important;}`;
// Quick macro to check all radio buttons to no or whatever
const radioClicks = queryval => { document.querySelectorAll(`input[type=radio][value="${queryval}"]`).forEach(i=>i.click()); }
// Same for checkboxes
const checkClicks = queryval => { document.querySelectorAll(`input[type=checkbox][value="${queryval}"]`).forEach(i=>i.click()); }
const blankClicker = queryValArray => {
queryValArray.forEach(query=> {
document.querySelectorAll(query).forEach(element=> {
if (! element.checked) element.click()
});
});
}
// A better version - takes an array of query to go through
const radClicker = queryValArray => {
queryValArray.forEach(query=> {
document.querySelectorAll(query).forEach(element=>element.click());
});
}
// Function to modify the task header to include the templateID and projectID.
const fancyTaskHeader = (myPID = "ERR", myTID = "ERR", flipSign = "") => {
const tidConf = { "29603274":["#2c4ea2", "#085463"], "28991227":["#631708", "#584c0a"]};
let debugContainer = document.createElement("LI");
let ewokHead = document.getElementsByClassName('ewok-task-action-header'); // Gives us the main container DIV for the list items.
if (myTID == "29603274" || myTID == "28991227" ) { // NM = 29603274, SxS = 28991227
let flipCheck = (popped = populateTask.toString().match('"flipped":(true|false)') ) && popped[1] || 0;
if (flipCheck) {
flipSign = (flipCheck == "true") ? "⟸Я " : "🔮 ";
document.querySelector('.ewok-rater-header').style.backgroundColor = ( flipCheck == "true") ? tidConf[myTID][1] : tidConf[myTID][0];
}
}
debugContainer.innerHTML = `<span id="flipper">${flipSign}</span><span id="surfaceTemplate">Template: <b id="theTID">${myTID}</b></span>
<span id="surfaceProject">Project: <b id="thePID">${myPID}</b></span>`;
if (ewokHead.length) {
ewokHead[0].appendChild(debugContainer);
} else {
document.body.appendChild(debugContainer);
}
// Let's stylize it a little bit.
debugContainer.style.marginLeft = "4em";
document.getElementById("theTID").style.color = "#ffd8a8";
document.getElementById("thePID").style.color = "#8df1cc";
if (flipSign) {
let flippy = document.getElementById("flipper");
flippy.style.color = "#ffc7c7";
flippy.style.fontWeight = "900";
flippy.style.fontSize= "medium";
}
// And hide our email while we're at it, to make sharing screenshots less privacy invasive.
// ~~~~~~~ WARNING!!! ~~~~~~~~
// comment this out before doing a Report Problem and including a screenshot!
// ~~~~~~~ WARNING!!! ~~~~~~~~
let emailElement = document.querySelector('.ewok-rater-header-user>li');
if ( emailElement.innerText.includes("gmail.com")) emailElement.innerText = "Rater";
} // end of fancyTaskHeader
const strToNode = s=>{let template = document.createElement('template'); template.innerHTML = s; return template.content.firstChild;}
const addStyleSheet = styleConst=>{let head = document.head;let style = strToNode(`<style type='text/css' class='globalstyle'>${styleConst}</style>`); head.appendChild(style);}
const instructionButton = (a=[], siv=1, foc=0, arrayIsElements=0)=> {
if (a.length) {
const toggleHelpMe = el=>{el.dataset.helpme = ( el.dataset.helpme === 'obscured' ) ? 'visible' : 'obscured';}
const i = ' Instructions';
document.getElementsByTagName('body')[0].prepend(strToNode(`<button id="customInstructionButton" type="button">-${i}</button>`));
b = document.getElementById('customInstructionButton');
b.addEventListener('click', ev=>{ev.target.innerText = ((ev.target.innerText.slice(0,1) === '+')?'-':'+')+i;
if (arrayIsElements) a.forEach(v=>toggleHelpMe(v));
else a.forEach(v=>{els = document.querySelectorAll(v); els.forEach(el=>toggleHelpMe(el));});
});
b.click();
b.tabIndex = -1; // Keep out of tab chain
if (siv) b.scrollIntoView();
if (foc) b.focus(); // Make sure we're always focused in frame.
}
}
// Involved function to deal with the evidence/target type tasks (template 87385617)
const process_target_evidence = ()=>{
const magic_color = "#eef9f1";
const magic_color_two = "#b1ebc1";
const full_match_color = "#889EF6";
const noevidence = "No evidence was cited.";
const unsupported = document.querySelectorAll('[value="unsupported"]');
const unsupported_comment = document.querySelectorAll('[name^="comment_attribution_sentence"]');
const markwords = (elid, keyphrase, highlight="#A380EE") => {
let evidence_text = elid.innerHTML;
let re = new RegExp(`(?![^\\<\\>]*\\>)\\b${escapeRegExp(keyphrase)}[\\b]*`, 'gi');
let marked = evidence_text.replace(re, `<mark style="background-color: ${highlight};">`+"$&"+'</mark>');
elid.innerHTML = marked;
}
let evidences = document.querySelectorAll('tr>td>div>h5');
let trows = document.querySelectorAll('table[id="editable-45"]>tbody>tr');
evidences.forEach( (evidence,evidence_index)=> {
toprow = trows[evidence_index+1]; // offset the header row with question a, question b
evidence_container = evidence.parentElement;
evidence_blocks = evidence_container.querySelectorAll('p');
if (! evidence_blocks.length) { // no paragraphs, this should be no evidence
if (evidence_container.innerText.includes(noevidence)) {
unsupported[evidence_index].click();
unsupported_comment[evidence_index].value = noevidence;
toprow.style.backgroundColor = magic_color_two;
}
} else {
let keyphrase = toprow.querySelector('mark')?.innerText.replace(/\s*\[[\d, ]*\]\s*/g, '').toLowerCase()
evidence_blocks.forEach(eblock=>{
let evidenceText = eblock.innerText;
let phrase_idx = evidenceText.toLowerCase().indexOf(keyphrase);
if (phrase_idx != -1) {
let phrase_len = keyphrase.length;
eblock.innerHTML = `${evidenceText.slice(0, phrase_idx)}<mark style="background-color: ${full_match_color};">
${evidenceText.slice(phrase_idx,phrase_idx+phrase_len)}</mark>${evidenceText.slice(phrase_idx+phrase_len)}`;
toprow.style.backgroundColor = magic_color;
} else {
let phrases = keyphrase.match(/\b(\w+){4}[\b]*/g);
let tossdupes = new Set(phrases);
tossdupes.forEach(i=>markwords(eblock, i));
}
})
}
})
}
// Run this when page has completed loading
domReady(()=>{
console.info(`${GM_info.script.name} ${GM_info.script.version}`);
if (data) {
addStyleSheet(styles);
// Log task info to console
console.info('Project: ', data.projectId, ' templateId: ', data.templateId);
fancyTaskHeader(data.projectId, data.templateId);
// force templateId to number
let templateIdNumber = +data.templateId;
// Checks the box named "nomoredupes".
function checkNoMoreDupesBox() {
// Get the box named "nomoredupes".
var box = document.querySelector('input[name="nomoredupes"]');
// Check the box.
box.checked = true;
}
// Run the function when the page loads.Editor is loading...
Leave a Comment