From 26716916c185fb9652aade6a907e33fb6fcdc714 Mon Sep 17 00:00:00 2001 From: NovaFox161 Date: Mon, 28 May 2018 17:15:28 -0500 Subject: [PATCH] Add embed page for calendars. No more linking out to google!!!! --- .../calendar/CalendarMessageFormatter.java | 8 +- .../api/network/google/Authorization.java | 2 +- .../discal/api/object/web/WebCalendar.java | 4 +- .../calendar/CalendarMessageFormatter.java | 8 +- .../bot/module/command/TimeCommand.java | 2 +- .../discal/web/utils/SparkUtils.java | 34 +- .../web/public/pages/embed/calendar.html | 14 +- .../web/public/scripts/dashboard/calendar.js | 705 +++++++++--------- .../web/public/scripts/embed/calendar.js | 628 ++++++++-------- 9 files changed, 742 insertions(+), 663 deletions(-) diff --git a/API/src/main/java/com/cloudcraftgaming/discal/api/message/calendar/CalendarMessageFormatter.java b/API/src/main/java/com/cloudcraftgaming/discal/api/message/calendar/CalendarMessageFormatter.java index 87841590..56ccd027 100644 --- a/API/src/main/java/com/cloudcraftgaming/discal/api/message/calendar/CalendarMessageFormatter.java +++ b/API/src/main/java/com/cloudcraftgaming/discal/api/message/calendar/CalendarMessageFormatter.java @@ -16,11 +16,17 @@ import java.net.URI; * For Project: DisCal-Discord-Bot */ public class CalendarMessageFormatter { + @Deprecated public static String getCalendarLink(String calId) { URI callURI = URI.create(calId); return "https://calendar.google.com/calendar/embed?src=" + callURI; } + //TODO: Add support for multiple calendars. + public static String getCalendarLink(long guildId) { + return "https://www.discalbot.com/embed/calendar/" + guildId; + } + public static EmbedObject getCalendarLinkEmbed(Calendar cal, GuildSettings settings) { EmbedBuilder em = new EmbedBuilder(); em.withAuthorIcon(DisCalAPI.getAPI().getClient().getGuildByID(266063520112574464L).getIconURL()); @@ -33,7 +39,7 @@ public class CalendarMessageFormatter { //Some error, desc probably never set, just ignore no need to log. } em.appendField(MessageManager.getMessage("Embed.Calendar.Link.TimeZone", settings), cal.getTimeZone(), false); - em.withUrl(CalendarMessageFormatter.getCalendarLink(cal.getId())); + em.withUrl(CalendarMessageFormatter.getCalendarLink(settings.getGuildID())); em.withFooterText(MessageManager.getMessage("Embed.Calendar.Link.CalendarId", "%id%", cal.getId(), settings)); em.withColor(56, 138, 237); diff --git a/API/src/main/java/com/cloudcraftgaming/discal/api/network/google/Authorization.java b/API/src/main/java/com/cloudcraftgaming/discal/api/network/google/Authorization.java index 08be7f9e..e969c65c 100644 --- a/API/src/main/java/com/cloudcraftgaming/discal/api/network/google/Authorization.java +++ b/API/src/main/java/com/cloudcraftgaming/discal/api/network/google/Authorization.java @@ -197,7 +197,7 @@ public class Authorization { em.appendField(MessageManager.getMessage("Embed.AddCalendar.List.TimeZone", settings), i.getTimeZone(), false); em.appendField(MessageManager.getMessage("Embed.AddCalendar.List.ID", settings), i.getId(), false); - em.withUrl(CalendarMessageFormatter.getCalendarLink(i.getId())); + em.withUrl(CalendarMessageFormatter.getCalendarLink(settings.getGuildID())); em.withColor(56, 138, 237); Message.sendDirectMessage(em.build(), poll.getUser()); } diff --git a/API/src/main/java/com/cloudcraftgaming/discal/api/object/web/WebCalendar.java b/API/src/main/java/com/cloudcraftgaming/discal/api/object/web/WebCalendar.java index 71c9b087..2c6a0371 100644 --- a/API/src/main/java/com/cloudcraftgaming/discal/api/object/web/WebCalendar.java +++ b/API/src/main/java/com/cloudcraftgaming/discal/api/object/web/WebCalendar.java @@ -6,8 +6,6 @@ import com.cloudcraftgaming.discal.api.object.calendar.CalendarData; import com.cloudcraftgaming.discal.logger.Logger; import com.google.api.services.calendar.model.Calendar; -import java.net.URI; - /** * Created by Nova Fox on 1/7/18. * Website: www.cloudcraftgaming.com @@ -93,7 +91,7 @@ public class WebCalendar { } else { id = cd.getCalendarId(); address = cd.getCalendarAddress(); - link = "https://calendar.google.com/calendar/embed?src=" + URI.create(cd.getCalendarAddress()); + link = "https://www.discalbot.com/embed/calendar/" + gs.getGuildID(); external = cd.isExternal(); try { if (cd.isExternal()) { diff --git a/Bot/src/main/java/com/cloudcraftgaming/discal/bot/internal/calendar/calendar/CalendarMessageFormatter.java b/Bot/src/main/java/com/cloudcraftgaming/discal/bot/internal/calendar/calendar/CalendarMessageFormatter.java index 2fcf0fd2..188c925f 100644 --- a/Bot/src/main/java/com/cloudcraftgaming/discal/bot/internal/calendar/calendar/CalendarMessageFormatter.java +++ b/Bot/src/main/java/com/cloudcraftgaming/discal/bot/internal/calendar/calendar/CalendarMessageFormatter.java @@ -16,11 +16,17 @@ import java.net.URI; * For Project: DisCal */ public class CalendarMessageFormatter { + @Deprecated public static String getCalendarLink(String calId) { URI callURI = URI.create(calId); return "https://calendar.google.com/calendar/embed?src=" + callURI; } + //TODO: Add support for multiple calendars. + public static String getCalendarLink(long guildId) { + return "https://www.discalbot.com/embed/calendar/" + guildId; + } + public static EmbedObject getCalendarLinkEmbed(Calendar cal, GuildSettings settings) { EmbedBuilder em = new EmbedBuilder(); em.withAuthorIcon(DisCalAPI.getAPI().getClient().getGuildByID(266063520112574464L).getIconURL()); @@ -33,7 +39,7 @@ public class CalendarMessageFormatter { //Some error, desc probably never set, just ignore no need to log. } em.appendField(MessageManager.getMessage("Embed.Calendar.Link.TimeZone", settings), cal.getTimeZone(), false); - em.withUrl(CalendarMessageFormatter.getCalendarLink(cal.getId())); + em.withUrl(CalendarMessageFormatter.getCalendarLink(settings.getGuildID())); em.withFooterText(MessageManager.getMessage("Embed.Calendar.Link.CalendarId", "%id%", cal.getId(), settings)); em.withColor(56, 138, 237); diff --git a/Bot/src/main/java/com/cloudcraftgaming/discal/bot/module/command/TimeCommand.java b/Bot/src/main/java/com/cloudcraftgaming/discal/bot/module/command/TimeCommand.java index af7e488d..f9e4cfeb 100644 --- a/Bot/src/main/java/com/cloudcraftgaming/discal/bot/module/command/TimeCommand.java +++ b/Bot/src/main/java/com/cloudcraftgaming/discal/bot/module/command/TimeCommand.java @@ -105,7 +105,7 @@ public class TimeCommand implements ICommand { em.appendField(MessageManager.getMessage("Embed.Time.TimeZone", settings), cal.getTimeZone(), false); em.withFooterText(MessageManager.getMessage("Embed.Time.Footer", settings)); - em.withUrl(CalendarMessageFormatter.getCalendarLink(cal.getId())); + em.withUrl(CalendarMessageFormatter.getCalendarLink(settings.getGuildID())); em.withColor(56, 138, 237); Message.sendMessage(em.build(), event); } diff --git a/Website/src/main/java/com/cloudcraftgaming/discal/web/utils/SparkUtils.java b/Website/src/main/java/com/cloudcraftgaming/discal/web/utils/SparkUtils.java index 1b45cde9..26b56569 100644 --- a/Website/src/main/java/com/cloudcraftgaming/discal/web/utils/SparkUtils.java +++ b/Website/src/main/java/com/cloudcraftgaming/discal/web/utils/SparkUtils.java @@ -44,19 +44,25 @@ public class SparkUtils { //Requires "Authorization Header if (request.headers().contains("Authorization")) { String key = request.headers("Authorization"); - UserAPIAccount acc = DatabaseManager.getManager().getAPIAccount(key); - if (acc != null) { - if (acc.isBlocked()) { - Logger.getLogger().api("Attempted to use blocked API Key: " + acc.getAPIKey(), request.ip()); - halt(401, "Unauthorized"); - } else { - //Everything checks out! - acc.setUses(acc.getUses() + 1); - DatabaseManager.getManager().updateAPIAccount(acc); - } + + //TODO: Handle this shit better but whatever + if (key.equals("EMBEDDED")) { + Logger.getLogger().api("User using embed", request.ip(), request.host(), request.pathInfo()); } else { - Logger.getLogger().api("Attempted to use invalid API Key: " + key, request.ip()); - halt(401, "Unauthorized"); + UserAPIAccount acc = DatabaseManager.getManager().getAPIAccount(key); + if (acc != null) { + if (acc.isBlocked()) { + Logger.getLogger().api("Attempted to use blocked API Key: " + acc.getAPIKey(), request.ip()); + halt(401, "Unauthorized"); + } else { + //Everything checks out! + acc.setUses(acc.getUses() + 1); + DatabaseManager.getManager().updateAPIAccount(acc); + } + } else { + Logger.getLogger().api("Attempted to use invalid API Key: " + key, request.ip()); + halt(401, "Unauthorized"); + } } } else { Logger.getLogger().api("Attempted to use API without authorization header", request.ip()); @@ -64,11 +70,9 @@ public class SparkUtils { } } //Only accept json because its easier to parse and handle. - /* if (!request.contentType().equalsIgnoreCase("application/json")) { halt(400, "Bad Request"); } - */ }); //API endpoints @@ -152,7 +156,7 @@ public class SparkUtils { get("/dashboard/guild/rsvp", (rq, rs) -> new ModelAndView(DiscordAccountHandler.getHandler().getAccount(rq.session().id()), "pages/dashboard/components/rsvp"), new ThymeleafTemplateEngine()); //Embed pages - //get("/embed/calendar/:guild", (rq, rs) -> new ModelAndView(DiscordAccountHandler.getHandler().getAccountForGuildEmbed(rq.session().id(), rq.params(":guild")), "pages/embed/calendar"), new ThymeleafTemplateEngine()); + get("/embed/calendar/:guild", (rq, rs) -> new ModelAndView(DiscordAccountHandler.getHandler().getAccountForGuildEmbed(rq.session().id(), rq.params(":guild")), "pages/embed/calendar"), new ThymeleafTemplateEngine()); //Various other doc pages get("/docs/event/colors", (rq, rs) -> new ModelAndView(DiscordAccountHandler.getHandler().getAccount(rq.session().id()), "pages/docs/events/event-colors"), new ThymeleafTemplateEngine()); diff --git a/Website/src/main/resources/web/public/pages/embed/calendar.html b/Website/src/main/resources/web/public/pages/embed/calendar.html index e77f8d23..3d00ecf2 100644 --- a/Website/src/main/resources/web/public/pages/embed/calendar.html +++ b/Website/src/main/resources/web/public/pages/embed/calendar.html @@ -31,7 +31,7 @@ integrity="sha256-lnJeulOa3e5IO2EzHr8jKJ3CbT80MBwkS5a+n2ooIr4=" crossorigin="anonymous"> - +

DISCAL

About @@ -137,8 +137,14 @@ -

All Dates and - Times are displayed in your local timezone!

+

All Dates and Times are + displayed in your local timezone!

+
+
+ + +


@@ -147,6 +153,8 @@
+ +
diff --git a/Website/src/main/resources/web/public/scripts/dashboard/calendar.js b/Website/src/main/resources/web/public/scripts/dashboard/calendar.js index 487ca68c..372bc9e1 100644 --- a/Website/src/main/resources/web/public/scripts/dashboard/calendar.js +++ b/Website/src/main/resources/web/public/scripts/dashboard/calendar.js @@ -165,26 +165,36 @@ function getEventsForMonth() { "StartEpoch": ds.getTime().toString() }; - var q = $.post("/api/v1/events/list/month", JSON.stringify(bodyRaw), function (response) { - var obj = JSON.parse(response); + $.ajax({ + url: "/api/v1/events/list/month", + headers: { + "Content-Type": "application/json" + }, + method: "POST", + dataType: "json", + data: JSON.stringify(bodyRaw), + success: function (json) { + var obj = json; - //Display the event counts on the calendar... - for (var i = 0; i < obj.events.length; i++) { - var d = new Date(obj.events[i].epochStart); + //Display the event counts on the calendar... + for (var i = 0; i < obj.events.length; i++) { + var d = new Date(obj.events[i].epochStart); - var e = document.getElementById(calendar.displays[d.getDate()]); + var e = document.getElementById(calendar.displays[d.getDate()]); - if (e.innerHTML.indexOf("[") === -1) { - e.innerHTML = d.getDate() + "[1]"; - } else { - e.innerHTML = d.getDate().toString() + "[" + (parseInt(e.innerHTML.split("[")[1][0]) + 1).toString() + "]"; + if (e.innerHTML.indexOf("[") === -1) { + e.innerHTML = d.getDate() + "[1]"; + } else { + e.innerHTML = d.getDate().toString() + "[" + (parseInt(e.innerHTML.split("[")[1][0]) + 1).toString() + "]"; + } } - } + }, + error: function (jqXHR, textStatus, errorThrown) { + var obj = JSON.parse(jqXHR.responseText); - }) - .fail(function () { - showSnackbar("Our hippos failed to find your events!"); - }, "json"); + showSnackbar("[ERROR] " + obj.reason); + } + }); } function getEventsForSelectedDate() { @@ -197,342 +207,353 @@ function getEventsForSelectedDate() { "StartEpoch": ds.getTime().toString() }; - var q = $.post("/api/v1/events/list/date", JSON.stringify(bodyRaw), function (response) { - var obj = JSON.parse(response); + $.ajax({ + url: "/api/v1/events/list/date", + headers: { + "Content-Type": "application/json" + }, + method: "POST", + dataType: "json", + data: JSON.stringify(bodyRaw), + success: function (json) { + var obj = json; - //Display the selected day's event details for editing and such. - var container = document.getElementById("event-container"); + //Display the selected day's event details for editing and such. + var container = document.getElementById("event-container"); - while (container.firstChild) { - container.removeChild(container.firstChild); - } - - for (var i = 0; i < obj.count; i++) { - var event = obj.events[i]; - - //Create Edit Button - var editButton = document.createElement("button"); - editButton.type = "button"; - editButton.setAttribute("data-toggle", "modal"); - editButton.setAttribute("data-target", "#modal-" + event.id); - editButton.innerHTML = "Edit"; - container.appendChild(editButton); - - //Create Delete button - var deleteButton = document.createElement("button"); - deleteButton.type = "button"; - deleteButton.innerHTML = "Delete"; - deleteButton.className = "danger"; - deleteButton.id = "delete-" + event.id; - deleteButton.onclick = function (ev) { - deleteEvent(this.id) - }; - container.appendChild(deleteButton); - - container.appendChild(document.createElement("br")); - container.appendChild(document.createElement("br")); - - //Create modal container - var modalContainer = document.createElement("div"); - modalContainer.className = "modal fade"; - modalContainer.id = "modal-" + event.id; - modalContainer.role = "dialog"; - container.appendChild(modalContainer); - - //Create modal-dialog - var modalDia = document.createElement("div"); - modalDia.className = "modal-dialog"; - modalContainer.appendChild(modalDia); - - //Create Modal Content - var modalCon = document.createElement("div"); - modalCon.className = "modal-content"; - modalDia.appendChild(modalCon); - - //Create modal header and title - var modalHeader = document.createElement("div"); - modalHeader.className = "modal-header"; - modalCon.appendChild(modalHeader); - var modalTitle = document.createElement("h4"); - modalTitle.className = "modal-title"; - modalTitle.innerHTML = "Editing Event"; - modalHeader.appendChild(modalTitle); - - //Create Modal Body - var modalBody = document.createElement("div"); - modalBody.className = "modal-body"; - modalCon.appendChild(modalBody); - - var form = document.createElement("form"); - modalBody.appendChild(form); - - //Summary - var summaryLabel = document.createElement("label"); - summaryLabel.innerHTML = "Summary"; - summaryLabel.appendChild(document.createElement("br")); - form.appendChild(summaryLabel); - var summary = document.createElement("input"); - summary.name = "summary"; - summary.type = "text"; - summary.value = event.summary; - summary.id = "editSummary-" + event.id; - summaryLabel.appendChild(summary); - form.appendChild(document.createElement("br")); - form.appendChild(document.createElement("br")); - - //Description - var descriptionLabel = document.createElement("label"); - descriptionLabel.innerHTML = "Description"; - descriptionLabel.appendChild(document.createElement("br")); - form.appendChild(descriptionLabel); - var description = document.createElement("input"); - description.name = "edit-description"; - description.type = "text"; - description.value = event.description; - description.id = "editDescription-" + event.id; - descriptionLabel.appendChild(description); - form.appendChild(document.createElement("br")); - form.appendChild(document.createElement("br")); - - //Start date and time - var sd = new Date(event.epochStart); - var startLabel = document.createElement("label"); - startLabel.innerHTML = "Start Date and Time"; - startLabel.appendChild(document.createElement("br")); - form.appendChild(startLabel); - var startDate = document.createElement("input"); - startDate.name = "start-date"; - startDate.type = "date"; - startDate.valueAsDate = sd; - startDate.required = true; - startDate.id = "editStartDate-" + event.id; - startLabel.appendChild(startDate); - var startTime = document.createElement("input"); - startTime.name = "start-time"; - startTime.type = "time"; - startTime.value = (sd.getHours() < 10 ? "0" : "") + sd.getHours() + ":" + (sd.getMinutes() < 10 ? "0" : "") + sd.getMinutes(); - startTime.required = true; - startTime.id = "editStartTime-" + event.id; - startLabel.appendChild(startTime); - form.appendChild(document.createElement("br")); - form.appendChild(document.createElement("br")); - - //End date and time - var ed = new Date(event.epochEnd); - var endLabel = document.createElement("label"); - endLabel.innerHTML = "End Date and Time"; - endLabel.appendChild(document.createElement("br")); - form.appendChild(endLabel); - var endDate = document.createElement("input"); - endDate.name = "end-date"; - endDate.type = "date"; - endDate.valueAsDate = ed; - endDate.required = true; - endDate.id = "editEndDate-" + event.id; - endLabel.appendChild(endDate); - var endTime = document.createElement("input"); - endTime.name = "end-time"; - endTime.type = "time"; - endTime.value = (ed.getHours() < 10 ? "0" : "") + ed.getHours() + ":" + (ed.getMinutes() < 10 ? "0" : "") + ed.getMinutes(); - endTime.required = true; - endTime.id = "editEndTime-" + event.id; - endLabel.appendChild(endTime); - form.appendChild(document.createElement("br")); - form.appendChild(document.createElement("br")); - - - //Timezone (read only) - var timezoneLabel = document.createElement("label"); - timezoneLabel.innerHTML = "Timezone"; - timezoneLabel.appendChild(document.createElement("br")); - form.appendChild(timezoneLabel); - var timezone = document.createElement("input"); - timezone.name = "timezone"; - timezone.type = "text"; - timezone.value = event.timezone; - timezone.disabled = true; - timezoneLabel.appendChild(timezone); - form.appendChild(document.createElement("br")); - form.appendChild(document.createElement("br")); - - //Location - var locationLabel = document.createElement("label"); - locationLabel.innerHTML = "Location"; - locationLabel.appendChild(document.createElement("br")); - form.appendChild(locationLabel); - var location = document.createElement("input"); - location.name = "location"; - location.type = "text"; - location.value = event.location; - location.id = "editLocation-" + event.id; - locationLabel.appendChild(location); - form.appendChild(document.createElement("br")); - form.appendChild(document.createElement("br")); - - //Color - var colorLabel = document.createElement("label"); - colorLabel.innerHTML = "Color"; - colorLabel.appendChild(document.createElement("br")); - form.appendChild(colorLabel); - var colorSelect = document.createElement("select"); - colorSelect.name = "color"; - colorSelect.id = "editColor-" + event.id; - colorLabel.appendChild(colorSelect); - - for (var c = 0; c < colors().length; c++) { - var option = document.createElement("option"); - option.value = colors()[c]; - option.text = colors()[c]; - option.selected = (event.color === colors()[c]); - colorSelect.appendChild(option); + while (container.firstChild) { + container.removeChild(container.firstChild); } - form.appendChild(document.createElement("br")); - form.appendChild(document.createElement("br")); - //Recurrence - var recurrenceLabel = document.createElement("label"); - recurrenceLabel.innerHTML = "Recurrence"; - recurrenceLabel.appendChild(document.createElement("br")); - form.appendChild(recurrenceLabel); + for (var i = 0; i < obj.count; i++) { + var event = obj.events[i]; - if (event.isParent) { - var enableRecurrence = document.createElement("input"); - enableRecurrence.name = "enable-recurrence"; - enableRecurrence.type = "checkbox"; - enableRecurrence.checked = false; - enableRecurrence.id = "editEnableRecur-" + event.id; - enableRecurrence.onclick = function (ev) { - changeRecurrenceEditDisplays(this); + //Create Edit Button + var editButton = document.createElement("button"); + editButton.type = "button"; + editButton.setAttribute("data-toggle", "modal"); + editButton.setAttribute("data-target", "#modal-" + event.id); + editButton.innerHTML = "Edit"; + container.appendChild(editButton); + + //Create Delete button + var deleteButton = document.createElement("button"); + deleteButton.type = "button"; + deleteButton.innerHTML = "Delete"; + deleteButton.className = "danger"; + deleteButton.id = "delete-" + event.id; + deleteButton.onclick = function (ev) { + deleteEvent(this.id) }; - recurrenceLabel.appendChild(enableRecurrence); + container.appendChild(deleteButton); + + container.appendChild(document.createElement("br")); + container.appendChild(document.createElement("br")); + + //Create modal container + var modalContainer = document.createElement("div"); + modalContainer.className = "modal fade"; + modalContainer.id = "modal-" + event.id; + modalContainer.role = "dialog"; + container.appendChild(modalContainer); + + //Create modal-dialog + var modalDia = document.createElement("div"); + modalDia.className = "modal-dialog"; + modalContainer.appendChild(modalDia); + + //Create Modal Content + var modalCon = document.createElement("div"); + modalCon.className = "modal-content"; + modalDia.appendChild(modalCon); + + //Create modal header and title + var modalHeader = document.createElement("div"); + modalHeader.className = "modal-header"; + modalCon.appendChild(modalHeader); + var modalTitle = document.createElement("h4"); + modalTitle.className = "modal-title"; + modalTitle.innerHTML = "Editing Event"; + modalHeader.appendChild(modalTitle); + + //Create Modal Body + var modalBody = document.createElement("div"); + modalBody.className = "modal-body"; + modalCon.appendChild(modalBody); + + var form = document.createElement("form"); + modalBody.appendChild(form); + + //Summary + var summaryLabel = document.createElement("label"); + summaryLabel.innerHTML = "Summary"; + summaryLabel.appendChild(document.createElement("br")); + form.appendChild(summaryLabel); + var summary = document.createElement("input"); + summary.name = "summary"; + summary.type = "text"; + summary.value = event.summary; + summary.id = "editSummary-" + event.id; + summaryLabel.appendChild(summary); form.appendChild(document.createElement("br")); form.appendChild(document.createElement("br")); - //Frequency - var frequencyLabel = document.createElement("label"); - frequencyLabel.innerHTML = "Recurrence - Frequency"; - frequencyLabel.appendChild(document.createElement("br")); - form.appendChild(frequencyLabel); - var freqSelect = document.createElement("select"); - freqSelect.name = "frequency"; - freqSelect.id = "editFrequency-" + event.id; - frequencyLabel.appendChild(freqSelect); + //Description + var descriptionLabel = document.createElement("label"); + descriptionLabel.innerHTML = "Description"; + descriptionLabel.appendChild(document.createElement("br")); + form.appendChild(descriptionLabel); + var description = document.createElement("input"); + description.name = "edit-description"; + description.type = "text"; + description.value = event.description; + description.id = "editDescription-" + event.id; + descriptionLabel.appendChild(description); + form.appendChild(document.createElement("br")); + form.appendChild(document.createElement("br")); - for (var f = 0; f < frequencies().length; f++) { - var op = document.createElement("option"); - op.value = frequencies()[f]; - op.text = frequencies()[f]; - op.selected = (event.recurrence.frequency === frequencies()[f]); - freqSelect.appendChild(op); + //Start date and time + var sd = new Date(event.epochStart); + var startLabel = document.createElement("label"); + startLabel.innerHTML = "Start Date and Time"; + startLabel.appendChild(document.createElement("br")); + form.appendChild(startLabel); + var startDate = document.createElement("input"); + startDate.name = "start-date"; + startDate.type = "date"; + startDate.valueAsDate = sd; + startDate.required = true; + startDate.id = "editStartDate-" + event.id; + startLabel.appendChild(startDate); + var startTime = document.createElement("input"); + startTime.name = "start-time"; + startTime.type = "time"; + startTime.value = (sd.getHours() < 10 ? "0" : "") + sd.getHours() + ":" + (sd.getMinutes() < 10 ? "0" : "") + sd.getMinutes(); + startTime.required = true; + startTime.id = "editStartTime-" + event.id; + startLabel.appendChild(startTime); + form.appendChild(document.createElement("br")); + form.appendChild(document.createElement("br")); + + //End date and time + var ed = new Date(event.epochEnd); + var endLabel = document.createElement("label"); + endLabel.innerHTML = "End Date and Time"; + endLabel.appendChild(document.createElement("br")); + form.appendChild(endLabel); + var endDate = document.createElement("input"); + endDate.name = "end-date"; + endDate.type = "date"; + endDate.valueAsDate = ed; + endDate.required = true; + endDate.id = "editEndDate-" + event.id; + endLabel.appendChild(endDate); + var endTime = document.createElement("input"); + endTime.name = "end-time"; + endTime.type = "time"; + endTime.value = (ed.getHours() < 10 ? "0" : "") + ed.getHours() + ":" + (ed.getMinutes() < 10 ? "0" : "") + ed.getMinutes(); + endTime.required = true; + endTime.id = "editEndTime-" + event.id; + endLabel.appendChild(endTime); + form.appendChild(document.createElement("br")); + form.appendChild(document.createElement("br")); + + + //Timezone (read only) + var timezoneLabel = document.createElement("label"); + timezoneLabel.innerHTML = "Timezone"; + timezoneLabel.appendChild(document.createElement("br")); + form.appendChild(timezoneLabel); + var timezone = document.createElement("input"); + timezone.name = "timezone"; + timezone.type = "text"; + timezone.value = event.timezone; + timezone.disabled = true; + timezoneLabel.appendChild(timezone); + form.appendChild(document.createElement("br")); + form.appendChild(document.createElement("br")); + + //Location + var locationLabel = document.createElement("label"); + locationLabel.innerHTML = "Location"; + locationLabel.appendChild(document.createElement("br")); + form.appendChild(locationLabel); + var location = document.createElement("input"); + location.name = "location"; + location.type = "text"; + location.value = event.location; + location.id = "editLocation-" + event.id; + locationLabel.appendChild(location); + form.appendChild(document.createElement("br")); + form.appendChild(document.createElement("br")); + + //Color + var colorLabel = document.createElement("label"); + colorLabel.innerHTML = "Color"; + colorLabel.appendChild(document.createElement("br")); + form.appendChild(colorLabel); + var colorSelect = document.createElement("select"); + colorSelect.name = "color"; + colorSelect.id = "editColor-" + event.id; + colorLabel.appendChild(colorSelect); + + for (var c = 0; c < colors().length; c++) { + var option = document.createElement("option"); + option.value = colors()[c]; + option.text = colors()[c]; + option.selected = (event.color === colors()[c]); + colorSelect.appendChild(option); } - freqSelect.disabled = true; - frequencyLabel.appendChild(freqSelect); form.appendChild(document.createElement("br")); form.appendChild(document.createElement("br")); - //Count - var countLabel = document.createElement("label"); - countLabel.innerHTML = "Recurrence - Count"; - countLabel.appendChild(document.createElement("br")); - form.appendChild(countLabel); - var count = document.createElement("input"); - count.name = "count"; - count.type = "number"; - count.valueAsNumber = parseInt(event.recurrence.count); - count.min = "-1"; - count.id = "editCount-" + event.id; - count.disabled = true; - countLabel.appendChild(count); + //Recurrence + var recurrenceLabel = document.createElement("label"); + recurrenceLabel.innerHTML = "Recurrence"; + recurrenceLabel.appendChild(document.createElement("br")); + form.appendChild(recurrenceLabel); + + if (event.isParent) { + var enableRecurrence = document.createElement("input"); + enableRecurrence.name = "enable-recurrence"; + enableRecurrence.type = "checkbox"; + enableRecurrence.checked = false; + enableRecurrence.id = "editEnableRecur-" + event.id; + enableRecurrence.onclick = function (ev) { + changeRecurrenceEditDisplays(this); + }; + recurrenceLabel.appendChild(enableRecurrence); + form.appendChild(document.createElement("br")); + form.appendChild(document.createElement("br")); + + //Frequency + var frequencyLabel = document.createElement("label"); + frequencyLabel.innerHTML = "Recurrence - Frequency"; + frequencyLabel.appendChild(document.createElement("br")); + form.appendChild(frequencyLabel); + var freqSelect = document.createElement("select"); + freqSelect.name = "frequency"; + freqSelect.id = "editFrequency-" + event.id; + frequencyLabel.appendChild(freqSelect); + + for (var f = 0; f < frequencies().length; f++) { + var op = document.createElement("option"); + op.value = frequencies()[f]; + op.text = frequencies()[f]; + op.selected = (event.recurrence.frequency === frequencies()[f]); + freqSelect.appendChild(op); + } + freqSelect.disabled = true; + frequencyLabel.appendChild(freqSelect); + form.appendChild(document.createElement("br")); + form.appendChild(document.createElement("br")); + + //Count + var countLabel = document.createElement("label"); + countLabel.innerHTML = "Recurrence - Count"; + countLabel.appendChild(document.createElement("br")); + form.appendChild(countLabel); + var count = document.createElement("input"); + count.name = "count"; + count.type = "number"; + count.valueAsNumber = parseInt(event.recurrence.count); + count.min = "-1"; + count.id = "editCount-" + event.id; + count.disabled = true; + countLabel.appendChild(count); + form.appendChild(document.createElement("br")); + form.appendChild(document.createElement("br")); + + //Interval + var intervalLabel = document.createElement("label"); + intervalLabel.innerHTML = "Recurrence - Interval"; + intervalLabel.appendChild(document.createElement("br")); + form.appendChild(intervalLabel); + var interval = document.createElement("input"); + interval.name = "interval"; + interval.type = "number"; + interval.valueAsNumber = parseInt(event.recurrence.interval); + interval.min = "1"; + interval.id = "editInterval-" + event.id; + interval.disabled = true; + intervalLabel.appendChild(interval); + form.appendChild(document.createElement("br")); + form.appendChild(document.createElement("br")); + + } else { + //Cannot edit recurrence + var cannotEditRecur = document.createElement("input"); + cannotEditRecur.name = "ignore-cer"; + cannotEditRecur.type = "text"; + cannotEditRecur.disabled = true; + cannotEditRecur.value = "Cannot edit child"; + recurrenceLabel.appendChild(cannotEditRecur); + } form.appendChild(document.createElement("br")); form.appendChild(document.createElement("br")); - //Interval - var intervalLabel = document.createElement("label"); - intervalLabel.innerHTML = "Recurrence - Interval"; - intervalLabel.appendChild(document.createElement("br")); - form.appendChild(intervalLabel); - var interval = document.createElement("input"); - interval.name = "interval"; - interval.type = "number"; - interval.valueAsNumber = parseInt(event.recurrence.interval); - interval.min = "1"; - interval.id = "editInterval-" + event.id; - interval.disabled = true; - intervalLabel.appendChild(interval); + //Image + var imageLabel = document.createElement("label"); + imageLabel.innerHTML = "Image"; + imageLabel.appendChild(document.createElement("br")); + form.appendChild(imageLabel); + var image = document.createElement("input"); + image.name = "image"; + image.type = "text"; + image.value = event.image; + image.id = "editImage-" + event.id; + imageLabel.appendChild(image); form.appendChild(document.createElement("br")); form.appendChild(document.createElement("br")); - } else { - //Cannot edit recurrence - var cannotEditRecur = document.createElement("input"); - cannotEditRecur.name = "ignore-cer"; - cannotEditRecur.type = "text"; - cannotEditRecur.disabled = true; - cannotEditRecur.value = "Cannot edit child"; - recurrenceLabel.appendChild(cannotEditRecur); + //ID (readonly) for API + var idLabel = document.createElement("label"); + idLabel.innerHTML = "Event ID"; + idLabel.appendChild(document.createElement("br")); + form.appendChild(idLabel); + var hiddenId = document.createElement("input"); + hiddenId.type = "text"; + hiddenId.name = "id"; + hiddenId.value = event.id; + hiddenId.id = "editId-" + event.id; + hiddenId.readOnly = true; + idLabel.appendChild(hiddenId); + form.appendChild(document.createElement("br")); + form.appendChild(document.createElement("br")); + + //Submit button + var submit = document.createElement("button"); + submit.className = "submit"; + submit.type = "button"; + submit.id = "editsubmit-" + event.id; + submit.innerHTML = "Update Event!"; + submit.onclick = function (ignore) { + updateEvent(this.id); + }; + form.appendChild(submit); + //TODO: permission handling for submit button!!!! + + //TODO: Reset button + + //Create modal footer + var modalFooter = document.createElement("div"); + modalFooter.className = "modal-footer"; + modalCon.appendChild(modalFooter); + + var closeButton = document.createElement("button"); + closeButton.type = "button"; + closeButton.setAttribute("data-dismiss", "modal"); + closeButton.innerHTML = "Close"; + modalFooter.appendChild(closeButton); + //Oh my god finally done!!! } - form.appendChild(document.createElement("br")); - form.appendChild(document.createElement("br")); + }, + error: function (jqXHR, textStatus, errorThrown) { + var obj = JSON.parse(jqXHR.responseText); - //Image - var imageLabel = document.createElement("label"); - imageLabel.innerHTML = "Image"; - imageLabel.appendChild(document.createElement("br")); - form.appendChild(imageLabel); - var image = document.createElement("input"); - image.name = "image"; - image.type = "text"; - image.value = event.image; - image.id = "editImage-" + event.id; - imageLabel.appendChild(image); - form.appendChild(document.createElement("br")); - form.appendChild(document.createElement("br")); - - //ID (readonly) for API - var idLabel = document.createElement("label"); - idLabel.innerHTML = "Event ID"; - idLabel.appendChild(document.createElement("br")); - form.appendChild(idLabel); - var hiddenId = document.createElement("input"); - hiddenId.type = "text"; - hiddenId.name = "id"; - hiddenId.value = event.id; - hiddenId.id = "editId-" + event.id; - hiddenId.readOnly = true; - idLabel.appendChild(hiddenId); - form.appendChild(document.createElement("br")); - form.appendChild(document.createElement("br")); - - //Submit button - var submit = document.createElement("button"); - submit.className = "submit"; - submit.type = "button"; - submit.id = "editsubmit-" + event.id; - submit.innerHTML = "Update Event!"; - submit.onclick = function (ignore) { - updateEvent(this.id); - }; - form.appendChild(submit); - //TODO: permission handling for submit button!!!! - - //TODO: Reset button - - //Create modal footer - var modalFooter = document.createElement("div"); - modalFooter.className = "modal-footer"; - modalCon.appendChild(modalFooter); - - var closeButton = document.createElement("button"); - closeButton.type = "button"; - closeButton.setAttribute("data-dismiss", "modal"); - closeButton.innerHTML = "Close"; - modalFooter.appendChild(closeButton); - //Oh my god finally done!!! + showSnackbar("[ERROR] " + obj.reason); } - }) - .fail(function () { - showSnackbar("Our hippos failed to find your events for the day!"); - }, "json"); + }); } function selectDate(clickedId) { @@ -701,18 +722,28 @@ function deleteEvent(clickedId) { var eventId = clickedId.replace("delete-", ""); var bodyRaw = {"id": eventId}; - var q = $.post("/api/v1/events/delete", JSON.stringify(bodyRaw), function (ignore) { + $.ajax({ + url: "/api/v1/events/delete", + headers: { + "Content-Type": "application/json" + }, + method: "POST", + dataType: "json", + data: JSON.stringify(bodyRaw), + success: function (data) { + showSnackbar("Successfully deleted event!"); - showSnackbar("Successfully deleted event!"); + setMonth({date: calendar.selectedDate}); + getEventsForMonth(); - setMonth({date: calendar.selectedDate}); - getEventsForMonth(); + getEventsForSelectedDate(); + }, + error: function (jqXHR, textStatus, errorThrown) { + var obj = JSON.parse(jqXHR.responseText); - getEventsForSelectedDate(); - }) - .fail(function () { - showSnackbar("Our hippos failed to delete your event!"); - }, "json"); + showSnackbar("[ERROR] " + obj.reason); + } + }); } function init() { diff --git a/Website/src/main/resources/web/public/scripts/embed/calendar.js b/Website/src/main/resources/web/public/scripts/embed/calendar.js index c45b9097..bf99a91b 100644 --- a/Website/src/main/resources/web/public/scripts/embed/calendar.js +++ b/Website/src/main/resources/web/public/scripts/embed/calendar.js @@ -1,4 +1,5 @@ var calendar = { + guildId: 0, todaysDate: new Date(), selectedDate: new Date(), displays: [] @@ -146,30 +147,41 @@ function getEventsForMonth() { var bodyRaw = { + "guild_id": calendar.guildId, "DaysInMonth": daysInMonth().toString(), "StartEpoch": ds.getTime().toString() }; - var q = $.post("/api/v1/events/list/month", JSON.stringify(bodyRaw), function (response) { - var obj = JSON.parse(response); + $.ajax({ + url: "/api/v1/events/list/month", + headers: { + "Content-Type": "application/json", + "Authorization": "EMBEDDED" + }, + method: "POST", + dataType: "json", + data: JSON.stringify(bodyRaw), + success: function (json) { + var obj = json; - //Display the event counts on the calendar... - for (var i = 0; i < obj.events.length; i++) { - var d = new Date(obj.events[i].epochStart); + //Display the event counts on the calendar... + for (var i = 0; i < obj.events.length; i++) { + var d = new Date(obj.events[i].epochStart); - var e = document.getElementById(calendar.displays[d.getDate()]); + var e = document.getElementById(calendar.displays[d.getDate()]); - if (e.innerHTML.indexOf("[") === -1) { - e.innerHTML = d.getDate() + "[1]"; - } else { - e.innerHTML = d.getDate().toString() + "[" + (parseInt(e.innerHTML.split("[")[1][0]) + 1).toString() + "]"; + if (e.innerHTML.indexOf("[") === -1) { + e.innerHTML = d.getDate() + "[1]"; + } else { + e.innerHTML = d.getDate().toString() + "[" + (parseInt(e.innerHTML.split("[")[1][0]) + 1).toString() + "]"; + } } - } + }, + error: function (jqXHR, textStatus, errorThrown) { - }) - .fail(function () { - showSnackbar("Our hippos failed to find your events!"); - }, "json"); + showSnackbar("[ERROR] " + jqXHR.responseText); + } + }); } function getEventsForSelectedDate() { @@ -178,317 +190,329 @@ function getEventsForSelectedDate() { var bodyRaw = { + "guild_id": calendar.guildId, "DaysInMonth": daysInMonth().toString(), "StartEpoch": ds.getTime().toString() }; - var q = $.post("/api/v1/events/list/date", JSON.stringify(bodyRaw), function (response) { - var obj = JSON.parse(response); + $.ajax({ + url: "/api/v1/events/list/date", + headers: { + "Content-Type": "application/json", + "Authorization": "EMBEDDED" + }, + method: "POST", + dataType: "json", + data: JSON.stringify(bodyRaw), + success: function (json) { + var obj = json; - //Display the selected day's event details for editing and such. - var container = document.getElementById("event-container"); + //Display the selected day's event details for editing and such. + var container = document.getElementById("event-container"); - while (container.firstChild) { - container.removeChild(container.firstChild); - } - - for (var i = 0; i < obj.count; i++) { - var event = obj.events[i]; - - //Create View Button - var viewButton = document.createElement("button"); - viewButton.type = "button"; - viewButton.setAttribute("data-toggle", "modal"); - viewButton.setAttribute("data-target", "#modal-" + event.id); - viewButton.innerHTML = "View"; - container.appendChild(viewButton); - - container.appendChild(document.createElement("br")); - container.appendChild(document.createElement("br")); - - //Create modal container - var modalContainer = document.createElement("div"); - modalContainer.className = "modal fade"; - modalContainer.id = "modal-" + event.id; - modalContainer.role = "dialog"; - container.appendChild(modalContainer); - - //Create modal-dialog - var modalDia = document.createElement("div"); - modalDia.className = "modal-dialog"; - modalContainer.appendChild(modalDia); - - //Create Modal Content - var modalCon = document.createElement("div"); - modalCon.className = "modal-content"; - modalDia.appendChild(modalCon); - - //Create modal header and title - var modalHeader = document.createElement("div"); - modalHeader.className = "modal-header"; - modalCon.appendChild(modalHeader); - var modalTitle = document.createElement("h4"); - modalTitle.className = "modal-title"; - modalTitle.innerHTML = "Editing Event"; - modalHeader.appendChild(modalTitle); - - //Create Modal Body - var modalBody = document.createElement("div"); - modalBody.className = "modal-body"; - modalCon.appendChild(modalBody); - - var form = document.createElement("form"); - modalBody.appendChild(form); - - //Summary - var summaryLabel = document.createElement("label"); - summaryLabel.innerHTML = "Summary"; - summaryLabel.appendChild(document.createElement("br")); - form.appendChild(summaryLabel); - var summary = document.createElement("input"); - summary.name = "summary"; - summary.type = "text"; - summary.value = event.summary; - summary.id = "editSummary-" + event.id; - summaryLabel.appendChild(summary); - form.appendChild(document.createElement("br")); - form.appendChild(document.createElement("br")); - - //Description - var descriptionLabel = document.createElement("label"); - descriptionLabel.innerHTML = "Description"; - descriptionLabel.appendChild(document.createElement("br")); - form.appendChild(descriptionLabel); - var description = document.createElement("input"); - description.name = "edit-description"; - description.type = "text"; - description.value = event.description; - description.id = "editDescription-" + event.id; - descriptionLabel.appendChild(description); - form.appendChild(document.createElement("br")); - form.appendChild(document.createElement("br")); - - //Start date and time - var sd = new Date(event.epochStart); - var startLabel = document.createElement("label"); - startLabel.innerHTML = "Start Date and Time"; - startLabel.appendChild(document.createElement("br")); - form.appendChild(startLabel); - var startDate = document.createElement("input"); - startDate.name = "start-date"; - startDate.type = "date"; - startDate.valueAsDate = sd; - startDate.id = "editStartDate-" + event.id; - startLabel.appendChild(startDate); - var startTime = document.createElement("input"); - startTime.name = "start-time"; - startTime.type = "time"; - startTime.value = (sd.getHours() < 10 ? "0" : "") + sd.getHours() + ":" + (sd.getMinutes() < 10 ? "0" : "") + sd.getMinutes(); - startTime.id = "editStartTime-" + event.id; - startLabel.appendChild(startTime); - form.appendChild(document.createElement("br")); - form.appendChild(document.createElement("br")); - - //End date and time - var ed = new Date(event.epochEnd); - var endLabel = document.createElement("label"); - endLabel.innerHTML = "End Date and Time"; - endLabel.appendChild(document.createElement("br")); - form.appendChild(endLabel); - var endDate = document.createElement("input"); - endDate.name = "end-date"; - endDate.type = "date"; - endDate.valueAsDate = ed; - endDate.id = "editEndDate-" + event.id; - endLabel.appendChild(endDate); - var endTime = document.createElement("input"); - endTime.name = "end-time"; - endTime.type = "time"; - endTime.value = (ed.getHours() < 10 ? "0" : "") + ed.getHours() + ":" + (ed.getMinutes() < 10 ? "0" : "") + ed.getMinutes(); - endTime.id = "editEndTime-" + event.id; - endLabel.appendChild(endTime); - form.appendChild(document.createElement("br")); - form.appendChild(document.createElement("br")); - - - //Timezone (read only) - var timezoneLabel = document.createElement("label"); - timezoneLabel.innerHTML = "Timezone"; - timezoneLabel.appendChild(document.createElement("br")); - form.appendChild(timezoneLabel); - var timezone = document.createElement("input"); - timezone.name = "timezone"; - timezone.type = "text"; - timezone.value = event.timezone; - timezone.disabled = true; - timezoneLabel.appendChild(timezone); - form.appendChild(document.createElement("br")); - form.appendChild(document.createElement("br")); - - //Location - var locationLabel = document.createElement("label"); - locationLabel.innerHTML = "Location"; - locationLabel.appendChild(document.createElement("br")); - form.appendChild(locationLabel); - var location = document.createElement("input"); - location.name = "location"; - location.type = "text"; - location.value = event.location; - location.id = "editLocation-" + event.id; - locationLabel.appendChild(location); - form.appendChild(document.createElement("br")); - form.appendChild(document.createElement("br")); - - //Color - var colorLabel = document.createElement("label"); - colorLabel.innerHTML = "Color"; - colorLabel.appendChild(document.createElement("br")); - form.appendChild(colorLabel); - var colorSelect = document.createElement("select"); - colorSelect.name = "color"; - colorSelect.id = "editColor-" + event.id; - colorLabel.appendChild(colorSelect); - - for (var c = 0; c < colors().length; c++) { - var option = document.createElement("option"); - option.value = colors()[c]; - option.text = colors()[c]; - option.selected = (event.color === colors()[c]); - colorSelect.appendChild(option); + while (container.firstChild) { + container.removeChild(container.firstChild); } - form.appendChild(document.createElement("br")); - form.appendChild(document.createElement("br")); - //Recurrence - var recurrenceLabel = document.createElement("label"); - recurrenceLabel.innerHTML = "Recurrence"; - recurrenceLabel.appendChild(document.createElement("br")); - form.appendChild(recurrenceLabel); + for (var i = 0; i < obj.count; i++) { + var event = obj.events[i]; - if (event.isParent) { - var enableRecurrence = document.createElement("input"); - enableRecurrence.name = "enable-recurrence"; - enableRecurrence.type = "checkbox"; - enableRecurrence.checked = false; - enableRecurrence.id = "editEnableRecur-" + event.id; - enableRecurrence.onclick = function (ev) { - changeRecurrenceEditDisplays(this); - }; - recurrenceLabel.appendChild(enableRecurrence); + //Create View Button + var viewButton = document.createElement("button"); + viewButton.type = "button"; + viewButton.setAttribute("data-toggle", "modal"); + viewButton.setAttribute("data-target", "#modal-" + event.id); + viewButton.innerHTML = "View Event With ID: " + event.id; + container.appendChild(viewButton); + + container.appendChild(document.createElement("br")); + container.appendChild(document.createElement("br")); + + //Create modal container + var modalContainer = document.createElement("div"); + modalContainer.className = "modal fade"; + modalContainer.id = "modal-" + event.id; + modalContainer.role = "dialog"; + container.appendChild(modalContainer); + + //Create modal-dialog + var modalDia = document.createElement("div"); + modalDia.className = "modal-dialog"; + modalContainer.appendChild(modalDia); + + //Create Modal Content + var modalCon = document.createElement("div"); + modalCon.className = "modal-content"; + modalDia.appendChild(modalCon); + + //Create modal header and title + var modalHeader = document.createElement("div"); + modalHeader.className = "modal-header"; + modalCon.appendChild(modalHeader); + var modalTitle = document.createElement("h4"); + modalTitle.className = "modal-title"; + modalTitle.innerHTML = "Viewing Event"; + modalHeader.appendChild(modalTitle); + + //Create Modal Body + var modalBody = document.createElement("div"); + modalBody.className = "modal-body"; + modalCon.appendChild(modalBody); + + var form = document.createElement("form"); + modalBody.appendChild(form); + + //Summary + var summaryLabel = document.createElement("label"); + summaryLabel.innerHTML = "Summary"; + summaryLabel.appendChild(document.createElement("br")); + form.appendChild(summaryLabel); + var summary = document.createElement("input"); + summary.name = "summary"; + summary.type = "text"; + summary.value = event.summary; + summary.id = "editSummary-" + event.id; + summaryLabel.appendChild(summary); form.appendChild(document.createElement("br")); form.appendChild(document.createElement("br")); - //Frequency - var frequencyLabel = document.createElement("label"); - frequencyLabel.innerHTML = "Recurrence - Frequency"; - frequencyLabel.appendChild(document.createElement("br")); - form.appendChild(frequencyLabel); - var freqSelect = document.createElement("select"); - freqSelect.name = "frequency"; - freqSelect.id = "editFrequency-" + event.id; - frequencyLabel.appendChild(freqSelect); + //Description + var descriptionLabel = document.createElement("label"); + descriptionLabel.innerHTML = "Description"; + descriptionLabel.appendChild(document.createElement("br")); + form.appendChild(descriptionLabel); + var description = document.createElement("input"); + description.name = "edit-description"; + description.type = "text"; + description.value = event.description; + description.id = "editDescription-" + event.id; + descriptionLabel.appendChild(description); + form.appendChild(document.createElement("br")); + form.appendChild(document.createElement("br")); - for (var f = 0; f < frequencies().length; f++) { - var op = document.createElement("option"); - op.value = frequencies()[f]; - op.text = frequencies()[f]; - op.selected = (event.recurrence.frequency === frequencies()[f]); - freqSelect.appendChild(op); + //Start date and time + var sd = new Date(event.epochStart); + var startLabel = document.createElement("label"); + startLabel.innerHTML = "Start Date and Time"; + startLabel.appendChild(document.createElement("br")); + form.appendChild(startLabel); + var startDate = document.createElement("input"); + startDate.name = "start-date"; + startDate.type = "date"; + startDate.valueAsDate = sd; + startDate.id = "editStartDate-" + event.id; + startLabel.appendChild(startDate); + var startTime = document.createElement("input"); + startTime.name = "start-time"; + startTime.type = "time"; + startTime.value = (sd.getHours() < 10 ? "0" : "") + sd.getHours() + ":" + (sd.getMinutes() < 10 ? "0" : "") + sd.getMinutes(); + startTime.id = "editStartTime-" + event.id; + startLabel.appendChild(startTime); + form.appendChild(document.createElement("br")); + form.appendChild(document.createElement("br")); + + //End date and time + var ed = new Date(event.epochEnd); + var endLabel = document.createElement("label"); + endLabel.innerHTML = "End Date and Time"; + endLabel.appendChild(document.createElement("br")); + form.appendChild(endLabel); + var endDate = document.createElement("input"); + endDate.name = "end-date"; + endDate.type = "date"; + endDate.valueAsDate = ed; + endDate.id = "editEndDate-" + event.id; + endLabel.appendChild(endDate); + var endTime = document.createElement("input"); + endTime.name = "end-time"; + endTime.type = "time"; + endTime.value = (ed.getHours() < 10 ? "0" : "") + ed.getHours() + ":" + (ed.getMinutes() < 10 ? "0" : "") + ed.getMinutes(); + endTime.id = "editEndTime-" + event.id; + endLabel.appendChild(endTime); + form.appendChild(document.createElement("br")); + form.appendChild(document.createElement("br")); + + + //Timezone (read only) + var timezoneLabel = document.createElement("label"); + timezoneLabel.innerHTML = "Timezone"; + timezoneLabel.appendChild(document.createElement("br")); + form.appendChild(timezoneLabel); + var timezone = document.createElement("input"); + timezone.name = "timezone"; + timezone.type = "text"; + timezone.value = event.timezone; + timezone.disabled = true; + timezoneLabel.appendChild(timezone); + form.appendChild(document.createElement("br")); + form.appendChild(document.createElement("br")); + + //Location + var locationLabel = document.createElement("label"); + locationLabel.innerHTML = "Location"; + locationLabel.appendChild(document.createElement("br")); + form.appendChild(locationLabel); + var location = document.createElement("input"); + location.name = "location"; + location.type = "text"; + location.value = event.location; + location.id = "editLocation-" + event.id; + locationLabel.appendChild(location); + form.appendChild(document.createElement("br")); + form.appendChild(document.createElement("br")); + + //Color + var colorLabel = document.createElement("label"); + colorLabel.innerHTML = "Color"; + colorLabel.appendChild(document.createElement("br")); + form.appendChild(colorLabel); + var colorSelect = document.createElement("select"); + colorSelect.name = "color"; + colorSelect.id = "editColor-" + event.id; + colorLabel.appendChild(colorSelect); + + for (var c = 0; c < colors().length; c++) { + var option = document.createElement("option"); + option.value = colors()[c]; + option.text = colors()[c]; + option.selected = (event.color === colors()[c]); + colorSelect.appendChild(option); } - freqSelect.disabled = true; - frequencyLabel.appendChild(freqSelect); form.appendChild(document.createElement("br")); form.appendChild(document.createElement("br")); - //Count - var countLabel = document.createElement("label"); - countLabel.innerHTML = "Recurrence - Count"; - countLabel.appendChild(document.createElement("br")); - form.appendChild(countLabel); - var count = document.createElement("input"); - count.name = "count"; - count.type = "number"; - count.valueAsNumber = parseInt(event.recurrence.count); - count.min = "-1"; - count.id = "editCount-" + event.id; - count.disabled = true; - countLabel.appendChild(count); + //Recurrence + var recurrenceLabel = document.createElement("label"); + recurrenceLabel.innerHTML = "Recurrence"; + recurrenceLabel.appendChild(document.createElement("br")); + form.appendChild(recurrenceLabel); + + if (event.isParent) { + var enableRecurrence = document.createElement("input"); + enableRecurrence.name = "enable-recurrence"; + enableRecurrence.type = "checkbox"; + enableRecurrence.checked = false; + enableRecurrence.id = "editEnableRecur-" + event.id; + enableRecurrence.onclick = function (ev) { + changeRecurrenceEditDisplays(this); + }; + recurrenceLabel.appendChild(enableRecurrence); + form.appendChild(document.createElement("br")); + form.appendChild(document.createElement("br")); + + //Frequency + var frequencyLabel = document.createElement("label"); + frequencyLabel.innerHTML = "Recurrence - Frequency"; + frequencyLabel.appendChild(document.createElement("br")); + form.appendChild(frequencyLabel); + var freqSelect = document.createElement("select"); + freqSelect.name = "frequency"; + freqSelect.id = "editFrequency-" + event.id; + frequencyLabel.appendChild(freqSelect); + + for (var f = 0; f < frequencies().length; f++) { + var op = document.createElement("option"); + op.value = frequencies()[f]; + op.text = frequencies()[f]; + op.selected = (event.recurrence.frequency === frequencies()[f]); + freqSelect.appendChild(op); + } + freqSelect.disabled = true; + frequencyLabel.appendChild(freqSelect); + form.appendChild(document.createElement("br")); + form.appendChild(document.createElement("br")); + + //Count + var countLabel = document.createElement("label"); + countLabel.innerHTML = "Recurrence - Count"; + countLabel.appendChild(document.createElement("br")); + form.appendChild(countLabel); + var count = document.createElement("input"); + count.name = "count"; + count.type = "number"; + count.valueAsNumber = parseInt(event.recurrence.count); + count.min = "-1"; + count.id = "editCount-" + event.id; + count.disabled = true; + countLabel.appendChild(count); + form.appendChild(document.createElement("br")); + form.appendChild(document.createElement("br")); + + //Interval + var intervalLabel = document.createElement("label"); + intervalLabel.innerHTML = "Recurrence - Interval"; + intervalLabel.appendChild(document.createElement("br")); + form.appendChild(intervalLabel); + var interval = document.createElement("input"); + interval.name = "interval"; + interval.type = "number"; + interval.valueAsNumber = parseInt(event.recurrence.interval); + interval.min = "1"; + interval.id = "editInterval-" + event.id; + interval.disabled = true; + intervalLabel.appendChild(interval); + form.appendChild(document.createElement("br")); + form.appendChild(document.createElement("br")); + + } else { + //Cannot edit recurrence + var cannotEditRecur = document.createElement("input"); + cannotEditRecur.name = "ignore-cer"; + cannotEditRecur.type = "text"; + cannotEditRecur.disabled = true; + cannotEditRecur.value = "Cannot edit child"; + recurrenceLabel.appendChild(cannotEditRecur); + } form.appendChild(document.createElement("br")); form.appendChild(document.createElement("br")); - //Interval - var intervalLabel = document.createElement("label"); - intervalLabel.innerHTML = "Recurrence - Interval"; - intervalLabel.appendChild(document.createElement("br")); - form.appendChild(intervalLabel); - var interval = document.createElement("input"); - interval.name = "interval"; - interval.type = "number"; - interval.valueAsNumber = parseInt(event.recurrence.interval); - interval.min = "1"; - interval.id = "editInterval-" + event.id; - interval.disabled = true; - intervalLabel.appendChild(interval); + //Image + var imageLabel = document.createElement("label"); + imageLabel.innerHTML = "Image"; + imageLabel.appendChild(document.createElement("br")); + form.appendChild(imageLabel); + var image = document.createElement("input"); + image.name = "image"; + image.type = "text"; + image.value = event.image; + image.id = "editImage-" + event.id; + imageLabel.appendChild(image); form.appendChild(document.createElement("br")); form.appendChild(document.createElement("br")); - } else { - //Cannot edit recurrence - var cannotEditRecur = document.createElement("input"); - cannotEditRecur.name = "ignore-cer"; - cannotEditRecur.type = "text"; - cannotEditRecur.disabled = true; - cannotEditRecur.value = "Cannot edit child"; - recurrenceLabel.appendChild(cannotEditRecur); + //ID (readonly) for API + var idLabel = document.createElement("label"); + idLabel.innerHTML = "Event ID"; + idLabel.appendChild(document.createElement("br")); + form.appendChild(idLabel); + var hiddenId = document.createElement("input"); + hiddenId.type = "text"; + hiddenId.name = "id"; + hiddenId.value = event.id; + hiddenId.id = "editId-" + event.id; + hiddenId.readOnly = true; + idLabel.appendChild(hiddenId); + form.appendChild(document.createElement("br")); + form.appendChild(document.createElement("br")); + + //Create modal footer + var modalFooter = document.createElement("div"); + modalFooter.className = "modal-footer"; + modalCon.appendChild(modalFooter); + + var closeButton = document.createElement("button"); + closeButton.type = "button"; + closeButton.setAttribute("data-dismiss", "modal"); + closeButton.innerHTML = "Close"; + modalFooter.appendChild(closeButton); + //Oh my god finally done!!! } - form.appendChild(document.createElement("br")); - form.appendChild(document.createElement("br")); + }, + error: function (jqXHR, textStatus, errorThrown) { - //Image - var imageLabel = document.createElement("label"); - imageLabel.innerHTML = "Image"; - imageLabel.appendChild(document.createElement("br")); - form.appendChild(imageLabel); - var image = document.createElement("input"); - image.name = "image"; - image.type = "text"; - image.value = event.image; - image.id = "editImage-" + event.id; - imageLabel.appendChild(image); - form.appendChild(document.createElement("br")); - form.appendChild(document.createElement("br")); - - //ID (readonly) for API - var idLabel = document.createElement("label"); - idLabel.innerHTML = "Event ID"; - idLabel.appendChild(document.createElement("br")); - form.appendChild(idLabel); - var hiddenId = document.createElement("input"); - hiddenId.type = "text"; - hiddenId.name = "id"; - hiddenId.value = event.id; - hiddenId.id = "editId-" + event.id; - hiddenId.readOnly = true; - idLabel.appendChild(hiddenId); - form.appendChild(document.createElement("br")); - form.appendChild(document.createElement("br")); - - //Create modal footer - var modalFooter = document.createElement("div"); - modalFooter.className = "modal-footer"; - modalCon.appendChild(modalFooter); - - var closeButton = document.createElement("button"); - closeButton.type = "button"; - closeButton.setAttribute("data-dismiss", "modal"); - closeButton.innerHTML = "Close"; - modalFooter.appendChild(closeButton); - //Oh my god finally done!!! + showSnackbar("[ERROR] " + jqXHR.responseText); } - }) - .fail(function () { - showSnackbar("Our hippos failed to find your events for the day!"); - }, "json"); + }); } function selectDate(clickedId) { @@ -507,7 +531,9 @@ function selectDate(clickedId) { } } -function init() { +function init(guildId) { + calendar.guildId = parseInt(guildId); + setMonth({date: calendar.todaysDate}); getEventsForMonth();