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

This commit is contained in:
Mateusz Gruszczyński committed 2026-11-02 15:34:49 +01:00
1 parent 12e0c99850
commit edda5fc9e4
42 files changed
+733 -122

No files matched your search

+71 -5
View File
@@ -20,6 +20,7 @@ let presetPromotionTimer = null;
let presetPromotionInFlight = false;
let presetPromotionNeedsAnotherSave = false;
let presetPromotionActive = false;
const temporarilyDisabledPanePreferences = new Set();
const interfaceStyleProfiles = {
"roundcube-classic": {
@@ -348,9 +349,29 @@ async function loadMailPreferences() {
if (flaggedTop) flaggedTop.checked = Boolean(state.mailPrefs.flagged_on_top);
const syncKeywords = $("#mail-pref-sync-keywords");
if (syncKeywords) syncKeywords.checked = Boolean(state.mailPrefs.sync_imap_keywords);
const compactWideRows = $("#pref-compact-wide-rows");
if (compactWideRows) compactWideRows.checked = state.mailPrefs.compact_wide_rows !== false;
root.dataset.compactWideRows = state.mailPrefs.compact_wide_rows === false ? "false" : "true";
} catch (error) { console.warn("Could not load mailbox preferences", error); }
}
async function saveCompactWideRowsAppearance(enabled) {
const previous = state.mailPrefs.compact_wide_rows !== false;
root.dataset.compactWideRows = enabled ? "true" : "false";
try {
state.mailPrefs = await request("/settings/mailbox", {
method: "PUT",
body: JSON.stringify({ compact_wide_rows: Boolean(enabled) }),
});
root.dataset.compactWideRows = state.mailPrefs.compact_wide_rows === false ? "false" : "true";
} catch (error) {
const input = $("#pref-compact-wide-rows");
if (input) input.checked = previous;
root.dataset.compactWideRows = previous ? "true" : "false";
toast(error.message, "error");
}
}
async function saveMailPreferences() {
const payload = {
messages_per_page: Number($("#mail-pref-per-page").value),
@@ -367,6 +388,7 @@ async function saveMailPreferences() {
try {
state.mailPrefs = await request("/settings/mailbox", { method: "PUT", body: JSON.stringify(payload) });
state.perPage = Number(state.mailPrefs.messages_per_page || 300);
root.dataset.compactWideRows = state.mailPrefs.compact_wide_rows === false ? "false" : "true";
toast("Mailbox settings saved");
if (state.currentDetail) renderMessageDetail(state.currentDetail);
await loadMessages(true);
@@ -410,6 +432,39 @@ const presetEditablePreferenceKeys = new Set([
"folderBackground", "messageBackground", "readerBackground",
]);
function panePreferenceKeyFromValidationError(error) {
const message = String(error?.message || "");
if (/Invalid\s+message_pane_width\s*:/i.test(message)) return "messagePaneWidth";
if (/Invalid\s+folder_pane_width\s*:/i.test(message)) return "folderPaneWidth";
return null;
}
function temporarilyDisablePanePreference(key, error = null) {
if (!["folderPaneWidth", "messagePaneWidth"].includes(key)) return false;
temporarilyDisabledPanePreferences.add(key);
const handle = $(key === "folderPaneWidth" ? "#folder-resizer" : "#message-resizer");
if (handle) {
handle.dataset.temporarilyDisabled = "true";
handle.setAttribute("aria-disabled", "true");
}
if (error) console.warn(`Pane resize temporarily disabled for ${key}`, error);
return true;
}
function restorePanePreference(key) {
if (!temporarilyDisabledPanePreferences.delete(key)) return;
const handle = $(key === "folderPaneWidth" ? "#folder-resizer" : key === "messagePaneWidth" ? "#message-resizer" : null);
if (!handle) return;
delete handle.dataset.temporarilyDisabled;
handle.removeAttribute("aria-disabled");
}
function suppressPaneWidthValidationError(error) {
const key = panePreferenceKeyFromValidationError(error);
return key ? temporarilyDisablePanePreference(key, error) : false;
}
function presetCssHex(styles, name, fallback) {
const value = styles.getPropertyValue(name).trim();
if (/^#[0-9a-f]{6}$/i.test(value)) return value;
@@ -441,8 +496,10 @@ function schedulePromotedAppearanceSave() {
presetPromotionNeedsAnotherSave = false;
try {
await request("/settings/display", { method: "PUT", body: JSON.stringify(customAppearancePayload(state.prefs)) });
restorePanePreference("folderPaneWidth");
restorePanePreference("messagePaneWidth");
} catch (error) {
toast(error.message, "error");
if (!suppressPaneWidthValidationError(error)) toast(error.message, "error");
} finally {
presetPromotionInFlight = false;
if (presetPromotionNeedsAnotherSave) schedulePromotedAppearanceSave();
@@ -498,16 +555,25 @@ function savePreference(key, value) {
if (!field) return;
const payload = { [field]: state.prefs[key] };
if (["accentColor", "backgroundColor", "panelColor", "textColor"].includes(key)) payload.color_preset = "custom";
try { await request("/settings/display", { method: "PUT", body: JSON.stringify(payload) }); }
catch (error) { toast(error.message, "error"); }
try {
await request("/settings/display", { method: "PUT", body: JSON.stringify(payload) });
restorePanePreference(key);
} catch (error) { if (!suppressPaneWidthValidationError(error)) toast(error.message, "error"); }
}, 180);
preferenceTimers.set(key, timer);
}
async function resetAppearance() {
const payload = { theme: root.dataset.defaultTheme || "system", interface_skin: "default", preset_scale_unlocked: false, density: "compact", preview_pane: "right", ui_scale: "normal", color_preset: "sage", accent_color: "#6f9c86", background_color: "#121513", panel_color: "#181c19", text_color: "#edf0ec", font_family: "system", font_size: 13, row_height: 58, folder_pane_width: 228, message_pane_width: 420, border_radius: 4, contrast: "normal", show_avatars: true, show_attachment_icons: true, show_flags: true, reduce_motion: false, date_format: "locale", time_format: "locale", icon_size: 18, toolbar_density: "normal", sidebar_item_height: 29, reader_max_width: 0, composer_width: 900, selection_color: "#28352e", unread_font_weight: 730, unread_badge_style: "dot", compact_headers: false, show_borders: true, scrollbar_density: "thin", monochrome: false, folder_background: "", message_background: "", reader_background: "" };
try { normalizeServerPreferences(await request("/settings/display", { method: "PUT", body: JSON.stringify(payload) })); applyPreferences(); toast("Appearance reset"); }
catch (error) { toast(error.message, "error"); }
try {
normalizeServerPreferences(await request("/settings/display", { method: "PUT", body: JSON.stringify(payload) }));
state.mailPrefs = await request("/settings/mailbox", { method: "PUT", body: JSON.stringify({ compact_wide_rows: true }) });
const compactWideRows = $("#pref-compact-wide-rows");
if (compactWideRows) compactWideRows.checked = true;
root.dataset.compactWideRows = "true";
applyPreferences();
toast("Appearance reset");
} catch (error) { toast(error.message, "error"); }
}