diff --git a/apps/static/js/home/subscriptions.js b/apps/static/js/home/subscriptions.js index 41684cc..50b8e04 100644 --- a/apps/static/js/home/subscriptions.js +++ b/apps/static/js/home/subscriptions.js @@ -233,70 +233,93 @@ async function showEditSubModal(subId) { $("#subFormModal").modal("show"); } +function getValueFromField(elem) { + const tagName = elem.tagName.toLowerCase(); + const $elem = $(elem); + + if (tagName) { return $elem.val() } + + switch ($elem.attr("type")) { + case "checkbox": + return $elem.prop("checked"); + + default: + return $elem.val(); + } + +} + $("#subForm").on("submit", async function(event) { event.preventDefault(); - var id = $("#subId").val(); - name = $("#subName").val(); - url = $("#subUrl").val(); - guildId = getCurrentlyActiveServer().guild_id; - extraNotes = $("#subExtraNotes").val(); - subChannels = Object.fromEntries($("#subChannels option:selected").toArray().map(channel => [channel.value, $(channel).data("name")])); - subFilters = $("#subFilters option:selected").toArray().map(filter => parseInt(filter.value)); - subMutators = { - title: $("#subTitleMutators option:selected").toArray().map(mutator => parseInt(mutator.value)), - desc: $("#subDescMutators option:selected").toArray().map(mutator => parseInt(mutator.value)) - } - subEmbedColour = $("#subEmbedColour .colour-text").val().split("#")[1]; - articleFetchImage = $("#subArticleFetchImage").prop("checked") - publishedThreshold = $("#subPubThreshold").val(); - active = $("#subActive").prop("checked"); + let subId = $("#subId").val(); + let guildId = getCurrentlyActiveServer().guild_id; - var subPrimaryKey = await saveSubscription(id, name, url, guildId, extraNotes, subFilters, subMutators, subEmbedColour, articleFetchImage, publishedThreshold, active); + // TODO: move this into a function, so I can fix the active toggle switches which are broken due to this change - if (!subPrimaryKey) { - alert("prevented /subscriptions/false/subchannels"); - return + let formData = new FormData(); + formData.append("guild_id", guildId); + + // Populate formdata with [data-field] control values + $('#subForm [data-field], #subAdvancedModal [data-field]').each(function() { + const value = getValueFromField(this); + formData.append($(this).data("field"), value); + }); + + // Add title mutators to formdata + $("#subTitleMutators option:selected").toArray().map(mutator => parseInt(mutator.value)).forEach( + mutator => formData.append("article_title_mutators", mutator) + ); + + // Add description mutator to formdata + $("#subDescMutators option:selected").toArray().map(mutator => parseInt(mutator.value)).forEach( + mutator => formData.append("article_desc_mutators", mutator) + ); + + // Add Filters to formdata + $("#subFilters option:selected").toArray().forEach( + filter => formData.append("filters", parseInt(filter.value)) + ); + + // This field is constructed differently, so needs to be specifically added + formData.append("embed_colour", getColourInputVal("subEmbedColour", false)); + + subId = await saveSubscription(subId, formData); + + if (subId) { + showToast("success", "Subscription Saved", `Subscription ID ${subId}`); + } + else { + showToast("danger", "Error Saving Subscription", ""); + return; } - await deleteSubChannels(subPrimaryKey); - for (channelId in subChannels) { - await saveSubChannel(channelId, subChannels[channelId], subPrimaryKey); - } - - if (subPrimaryKey) { - showToast("success", "Subscription Saved", "Subscription ID: " + subPrimaryKey); - await loadSubscriptions(guildId); - } + await deleteSubChannels(subId); + $("#subChannels option:selected").each(async function() { + let $channel = $(this); + let channelFormData = new FormData(); + channelFormData.append("channel_id", $channel.val()); + channelFormData.append("channel_name", $channel.data("name")); + channelFormData.append("subscription", subId); + await newSubChannel(channelFormData); + }); + await loadSubscriptions(guildId); $("#subFormModal").modal("hide"); }); -async function saveSubscription(id, name, url, guildId, extraNotes, filters, mutators, embedColour, articleFetchImage, publishedTheshold, active, handleErrorMsg=true) { - var formData = new FormData(); - formData.append("name", name); - formData.append("url", url); - formData.append("guild_id", guildId); - formData.append("extra_notes", extraNotes); - filters.forEach(filter => formData.append("filters", filter)); - mutators.title.forEach(mutator => formData.append("article_title_mutators", mutator)); - mutators.desc.forEach(mutator => formData.append("article_desc_mutators", mutator)); - formData.append("embed_colour", embedColour); - formData.append("article_fetch_image", articleFetchImage); - formData.append("published_threshold", publishedTheshold); - formData.append("active", active); - - var response; +async function saveSubscription(id, formData, handleErrorMsg=true) { + let response try { - if (id === "-1") response = await newSubscription(formData); - else response = await editSubscription(id, formData); + response = id === "-1" ? await newSubscription(formData) : await editSubscription(id, formData); } catch (err) { - console.error(err) + console.error(err); - if (handleErrorMsg) + if (handleErrorMsg) { showToast("danger", "Subscription Error", err.responseText, 18000); + } return false; } @@ -304,12 +327,7 @@ async function saveSubscription(id, name, url, guildId, extraNotes, filters, mut return response.id; } -async function saveSubChannel(channelId, channelName, subscriptionId) { - var formData = new FormData(); - formData.append("channel_id", channelId); - formData.append("channel_name", channelName); - formData.append("subscription", subscriptionId); - +async function saveSubChannel(formData) { var response try { diff --git a/apps/templates/home/includes/submodal.html b/apps/templates/home/includes/submodal.html index c098f38..a0c2065 100644 --- a/apps/templates/home/includes/submodal.html +++ b/apps/templates/home/includes/submodal.html @@ -10,19 +10,19 @@