1 parent
12e0c99850
commit
edda5fc9e4
42 files changed
+733
-122
No files matched your search
@@ -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"); }
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user