Initial Redmine tooling and local plugin forks
This commit is contained in:
@@ -0,0 +1,247 @@
|
||||
// Copyright (c) 2011-2013 Kirill Bezrukov
|
||||
|
||||
var noteFileFieldCount = 1;
|
||||
|
||||
function addNoteFileField() {
|
||||
if (noteFileFieldCount >= 10) return false
|
||||
noteFileFieldCount++;
|
||||
var f = document.createElement("input");
|
||||
f.type = "file";
|
||||
f.name = "note_attachments[" + noteFileFieldCount + "][file]";
|
||||
f.size = 30;
|
||||
var d = document.createElement("input");
|
||||
d.type = "text";
|
||||
d.name = "note_attachments[" + noteFileFieldCount + "][description]";
|
||||
d.size = 60;
|
||||
|
||||
p = document.getElementById("note_attachments_fields");
|
||||
p.appendChild(document.createElement("br"));
|
||||
p.appendChild(f);
|
||||
p.appendChild(d);
|
||||
}
|
||||
|
||||
function updateCustomForm(url, form) {
|
||||
$.ajax({
|
||||
url: url,
|
||||
type: 'post',
|
||||
data: $(form).serialize()
|
||||
});
|
||||
}
|
||||
|
||||
function toggleContact(event, element)
|
||||
{
|
||||
if (event.shiftKey==1)
|
||||
{
|
||||
if (element.checked) {
|
||||
checkAllContacts($$('.contacts.index td.checkbox input'));
|
||||
}
|
||||
else
|
||||
{
|
||||
uncheckAllContacts($$('.contacts.index td.checkbox input'));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Element.up(element, 'tr').toggleClassName('context-menu-selection');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Observ field function
|
||||
|
||||
(function( $ ){
|
||||
|
||||
jQuery.fn.observe_field = function(frequency, callback) {
|
||||
|
||||
frequency = frequency * 100; // translate to milliseconds
|
||||
|
||||
return this.each(function(){
|
||||
var $this = $(this);
|
||||
var prev = $this.val();
|
||||
|
||||
var check = function() {
|
||||
if(removed()){ // if removed clear the interval and don't fire the callback
|
||||
if(ti) clearInterval(ti);
|
||||
return;
|
||||
}
|
||||
|
||||
var val = $this.val();
|
||||
if(prev != val){
|
||||
prev = val;
|
||||
$this.map(callback); // invokes the callback on $this
|
||||
}
|
||||
};
|
||||
|
||||
var removed = function() {
|
||||
return $this.closest('html').length == 0
|
||||
};
|
||||
|
||||
var reset = function() {
|
||||
if(ti){
|
||||
clearInterval(ti);
|
||||
ti = setInterval(check, frequency);
|
||||
}
|
||||
};
|
||||
|
||||
check();
|
||||
var ti = setInterval(check, frequency); // invoke check periodically
|
||||
|
||||
// reset counter after user interaction
|
||||
$this.bind('keyup click mousemove', reset); //mousemove is for selects
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
$.fn.insertAtCaret = function (myValue) {
|
||||
|
||||
return this.each(function() {
|
||||
|
||||
//IE support
|
||||
if (document.selection) {
|
||||
|
||||
this.focus();
|
||||
sel = document.selection.createRange();
|
||||
sel.text = myValue;
|
||||
this.focus();
|
||||
|
||||
} else if (this.selectionStart || this.selectionStart == '0') {
|
||||
|
||||
//MOZILLA / NETSCAPE support
|
||||
var startPos = this.selectionStart;
|
||||
var endPos = this.selectionEnd;
|
||||
var scrollTop = this.scrollTop;
|
||||
this.value = this.value.substring(0, startPos)+ myValue+ this.value.substring(endPos,this.value.length);
|
||||
this.focus();
|
||||
this.selectionStart = startPos + myValue.length;
|
||||
this.selectionEnd = startPos + myValue.length;
|
||||
this.scrollTop = scrollTop;
|
||||
|
||||
} else {
|
||||
|
||||
this.value += myValue;
|
||||
this.focus();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
})( jQuery );
|
||||
|
||||
function setupDeferredTabs(url) {
|
||||
$('body').on('click', '.tab-header', function(e){
|
||||
tab = $(e.target);
|
||||
$('.tab-placeholder').removeClass('active');
|
||||
name = tab.data('name');
|
||||
partial = tab.data('partial');
|
||||
placeholder = $('#tab-placeholder-' + name);
|
||||
placeholder.addClass('active');
|
||||
|
||||
if (!placeholder.is('.loaded')) {
|
||||
url = url
|
||||
$.ajax(url, {
|
||||
data: {tab_name: name, partial: partial},
|
||||
complete: function(){
|
||||
placeholder.addClass('loaded')
|
||||
//replaces current URL with the "href" attribute of the current link
|
||||
//(only triggered if supported by browser)
|
||||
if ("replaceState" in window.history) {
|
||||
window.history.replaceState(null, document.title, tab.attr('href'));
|
||||
}
|
||||
return undefined;
|
||||
},
|
||||
dataType: 'script'
|
||||
})
|
||||
}
|
||||
else {
|
||||
if ("replaceState" in window.history) {
|
||||
window.history.replaceState(null, document.title, tab.attr('href'));
|
||||
}
|
||||
}
|
||||
})
|
||||
};
|
||||
|
||||
function selectAllOptions(id) {
|
||||
var select = $('#'+id);
|
||||
select.children('option').attr('selected', true);
|
||||
}
|
||||
|
||||
|
||||
function submit_query_form(id) {
|
||||
selectAllOptions("selected_columns");
|
||||
$('#'+id).submit();
|
||||
}
|
||||
|
||||
//replaces redmine default method showTab() beacuse of compatibility Redmine 3.1+
|
||||
function showContactTab(name, url) {
|
||||
$('div#content .tab-content').hide();
|
||||
$('div.tabs a').removeClass('selected');
|
||||
$('#tab-content-' + name).show();
|
||||
$('#tab-' + name).addClass('selected');
|
||||
if ("replaceState" in window.history) {
|
||||
window.history.replaceState(null, document.title, url);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function tooglePriceField() {
|
||||
$('#deal_price').prop( "disabled", $('.line:visible').size() > 0 );
|
||||
}
|
||||
|
||||
function toggleCRMIssuesSelection(el) {
|
||||
var boxes = $(el).parents('form').find('input[type=checkbox]');
|
||||
var all_checked = true;
|
||||
boxes.each(function(){ if (!$(this).prop('checked')) { all_checked = false; } });
|
||||
boxes.each(function(){
|
||||
if (all_checked) {
|
||||
$(this).removeAttr('checked');
|
||||
$(this).parents('tr').removeClass('context-menu-selection');
|
||||
} else if (!$(this).prop('checked')) {
|
||||
$(this).prop('checked', true);
|
||||
$(this).parents('tr').addClass('context-menu-selection');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function toogleDealItems(el) {
|
||||
$(el).closest('p').hide();
|
||||
$('.deal_items').show();
|
||||
}
|
||||
|
||||
function uploadAvatar(element) {
|
||||
var fileSpan = $('<span>', { id: 'attachments_0'});
|
||||
$('#contact_data #attachments_fields').html('');
|
||||
fileSpan.append(
|
||||
$('<input>', { type: 'hidden', class: 'filename', name: 'attachments[0][filename]'} ).val(element.files[0].name),
|
||||
$('<input>', { type: 'hidden', class: 'description', name: 'attachments[0][description]' } ).val('avatar'),
|
||||
$('<input>', { type: 'hidden', class: 'token', name: 'attachments[0][token]' } )
|
||||
).appendTo('#contact_data #attachments_fields');
|
||||
ajaxUpload(element.files[0], 0, fileSpan, element);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
function initDealSelect2(id, url, placeholder) {
|
||||
$(function () {
|
||||
$('select#' + id).select2({
|
||||
ajax: {
|
||||
url: url,
|
||||
dataType: 'json',
|
||||
delay: 250,
|
||||
data: function (params) {
|
||||
return { q: params.term };
|
||||
},
|
||||
processResults: function (data, params) {
|
||||
return { results: data };
|
||||
},
|
||||
cache: true
|
||||
},
|
||||
placeholder: placeholder,
|
||||
allowClear: true,
|
||||
minimumInputLength: 0,
|
||||
width: '60%',
|
||||
templateResult: function (option) {
|
||||
return $('<span>' + option.avatar + ' ' + option.text + '</span>');
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
Reference in New Issue
Block a user