Jake Vanderwerf
2025-11-25 2a2303d1dccc120dd7aa5f6b6ade0f89e0064850
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);
   }