From 672eb6a18cef39492102699bb68c0bfcde35f487 Mon Sep 17 00:00:00 2001 From: Vito Sansevero Date: Thu, 8 Oct 2026 17:31:29 -0700 Subject: [PATCH] fix(gallery): display settings apply at load, columns work, media info toggles Default View Mode, Items per Page and Grid Columns were only applied when Save was pressed, never when the page loaded; the column setting swapped a Tailwind class that was never compiled (only 3, 6 and 8 exist) and a wider breakpoint class overrode it anyway; Show Media Info was saved and never read. - gallery-settings.js validates what localStorage holds (view mode, limit option, column range, booleans) and falls back to defaults per value - settings are applied in the constructor before the first load; changing the page size reloads, toggling media info re-renders - the column count sets an explicit grid template through a CSS variable that wins on desktop widths - media info lines honour the toggle in grid and list views - image load failures are handled by one delegated listener that tries the original before showing the failed-to-load card --- tests/js/gallery-settings.test.js | 57 +++++++++++++++++++ web/gallery.html | 10 ++++ web/js/gallery-settings.js | 85 +++++++++++++++++++++++++++ web/js/gallery.js | 95 +++++++++++++++---------------- 4 files changed, 199 insertions(+), 48 deletions(-) create mode 100644 tests/js/gallery-settings.test.js create mode 100644 web/js/gallery-settings.js diff --git a/tests/js/gallery-settings.test.js b/tests/js/gallery-settings.test.js new file mode 100644 index 0000000..44098a5 --- /dev/null +++ b/tests/js/gallery-settings.test.js @@ -0,0 +1,57 @@ +// Run with: node --test tests/js/ +const test = require("node:test"); +const assert = require("node:assert/strict"); +const { + DEFAULT_SETTINGS, + normalizeGallerySettings, + gridColumnsStyle, + LIMIT_OPTIONS, +} = require("../../web/js/gallery-settings.js"); + +test("defaults are a complete, sane settings object", () => { + const s = normalizeGallerySettings(null); + assert.deepEqual(s, DEFAULT_SETTINGS); + assert.equal(s.defaultViewMode, "grid"); + assert.equal(s.defaultLimit, 100); + assert.equal(s.gridColumns, 8); + assert.equal(s.showImageInfo, true); + assert.equal(s.sidebarCollapsedByDefault, false); +}); + +test("stored values override defaults and unknown keys are kept", () => { + const s = normalizeGallerySettings({ defaultViewMode: "list", defaultLimit: 500, gridColumns: 10, showImageInfo: false, videoLoop: false, extra: 1 }); + assert.equal(s.defaultViewMode, "list"); + assert.equal(s.defaultLimit, 500); + assert.equal(s.gridColumns, 10); + assert.equal(s.showImageInfo, false); + assert.equal(s.videoLoop, false); + assert.equal(s.extra, 1); +}); + +test("invalid stored values fall back to defaults instead of breaking the page", () => { + const s = normalizeGallerySettings({ defaultViewMode: "mosaic", defaultLimit: 7, gridColumns: "lots", showImageInfo: "no" }); + assert.equal(s.defaultViewMode, "grid"); + assert.equal(s.defaultLimit, 100); + assert.equal(s.gridColumns, 8); + assert.equal(s.showImageInfo, true); +}); + +test("numeric strings from