mirror of
https://github.com/Eggbertx/gochan.git
synced 2025-08-03 23:56:22 -07:00
Only use post previews/inline expansion if enabled
This commit is contained in:
parent
d376cfab8b
commit
fc7facc5f8
5 changed files with 153 additions and 125 deletions
|
@ -1,11 +1,11 @@
|
||||||
import { opRegex } from "./vars";
|
import { opRegex } from "./vars";
|
||||||
import "jquery-ui-dist/jquery-ui";
|
import "jquery-ui-dist/jquery-ui";
|
||||||
|
|
||||||
import { handleActions, handleKeydown } from "./boardevents";
|
import { handleKeydown } from "./boardevents";
|
||||||
import { initCookies } from "./cookies";
|
import { initCookies } from "./cookies";
|
||||||
import { initStaff, createStaffMenu } from "./manage";
|
import { initStaff, createStaffMenu } from "./manage";
|
||||||
// import { notify } from './notifications';
|
// import { notify } from './notifications';
|
||||||
import { currentBoard, prepareThumbnails, preparePostPreviews, deletePost, hidePost, reportPost } from "./postutil";
|
import { prepareThumbnails, initPostPreviews, getPageThread, addPostDropdown } from "./postutil";
|
||||||
import { initSettings } from "./settings";
|
import { initSettings } from "./settings";
|
||||||
import { initTopBar, TopBarButton } from "./topbar";
|
import { initTopBar, TopBarButton } from "./topbar";
|
||||||
import { initQR } from "./qr";
|
import { initQR } from "./qr";
|
||||||
|
@ -31,21 +31,6 @@ export function changePage(sel) {
|
||||||
window.location = webroot + info.board + "/res/" + info.op + "p" + sel.value + ".html";
|
window.location = webroot + info.board + "/res/" + info.op + "p" + sel.value + ".html";
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getPageThread() {
|
|
||||||
let arr = opRegex.exec(window.location.pathname);
|
|
||||||
let info = {
|
|
||||||
board: currentBoard(),
|
|
||||||
boardID: -1,
|
|
||||||
op: -1,
|
|
||||||
page: 0
|
|
||||||
};
|
|
||||||
if(arr == null) return info;
|
|
||||||
if(arr.length > 1) info.op = arr[1];
|
|
||||||
if(arr.length > 3) info.page = arr[3];
|
|
||||||
if(arr.board != "") info.boardID = $("form#postform input[name=boardid]").val() -1;
|
|
||||||
return info;
|
|
||||||
}
|
|
||||||
|
|
||||||
$(() => {
|
$(() => {
|
||||||
let pageThread = getPageThread();
|
let pageThread = getPageThread();
|
||||||
let style = getStorageVal("style", defaultStyle)
|
let style = getStorageVal("style", defaultStyle)
|
||||||
|
@ -70,52 +55,13 @@ $(() => {
|
||||||
|
|
||||||
if(pageThread.board != "") {
|
if(pageThread.board != "") {
|
||||||
prepareThumbnails();
|
prepareThumbnails();
|
||||||
if(getBooleanStorageVal("useqr", true)) initQR(pageThread);
|
if(getBooleanStorageVal("useqr", true))
|
||||||
|
initQR(pageThread);
|
||||||
|
initPostPreviews();
|
||||||
}
|
}
|
||||||
|
|
||||||
preparePostPreviews(false);
|
$("div.post, div.reply").each((i, elem) => {
|
||||||
$("plus").on("click", function() {
|
addPostDropdown($(elem));
|
||||||
let block = $(this).parent().next();
|
|
||||||
if(block.css("display") == "none") {
|
|
||||||
block.show();
|
|
||||||
$(this).html("-");
|
|
||||||
} else {
|
|
||||||
block.hide();
|
|
||||||
$(this).html("+");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
let $postInfo = $("label.post-info");
|
|
||||||
$postInfo.each((i, elem) => {
|
|
||||||
let $elem = $(elem);
|
|
||||||
let isOP = $elem.parents("div.reply-container").length == 0;
|
|
||||||
let hasUpload = $elem.siblings("div.file-info").length > 0;
|
|
||||||
let postID = $elem.parent().attr("id");
|
|
||||||
let threadPost = isOP?"thread":"post";
|
|
||||||
|
|
||||||
let $ddownMenu = $("<select />", {
|
|
||||||
class: "post-actions",
|
|
||||||
id: postID
|
|
||||||
}).append(
|
|
||||||
"<option disabled selected>Actions</option>",
|
|
||||||
);
|
|
||||||
if(isOP) {
|
|
||||||
$ddownMenu.append(
|
|
||||||
"<option>Watch thread</option>"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
$ddownMenu.append(
|
|
||||||
`<option>Show/hide ${threadPost}</option>`,
|
|
||||||
`<option>Report post</option>`,
|
|
||||||
`<option>Delete ${threadPost}</option>`,
|
|
||||||
).insertAfter($elem)
|
|
||||||
.on("click", event => {
|
|
||||||
if(event.target.nodeName != "OPTION")
|
|
||||||
return;
|
|
||||||
handleActions($ddownMenu.val(), postID);
|
|
||||||
});
|
|
||||||
if(hasUpload)
|
|
||||||
$ddownMenu.append(`<option>Delete file</option>`);
|
|
||||||
});
|
});
|
||||||
$(document).on("keydown", handleKeydown);
|
$(document).on("keydown", handleKeydown);
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,22 +1,31 @@
|
||||||
|
import { opRegex } from "./vars";
|
||||||
import { getCookie } from "./cookies";
|
import { getCookie } from "./cookies";
|
||||||
import { alertLightbox, promptLightbox } from "./lightbox";
|
import { alertLightbox, promptLightbox } from "./lightbox";
|
||||||
|
import { getBooleanStorageVal } from "./storage";
|
||||||
|
import { handleActions } from "./boardevents";
|
||||||
|
|
||||||
|
let doClickPreview = false;
|
||||||
|
let doHoverPreview = false;
|
||||||
|
let $hoverPreview = null;
|
||||||
|
|
||||||
let movablePostPreviews = null;
|
|
||||||
let expandablePostrefs = true;
|
|
||||||
let threadRE = /^\d+/;
|
let threadRE = /^\d+/;
|
||||||
let videoTestRE = /\.(mp4)|(webm)$/;
|
let videoTestRE = /\.(mp4)|(webm)$/;
|
||||||
|
const postrefRE = /\/([^\s\/]+)\/res\/(\d+)\.html(#(\d+))?/;
|
||||||
|
|
||||||
function deleteCheckedPosts() {
|
export function getPageThread() {
|
||||||
if(confirm('Are you sure you want to delete these posts?')) {
|
let arr = opRegex.exec(window.location.pathname);
|
||||||
let form = $("form#main-form");
|
let info = {
|
||||||
form.append("<input type=\"hidden\" name=\"action\" value=\"delete\" ");
|
board: currentBoard(),
|
||||||
form.get(0).submit();
|
boardID: -1,
|
||||||
return true;
|
op: -1,
|
||||||
}
|
page: 0
|
||||||
return false;
|
};
|
||||||
|
if(arr == null) return info;
|
||||||
|
if(arr.length > 1) info.op = arr[1];
|
||||||
|
if(arr.length > 3) info.page = arr[3];
|
||||||
|
if(arr.board != "") info.boardID = $("form#postform input[name=boardid]").val() -1;
|
||||||
|
return info;
|
||||||
}
|
}
|
||||||
// window.deleteCheckedPosts = deleteCheckedPosts;
|
|
||||||
|
|
||||||
|
|
||||||
export function getUploadPostID(upload, container) {
|
export function getUploadPostID(upload, container) {
|
||||||
// if container, upload is div.upload-container
|
// if container, upload is div.upload-container
|
||||||
|
@ -60,57 +69,95 @@ export function insideOP(elem) {
|
||||||
return $(elem).parents("div.op-post").length > 0;
|
return $(elem).parents("div.op-post").length > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function preparePostPreviews(isInline) {
|
function createPostPreview(e, $post, inline = true) {
|
||||||
let mType = "mousemove";
|
let $preview = $post.clone();
|
||||||
if(!movablePostPreviews) mType = "mouseover";
|
if(inline) $preview = addPostDropdown($post.clone());
|
||||||
|
$preview
|
||||||
|
.prop({class: "inlinepostprev"})
|
||||||
|
.find("div.inlinepostprev").remove()
|
||||||
|
.find("a.postref").on("click", expandPost);
|
||||||
|
if(inline) {
|
||||||
|
$preview.insertAfter(e.target);
|
||||||
|
}
|
||||||
|
initPostPreviews($preview);
|
||||||
|
return $preview;
|
||||||
|
}
|
||||||
|
|
||||||
var hvrStr = "a.postref";
|
function previewMoveHandler(e) {
|
||||||
if(isInline) hvrStr = "div.inlinepostprev " + hvrStr;
|
if($hoverPreview == null) return;
|
||||||
|
$hoverPreview.css({position: "absolute"}).offset({
|
||||||
let $hover = $(hvrStr)
|
top: e.pageY + 8,
|
||||||
$hover.on("mouseenter", function() {
|
left: e.pageX + 8
|
||||||
console.log("mouseenter");
|
|
||||||
let replaced = $hover[0].innerHTML.replace(">>","");
|
|
||||||
let postID = `div.reply#reply${replaced},div.op-post#op${replaced}`;
|
|
||||||
let $clone = $(postID).clone();
|
|
||||||
$(document.body).append($clone.attr({
|
|
||||||
class: "postprev",
|
|
||||||
id: postID + "preview"
|
|
||||||
}));
|
|
||||||
$clone.find(".inlinepostprev").remove();
|
|
||||||
$(document).on(mType, e => {
|
|
||||||
$('.postprev').css({
|
|
||||||
left: e.pageX + 8,
|
|
||||||
top: e.pageY + 8
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}).on("mouseleave", () => {
|
|
||||||
console.log("mouseleave")
|
|
||||||
$(".postprev").remove();
|
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if(expandablePostrefs) {
|
function expandPost(e) {
|
||||||
let clkStr = "a.postref";
|
e.preventDefault();
|
||||||
if(isInline) clkStr = "div.inlinepostprev " + clkStr;
|
if($hoverPreview != null) $hoverPreview.remove();
|
||||||
$(clkStr).on("click", function() {
|
let $next = $(e.target).next();
|
||||||
let $this = $(this);
|
if($next.prop("class") == "inlinepostprev" && e.type == "click") {
|
||||||
if($this.next().attr("class") != "inlinepostprev") {
|
// inline preview is already opened, close it
|
||||||
$(".postprev").remove();
|
$next.remove();
|
||||||
let replaced = this.innerHTML.replace(">>","");
|
return;
|
||||||
let postID = `div.reply#reply${replaced},div.op-post#op${replaced}`;
|
}
|
||||||
let $clone = $(postID).clone()
|
let url = e.target.href
|
||||||
$clone.find("postprev").remove();
|
let urlArr = postrefRE.exec(url);
|
||||||
$this.after(
|
if(urlArr == null) return; // not actually a link to a post, abort
|
||||||
$clone.attr("class", "inlinepostprev")
|
let postBoard = urlArr[1];
|
||||||
);
|
let postOP = urlArr[2];
|
||||||
} else {
|
let postID = urlArr[4]?urlArr[4]:urlArr[2];
|
||||||
$this.next().remove();
|
|
||||||
}
|
let pageThread = getPageThread();
|
||||||
return false;
|
let $post = null;
|
||||||
|
|
||||||
|
if(pageThread.board == postBoard && pageThread.op == postOP) {
|
||||||
|
$post = $(`div#op${postID}, div#reply${postID}`).first();
|
||||||
|
if($post.length < 1) return; // post not on this page.
|
||||||
|
$preview = createPostPreview(e, $post, e.type == "click");
|
||||||
|
if(e.type == "mouseenter") {
|
||||||
|
$hoverPreview = $preview.insertAfter(e.target);
|
||||||
|
$(document.body).on("mousemove", previewMoveHandler);
|
||||||
|
}
|
||||||
|
} else if(e.type == "click") {
|
||||||
|
$.get(e.target.href, data => {
|
||||||
|
$post = $(data).find(`div#op${postID}, div#reply${postID}`).first();
|
||||||
|
if($post.length < 1) return; // post not on this page.
|
||||||
|
createPostPreview(e, $post, true);
|
||||||
|
}).catch((t, u, v) => {
|
||||||
|
alertLightbox(v, "Error");
|
||||||
|
return;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function initPostPreviews($post = null) {
|
||||||
|
if(getPageThread().board == "" && $post == null) return;
|
||||||
|
doClickPreview = getBooleanStorageVal("enablepostclick", true);
|
||||||
|
doHoverPreview = getBooleanStorageVal("enableposthover", false);
|
||||||
|
let $refs = null;
|
||||||
|
if($post == null) {
|
||||||
|
$refs = $("a.postref");
|
||||||
|
} else {
|
||||||
|
$refs = $post.find("a.postref");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(doClickPreview) {
|
||||||
|
$refs.on("click", expandPost);
|
||||||
|
} else {
|
||||||
|
$refs.off("click", expandPost);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(doHoverPreview) {
|
||||||
|
$refs.on("mouseenter", expandPost).on("mouseleave", () => {
|
||||||
|
if($hoverPreview != null) $hoverPreview.remove();
|
||||||
|
$hoverPreview = null;
|
||||||
|
$(document.body).off("mousemove", previewMoveHandler);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
$refs.off("mouseenter").off("mouseleave").off("mousemove");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export function prepareThumbnails() {
|
export function prepareThumbnails() {
|
||||||
// set thumbnails to expand when clicked
|
// set thumbnails to expand when clicked
|
||||||
$("a.upload-container").on("click", function(e) {
|
$("a.upload-container").on("click", function(e) {
|
||||||
|
@ -140,7 +187,6 @@ export function prepareThumbnails() {
|
||||||
.on("click", function(e) {
|
.on("click", function(e) {
|
||||||
video.remove();
|
video.remove();
|
||||||
thumb.show();
|
thumb.show();
|
||||||
console.log(thumb);
|
|
||||||
this.remove();
|
this.remove();
|
||||||
thumb.prop({
|
thumb.prop({
|
||||||
src: thumbURL,
|
src: thumbURL,
|
||||||
|
@ -179,6 +225,40 @@ export function quote(e) {
|
||||||
}
|
}
|
||||||
window.quote = quote;
|
window.quote = quote;
|
||||||
|
|
||||||
|
export function addPostDropdown($post) {
|
||||||
|
if($post.find("select.post-actions").length > 0)
|
||||||
|
return $post;
|
||||||
|
let $postInfo = $post.find("label.post-info");
|
||||||
|
let isOP = $postInfo.parents("div.reply-container").length == 0;
|
||||||
|
let hasUpload = $postInfo.siblings("div.file-info").length > 0;
|
||||||
|
let postID = $postInfo.parent().attr("id");
|
||||||
|
let threadPost = isOP?"thread":"post";
|
||||||
|
let $ddownMenu = $("<select />", {
|
||||||
|
class: "post-actions",
|
||||||
|
id: postID
|
||||||
|
}).append(
|
||||||
|
"<option disabled selected>Actions</option>",
|
||||||
|
);
|
||||||
|
if(isOP) {
|
||||||
|
$ddownMenu.append(
|
||||||
|
"<option>Watch thread</option>"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$ddownMenu.append(
|
||||||
|
`<option>Show/hide ${threadPost}</option>`,
|
||||||
|
`<option>Report post</option>`,
|
||||||
|
`<option>Delete ${threadPost}</option>`,
|
||||||
|
).insertAfter($postInfo)
|
||||||
|
.on("click", event => {
|
||||||
|
if(event.target.nodeName != "OPTION")
|
||||||
|
return;
|
||||||
|
handleActions($ddownMenu.val(), postID);
|
||||||
|
});
|
||||||
|
if(hasUpload)
|
||||||
|
$ddownMenu.append(`<option>Delete file</option>`);
|
||||||
|
return $post;
|
||||||
|
}
|
||||||
|
|
||||||
export function reportPost(id, board) {
|
export function reportPost(id, board) {
|
||||||
promptLightbox("", false, ($lb, reason) => {
|
promptLightbox("", false, ($lb, reason) => {
|
||||||
if(reason == "" || reason == null) return;
|
if(reason == "" || reason == null) return;
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
import { showLightBox } from "./lightbox";
|
import { showLightBox } from "./lightbox";
|
||||||
import { initTopBar, TopBarButton } from "./topbar";
|
import { initTopBar, TopBarButton } from "./topbar";
|
||||||
import { getStorageVal, setStorageVal } from "./storage";
|
import { getStorageVal, setStorageVal } from "./storage";
|
||||||
|
import { initPostPreviews } from "./postutil";
|
||||||
|
import { initQR } from "./qr";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @type {TopBarButton}
|
* @type {TopBarButton}
|
||||||
|
@ -122,9 +124,9 @@ export function initSettings() {
|
||||||
`${webroot}css/${this.getElementValue()}`);
|
`${webroot}css/${this.getElementValue()}`);
|
||||||
}));
|
}));
|
||||||
settings.set("pintopbar", new BooleanSetting("pintopbar", "Pin top bar", true, initTopBar));
|
settings.set("pintopbar", new BooleanSetting("pintopbar", "Pin top bar", true, initTopBar));
|
||||||
settings.set("enableposthover", new BooleanSetting("enableposthover", "Preview post on hover"));
|
settings.set("enableposthover", new BooleanSetting("enableposthover", "Preview post on hover", false, initPostPreviews));
|
||||||
settings.set("enablepostclick", new BooleanSetting("enablepostclick", "Preview post on click", true));
|
settings.set("enablepostclick", new BooleanSetting("enablepostclick", "Preview post on click", true, initPostPreviews));
|
||||||
settings.set("useqr", new BooleanSetting("useqr", "Use Quick Reply box", true));
|
settings.set("useqr", new BooleanSetting("useqr", "Use Quick Reply box", true, initQR));
|
||||||
|
|
||||||
if($settingsButton == null)
|
if($settingsButton == null)
|
||||||
$settingsButton = new TopBarButton("Settings", createLightbox);
|
$settingsButton = new TopBarButton("Settings", createLightbox);
|
||||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Loading…
Add table
Add a link
Reference in a new issue