Jake Vanderwerf
9 days ago ed57c386db34d8693ca75311972d0929ebe5f488
assets/js/concise/DataStore.js
@@ -51,7 +51,7 @@
      if (!this.dbConfig.has(name)) {
         this.dbConfig.set(name, {
            dbName: `jvb_${name}`,
            dbName: `${jvbBase.base}${name}`,
            version: version,
            stores: {},
            _initialized: false
@@ -85,6 +85,8 @@
               ignore: [],       //any filters to ignore when filtering store locally
               required: null,
               isAuth: false,
               // Cache
               TTL: 3600000, // 1 hour
               useHttpCaching: true,
@@ -542,11 +544,27 @@
         const controller = new AbortController();
         store.currentRequest = controller;
         const response = await fetch(url, {
            method: 'GET',
            headers,
            signal: controller.signal
         });
         let response;
         if (store.isAuth) {
            response = await window.auth.fetch(url, {
               method: 'GET',
               headers,
               signal: controller.signal
            });
         } else {
            response = await fetch(url, {
               method: 'GET',
               headers,
               signal: controller.signal
            });
         }
         if (!response.ok) {
            // Access the error details from the response body
            const errorBody = await response.text();
            // Throw a new error with a descriptive message
            throw new Error(`HTTP error! status: ${response.status}, message: ${errorBody}`);
         }
         if (response.status === 304) {
            // 304 means "Not Modified" - use cached data if available
@@ -581,7 +599,6 @@
         if (!response.ok) {
            throw new Error(`HTTP ${response.status}: ${response.statusText}`);
         }
         const data = await response.json();
         await this.processFetchedData(name, data, cacheKey, response);
@@ -597,7 +614,8 @@
         const isAbortError = error?.name === 'AbortError';
         if (!isAbortError) {
            console.error(`Fetch error for store "${name}":`, error);
            console.error(`Fetch error for store "${name}":`, error.message);
            console.dir(error);
            this.notify(name, 'fetch-error', { error });
            throw error;
         }
@@ -903,6 +921,7 @@
      if (type === 'object') {
         const processed = {};
         for (const [key, value] of Object.entries(obj)) {
            if (value === undefined) continue;
            const result = this.processForStorage(value, validate, `${path}.${key}`);
            if (!result.valid) return result;
            // Include null values, skip undefined
@@ -1108,7 +1127,12 @@
      // Handle other filters
      for (const [key, value] of Object.entries(store.filters)) {
         if (key === 'taxonomy') continue;
         if (key === 'taxonomy') {
            if (typeof value === 'string' && !value.includes(',')) {
               filterPredicates.push(item => item.taxonomy === value);
            }
            continue;
         }
         if (store.ignoreFilters.has(key)) {
            continue;
         }
@@ -1266,14 +1290,9 @@
      }
      if (store.lastResponse.has_more === false) {
         // Check if new filters are a subset of what we have
         const isSubsetFilter = Object.entries(updates).every(([key, value]) => {
            if (store.ignoreFilters.has(key)) return true;
            if (key === 'page') return true; // Handle pagination locally
            return true; // We have all data, can filter locally
         });
         if (isSubsetFilter) return false;
         if (this.hasCompleteData(store, store.filters)) {
            return false;
         }
      }
      if ('page' in updates) {