docs: add reference Python/Flask implementation
Previous version of Tanabata used as visual and functional reference for the new Go + SvelteKit rewrite. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,363 @@
|
||||
var lazy_loader;
|
||||
|
||||
function escapeHTML(unsafe) {
|
||||
return unsafe
|
||||
.replace(/&/g, "&")
|
||||
.replace(/</g, "<")
|
||||
.replace(/>/g, ">")
|
||||
.replace(/"/g, """)
|
||||
.replace(/'/g, "'");
|
||||
}
|
||||
|
||||
function beautify_date(date_string) {
|
||||
if (date_string == null) {
|
||||
return null;
|
||||
}
|
||||
let ts = new Date(date_string).getTime();
|
||||
let tz = new Date().getTimezoneOffset();
|
||||
return new Date(ts-tz*60000).toISOString().slice(0, 19).replace("T", " ");
|
||||
}
|
||||
|
||||
function close_select_manager() {
|
||||
$(".item-selected").removeClass("item-selected");
|
||||
$(".selection-manager").css("display", "none");
|
||||
$("#selection-count").text(0);
|
||||
$("main").css("padding-bottom", "");
|
||||
$("#selection-tags-other > .tag-preview").css("display", "");
|
||||
$("#selection-tags-selected > .tag-preview").css("display", "none");
|
||||
$("#selection-tags-filter").val("").trigger("input");
|
||||
$(".selection-tags").css("display", "none");
|
||||
}
|
||||
|
||||
function refresh_selection_tags() {
|
||||
$("#loader").css("display", "");
|
||||
let file_id_list = [];
|
||||
$("main > .file-preview.item-selected").each((index, element) => {
|
||||
file_id_list.push($(element).attr("file_id"));
|
||||
});
|
||||
$("#selection-tags-other > .tag-preview").css("display", "");
|
||||
$("#selection-tags-selected > .tag-preview").css("display", "none");
|
||||
$.ajax({
|
||||
url: location.pathname + "/tags",
|
||||
type: "POST",
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify({action: "get", file_id_list: file_id_list}),
|
||||
dataType: "json",
|
||||
success: function (resp) {
|
||||
$("#loader").css("display", "none");
|
||||
if (resp.status) {
|
||||
resp.tag_id_list.forEach((tag_id) => {
|
||||
$(`#selection-tags-other > .tag-preview[tag_id='${tag_id}']`).css("display", "none");
|
||||
$(`#selection-tags-selected > .tag-preview[tag_id='${tag_id}']`).css("display", "");
|
||||
});
|
||||
} else {
|
||||
alert(resp.error);
|
||||
}
|
||||
},
|
||||
failure: function (err) {
|
||||
$("#loader").css("display", "none");
|
||||
alert(err);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function select_handler(curr) {
|
||||
let selection_count = +$("#selection-count").text();
|
||||
if (curr.hasClass("item-selected")) {
|
||||
curr.removeClass("item-selected");
|
||||
selection_count--;
|
||||
$("#selection-count").text(selection_count);
|
||||
if (!selection_count) {
|
||||
close_select_manager();
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
curr.addClass("item-selected");
|
||||
$(".selection-manager").css("display", "");
|
||||
$("main").css("padding-bottom", "80px");
|
||||
selection_count++;
|
||||
$("#selection-count").text(selection_count);
|
||||
}
|
||||
refresh_selection_tags();
|
||||
}
|
||||
|
||||
// $(window).on("load", function () {
|
||||
// lazy_loader = $(".file-thumb").Lazy({
|
||||
// scrollDirection: "vertical",
|
||||
// effect: "fadeIn",
|
||||
// visibleOnly: true,
|
||||
// appendScroll: $("main")[0],
|
||||
// chainable: false,
|
||||
// });
|
||||
// });
|
||||
|
||||
$(document).keyup(function (e) {
|
||||
switch (e.key) {
|
||||
case "Esc":
|
||||
case "Escape":
|
||||
close_select_manager();
|
||||
break;
|
||||
// case "Left":
|
||||
// case "ArrowLeft":
|
||||
// if (current_sasa_index >= 0) {
|
||||
// file_prev();
|
||||
// }
|
||||
// break;
|
||||
// case "Right":
|
||||
// case "ArrowRight":
|
||||
// if (current_sasa_index >= 0) {
|
||||
// file_next();
|
||||
// }
|
||||
// break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
});
|
||||
|
||||
$(document).on("selectstart", ".item-preview", function (e) {
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
$(document).on("click", "#select", function (e) {
|
||||
if ($(".selection-manager").is(":visible")) {
|
||||
close_select_manager();
|
||||
return;
|
||||
}
|
||||
$(".selection-manager").css("display", "");
|
||||
$("main").css("padding-bottom", "80px");
|
||||
selection_count++;
|
||||
$("#selection-count").text(selection_count);
|
||||
});
|
||||
|
||||
$(document).on("click", "main > .file-preview", function (e) {
|
||||
e.preventDefault();
|
||||
if ($(".selection-manager").is(":visible")) {
|
||||
select_handler($(this));
|
||||
return;
|
||||
}
|
||||
let id = $(this).attr("file_id");
|
||||
$("#viewer").attr("src", "/files/" + id);
|
||||
$("#view-prev").attr("file_id", $(this).prev(":visible").attr("file_id"));
|
||||
$("#view-next").attr("file_id", $(this).next(":visible").attr("file_id"));
|
||||
$(".viewer-wrapper").css("display", "");
|
||||
});
|
||||
|
||||
$(document).on("click", "main > .tag-preview", function (e) {
|
||||
e.preventDefault();
|
||||
if ($(".selection-manager").is(":visible")) {
|
||||
select_handler($(this));
|
||||
return;
|
||||
}
|
||||
let id = $(this).attr("tag_id");
|
||||
location.href = "/tags/" + id;
|
||||
});
|
||||
|
||||
$(document).on("click", "main > .category-preview", function (e) {
|
||||
e.preventDefault();
|
||||
if ($(".selection-manager").is(":visible")) {
|
||||
select_handler($(this));
|
||||
return;
|
||||
}
|
||||
let id = $(this).attr("category_id");
|
||||
location.href = "/categories/" + id;
|
||||
});
|
||||
|
||||
$(document).on("click", "#sorting", function (e) {
|
||||
$("#sorting-options").slideToggle("fast");
|
||||
if ($("#sorting-options").is(":visible")) {
|
||||
key_prev = $("input[name='sorting'][prev-checked]").val();
|
||||
key_curr = $("input[name='sorting']:checked").val();
|
||||
asc_prev = $("input[name='order'][prev-checked]").val();
|
||||
asc_curr = $("input[name='order']:checked").val();
|
||||
if (key_curr != key_prev || asc_curr != asc_prev) {
|
||||
$.ajax({
|
||||
url: "/settings/sorting",
|
||||
type: "POST",
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify({[location.pathname.split('/')[1]]: {key: key_curr, asc: (asc_curr == "asc")}}),
|
||||
dataType: "json",
|
||||
success: function (resp) {
|
||||
if (resp.status) {
|
||||
location.reload();
|
||||
} else {
|
||||
alert(resp.error);
|
||||
}
|
||||
},
|
||||
failure: function (err) {
|
||||
alert(err);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$(document).on("input", "#filter", function (e) {
|
||||
let filter = $(this).val().toLowerCase();
|
||||
let unfiltered = $("main > .item-preview");
|
||||
if (filter === "") {
|
||||
unfiltered.css("display", "");
|
||||
return;
|
||||
}
|
||||
unfiltered.each((index, element) => {
|
||||
let current = $(element);
|
||||
if (current.text().toLowerCase().includes(filter)) {
|
||||
current.css("display", "");
|
||||
} else {
|
||||
current.css("display", "none");
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$(document).on("click", ".filtering", function (e) {
|
||||
$(this).val("").trigger("input");
|
||||
})
|
||||
|
||||
$(document).on("click", "#selection-info", function (e) {
|
||||
close_select_manager();
|
||||
});
|
||||
|
||||
$(document).on("click", "#selection-edit-tags", function (e) {
|
||||
$(".selection-tags").slideToggle("fast");
|
||||
});
|
||||
|
||||
$(document).on("click", "#selection-delete", function (e) {
|
||||
if (!confirm("Delete selected?")) {
|
||||
return;
|
||||
}
|
||||
let file_id_list = [];
|
||||
$("main > .file-preview.item-selected").each((index, element) => {
|
||||
file_id_list.push($(element).attr("file_id"));
|
||||
});
|
||||
$.ajax({
|
||||
url: location.pathname + "/delete",
|
||||
type: "POST",
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify({file_id_list: file_id_list}),
|
||||
dataType: "json",
|
||||
success: function (resp) {
|
||||
$("#loader").css("display", "none");
|
||||
if (resp.status) {
|
||||
location.reload();
|
||||
} else {
|
||||
alert(resp.error);
|
||||
}
|
||||
},
|
||||
failure: function (err) {
|
||||
$("#loader").css("display", "none");
|
||||
alert(err);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$(document).on("click", "#selection-tags-other > .tag-preview", function (e) {
|
||||
$("#loader").css("display", "");
|
||||
let tag_id = $(this).attr("tag_id");
|
||||
let file_id_list = [];
|
||||
$("main > .file-preview.item-selected").each((index, element) => {
|
||||
file_id_list.push($(element).attr("file_id"));
|
||||
});
|
||||
$.ajax({
|
||||
url: location.pathname + "/tags",
|
||||
type: "POST",
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify({action: "add", file_id_list: file_id_list, tag_id: tag_id}),
|
||||
dataType: "json",
|
||||
success: function (resp) {
|
||||
$("#loader").css("display", "none");
|
||||
if (resp.status) {
|
||||
resp.tag_id_list.forEach((tag_id) => {
|
||||
$(`#selection-tags-other > .tag-preview[tag_id='${tag_id}']`).css("display", "none");
|
||||
$(`#selection-tags-selected > .tag-preview[tag_id='${tag_id}']`).css("display", "");
|
||||
});
|
||||
} else {
|
||||
alert(resp.error);
|
||||
}
|
||||
},
|
||||
failure: function (err) {
|
||||
$("#loader").css("display", "none");
|
||||
alert(err);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$(document).on("click", "#selection-tags-selected > .tag-preview", function (e) {
|
||||
$("#loader").css("display", "");
|
||||
let tag_id = $(this).attr("tag_id");
|
||||
let file_id_list = [];
|
||||
$("main > .file-preview.item-selected").each((index, element) => {
|
||||
file_id_list.push($(element).attr("file_id"));
|
||||
});
|
||||
$.ajax({
|
||||
url: location.pathname + "/tags",
|
||||
type: "POST",
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify({action: "remove", file_id_list: file_id_list, tag_id: tag_id}),
|
||||
dataType: "json",
|
||||
success: function (resp) {
|
||||
$("#loader").css("display", "none");
|
||||
if (resp.status) {
|
||||
$(`#selection-tags-selected > .tag-preview[tag_id='${tag_id}']`).css("display", "none");
|
||||
$(`#selection-tags-other > .tag-preview[tag_id='${tag_id}']`).css("display", "");
|
||||
} else {
|
||||
alert(resp.error);
|
||||
}
|
||||
},
|
||||
failure: function (err) {
|
||||
$("#loader").css("display", "none");
|
||||
alert(err);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$(document).on("input", "#selection-tags-filter", function (e) {
|
||||
let filter = $(this).val().toLowerCase();
|
||||
let unfiltered = $("#selection-tags-other > .item-preview");
|
||||
if (filter === "") {
|
||||
unfiltered.css("display", "");
|
||||
return;
|
||||
}
|
||||
unfiltered.each((index, element) => {
|
||||
let current = $(element);
|
||||
if (current.text().toLowerCase().includes(filter)) {
|
||||
current.css("display", "");
|
||||
} else {
|
||||
current.css("display", "none");
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$(document).on("scroll", $("#viewer").contents(), function (e) {
|
||||
let pos = $(this).scrollTop();
|
||||
$(window.parent.document).find(".viewer-nav").css({
|
||||
top: (-pos) + "px",
|
||||
bottom: pos + "px"
|
||||
});
|
||||
});
|
||||
|
||||
$(document).on("click", "#view-next", function (e) {
|
||||
let id = $(this).attr("file_id");
|
||||
if (!id) {
|
||||
return;
|
||||
}
|
||||
let curr = $(`.file-preview[file_id='${id}']`)
|
||||
$("#viewer").attr("src", "/files/" + id);
|
||||
$("#view-prev").attr("file_id", curr.prev(":visible").attr("file_id"));
|
||||
$("#view-next").attr("file_id", curr.next(":visible").attr("file_id"));
|
||||
$(".viewer-wrapper").css("display", "");
|
||||
});
|
||||
|
||||
$(document).on("click", "#view-prev", function (e) {
|
||||
let id = $(this).attr("file_id");
|
||||
if (!id) {
|
||||
return;
|
||||
}
|
||||
let curr = $(`.file-preview[file_id='${id}']`)
|
||||
$("#viewer").attr("src", "/files/" + id);
|
||||
$("#view-prev").attr("file_id", curr.prev(":visible").attr("file_id"));
|
||||
$("#view-next").attr("file_id", curr.next(":visible").attr("file_id"));
|
||||
$(".viewer-wrapper").css("display", "");
|
||||
});
|
||||
|
||||
$(document).on("click", "#view-close", function (e) {
|
||||
$(".viewer-wrapper").css("display", "none");
|
||||
});
|
||||
Reference in New Issue
Block a user