Skip to content

Instantly share code, notes, and snippets.

@styks1987
Last active January 3, 2016 03:59
Show Gist options
  • Save styks1987/8405785 to your computer and use it in GitHub Desktop.
Save styks1987/8405785 to your computer and use it in GitHub Desktop.
Tamper Monkey Script for ProWorkflow
// ==UserScript==
// @name Pro Workflow modifications
// @namespace https://proworkflow6.net/
// @version 0.1
// @description enter something useful
// @match https://proworkflow6.net/Merge/*
// @copyright 2012+, You
// ==/UserScript==
(function ($) {
/**
* @function
* @property {object} jQuery plugin which runs handler function once specified element is inserted into the DOM
* @param {function} handler A function to execute at the time when the element is inserted
* @param {bool} shouldRunHandlerOnce Optional: if true, handler is unbound after its first invocation
* @example $(selector).waitUntilExists(function);
*/
$.fn.waitUntilExists = function (handler, shouldRunHandlerOnce, isChild) {
var found = 'found';
var $this = $(this.selector);
var $elements = $this.not(function () { return $(this).data(found); }).each(handler).data(found, true);
if (!isChild)
{
(window.waitUntilExists_Intervals = window.waitUntilExists_Intervals || {})[this.selector] =
window.setInterval(function () { $this.waitUntilExists(handler, shouldRunHandlerOnce, true); }, 500)
;
}
else if (shouldRunHandlerOnce && $elements.length)
{
window.clearInterval(window.waitUntilExists_Intervals[this.selector]);
}
return $this;
}
}(jQuery));
/**
* Timeago is a jQuery plugin that makes it easy to support automatically
* updating fuzzy timestamps (e.g. "4 minutes ago" or "about 1 day ago").
*
* @name timeago
* @version 1.3.1
* @requires jQuery v1.2.3+
* @author Ryan McGeary
* @license MIT License - http://www.opensource.org/licenses/mit-license.php
*
* For usage and examples, visit:
* http://timeago.yarp.com/
*
* Copyright (c) 2008-2013, Ryan McGeary (ryan -[at]- mcgeary [*dot*] org)
*/
(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['jquery'], factory);
} else {
// Browser globals
factory(jQuery);
}
}(function ($) {
$.timeago = function(timestamp) {
if (timestamp instanceof Date) {
return inWords(timestamp);
} else if (typeof timestamp === "string") {
return inWords($.timeago.parse(timestamp));
} else if (typeof timestamp === "number") {
return inWords(new Date(timestamp));
} else {
return inWords($.timeago.datetime(timestamp));
}
};
var $t = $.timeago;
$.extend($.timeago, {
settings: {
refreshMillis: 60000,
allowFuture: false,
localeTitle: false,
cutoff: 0,
strings: {
prefixAgo: null,
prefixFromNow: null,
suffixAgo: "ago",
suffixFromNow: "",
seconds: "minute",
minute: "about a minute",
minutes: "%d minutes",
hour: "about an hour",
hours: "Today",
day: "1 day",
days: "%d days",
month: "1 month",
months: "%d months",
year: "1 year",
years: "%d years",
wordSeparator: " ",
numbers: []
}
},
inWords: function(distanceMillis) {
var $l = this.settings.strings;
var prefix = $l.prefixAgo;
var suffix = $l.suffixAgo;
if (this.settings.allowFuture) {
if (distanceMillis < 0) {
prefix = $l.prefixFromNow;
suffix = $l.suffixFromNow;
}
}
var seconds = Math.abs(distanceMillis) / 1000;
var minutes = seconds / 60;
var hours = minutes / 60;
var days = hours / 24;
var years = days / 365;
function substitute(stringOrFunction, number) {
var string = $.isFunction(stringOrFunction) ? stringOrFunction(number, distanceMillis) : stringOrFunction;
var value = ($l.numbers && $l.numbers[number]) || number;
return string.replace(/%d/i, value);
}
var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) ||
seconds < 90 && substitute($l.minute, 1) ||
minutes < 45 && substitute($l.minutes, Math.round(minutes)) ||
minutes < 90 && substitute($l.hour, 1) ||
hours < 24 && substitute($l.hours, Math.round(hours)) ||
hours < 42 && substitute($l.day, 1) ||
days < 30 && substitute($l.days, Math.round(days)) ||
days < 45 && substitute($l.month, 1) ||
days < 365 && substitute($l.months, Math.round(days / 30)) ||
years < 1.5 && substitute($l.year, 1) ||
substitute($l.years, Math.round(years));
var separator = $l.wordSeparator || "";
if ($l.wordSeparator === undefined) { separator = " "; }
return $.trim([prefix, words, suffix].join(separator));
},
parse: function(iso8601) {
var s = $.trim(iso8601);
s = s.replace(/\.\d+/,""); // remove milliseconds
s = s.replace(/-/,"/").replace(/-/,"/");
s = s.replace(/T/," ").replace(/Z/," UTC");
s = s.replace(/([\+\-]\d\d)\:?(\d\d)/," $1$2"); // -04:00 -> -0400
s = s.replace(/([\+\-]\d\d)$/," $100"); // +09 -> +0900
return new Date(s);
},
datetime: function(elem) {
var iso8601 = $t.isTime(elem) ? $(elem).attr("datetime") : $(elem).attr("title");
return $t.parse(iso8601);
},
isTime: function(elem) {
// jQuery's `is()` doesn't play well with HTML5 in IE
return $(elem).get(0).tagName.toLowerCase() === "time"; // $(elem).is("time");
}
});
// functions that can be called via $(el).timeago('action')
// init is default when no action is given
// functions are called with context of a single element
var functions = {
init: function(){
var refresh_el = $.proxy(refresh, this);
refresh_el();
var $s = $t.settings;
if ($s.refreshMillis > 0) {
this._timeagoInterval = setInterval(refresh_el, $s.refreshMillis);
}
},
update: function(time){
var parsedTime = $t.parse(time);
$(this).data('timeago', { datetime: parsedTime });
if($t.settings.localeTitle) $(this).attr("title", parsedTime.toLocaleString());
refresh.apply(this);
},
updateFromDOM: function(){
$(this).data('timeago', { datetime: $t.parse( $t.isTime(this) ? $(this).attr("datetime") : $(this).attr("title") ) });
refresh.apply(this);
},
dispose: function () {
if (this._timeagoInterval) {
window.clearInterval(this._timeagoInterval);
this._timeagoInterval = null;
}
}
};
$.fn.timeago = function(action, options) {
var fn = action ? functions[action] : functions.init;
if(!fn){
throw new Error("Unknown function name '"+ action +"' for timeago");
}
// each over objects here and call the requested function
this.each(function(){
fn.call(this, options);
});
return this;
};
function refresh() {
var data = prepareData(this);
var $s = $t.settings;
if (!isNaN(data.datetime)) {
if ( $s.cutoff == 0 || distance(data.datetime) < $s.cutoff) {
$(this).text(inWords(data.datetime));
}
}
return this;
}
function prepareData(element) {
element = $(element);
if (!element.data("timeago")) {
element.data("timeago", { datetime: $t.datetime(element) });
var text = $.trim(element.text());
if ($t.settings.localeTitle) {
element.attr("title", element.data('timeago').datetime.toLocaleString());
} else if (text.length > 0 && !($t.isTime(element) && element.attr("title"))) {
element.attr("title", text);
}
}
return element.data("timeago");
}
function inWords(date) {
return $t.inWords(distance(date));
}
function distance(date) {
return (new Date().getTime() - date.getTime());
}
// fix for IE6 suckage
document.createElement("abbr");
document.createElement("time");
}));
// make contains inse
$.expr[":"].contains = $.expr.createPseudo(function(arg) {
return function( elem ) {
return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
};
});
/////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////
$(document).ready(function () {
jQuery.timeago.settings.allowFuture = true;
display_task_toggle();
});
// toggle button to turn hidden tasks on or off
function display_task_toggle(){
$('.groupcontainerheadertitle').waitUntilExists(function () {
if (!$('#toggler').is('*')) {
element = $('.headernavcollapseall.headernavrightpageoptions');
$('<div class="headernavrightpageoptions"><a id="toggler" href="#">All Tasks</a></div>').insertBefore(element);
$('#toggler').click(function (e) {
e.preventDefault();
if ($(this).hasClass('on')) {
$(this).removeClass('on');
hide_tasks();
}else{
$(this).addClass('on');
show_tasks();
}
})
}
if (!$('#active_filter').is('*')) {
element = $('#toggler');
$('<div class="headernavrightpageoptions" style="width:180px"><input style="margin-top:-10px; width:190px; border:solid 1px #ccc;" type="text" id="active_filter" placeholder="start typing" /></div>').insertBefore(element.parent());
$('#active_filter').keyup(function (e) {
filter_tasks($(this).val());
})
}
})
}
var hideable_tasks = [
'Internal Review',
'Need Info from Client',
'Need info from the Client',
'ON HOLD',
'Hold',
'ready for matts review',
'Client Info Needed',
'With Client',
'AM/PM',
'Merge Admin',
'Client Review',
'- Live'
];
function hide_tasks(){
$(hideable_tasks).each(function (){
$("div.groupcontainerdatarow:contains('"+this+"')")
.hide()
.find('.groupcontainertaskpagetasktitlespan').css({
color:'#000'
});
});
}
function show_tasks(){
$(hideable_tasks).each(function (){
$("div.groupcontainerdatarow:contains('"+this+"')").show();
});
}
// filter tasks based on text in form field
function filter_tasks(search) {
if (search != '') {
searches = search.split(' ');
conditions = '*';
hide_conditions = [];
row = 'div.groupcontainerdatarow';
$(searches).each(function (){
if (this.indexOf('-') == 0) {
string = this.replace('-', '');
if (string != '') {
hide_conditions.push(row+':contains('+string+')');
}
}else{
conditions += ':contains('+this+')';
}
})
hide_conditions = hide_conditions.join(',');
$(row+conditions).not(hide_conditions).show();
if (hide_conditions != '') {
// We want to hide everything but the things we want to see
$(row).not(conditions).hide();
// additionally, if something we wanted to show
// kinda matches what we want to hide
// we hide it here
// ex. Searching for heavy -crane
// matches all heavy tasks
// Then this line makes sure to explicitely hide
// a task with crane in the name.
$(hide_conditions).hide();
}else{
$(row).not(conditions).hide();
}
}else{
$(row).show();
}
}
function change_due_date(){
$('.groupcontainertaskpagedue').each(function(){
var timestamp = Date.parse($(this).html())
if (isNaN(timestamp) == false) {
$(this).html($.timeago($(this).html()))
}
})
}
function show_id(){
// tasks page
$('.groupcontainertaskpagetasktitlespan').each(function (){
id = $(this).parent().parent().attr('data-taskid');
$(this).html('(id: '+id+') - ' + $(this).html());
})
// project page
$('.pdtaskcontainer').each(function () {
id = $(this).attr('id').replace('pdtask', '');
$(this).find('.pdtaskname .pdtasknamelink').html('(id: '+id+') - ' + $(this).find('.pdtaskname .pdtasknamelink').html());
})
}
$( document ).ajaxComplete(function(event, xhr, settings) {
data = $.parseJSON(xhr.responseText);
if(typeof data.task != 'undefined' && data.task.length > 0){
setTimeout(change_due_date, 1000);
setTimeout(hide_tasks, 1000);
setTimeout(show_id, 1000);
}
if (typeof data['data'] != 'undefined' && data['data'][0].jobtasks.length > 0) {
// We are on the project page
setTimeout(show_id, 1000);
}
if($('#popup_div').is('*')){
$('#popup_div').hover(function() {
$("body").css("overflow","hidden");
}, function() {
$("body").css("overflow","auto");
});
}
});
#headerdetailscontainer {
display: none;
}
#nav6,#nav4,#nav7,#nav1 {
display: none;
}
.groupcontainerdatainlineedit {
background: none;
}
.groupcontainertaskpagedue {
width: 9%;
}
.groupcontainertaskpagepriority,.groupcontainertaskpagetaskorder,.groupcontainertaskpagetaskassigned {
display: none;
}
.groupcontainertaskpagetaskalloc {
width: 7%;
}
.groupcontainertaskpagetaskname {
width: 30%;
}
.groupcontainertaskpagetasknamesubtask,.groupcontainertaskpagetasknamesubsubtask {
margin-left: 0;
}
.groupcontainertaskpagetaskprojecttitle {
width: 34%;
}
.groupcontainertaskpagetaskprojecttitlespan {
color: #000;
}
.groupcontainertaskpageupcomingtaskorder {
display: none;
}
.groupdeleteicon,.groupediticon {
display: none;
}
.ui-dialog {
left: 5%;
width: 90% ;
}
body {
min-width: 790px;
}
#mynotificationspopup {
width: 100%;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment