From d67415da5edf804a2c8494ab779e145fe5bcef77 Mon Sep 17 00:00:00 2001 From: aravk Date: Wed, 22 Sep 2021 23:34:15 -0500 Subject: [PATCH] Add check for latest version Shows a message if the version of cheesecake is outdated --- src/static_include.rs | 7 +- static/scripts/main.js | 129 ++++----- static/scripts/main.js.map | 2 +- static/scripts/main.ts | 8 + static/scripts/reader.js | 536 ++++++++++++++++++------------------- static/styles/main.css | 2 +- static/styles/main.css.map | 2 +- static/styles/main.scss | 9 + templates/index.html.tera | 6 +- 9 files changed, 366 insertions(+), 335 deletions(-) diff --git a/src/static_include.rs b/src/static_include.rs index 8d6ce09..a5ec0b8 100644 --- a/src/static_include.rs +++ b/src/static_include.rs @@ -16,11 +16,16 @@ struct Assets; pub fn static_file<'r>(file: PathBuf) -> Result<(ContentType, Cow<'static, [u8]>), Status> { let filename = file.display().to_string(); let d = Assets::get(&filename).ok_or(Status::NotFound)?; - let ext = file + let mut ext = file .as_path() .extension() .and_then(OsStr::to_str) .ok_or(Status::InternalServerError)?; + // ContentType::from_extension normally returns None for map files, but they should be sent with + // the JSON mimetype + if ext == "map" { + ext = "json" + } let content_type = ContentType::from_extension(ext).ok_or(Status::InternalServerError)?; Ok((content_type, d.data)) } diff --git a/static/scripts/main.js b/static/scripts/main.js index 703e6bb..6cd9e65 100644 --- a/static/scripts/main.js +++ b/static/scripts/main.js @@ -1,63 +1,68 @@ -var $backup = $("#backup"); -function show_toast(message, duration) { - if (duration === void 0) { duration = 2000; } - $("#toast").text(message).slideDown(200, function () { - setTimeout(function () { - $("#toast").slideUp(200); - }, duration); - }); -} -function display_chats(backup) { - $("#chat").prop("outerHTML", ""); - $("label[for=\"chat\"]").text("Chat:"); - for (var i = 0; i < chats[backup].length; i++) { - var chat = chats[backup][i]; - $("#chat").append(""); - } -} -$("#chat_switcher").trigger("reset").on("submit", function (e) { - e.preventDefault(); - var $chat = $("#chat"); - if ($chat.is("input")) { - if ($chat.val()) { - document.cookie = "backup=" + $("#backup").val(); - $("#chat_switcher button") - .prop("disabled", true) - .text("decrypting..."); - $backup.prop("disabled", true); - $.post("/decrypt", { "password": $chat.val() }).done(function (result) { - console.log(result); - if (result.length) { - chats = initial_chats; - var backup = $backup.val(); - chats[backup] = result; - display_chats(backup); - show_toast("The backup will remain decrypted until you open a different backup or quit cheesecake", 5000); - } - else { - show_toast("No chats found. Is your password incorrect?"); - } - $backup.prop("disabled", false); - $("#chat_switcher button") - .text("proceed") - .prop("disabled", false); - }); - } - } - else { - document.cookie = "backup=" + $("#backup").val(); - document.cookie = "chat=" + $chat.val(); - location.href = "/reader"; - } -}); -$backup.on("change", function () { - var backup = $backup.val(); - if (!Object.keys(chats[backup]).length) { - $("#chat").prop("outerHTML", ""); - $("label[for=\"chat\"]").text("Password:"); - } - else { - display_chats(backup); - } -}); +$.getJSON("https://api.github.com/repos/cubetastic33/cheesecake/releases/latest", function (result) { + if (result["tag_name"] !== version) { + $("#outdated").show(); + } +}); +var $backup = $("#backup"); +function show_toast(message, duration) { + if (duration === void 0) { duration = 2000; } + $("#toast").text(message).slideDown(200, function () { + setTimeout(function () { + $("#toast").slideUp(200); + }, duration); + }); +} +function display_chats(backup) { + $("#chat").prop("outerHTML", ""); + $("label[for=\"chat\"]").text("Chat:"); + for (var i = 0; i < chats[backup].length; i++) { + var chat = chats[backup][i]; + $("#chat").append(""); + } +} +$("#chat_switcher").trigger("reset").on("submit", function (e) { + e.preventDefault(); + var $chat = $("#chat"); + if ($chat.is("input")) { + if ($chat.val()) { + document.cookie = "backup=" + $("#backup").val(); + $("#chat_switcher button") + .prop("disabled", true) + .text("decrypting..."); + $backup.prop("disabled", true); + $.post("/decrypt", { "password": $chat.val() }).done(function (result) { + console.log(result); + if (result.length) { + chats = initial_chats; + var backup = $backup.val(); + chats[backup] = result; + display_chats(backup); + show_toast("The backup will remain decrypted until you open a different backup or quit cheesecake", 5000); + } + else { + show_toast("No chats found. Is your password incorrect?"); + } + $backup.prop("disabled", false); + $("#chat_switcher button") + .text("proceed") + .prop("disabled", false); + }); + } + } + else { + document.cookie = "backup=" + $("#backup").val(); + document.cookie = "chat=" + $chat.val(); + location.href = "/reader"; + } +}); +$backup.on("change", function () { + var backup = $backup.val(); + if (!Object.keys(chats[backup]).length) { + $("#chat").prop("outerHTML", ""); + $("label[for=\"chat\"]").text("Password:"); + } + else { + display_chats(backup); + } +}); //# sourceMappingURL=main.js.map \ No newline at end of file diff --git a/static/scripts/main.js.map b/static/scripts/main.js.map index 3d75025..212d2f2 100644 --- a/static/scripts/main.js.map +++ b/static/scripts/main.js.map @@ -1 +1 @@ -{"version":3,"file":"main.js","sourceRoot":"","sources":["main.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"main.js","sourceRoot":"","sources":["main.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/static/scripts/main.ts b/static/scripts/main.ts index 9047cdf..4984dfe 100644 --- a/static/scripts/main.ts +++ b/static/scripts/main.ts @@ -1,6 +1,14 @@ +declare const version; declare const initial_chats; declare let chats; +// Check if cheesecake is up to date +$.getJSON("https://api.github.com/repos/cubetastic33/cheesecake/releases/latest", result => { + if (result["tag_name"] !== version) { + $("#outdated").show(); + } +}); + let $backup = $("#backup"); function show_toast(message, duration = 2000) { diff --git a/static/scripts/reader.js b/static/scripts/reader.js index 905d229..ac37a83 100644 --- a/static/scripts/reader.js +++ b/static/scripts/reader.js @@ -1,269 +1,269 @@ -var fetching = false; -var $messages = $("#messages"); -function scroll_to_bottom() { - $messages = $("#messages"); - $messages.scrollTop($messages.prop("scrollHeight")); - $("#messages .attachment").on("load", function () { - $messages[0].scrollBy(0, $(this).prop("scrollHeight")); - }); -} -scroll_to_bottom(); -function jump(channel_id, message_id) { - if (message_id === void 0) { message_id = undefined; } - if (fetching) - return; - fetching = true; - $.post("/jump", { - chat_id: channel_id, - message_id: message_id, - }).done(function (result) { - if (!result.name.length) { - show_toast("channel not found"); - fetching = false; - return; - } - if (channel_id) { - document.cookie = "chat=" + channel_id; - $("#chat").val(channel_id); - $("#chat_header .name").text(result.name); - $("#chat_header .topic").text(result.topic); - } - $messages.empty(); - display_messages(result.messages, true); - if (message_id) { - document.querySelector("[data-message-id=\"" + message_id + "\"]").scrollIntoView(); - } - else { - $messages.append("
Loading...
"); - $("#bottom_loading").hide(); - scroll_to_bottom(); - } - fetching = false; - }); -} -function init_handlers() { - $(".content a").off().on("click", function (e) { - var discord_link = this["href"].match(/^https?:\/\/(canary\.|ptb\.)?discord\.com\/channels\/\d+\/(\d+)\/(\d+)/i); - var matrix_link_ignore = this["href"].match(/https?:\/\/matrix\.to\/#\/@.*/i); - var matrix_link_message = this["href"].match(/https?:\/\/matrix\.to\/#\/(!.+:.+)\/(\$[^?]+)(\?.*)?/i); - if (discord_link) { - e.preventDefault(); - console.log(discord_link[2], discord_link[3]); - jump(discord_link[2], discord_link[3]); - } - else if (matrix_link_ignore) { - e.preventDefault(); - } - else if (matrix_link_message) { - e.preventDefault(); - jump(matrix_link_message[1], matrix_link_message[2]); - } - }); - $(".spoiler").off().on("click", function () { - $(this).addClass("opened"); - }); - $(".channel").off().on("click", function () { - jump($(this).attr("data-id")); - }); - $(".message.reply .parent").on("click", function () { - jump(undefined, $(this).attr("data-id")); - }); - $(".content .timestamp.clickable").off().on("click", show_edits); -} -init_handlers(); -function show_edits() { - var edits_list = JSON.parse(this.dataset.editsList); - var $ul = $("#edits_dialog ul"); - $ul.empty(); - for (var i = edits_list.length - 1; i >= 0; i--) { - $ul.append("
  • " + edits_list[i][1] + " (" + edits_list[i][0] + ")
  • "); - } - $(".overlay").show(); - $("#edits_dialog").show("slow"); -} -$("#edits_dialog button, .overlay").on("click", function () { - $("#edits_dialog").hide("slow", function () { return $(".overlay").hide(); }); -}); -function display_messages(messages, ascending) { - for (var i = 0; i < messages.length; i++) { - var message = messages[ascending ? i : messages.length - 1 - i]; - var html = void 0; - if (message.message_type === "day_separator") { - html = "
    \n
    \n
    " + message.content + "
    \n
    \n
    "; - } - else if (!message.separate) { - html = "
    \n
    \n
    \n
    " + message.content + "
    \n
    \n
    "; - } - else if (message.message_type === "redacted") { - html = "
    \n \"pfp\"\n
    [redacted]
    \n
    "; - } - else if (message.message_type === "default") { - var parent_1 = ""; - if (message.reference) { - var attachment_icon = ""; - parent_1 = "
    \n \"pfp\"\n " + message.reference[1] + "\n " + message.reference[4] + "\n " + (message.reference[5] ? attachment_icon : "") + "\n
    \n
    "; - } - html = "
    \n " + parent_1 + "\"pfp\"\n
    \n
    \n " + message.name + "\n " + message.created_timestamp + "\n " + (message.bot ? "BOT" : "") + "\n
    \n
    " + message.content + "
    \n
    " + (message.reference ? "
    " : "") + "\n
    "; - } - else if (message.message_type === "new_member") { - html = "
    \n
    \n \n
    \n
    \n
    " + message.content + "
    \n
    \n
    "; - } - else if (message.message_type === "pins_add") { - html = "
    \n
    \n \n
    \n
    \n
    " + message.content + "
    \n
    \n
    "; - } - else { - html = "
    \n
    \n
    \n
    " + message.content + "
    \n
    \n
    "; - } - if (ascending) { - $messages.append(html); - } - else { - $messages.prepend(html); - } - if (message.edited_timestamp) { - $("#messages .message:" + (ascending ? "last" : "first") + "-child div.content") - .append("
    (edited)
    "); - console.log("edits list:", message.edits_list); - if (message.edits_list.length) { - $("#messages .message:" + (ascending ? "last" : "first") + "-child div.content .timestamp") - .attr("data-edits-list", message.edits_list) - .addClass("clickable"); - } - } - for (var j = 0; j < message.attachments.length; j++) { - var attachment = message.attachments[j]; - var html_1 = ""; - if (attachment[2]) - html_1 += "
    "; - if (attachment[1] === "image") { - html_1 += "\"attachment\""; - } - else if (attachment[1] === "video") { - html_1 += ""; - } - else if (attachment[1] === "audio") { - html_1 += ""; - } - else { - html_1 += ""; - } - if (attachment[2]) - html_1 += "
    "; - $("#messages .message:" + (ascending ? "last" : "first") + "-child div.content").after(html_1); - } - if (message.reactions.length) { - var html_2 = "
    "; - for (var j = 0; j < message.reactions.length; j++) { - var reaction = message.reactions[j]; - if (reaction[1]) { - html_2 += "
    \n \""\n " + reaction[2] + "\n
    "; - } - else { - html_2 += "
    " + reaction[0] + " " + reaction[2] + "
    "; - } - } - html_2 += "
    "; - $("#messages .message:" + (ascending ? "last" : "first") + "-child > div:last-child").append(html_2); - } - } - init_handlers(); -} -$messages.on("scroll", function () { - if ($(this).scrollTop() === 0 && $("#top_loading").length === 0 && !fetching) { - fetching = true; - $messages.prepend("
    Loading...
    "); - var reference_message_1 = $("#messages .message")[0].id; - $.post("/messages", { sequential_id: reference_message_1, position: "above" }).done(function (result) { - var $top_loading = $("#top_loading"); - if (result.length === 0) { - fetching = false; - $top_loading.hide(); - return; - } - display_messages(result, false); - while ($("#messages .message:not(.day_separator)").length > 300) { - $("#bottom_loading").remove(); - $("#messages .message:last-child").remove(); - } - document.getElementById(reference_message_1).scrollIntoView(); - $top_loading.remove(); - fetching = false; - }); - } - else if ($messages.scrollTop() + $messages.prop("offsetHeight") >= $messages.prop("scrollHeight") && $("#bottom_loading").length === 0 && !fetching) { - fetching = true; - $messages.append("
    Loading...
    "); - $.post("/messages", { sequential_id: $("#messages .message:last")[0].id, position: "below" }).done(function (result) { - var $bottom_loading = $("#bottom_loading"); - if (result.length === 0) { - fetching = false; - $bottom_loading.hide(); - return; - } - display_messages(result, true); - while ($("#messages .message:not(.day_separator)").length > 300) { - $("#top_loading").remove(); - $("#messages .message:first-child").remove(); - } - $bottom_loading.remove(); - fetching = false; - }); - } -}); -$(window).on("keydown", function (e) { - if (e.ctrlKey && e.key === "f") { - e.preventDefault(); - $("#query").trigger("focus"); - } -}); -$("#search form").on("submit", function (e) { - e.preventDefault(); - var $search_button = $("#search form button"); - var $results = $("#results"); - var query = $("#query").val(); - $search_button.prop("disabled", true); - if (query.length === 0) { - $results.empty(); - $search_button.prop("disabled", false); - return; - } - $.post("/search", { string: query, filters: $("#filters").val() }).done(function (result) { - $results.empty(); - for (var i = 0; i < result.length; i++) { - var message = result[i]; - if (message.message_type !== "default") { - continue; - } - $results.prepend("\n
    \n \"pfp\"\n
    \n
    \n " + message.name + "\n " + message.created_timestamp + "\n
    \n
    " + message.content + "
    \n
    \n
    \n "); - for (var j = 0; j < message.attachments.length; j++) { - var attachment = message.attachments[j]; - if (attachment[1] === "image") { - $("#results .message[data-id=\"" + message.sequential_id + "\"] > div").append("\"attachment\""); - } - else if (attachment[1] === "video") { - $("#results .message[data-id=\"" + message.sequential_id + "\"] > div").append(""); - } - else if (attachment[1] === "audio") { - $("#results .message[data-id=\"" + message.sequential_id + "\"] > div").append(""); - } - } - } - $results.prepend("
    " + result.length + " result" + (result.length === 1 ? "" : "s") + "
    "); - $search_button.prop("disabled", false); - $("#results").scrollTop(0); - $("#results .message").on("click", function () { - var clicked = $(this).attr("data-id"); - $.post("/messages", { sequential_id: $(this).attr("data-id"), position: "around" }).done(function (result) { - $messages.empty(); - display_messages(result, true); - document.getElementById(clicked).scrollIntoView(); - $("#top_loading, #bottom_loading").remove(); - }); - }); - }).fail(function (error) { - $search_button.prop("disabled", false); - console.log(error); - $("#results").html("
    " + error.statusText + "
    "); - }); -}); +var fetching = false; +var $messages = $("#messages"); +function scroll_to_bottom() { + $messages = $("#messages"); + $messages.scrollTop($messages.prop("scrollHeight")); + $("#messages .attachment").on("load", function () { + $messages[0].scrollBy(0, $(this).prop("scrollHeight")); + }); +} +scroll_to_bottom(); +function jump(channel_id, message_id) { + if (message_id === void 0) { message_id = undefined; } + if (fetching) + return; + fetching = true; + $.post("/jump", { + chat_id: channel_id, + message_id: message_id, + }).done(function (result) { + if (!result.name.length) { + show_toast("channel not found"); + fetching = false; + return; + } + if (channel_id) { + document.cookie = "chat=" + channel_id; + $("#chat").val(channel_id); + $("#chat_header .name").text(result.name); + $("#chat_header .topic").text(result.topic); + } + $messages.empty(); + display_messages(result.messages, true); + if (message_id) { + document.querySelector("[data-message-id=\"" + message_id + "\"]").scrollIntoView(); + } + else { + $messages.append("
    Loading...
    "); + $("#bottom_loading").hide(); + scroll_to_bottom(); + } + fetching = false; + }); +} +function init_handlers() { + $(".content a").off().on("click", function (e) { + var discord_link = this["href"].match(/^https?:\/\/(canary\.|ptb\.)?discord\.com\/channels\/\d+\/(\d+)\/(\d+)/i); + var matrix_link_ignore = this["href"].match(/https?:\/\/matrix\.to\/#\/@.*/i); + var matrix_link_message = this["href"].match(/https?:\/\/matrix\.to\/#\/(!.+:.+)\/(\$[^?]+)(\?.*)?/i); + if (discord_link) { + e.preventDefault(); + console.log(discord_link[2], discord_link[3]); + jump(discord_link[2], discord_link[3]); + } + else if (matrix_link_ignore) { + e.preventDefault(); + } + else if (matrix_link_message) { + e.preventDefault(); + jump(matrix_link_message[1], matrix_link_message[2]); + } + }); + $(".spoiler").off().on("click", function () { + $(this).addClass("opened"); + }); + $(".channel").off().on("click", function () { + jump($(this).attr("data-id")); + }); + $(".message.reply .parent").on("click", function () { + jump(undefined, $(this).attr("data-id")); + }); + $(".content .timestamp.clickable").off().on("click", show_edits); +} +init_handlers(); +function show_edits() { + var edits_list = JSON.parse(this.dataset.editsList); + var $ul = $("#edits_dialog ul"); + $ul.empty(); + for (var i = edits_list.length - 1; i >= 0; i--) { + $ul.append("
  • " + edits_list[i][1] + " (" + edits_list[i][0] + ")
  • "); + } + $(".overlay").show(); + $("#edits_dialog").show("slow"); +} +$("#edits_dialog button, .overlay").on("click", function () { + $("#edits_dialog").hide("slow", function () { return $(".overlay").hide(); }); +}); +function display_messages(messages, ascending) { + for (var i = 0; i < messages.length; i++) { + var message = messages[ascending ? i : messages.length - 1 - i]; + var html = void 0; + if (message.message_type === "day_separator") { + html = "
    \n
    \n
    " + message.content + "
    \n
    \n
    "; + } + else if (!message.separate) { + html = "
    \n
    \n
    \n
    " + message.content + "
    \n
    \n
    "; + } + else if (message.message_type === "redacted") { + html = "
    \n \"pfp\"\n
    [redacted]
    \n
    "; + } + else if (message.message_type === "default") { + var parent_1 = ""; + if (message.reference) { + var attachment_icon = ""; + parent_1 = "
    \n \"pfp\"\n " + message.reference[1] + "\n " + message.reference[4] + "\n " + (message.reference[5] ? attachment_icon : "") + "\n
    \n
    "; + } + html = "
    \n " + parent_1 + "\"pfp\"\n
    \n
    \n " + message.name + "\n " + message.created_timestamp + "\n " + (message.bot ? "BOT" : "") + "\n
    \n
    " + message.content + "
    \n
    " + (message.reference ? "
    " : "") + "\n
    "; + } + else if (message.message_type === "new_member") { + html = "
    \n
    \n \n
    \n
    \n
    " + message.content + "
    \n
    \n
    "; + } + else if (message.message_type === "pins_add") { + html = "
    \n
    \n \n
    \n
    \n
    " + message.content + "
    \n
    \n
    "; + } + else { + html = "
    \n
    \n
    \n
    " + message.content + "
    \n
    \n
    "; + } + if (ascending) { + $messages.append(html); + } + else { + $messages.prepend(html); + } + if (message.edited_timestamp) { + $("#messages .message:" + (ascending ? "last" : "first") + "-child div.content") + .append("
    (edited)
    "); + console.log("edits list:", message.edits_list); + if (message.edits_list.length) { + $("#messages .message:" + (ascending ? "last" : "first") + "-child div.content .timestamp") + .attr("data-edits-list", message.edits_list) + .addClass("clickable"); + } + } + for (var j = 0; j < message.attachments.length; j++) { + var attachment = message.attachments[j]; + var html_1 = ""; + if (attachment[2]) + html_1 += "
    "; + if (attachment[1] === "image") { + html_1 += "\"attachment\""; + } + else if (attachment[1] === "video") { + html_1 += ""; + } + else if (attachment[1] === "audio") { + html_1 += ""; + } + else { + html_1 += ""; + } + if (attachment[2]) + html_1 += "
    "; + $("#messages .message:" + (ascending ? "last" : "first") + "-child div.content").after(html_1); + } + if (message.reactions.length) { + var html_2 = "
    "; + for (var j = 0; j < message.reactions.length; j++) { + var reaction = message.reactions[j]; + if (reaction[1]) { + html_2 += "
    \n \""\n " + reaction[2] + "\n
    "; + } + else { + html_2 += "
    " + reaction[0] + " " + reaction[2] + "
    "; + } + } + html_2 += "
    "; + $("#messages .message:" + (ascending ? "last" : "first") + "-child > div:last-child").append(html_2); + } + } + init_handlers(); +} +$messages.on("scroll", function () { + if ($(this).scrollTop() === 0 && $("#top_loading").length === 0 && !fetching) { + fetching = true; + $messages.prepend("
    Loading...
    "); + var reference_message_1 = $("#messages .message")[0].id; + $.post("/messages", { sequential_id: reference_message_1, position: "above" }).done(function (result) { + var $top_loading = $("#top_loading"); + if (result.length === 0) { + fetching = false; + $top_loading.hide(); + return; + } + display_messages(result, false); + while ($("#messages .message:not(.day_separator)").length > 300) { + $("#bottom_loading").remove(); + $("#messages .message:last-child").remove(); + } + document.getElementById(reference_message_1).scrollIntoView(); + $top_loading.remove(); + fetching = false; + }); + } + else if ($messages.scrollTop() + $messages.prop("offsetHeight") >= $messages.prop("scrollHeight") && $("#bottom_loading").length === 0 && !fetching) { + fetching = true; + $messages.append("
    Loading...
    "); + $.post("/messages", { sequential_id: $("#messages .message:last")[0].id, position: "below" }).done(function (result) { + var $bottom_loading = $("#bottom_loading"); + if (result.length === 0) { + fetching = false; + $bottom_loading.hide(); + return; + } + display_messages(result, true); + while ($("#messages .message:not(.day_separator)").length > 300) { + $("#top_loading").remove(); + $("#messages .message:first-child").remove(); + } + $bottom_loading.remove(); + fetching = false; + }); + } +}); +$(window).on("keydown", function (e) { + if (e.ctrlKey && e.key === "f") { + e.preventDefault(); + $("#query").trigger("focus"); + } +}); +$("#search form").on("submit", function (e) { + e.preventDefault(); + var $search_button = $("#search form button"); + var $results = $("#results"); + var query = $("#query").val(); + $search_button.prop("disabled", true); + if (query.length === 0) { + $results.empty(); + $search_button.prop("disabled", false); + return; + } + $.post("/search", { string: query, filters: $("#filters").val() }).done(function (result) { + $results.empty(); + for (var i = 0; i < result.length; i++) { + var message = result[i]; + if (message.message_type !== "default") { + continue; + } + $results.prepend("\n
    \n \"pfp\"\n
    \n
    \n " + message.name + "\n " + message.created_timestamp + "\n
    \n
    " + message.content + "
    \n
    \n
    \n "); + for (var j = 0; j < message.attachments.length; j++) { + var attachment = message.attachments[j]; + if (attachment[1] === "image") { + $("#results .message[data-id=\"" + message.sequential_id + "\"] > div").append("\"attachment\""); + } + else if (attachment[1] === "video") { + $("#results .message[data-id=\"" + message.sequential_id + "\"] > div").append(""); + } + else if (attachment[1] === "audio") { + $("#results .message[data-id=\"" + message.sequential_id + "\"] > div").append(""); + } + } + } + $results.prepend("
    " + result.length + " result" + (result.length === 1 ? "" : "s") + "
    "); + $search_button.prop("disabled", false); + $("#results").scrollTop(0); + $("#results .message").on("click", function () { + var clicked = $(this).attr("data-id"); + $.post("/messages", { sequential_id: $(this).attr("data-id"), position: "around" }).done(function (result) { + $messages.empty(); + display_messages(result, true); + document.getElementById(clicked).scrollIntoView(); + $("#top_loading, #bottom_loading").remove(); + }); + }); + }).fail(function (error) { + $search_button.prop("disabled", false); + console.log(error); + $("#results").html("
    " + error.statusText + "
    "); + }); +}); //# sourceMappingURL=reader.js.map \ No newline at end of file diff --git a/static/styles/main.css b/static/styles/main.css index b166266..84b4694 100644 --- a/static/styles/main.css +++ b/static/styles/main.css @@ -1 +1 @@ -@media(prefers-color-scheme: dark){:root{--background: #212121;--background-darker: #181818;--background-hover: #1a1a1a;--foreground: #fff;--accent: #d81b60;--accent-hover: #c2185b}}@media(prefers-color-scheme: light){:root{--background: #fff;--background-darker: #afafaf;--background-hover: #efefef;--foreground: #000;--accent: #d81b60;--accent-hover: #f11e73}}@font-face{font-family:"Source Sans Pro";src:url(/fonts/SourceSansPro-Regular.ttf);font-display:swap}body{background-color:var(--background);color:var(--foreground);display:flex;flex-direction:column;font-family:"Source Sans Pro",sans-serif;height:100vh;margin:0;align-items:center;justify-content:center}body>*{padding:5vh 0}#toast{display:none;background-color:#111;border-radius:3px 3px 0 0;box-shadow:0px 0px 6px 2px #0f0f0f;color:#fff;padding:.5rem .75rem;position:fixed;left:50%;bottom:0;transform:translate(-50%, 0);z-index:10}h1{margin:0}form>div{display:grid;grid-template-columns:repeat(2, min-content);gap:.5em 1em}select{background:transparent;border:solid var(--foreground);border-width:0 0 1px 0;color:var(--foreground);max-width:250px;padding:2px 1px}select:focus{border-color:var(--accent);border-bottom-width:2px;padding-bottom:1px}input[type=password]{background:none;color:var(--foreground);border:1px solid var(--foreground);border-radius:4px;font-size:.7em;padding:.25rem .5rem}input[type=password]:focus{outline:none;border-color:var(--accent);border-width:2px;padding:calc(.25rem - 1px) calc(.5rem - 1px)}button{appearance:none;background-color:var(--accent);border:none;border-radius:4px;color:#fff;cursor:pointer;display:block;margin:10vh auto 0 auto;padding:.5em 1em}button:disabled{cursor:default;opacity:.75}button:not(:disabled):hover{background-color:var(--accent-hover)}footer{opacity:.8}/*# sourceMappingURL=main.css.map */ +@media(prefers-color-scheme: dark){:root{--background: #212121;--background-darker: #181818;--background-hover: #1a1a1a;--foreground: #fff;--accent: #d81b60;--accent-hover: #c2185b}}@media(prefers-color-scheme: light){:root{--background: #fff;--background-darker: #afafaf;--background-hover: #efefef;--foreground: #000;--accent: #d81b60;--accent-hover: #f11e73}}@font-face{font-family:"Source Sans Pro";src:url(/fonts/SourceSansPro-Regular.ttf);font-display:swap}body{background-color:var(--background);color:var(--foreground);display:flex;flex-direction:column;font-family:"Source Sans Pro",sans-serif;height:100vh;margin:0;align-items:center;justify-content:center}body>*{padding:5vh 0}#toast{display:none;background-color:#111;border-radius:3px 3px 0 0;box-shadow:0px 0px 6px 2px #0f0f0f;color:#fff;padding:.5rem .75rem;position:fixed;left:50%;bottom:0;transform:translate(-50%, 0);z-index:10}h1{margin:0}form>div{display:grid;grid-template-columns:repeat(2, min-content);gap:.5em 1em}select{background:transparent;border:solid var(--foreground);border-width:0 0 1px 0;color:var(--foreground);max-width:250px;padding:2px 1px}select:focus{border-color:var(--accent);border-bottom-width:2px;padding-bottom:1px}input[type=password]{background:none;color:var(--foreground);border:1px solid var(--foreground);border-radius:4px;font-size:.7em;padding:.25rem .5rem}input[type=password]:focus{outline:none;border-color:var(--accent);border-width:2px;padding:calc(.25rem - 1px) calc(.5rem - 1px)}button{appearance:none;background-color:var(--accent);border:none;border-radius:4px;color:#fff;cursor:pointer;display:block;margin:10vh auto 0 auto;padding:.5em 1em}button:disabled{cursor:default;opacity:.75}button:not(:disabled):hover{background-color:var(--accent-hover)}footer{text-align:center;opacity:.8}footer #outdated{display:none}footer a{color:var(--accent)}/*# sourceMappingURL=main.css.map */ diff --git a/static/styles/main.css.map b/static/styles/main.css.map index d8f4acb..6531cc9 100644 --- a/static/styles/main.css.map +++ b/static/styles/main.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["main.scss"],"names":[],"mappings":"AAqBA,mCACI,MAlBI,sBACA,6BACA,4BACA,mBACA,kBACA,yBAmBR,oCACI,MAlBI,mBACA,6BACA,4BACA,mBACA,kBACA,yBAoBR,WACI,8BACA,0CACA,kBAKJ,KACI,mCACA,wBACA,aACA,sBACA,yCACA,aACA,SACA,mBACA,uBAGJ,OACI,cAGJ,OACI,aACA,sBACA,0BACA,mCACA,WACA,qBACA,eACA,SACA,SACA,6BACA,WAGJ,GACI,SAGJ,SACI,aACA,6CACA,aAGJ,OACI,uBACA,+BACA,uBACA,wBACA,gBACA,gBAGJ,aACI,2BACA,wBACA,mBAGJ,qBACI,gBACA,wBACA,mCACA,kBACA,eACA,qBAGJ,2BACI,aACA,2BACA,iBACA,6CAGJ,OACI,gBACA,+BACA,YACA,kBACA,WACA,eACA,cACA,wBACA,iBAGJ,gBACI,eACA,YAGJ,4BACI,qCAGJ,OACI","file":"main.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["main.scss"],"names":[],"mappings":"AAqBA,mCACI,MAlBI,sBACA,6BACA,4BACA,mBACA,kBACA,yBAmBR,oCACI,MAlBI,mBACA,6BACA,4BACA,mBACA,kBACA,yBAoBR,WACI,8BACA,0CACA,kBAKJ,KACI,mCACA,wBACA,aACA,sBACA,yCACA,aACA,SACA,mBACA,uBAGJ,OACI,cAGJ,OACI,aACA,sBACA,0BACA,mCACA,WACA,qBACA,eACA,SACA,SACA,6BACA,WAGJ,GACI,SAGJ,SACI,aACA,6CACA,aAGJ,OACI,uBACA,+BACA,uBACA,wBACA,gBACA,gBAGJ,aACI,2BACA,wBACA,mBAGJ,qBACI,gBACA,wBACA,mCACA,kBACA,eACA,qBAGJ,2BACI,aACA,2BACA,iBACA,6CAGJ,OACI,gBACA,+BACA,YACA,kBACA,WACA,eACA,cACA,wBACA,iBAGJ,gBACI,eACA,YAGJ,4BACI,qCAGJ,OACI,kBACA,WAEA,iBACI,aAGJ,SACI","file":"main.css"} \ No newline at end of file diff --git a/static/styles/main.scss b/static/styles/main.scss index 5dd6c2b..5308ded 100644 --- a/static/styles/main.scss +++ b/static/styles/main.scss @@ -135,5 +135,14 @@ button:not(:disabled):hover { } footer { + text-align: center; opacity: .8; + + #outdated { + display: none; + } + + a { + color: var(--accent); + } } diff --git a/templates/index.html.tera b/templates/index.html.tera index b0db761..39546ac 100644 --- a/templates/index.html.tera +++ b/templates/index.html.tera @@ -37,11 +37,15 @@ {% endif %}