landmark-serve
Version:
Web Application Framework and Admin GUI / Content Management System built on Express.js and Mongoose
233 lines (190 loc) • 5.65 kB
JavaScript
jQuery(function($) {
// show hide the "back to website" message in the navbar
$('.navbar-backtobrand-trigger').mouseenter(function(e) {
$('.navbar-backtobrand-message').addClass('active');
}).mouseleave(function() {
$('.navbar-backtobrand-message').removeClass('active');
});
// generic confirm
$('a[data-confirm]').click(function(e) {
if (!confirm($(this).data().confirm)) {
e.preventDefault();
return false;
}
});
// search box highlighting
$('.searchbox-input').focus(function() {
$('.searchbox-form').addClass('active');
$('.searchbox-submit').removeClass('btn-default').addClass('btn-primary');
}).blur(function() {
if (!$('.searchbox-input').val().length) {
$('.searchbox-form').removeClass('active');
$('.searchbox-submit').removeClass('btn-primary').addClass('btn-default');
}
});
$('img.img-load').each(function() {
var $img = $(this);
$img.css('opacity', 0);
$img.load(function() {
$img[0].removeAttribute('width');
$img[0].removeAttribute('height');
$img.css('opacity', '');
$img.parent().find('.img-loading').remove();
});
$img.prop('src', $img.data().src);
});
$('a[data-toggle=tooltip]').tooltip();
$('.ui-datepicker').pikaday({ firstDay: 1 });
$('.ui-select2').select2({ allowClear: true });
$('.ui-select2-tags').each(function(i, el) {
el = $(el);
el.select2({
tags: el.val().split(",")
});
});
// clean up empty list sections
$('.dropdown-menu .dropdown-header').each(function() {
if ($(this).next('.dropdown-header').length) {
$(this).hide();
}
});
$('.items-list.sortable').on('ui.sorted', function() {
var $this = $(this),
listPath = $this.data('listPath'),
order = _.pluck($this.find('tbody tr'), 'id');
$.ajax({
type: 'POST',
url: '/landmark/api/' + listPath + '/order',
data: Landmark.csrf({
order: order.join(',')
}),
error: function() {
alert("There was a problem saving your changes. Please refresh to see the current data.");
}
});
});
$('.ui-select2-ref').each(function(i, el) {
el = $(el);
var multi = el.data('refMany'),
refPath = el.data('refPath'),
refFilters = el.data('refFilters'),
label = {
singular: el.data('refSingular'),
plural: el.data('refPlural')
},
perPage = 10;
var args = {
context: 'relationship',
list: Landmark.list.path,
field: el.attr('name')
};
if (Landmark.item) {
args.item = Landmark.item.id;
}
el.select2({
placeholder: 'Search for ' + (multi ? label.plural : ' a ' + label.singular) + '...',
allowClear: true,
multiple: multi,
ajax: {
url: '/landmark/api/' + refPath + '/autocomplete',
dataType: 'json',
quietMillis: 500,
data: function(term, page) {
var filters, $related;
if (refFilters) {
filters = {};
_.each(refFilters, function(value, key) {
if(value.substr(0,1) == ':') {
$related = $('input#field_' + value.substr(1));
filters[key] = $related.val();
}
});
}
return _.extend({
q: term, //search term
limit: perPage, // page size
page: page, // page number, tracked by select2, one-based
filters: filters // reference filters
}, args);
},
results: function(data, page) {
var more = (page * perPage) < data.total; // whether or not there are more results available
return { results: data.items, more: more };
}
},
initSelection: function(element, callback) {
var ids = $(element).val();
if (ids !== '') {
ids = ids.split(',');
var data = [];
var loaded = function(rtn) {
data.push(rtn);
if (data.length == ids.length)
callback(multi ? data : data[0]);
};
$.each(ids, function() {
$.ajax('/landmark/api/' + refPath + '/get', {
data: {
id: this,
dataset: 'simple'
},
dataType: 'json'
}).done(loaded);
});
}
},
formatResult: function(i) { return i.name },
formatSelection: function(i) { return i.name },
escapeMarkup: function (m) { return m; } // we do not want to escape markup since we are displaying html in results
});
if (!multi) {
el.on('change', function(e) {
var $this = $(this),
$gotoLink = $this.next('a.btn-goto-linked-item'),
val = $this.select2('val');
if (val == '') {
$gotoLink.hide();
} else {
$gotoLink.attr('href','/landmark/' + refPath + '/' + val);
$gotoLink.show();
}
});
}
});
$('.field.type-relationship input[data-ref-filters]').each(function() {
var $input = $(this),
data = $input.data(),
$inputs2 = $input.siblings('#s2id_' + $input.attr('id'));
_.each(data.refFilters, function(value, key) {
if (value.substr(0,1) != ':') {
return;
}
var $related = $('#field_' + value.substr(1)),
relatedData = $related.data();
var checkRelated = function(msg) {
var $message = $input.siblings('.field-message');
if ($related.val() == '') {
$inputs2.hide();
$message.html('<span>Please select a ' + relatedData.refSingular + ' before selecting a ' + data.refSingular + '.</span>').show();
} else {
$inputs2.show();
$message.hide();
}
}
checkRelated();
$related.on('change.dependency.' + $input.attr('id'), function(e) {
var $gotoLink = $input.next('a.btn-goto-linked-item');
checkRelated();
$inputs2.select2('val', '');
$input.val('');
$gotoLink.hide();
});
});
});
$('.btn.autoclick').each(function() {
var $btn = $(this);
setTimeout(function() {
$btn.click();
}, 1);
});
});