From 2a2303d1dccc120dd7aa5f6b6ade0f89e0064850 Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Tue, 25 Nov 2025 07:42:23 +0000
Subject: [PATCH] =Feed block mostly good! Referrals look good to go. Ready for Madi and Heidi to approve

---
 src/feed/view.js |   53 ++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 36 insertions(+), 17 deletions(-)

diff --git a/src/feed/view.js b/src/feed/view.js
index abb91e5..6c64b6e 100644
--- a/src/feed/view.js
+++ b/src/feed/view.js
@@ -55,7 +55,7 @@
 				favourites: '[data-filter="favourites"]',
 				taxonomy: '[data-filter^="taxonomy"]'
 			},
-			selectedTax: '.selected-terms',
+			selectedTax: '.selected-items',
 			clearFilter: 'button.clear-filters',
 			loadMore: 'button.load-more',
 			filterContainer: '.filters',
@@ -89,24 +89,39 @@
 		buttons.forEach((button) => {
 			const taxonomy = button.dataset.taxonomy;
 			this.currentTaxonomies.add(taxonomy);
+
 			this.selector.registerFilterButton(button, {
 				button: button,
 				buttonSelector: '[data-filter="taxonomy"]',
 				selected: this.ui.selectedTax
 			});
+
+			// Add preload listeners
+			this.addTaxonomyPreloadListeners(button, taxonomy);
 		});
 
-		// Make this non-blocking
-		setTimeout(() => {
-			this.selector.batchFetchTaxonomies();
-			this.selector.isInitializing = false;
-		}, 0);
+		this.selector.isInitializing = false;
 
 		this.selector.subscribe((event, data) => {
 			if (event === 'selected-terms') this.handleTaxonomyChange(data);
 		});
 	}
 
+	addTaxonomyPreloadListeners(button, taxonomy) {
+		const preload = () => {
+			this.selector.preloadTaxonomy(taxonomy);
+		};
+
+		// Desktop hover
+		button.addEventListener('mouseenter', preload, { once: true });
+
+		// Touch/keyboard (fires before click)
+		button.addEventListener('pointerdown', preload, { once: true });
+
+		// Keyboard focus
+		button.addEventListener('focus', preload, { once: true });
+	}
+
 	handleTaxonomyChange(data) {
 		const { terms, taxonomy } = data;
 
@@ -177,10 +192,10 @@
 	}
 
 	initStore() {
-		this.addPlaceholders();
-		this.store = window.jvbStore.register(
+		const store = window.jvbStore.register(
 			'feed',
 			{
+				storeName: 'feed',
 				endpoint: 'feed',
 				keyPath: 'id',
 				indexes: [
@@ -197,6 +212,7 @@
 				delayFetch: true
 			}
 		);
+		this.store = store.feed;
 
 		this.store.subscribe((event, data) => {
 			switch (event) {
@@ -317,7 +333,6 @@
 		let items = this.store.getFiltered();
 		if (this.store.filters['page'] === 1) {
 			window.removeChildren(this.ui.grid);
-			this.addPlaceholders();
 		}
 
 		if (items.length === 0) {
@@ -436,8 +451,17 @@
 		return template;
 	}
 
+	removePlaceholders() {
+		const placeholders = this.ui.grid.querySelectorAll('.placeholder');
+		if (placeholders.length > 0) {
+			placeholders.forEach(p => p.remove());
+		}
+	}
+
+
 	addPlaceholders() {
 		let total = this.contentTypes.length;
+		const fragment = document.createDocumentFragment();
 		for (let i = 0; i < 12; i++) {
 			let template = window.getTemplate('placeholderTemplate');
 
@@ -448,15 +472,10 @@
 			} else {
 				icon = window.getIcon(this.container.dataset.icon);
 			}
-			template.appendChild(icon);
-			this.ui.grid.appendChild(template);
+			template.append(icon);
+			fragment.append(template);
 		}
-	}
-
-	removePlaceholders() {
-		if (this.ui.grid.querySelector('.placeholder')) {
-			window.removeChildren(this.ui.grid);
-		}
+		this.ui.grid.append(fragment);
 	}
 
 

--
Gitblit v1.10.0