436 lines
14 KiB
JavaScript
436 lines
14 KiB
JavaScript
/**
|
|
* Organisations widget. Sets up dropdowns, modals, etc for a table of organisations.
|
|
*/
|
|
|
|
/**
|
|
* Set up the form in a modal after being successfully attached to the body.
|
|
*/
|
|
function attachOrganisationForm(options) {
|
|
$("body").on('renderSuccess.ufModal', function(data) {
|
|
var modal = $(this).ufModal('getModal');
|
|
var form = modal.find('.js-form');
|
|
|
|
/**
|
|
* Set up modal widgets
|
|
*/
|
|
// Set up any widgets inside the modal
|
|
form.find(".js-select2").select2({
|
|
width: '100%'
|
|
});
|
|
|
|
// Auto-generate slug
|
|
form.find('input[name=name]').on('input change', function() {
|
|
var manualSlug = form.find('#form-organisation-slug-override').prop('checked');
|
|
if (!manualSlug) {
|
|
var slug = getSlug($(this).val());
|
|
form.find('input[name=slug]').val(slug);
|
|
}
|
|
});
|
|
|
|
form.find('#form-organisation-slug-override').on('change', function() {
|
|
if ($(this).prop('checked')) {
|
|
form.find('input[name=slug]').prop('readonly', false);
|
|
} else {
|
|
form.find('input[name=slug]').prop('readonly', true);
|
|
form.find('input[name=name]').trigger('change');
|
|
}
|
|
});
|
|
|
|
// Set up the form for submission
|
|
form.ufForm({
|
|
validator: page.validators
|
|
}).on("submitSuccess.ufForm", function(e, data) {
|
|
// Reload page on success
|
|
if (data.redirect && options.allow_redirect) {
|
|
window.location = data.redirect;
|
|
} else {
|
|
window.location.reload();
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Approve/Deny organisation registration
|
|
*/
|
|
function approveOrganisationRegistration(slug, approve, options) {
|
|
var data = {};
|
|
data[site.csrf.keys.name] = site.csrf.name;
|
|
data[site.csrf.keys.value] = site.csrf.value;
|
|
|
|
var url = site.uri.public + '/api/organisations/o/' + slug + '/registration/' + (approve ? 'approve' : 'deny');
|
|
var debugAjax = (typeof site !== "undefined") && site.debug.ajax;
|
|
|
|
return $.ajax({
|
|
type: "PUT",
|
|
url: url,
|
|
data: data,
|
|
dataType: debugAjax ? 'html' : 'json',
|
|
}).fail(function(jqXHR) {
|
|
// Error messages
|
|
if (debugAjax && jqXHR.responseText) {
|
|
document.write(jqXHR.responseText);
|
|
document.close();
|
|
} else {
|
|
console.log("Error (" + jqXHR.status + "): " + jqXHR.responseText);
|
|
|
|
// Display errors on failure
|
|
// TODO: ufAlerts widget should have a 'destroy' method
|
|
if (!$("#alerts-page").data('ufAlerts')) {
|
|
$("#alerts-page").ufAlerts();
|
|
} else {
|
|
$("#alerts-page").ufAlerts('clear');
|
|
}
|
|
|
|
$("#alerts-page").ufAlerts('fetch').ufAlerts('render');
|
|
}
|
|
|
|
return jqXHR;
|
|
}).done(function(response) {
|
|
if (!approve && options.delete_redirect) window.location.href = options.delete_redirect;
|
|
else window.location.reload();
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Restore a deleted organisation
|
|
*/
|
|
function restoreOrganisation(slug, options) {
|
|
var data = {};
|
|
data[site.csrf.keys.name] = site.csrf.name;
|
|
data[site.csrf.keys.value] = site.csrf.value;
|
|
|
|
var url = site.uri.public + '/api/organisations/o/' + slug + '/restore';
|
|
var debugAjax = (typeof site !== "undefined") && site.debug.ajax;
|
|
|
|
return $.ajax({
|
|
type: "PUT",
|
|
url: url,
|
|
data: data,
|
|
dataType: debugAjax ? 'html' : 'json',
|
|
}).fail(function(jqXHR) {
|
|
// Error messages
|
|
if (debugAjax && jqXHR.responseText) {
|
|
document.write(jqXHR.responseText);
|
|
document.close();
|
|
} else {
|
|
console.log("Error (" + jqXHR.status + "): " + jqXHR.responseText);
|
|
|
|
// Display errors on failure
|
|
// TODO: ufAlerts widget should have a 'destroy' method
|
|
if (!$("#alerts-page").data('ufAlerts')) {
|
|
$("#alerts-page").ufAlerts();
|
|
} else {
|
|
$("#alerts-page").ufAlerts('clear');
|
|
}
|
|
|
|
$("#alerts-page").ufAlerts('fetch').ufAlerts('render');
|
|
}
|
|
|
|
return jqXHR;
|
|
}).done(function(response) {
|
|
window.location.reload();
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Link organisation action buttons, for example in a table or on a specific organisation's page.
|
|
* @param {module:jQuery} el jQuery wrapped element to target.
|
|
* @param {{delete_redirect: string}} options Options used to modify behaviour of button actions.
|
|
*/
|
|
function bindOrganisationButtons(el, options) {
|
|
if (!options) options = {};
|
|
|
|
/**
|
|
* Link row buttons after table is loaded.
|
|
*/
|
|
|
|
/**
|
|
* Buttons that launch a modal dialog
|
|
*/
|
|
// Edit organisation details button
|
|
el.find('.js-organisation-edit').click(function(e) {
|
|
e.preventDefault();
|
|
|
|
$("body").ufModal({
|
|
sourceUrl: site.uri.public + "/modals/organisations/edit",
|
|
ajaxParams: {
|
|
slug: $(this).data('slug')
|
|
},
|
|
msgTarget: $("#alerts-page")
|
|
});
|
|
|
|
attachOrganisationForm(options);
|
|
});
|
|
|
|
// Manage organisation merge button
|
|
el.find('.js-organisation-merge').click(function(e) {
|
|
e.preventDefault();
|
|
|
|
var organisation_slug = $(this).data('slug');
|
|
|
|
$("body").ufModal({
|
|
sourceUrl: site.uri.public + "/modals/organisations/merge",
|
|
ajaxParams: {
|
|
slug: organisation_slug
|
|
},
|
|
msgTarget: $("#alerts-page")
|
|
});
|
|
|
|
$("body").on('renderSuccess.ufModal', function(data) {
|
|
var modal = $(this).ufModal('getModal');
|
|
var form = modal.find('.js-form');
|
|
|
|
var dropdownTemplate = modal.find('#organisation-select-option').html();
|
|
|
|
// Set up select2 dropdown
|
|
var dropdownControl = modal.find('.js-select-new');
|
|
_dropdownTemplateCompiled = Handlebars.compile(dropdownTemplate);
|
|
var options = {
|
|
ajax: {
|
|
url: site.uri.public + '/api/organisations',
|
|
processResults: function (data) {
|
|
var items = data.rows.filter((i) => i.slug != organisation_slug);
|
|
return {
|
|
results: items.map((i) => { return {
|
|
id: i.slug,
|
|
text: i.name,
|
|
name: i.name,
|
|
description: i.description,
|
|
slug: i.slug
|
|
}})
|
|
};
|
|
}
|
|
},
|
|
placeholder: "Select an organisation to merge with",
|
|
selectOnClose: true,
|
|
templateResult: $.proxy(function(item) {
|
|
// Must wrap this in a jQuery selector to render as HTML
|
|
return $(_dropdownTemplateCompiled(item));
|
|
}, this)
|
|
};
|
|
dropdownControl.select2(options);
|
|
|
|
// Set up form for submission
|
|
form.ufForm()
|
|
.on("submitSuccess.ufForm", function() {
|
|
// Reload page on success
|
|
window.location.reload();
|
|
});
|
|
});
|
|
});
|
|
|
|
// Join organisation button
|
|
el.find('.js-organisation-join').click(function(e) {
|
|
e.preventDefault();
|
|
|
|
$("body").ufModal({
|
|
sourceUrl: site.uri.public + "/modals/organisations/o/" + $(this).data('slug') + "/members/confirm-join",
|
|
ajaxParams: {
|
|
slug: $(this).data('slug')
|
|
},
|
|
msgTarget: $("#alerts-page")
|
|
});
|
|
|
|
$("body").on('renderSuccess.ufModal', function() {
|
|
var modal = $(this).ufModal('getModal');
|
|
var form = modal.find('.js-form');
|
|
|
|
form.ufForm()
|
|
.on("submitSuccess.ufForm", function() {
|
|
window.location.reload();
|
|
});
|
|
});
|
|
});
|
|
|
|
// Cancel a registration request
|
|
el.find('.js-organisation-cancelJoin').click(function(e) {
|
|
e.preventDefault();
|
|
|
|
$("body").ufModal({
|
|
sourceUrl: site.uri.public + "/modals/organisations/o/" + $(this).data('slug') + "/members/confirm-cancel",
|
|
ajaxParams: {
|
|
slug: $(this).data('slug')
|
|
},
|
|
msgTarget: $("#alerts-page")
|
|
});
|
|
|
|
$("body").on('renderSuccess.ufModal', function() {
|
|
var modal = $(this).ufModal('getModal');
|
|
var form = modal.find('.js-form');
|
|
|
|
form.ufForm()
|
|
.on("submitSuccess.ufForm", function() {
|
|
// Navigate or reload page on success
|
|
if (options.delete_redirect) window.location.href = options.delete_redirect;
|
|
else window.location.reload();
|
|
});
|
|
});
|
|
});
|
|
|
|
|
|
// Leave organisation button
|
|
el.find('.js-organisation-leave').click(function(e) {
|
|
e.preventDefault();
|
|
|
|
$("body").ufModal({
|
|
sourceUrl: site.uri.public + "/modals/organisations/o/" + $(this).data('slug') + "/members/confirm-leave",
|
|
ajaxParams: {
|
|
slug: $(this).data('slug')
|
|
},
|
|
msgTarget: $("#alerts-page")
|
|
});
|
|
|
|
$("body").on('renderSuccess.ufModal', function() {
|
|
var modal = $(this).ufModal('getModal');
|
|
var form = modal.find('.js-form');
|
|
|
|
form.ufForm()
|
|
.on("submitSuccess.ufForm", function() {
|
|
// Navigate or reload page on success
|
|
if (options.leave_redirect) window.location.href = options.leave_redirect;
|
|
else window.location.reload();
|
|
});
|
|
});
|
|
});
|
|
|
|
// Cancel a registration request
|
|
el.find('.js-organisation-cancelRegistration').click(function(e) {
|
|
e.preventDefault();
|
|
|
|
$("body").ufModal({
|
|
sourceUrl: site.uri.public + "/modals/organisations/registration/confirm-cancel",
|
|
ajaxParams: {
|
|
slug: $(this).data('slug')
|
|
},
|
|
msgTarget: $("#alerts-page")
|
|
});
|
|
|
|
$("body").on('renderSuccess.ufModal', function() {
|
|
var modal = $(this).ufModal('getModal');
|
|
var form = modal.find('.js-form');
|
|
|
|
form.ufForm()
|
|
.on("submitSuccess.ufForm", function() {
|
|
// Navigate or reload page on success
|
|
if (options.delete_redirect) window.location.href = options.delete_redirect;
|
|
else window.location.reload();
|
|
});
|
|
});
|
|
});
|
|
|
|
// Cancel a registration request
|
|
el.find('.js-organisation-approveRegistration').click(function(e) {
|
|
e.preventDefault();
|
|
|
|
approveOrganisationRegistration($(this).data('slug'), true, options);
|
|
});
|
|
|
|
// Cancel a registration request
|
|
el.find('.js-organisation-denyRegistration').click(function(e) {
|
|
e.preventDefault();
|
|
|
|
approveOrganisationRegistration($(this).data('slug'), false, options);
|
|
});
|
|
|
|
// Delete organisation button
|
|
el.find('.js-organisation-delete').click(function(e) {
|
|
e.preventDefault();
|
|
|
|
$("body").ufModal({
|
|
sourceUrl: site.uri.public + "/modals/organisations/confirm-delete",
|
|
ajaxParams: {
|
|
slug: $(this).data('slug')
|
|
},
|
|
msgTarget: $("#alerts-page")
|
|
});
|
|
|
|
$("body").on('renderSuccess.ufModal', function() {
|
|
var modal = $(this).ufModal('getModal');
|
|
var form = modal.find('.js-form');
|
|
|
|
form.ufForm()
|
|
.on("submitSuccess.ufForm", function() {
|
|
// Navigate or reload page on success
|
|
if (options.delete_redirect) window.location.href = options.delete_redirect;
|
|
else window.location.reload();
|
|
});
|
|
});
|
|
});
|
|
|
|
|
|
// View the deleted organisations page
|
|
el.find('.js-organisation-viewDeleted').click(function(e) {
|
|
e.preventDefault();
|
|
|
|
window.location.href = site.uri.public + '/organisations/deleted';
|
|
});
|
|
|
|
// Permenetly delete organisation button
|
|
el.find('.js-organisation-permenentDelete').click(function(e) {
|
|
e.preventDefault();
|
|
|
|
$("body").ufModal({
|
|
sourceUrl: site.uri.public + "/modals/organisations/confirm-permenent-delete",
|
|
ajaxParams: {
|
|
slug: $(this).data('slug')
|
|
},
|
|
msgTarget: $("#alerts-page")
|
|
});
|
|
|
|
$("body").on('renderSuccess.ufModal', function() {
|
|
var modal = $(this).ufModal('getModal');
|
|
var form = modal.find('.js-form');
|
|
|
|
form.ufForm()
|
|
.on("submitSuccess.ufForm", function() {
|
|
// Navigate or reload page on success
|
|
if (options.delete_redirect) window.location.href = options.delete_redirect;
|
|
else window.location.reload();
|
|
});
|
|
});
|
|
});
|
|
|
|
// Permenetly delete organisation button
|
|
el.find('.js-organisation-restore').click(function(e) {
|
|
e.preventDefault();
|
|
|
|
restoreOrganisation($(this).data('slug'), options);
|
|
});
|
|
|
|
// Return from the deleted organisations page
|
|
el.find('.js-organisation-return').click(function(e) {
|
|
e.preventDefault();
|
|
|
|
window.location.href = site.uri.public + '/organisations';
|
|
});
|
|
}
|
|
|
|
function bindOrganisationCreationButton(el) {
|
|
// Link create button
|
|
el.find('.js-organisation-create').click(function(e) {
|
|
e.preventDefault();
|
|
|
|
$("body").ufModal({
|
|
sourceUrl: site.uri.public + "/modals/organisations/create",
|
|
msgTarget: $("#alerts-page")
|
|
});
|
|
|
|
attachOrganisationForm();
|
|
});
|
|
};
|
|
|
|
function bindOrganisationRegistrationButton(el) {
|
|
// Link create button
|
|
el.find('.js-organisation-register').click(function(e) {
|
|
e.preventDefault();
|
|
|
|
$("body").ufModal({
|
|
sourceUrl: site.uri.public + "/modals/organisations/register",
|
|
msgTarget: $("#alerts-page")
|
|
});
|
|
|
|
attachOrganisationForm();
|
|
});
|
|
};
|