blob: 5116f04835bcf3d37656a4ab23a4378347761249 [file] [log] [blame]
/**
* GRAPPELLI UTILS
* functions needed for Grappelli
*/
// grp jQuery namespace
var grp = {
"jQuery": jQuery.noConflict(true)
};
// django jQuery namespace
var django = {
"jQuery": grp.jQuery.noConflict(true)
};
var inputTypes = [
"[type='search']",
"[type='email']",
"[type='url']",
"[type='tel']",
"[type='number']",
"[type='range']",
"[type='date']",
"[type='month']",
"[type='week']",
"[type='time']",
"[type='datetime']",
"[type='datetime-local']",
"[type='color']"].join(",");
(function($) {
// dateformat
grappelli.getFormat = function(type) {
if (type == "date") {
var format = DATE_FORMAT.toLowerCase().replace(/%\w/g, function(str) {
str = str.replace(/%/, '');
return str + str;
});
return format;
}
};
// remove types: search, email, url, tel, number, range, date
// month, week, time, datetime, datetime-local, color
// because of browser inconsistencies
/*jshint multistr: true */
grappelli.cleanInputTypes = function() {
$("form").each(function(){
$(this).find(':input').filter(inputTypes).each(function(){
$(this).attr("type", "text");
});
});
};
// datepicker, timepicker init
grappelli.initDateAndTimePicker = function() {
// HACK: get rid of text after DateField (hardcoded in django.admin)
$('p.datetime').each(function() {
var text = $(this).html();
text = text.replace(/^\w*: /, "");
text = text.replace(/<br>[^<]*: /g, "<br>");
$(this).html(text);
});
var options = {
//appendText: '(mm/dd/yyyy)',
constrainInput: false,
showOn: 'button',
buttonImageOnly: false,
buttonText: '',
dateFormat: grappelli.getFormat('date'),
showButtonPanel: true,
showAnim: '',
// HACK: sets the current instance to a global var.
// needed to actually select today if the today-button is clicked.
// see onClick handler for ".ui-datepicker-current"
beforeShow: function(year, month, inst) {
grappelli.datepicker_instance = this;
}
};
var dateFields = $("input[class*='vDateField']:not([id*='__prefix__'])");
dateFields.datepicker(options);
if (typeof IS_POPUP != "undefined" && IS_POPUP) {
dateFields.datepicker('disable');
}
// HACK: adds an event listener to the today button of datepicker
// if clicked today gets selected and datepicker hides.
// use on() because couldn't find hook after datepicker generates it's complete dom.
$(document).on('click', '.ui-datepicker-current', function() {
$.datepicker._selectDate(grappelli.datepicker_instance);
grappelli.datepicker_instance = null;
});
// init timepicker
$("input[class*='vTimeField']:not([id*='__prefix__'])").grp_timepicker();
};
// changelist: filter
grappelli.initFilter = function() {
$("a.grp-pulldown-handler").click(function() {
var pulldownContainer = $(this).closest(".grp-pulldown-container");
$(pulldownContainer).toggleClass("grp-pulldown-state-open").children(".grp-pulldown-content").toggle();
});
$("a.grp-pulldown-handler").bind('mouseout', function() {
$(this).blur();
});
$(".grp-filter-choice").change(function(){
location.href = $(this).val();
});
};
// changelist: searchbar
grappelli.initSearchbar = function() {
var searchbar = $("input.grp-search-field");
searchbar.focus();
};
grappelli.updateSelectFilter = function(form) {
if (typeof SelectFilter != "undefined"){
form.find(".selectfilter").each(function(index, value){
var namearr = value.name.split('-');
SelectFilter.init(value.id, namearr[namearr.length-1], false, "{% admin_media_prefix %}");
});
form.find(".selectfilterstacked").each(function(index, value){
var namearr = value.name.split('-');
SelectFilter.init(value.id, namearr[namearr.length-1], true, "{% admin_media_prefix %}");
});
}
};
grappelli.reinitDateTimeFields = function(form) {
form.find(".vDateField").datepicker({
constrainInput: false,
showOn: 'button',
buttonImageOnly: false,
buttonText: '',
dateFormat: grappelli.getFormat('date')
});
form.find(".vTimeField").grp_timepicker();
};
// autocomplete helpers
grappelli.get_app_label = function(elem) {
var link = elem.next("a");
if (link.length > 0) {
var url = link.attr('href').split('?')[0].split('/');
return url[url.length-3];
}
return false;
};
grappelli.get_model_name = function(elem) {
var link = elem.next("a");
if (link.length > 0) {
var url = link.attr('href').split('?')[0].split('/');
return url[url.length-2];
}
return false;
};
grappelli.get_query_string = function(elem) {
var link = elem.next("a");
if (link.length > 0) {
var url = link.attr('href').split('/');
pairs = url[url.length-1].replace('?', '').split("&");
return pairs.join(":");
}
return false;
};
})(grp.jQuery);