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>
364 lines
9.8 KiB
JavaScript
364 lines
9.8 KiB
JavaScript
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");
|
|
});
|