1
0
Fork 0
mirror of https://github.com/Eggbertx/gochan.git synced 2025-08-02 23:26:23 -07:00

Add clipboard uploading to the static post form

This commit is contained in:
Eggbertx 2024-08-03 13:28:06 -07:00
parent 4770bf6cab
commit 662cca0273
3 changed files with 90 additions and 31 deletions

View file

@ -74,20 +74,37 @@ table#pages td {
float: right; float: right;
} }
div#new-upload-box { div#upload-box {
background: #505050; background: #505050;
color: #b0b0b0; color: #b0b0b0;
a { a.browse-text {
text-align: center; text-align: center;
padding: 20px 40px; padding: 20px 40px;
display: block; display: block;
} }
.upload-preview { .upload-x, .upload-filename {
max-width: 50px; position: relative;
max-height: 50px; bottom: 12px;
display: inline-block;
margin-left: 8px;
margin-right: 8px;
} }
} }
.upload-preview {
max-width: 50px;
max-height: 50px;
}
.placeholder-thumb {
width: 50px;
height: 50px;
background: #333;
border: 1px black solid;
margin: 4px;
display: inline-block;
}
.reply { .reply {
margin-bottom: 4px; margin-bottom: 4px;
padding: 4px 8px 4px 8px; padding: 4px 8px 4px 8px;

View file

@ -2,18 +2,12 @@ import $ from "jquery";
import { alertLightbox } from "./lightbox"; import { alertLightbox } from "./lightbox";
const uploadReader = new FileReader();
uploadReader.onload = onReaderLoad;
uploadReader.onerror = onReaderError;
const noop = () => {
return;
};
export function updateUploadImage($elem: JQuery<HTMLElement>, onLoad = noop) { export function updateUploadImage($elem: JQuery<HTMLElement>, onLoad = () => {}) {
if($elem.length === 0) return; if($elem.length === 0) return;
$elem[0].onchange = function() { $elem[0].onchange = function() {
const img = new Image(); const img = new Image();
img.src = URL.createObjectURL((this as any).files[0]); img.src = URL.createObjectURL((this as HTMLInputElement).files[0]);
img.onload = onLoad; img.onload = onLoad;
}; };
} }
@ -34,38 +28,69 @@ function dragAndDrop(e:JQuery.DragEnterEvent|JQuery.DragOverEvent|JQuery.DropEve
e.stopPropagation(); e.stopPropagation();
} else { } else {
$browseBtn[0].files = e.originalEvent.dataTransfer.files; $browseBtn[0].files = e.originalEvent.dataTransfer.files;
uploadReader.readAsDataURL($browseBtn[0].files[0]); addFileUpload($browseBtn[0].files[0]);
} }
} }
function onReaderLoad(e:ProgressEvent<FileReader>) { function onReaderLoad(name:string, e:ProgressEvent<FileReader>) {
const base64Str = e.target.result.toString(); const base64Str = e.target.result.toString();
const isImage = base64Str.slice(5, 10) === "image"; const isImage = base64Str.slice(5, 10) === "image";
const extPos = name.lastIndexOf(".");
const namePart = (extPos > 0)?name.substring(0, extPos):name;
const extPart = (extPos <= 0)?"":name.substring(extPos);
const maxLen = 20;
const nameShortened = namePart.substring(0, maxLen) + ((namePart.length > maxLen)?"…":"") + extPart;
const $container = ($("div#upload-box").children(".upload-preview-container").length > 0)?
$(".upload-preview-container"):
$("<div/>").addClass("upload-preview-container").appendTo("div#upload-box");
if(isImage) { $container.empty().append(
$("<img/>").attr({ $("<a/>").attr({
"class": "upload-x",
"href": "javascript:;"
}).text("X").on("click", (e:JQuery.ClickEvent) => {
const $target = $(e.target);
const $browseBtn = $target.parents<HTMLInputElement>("#upload-box").siblings("input[name=imagefile]");
$browseBtn.each((_, el) => el.value = null);
$target.parents(".upload-preview-container").remove();
}),
isImage?$("<img/>").attr({
"class": "upload-preview",
"src": base64Str, "src": base64Str,
}).addClass("upload-preview").appendTo("div#new-upload-box"); }):$("<div/>").addClass("placeholder-thumb"),
}
$("<span/>").addClass("upload-filename").attr({title: name}).text(nameShortened)
);
} }
function onReaderError(e:ProgressEvent<FileReader>) { function addFileUpload(file:File) {
alertLightbox(`Unable to load file: ${e.target.error.message}`); const uploadReader = new FileReader();
} uploadReader.onload = (e => onReaderLoad(file.name, e));
uploadReader.onerror = (e) => alertLightbox(`Unable to load file: ${e.target.error.message}`);
function onBrowseBtnChange(e:JQuery.ChangeEvent) { uploadReader.readAsDataURL(file);
uploadReader.readAsDataURL(e.target.files[0]);
} }
$(() => { $(() => {
const $browseBtn = $<HTMLInputElement>("input[name=imagefile]").hide(); const $browseBtn = $<HTMLInputElement>("input[name=imagefile]").hide();
if($browseBtn.length !== 1) return; if($browseBtn.length !== 1) return;
$browseBtn.on("change", onBrowseBtnChange); $browseBtn.on("change", e => addFileUpload(e.target.files[0]));
$("<div/>").attr("id", "new-upload-box").append( $("<div/>").attr("id", "upload-box").append(
$("<a/>") $("<a/>").addClass("browse-text")
.attr("href", "javascript:;") .attr("href", "javascript:;")
.text("Select/drop/paste upload here") .text("Select/drop/paste upload here")
.on("click", () => $browseBtn.trigger("click")) .on("click", () => $browseBtn.trigger("click"))
).on("dragenter dragover drop", dragAndDrop).insertBefore($browseBtn); ).on("dragenter dragover drop", dragAndDrop).insertBefore($browseBtn);
$("div#postbox-area form").on("paste", e => {
const clipboardData = (e.originalEvent as ClipboardEvent).clipboardData;
if(clipboardData.items.length < 1 || clipboardData.items[0].kind !== "file") {
console.log("No files in clipboard");
return;
}
const clipboardFile = clipboardData.items[0].getAsFile();
addFileUpload(clipboardFile);
$browseBtn[0].files = clipboardData.files;
});
}); });

View file

@ -74,20 +74,37 @@ table#pages td {
float: right; float: right;
} }
div#new-upload-box { div#upload-box {
background: #505050; background: #505050;
color: #b0b0b0; color: #b0b0b0;
} }
div#new-upload-box a { div#upload-box a.browse-text {
text-align: center; text-align: center;
padding: 20px 40px; padding: 20px 40px;
display: block; display: block;
} }
div#new-upload-box .upload-preview { div#upload-box .upload-x, div#upload-box .upload-filename {
position: relative;
bottom: 12px;
display: inline-block;
margin-left: 8px;
margin-right: 8px;
}
.upload-preview {
max-width: 50px; max-width: 50px;
max-height: 50px; max-height: 50px;
} }
.placeholder-thumb {
width: 50px;
height: 50px;
background: #333;
border: 1px black solid;
margin: 4px;
display: inline-block;
}
.reply { .reply {
margin-bottom: 4px; margin-bottom: 4px;
padding: 4px 8px 4px 8px; padding: 4px 8px 4px 8px;