From 2d503ff215bc69198975e1b249c9297d2da4d94e Mon Sep 17 00:00:00 2001 From: William Woodson Date: Sat, 20 Feb 2016 22:10:53 -0600 Subject: [PATCH] Added Sending Profiles page and sending_profiles.js for interacting with /smtp/ API endpoint --- static/js/app/sending_profiles.js | 171 ++++++++++++++++++++++++++++++ templates/sending_profiles.html | 70 +++++------- 2 files changed, 200 insertions(+), 41 deletions(-) create mode 100644 static/js/app/sending_profiles.js diff --git a/static/js/app/sending_profiles.js b/static/js/app/sending_profiles.js new file mode 100644 index 00000000..da8a4ca6 --- /dev/null +++ b/static/js/app/sending_profiles.js @@ -0,0 +1,171 @@ +var profiles = [] + +// Save attempts to POST to /smtp/ +function save(idx) { + var profile = {} + profile.name = $("#name").val() + profile.interface_type = $("#interface_type").val() + profile.from_address = $("#from").val() + profile.host = $("#host").val() + profile.username = $("#username").val() + profile.password = $("#password").val() + profile.ignore_cert_errors = $("#ignore_cert_errors").prop("checked") + if (idx != -1) { + profile.id = profiles[idx].id + api.SMTPId.put(profile) + .success(function(data) { + successFlash("Profile edited successfully!") + load() + dismiss() + }) + } else { + // Submit the profile + api.SMTP.post(profile) + .success(function(data) { + successFlash("Profile added successfully!") + load() + dismiss() + }) + .error(function(data) { + modalError(data.responseJSON.message) + }) + } +} + +function dismiss() { + $("#modal\\.flashes").empty() + $("#name").val("") + $("#from").val("") + $("#host").val("") + $("#username").val("") + $("#password").val("") + $("#modal").modal('hide') +} + +function deleteProfile(idx) { + if (confirm("Delete " + profiles[idx].name + "?")) { + api.SMTPId.delete(profiles[idx].id) + .success(function(data) { + successFlash(data.message) + load() + }) + } +} + +function edit(idx) { + $("#modalSubmit").unbind('click').click(function() { + save(idx) + }) + var profile = {} + if (idx != -1) { + profile = profiles[idx] + $("#name").val(profile.name) + $("#interface_type").val(profile.interface_type) + $("#from").val(profile.from_address) + $("#host").val(profile.host) + $("#username").val(profile.username) + $("#password").val(profile.password) + $("#ignore_cert_errors").prop("checked", profile.ignore_cert_errors) + } +} + +function copy(idx) { + $("#modalSubmit").unbind('click').click(function() { + save(-1) + }) + var profile = {} + profile = profiles[idx] + $("#name").val("Copy of " + profile.name) + $("#interface_type").val(profile.interface_type) + $("#from").val(profile.from_address) + $("#host").val(profile.host) + $("#username").val(profile.username) + $("#password").val(profile.password) + $("#ignore_cert_errors").prop("checked", profile.ignore_cert_errors) +} + +function load() { + $("#profileTable").hide() + $("#emptyMessage").hide() + $("#loading").show() + api.SMTP.get() + .success(function(ss) { + profiles = ss + $("#loading").hide() + if (profiles.length > 0) { + $("#profileTable").show() + profileTable = $("#profileTable").DataTable({ + destroy: true, + columnDefs: [{ + orderable: false, + targets: "no-sort" + }] + }); + profileTable.clear() + $.each(profiles, function(i, profile) { + profileTable.row.add([ + profile.name, + profile.interface_type, + moment(profile.modified_date).format('MMMM Do YYYY, h:mm:ss a'), + "
\ + \ +
" + ]).draw() + }) + $('[data-toggle="tooltip"]').tooltip() + } else { + $("#emptyMessage").show() + } + }) + .error(function() { + $("#loading").hide() + errorFlash("Error fetching profiles") + }) +} + +$(document).ready(function() { + // Setup multiple modals + // Code based on http://miles-by-motorcycle.com/static/bootstrap-modal/index.html + $('.modal').on('hidden.bs.modal', function(event) { + $(this).removeClass('fv-modal-stack'); + $('body').data('fv_open_modals', $('body').data('fv_open_modals') - 1); + }); + $('.modal').on('shown.bs.modal', function(event) { + // Keep track of the number of open modals + if (typeof($('body').data('fv_open_modals')) == 'undefined') { + $('body').data('fv_open_modals', 0); + } + // if the z-index of this modal has been set, ignore. + if ($(this).hasClass('fv-modal-stack')) { + return; + } + $(this).addClass('fv-modal-stack'); + // Increment the number of open modals + $('body').data('fv_open_modals', $('body').data('fv_open_modals') + 1); + // Setup the appropriate z-index + $(this).css('z-index', 1040 + (10 * $('body').data('fv_open_modals'))); + $('.modal-backdrop').not('.fv-modal-stack').css('z-index', 1039 + (10 * $('body').data('fv_open_modals'))); + $('.modal-backdrop').not('fv-modal-stack').addClass('fv-modal-stack'); + }); + $.fn.modal.Constructor.prototype.enforceFocus = function() { + $(document) + .off('focusin.bs.modal') // guard against infinite focus loop + .on('focusin.bs.modal', $.proxy(function(e) { + if ( + this.$element[0] !== e.target && !this.$element.has(e.target).length + // CKEditor compatibility fix start. + && !$(e.target).closest('.cke_dialog, .cke').length + // CKEditor compatibility fix end. + ) { + this.$element.trigger('focus'); + } + }, this)); + }; + load() +}) diff --git a/templates/sending_profiles.html b/templates/sending_profiles.html index d2ef4819..b564a308 100644 --- a/templates/sending_profiles.html +++ b/templates/sending_profiles.html @@ -32,7 +32,7 @@
- +
 
@@ -40,14 +40,15 @@
- + + @@ -58,60 +59,48 @@ -