Attendize/public/assets/javascript/app.js

572 lines
15 KiB
JavaScript

$(function () {
/*
* --------------------------
* Set up all our required plugins
* --------------------------
*/
/* Datepicker */
$(document).ajaxComplete(function () {
$('#DatePicker').remove();
var $div = $("<div>", {id: "DatePicker"});
$("body").append($div);
$div.DateTimePicker({
dateTimeFormat: Attendize.DateTimeFormat,
dateSeparator: Attendize.DateSeparator
});
});
/* Responsive sidebar */
$(document.body).on('click', '.toggleSidebar', function (e) {
$('html').toggleClass('sidebar-open-ltr');
e.preventDefault();
});
/* Scroll to top */
$(window).scroll(function () {
if ($(this).scrollTop() > 100) {
$('.totop').fadeIn();
} else {
$('.totop').fadeOut();
}
});
$(".totop").click(function () {
$("html, body").animate({
scrollTop: 0
}, 200);
});
/*
* --------------------
* Ajaxify those forms
* --------------------
*
* All forms with the 'ajax' class will automatically handle showing errors etc.
*
*/
$('form.ajax').ajaxForm({
delegation: true,
beforeSubmit: function (formData, jqForm, options) {
$(jqForm[0])
.find('.error.help-block')
.remove();
$(jqForm[0]).find('.has-error')
.removeClass('has-error');
var $submitButton = $(jqForm[0]).find('input[type=submit]');
toggleSubmitDisabled($submitButton);
},
uploadProgress: function (event, position, total, percentComplete) {
$('.uploadProgress').show().html('Uploading Images - ' + percentComplete + '% Complete... ');
},
error: function (data, statusText, xhr, $form) {
// Form validation error.
if (422 == data.status) {
processFormErrors($form, $.parseJSON(data.responseText));
return;
}
showMessage('Whoops!, it looks like the server returned an error.');
var $submitButton = $form.find('input[type=submit]');
toggleSubmitDisabled($submitButton);
$('.uploadProgress').hide();
},
success: function (data, statusText, xhr, $form) {
switch (data.status) {
case 'success':
if ($form.hasClass('reset')) {
$form.resetForm();
}
if ($form.hasClass('closeModalAfter')) {
$('.modal, .modal-backdrop').fadeOut().remove();
}
var $submitButton = $form.find('input[type=submit]');
toggleSubmitDisabled($submitButton);
if (typeof data.message !== 'undefined') {
showMessage(data.message);
}
if (typeof data.runThis !== 'undefined') {
eval(data.runThis);
}
if (typeof data.redirectUrl !== 'undefined') {
window.location.href = data.redirectUrl;
}
break;
case 'error':
processFormErrors($form, data.messages);
break;
default:
break;
}
$('.uploadProgress').hide();
},
dataType: 'json'
});
/*
* --------------------
* Create a simple way to show remote dynamic modals from the frontend
* --------------------
*
* E.g :
* <a href='/route/to/modal' class='loadModal'>
* Click For Modal
* </a>
*
*/
$(document.body).on('click', '.loadModal, [data-invoke~=modal]', function (e) {
var loadUrl = $(this).data('href'),
cacheResult = $(this).data('cache') === 'on',
$button = $(this);
$('.modal').remove();
$('.modal-backdrop').remove();
$('html').addClass('working');
$.ajax({
url: loadUrl,
data: {},
localCache: cacheResult,
dataType: 'html',
success: function (data) {
hideMessage();
$('body').append(data);
var $modal = $('.modal');
$modal.modal({
'backdrop': 'static'
});
$modal.modal('show');
$modal.on('hidden.bs.modal', function (e) {
// window
location.hash = '';
});
$('html').removeClass('working');
}
}).done().fail(function (data) {
$('html').removeClass('working');
showMessage(lang("whoops_and_error", {"code": data.status, "error": data.statusText}));
});
e.preventDefault();
});
/*
* ------------------------------------------------------------
* A slightly hackish way to close modals on back button press.
* ------------------------------------------------------------
*/
$(window).on('hashchange', function (e) {
$('.modal').modal('hide');
});
/*
* -------------------------------------------------------------
* Simple way for any type of object to be deleted.
* -------------------------------------------------------------
*
* E.g markup:
* <a data-route='/route/to/delete' data-id='123' data-type='objectType'>
* Delete This Object
* </a>
*
*/
$('.deleteThis').on('click', function (e) {
/*
* Confirm if the user wants to delete this object
*/
if ($(this).data('confirm-delete') !== 'yes') {
$(this).data('original-text', $(this).html()).html('Click To Confirm?').data('confirm-delete', 'yes');
var that = $(this);
setTimeout(function () {
that.data('confirm-delete', 'no').html(that.data('original-text'));
}, 2000);
return;
}
var deleteId = $(this).data('id'),
deleteType = $(this).data('type'),
route = $(this).data('route');
$.post(route, deleteType + '_id=' + deleteId)
.done(function (data) {
if (typeof data.message !== 'undefined') {
showMessage(data.message);
}
if (typeof data.redirectUrl !== 'undefined') {
window.location.href = data.redirectUrl;
}
switch (data.status) {
case 'success':
$('#' + deleteType + '_' + deleteId).fadeOut();
break;
case 'error':
/* Error */
break;
default:
break;
}
}).fail(function (data) {
showMessage(Attendize.GenericErrorMessages);
});
e.preventDefault();
});
$(document.body).on('click', '.pauseTicketSales', function (e) {
var ticketId = $(this).data('id'),
route = $(this).data('route');
$.post(route, 'ticket_id=' + ticketId)
.done(function (data) {
if (typeof data.message !== 'undefined') {
showMessage(data.message);
}
switch (data.status) {
case 'success':
setTimeout(function () {
document.location.reload();
}, 300);
break;
case 'error':
/* Error */
break;
default:
break;
}
}).fail(function (data) {
showMessage(Attendize.GenericErrorMessages);
});
e.preventDefault();
});
/**
* Toggle checkboxes
*/
$(document.body).on('click', '.check-all', function (e) {
var toggleClass = $(this).data('check-class');
$('.' + toggleClass).each(function () {
this.checked = $(this).checked;
});
});
/*
* ------------------------------------------------------------
* Toggle hidden content when a.show-more-content is clicked
* ------------------------------------------------------------
*/
$(document.body).on('click', '.show-more-options', function (e) {
var toggleClass = !$(this).data('toggle-class')
? '.more-options'
: $(this).data('toggle-class');
if ($(this).hasClass('toggled')) {
$(this).html($(this)
.data('original-text'));
} else {
if (!$(this).data('original-text')) {
$(this).data('original-text', $(this).html());
}
$(this).html(!$(this).data('show-less-text') ? 'Show Less' : $(this).data('show-less-text'));
}
$(this).toggleClass('toggled');
/*
* ?
*/
if ($(this).data('clear-field')) {
$($(this).data('clear-field')).val('');
}
$(toggleClass).slideToggle();
e.preventDefault();
});
/*
* Sort by trigger
*/
$('select[name=sort_by_select]').on('change', function () {
$('input[name=sort_by]').val($(this).val()).closest('form').submit();
});
/**
* Custom file inputs
*/
$(document).on('change', '.btn-file :file', function () {
var input = $(this),
numFiles = input.get(0).files ? input.get(0).files.length : 1,
label = input.val().replace(/\\/g, '/').replace(/.*\//, '');
input.trigger('fileselect', [
numFiles,
label
]);
});
$(document.body).on('fileselect', '.btn-file :file', function (event, numFiles, label) {
var input = $(this).parents('.input-group').find(':text'),
log = numFiles > 1 ? numFiles + ' files selected' : label;
if (input.length) {
input.val(log);
} else {
if (log) {
console.log(log);
}
}
});
/**
* Scale the preview iFrames when changing the design of organiser/event pages.
*/
$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
var target = $(e.target).attr("href");
if ($(target).hasClass('scale_iframe')) {
var $iframe = $('iframe', target);
var iframeWidth = $('.iframe_wrap').innerWidth();
var iframeHeight = $('.iframe_wrap').height();
$iframe.css({
width: 1200,
height: 1400
});
var iframeScale = (iframeWidth / 1200);
$iframe.css({
'-webkit-transform': 'scale(' + iframeScale + ')',
'-ms-transform': 'scale(' + iframeScale + ')',
'transform': 'scale(' + iframeScale + ')',
'-webkit-transform-origin': '0 0',
'-ms-transform-origin': '0 0',
'transform-origin': '0 0',
});
}
});
$(document.body).on('click', '.markPaymentReceived', function (e) {
var orderId = $(this).data('id'),
route = $(this).data('route');
$.post(route, 'order_id=' + orderId)
.done(function (data) {
if (typeof data.message !== 'undefined') {
showMessage(data.message);
}
switch (data.status) {
case 'success':
setTimeout(function () {
document.location.reload();
}, 300);
break;
case 'error':
/* Error */
break;
default:
break;
}
}).fail(function (data) {
showMessage(Attendize.GenericErrorMessages);
});
e.preventDefault();
});
});
function changeQuestionType(select)
{
var select = $(select);
var selected = select.find(':selected');
if (selected.data('has-options') == '1') {
$('#question-options').removeClass('hide');
} else {
$('#question-options').addClass('hide');
}
}
function addQuestionOption()
{
var tbody = $('#question-options tbody');
var questionOption = $('#question-option-template').html();
tbody.append(questionOption);
}
function removeQuestionOption(removeBtn)
{
var removeBtn = $(removeBtn);
var tbody = removeBtn.parents('tbody');
if (tbody.find('tr').length > 1) {
removeBtn.parents('tr').remove();
} else {
alert(lang("at_least_one_option"));
}
}
function processFormErrors($form, errors)
{
$.each(errors, function (index, error)
{
var $input = $(':input[name=' + index + ']', $form);
if ($input.prop('type') === 'file') {
$('#input-' + $input.prop('name')).append('<div class="help-block error">' + error + '</div>')
.parent()
.addClass('has-error');
} else {
$input.after('<div class="help-block error">' + error + '</div>')
.parent()
.addClass('has-error');
}
});
var $submitButton = $form.find('input[type=submit]');
toggleSubmitDisabled($submitButton);
}
/**
*
* @param elm $submitButton
* @returns void
*/
function toggleSubmitDisabled($submitButton) {
if ($submitButton.hasClass('disabled')) {
$submitButton.attr('disabled', false)
.removeClass('disabled')
.val($submitButton.data('original-text'));
return;
}
$submitButton.data('original-text', $submitButton.val())
.attr('disabled', true)
.addClass('disabled')
.val('Working...');
}
/**
*
* @returns {{}}
*/
$.fn.serializeObject = function()
{
var o = {};
var a = this.serializeArray();
$.each(a, function() {
if (o[this.name] !== undefined) {
if (!o[this.name].push) {
o[this.name] = [o[this.name]];
}
o[this.name].push(this.value || '');
} else {
o[this.name] = this.value || '';
}
});
return o;
};
/**
* Replaces a parameter in a URL with a new parameter
*
* @param url
* @param paramName
* @param paramValue
* @returns {*}
*/
function replaceUrlParam(url, paramName, paramValue) {
var pattern = new RegExp('\\b(' + paramName + '=).*?(&|$)')
if (url.search(pattern) >= 0) {
return url.replace(pattern, '$1' + paramValue + '$2');
}
return url + (url.indexOf('?') > 0 ? '&' : '?') + paramName + '=' + paramValue
}
/**
* Shows users a message.
* Currently uses humane.js
*
* @param string message
* @returns void
*/
function showMessage(message) {
humane.log(message, {
timeoutAfterMove: 3000,
waitForMove: true
});
}
function showHelp(message) {
humane.log(message, {
timeout: 12000
});
}
function hideMessage() {
humane.remove();
}