@seekora-ai/ui-sdk-core 0.2.14 → 0.2.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { ThemeConfig, Theme } from '@seekora-ai/ui-sdk-types';
2
- import { SearchResponse, SeekoraClient, SearchOptions } from '@seekora-ai/search-sdk';
2
+ import { SearchResponse, SeekoraClient, SearchOptions, FilterOptions, FiltersResponse, FacetValuesSearchResponse, FiltersSchemaResponse } from '@seekora-ai/search-sdk';
3
3
 
4
4
  /**
5
5
  * Field Mapping Utilities
@@ -355,6 +355,14 @@ declare class SearchStateManager {
355
355
  getAbTestId(): string | undefined;
356
356
  getAbVariant(): string | undefined;
357
357
  setAbTest(abTestId?: string, abVariant?: string): void;
358
+ /** Build filter_by string from current refinements */
359
+ buildFilterString(): string;
360
+ /** Fetch filter values independently from search */
361
+ fetchFilters(options?: FilterOptions): Promise<FiltersResponse>;
362
+ /** Search within a facet's values (for autocomplete in facet search boxes) */
363
+ searchFacetValues(facetName: string, query: string): Promise<FacetValuesSearchResponse>;
364
+ /** Get filter schema (for UI initialization) */
365
+ getFiltersSchema(): Promise<FiltersSchemaResponse>;
358
366
  clear(): void;
359
367
  }
360
368
 
package/dist/index.esm.js CHANGED
@@ -303,12 +303,6 @@ function generateComponentClasses(prefix) {
303
303
  color: var(${prefix}-color-textSecondary);
304
304
  }
305
305
 
306
- .seekora-results__loading {
307
- padding: var(${prefix}-spacing-large);
308
- text-align: center;
309
- color: var(${prefix}-color-textSecondary);
310
- }
311
-
312
306
  /* Pagination */
313
307
  .seekora-pagination {
314
308
  display: flex;
@@ -1677,6 +1671,87 @@ class SearchStateManager {
1677
1671
  this.abVariant = abVariant;
1678
1672
  log.verbose('SearchStateManager: A/B test updated', { abTestId, abVariant });
1679
1673
  }
1674
+ // =========================================================================
1675
+ // Filters API
1676
+ // =========================================================================
1677
+ /** Build filter_by string from current refinements */
1678
+ buildFilterString() {
1679
+ if (this.state.refinements.length === 0)
1680
+ return '';
1681
+ const filtersByField = {};
1682
+ this.state.refinements.forEach((refinement) => {
1683
+ if (!filtersByField[refinement.field]) {
1684
+ filtersByField[refinement.field] = [];
1685
+ }
1686
+ filtersByField[refinement.field].push(refinement.value);
1687
+ });
1688
+ const filterParts = [];
1689
+ Object.entries(filtersByField).forEach(([field, values]) => {
1690
+ values.forEach((value) => {
1691
+ filterParts.push(`${field}:${value}`);
1692
+ });
1693
+ });
1694
+ return filterParts.join(' && ');
1695
+ }
1696
+ /** Fetch filter values independently from search */
1697
+ async fetchFilters(options) {
1698
+ log.verbose('SearchStateManager: Fetching filters', { options });
1699
+ try {
1700
+ const filterString = this.buildFilterString();
1701
+ const response = await this.client.getFilters({
1702
+ q: this.state.query || undefined,
1703
+ filter: filterString || undefined,
1704
+ ...options,
1705
+ });
1706
+ log.info('SearchStateManager: Filters fetched', {
1707
+ filterCount: response?.filters?.length,
1708
+ });
1709
+ return response;
1710
+ }
1711
+ catch (err) {
1712
+ const error = err instanceof Error ? err : new Error(String(err));
1713
+ log.error('SearchStateManager: Failed to fetch filters', { error: error.message });
1714
+ throw error;
1715
+ }
1716
+ }
1717
+ /** Search within a facet's values (for autocomplete in facet search boxes) */
1718
+ async searchFacetValues(facetName, query) {
1719
+ log.verbose('SearchStateManager: Searching facet values', { facetName, query });
1720
+ try {
1721
+ const filterString = this.buildFilterString();
1722
+ const response = await this.client.searchFacetValues(facetName, {
1723
+ q: this.state.query || undefined,
1724
+ filter: filterString || undefined,
1725
+ facetQuery: query,
1726
+ });
1727
+ log.info('SearchStateManager: Facet values fetched', {
1728
+ facetName,
1729
+ valueCount: response?.values?.length,
1730
+ });
1731
+ return response;
1732
+ }
1733
+ catch (err) {
1734
+ const error = err instanceof Error ? err : new Error(String(err));
1735
+ log.error('SearchStateManager: Failed to search facet values', { facetName, error: error.message });
1736
+ throw error;
1737
+ }
1738
+ }
1739
+ /** Get filter schema (for UI initialization) */
1740
+ async getFiltersSchema() {
1741
+ log.verbose('SearchStateManager: Getting filters schema');
1742
+ try {
1743
+ const response = await this.client.getFiltersSchema();
1744
+ log.info('SearchStateManager: Filters schema fetched', {
1745
+ fieldCount: response?.fields?.length,
1746
+ });
1747
+ return response;
1748
+ }
1749
+ catch (err) {
1750
+ const error = err instanceof Error ? err : new Error(String(err));
1751
+ log.error('SearchStateManager: Failed to get filters schema', { error: error.message });
1752
+ throw error;
1753
+ }
1754
+ }
1680
1755
  // Clear all state
1681
1756
  clear() {
1682
1757
  this.state = {