v0.2.12
RustBox CI / rustbox (push) Canceled after 0s

This commit is contained in:
Mateusz Gruszczyński committed 2026-11-02 13:54:18 +01:00
1 parent 5dc9db0b1c
commit 83440f20e2
28 files changed
+1925 -213

No files matched your search

+73 -7
View File
@@ -132,11 +132,49 @@ function bindEvents() {
$("#logout-btn").addEventListener("click", logout);
$("#compose-btn").addEventListener("click", () => openCompose("new"));
$("#compose-fullscreen").addEventListener("click", toggleComposeFullscreen);
$("#compose-fields-toggle").addEventListener("click", toggleComposeFields);
$("#compose-to").addEventListener("invalid", () => setComposeFieldsCollapsed(false));
$("#compose-form").addEventListener("submit", sendMessage);
$("#compose-attach").addEventListener("click", () => $("#compose-files").click());
$("#compose-files").addEventListener("change", async (event) => { await uploadComposeFiles(event.target.files); event.target.value = ""; });
$("#compose-delete-draft").addEventListener("click", deleteComposeDraft);
$("#compose-save-draft").addEventListener("click", saveComposeDraftToImap);
$("#compose-attach").addEventListener("click", () => { state.composeInsertRange = captureEditorRange(); $("#compose-files").click(); });
$("#compose-files").addEventListener("change", async (event) => {
const files = [...event.target.files];
const htmlMode = $("#compose-mode").value === "html";
const images = htmlMode ? files.filter((file) => /^image\/(png|jpeg|gif|webp)$/i.test(file.type)) : [];
const attachments = htmlMode ? files.filter((file) => !/^image\/(png|jpeg|gif|webp)$/i.test(file.type)) : files;
if (images.length) await uploadInlineImage(images, state.composeInsertRange);
if (attachments.length) await uploadComposeFiles(attachments);
state.composeInsertRange = null;
event.target.value = "";
});
$("#editor-image").addEventListener("click", () => { state.composeInsertRange = captureEditorRange(); $("#compose-images").click(); });
$("#editor-image-edit").addEventListener("click", () => openInlineImageEditor());
$("#compose-image-actions").addEventListener("click", (event) => {
const image = state.composeSelectedImage;
if (!image) return;
const widthButton = event.target.closest("[data-image-width]");
const alignButton = event.target.closest("[data-image-align]");
if (widthButton) {
applyInlineImageDisplay(image, Number(widthButton.dataset.imageWidth), inlineImageAlignment(image));
scheduleDraftSave();
return;
}
if (alignButton) {
const currentWidth = /^\d+(?:\.\d+)?%$/.test(image.style.width || "") ? Number.parseFloat(image.style.width) : 100;
applyInlineImageDisplay(image, currentWidth, alignButton.dataset.imageAlign);
scheduleDraftSave();
}
});
$("#compose-image-more").addEventListener("click", () => openInlineImageEditor());
$("#compose-image-detach").addEventListener("click", () => {
const image = state.composeSelectedImage;
if (!image) return;
image.remove();
setSelectedInlineImage(null);
syncComposeInlineAttachments();
scheduleDraftSave();
});
$("#compose-images").addEventListener("change", async (event) => { await uploadInlineImage(event.target.files, state.composeInsertRange); state.composeInsertRange = null; event.target.value = ""; });
$("#image-edit-form").addEventListener("submit", applyInlineImageEditor);
$("#image-edit-reset").addEventListener("click", resetImageCropControls);
@@ -173,6 +211,9 @@ function bindEvents() {
updateComposeMessageSize();
}));
$("#compose-editor").addEventListener("input", () => { if (state.composeSelectedImage && !state.composeSelectedImage.isConnected) setSelectedInlineImage(null); scheduleDraftSave(); scheduleUnusedInlineAttachmentCleanup(); updateComposeMessageSize(); });
$("#compose-editor").addEventListener("scroll", positionInlineImageUi, { passive: true });
window.addEventListener("resize", positionInlineImageUi, { passive: true });
$("#compose-image-resize").addEventListener("pointerdown", beginInlineImageResize);
$("#compose-editor").addEventListener("click", (event) => {
const image = event.target.closest?.("img[data-rustbox-cid]");
setSelectedInlineImage(image || null);
@@ -192,14 +233,38 @@ function bindEvents() {
const range = captureEditorRange();
await uploadInlineImage(images, range);
});
$("#compose-editor").addEventListener("dragover", (event) => { if ([...event.dataTransfer.types].includes("Files")) event.preventDefault(); });
$("#compose-editor").addEventListener("dragstart", (event) => {
const image = event.target.closest?.("img[data-rustbox-cid]");
if (!image || !event.dataTransfer) return;
setSelectedInlineImage(image);
event.dataTransfer.effectAllowed = "move";
event.dataTransfer.setData("application/x-rustbox-inline-image", image.dataset.rustboxCid || "");
});
$("#compose-editor").addEventListener("dragover", (event) => {
const types = [...(event.dataTransfer?.types || [])];
if (types.includes("Files") || types.includes("application/x-rustbox-inline-image")) {
event.preventDefault();
if (event.dataTransfer) event.dataTransfer.dropEffect = types.includes("Files") ? "copy" : "move";
}
});
$("#compose-editor").addEventListener("drop", async (event) => {
const files = [...event.dataTransfer.files];
const inlineCid = event.dataTransfer?.getData("application/x-rustbox-inline-image") || "";
const range = editorRangeFromPoint(event.clientX, event.clientY);
if (inlineCid) {
event.preventDefault();
const image = [...$("#compose-editor").querySelectorAll("img[data-rustbox-cid]")]
.find((candidate) => String(candidate.dataset.rustboxCid || "") === inlineCid);
if (image && range) moveInlineImageToRange(image, range);
return;
}
const files = [...(event.dataTransfer?.files || [])];
if (!files.length) return;
event.preventDefault();
const allImages = files.every((file) => /^image\/(png|jpeg|gif|webp)$/i.test(file.type));
if ($("#compose-mode").value === "html" && allImages) await uploadInlineImage(files, editorRangeFromPoint(event.clientX, event.clientY));
else await uploadComposeFiles(files);
const htmlMode = $("#compose-mode").value === "html";
const images = htmlMode ? files.filter((file) => /^image\/(png|jpeg|gif|webp)$/i.test(file.type)) : [];
const attachments = htmlMode ? files.filter((file) => !/^image\/(png|jpeg|gif|webp)$/i.test(file.type)) : files;
if (images.length) await uploadInlineImage(images, range);
if (attachments.length) await uploadComposeFiles(attachments);
});
$("#reply-btn").addEventListener("click", () => openCompose("reply"));
$("#reply-all-btn").addEventListener("click", () => openCompose("reply-all"));
@@ -259,6 +324,7 @@ function bindEvents() {
} catch (error) { toast(error.message, "error"); }
});
$("#load-more").addEventListener("click", async () => { state.page += 1; await loadMessages(false); });
$("#load-all").addEventListener("click", loadAllMessages);
$("#message-list").addEventListener("scroll", scheduleMessageListStateSave, { passive: true });
window.addEventListener("offline", () => setConnectivityState(false));
window.addEventListener("online", async () => {