Last active
January 3, 2016 03:59
-
-
Save styks1987/8405785 to your computer and use it in GitHub Desktop.
Tamper Monkey Script for ProWorkflow
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 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"); | |
}); | |
} | |
}); | |
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
#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