NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @namespace https://openuserjs.org/users/floodmeadows // @name Fieldglass completion helper // @description Adds options to complete or reset the billable hours in your Fieldglass timesheet // @copyright 2019, floodmeadows (https://openuserjs.org/users/floodmeadows) // @license MIT // @version 0.4.1 // @updateURL https://openuserjs.org/meta/floodmeadows/Fieldglass_completion_helper.meta.js // @downloadURL https://openuserjs.org/src/scripts/floodmeadows/Fieldglass_completion_helper.user.js // @include https://www.fieldglass.net/rate_schedule_time_sheet_form.do* // @grant none // ==/UserScript== // ==OpenUserJS== // @author floodmeadows // ==/OpenUserJS== (function() { 'use strict'; // Config variables var fullDayHours = 7; var fullDayMins = 30; var halfDayHours = 3; var halfDayMins = 45; var buttonStyle = "margin: 0px 2px 4px; padding: 0px 2px; min-width: 30%; height: 22px; background-color: #ccf; border: 0px;"; var weekButtonStyle = " width: 80%; margin: 4px auto;"; var dayButtonsContainerStyle = "display:inline-block; width:2.4em; vertical-align:top;"; // derived / combined config values var fullWeekText = fullDayHours + ":" + fullDayMins + " every working day"; var nonWeekText = "0:00 every day"; var noneDayText = "0:00"; var halfDayText = halfDayHours + ":" + halfDayMins; var fullDayText = fullDayHours + ":" + fullDayMins; // add buttons to set values for the whole week var weekButtons = document.createElement('div'); var fillAllLink = document.createElement('button'); fillAllLink.textContent = fullWeekText; fillAllLink.setAttribute('style', buttonStyle + weekButtonStyle); var clearAllLink = document.createElement('button'); clearAllLink.textContent = nonWeekText; clearAllLink.setAttribute('style', buttonStyle + weekButtonStyle); weekButtons.appendChild(fillAllLink); weekButtons.appendChild(clearAllLink); // For the first page (project hours worked, etc.) add the "full week" and "none week" links to the first cell of the first "hoursWorked" row if(document.getElementsByClassName('billableHeader').length > 0) { document.querySelector("tr.hoursWorked").firstElementChild.appendChild(weekButtons.cloneNode(true)); } else { // for the second page (non-working days, unpaid holiday etc.) add the week buttons to each row of the form document.querySelectorAll("td.wordBreakAll").forEach( function(val, index, listObj) { val.appendChild(weekButtons.cloneNode(true)); }); } // Add buttons to control each day var dayButtons = document.createElement('div'); dayButtons.style = dayButtonsContainerStyle; var fullDayButton = document.createElement('button'); fullDayButton.innerHTML = fullDayText; fullDayButton.setAttribute('style', buttonStyle); var halfDayButton = document.createElement('button'); halfDayButton.innerHTML = halfDayText; halfDayButton.setAttribute('style', buttonStyle); var noneDayButton = document.createElement('button'); noneDayButton.innerHTML = noneDayText; noneDayButton.setAttribute('style', buttonStyle); dayButtons.appendChild(fullDayButton); dayButtons.appendChild(halfDayButton); dayButtons.appendChild(noneDayButton); document.querySelectorAll("td.hoursWorked").forEach( function(currentValue, currentIndex, listObj) { currentValue.insertBefore(dayButtons.cloneNode(true), currentValue.childNodes[0]); }); function fillAllWorkingDays(el) { el.parentElement.parentElement.parentElement.querySelectorAll('td.hoursWorked:not(.nonWorkingDay) > input.hour').forEach(function(val,index,listObj){ val.value = fullDayHours; }); el.parentElement.parentElement.parentElement.querySelectorAll('td.hoursWorked:not(.nonWorkingDay) > input.min').forEach(function(val,index,listObj){ val.value = fullDayMins; }); } function clearAllDays(el) { el.parentElement.parentElement.parentElement.querySelectorAll('td.hoursWorked > input.hour').forEach(function(val,index,listObj){ val.value = 0; }); el.parentElement.parentElement.parentElement.querySelectorAll('td.hoursWorked > input.min').forEach(function(val,index,listObj){ val.value = 0; }); } function fillDay(element, hours, mins) { element.parentElement.parentElement.querySelector('td.hoursWorked > input.hour').value = hours; element.parentElement.parentElement.querySelector('td.hoursWorked > input.min').value = mins; } document.querySelectorAll("tr.hoursWorked, tr.ratesEntry").forEach( function(currentValue, currentIndex, listObj) { currentValue.addEventListener("click", function(event){ var element = event.target; if(element.innerHTML == fullWeekText) { fillAllWorkingDays(element); } else if(element.innerHTML == nonWeekText) { clearAllDays(element); } else if(element.innerHTML == fullDayText) { fillDay(element, fullDayHours, fullDayMins); } else if(element.innerHTML == halfDayText) { fillDay(element, halfDayHours, halfDayMins); } else if(element.innerHTML == noneDayText) { fillDay(element, 0, 0); } event.preventDefault(); }); }); })();