Skip to content

Instantly share code, notes, and snippets.

@sbycrosz
Last active August 29, 2015 14:28
Show Gist options
  • Save sbycrosz/619106af3335dca89317 to your computer and use it in GitHub Desktop.
Save sbycrosz/619106af3335dca89317 to your computer and use it in GitHub Desktop.
// ==UserScript==
// @name Leave Balance Calculator
// @namespace
// @version 0.0.1
// @description
// @author Sam
// @match https://na32.salesforce.com/a1W?rlid=00N50000002ejrH&id=a0y50000000onx0
// @grant none
// ==/UserScript==
var AvailableLeaveCalculator = {
calculate: function(joinDate, currentDate, leavesTaken) {
var monthSinceJoin = Math.floor((currentDate - joinDate) / (1000 * 3600 * 24 * 30) + 1);
var availableLeavesPerYear = 20;
var accruedLeaves = monthSinceJoin * (availableLeavesPerYear / 12);
var availableLeaves = accruedLeaves - leavesTaken;
return availableLeaves;
}
}
var NodeListUtility = {
toArray: function(nodeList){
return Array.prototype.slice.call(nodeList);
}
};
var AnnualLeavePage = function(){
this._leaveCalculatorContainer = document.createElement("div");
var container = document.getElementById("bodyCell");
container.insertBefore(this._leaveCalculatorContainer, container.firstChild);
this.displayJoinDateForm = function(){
var form = document.createElement("form");
form.innerHTML = "\
Join date : <input id='joinDate' type='date'/> \
<input type='submit'/>\
";
this._leaveCalculatorContainer.appendChild(form);
return form;
};
this.getLeavesTakenTotal = function(){
var leavesTakenRowNodes = document.querySelectorAll(".list .dataRow td:nth-child(8)");
var leavesTakenRowArray = NodeListUtility.toArray(leavesTakenRowNodes);
var leavesTakenTotal = leavesTakenRowArray.map(function(element){return element.innerHTML;})
.map(function(number){return parseFloat(number);})
.reduce(function(sum, element){return sum + element;}, 0);
return leavesTakenTotal;
};
this.displayAvailableLeaves = function(availableLeaves){
this._leaveCalculatorContainer.innerHTML = "\
<h1>\
Your Leave Balance is " + availableLeaves.toFixed(2) + " day(s) \
<h1>";
};
};
var AnnualLeaveExtension = function(_page){
var page = _page;
this._getJoinDate = function(){
return new Promise(function (resolve) {
var savedJoinDate = window.localStorage.getItem("joinDate");
if (!!savedJoinDate) {
resolve(new Date(savedJoinDate));
} else {
var form = page.displayJoinDateForm();
form.addEventListener("submit", function(event){
event.preventDefault()
var joinDate = new Date(document.getElementById("joinDate").value);
window.localStorage.setItem("joinDate", joinDate);
resolve(joinDate);
});
}
});
};
this.run = function(){
this._getJoinDate()
.then(function(joinDate) {
var leavesTaken = page.getLeavesTakenTotal();
var availableLeaves = AvailableLeaveCalculator.calculate(joinDate, new Date(), leavesTaken);
page.displayAvailableLeaves(availableLeaves);
});
};
};
new AnnualLeaveExtension(new AnnualLeavePage()).run();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment