github jordibrouwer/nextdash v1.18.4.1

3 hours ago

Bookmarks opens sooner and the same way from the key as from the button. Shift+H now lands on the whole list instead of the Broken filter, loading starts as the pointer reaches the button, the list is laid out and drawn once instead of several times, config no longer carries Appearance and the widget editor into Bookmarks, and a view opens with half the fade. Held back from the What's new window (hideFromModal) like v1.18.1, so v1.18.4 keeps leading it.

Bookmarks

  • fix — Shift+H opens the whole Bookmarks list, the same as its header button. The key went through openHealthView, which landed on the Broken filter — the old Health view's front page — and did nothing at all with health checks off, so the key and the button opened two different things. dashboard-setup.js now calls config.openLibraryView, with no filter and nothing selected; :health and /#health still land on Broken. tests/bookmarks-shift-h.spec.js covers it.

Performance

  • fix — Bookmarks and Config start loading when the pointer reaches their button. The first open after a page load waited on the whole module, a 1.7 MB script to fetch, parse and run — about 500 ms over a VPN. DashboardConfigLoader._bindIntentPrewarm listens once, delegated, for a pointer, a focus or a touch on either button and calls prewarm(), which loads the module, the help translations, the view styles and (with checks on) the health module without opening anything; a failure stays silent and the real open reports it. tests/config-lazy-load.spec.js covers the hover.
  • fix — the health loader no longer preloads scripts the page already has. Two of its six dependencies ride in the dashboard bundle, but v1.18.4's side-by-side preload fetched them again. DashboardHealthLoader.DEPENDENCIES lists each script with its own readiness test, and only the missing ones are preloaded and loaded, still in order. tests/health-lazy-load.spec.js checks that every preloaded script is one that then runs.
  • fix — a view opens with a 100 ms fade instead of 200 ms of fade and slide. Opening Config, Bookmarks, Inbox or Containers is a jump to another place, not a turn of the page, and the list is usually drawn within a frame; the animation was most of what made Bookmarks feel slow. dashboard.css gives those layouts dashboardViewFade; page switches on the dashboard keep the slide.
  • fix — opening Bookmarks no longer lays the empty view out first. bookmarkRowWindow read the list's position and scroll offset while the shell was fresh, which made the browser lay out the whole view before a single row was in — and again once they were. A list of 120 items or fewer is drawn whole and is no longer measured at all; a longer one opened afresh takes its first window from a scroll of 0 and the window's height, and is measured one frame later, redrawn only if that differs. tests/config-bookmarks-window.spec.js covers the fresh open.
  • fix — Bookmarks no longer waits on Appearance's files, or on its own one at a time. The config loader fetched the look, the studio and the theme editor (about 105 KB) with config itself, so opening Bookmarks parsed them before the list; they are now DashboardConfig.SECTION_MODULES.appearance, a chain fetched side by side and run in order when Appearance, the theme browser or a theme's look needs them, and on idle otherwise. A stand-in applyThemeLookAndSave on config loads them first, so :theme still brings a theme's look. The list's eleven scripts, which ensureBookmarkRenderers loads one after another, are preloaded with config by DashboardConfigLoader.preloadBookmarkScripts. Rows on a cold cache: 861 → 331 ms at 50 ms latency, 1130 → 605 ms at 4× CPU; warm, 340 → 323 ms. tests/config-lazy-load.spec.js checks that no Appearance file is fetched before the rows, and that Appearance and the theme browser still open.
  • fix — the widget editor is its own file, so Bookmarks no longer parses it. The Widgets section's 98 methods (about 200 KB) moved unchanged from dashboard-config.js to dashboard-config-widgets.js, loaded as DashboardConfig.SECTION_MODULES.widgets when that section opens and on idle otherwise. The type tables and the helpers other sections share — the folds, secretEyeIcon, widgetTypeName — stay on the class. Config itself is 1.48 MB instead of 1.68 MB; Bookmarks' rows at 4× CPU: 308 → 292 ms warm, 593 → 575 ms cold. tests/config-lazy-load.spec.js checks that the file is not fetched before the rows.
  • fix — opening Bookmarks draws the list once instead of four times. Every draw rebuilt the rows and measured their tag chips, which forces a layout. ensureBookmarkCategoriesForFilter and prefetchAllBookmarkCategories redrew the list whenever they finished, even with every name already cached; they now say whether anything was fetched, and only then is it redrawn — so a first open in a session redraws once when the names land, and every later one not at all. Two callers asking for the same page's categories share one request. The first draw takes a screenful (bmInitialLimit) when the page size is smaller, so fillBookmarkListToScreen no longer adds a page a frame later. The band's height is published from the last one and corrected by its ResizeObserver, instead of read mid-render; and the modal scroll lock no longer wakes on a child added to <body>, only on an attribute that could show a modal. Painted at 4× CPU: 323 → 274 ms; at 1×: 79 → 70 ms; cold, unchanged. tests/bookmarks-open-draws-once.spec.js counts the draws.

Tests

  • tests — tests/health-view-redirect.spec.js waits for #bookmarks after Shift+H instead of reading the address the moment the view switches: through openLibraryView the view switches first and its first render writes the address.

Help and docs

  • docs — the key is described as it now works: MANUAL §7's key table and §11's opening line, the cheat sheet (navHealthView, which now shows with checks off too), the everyday-views tip (tipEverydayViews) and Help → Keyboard (helpKeyboardBody), in all six languages.
  • docs — the Unraid template (templates/nextdash.xml) lists the v1.18.4 changes, the same as the copy Community Applications reads.

Docs

  • docs — static/data/whats-new/v1.18.4.1.json and its index entry, held back from the What's new window (hideFromModal); whats-new-stub.js's NEXTDASH_WHATS_NEW_DATA_VERSION moved to whats-new-v328, DASHBOARD_RELEASE stays on v1.18.4. tests/whats-new-hidden-release.spec.js names v1.18.4.1 as held back. go generate refreshed asset_hashes_gen.go.

Don't miss a new nextdash release

NewReleases is sending notifications on new releases.