@indxsearch/intrface 3.0.0-alpha.20260617 → 3.0.0
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/CHANGELOG.md +20 -5
- package/README.md +4 -4
- package/dist/context/SearchContext.d.ts +1 -0
- package/dist/index.cjs.js +1 -1
- package/dist/index.es.js +41 -40
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -5,16 +5,31 @@ All notable changes to `@indxsearch/intrface` will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
-
## [3.0.0] - 2026-
|
|
8
|
+
## [3.0.0] - 2026-08-25
|
|
9
|
+
|
|
10
|
+
First stable release of the v3 line, for IndxCloudApi v2 (IndxSearchLib v5).
|
|
11
|
+
(Supersedes `3.0.0-alpha.20260617`, previously published under the `next` tag.)
|
|
9
12
|
|
|
10
13
|
### Changed
|
|
11
|
-
- **BREAKING**:
|
|
12
|
-
|
|
14
|
+
- **BREAKING**: All dataset operations use the team-scoped IndxCloudApi v2 routes
|
|
15
|
+
(`/api/teams/{team}/datasets/{dataset}/…`). `SearchProvider` takes a required
|
|
16
|
+
`team` prop alongside `dataset`.
|
|
17
|
+
- **BREAKING**: Authentication is token-only. The `email`/`password` props and the
|
|
18
|
+
login flow are removed — pass `preAuthenticatedToken` (create a token on the
|
|
19
|
+
IndxCloudApi API-Key page).
|
|
20
|
+
- Initialization now probes dataset **status before** opening the session, so a
|
|
21
|
+
mistyped dataset name fails with a clear "not found" error instead of silently
|
|
22
|
+
creating an empty dataset on the server.
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
- `authError` on the search context — set when initialization fails (bad token,
|
|
26
|
+
unknown dataset, unreachable server). Previously such failures surfaced only as
|
|
27
|
+
an unhandled promise rejection in the console.
|
|
13
28
|
|
|
14
29
|
### Compatibility
|
|
15
30
|
- Requires IndxCloudApi v2
|
|
16
|
-
-
|
|
17
|
-
- React DOM ^19.0.0
|
|
31
|
+
- `@indxsearch/indx-types` ^2.0.0 · `@indxsearch/systm` ^2.2.0
|
|
32
|
+
- React ^19.0.0 · React DOM ^19.0.0
|
|
18
33
|
|
|
19
34
|
---
|
|
20
35
|
|
package/README.md
CHANGED
|
@@ -21,7 +21,7 @@ A powerful, flexible React search UI library for Indx Search with [IndxCloudApi]
|
|
|
21
21
|
| **React DOM** | `^19.0.0` |
|
|
22
22
|
| **Node.js** | `^20.19.0 \|\| >=22.12.0` |
|
|
23
23
|
|
|
24
|
-
> **Note:** This library targets IndxCloudApi v2.0 (powered by IndxSearchLib v5
|
|
24
|
+
> **Note:** This library targets IndxCloudApi v2.0 (powered by IndxSearchLib v5). Different API versions may have incompatible changes.
|
|
25
25
|
|
|
26
26
|
## Installation
|
|
27
27
|
|
|
@@ -403,7 +403,7 @@ const { state, setQuery } = useSearch();
|
|
|
403
403
|
|
|
404
404
|
### useVectorSearch
|
|
405
405
|
|
|
406
|
-
Embedding-based vector search against the `
|
|
406
|
+
Embedding-based vector search against the `search/vector` endpoint. You supply an `embeddingFn` that turns query text into a vector; the hook posts it and resolves the matching documents.
|
|
407
407
|
|
|
408
408
|
```typescript
|
|
409
409
|
import { useVectorSearch } from '@indxsearch/intrface';
|
|
@@ -421,7 +421,7 @@ await search('comfortable running shoes');
|
|
|
421
421
|
|
|
422
422
|
### useHybridSearch
|
|
423
423
|
|
|
424
|
-
Combines full-text and vector scoring via the `
|
|
424
|
+
Combines full-text and vector scoring via the `search/hybrid` endpoint. Same shape as `useVectorSearch`, plus an `alpha` blend factor.
|
|
425
425
|
|
|
426
426
|
```typescript
|
|
427
427
|
import { useHybridSearch } from '@indxsearch/intrface';
|
|
@@ -476,7 +476,7 @@ These components are also exported and can be used for custom layouts:
|
|
|
476
476
|
|
|
477
477
|
**Solutions:**
|
|
478
478
|
1. Verify dataset name is correct
|
|
479
|
-
2. Check if dataset is indexed (
|
|
479
|
+
2. Check if dataset is indexed (`GET /api/teams/{team}/datasets/{dataset}/status`)
|
|
480
480
|
3. Ensure fields are configured as indexable/facetable
|
|
481
481
|
4. Try `allowEmptySearch={true}` to see all results
|
|
482
482
|
|
package/dist/index.cjs.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));require("@indxsearch/systm/styles.css");let c=require("react");c=s(c);let l=require("@indxsearch/indx-types"),u=require("react/jsx-runtime"),d=require("@indxsearch/systm"),f=require("@indxsearch/pixl");function p({url:e,team:t,dataset:n,preAuthenticatedToken:r,enableDebugLogs:i=!1}){let[a,o]=(0,c.useState)(null),[s,u]=(0,c.useState)(!0),[d,f]=(0,c.useState)([]),[p,m]=(0,c.useState)([]),[h,g]=(0,c.useState)([]),[_,v]=(0,c.useState)({}),[y,b]=(0,c.useState)({}),[x,S]=(0,c.useState)(0);return(0,c.useEffect)(()=>{(async()=>{try{if(!r)throw console.error(`[Auth] ❌ Missing bearer token`),console.error(`[Auth] 💡 Pass preAuthenticatedToken to SearchProvider (create a token on the IndxCloudApi website)`),Error(`A bearer token is required. Check console for instructions.`);if(!e)throw console.error(`[Auth] ❌ Missing INDX server URL`),console.error(`[Auth] 💡 Pass a url to SearchProvider`),Error(`INDX server URL is required. Check console for instructions.`);if(!n)throw console.error(`[Auth] ❌ Missing dataset name`),console.error(`[Auth] 💡 Pass dataset="your-dataset-name" to SearchProvider`),Error(`Dataset name is required. Check console for instructions.`);i&&console.log(`[Auth] ✅ Using bearer token`);let a=r;i&&console.log(`[Auth] 🔓 Opening dataset session...`);let s=await fetch(`${e}/api/teams/${t}/datasets/${n}/CreateOrOpen/400`,{method:`PUT`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${a}`},body:`""`});if(!s.ok)throw console.error(`[Auth] ❌ CreateOrOpen failed:`,s.status,await s.text()),Error(`Failed to open dataset session.`);o(a),i&&console.log(`[Auth] ✅ Dataset session established`);let c=e=>fetch(e,{method:`GET`,headers:{accept:`text/plain`,Authorization:`Bearer ${a}`}});i&&console.log(`[Auth] 🔍 Checking dataset status...`);let u=await c(`${e}/api/teams/${t}/datasets/${n}/GetStatus`);if(!u.ok){if(u.status===401)throw console.error(`[Auth] ❌ Authentication failed (401 Unauthorized)`),console.error(`[Auth] 💡 Your token may be expired or invalid`),console.error(`[Auth] 💡 Create or refresh your token on the IndxCloudApi website`),Error(`Authentication failed (401). Token may be expired. Check console for instructions.`);if(u.status===404)throw console.error(`[Auth] ❌ Dataset "`+n+`" not found (404)`),console.error(`[Auth] 💡 Available datasets can be checked with: curl -X GET "`+e+`/api/me/datasets" -H "Authorization: Bearer YOUR_TOKEN"`),console.error(`[Auth] 💡 Make sure you spelled the dataset name correctly`),Error(`Dataset "`+n+`" not found. Check console for instructions.`);{let t=await u.text();throw console.error(`[Auth] ❌ Failed to get dataset status:`,u.status,t),console.error(`[Auth] 💡 Check if your INDX server is running at:`,e),Error(`Failed to connect to INDX server. Check console for details.`)}}let d=await u.json();i&&console.log(`[Auth] 📊 Dataset status:`,d),d.systemState!==void 0&&d.systemState!==l.SystemState.Ready&&(console.warn(`[Auth] ⚠️ Dataset is not ready yet. Current state:`,l.SystemState[d.systemState]),console.warn(`[Auth] 💡 Wait for indexing to complete before searching`));let p=d.documentCount??d.numberOfRecords??0;p===0?(console.warn(`[Auth] ⚠️ Dataset "`+n+`" is empty (0 records)`),console.warn(`[Auth] 💡 Add documents to your dataset before searching`),console.warn(`[Auth] 💡 Search will work but return no results`)):i&&console.log(`[Auth] ✅ Dataset has`,p,`records`);let[h,_,y]=await Promise.all([c(`${e}/api/teams/${t}/datasets/${n}/GetFilterableFields`),c(`${e}/api/teams/${t}/datasets/${n}/GetFacetableFields`),c(`${e}/api/teams/${t}/datasets/${n}/GetSortableFields`)]);if(!h.ok)throw console.error(`[Auth] ❌ GetFilterableFields failed:`,h.status,await h.text()),Error(`Failed to get filterable fields. Check console for details.`);if(!_.ok)throw console.error(`[Auth] ❌ GetFacetableFields failed:`,_.status,await _.text()),Error(`Failed to get facetable fields. Check console for details.`);if(!y.ok)throw console.error(`[Auth] ❌ GetSortableFields failed:`,y.status,await y.text()),Error(`Failed to get sortable fields. Check console for details.`);let[x,C,w]=await Promise.all([h.json().catch(e=>(console.error(`Failed to parse GetFilterableFields response:`,e),[])),_.json().catch(e=>(console.error(`Failed to parse GetFacetableFields response:`,e),[])),y.json().catch(e=>(console.error(`Failed to parse GetSortableFields response:`,e),[]))]);f(x||[]),m(C||[]),g(w||[]),S(p);let T={facets:{}};try{let r=await fetch(`${e}/api/teams/${t}/datasets/${n}/Search`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${a}`},body:JSON.stringify({text:``,maxNumberOfRecordsToReturn:0,enableFacets:!0})});r.ok?T=await r.json().catch(e=>(console.warn(`Failed to parse blank search response:`,e),{facets:{}})):(console.warn(`Blank search failed:`,r.status,r.statusText),console.warn(`Continuing without initial facet data - facets will be populated after first search`))}catch(e){console.warn(`Blank search error:`,e),console.warn(`Continuing without initial facet data - facets will be populated after first search`)}let E={};if(T.facets){for(let[e,t]of Object.entries(T.facets))if(Array.isArray(t)&&t.length>0){let n=t.map(e=>Number(e.key)).filter(e=>!isNaN(e));n.length>0&&(E[e]={min:Math.min(...n),max:Math.max(...n)})}}let D={};if(T.facets)for(let[e,t]of Object.entries(T.facets))Array.isArray(t)&&(D[e]=t.map(e=>e.key));v(E),b(D),i&&console.log(`[Auth] ✅ Initialization complete`)}catch(t){throw console.error(`[Auth] ❌ Initialization failed:`,t),(t instanceof Error||typeof t==`object`&&t&&`message`in t)&&console.error(`[Auth] 💡 Error:`,t.message),t instanceof TypeError&&t.message.includes(`fetch`)&&(console.error(`[Auth] ❌ Network error - cannot connect to INDX server`),console.error(`[Auth] 💡 Check if the server is running at:`,e),console.error(`[Auth] 💡 Check the url you passed to SearchProvider`),console.error(`[Auth] 💡 For local development, it should be: http://localhost:5001`)),t}finally{u(!1)}})()},[e,t,n]),{token:a,isFetchingInitial:s,initialFacetStats:_,initialFacetKeys:y,filterableFields:d,facetableFields:p,sortableFields:h,totalDocumentCount:x}}async function m(e,t,n,r,i){if(e.length===0)return null;if(e.length===1)return e[0];let a=e[0];for(let o=1;o<e.length;o++){let s=await i(`${t}/api/teams/${n}/datasets/${r}/CombineFilters`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({a,b:e[o],useAndOperation:!0})});if(!s.ok){let e=await s.json();throw console.error(`CombineFilters failed:`,e),Error(`CombineFilters failed`)}a=await s.json()}return a}async function h(e,t,n,r,i,a){let o=Object.entries(e??{}),s=Object.entries(t??{}),[c,l]=await Promise.all([Promise.all(o.map(([e,t])=>Promise.all(t.map(t=>a(`${n}/api/teams/${r}/datasets/${i}/CreateValueFilter`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({fieldName:e,value:t})}).then(e=>e.json()))))),Promise.all(s.map(([e,{min:t,max:o}])=>a(`${n}/api/teams/${r}/datasets/${i}/CreateRangeFilter`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({fieldName:e,lowerLimit:t,upperLimit:o})}).then(e=>e.json())))]);return m([...c.flat(),...l].filter(e=>e&&typeof e.hashString==`string`),n,r,i,a)}function g(e,t){let n,r=(...r)=>{clearTimeout(n),n=setTimeout(()=>e(...r),t)};return r.cancel=()=>clearTimeout(n),r}function _({state:e,setState:t,authenticatedFetch:n,auth:r,url:i,team:a,dataset:o,allowEmptySearch:s,facetsEnabled:l,enableDebugLogs:u,filtersChangedByUser:d,shouldFetchMore:f}){let p=(0,c.useRef)(0),m=(0,c.useRef)(void 0),_=(0,c.useRef)(!1),[v,y]=(0,c.useState)({}),[b,x]=(0,c.useState)(``),[S,C]=(0,c.useState)(``);(0,c.useEffect)(()=>{r.isFetchingInitial||t(e=>({...e,facetStats:r.initialFacetStats,rangeBounds:r.initialFacetStats,totalDocumentCount:r.totalDocumentCount,filterableFields:r.filterableFields,facetableFields:r.facetableFields,sortableFields:r.sortableFields}))},[r.isFetchingInitial,r.initialFacetStats,r.totalDocumentCount,r.filterableFields,r.facetableFields,r.sortableFields,t]);let w=e.searchSettings.maxNumberOfRecordsToReturn,T=e.searchSettings.enableCoverage,E=e.searchSettings.removeDuplicates,D=e.searchSettings.coverageDepth,O=e.searchSettings.minimumScore,k=e.searchSettings.coverageSetup,A=e.sortBy,j=e.sortAscending,M=(0,c.useCallback)(async({enableFacets:c})=>{if(!r.token)return;let l=++p.current;if(t(e=>({...e,isLoading:!0})),e.query.trim()===``){if(!s)return;c=!0}try{let d=await h(e.filters,e.rangeFilters,i,a,o,n),f=s||e.query.trim()!==``,m={text:e.query,maxNumberOfRecordsToReturn:f?w:0,enableFacets:c,...d?{filter:d}:{},...A?{sortBy:A}:{},...j===void 0?{}:{sortAscending:j},enableCoverage:T,removeDuplicates:E,coverageDepth:D,coverageSetup:k};u&&console.log(`[performSearch] request body:`,JSON.stringify(m,null,2));let g=await(await n(`${i}/api/teams/${a}/datasets/${o}/Search`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(m)})).json(),_=g.truncationIndex??-1,M=g.records||[],N=M.map(e=>e.documentKey),P=M.map(e=>e.score),F=[];f&&N.length>0&&(F=(await(await n(`${i}/api/teams/${a}/datasets/${o}/GetJson`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(N)})).json()).map((e,t)=>({document:e,documentKey:N[t],score:P[t]})));let I={};if(c&&g.facets){for(let[e,t]of Object.entries(g.facets))if(Array.isArray(t)&&t.length>0){let n=t.map(e=>Number(e.key)).filter(e=>!isNaN(e));n.length>0&&(I[e]={min:Math.min(...n),max:Math.max(...n)})}}let L=e.query!==b,R=e.query!==S,z=e.facetStats??{};if(L?(z={...r.initialFacetStats,...I},y(z),x(e.query)):z={...v,...I},R&&c){let n={...e.rangeBounds};for(let[e,t]of Object.entries(I))n[e]=t;t(e=>({...e,rangeBounds:n})),C(e.query)}let B=g.facets;if(c&&(!B||Object.keys(B).length===0)){B={};for(let[e,t]of Object.entries(r.initialFacetKeys))B[e]=t.map(e=>({key:e,value:null}))}if(l!==p.current)return;let V=F.filter(t=>{let n=e.query.trim();return n===``||n.length===1?!0:t.score>=O});t(e=>({...e,results:V,resultsSuppressed:!f,...c?{facets:B,facetStats:z}:{},isLoading:!1,truncationIndex:_}))}catch(e){if(console.error(`[Search] ❌ Search failed:`,e),e instanceof TypeError&&e.message.includes(`fetch`)?(console.error(`[Search] ❌ Network error - cannot reach INDX server`),console.error(`[Search] 💡 Check if server is running at:`,i)):e instanceof Error&&(e.message.includes(`401`)?(console.error(`[Search] ❌ Authentication failed`),console.error(`[Search] 💡 Your token may have expired. Create or refresh it on the IndxCloudApi website.`)):e.message.includes(`404`)?(console.error(`[Search] ❌ Dataset not found`),console.error(`[Search] 💡 Check that dataset "`+o+`" exists`)):console.error(`[Search] 💡 Error:`,e.message)),l!==p.current)return;t(t=>({...t,results:null,isLoading:!1,resultsSuppressed:!1,error:e instanceof Error?e.message:`Search failed`}))}},[e.query,e.filters,e.rangeFilters,e.facetStats,A,j,w,T,E,D,k,O,n,r.initialFacetStats,r.initialFacetKeys,r.token,v,b,S,e.rangeBounds,i,a,o,s,u,t]);(0,c.useEffect)(()=>{m.current=M},[M]);let N=(0,c.useRef)(null);(0,c.useEffect)(()=>(N.current?.cancel(),N.current=g(()=>{u&&console.log(`Debounced searchWithFacets fired`),m.current?.({enableFacets:!0})},e.facetDebounceDelayMillis??500),()=>{N.current?.cancel()}),[e.facetDebounceDelayMillis]),(0,c.useEffect)(()=>{!r.isFetchingInitial&&r.token&&!_.current&&(s&&m.current?.({enableFacets:l}),_.current=!0)},[r.isFetchingInitial,r.token,s,l]),(0,c.useEffect)(()=>{if(!r.token||!_.current)return;let n=e.query.trim(),i=n===``&&s;if(n===``&&!s){e.resultsSuppressed||t(e=>({...e,resultsSuppressed:!0}));return}return i?(N.current?.cancel(),m.current?.({enableFacets:l})):l?(u&&console.log(`Search fired`),m.current?.({enableFacets:!1}),N.current?.()):m.current?.({enableFacets:!1}),()=>{N.current?.cancel()}},[e.query,s,l]),(0,c.useEffect)(()=>{let t=d.current;if(d.current=!1,!_.current||!r.token||!t)return;let n=e.query.trim();l&&!(!s&&n===``)&&m.current?.({enableFacets:!0})},[e.filters,e.rangeFilters]),(0,c.useEffect)(()=>{if(!_.current||!r.token)return;let t=e.query.trim();l&&!(!s&&t===``)&&m.current?.({enableFacets:!0})},[A,j]),(0,c.useEffect)(()=>{!_.current||!r.token||f.current&&(f.current=!1,m.current?.({enableFacets:!1}))},[w,r.token])}var v=(0,c.createContext)(void 0),y=({children:e,url:t,team:n,dataset:r,allowEmptySearch:i=!1,maxResults:a=10,facetDebounceDelayMillis:o=500,enableFacets:s=!0,coverageDepth:l=500,removeDuplicates:d=!0,enableCoverage:f=!0,initialCoverageSetup:m={},enableDebugLogs:h=!1,preAuthenticatedToken:g})=>{let y=(0,c.useRef)(!1),b=(0,c.useRef)(!1),[x,S]=(0,c.useState)({query:``,results:null,isLoading:!1,resultsSuppressed:!i,facetDebounceDelayMillis:o,filterableFields:[],facetableFields:[],sortableFields:[],filters:{},rangeFilters:{},facetStats:{},rangeBounds:{},searchSettings:{maxNumberOfRecordsToReturn:a,coverageDepth:l,enableCoverage:f,removeDuplicates:d,minimumScore:0,showScore:!0,placeholderText:`Type to search`,coverageSetup:{coverWholeQuery:!0,coverWholeWords:!0,coverFuzzyWords:!0,coverJoinedWords:!0,coverPrefixSuffix:!0,truncate:!0,includePatternMatches:!0,minWordSize:2,levenshteinMaxWordSize:20,truncateWordHitLimit:1,truncateWordHitTolerance:0,truncationScore:65024,...m}}});(0,c.useEffect)(()=>{h&&console.log(`SearchContext mounted on client`)},[h]),(0,c.useEffect)(()=>{S(e=>({...e,facetDebounceDelayMillis:o}))},[o]);let[C]=(0,c.useState)(s),w=p({url:t,team:n,dataset:r,preAuthenticatedToken:g,enableDebugLogs:h}),T=(0,c.useCallback)((e,t={})=>{if(!w.token)throw Error(`No authentication token available`);return fetch(e,{...t,headers:{...t.headers,Authorization:`Bearer ${w.token}`}})},[w.token]);_({state:x,setState:S,authenticatedFetch:T,auth:w,url:t,team:n,dataset:r,allowEmptySearch:i,facetsEnabled:C,enableDebugLogs:h,filtersChangedByUser:y,shouldFetchMore:b});let E=(0,c.useCallback)(e=>{y.current=!1,S(t=>{let n=Object.keys(t.filters).length>0,r=Object.keys(t.rangeFilters).length>0;return{...t,query:e,filters:n?{}:t.filters,rangeFilters:r?{}:t.rangeFilters,searchSettings:{...t.searchSettings,maxNumberOfRecordsToReturn:a}}})},[a]),D=(0,c.useCallback)(e=>{S(t=>({...t,facetDebounceDelayMillis:e}))},[]),O=(0,c.useCallback)(e=>{S(t=>{let n={...t.searchSettings,...e};return e.coverageSetup?n.coverageSetup={...t.searchSettings.coverageSetup,...e.coverageSetup}:n.coverageSetup=t.searchSettings.coverageSetup,{...t,searchSettings:n}})},[]),k=(0,c.useCallback)(e=>{b.current=!0,S(t=>({...t,searchSettings:{...t.searchSettings,maxNumberOfRecordsToReturn:e}}))},[]),A=(0,c.useCallback)((e,t)=>{y.current=!0,S(n=>{let r={...n.filters},i=r[e]||[],a=i.includes(t)?i.filter(e=>e!==t):[...i,t];return a.length?r[e]=a:delete r[e],{...n,filters:r}})},[]),j=(0,c.useCallback)((e,t,n)=>{y.current=!0,S(r=>({...r,rangeFilters:{...r.rangeFilters,[e]:{min:t,max:n}}}))},[]),M=(0,c.useCallback)(()=>{y.current=!0,S(e=>({...e,filters:{},rangeFilters:{}}))},[]),N=(0,c.useCallback)((e,t,n=!0)=>{n&&(y.current=!0),S(n=>{let r={...n.filters},i=(r[e]||[]).filter(e=>e!==t);return i.length>0?r[e]=i:delete r[e],{...n,filters:r}})},[]),P=(0,c.useCallback)((e,t=!0)=>{t&&(y.current=!0),S(t=>{let n={...t.rangeFilters};return delete n[e],{...t,rangeFilters:n}})},[]),F=(0,c.useCallback)((e,t)=>{S(n=>({...n,sortBy:e||void 0,sortAscending:e?t:void 0}))},[]);return(0,u.jsx)(v.Provider,{value:{state:x,isFetchingInitial:w.isFetchingInitial,allowEmptySearch:i,url:t,team:n,dataset:r,authenticatedFetch:T,setQuery:E,toggleFilter:A,setRangeFilter:j,resetFilters:M,resetSingleFilter:N,resetRangeFilter:P,setSort:F,setDebounceDelay:D,setSearchSettings:O,fetchMoreResults:k},children:e})},b=()=>{let e=(0,c.useContext)(v);if(!e)throw Error(`useSearchContext must be used within a SearchProvider`);return e},x=({className:e=``,autoFocus:t=!1,inputSize:n=`default`,showClear:r=!0,showFocus:i=!1,...a})=>{let{state:{query:o,filters:s,rangeFilters:c,searchSettings:l},setQuery:f}=b();Object.keys(s).length>0||Object.keys(c).length;let p=o.length>0;return(0,u.jsx)(d.SearchField,{type:`text`,value:o,onChange:e=>f(e.target.value),placeholder:l.placeholderText,autoFocus:t,className:e,showSearchIcon:!0,inputSize:n,showFocusBorder:i,...a,children:r&&p&&(0,u.jsx)(d.Button,{variant:`ghost`,size:`micro`,onClick:()=>f(``),"aria-label":`Clear search`,children:`Clear`})})},S={placeholder:`_placeholder_ee9qi_1`,invalid:`_invalid_ee9qi_11`},C={row:`_row_1i201_1`,content:`_content_1i201_19`,indexNumber:`_indexNumber_1i201_31`,scoreNumber:`_scoreNumber_1i201_39`,skeletonBars:`_skeletonBars_1i201_53`,skeletonBarLg:`_skeletonBarLg_1i201_59`,fade:`_fade_1i201_1`,skeletonBarSm:`_skeletonBarSm_1i201_66`},w=({skeleton:e=!1,index:t,score:n,showScore:r=!1,children:i,skeletonDelay:a=0,skeletonWidths:o=[62,38]})=>(0,u.jsxs)(`div`,{className:C.row,children:[t!==void 0&&(0,u.jsx)(`div`,{className:C.indexNumber,children:t}),(0,u.jsx)(`div`,{className:C.content,children:e?(0,u.jsxs)(`div`,{className:C.skeletonBars,children:[(0,u.jsx)(`div`,{className:C.skeletonBarLg,style:{width:`${o[0]}%`,animationDelay:`${a}s`}}),(0,u.jsx)(`div`,{className:C.skeletonBarSm,style:{width:`${o[1]}%`,animationDelay:`${a+.05}s`}})]}):i}),r&&n!==void 0&&(0,u.jsx)(`div`,{className:C.scoreNumber,children:n})]}),T={wrapper:`_wrapper_81m3c_6`,skeletonAppear:`_skeletonAppear_81m3c_1`},E=[[62,38],[75,45],[58,33],[70,42],[65,50],[55,35],[72,40],[60,30]],D=({rows:e=6})=>(0,u.jsx)(`div`,{className:T.wrapper,children:Array.from({length:e}).map((e,t)=>(0,u.jsx)(w,{skeleton:!0,skeletonDelay:t*.1,skeletonWidths:E[t%E.length]},t))}),O=({fields:e,resultsPerPage:t,children:n})=>{let{state:{results:r,resultsSuppressed:i,searchSettings:a,truncationIndex:o,query:s},isFetchingInitial:l,allowEmptySearch:p,fetchMoreResults:m}=b(),h=t??30,[g,_]=(0,c.useState)(h),v=(0,c.useRef)(0),y=(0,c.useRef)(``);(0,c.useEffect)(()=>{let e=s!==y.current;(!r||r.length<v.current||e)&&_(h),v.current=r?.length??0,y.current=s},[r,h,s]);let x=r&&r.length>g;return l?p?(0,u.jsx)(D,{rows:h}):(0,u.jsx)(`div`,{className:S.placeholder,children:(0,u.jsx)(f.Indx,{size:200,color:`var(--lv5)`})}):i||r===null?(0,u.jsx)(`div`,{className:S.placeholder,children:(0,u.jsx)(f.Indx,{size:200,color:`var(--lv5)`})}):r.length===0?(0,u.jsx)(`div`,{className:S.invalid,children:(0,u.jsx)(`p`,{children:`No results found.`})}):(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(`div`,{children:(r??[]).slice(0,g).map((t,r)=>{let i=t.document,o=t.score,s;try{s=typeof i==`string`?JSON.parse(i):i}catch{return(0,u.jsx)(`div`,{className:S.invalid,children:(0,u.jsx)(`p`,{children:`Invalid JSON`})},r)}let c;if(e&&e.length>0){c={};for(let t of e)t in s&&(c[t]=s[t])}else c={...s};for(let e in c){let t=c[e];if(typeof t==`string`&&t.startsWith(`[`)&&t.endsWith(`]`)){let n=t.replace(/^\[|\]$/g,``);c[e]=n.split(`,`).map(e=>e.trim().replace(/^'|'$/g,``)).filter(e=>e.length>0)}}return(0,u.jsx)(w,{index:r,score:o,showScore:a.showScore,children:n(c)},r)})}),x&&(0,u.jsx)(`div`,{style:{textAlign:`center`,marginTop:`20px`},children:(0,u.jsx)(d.Button,{variant:`secondary`,size:`micro`,onClick:()=>{let e=g+h;_(e),r&&e>=r.length&&(!o||o===-1||o>r.length)&&m(r.length+h)},children:s.trim()===``?`Load more`:o!==-1&&o!==void 0&&o>0?`Load results ${g+1}-${Math.min(g+h,r.length,o)} of ${o}`:`Load more`})})]})},k={row:`_row_ujwhc_1`,title:`_title_ujwhc_8`},A=({variant:e=`default`,children:t})=>(0,u.jsx)(`div`,{className:[k.row,e===`title`?k.title:``].filter(Boolean).join(` `),children:t}),j={bar:`_bar_145f5_12`,skeletonAppear:`_skeletonAppear_145f5_1`,fade:`_fade_145f5_1`,listRows:`_listRows_145f5_19`,sliderArea:`_sliderArea_145f5_25`,sliderTrack:`_sliderTrack_145f5_32`,inputRow:`_inputRow_145f5_40`,inputBar:`_inputBar_145f5_45`},M=[65,80,55,72,60,75,50,68],N=({title:e,rows:t=5,variant:n=`list`,collapsible:r=!0,startCollapsed:i=!1})=>(0,u.jsx)(d.FilterPanelBase,{title:e,collapsible:r,collapsed:i,children:n===`slider`?(0,u.jsxs)(`div`,{className:j.sliderArea,children:[(0,u.jsx)(`div`,{className:j.sliderTrack}),(0,u.jsxs)(`div`,{className:j.inputRow,children:[(0,u.jsx)(`div`,{className:j.inputBar,style:{animationDelay:`0.1s`}}),(0,u.jsx)(`div`,{className:j.inputBar,style:{animationDelay:`0.15s`}})]})]}):(0,u.jsx)(`div`,{className:j.listRows,children:Array.from({length:t}).map((e,t)=>(0,u.jsx)(`div`,{className:j.bar,style:{width:`${M[t%M.length]}%`,animationDelay:`${t*.05}s`}},t))})}),P={list:`_list_m82u6_2`,count:`_count_m82u6_7`,countValue:`_countValue_m82u6_17`,chip:`_chip_m82u6_22`,chipLabel:`_chipLabel_m82u6_32`,grid:`_grid_m82u6_40`},F=({field:e,label:t,preserveBlankFacetState:n=!1,preserveBlankFacetStateOrder:r=!1,sortFacetsBy:i=`histogram`,limit:a=10,collapsible:o=!0,startCollapsed:s=!1,displayType:l=`checkbox`,layout:f=`list`,showActivePanel:p=!1,showCount:m=!0,showNull:h=!1,displayIfEmptyQuery:g=!0,displayCondition:_=e=>!0})=>{let{state:{facets:v,filterableFields:y,facetableFields:x,filters:S,query:C},toggleFilter:w,isFetchingInitial:T,allowEmptySearch:E}=b(),D=(0,c.useRef)(null),[O,k]=(0,c.useState)(a);if((0,c.useEffect)(()=>{k(a)},[v?.[e],a]),!E&&!C)return null;if(T||!v)return l===`toggle`?(0,u.jsx)(N,{rows:1,collapsible:!1}):(0,u.jsx)(N,{title:t,rows:Math.min(a,6),collapsible:o,startCollapsed:s});if(!_({query:C??``,filters:S,facets:v})||!g&&!C&&Object.keys(S).length<1)return null;if(!y?.includes(e)||!x?.includes(e)){let t=[];return y?.includes(e)||t.push(`filterable`),x?.includes(e)||t.push(`facetable`),(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,children:(0,u.jsxs)(`div`,{style:{color:`red`,fontSize:`12px`},children:[`Cannot render filter for "`,e,`": missing `,t.join(` and `),`.`]})})}let A=v?.[e];if(!A||!Array.isArray(A))return null;let j=S?.[e]??[];n&&!D.current&&A.length>0&&(D.current=A.reduce((e,t)=>(e[t.key]=t.value,e),{}));let M=new Map;n&&D.current&&Object.keys(D.current).forEach(e=>{M.set(e,0)}),A.forEach(e=>{M.set(e.key,e.value)});let F=l===`toggle`&&M.size===2&&M.has(`true`)&&(M.has(`false`)||M.has(`null`));if(M.has(`null`)){let e=M.get(`null`)??0,t=M.get(`false`)??0;M.set(`false`,(t??0)+e),M.delete(`null`)}if(l===`toggle`&&!F)return(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,children:(0,u.jsx)(`div`,{className:P.count,children:(0,u.jsx)(d.ToggleSwitch,{label:t,checked:!1,onChange:()=>{},disabled:!0})})});if(F){let n=M.get(`true`),r=typeof n==`number`?n:null,i=j.includes(`true`),a=r===0,o=m&&(r??0)>0?`${r}`:``;return(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,children:(0,u.jsxs)(`div`,{className:P.count,children:[(0,u.jsx)(d.ToggleSwitch,{label:t,checked:i,onChange:()=>w(e,`true`),disabled:a}),` `,o]})})}let I=Array.from(M.entries());if(h||(I=I.filter(([e])=>e!==`null`)),I.length===0&&!n)return null;if(!r)if(i===`alphabetical`){let e=I.filter(([,e])=>typeof e==`number`&&e>0).sort(([e],[t])=>e.localeCompare(t)),t=I.filter(([,e])=>e===0||e===null).sort(([e],[t])=>e.localeCompare(t));I=[...e,...t]}else if(i===`numeric`){let e=(e,t)=>{let n=Number(e),r=Number(t);return!isNaN(n)&&!isNaN(r)?n-r:e.localeCompare(t)},t=I.filter(([,e])=>typeof e==`number`&&e>0).sort(([t],[n])=>e(t,n)),n=I.filter(([,e])=>e===0||e===null).sort(([t],[n])=>e(t,n));I=[...t,...n]}else{let e=I.filter(([,e])=>typeof e==`number`&&e>0),t=I.filter(([,e])=>e===0||e===null);I=[...e,...t]}let L=typeof a==`number`&&I.length>a,R=L?I.slice(0,O):I,z=(t,n)=>{let r=j.includes(t),i=n===0,a=m&&(n??0)>0?` (${n})`:``,o=m&&(n??0)>0?n:``;switch(l){case`button`:return f===`list`?(0,u.jsxs)(`div`,{className:P.count,children:[(0,u.jsx)(d.Button,{variant:r?`primary`:`secondary`,onClick:()=>w(e,t),disabled:i,size:`micro`,className:P.chip,title:t,children:(0,u.jsx)(`span`,{className:P.chipLabel,children:t})}),(0,u.jsx)(`span`,{className:P.countValue,children:o})]}):(0,u.jsx)(d.Button,{variant:r?`primary`:`secondary`,onClick:()=>w(e,t),disabled:i,size:`micro`,className:P.chip,title:`${t}${a}`,children:(0,u.jsx)(`span`,{className:P.chipLabel,children:`${t}${a}`})});case`toggle`:return(0,u.jsx)(d.ToggleSwitch,{label:t,checked:r,onChange:()=>w(e,t),disabled:i});default:return f===`list`?(0,u.jsxs)(`div`,{className:P.count,children:[(0,u.jsx)(d.Checkbox,{label:t,score:``,checked:r,onChange:()=>w(e,t),disabled:i}),(0,u.jsx)(`span`,{children:o})]}):(0,u.jsx)(d.Checkbox,{label:t,score:a,checked:r,onChange:()=>w(e,t),disabled:i})}};return(0,u.jsx)(d.FilterPanelBase,{title:t,collapsible:o,collapsed:o?s:!1,children:(0,u.jsxs)(`ul`,{className:f===`grid`?P.grid:P.list,style:{listStyle:`none`,padding:0,margin:0},children:[R.map(([e,t])=>(0,u.jsx)(`li`,{children:z(e,t)},e)),L&&O<I.length&&(()=>{let e=I.length-O,t=Math.min(50,e);return(0,u.jsx)(`li`,{className:P.toggleItem,children:(0,u.jsx)(d.Button,{variant:`ghost`,size:`micro`,onClick:()=>k(e=>e+50),children:`Show ${t} more of ${I.length} total`})})})()]})})},I={disabledMessage:`_disabledMessage_uci6n_1`,histogram:`_histogram_uci6n_6`,histogramBar:`_histogramBar_uci6n_15`},L=({field:e,label:t,expectedMin:n=0,expectedMax:r=1e3,displayType:i=`input`,collapsible:a=!0,startCollapsed:o=!1,showHistogram:s=!1,resolution:l})=>{let{state:{rangeFilters:f,rangeBounds:p,facetStats:m,facets:h,facetableFields:g,query:_,facetDebounceDelayMillis:v},setRangeFilter:y,resetRangeFilter:x,allowEmptySearch:S,isFetchingInitial:C}=b(),w=p?.[e]!==void 0,T=p?.[e]??{min:n,max:r},E=T.min,D=T.max,O=m?.[e]??T,k=Math.max(E,Math.min(D,O.min)),A=Math.max(E,Math.min(D,O.max)),j=w&&E===D,M=j?n:E,P=j?r:D,F=f?.[e],L=F?F.min:E,R=F?F.max:D,z=F!==void 0,B=k!==E||A!==D,[V,H]=c.default.useState([L,R]),[U,W]=c.default.useState(!1),[G,K]=c.default.useState(!1),{finalMin:q,finalMax:J,isValidMin:Y,isValidMax:X}=c.default.useMemo(()=>{let[e,t]=V,n=Math.max(E,Math.min(D,e)),r=Math.max(E,Math.min(D,t)),i=Math.min(n,r),a=Math.max(n,r);return{finalMin:i,finalMax:a,isValidMin:i>=E&&i<a,isValidMax:a<=D&&a>i}},[V,E,D]);c.default.useEffect(()=>{if(j)return;if(V[0]===E&&V[1]===D){W(!1),K(!1);return}let t=v??500,n=setTimeout(()=>{W(!Y),K(!X)},300),r=setTimeout(()=>{Y&&X&&(q===E&&J===D?x(e,!1):y(e,q,J))},t);return()=>{clearTimeout(n),clearTimeout(r)}},[q,J,Y,X,E,D,e,x,y,v,j]),c.default.useEffect(()=>{H([L,R]),W(!1),K(!1)},[L,R,e]);let ee=c.default.useCallback(e=>{j||H([Math.max(E,Math.min(A,e[0])),Math.max(k,Math.min(D,e[1]))])},[j,E,D,k,A]),te=c.default.useCallback(t=>{if(j)return;let n=Math.max(E,Math.min(A,t[0])),r=Math.max(k,Math.min(D,t[1]));n===E&&r===D?(H([E,D]),x(e,!0)):H([n,r])},[j,E,D,k,A,e,x]),ne=c.default.useCallback(e=>{if(j)return;let t=Number(e.target.value);isNaN(t)||H([Math.max(E,Math.min(A,t)),V[1]])},[j,V,E,A]),re=c.default.useCallback(e=>{if(j)return;let t=Number(e.target.value);if(!isNaN(t)){let e=Math.max(k,Math.min(D,t));H([V[0],e])}},[j,V,k,D]),ie=c.default.useCallback(()=>{let e=V[0],t=Math.max(E,Math.min(A,e));t<V[1]?H([t,V[1]]):H([E,V[1]])},[V,E,A]),ae=c.default.useCallback(()=>{let e=V[1],t=Math.max(k,Math.min(D,e));t>V[0]?H([V[0],t]):H([V[0],D])},[V,k,D]),[Z,oe]=c.default.useState(null),Q=c.default.useRef(null);c.default.useEffect(()=>{if(!s)return;let t=`${E}:${D}`;if(t===Q.current&&Q.current!==null)return;let n=h?.[e];if(!Array.isArray(n)||n.length===0)return;let r=n.filter(e=>e.value!=null&&!isNaN(Number(e.key))).map(e=>({key:e.key,value:e.value}));r.length>0&&(Q.current=t,oe(r))},[E,D,h,e,s]);let $=c.default.useMemo(()=>{if(!s||!Z||Z.length===0)return[];let e=D-E;if(e<=0)return[];let t=l??(Math.ceil(e/20)||1),n=Math.ceil(e/t);return Array.from({length:n},(e,n)=>{let r=E+n*t,i=E+(n+1)*t;return{bucketStart:r,bucketEnd:i,count:Z.filter(e=>{let t=Number(e.key);return t>=r&&t<i}).reduce((e,t)=>e+t.value,0)}})},[s,Z,E,D,l]),se=c.default.useMemo(()=>Math.max(...$.map(e=>e.count),1),[$]);return s&&!C&&!g?.includes(e)&&console.warn(`RangeFilterPanel: showHistogram=true but field "${e}" is not facetable. Add .Facetable = true to this field.`),C?(0,u.jsx)(N,{title:t,variant:`slider`,collapsible:a,startCollapsed:o}):!S&&!_?null:i===`slider`?(0,u.jsxs)(d.FilterPanelBase,{title:t,collapsed:o,collapsible:a,children:[j&&(0,u.jsxs)(`div`,{className:I.disabledMessage,children:[`No adjustable range (all results have the same value: `,E,`).`]}),s&&$.length>0&&(0,u.jsx)(`div`,{className:I.histogram,children:(()=>{let e=typeof k==`number`&&typeof A==`number`&&A>k&&(k>E||A<D);return $.map((t,n)=>{let r=Math.max(1,Math.ceil(t.count/se*20)),i=e?t.bucketEnd>k&&t.bucketStart<A:t.bucketEnd>q&&t.bucketStart<J;return(0,u.jsx)(`div`,{className:I.histogramBar,"data-testid":`histogram-bar`,"data-active":i,style:{height:`${r}px`,background:i?`var(--lv5)`:`var(--lv3)`}},n)})})()}),(0,u.jsx)(`div`,{style:{padding:`10px 10px 20px 10px`},children:(0,u.jsx)(d.Slider,{min:M,max:P,value:j?[M,P]:[q,J],isRange:!0,onChange:e=>ee(e),onFinalChange:e=>te(e),disabled:j,activeMin:k,activeMax:A,isFaceted:B,highlightFaceted:z,"aria-label":t||`Filter by ${e}`})}),(0,u.jsxs)(`div`,{style:{display:`flex`,flex:`flex-grow`,gap:`10px`,alignItems:`flex-start`,justifyContent:`space-between`},children:[(0,u.jsx)(d.InputField,{label:`Min:`,type:`number`,value:j?E:V[0],min:E,max:Math.min(A,V[1]-1),onChange:ne,onBlur:ie,disabled:j,isValid:j||!U}),(0,u.jsx)(d.InputField,{label:`Max:`,type:`number`,value:j?D:V[1],min:Math.max(k,V[0]+1),max:D,onChange:re,onBlur:ae,disabled:j,isValid:j||!G})]})]}):(0,u.jsxs)(d.FilterPanelBase,{title:t,children:[j&&(0,u.jsxs)(`div`,{className:I.disabledMessage,children:[`No adjustable range (all results have the same value: `,E,`).`]}),(0,u.jsxs)(`div`,{style:{display:`flex`,gap:`10px`,alignItems:`flex-start`},children:[(0,u.jsx)(d.InputField,{label:`Min:`,type:`number`,value:j?E:V[0],min:E,max:Math.min(A,V[1]-1),onChange:ne,onBlur:ie,disabled:j,isValid:j||!U}),(0,u.jsx)(d.InputField,{label:`Max:`,type:`number`,value:j?D:V[1],min:Math.max(k,V[0]+1),max:D,onChange:re,onBlur:ae,disabled:j,isValid:j||!G})]})]})},R={grid:`_grid_xm2uh_2`,chip:`_chip_xm2uh_17`,chipLabel:`_chipLabel_xm2uh_28`},z=(0,c.memo)(({field:e,value:t,onReset:n})=>(0,u.jsx)(`li`,{children:(0,u.jsx)(d.Button,{onClick:n,iconRight:(0,u.jsx)(f.X_or_error,{}),variant:`primary`,size:`micro`,className:R.chip,title:`${e}: ${t}`,children:(0,u.jsxs)(`span`,{className:R.chipLabel,children:[e,`: `,t]})})})),B=(0,c.memo)(({field:e,min:t,max:n,onReset:r})=>(0,u.jsx)(`li`,{children:(0,u.jsx)(d.Button,{onClick:r,iconRight:(0,u.jsx)(f.X_or_error,{}),variant:`primary`,size:`micro`,className:R.chip,title:`${e}: ${t} – ${n}`,children:(0,u.jsxs)(`span`,{className:R.chipLabel,children:[e,`: `,t,` – `,n]})})}));function V(){let{state:{filters:e,rangeFilters:t},resetFilters:n,resetSingleFilter:r,resetRangeFilter:i}=b(),a=(0,c.useMemo)(()=>Object.entries(e).map(([e,t])=>t.map(t=>({field:e,value:t}))).flat(),[e]),o=(0,c.useMemo)(()=>Object.entries(t).map(([e,{min:t,max:n}])=>({field:e,min:t,max:n})),[t]);return(0,c.useMemo)(()=>Object.keys(e).length>0||Object.keys(t).length>0,[e,t])?(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,title:`Active filters`,children:(0,u.jsxs)(`ul`,{className:R.grid,children:[a.map(({field:e,value:t})=>(0,u.jsx)(z,{field:e,value:t,onReset:()=>r(e,t)},`${e}-${t}`)),o.map(({field:e,min:t,max:n})=>(0,u.jsx)(B,{field:e,min:t,max:n,onReset:()=>i(e)},e)),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.Button,{onClick:n,size:`micro`,variant:`ghost`,children:`Reset`})})]})}):null}var H={select:`_select_nwf7i_1`,radioGroup:`_radioGroup_nwf7i_6`},U=({displayType:e=`dropdown`,collapsible:t=!0,startCollapsed:n=!1})=>{let{state:{sortableFields:r,sortBy:i,sortAscending:a},setSort:o,isFetchingInitial:s}=b();if(s)return(0,u.jsx)(N,{title:`Sort by`,rows:e===`radio`?3:1,collapsible:t,startCollapsed:n});if(!r||r.length===0)return null;let c=i?`${i}:${a?`asc`:`desc`}`:`none`,l=[{label:`None`,value:`none`},...r.flatMap(e=>[{label:`${e} (asc)`,value:`${e}:asc`},{label:`${e} (desc)`,value:`${e}:desc`}])],f=e=>{if(e===`none`||e===``)o(null,!0);else{let[t,n]=e.split(`:`);o(t,n===`asc`)}};return(0,u.jsx)(d.FilterPanelBase,{title:`Sort by`,collapsible:t,collapsed:t?n:!1,children:e===`dropdown`?(0,u.jsx)(d.Select,{value:c,onValueChange:f,options:l,placeholder:`Select sort...`,"aria-label":`Sort by`}):(0,u.jsx)(`div`,{className:H.radioGroup,children:l.map(e=>(0,u.jsx)(d.RadioButton,{id:`sort-${e.value}`,name:`sort-by`,value:e.value,label:e.label,checked:c===e.value,onChange:e=>f(e.target.value)},e.value))})})},W={list:`_list_1y4fk_1`};function G(){let{state:{searchSettings:e},setSearchSettings:t}=b(),[n,r]=(0,c.useState)(!1),i=(e,n)=>{let r=parseInt(n,10);isNaN(r)||t({[e]:r})},a=(e,n)=>{t({[e]:n})},o=(n,r)=>{let i=parseInt(r,10);isNaN(i)||t({coverageSetup:{...e.coverageSetup,[n]:i}})},s=(n,r)=>{t({coverageSetup:{...e.coverageSetup,[n]:r}})};return(0,u.jsx)(d.FilterPanelBase,{collapsed:!0,title:`Settings`,children:(0,u.jsxs)(`ul`,{className:W.list,children:[(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Max Results`,type:`number`,value:e.maxNumberOfRecordsToReturn.toString(),onChange:e=>i(`maxNumberOfRecordsToReturn`,e.target.value)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Coverage Depth`,type:`number`,value:e.coverageDepth.toString(),onChange:e=>i(`coverageDepth`,e.target.value)})}),(0,u.jsxs)(`li`,{children:[(0,u.jsx)(d.InputField,{label:`Minimum Score (16 bit)`,type:`number`,value:e.minimumScore.toString(),min:`0`,max:`65535`,onChange:e=>{let n=parseFloat(e.target.value);isNaN(n)||t({minimumScore:n})}}),(0,u.jsx)(`div`,{style:{padding:`10px 10px 20px 10px`},children:(0,u.jsx)(d.Slider,{min:0,max:65535,step:5e3,value:e.minimumScore,onChange:e=>{t({minimumScore:e})},"aria-label":`Minimum score`})})]}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Placeholder text`,type:`text`,value:e.placeholderText,onChange:e=>{t({placeholderText:e.target.value})}})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Show score`,checked:e.showScore,onChange:e=>a(`showScore`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Enable Coverage`,checked:e.enableCoverage,onChange:e=>a(`enableCoverage`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Remove Duplicates`,checked:e.removeDuplicates,onChange:e=>a(`removeDuplicates`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.Button,{variant:`ghost`,size:`micro`,iconRight:n?(0,u.jsx)(f.ArrowDown,{}):(0,u.jsx)(f.ArrowRight,{}),onClick:()=>r(e=>!e),children:n?`Hide Coverage Setup`:`Show Coverage Setup`})}),n&&(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Cover Whole Query`,checked:e.coverageSetup.coverWholeQuery,onChange:e=>s(`coverWholeQuery`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Cover Whole Words`,checked:e.coverageSetup.coverWholeWords,onChange:e=>s(`coverWholeWords`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Cover Fuzzy Words`,checked:e.coverageSetup.coverFuzzyWords,onChange:e=>s(`coverFuzzyWords`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Cover Joined Words`,checked:e.coverageSetup.coverJoinedWords,onChange:e=>s(`coverJoinedWords`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Cover Prefix Suffix`,checked:e.coverageSetup.coverPrefixSuffix,onChange:e=>s(`coverPrefixSuffix`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Truncate`,checked:e.coverageSetup.truncate,onChange:e=>s(`truncate`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Include Pattern Matches`,checked:e.coverageSetup.includePatternMatches,onChange:e=>s(`includePatternMatches`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Levenshtein Max Word Size`,type:`number`,value:e.coverageSetup.levenshteinMaxWordSize.toString(),onChange:e=>o(`levenshteinMaxWordSize`,e.target.value)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Min Word Size`,type:`number`,value:e.coverageSetup.minWordSize.toString(),onChange:e=>o(`minWordSize`,e.target.value)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Truncate Word Hit Limit`,type:`number`,value:e.coverageSetup.truncateWordHitLimit.toString(),onChange:e=>o(`truncateWordHitLimit`,e.target.value)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Truncate Word Hit Tolerance`,type:`number`,value:e.coverageSetup.truncateWordHitTolerance.toString(),onChange:e=>o(`truncateWordHitTolerance`,e.target.value)})})]})]})})}var K=class extends c.Component{constructor(e){super(e),this.state={hasError:!1,error:null}}static getDerivedStateFromError(e){return{hasError:!0,error:e}}componentDidCatch(e,t){console.error(`[SearchErrorBoundary] Caught error:`,e,t)}reset=()=>{this.setState({hasError:!1,error:null})};render(){return this.state.hasError&&this.state.error?this.props.fallback?this.props.fallback(this.state.error,this.reset):(0,u.jsxs)(`div`,{style:{padding:`2rem`,backgroundColor:`#fee`,border:`2px solid #c33`,borderRadius:`8px`,maxWidth:`600px`,margin:`2rem auto`},children:[(0,u.jsx)(`h2`,{style:{color:`#c33`,marginTop:0},children:`⚠️ Search Initialization Error`}),(0,u.jsxs)(`p`,{style:{marginBottom:`1rem`},children:[(0,u.jsx)(`strong`,{children:`Error:`}),` `,this.state.error.message]}),(0,u.jsxs)(`div`,{style:{backgroundColor:`#fff`,padding:`1rem`,borderRadius:`4px`,marginBottom:`1rem`,fontSize:`0.9rem`},children:[(0,u.jsx)(`strong`,{children:`💡 Common fixes:`}),(0,u.jsxs)(`ul`,{style:{marginBottom:0,paddingLeft:`1.5rem`},children:[(0,u.jsx)(`li`,{children:`Check browser console for detailed error messages`}),(0,u.jsx)(`li`,{children:`Verify the url passed to SearchProvider is correct`}),(0,u.jsx)(`li`,{children:`Verify your bearer token is valid (create or check it on the IndxCloudApi website)`}),(0,u.jsx)(`li`,{children:`Ensure INDX server is running`}),(0,u.jsx)(`li`,{children:`Check dataset name spelling`})]})]}),(0,u.jsx)(`button`,{onClick:this.reset,style:{padding:`0.5rem 1rem`,backgroundColor:`#c33`,color:`white`,border:`none`,borderRadius:`4px`,cursor:`pointer`,fontWeight:`bold`},children:`Try Again`})]}):this.props.children}};function q(e,t){let{url:n,team:r,dataset:i,authenticatedFetch:a}=b(),[o,s]=(0,c.useState)(null),[l,u]=(0,c.useState)(!1),[d,f]=(0,c.useState)(void 0);return{results:o,isLoading:l,error:d,search:(0,c.useCallback)(async o=>{u(!0),f(void 0);try{let c=await e(o),l={fieldName:t.fieldName,vector:c,maxResults:t.maxResults??10};t.filter&&(l.filter=t.filter);let u=await a(`${n}/api/teams/${r}/datasets/${i}/VectorSearch`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(l)});if(!u.ok)throw Error(`VectorSearch failed: ${u.status}`);let d=await u.json();if(d.length===0){s([]);return}let f=d.map(e=>e.documentKey),p=await a(`${n}/api/teams/${r}/datasets/${i}/GetJson`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(f)});if(!p.ok)throw Error(`GetJson failed: ${p.status}`);s((await p.json()).map((e,t)=>({document:e,documentKey:f[t],score:d[t].score})))}catch(e){f(e instanceof Error?e.message:`Vector search failed`),s(null)}finally{u(!1)}},[e,t.fieldName,t.maxResults,t.filter,n,r,i,a])}}function J(e,t){let{url:n,team:r,dataset:i,authenticatedFetch:a}=b(),[o,s]=(0,c.useState)(null),[l,u]=(0,c.useState)(!1),[d,f]=(0,c.useState)(void 0);return{results:o,isLoading:l,error:d,search:(0,c.useCallback)(async o=>{u(!0),f(void 0);try{let c=await e(o),l={text:o,embeddingField:t.fieldName,vector:c,maxNumberOfRecordsToReturn:t.maxResults??10,alpha:t.alpha??.5};t.filter&&(l.filter=t.filter),t.timeoutMs&&(l.timeOutLimitMilliseconds=t.timeoutMs);let u=await a(`${n}/api/teams/${r}/datasets/${i}/HybridSearch`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(l)});if(!u.ok)throw Error(`HybridSearch failed: ${u.status}`);let d=await u.json();if(d.length===0){s([]);return}let f=d.map(e=>e.documentKey),p=await a(`${n}/api/teams/${r}/datasets/${i}/GetJson`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(f)});if(!p.ok)throw Error(`GetJson failed: ${p.status}`);s((await p.json()).map((e,t)=>({document:e,documentKey:f[t],score:d[t].score})))}catch(e){f(e instanceof Error?e.message:`Hybrid search failed`),s(null)}finally{u(!1)}},[e,t.fieldName,t.alpha,t.maxResults,t.filter,t.timeoutMs,n,r,i,a])}}exports.ActiveFiltersPanel=V,exports.FilterPanelSkeleton=N,exports.RangeFilterPanel=L,exports.SearchContext=v,exports.SearchErrorBoundary=K,exports.SearchInput=x,exports.SearchProvider=y,exports.SearchResult=w,exports.SearchResultRow=A,exports.SearchResults=O,exports.SearchResultsSkeleton=D,exports.SearchSettingsPanel=G,exports.SortByPanel=U,exports.ValueFilterPanel=F,exports.useHybridSearch=J,exports.useSearch=b,exports.useSearchContext=b,exports.useVectorSearch=q;
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));require("@indxsearch/systm/styles.css");let c=require("react");c=s(c);let l=require("@indxsearch/indx-types"),u=require("react/jsx-runtime"),d=require("@indxsearch/systm"),f=require("@indxsearch/pixl");function p({url:e,team:t,dataset:n,preAuthenticatedToken:r,enableDebugLogs:i=!1}){let[a,o]=(0,c.useState)(null),[s,u]=(0,c.useState)(!0),[d,f]=(0,c.useState)([]),[p,m]=(0,c.useState)([]),[h,g]=(0,c.useState)([]),[_,v]=(0,c.useState)({}),[y,b]=(0,c.useState)({}),[x,S]=(0,c.useState)(0),[C,w]=(0,c.useState)(null);return(0,c.useEffect)(()=>{(async()=>{w(null);try{if(!r)throw console.error(`[Auth] ❌ Missing bearer token`),console.error(`[Auth] 💡 Pass preAuthenticatedToken to SearchProvider (create a token on the IndxCloudApi website)`),Error(`A bearer token is required. Check console for instructions.`);if(!e)throw console.error(`[Auth] ❌ Missing INDX server URL`),console.error(`[Auth] 💡 Pass a url to SearchProvider`),Error(`INDX server URL is required. Check console for instructions.`);if(!n)throw console.error(`[Auth] ❌ Missing dataset name`),console.error(`[Auth] 💡 Pass dataset="your-dataset-name" to SearchProvider`),Error(`Dataset name is required. Check console for instructions.`);i&&console.log(`[Auth] ✅ Using bearer token`);let a=r,s=e=>fetch(e,{method:`GET`,headers:{accept:`text/plain`,Authorization:`Bearer ${a}`}});i&&console.log(`[Auth] 🔍 Checking dataset status...`);let c=await s(`${e}/api/teams/${t}/datasets/${n}/status`);if(!c.ok){if(c.status===401)throw console.error(`[Auth] ❌ Authentication failed (401 Unauthorized)`),console.error(`[Auth] 💡 Your token may be expired or invalid`),console.error(`[Auth] 💡 Create or refresh your token on the IndxCloudApi website`),Error(`Authentication failed (401). Token may be expired. Check console for instructions.`);if(c.status===404)throw console.error(`[Auth] ❌ Dataset "`+n+`" not found (404)`),console.error(`[Auth] 💡 Available datasets can be checked with: curl -X GET "`+e+`/api/me/datasets" -H "Authorization: Bearer YOUR_TOKEN"`),console.error(`[Auth] 💡 Make sure you spelled the dataset name correctly`),Error(`Dataset "`+n+`" not found. Check console for instructions.`);{let t=await c.text();throw console.error(`[Auth] ❌ Failed to get dataset status:`,c.status,t),console.error(`[Auth] 💡 Check if your INDX server is running at:`,e),Error(`Failed to connect to INDX server. Check console for details.`)}}let u=await c.json();i&&console.log(`[Auth] 📊 Dataset status:`,u),i&&console.log(`[Auth] 🔓 Opening dataset session...`);let d=await fetch(`${e}/api/teams/${t}/datasets/${n}?configuration=400`,{method:`PUT`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${a}`},body:`""`});if(!d.ok)throw console.error(`[Auth] ❌ CreateOrOpen failed:`,d.status,await d.text()),Error(`Failed to open dataset session.`);o(a),i&&console.log(`[Auth] ✅ Dataset session established`),u.systemState!==void 0&&u.systemState!==l.SystemState.Ready&&(console.warn(`[Auth] ⚠️ Dataset is not ready yet. Current state:`,l.SystemState[u.systemState]),console.warn(`[Auth] 💡 Wait for indexing to complete before searching`));let p=u.documentCount??u.numberOfRecords??0;p===0?(console.warn(`[Auth] ⚠️ Dataset "`+n+`" is empty (0 records)`),console.warn(`[Auth] 💡 Add documents to your dataset before searching`),console.warn(`[Auth] 💡 Search will work but return no results`)):i&&console.log(`[Auth] ✅ Dataset has`,p,`records`);let[h,_,y]=await Promise.all([s(`${e}/api/teams/${t}/datasets/${n}/fields/filterable`),s(`${e}/api/teams/${t}/datasets/${n}/fields/facetable`),s(`${e}/api/teams/${t}/datasets/${n}/fields/sortable`)]);if(!h.ok)throw console.error(`[Auth] ❌ GetFilterableFields failed:`,h.status,await h.text()),Error(`Failed to get filterable fields. Check console for details.`);if(!_.ok)throw console.error(`[Auth] ❌ GetFacetableFields failed:`,_.status,await _.text()),Error(`Failed to get facetable fields. Check console for details.`);if(!y.ok)throw console.error(`[Auth] ❌ GetSortableFields failed:`,y.status,await y.text()),Error(`Failed to get sortable fields. Check console for details.`);let[x,C,w]=await Promise.all([h.json().catch(e=>(console.error(`Failed to parse GetFilterableFields response:`,e),[])),_.json().catch(e=>(console.error(`Failed to parse GetFacetableFields response:`,e),[])),y.json().catch(e=>(console.error(`Failed to parse GetSortableFields response:`,e),[]))]);f(x||[]),m(C||[]),g(w||[]),S(p);let T={facets:{}};try{let r=await fetch(`${e}/api/teams/${t}/datasets/${n}/search`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${a}`},body:JSON.stringify({text:``,maxNumberOfRecordsToReturn:0,enableFacets:!0})});r.ok?T=await r.json().catch(e=>(console.warn(`Failed to parse blank search response:`,e),{facets:{}})):(console.warn(`Blank search failed:`,r.status,r.statusText),console.warn(`Continuing without initial facet data - facets will be populated after first search`))}catch(e){console.warn(`Blank search error:`,e),console.warn(`Continuing without initial facet data - facets will be populated after first search`)}let E={};if(T.facets){for(let[e,t]of Object.entries(T.facets))if(Array.isArray(t)&&t.length>0){let n=t.map(e=>Number(e.key)).filter(e=>!isNaN(e));n.length>0&&(E[e]={min:Math.min(...n),max:Math.max(...n)})}}let D={};if(T.facets)for(let[e,t]of Object.entries(T.facets))Array.isArray(t)&&(D[e]=t.map(e=>e.key));v(E),b(D),i&&console.log(`[Auth] ✅ Initialization complete`)}catch(t){console.error(`[Auth] ❌ Initialization failed:`,t),(t instanceof Error||typeof t==`object`&&t&&`message`in t)&&console.error(`[Auth] 💡 Error:`,t.message),t instanceof TypeError&&t.message.includes(`fetch`)&&(console.error(`[Auth] ❌ Network error - cannot connect to INDX server`),console.error(`[Auth] 💡 Check if the server is running at:`,e),console.error(`[Auth] 💡 Check the url you passed to SearchProvider`),console.error(`[Auth] 💡 For local development, it should be: http://localhost:5001`)),w(t instanceof Error?t.message:String(t))}finally{u(!1)}})()},[e,t,n]),{token:a,isFetchingInitial:s,authError:C,initialFacetStats:_,initialFacetKeys:y,filterableFields:d,facetableFields:p,sortableFields:h,totalDocumentCount:x}}async function m(e,t,n,r,i){if(e.length===0)return null;if(e.length===1)return e[0];let a=e[0];for(let o=1;o<e.length;o++){let s=await i(`${t}/api/teams/${n}/datasets/${r}/filters/combine`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({a,b:e[o],useAndOperation:!0})});if(!s.ok){let e=await s.json();throw console.error(`CombineFilters failed:`,e),Error(`CombineFilters failed`)}a=await s.json()}return a}async function h(e,t,n,r,i,a){let o=Object.entries(e??{}),s=Object.entries(t??{}),[c,l]=await Promise.all([Promise.all(o.map(([e,t])=>Promise.all(t.map(t=>a(`${n}/api/teams/${r}/datasets/${i}/filters/value`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({fieldName:e,value:t})}).then(e=>e.json()))))),Promise.all(s.map(([e,{min:t,max:o}])=>a(`${n}/api/teams/${r}/datasets/${i}/filters/range`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({fieldName:e,lowerLimit:t,upperLimit:o})}).then(e=>e.json())))]);return m([...c.flat(),...l].filter(e=>e&&typeof e.hashString==`string`),n,r,i,a)}function g(e,t){let n,r=(...r)=>{clearTimeout(n),n=setTimeout(()=>e(...r),t)};return r.cancel=()=>clearTimeout(n),r}function _({state:e,setState:t,authenticatedFetch:n,auth:r,url:i,team:a,dataset:o,allowEmptySearch:s,facetsEnabled:l,enableDebugLogs:u,filtersChangedByUser:d,shouldFetchMore:f}){let p=(0,c.useRef)(0),m=(0,c.useRef)(void 0),_=(0,c.useRef)(!1),[v,y]=(0,c.useState)({}),[b,x]=(0,c.useState)(``),[S,C]=(0,c.useState)(``);(0,c.useEffect)(()=>{r.isFetchingInitial||t(e=>({...e,facetStats:r.initialFacetStats,rangeBounds:r.initialFacetStats,totalDocumentCount:r.totalDocumentCount,filterableFields:r.filterableFields,facetableFields:r.facetableFields,sortableFields:r.sortableFields}))},[r.isFetchingInitial,r.initialFacetStats,r.totalDocumentCount,r.filterableFields,r.facetableFields,r.sortableFields,t]);let w=e.searchSettings.maxNumberOfRecordsToReturn,T=e.searchSettings.enableCoverage,E=e.searchSettings.removeDuplicates,D=e.searchSettings.coverageDepth,O=e.searchSettings.minimumScore,k=e.searchSettings.coverageSetup,A=e.sortBy,j=e.sortAscending,M=(0,c.useCallback)(async({enableFacets:c})=>{if(!r.token)return;let l=++p.current;if(t(e=>({...e,isLoading:!0})),e.query.trim()===``){if(!s)return;c=!0}try{let d=await h(e.filters,e.rangeFilters,i,a,o,n),f=s||e.query.trim()!==``,m={text:e.query,maxNumberOfRecordsToReturn:f?w:0,enableFacets:c,...d?{filter:d}:{},...A?{sortBy:A}:{},...j===void 0?{}:{sortAscending:j},enableCoverage:T,removeDuplicates:E,coverageDepth:D,coverageSetup:k};u&&console.log(`[performSearch] request body:`,JSON.stringify(m,null,2));let g=await(await n(`${i}/api/teams/${a}/datasets/${o}/search`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(m)})).json(),_=g.truncationIndex??-1,M=g.records||[],N=M.map(e=>e.documentKey),P=M.map(e=>e.score),F=[];f&&N.length>0&&(F=(await(await n(`${i}/api/teams/${a}/datasets/${o}/documents/lookup`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(N)})).json()).map((e,t)=>({document:e,documentKey:N[t],score:P[t]})));let I={};if(c&&g.facets){for(let[e,t]of Object.entries(g.facets))if(Array.isArray(t)&&t.length>0){let n=t.map(e=>Number(e.key)).filter(e=>!isNaN(e));n.length>0&&(I[e]={min:Math.min(...n),max:Math.max(...n)})}}let L=e.query!==b,R=e.query!==S,z=e.facetStats??{};if(L?(z={...r.initialFacetStats,...I},y(z),x(e.query)):z={...v,...I},R&&c){let n={...e.rangeBounds};for(let[e,t]of Object.entries(I))n[e]=t;t(e=>({...e,rangeBounds:n})),C(e.query)}let B=g.facets;if(c&&(!B||Object.keys(B).length===0)){B={};for(let[e,t]of Object.entries(r.initialFacetKeys))B[e]=t.map(e=>({key:e,value:null}))}if(l!==p.current)return;let V=F.filter(t=>{let n=e.query.trim();return n===``||n.length===1?!0:t.score>=O});t(e=>({...e,results:V,resultsSuppressed:!f,...c?{facets:B,facetStats:z}:{},isLoading:!1,truncationIndex:_}))}catch(e){if(console.error(`[Search] ❌ Search failed:`,e),e instanceof TypeError&&e.message.includes(`fetch`)?(console.error(`[Search] ❌ Network error - cannot reach INDX server`),console.error(`[Search] 💡 Check if server is running at:`,i)):e instanceof Error&&(e.message.includes(`401`)?(console.error(`[Search] ❌ Authentication failed`),console.error(`[Search] 💡 Your token may have expired. Create or refresh it on the IndxCloudApi website.`)):e.message.includes(`404`)?(console.error(`[Search] ❌ Dataset not found`),console.error(`[Search] 💡 Check that dataset "`+o+`" exists`)):console.error(`[Search] 💡 Error:`,e.message)),l!==p.current)return;t(t=>({...t,results:null,isLoading:!1,resultsSuppressed:!1,error:e instanceof Error?e.message:`Search failed`}))}},[e.query,e.filters,e.rangeFilters,e.facetStats,A,j,w,T,E,D,k,O,n,r.initialFacetStats,r.initialFacetKeys,r.token,v,b,S,e.rangeBounds,i,a,o,s,u,t]);(0,c.useEffect)(()=>{m.current=M},[M]);let N=(0,c.useRef)(null);(0,c.useEffect)(()=>(N.current?.cancel(),N.current=g(()=>{u&&console.log(`Debounced searchWithFacets fired`),m.current?.({enableFacets:!0})},e.facetDebounceDelayMillis??500),()=>{N.current?.cancel()}),[e.facetDebounceDelayMillis]),(0,c.useEffect)(()=>{!r.isFetchingInitial&&r.token&&!_.current&&(s&&m.current?.({enableFacets:l}),_.current=!0)},[r.isFetchingInitial,r.token,s,l]),(0,c.useEffect)(()=>{if(!r.token||!_.current)return;let n=e.query.trim(),i=n===``&&s;if(n===``&&!s){e.resultsSuppressed||t(e=>({...e,resultsSuppressed:!0}));return}return i?(N.current?.cancel(),m.current?.({enableFacets:l})):l?(u&&console.log(`Search fired`),m.current?.({enableFacets:!1}),N.current?.()):m.current?.({enableFacets:!1}),()=>{N.current?.cancel()}},[e.query,s,l]),(0,c.useEffect)(()=>{let t=d.current;if(d.current=!1,!_.current||!r.token||!t)return;let n=e.query.trim();l&&!(!s&&n===``)&&m.current?.({enableFacets:!0})},[e.filters,e.rangeFilters]),(0,c.useEffect)(()=>{if(!_.current||!r.token)return;let t=e.query.trim();l&&!(!s&&t===``)&&m.current?.({enableFacets:!0})},[A,j]),(0,c.useEffect)(()=>{!_.current||!r.token||f.current&&(f.current=!1,m.current?.({enableFacets:!1}))},[w,r.token])}var v=(0,c.createContext)(void 0),y=({children:e,url:t,team:n,dataset:r,allowEmptySearch:i=!1,maxResults:a=10,facetDebounceDelayMillis:o=500,enableFacets:s=!0,coverageDepth:l=500,removeDuplicates:d=!0,enableCoverage:f=!0,initialCoverageSetup:m={},enableDebugLogs:h=!1,preAuthenticatedToken:g})=>{let y=(0,c.useRef)(!1),b=(0,c.useRef)(!1),[x,S]=(0,c.useState)({query:``,results:null,isLoading:!1,resultsSuppressed:!i,facetDebounceDelayMillis:o,filterableFields:[],facetableFields:[],sortableFields:[],filters:{},rangeFilters:{},facetStats:{},rangeBounds:{},searchSettings:{maxNumberOfRecordsToReturn:a,coverageDepth:l,enableCoverage:f,removeDuplicates:d,minimumScore:0,showScore:!0,placeholderText:`Type to search`,coverageSetup:{coverWholeQuery:!0,coverWholeWords:!0,coverFuzzyWords:!0,coverJoinedWords:!0,coverPrefixSuffix:!0,truncate:!0,includePatternMatches:!0,minWordSize:2,levenshteinMaxWordSize:20,truncateWordHitLimit:1,truncateWordHitTolerance:0,truncationScore:65024,...m}}});(0,c.useEffect)(()=>{h&&console.log(`SearchContext mounted on client`)},[h]),(0,c.useEffect)(()=>{S(e=>({...e,facetDebounceDelayMillis:o}))},[o]);let[C]=(0,c.useState)(s),w=p({url:t,team:n,dataset:r,preAuthenticatedToken:g,enableDebugLogs:h}),T=(0,c.useCallback)((e,t={})=>{if(!w.token)throw Error(`No authentication token available`);return fetch(e,{...t,headers:{...t.headers,Authorization:`Bearer ${w.token}`}})},[w.token]);_({state:x,setState:S,authenticatedFetch:T,auth:w,url:t,team:n,dataset:r,allowEmptySearch:i,facetsEnabled:C,enableDebugLogs:h,filtersChangedByUser:y,shouldFetchMore:b});let E=(0,c.useCallback)(e=>{y.current=!1,S(t=>{let n=Object.keys(t.filters).length>0,r=Object.keys(t.rangeFilters).length>0;return{...t,query:e,filters:n?{}:t.filters,rangeFilters:r?{}:t.rangeFilters,searchSettings:{...t.searchSettings,maxNumberOfRecordsToReturn:a}}})},[a]),D=(0,c.useCallback)(e=>{S(t=>({...t,facetDebounceDelayMillis:e}))},[]),O=(0,c.useCallback)(e=>{S(t=>{let n={...t.searchSettings,...e};return e.coverageSetup?n.coverageSetup={...t.searchSettings.coverageSetup,...e.coverageSetup}:n.coverageSetup=t.searchSettings.coverageSetup,{...t,searchSettings:n}})},[]),k=(0,c.useCallback)(e=>{b.current=!0,S(t=>({...t,searchSettings:{...t.searchSettings,maxNumberOfRecordsToReturn:e}}))},[]),A=(0,c.useCallback)((e,t)=>{y.current=!0,S(n=>{let r={...n.filters},i=r[e]||[],a=i.includes(t)?i.filter(e=>e!==t):[...i,t];return a.length?r[e]=a:delete r[e],{...n,filters:r}})},[]),j=(0,c.useCallback)((e,t,n)=>{y.current=!0,S(r=>({...r,rangeFilters:{...r.rangeFilters,[e]:{min:t,max:n}}}))},[]),M=(0,c.useCallback)(()=>{y.current=!0,S(e=>({...e,filters:{},rangeFilters:{}}))},[]),N=(0,c.useCallback)((e,t,n=!0)=>{n&&(y.current=!0),S(n=>{let r={...n.filters},i=(r[e]||[]).filter(e=>e!==t);return i.length>0?r[e]=i:delete r[e],{...n,filters:r}})},[]),P=(0,c.useCallback)((e,t=!0)=>{t&&(y.current=!0),S(t=>{let n={...t.rangeFilters};return delete n[e],{...t,rangeFilters:n}})},[]),F=(0,c.useCallback)((e,t)=>{S(n=>({...n,sortBy:e||void 0,sortAscending:e?t:void 0}))},[]);return(0,u.jsx)(v.Provider,{value:{state:x,isFetchingInitial:w.isFetchingInitial,authError:w.authError??void 0,allowEmptySearch:i,url:t,team:n,dataset:r,authenticatedFetch:T,setQuery:E,toggleFilter:A,setRangeFilter:j,resetFilters:M,resetSingleFilter:N,resetRangeFilter:P,setSort:F,setDebounceDelay:D,setSearchSettings:O,fetchMoreResults:k},children:e})},b=()=>{let e=(0,c.useContext)(v);if(!e)throw Error(`useSearchContext must be used within a SearchProvider`);return e},x=({className:e=``,autoFocus:t=!1,inputSize:n=`default`,showClear:r=!0,showFocus:i=!1,...a})=>{let{state:{query:o,filters:s,rangeFilters:c,searchSettings:l},setQuery:f}=b();Object.keys(s).length>0||Object.keys(c).length;let p=o.length>0;return(0,u.jsx)(d.SearchField,{type:`text`,value:o,onChange:e=>f(e.target.value),placeholder:l.placeholderText,autoFocus:t,className:e,showSearchIcon:!0,inputSize:n,showFocusBorder:i,...a,children:r&&p&&(0,u.jsx)(d.Button,{variant:`ghost`,size:`micro`,onClick:()=>f(``),"aria-label":`Clear search`,children:`Clear`})})},S={placeholder:`_placeholder_ee9qi_1`,invalid:`_invalid_ee9qi_11`},C={row:`_row_1i201_1`,content:`_content_1i201_19`,indexNumber:`_indexNumber_1i201_31`,scoreNumber:`_scoreNumber_1i201_39`,skeletonBars:`_skeletonBars_1i201_53`,skeletonBarLg:`_skeletonBarLg_1i201_59`,fade:`_fade_1i201_1`,skeletonBarSm:`_skeletonBarSm_1i201_66`},w=({skeleton:e=!1,index:t,score:n,showScore:r=!1,children:i,skeletonDelay:a=0,skeletonWidths:o=[62,38]})=>(0,u.jsxs)(`div`,{className:C.row,children:[t!==void 0&&(0,u.jsx)(`div`,{className:C.indexNumber,children:t}),(0,u.jsx)(`div`,{className:C.content,children:e?(0,u.jsxs)(`div`,{className:C.skeletonBars,children:[(0,u.jsx)(`div`,{className:C.skeletonBarLg,style:{width:`${o[0]}%`,animationDelay:`${a}s`}}),(0,u.jsx)(`div`,{className:C.skeletonBarSm,style:{width:`${o[1]}%`,animationDelay:`${a+.05}s`}})]}):i}),r&&n!==void 0&&(0,u.jsx)(`div`,{className:C.scoreNumber,children:n})]}),T={wrapper:`_wrapper_81m3c_6`,skeletonAppear:`_skeletonAppear_81m3c_1`},E=[[62,38],[75,45],[58,33],[70,42],[65,50],[55,35],[72,40],[60,30]],D=({rows:e=6})=>(0,u.jsx)(`div`,{className:T.wrapper,children:Array.from({length:e}).map((e,t)=>(0,u.jsx)(w,{skeleton:!0,skeletonDelay:t*.1,skeletonWidths:E[t%E.length]},t))}),O=({fields:e,resultsPerPage:t,children:n})=>{let{state:{results:r,resultsSuppressed:i,searchSettings:a,truncationIndex:o,query:s},isFetchingInitial:l,allowEmptySearch:p,fetchMoreResults:m}=b(),h=t??30,[g,_]=(0,c.useState)(h),v=(0,c.useRef)(0),y=(0,c.useRef)(``);(0,c.useEffect)(()=>{let e=s!==y.current;(!r||r.length<v.current||e)&&_(h),v.current=r?.length??0,y.current=s},[r,h,s]);let x=r&&r.length>g;return l?p?(0,u.jsx)(D,{rows:h}):(0,u.jsx)(`div`,{className:S.placeholder,children:(0,u.jsx)(f.Indx,{size:200,color:`var(--lv5)`})}):i||r===null?(0,u.jsx)(`div`,{className:S.placeholder,children:(0,u.jsx)(f.Indx,{size:200,color:`var(--lv5)`})}):r.length===0?(0,u.jsx)(`div`,{className:S.invalid,children:(0,u.jsx)(`p`,{children:`No results found.`})}):(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(`div`,{children:(r??[]).slice(0,g).map((t,r)=>{let i=t.document,o=t.score,s;try{s=typeof i==`string`?JSON.parse(i):i}catch{return(0,u.jsx)(`div`,{className:S.invalid,children:(0,u.jsx)(`p`,{children:`Invalid JSON`})},r)}let c;if(e&&e.length>0){c={};for(let t of e)t in s&&(c[t]=s[t])}else c={...s};for(let e in c){let t=c[e];if(typeof t==`string`&&t.startsWith(`[`)&&t.endsWith(`]`)){let n=t.replace(/^\[|\]$/g,``);c[e]=n.split(`,`).map(e=>e.trim().replace(/^'|'$/g,``)).filter(e=>e.length>0)}}return(0,u.jsx)(w,{index:r,score:o,showScore:a.showScore,children:n(c)},r)})}),x&&(0,u.jsx)(`div`,{style:{textAlign:`center`,marginTop:`20px`},children:(0,u.jsx)(d.Button,{variant:`secondary`,size:`micro`,onClick:()=>{let e=g+h;_(e),r&&e>=r.length&&(!o||o===-1||o>r.length)&&m(r.length+h)},children:s.trim()===``?`Load more`:o!==-1&&o!==void 0&&o>0?`Load results ${g+1}-${Math.min(g+h,r.length,o)} of ${o}`:`Load more`})})]})},k={row:`_row_ujwhc_1`,title:`_title_ujwhc_8`},A=({variant:e=`default`,children:t})=>(0,u.jsx)(`div`,{className:[k.row,e===`title`?k.title:``].filter(Boolean).join(` `),children:t}),j={bar:`_bar_145f5_12`,skeletonAppear:`_skeletonAppear_145f5_1`,fade:`_fade_145f5_1`,listRows:`_listRows_145f5_19`,sliderArea:`_sliderArea_145f5_25`,sliderTrack:`_sliderTrack_145f5_32`,inputRow:`_inputRow_145f5_40`,inputBar:`_inputBar_145f5_45`},M=[65,80,55,72,60,75,50,68],N=({title:e,rows:t=5,variant:n=`list`,collapsible:r=!0,startCollapsed:i=!1})=>(0,u.jsx)(d.FilterPanelBase,{title:e,collapsible:r,collapsed:i,children:n===`slider`?(0,u.jsxs)(`div`,{className:j.sliderArea,children:[(0,u.jsx)(`div`,{className:j.sliderTrack}),(0,u.jsxs)(`div`,{className:j.inputRow,children:[(0,u.jsx)(`div`,{className:j.inputBar,style:{animationDelay:`0.1s`}}),(0,u.jsx)(`div`,{className:j.inputBar,style:{animationDelay:`0.15s`}})]})]}):(0,u.jsx)(`div`,{className:j.listRows,children:Array.from({length:t}).map((e,t)=>(0,u.jsx)(`div`,{className:j.bar,style:{width:`${M[t%M.length]}%`,animationDelay:`${t*.05}s`}},t))})}),P={list:`_list_m82u6_2`,count:`_count_m82u6_7`,countValue:`_countValue_m82u6_17`,chip:`_chip_m82u6_22`,chipLabel:`_chipLabel_m82u6_32`,grid:`_grid_m82u6_40`},F=({field:e,label:t,preserveBlankFacetState:n=!1,preserveBlankFacetStateOrder:r=!1,sortFacetsBy:i=`histogram`,limit:a=10,collapsible:o=!0,startCollapsed:s=!1,displayType:l=`checkbox`,layout:f=`list`,showActivePanel:p=!1,showCount:m=!0,showNull:h=!1,displayIfEmptyQuery:g=!0,displayCondition:_=e=>!0})=>{let{state:{facets:v,filterableFields:y,facetableFields:x,filters:S,query:C},toggleFilter:w,isFetchingInitial:T,allowEmptySearch:E}=b(),D=(0,c.useRef)(null),[O,k]=(0,c.useState)(a);if((0,c.useEffect)(()=>{k(a)},[v?.[e],a]),!E&&!C)return null;if(T||!v)return l===`toggle`?(0,u.jsx)(N,{rows:1,collapsible:!1}):(0,u.jsx)(N,{title:t,rows:Math.min(a,6),collapsible:o,startCollapsed:s});if(!_({query:C??``,filters:S,facets:v})||!g&&!C&&Object.keys(S).length<1)return null;if(!y?.includes(e)||!x?.includes(e)){let t=[];return y?.includes(e)||t.push(`filterable`),x?.includes(e)||t.push(`facetable`),(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,children:(0,u.jsxs)(`div`,{style:{color:`red`,fontSize:`12px`},children:[`Cannot render filter for "`,e,`": missing `,t.join(` and `),`.`]})})}let A=v?.[e];if(!A||!Array.isArray(A))return null;let j=S?.[e]??[];n&&!D.current&&A.length>0&&(D.current=A.reduce((e,t)=>(e[t.key]=t.value,e),{}));let M=new Map;n&&D.current&&Object.keys(D.current).forEach(e=>{M.set(e,0)}),A.forEach(e=>{M.set(e.key,e.value)});let F=l===`toggle`&&M.size===2&&M.has(`true`)&&(M.has(`false`)||M.has(`null`));if(M.has(`null`)){let e=M.get(`null`)??0,t=M.get(`false`)??0;M.set(`false`,(t??0)+e),M.delete(`null`)}if(l===`toggle`&&!F)return(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,children:(0,u.jsx)(`div`,{className:P.count,children:(0,u.jsx)(d.ToggleSwitch,{label:t,checked:!1,onChange:()=>{},disabled:!0})})});if(F){let n=M.get(`true`),r=typeof n==`number`?n:null,i=j.includes(`true`),a=r===0,o=m&&(r??0)>0?`${r}`:``;return(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,children:(0,u.jsxs)(`div`,{className:P.count,children:[(0,u.jsx)(d.ToggleSwitch,{label:t,checked:i,onChange:()=>w(e,`true`),disabled:a}),` `,o]})})}let I=Array.from(M.entries());if(h||(I=I.filter(([e])=>e!==`null`)),I.length===0&&!n)return null;if(!r)if(i===`alphabetical`){let e=I.filter(([,e])=>typeof e==`number`&&e>0).sort(([e],[t])=>e.localeCompare(t)),t=I.filter(([,e])=>e===0||e===null).sort(([e],[t])=>e.localeCompare(t));I=[...e,...t]}else if(i===`numeric`){let e=(e,t)=>{let n=Number(e),r=Number(t);return!isNaN(n)&&!isNaN(r)?n-r:e.localeCompare(t)},t=I.filter(([,e])=>typeof e==`number`&&e>0).sort(([t],[n])=>e(t,n)),n=I.filter(([,e])=>e===0||e===null).sort(([t],[n])=>e(t,n));I=[...t,...n]}else{let e=I.filter(([,e])=>typeof e==`number`&&e>0),t=I.filter(([,e])=>e===0||e===null);I=[...e,...t]}let L=typeof a==`number`&&I.length>a,R=L?I.slice(0,O):I,z=(t,n)=>{let r=j.includes(t),i=n===0,a=m&&(n??0)>0?` (${n})`:``,o=m&&(n??0)>0?n:``;switch(l){case`button`:return f===`list`?(0,u.jsxs)(`div`,{className:P.count,children:[(0,u.jsx)(d.Button,{variant:r?`primary`:`secondary`,onClick:()=>w(e,t),disabled:i,size:`micro`,className:P.chip,title:t,children:(0,u.jsx)(`span`,{className:P.chipLabel,children:t})}),(0,u.jsx)(`span`,{className:P.countValue,children:o})]}):(0,u.jsx)(d.Button,{variant:r?`primary`:`secondary`,onClick:()=>w(e,t),disabled:i,size:`micro`,className:P.chip,title:`${t}${a}`,children:(0,u.jsx)(`span`,{className:P.chipLabel,children:`${t}${a}`})});case`toggle`:return(0,u.jsx)(d.ToggleSwitch,{label:t,checked:r,onChange:()=>w(e,t),disabled:i});default:return f===`list`?(0,u.jsxs)(`div`,{className:P.count,children:[(0,u.jsx)(d.Checkbox,{label:t,score:``,checked:r,onChange:()=>w(e,t),disabled:i}),(0,u.jsx)(`span`,{children:o})]}):(0,u.jsx)(d.Checkbox,{label:t,score:a,checked:r,onChange:()=>w(e,t),disabled:i})}};return(0,u.jsx)(d.FilterPanelBase,{title:t,collapsible:o,collapsed:o?s:!1,children:(0,u.jsxs)(`ul`,{className:f===`grid`?P.grid:P.list,style:{listStyle:`none`,padding:0,margin:0},children:[R.map(([e,t])=>(0,u.jsx)(`li`,{children:z(e,t)},e)),L&&O<I.length&&(()=>{let e=I.length-O,t=Math.min(50,e);return(0,u.jsx)(`li`,{className:P.toggleItem,children:(0,u.jsx)(d.Button,{variant:`ghost`,size:`micro`,onClick:()=>k(e=>e+50),children:`Show ${t} more of ${I.length} total`})})})()]})})},I={disabledMessage:`_disabledMessage_uci6n_1`,histogram:`_histogram_uci6n_6`,histogramBar:`_histogramBar_uci6n_15`},L=({field:e,label:t,expectedMin:n=0,expectedMax:r=1e3,displayType:i=`input`,collapsible:a=!0,startCollapsed:o=!1,showHistogram:s=!1,resolution:l})=>{let{state:{rangeFilters:f,rangeBounds:p,facetStats:m,facets:h,facetableFields:g,query:_,facetDebounceDelayMillis:v},setRangeFilter:y,resetRangeFilter:x,allowEmptySearch:S,isFetchingInitial:C}=b(),w=p?.[e]!==void 0,T=p?.[e]??{min:n,max:r},E=T.min,D=T.max,O=m?.[e]??T,k=Math.max(E,Math.min(D,O.min)),A=Math.max(E,Math.min(D,O.max)),j=w&&E===D,M=j?n:E,P=j?r:D,F=f?.[e],L=F?F.min:E,R=F?F.max:D,z=F!==void 0,B=k!==E||A!==D,[V,H]=c.default.useState([L,R]),[U,W]=c.default.useState(!1),[G,K]=c.default.useState(!1),{finalMin:q,finalMax:J,isValidMin:Y,isValidMax:X}=c.default.useMemo(()=>{let[e,t]=V,n=Math.max(E,Math.min(D,e)),r=Math.max(E,Math.min(D,t)),i=Math.min(n,r),a=Math.max(n,r);return{finalMin:i,finalMax:a,isValidMin:i>=E&&i<a,isValidMax:a<=D&&a>i}},[V,E,D]);c.default.useEffect(()=>{if(j)return;if(V[0]===E&&V[1]===D){W(!1),K(!1);return}let t=v??500,n=setTimeout(()=>{W(!Y),K(!X)},300),r=setTimeout(()=>{Y&&X&&(q===E&&J===D?x(e,!1):y(e,q,J))},t);return()=>{clearTimeout(n),clearTimeout(r)}},[q,J,Y,X,E,D,e,x,y,v,j]),c.default.useEffect(()=>{H([L,R]),W(!1),K(!1)},[L,R,e]);let ee=c.default.useCallback(e=>{j||H([Math.max(E,Math.min(A,e[0])),Math.max(k,Math.min(D,e[1]))])},[j,E,D,k,A]),te=c.default.useCallback(t=>{if(j)return;let n=Math.max(E,Math.min(A,t[0])),r=Math.max(k,Math.min(D,t[1]));n===E&&r===D?(H([E,D]),x(e,!0)):H([n,r])},[j,E,D,k,A,e,x]),ne=c.default.useCallback(e=>{if(j)return;let t=Number(e.target.value);isNaN(t)||H([Math.max(E,Math.min(A,t)),V[1]])},[j,V,E,A]),re=c.default.useCallback(e=>{if(j)return;let t=Number(e.target.value);if(!isNaN(t)){let e=Math.max(k,Math.min(D,t));H([V[0],e])}},[j,V,k,D]),ie=c.default.useCallback(()=>{let e=V[0],t=Math.max(E,Math.min(A,e));t<V[1]?H([t,V[1]]):H([E,V[1]])},[V,E,A]),ae=c.default.useCallback(()=>{let e=V[1],t=Math.max(k,Math.min(D,e));t>V[0]?H([V[0],t]):H([V[0],D])},[V,k,D]),[Z,oe]=c.default.useState(null),Q=c.default.useRef(null);c.default.useEffect(()=>{if(!s)return;let t=`${E}:${D}`;if(t===Q.current&&Q.current!==null)return;let n=h?.[e];if(!Array.isArray(n)||n.length===0)return;let r=n.filter(e=>e.value!=null&&!isNaN(Number(e.key))).map(e=>({key:e.key,value:e.value}));r.length>0&&(Q.current=t,oe(r))},[E,D,h,e,s]);let $=c.default.useMemo(()=>{if(!s||!Z||Z.length===0)return[];let e=D-E;if(e<=0)return[];let t=l??(Math.ceil(e/20)||1),n=Math.ceil(e/t);return Array.from({length:n},(e,n)=>{let r=E+n*t,i=E+(n+1)*t;return{bucketStart:r,bucketEnd:i,count:Z.filter(e=>{let t=Number(e.key);return t>=r&&t<i}).reduce((e,t)=>e+t.value,0)}})},[s,Z,E,D,l]),se=c.default.useMemo(()=>Math.max(...$.map(e=>e.count),1),[$]);return s&&!C&&!g?.includes(e)&&console.warn(`RangeFilterPanel: showHistogram=true but field "${e}" is not facetable. Add .Facetable = true to this field.`),C?(0,u.jsx)(N,{title:t,variant:`slider`,collapsible:a,startCollapsed:o}):!S&&!_?null:i===`slider`?(0,u.jsxs)(d.FilterPanelBase,{title:t,collapsed:o,collapsible:a,children:[j&&(0,u.jsxs)(`div`,{className:I.disabledMessage,children:[`No adjustable range (all results have the same value: `,E,`).`]}),s&&$.length>0&&(0,u.jsx)(`div`,{className:I.histogram,children:(()=>{let e=typeof k==`number`&&typeof A==`number`&&A>k&&(k>E||A<D);return $.map((t,n)=>{let r=Math.max(1,Math.ceil(t.count/se*20)),i=e?t.bucketEnd>k&&t.bucketStart<A:t.bucketEnd>q&&t.bucketStart<J;return(0,u.jsx)(`div`,{className:I.histogramBar,"data-testid":`histogram-bar`,"data-active":i,style:{height:`${r}px`,background:i?`var(--lv5)`:`var(--lv3)`}},n)})})()}),(0,u.jsx)(`div`,{style:{padding:`10px 10px 20px 10px`},children:(0,u.jsx)(d.Slider,{min:M,max:P,value:j?[M,P]:[q,J],isRange:!0,onChange:e=>ee(e),onFinalChange:e=>te(e),disabled:j,activeMin:k,activeMax:A,isFaceted:B,highlightFaceted:z,"aria-label":t||`Filter by ${e}`})}),(0,u.jsxs)(`div`,{style:{display:`flex`,flex:`flex-grow`,gap:`10px`,alignItems:`flex-start`,justifyContent:`space-between`},children:[(0,u.jsx)(d.InputField,{label:`Min:`,type:`number`,value:j?E:V[0],min:E,max:Math.min(A,V[1]-1),onChange:ne,onBlur:ie,disabled:j,isValid:j||!U}),(0,u.jsx)(d.InputField,{label:`Max:`,type:`number`,value:j?D:V[1],min:Math.max(k,V[0]+1),max:D,onChange:re,onBlur:ae,disabled:j,isValid:j||!G})]})]}):(0,u.jsxs)(d.FilterPanelBase,{title:t,children:[j&&(0,u.jsxs)(`div`,{className:I.disabledMessage,children:[`No adjustable range (all results have the same value: `,E,`).`]}),(0,u.jsxs)(`div`,{style:{display:`flex`,gap:`10px`,alignItems:`flex-start`},children:[(0,u.jsx)(d.InputField,{label:`Min:`,type:`number`,value:j?E:V[0],min:E,max:Math.min(A,V[1]-1),onChange:ne,onBlur:ie,disabled:j,isValid:j||!U}),(0,u.jsx)(d.InputField,{label:`Max:`,type:`number`,value:j?D:V[1],min:Math.max(k,V[0]+1),max:D,onChange:re,onBlur:ae,disabled:j,isValid:j||!G})]})]})},R={grid:`_grid_xm2uh_2`,chip:`_chip_xm2uh_17`,chipLabel:`_chipLabel_xm2uh_28`},z=(0,c.memo)(({field:e,value:t,onReset:n})=>(0,u.jsx)(`li`,{children:(0,u.jsx)(d.Button,{onClick:n,iconRight:(0,u.jsx)(f.X_or_error,{}),variant:`primary`,size:`micro`,className:R.chip,title:`${e}: ${t}`,children:(0,u.jsxs)(`span`,{className:R.chipLabel,children:[e,`: `,t]})})})),B=(0,c.memo)(({field:e,min:t,max:n,onReset:r})=>(0,u.jsx)(`li`,{children:(0,u.jsx)(d.Button,{onClick:r,iconRight:(0,u.jsx)(f.X_or_error,{}),variant:`primary`,size:`micro`,className:R.chip,title:`${e}: ${t} – ${n}`,children:(0,u.jsxs)(`span`,{className:R.chipLabel,children:[e,`: `,t,` – `,n]})})}));function V(){let{state:{filters:e,rangeFilters:t},resetFilters:n,resetSingleFilter:r,resetRangeFilter:i}=b(),a=(0,c.useMemo)(()=>Object.entries(e).map(([e,t])=>t.map(t=>({field:e,value:t}))).flat(),[e]),o=(0,c.useMemo)(()=>Object.entries(t).map(([e,{min:t,max:n}])=>({field:e,min:t,max:n})),[t]);return(0,c.useMemo)(()=>Object.keys(e).length>0||Object.keys(t).length>0,[e,t])?(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,title:`Active filters`,children:(0,u.jsxs)(`ul`,{className:R.grid,children:[a.map(({field:e,value:t})=>(0,u.jsx)(z,{field:e,value:t,onReset:()=>r(e,t)},`${e}-${t}`)),o.map(({field:e,min:t,max:n})=>(0,u.jsx)(B,{field:e,min:t,max:n,onReset:()=>i(e)},e)),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.Button,{onClick:n,size:`micro`,variant:`ghost`,children:`Reset`})})]})}):null}var H={select:`_select_nwf7i_1`,radioGroup:`_radioGroup_nwf7i_6`},U=({displayType:e=`dropdown`,collapsible:t=!0,startCollapsed:n=!1})=>{let{state:{sortableFields:r,sortBy:i,sortAscending:a},setSort:o,isFetchingInitial:s}=b();if(s)return(0,u.jsx)(N,{title:`Sort by`,rows:e===`radio`?3:1,collapsible:t,startCollapsed:n});if(!r||r.length===0)return null;let c=i?`${i}:${a?`asc`:`desc`}`:`none`,l=[{label:`None`,value:`none`},...r.flatMap(e=>[{label:`${e} (asc)`,value:`${e}:asc`},{label:`${e} (desc)`,value:`${e}:desc`}])],f=e=>{if(e===`none`||e===``)o(null,!0);else{let[t,n]=e.split(`:`);o(t,n===`asc`)}};return(0,u.jsx)(d.FilterPanelBase,{title:`Sort by`,collapsible:t,collapsed:t?n:!1,children:e===`dropdown`?(0,u.jsx)(d.Select,{value:c,onValueChange:f,options:l,placeholder:`Select sort...`,"aria-label":`Sort by`}):(0,u.jsx)(`div`,{className:H.radioGroup,children:l.map(e=>(0,u.jsx)(d.RadioButton,{id:`sort-${e.value}`,name:`sort-by`,value:e.value,label:e.label,checked:c===e.value,onChange:e=>f(e.target.value)},e.value))})})},W={list:`_list_1y4fk_1`};function G(){let{state:{searchSettings:e},setSearchSettings:t}=b(),[n,r]=(0,c.useState)(!1),i=(e,n)=>{let r=parseInt(n,10);isNaN(r)||t({[e]:r})},a=(e,n)=>{t({[e]:n})},o=(n,r)=>{let i=parseInt(r,10);isNaN(i)||t({coverageSetup:{...e.coverageSetup,[n]:i}})},s=(n,r)=>{t({coverageSetup:{...e.coverageSetup,[n]:r}})};return(0,u.jsx)(d.FilterPanelBase,{collapsed:!0,title:`Settings`,children:(0,u.jsxs)(`ul`,{className:W.list,children:[(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Max Results`,type:`number`,value:e.maxNumberOfRecordsToReturn.toString(),onChange:e=>i(`maxNumberOfRecordsToReturn`,e.target.value)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Coverage Depth`,type:`number`,value:e.coverageDepth.toString(),onChange:e=>i(`coverageDepth`,e.target.value)})}),(0,u.jsxs)(`li`,{children:[(0,u.jsx)(d.InputField,{label:`Minimum Score (16 bit)`,type:`number`,value:e.minimumScore.toString(),min:`0`,max:`65535`,onChange:e=>{let n=parseFloat(e.target.value);isNaN(n)||t({minimumScore:n})}}),(0,u.jsx)(`div`,{style:{padding:`10px 10px 20px 10px`},children:(0,u.jsx)(d.Slider,{min:0,max:65535,step:5e3,value:e.minimumScore,onChange:e=>{t({minimumScore:e})},"aria-label":`Minimum score`})})]}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Placeholder text`,type:`text`,value:e.placeholderText,onChange:e=>{t({placeholderText:e.target.value})}})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Show score`,checked:e.showScore,onChange:e=>a(`showScore`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Enable Coverage`,checked:e.enableCoverage,onChange:e=>a(`enableCoverage`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Remove Duplicates`,checked:e.removeDuplicates,onChange:e=>a(`removeDuplicates`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.Button,{variant:`ghost`,size:`micro`,iconRight:n?(0,u.jsx)(f.ArrowDown,{}):(0,u.jsx)(f.ArrowRight,{}),onClick:()=>r(e=>!e),children:n?`Hide Coverage Setup`:`Show Coverage Setup`})}),n&&(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Cover Whole Query`,checked:e.coverageSetup.coverWholeQuery,onChange:e=>s(`coverWholeQuery`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Cover Whole Words`,checked:e.coverageSetup.coverWholeWords,onChange:e=>s(`coverWholeWords`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Cover Fuzzy Words`,checked:e.coverageSetup.coverFuzzyWords,onChange:e=>s(`coverFuzzyWords`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Cover Joined Words`,checked:e.coverageSetup.coverJoinedWords,onChange:e=>s(`coverJoinedWords`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Cover Prefix Suffix`,checked:e.coverageSetup.coverPrefixSuffix,onChange:e=>s(`coverPrefixSuffix`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Truncate`,checked:e.coverageSetup.truncate,onChange:e=>s(`truncate`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Include Pattern Matches`,checked:e.coverageSetup.includePatternMatches,onChange:e=>s(`includePatternMatches`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Levenshtein Max Word Size`,type:`number`,value:e.coverageSetup.levenshteinMaxWordSize.toString(),onChange:e=>o(`levenshteinMaxWordSize`,e.target.value)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Min Word Size`,type:`number`,value:e.coverageSetup.minWordSize.toString(),onChange:e=>o(`minWordSize`,e.target.value)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Truncate Word Hit Limit`,type:`number`,value:e.coverageSetup.truncateWordHitLimit.toString(),onChange:e=>o(`truncateWordHitLimit`,e.target.value)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Truncate Word Hit Tolerance`,type:`number`,value:e.coverageSetup.truncateWordHitTolerance.toString(),onChange:e=>o(`truncateWordHitTolerance`,e.target.value)})})]})]})})}var K=class extends c.Component{constructor(e){super(e),this.state={hasError:!1,error:null}}static getDerivedStateFromError(e){return{hasError:!0,error:e}}componentDidCatch(e,t){console.error(`[SearchErrorBoundary] Caught error:`,e,t)}reset=()=>{this.setState({hasError:!1,error:null})};render(){return this.state.hasError&&this.state.error?this.props.fallback?this.props.fallback(this.state.error,this.reset):(0,u.jsxs)(`div`,{style:{padding:`2rem`,backgroundColor:`#fee`,border:`2px solid #c33`,borderRadius:`8px`,maxWidth:`600px`,margin:`2rem auto`},children:[(0,u.jsx)(`h2`,{style:{color:`#c33`,marginTop:0},children:`⚠️ Search Initialization Error`}),(0,u.jsxs)(`p`,{style:{marginBottom:`1rem`},children:[(0,u.jsx)(`strong`,{children:`Error:`}),` `,this.state.error.message]}),(0,u.jsxs)(`div`,{style:{backgroundColor:`#fff`,padding:`1rem`,borderRadius:`4px`,marginBottom:`1rem`,fontSize:`0.9rem`},children:[(0,u.jsx)(`strong`,{children:`💡 Common fixes:`}),(0,u.jsxs)(`ul`,{style:{marginBottom:0,paddingLeft:`1.5rem`},children:[(0,u.jsx)(`li`,{children:`Check browser console for detailed error messages`}),(0,u.jsx)(`li`,{children:`Verify the url passed to SearchProvider is correct`}),(0,u.jsx)(`li`,{children:`Verify your bearer token is valid (create or check it on the IndxCloudApi website)`}),(0,u.jsx)(`li`,{children:`Ensure INDX server is running`}),(0,u.jsx)(`li`,{children:`Check dataset name spelling`})]})]}),(0,u.jsx)(`button`,{onClick:this.reset,style:{padding:`0.5rem 1rem`,backgroundColor:`#c33`,color:`white`,border:`none`,borderRadius:`4px`,cursor:`pointer`,fontWeight:`bold`},children:`Try Again`})]}):this.props.children}};function q(e,t){let{url:n,team:r,dataset:i,authenticatedFetch:a}=b(),[o,s]=(0,c.useState)(null),[l,u]=(0,c.useState)(!1),[d,f]=(0,c.useState)(void 0);return{results:o,isLoading:l,error:d,search:(0,c.useCallback)(async o=>{u(!0),f(void 0);try{let c=await e(o),l={fieldName:t.fieldName,vector:c,maxResults:t.maxResults??10};t.filter&&(l.filter=t.filter);let u=await a(`${n}/api/teams/${r}/datasets/${i}/search/vector`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(l)});if(!u.ok)throw Error(`VectorSearch failed: ${u.status}`);let d=await u.json();if(d.length===0){s([]);return}let f=d.map(e=>e.documentKey),p=await a(`${n}/api/teams/${r}/datasets/${i}/documents/lookup`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(f)});if(!p.ok)throw Error(`GetJson failed: ${p.status}`);s((await p.json()).map((e,t)=>({document:e,documentKey:f[t],score:d[t].score})))}catch(e){f(e instanceof Error?e.message:`Vector search failed`),s(null)}finally{u(!1)}},[e,t.fieldName,t.maxResults,t.filter,n,r,i,a])}}function J(e,t){let{url:n,team:r,dataset:i,authenticatedFetch:a}=b(),[o,s]=(0,c.useState)(null),[l,u]=(0,c.useState)(!1),[d,f]=(0,c.useState)(void 0);return{results:o,isLoading:l,error:d,search:(0,c.useCallback)(async o=>{u(!0),f(void 0);try{let c=await e(o),l={text:o,embeddingField:t.fieldName,vector:c,maxNumberOfRecordsToReturn:t.maxResults??10,alpha:t.alpha??.5};t.filter&&(l.filter=t.filter),t.timeoutMs&&(l.timeOutLimitMilliseconds=t.timeoutMs);let u=await a(`${n}/api/teams/${r}/datasets/${i}/search/hybrid`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(l)});if(!u.ok)throw Error(`HybridSearch failed: ${u.status}`);let d=await u.json();if(d.length===0){s([]);return}let f=d.map(e=>e.documentKey),p=await a(`${n}/api/teams/${r}/datasets/${i}/documents/lookup`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(f)});if(!p.ok)throw Error(`GetJson failed: ${p.status}`);s((await p.json()).map((e,t)=>({document:e,documentKey:f[t],score:d[t].score})))}catch(e){f(e instanceof Error?e.message:`Hybrid search failed`),s(null)}finally{u(!1)}},[e,t.fieldName,t.alpha,t.maxResults,t.filter,t.timeoutMs,n,r,i,a])}}exports.ActiveFiltersPanel=V,exports.FilterPanelSkeleton=N,exports.RangeFilterPanel=L,exports.SearchContext=v,exports.SearchErrorBoundary=K,exports.SearchInput=x,exports.SearchProvider=y,exports.SearchResult=w,exports.SearchResultRow=A,exports.SearchResults=O,exports.SearchResultsSkeleton=D,exports.SearchSettingsPanel=G,exports.SortByPanel=U,exports.ValueFilterPanel=F,exports.useHybridSearch=J,exports.useSearch=b,exports.useSearchContext=b,exports.useVectorSearch=q;
|
package/dist/index.es.js
CHANGED
|
@@ -6,27 +6,16 @@ import { Button as m, Checkbox as h, FilterPanelBase as g, InputField as _, Radi
|
|
|
6
6
|
import { ArrowDown as C, ArrowRight as w, Indx as T, X_or_error as E } from "@indxsearch/pixl";
|
|
7
7
|
//#region src/context/useIndxAuth.ts
|
|
8
8
|
function D({ url: e, team: t, dataset: n, preAuthenticatedToken: r, enableDebugLogs: i = !1 }) {
|
|
9
|
-
let [a, s] = l(null), [c, d] = l(!0), [f, p] = l([]), [m, h] = l([]), [g, _] = l([]), [v, y] = l({}), [b, x] = l({}), [S, C] = l(0);
|
|
9
|
+
let [a, s] = l(null), [c, d] = l(!0), [f, p] = l([]), [m, h] = l([]), [g, _] = l([]), [v, y] = l({}), [b, x] = l({}), [S, C] = l(0), [w, T] = l(null);
|
|
10
10
|
return o(() => {
|
|
11
11
|
(async () => {
|
|
12
|
+
T(null);
|
|
12
13
|
try {
|
|
13
14
|
if (!r) throw console.error("[Auth] ❌ Missing bearer token"), console.error("[Auth] 💡 Pass preAuthenticatedToken to SearchProvider (create a token on the IndxCloudApi website)"), Error("A bearer token is required. Check console for instructions.");
|
|
14
15
|
if (!e) throw console.error("[Auth] ❌ Missing INDX server URL"), console.error("[Auth] 💡 Pass a url to SearchProvider"), Error("INDX server URL is required. Check console for instructions.");
|
|
15
16
|
if (!n) throw console.error("[Auth] ❌ Missing dataset name"), console.error("[Auth] 💡 Pass dataset=\"your-dataset-name\" to SearchProvider"), Error("Dataset name is required. Check console for instructions.");
|
|
16
17
|
i && console.log("[Auth] ✅ Using bearer token");
|
|
17
|
-
let a = r
|
|
18
|
-
i && console.log("[Auth] 🔓 Opening dataset session...");
|
|
19
|
-
let o = await fetch(`${e}/api/teams/${t}/datasets/${n}/CreateOrOpen/400`, {
|
|
20
|
-
method: "PUT",
|
|
21
|
-
headers: {
|
|
22
|
-
"Content-Type": "application/json",
|
|
23
|
-
Authorization: `Bearer ${a}`
|
|
24
|
-
},
|
|
25
|
-
body: "\"\""
|
|
26
|
-
});
|
|
27
|
-
if (!o.ok) throw console.error("[Auth] ❌ CreateOrOpen failed:", o.status, await o.text()), Error("Failed to open dataset session.");
|
|
28
|
-
s(a), i && console.log("[Auth] ✅ Dataset session established");
|
|
29
|
-
let c = (e) => fetch(e, {
|
|
18
|
+
let a = r, o = (e) => fetch(e, {
|
|
30
19
|
method: "GET",
|
|
31
20
|
headers: {
|
|
32
21
|
accept: "text/plain",
|
|
@@ -34,23 +23,33 @@ function D({ url: e, team: t, dataset: n, preAuthenticatedToken: r, enableDebugL
|
|
|
34
23
|
}
|
|
35
24
|
});
|
|
36
25
|
i && console.log("[Auth] 🔍 Checking dataset status...");
|
|
37
|
-
let
|
|
38
|
-
if (!
|
|
39
|
-
if (
|
|
40
|
-
if (
|
|
26
|
+
let c = await o(`${e}/api/teams/${t}/datasets/${n}/status`);
|
|
27
|
+
if (!c.ok) {
|
|
28
|
+
if (c.status === 401) throw console.error("[Auth] ❌ Authentication failed (401 Unauthorized)"), console.error("[Auth] 💡 Your token may be expired or invalid"), console.error("[Auth] 💡 Create or refresh your token on the IndxCloudApi website"), Error("Authentication failed (401). Token may be expired. Check console for instructions.");
|
|
29
|
+
if (c.status === 404) throw console.error("[Auth] ❌ Dataset \"" + n + "\" not found (404)"), console.error("[Auth] 💡 Available datasets can be checked with: curl -X GET \"" + e + "/api/me/datasets\" -H \"Authorization: Bearer YOUR_TOKEN\""), console.error("[Auth] 💡 Make sure you spelled the dataset name correctly"), Error("Dataset \"" + n + "\" not found. Check console for instructions.");
|
|
41
30
|
{
|
|
42
|
-
let t = await
|
|
43
|
-
throw console.error("[Auth] ❌ Failed to get dataset status:",
|
|
31
|
+
let t = await c.text();
|
|
32
|
+
throw console.error("[Auth] ❌ Failed to get dataset status:", c.status, t), console.error("[Auth] 💡 Check if your INDX server is running at:", e), Error("Failed to connect to INDX server. Check console for details.");
|
|
44
33
|
}
|
|
45
34
|
}
|
|
46
|
-
let
|
|
47
|
-
i && console.log("[Auth] 📊 Dataset status:",
|
|
48
|
-
let
|
|
35
|
+
let l = await c.json();
|
|
36
|
+
i && console.log("[Auth] 📊 Dataset status:", l), i && console.log("[Auth] 🔓 Opening dataset session...");
|
|
37
|
+
let d = await fetch(`${e}/api/teams/${t}/datasets/${n}?configuration=400`, {
|
|
38
|
+
method: "PUT",
|
|
39
|
+
headers: {
|
|
40
|
+
"Content-Type": "application/json",
|
|
41
|
+
Authorization: `Bearer ${a}`
|
|
42
|
+
},
|
|
43
|
+
body: "\"\""
|
|
44
|
+
});
|
|
45
|
+
if (!d.ok) throw console.error("[Auth] ❌ CreateOrOpen failed:", d.status, await d.text()), Error("Failed to open dataset session.");
|
|
46
|
+
s(a), i && console.log("[Auth] ✅ Dataset session established"), l.systemState !== void 0 && l.systemState !== u.Ready && (console.warn("[Auth] ⚠️ Dataset is not ready yet. Current state:", u[l.systemState]), console.warn("[Auth] 💡 Wait for indexing to complete before searching"));
|
|
47
|
+
let f = l.documentCount ?? l.numberOfRecords ?? 0;
|
|
49
48
|
f === 0 ? (console.warn("[Auth] ⚠️ Dataset \"" + n + "\" is empty (0 records)"), console.warn("[Auth] 💡 Add documents to your dataset before searching"), console.warn("[Auth] 💡 Search will work but return no results")) : i && console.log("[Auth] ✅ Dataset has", f, "records");
|
|
50
49
|
let [m, g, v] = await Promise.all([
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
50
|
+
o(`${e}/api/teams/${t}/datasets/${n}/fields/filterable`),
|
|
51
|
+
o(`${e}/api/teams/${t}/datasets/${n}/fields/facetable`),
|
|
52
|
+
o(`${e}/api/teams/${t}/datasets/${n}/fields/sortable`)
|
|
54
53
|
]);
|
|
55
54
|
if (!m.ok) throw console.error("[Auth] ❌ GetFilterableFields failed:", m.status, await m.text()), Error("Failed to get filterable fields. Check console for details.");
|
|
56
55
|
if (!g.ok) throw console.error("[Auth] ❌ GetFacetableFields failed:", g.status, await g.text()), Error("Failed to get facetable fields. Check console for details.");
|
|
@@ -63,7 +62,7 @@ function D({ url: e, team: t, dataset: n, preAuthenticatedToken: r, enableDebugL
|
|
|
63
62
|
p(b || []), h(S || []), _(w || []), C(f);
|
|
64
63
|
let T = { facets: {} };
|
|
65
64
|
try {
|
|
66
|
-
let r = await fetch(`${e}/api/teams/${t}/datasets/${n}/
|
|
65
|
+
let r = await fetch(`${e}/api/teams/${t}/datasets/${n}/search`, {
|
|
67
66
|
method: "POST",
|
|
68
67
|
headers: {
|
|
69
68
|
"Content-Type": "application/json",
|
|
@@ -93,7 +92,7 @@ function D({ url: e, team: t, dataset: n, preAuthenticatedToken: r, enableDebugL
|
|
|
93
92
|
if (T.facets) for (let [e, t] of Object.entries(T.facets)) Array.isArray(t) && (D[e] = t.map((e) => e.key));
|
|
94
93
|
y(E), x(D), i && console.log("[Auth] ✅ Initialization complete");
|
|
95
94
|
} catch (t) {
|
|
96
|
-
|
|
95
|
+
console.error("[Auth] ❌ Initialization failed:", t), (t instanceof Error || typeof t == "object" && t && "message" in t) && console.error("[Auth] 💡 Error:", t.message), t instanceof TypeError && t.message.includes("fetch") && (console.error("[Auth] ❌ Network error - cannot connect to INDX server"), console.error("[Auth] 💡 Check if the server is running at:", e), console.error("[Auth] 💡 Check the url you passed to SearchProvider"), console.error("[Auth] 💡 For local development, it should be: http://localhost:5001")), T(t instanceof Error ? t.message : String(t));
|
|
97
96
|
} finally {
|
|
98
97
|
d(!1);
|
|
99
98
|
}
|
|
@@ -105,6 +104,7 @@ function D({ url: e, team: t, dataset: n, preAuthenticatedToken: r, enableDebugL
|
|
|
105
104
|
]), {
|
|
106
105
|
token: a,
|
|
107
106
|
isFetchingInitial: c,
|
|
107
|
+
authError: w,
|
|
108
108
|
initialFacetStats: v,
|
|
109
109
|
initialFacetKeys: b,
|
|
110
110
|
filterableFields: f,
|
|
@@ -120,8 +120,8 @@ async function O(e, t, n, r, i) {
|
|
|
120
120
|
if (e.length === 1) return e[0];
|
|
121
121
|
let a = e[0];
|
|
122
122
|
for (let o = 1; o < e.length; o++) {
|
|
123
|
-
let s = await i(`${t}/api/teams/${n}/datasets/${r}/
|
|
124
|
-
method: "
|
|
123
|
+
let s = await i(`${t}/api/teams/${n}/datasets/${r}/filters/combine`, {
|
|
124
|
+
method: "POST",
|
|
125
125
|
headers: { "Content-Type": "application/json" },
|
|
126
126
|
body: JSON.stringify({
|
|
127
127
|
a,
|
|
@@ -138,15 +138,15 @@ async function O(e, t, n, r, i) {
|
|
|
138
138
|
return a;
|
|
139
139
|
}
|
|
140
140
|
async function k(e, t, n, r, i, a) {
|
|
141
|
-
let o = Object.entries(e ?? {}), s = Object.entries(t ?? {}), [c, l] = await Promise.all([Promise.all(o.map(([e, t]) => Promise.all(t.map((t) => a(`${n}/api/teams/${r}/datasets/${i}/
|
|
142
|
-
method: "
|
|
141
|
+
let o = Object.entries(e ?? {}), s = Object.entries(t ?? {}), [c, l] = await Promise.all([Promise.all(o.map(([e, t]) => Promise.all(t.map((t) => a(`${n}/api/teams/${r}/datasets/${i}/filters/value`, {
|
|
142
|
+
method: "POST",
|
|
143
143
|
headers: { "Content-Type": "application/json" },
|
|
144
144
|
body: JSON.stringify({
|
|
145
145
|
fieldName: e,
|
|
146
146
|
value: t
|
|
147
147
|
})
|
|
148
|
-
}).then((e) => e.json()))))), Promise.all(s.map(([e, { min: t, max: o }]) => a(`${n}/api/teams/${r}/datasets/${i}/
|
|
149
|
-
method: "
|
|
148
|
+
}).then((e) => e.json()))))), Promise.all(s.map(([e, { min: t, max: o }]) => a(`${n}/api/teams/${r}/datasets/${i}/filters/range`, {
|
|
149
|
+
method: "POST",
|
|
150
150
|
headers: { "Content-Type": "application/json" },
|
|
151
151
|
body: JSON.stringify({
|
|
152
152
|
fieldName: e,
|
|
@@ -209,12 +209,12 @@ function j({ state: e, setState: t, authenticatedFetch: n, auth: r, url: a, team
|
|
|
209
209
|
coverageSetup: M
|
|
210
210
|
};
|
|
211
211
|
p && console.log("[performSearch] request body:", JSON.stringify(f, null, 2));
|
|
212
|
-
let m = await (await n(`${a}/api/teams/${s}/datasets/${u}/
|
|
212
|
+
let m = await (await n(`${a}/api/teams/${s}/datasets/${u}/search`, {
|
|
213
213
|
method: "POST",
|
|
214
214
|
headers: { "Content-Type": "application/json" },
|
|
215
215
|
body: JSON.stringify(f)
|
|
216
216
|
})).json(), h = m.truncationIndex ?? -1, _ = m.records || [], v = _.map((e) => e.documentKey), A = _.map((e) => e.score), F = [];
|
|
217
|
-
l && v.length > 0 && (F = (await (await n(`${a}/api/teams/${s}/datasets/${u}/
|
|
217
|
+
l && v.length > 0 && (F = (await (await n(`${a}/api/teams/${s}/datasets/${u}/documents/lookup`, {
|
|
218
218
|
method: "POST",
|
|
219
219
|
headers: { "Content-Type": "application/json" },
|
|
220
220
|
body: JSON.stringify(v)
|
|
@@ -527,6 +527,7 @@ var M = n(void 0), N = ({ children: e, url: t, team: n, dataset: r, allowEmptySe
|
|
|
527
527
|
value: {
|
|
528
528
|
state: x,
|
|
529
529
|
isFetchingInitial: w.isFetchingInitial,
|
|
530
|
+
authError: w.authError ?? void 0,
|
|
530
531
|
allowEmptySearch: a,
|
|
531
532
|
url: t,
|
|
532
533
|
team: n,
|
|
@@ -1599,7 +1600,7 @@ function se(e, t) {
|
|
|
1599
1600
|
maxResults: t.maxResults ?? 10
|
|
1600
1601
|
};
|
|
1601
1602
|
t.filter && (l.filter = t.filter);
|
|
1602
|
-
let u = await o(`${n}/api/teams/${r}/datasets/${a}/
|
|
1603
|
+
let u = await o(`${n}/api/teams/${r}/datasets/${a}/search/vector`, {
|
|
1603
1604
|
method: "POST",
|
|
1604
1605
|
headers: { "Content-Type": "application/json" },
|
|
1605
1606
|
body: JSON.stringify(l)
|
|
@@ -1610,7 +1611,7 @@ function se(e, t) {
|
|
|
1610
1611
|
c([]);
|
|
1611
1612
|
return;
|
|
1612
1613
|
}
|
|
1613
|
-
let f = d.map((e) => e.documentKey), p = await o(`${n}/api/teams/${r}/datasets/${a}/
|
|
1614
|
+
let f = d.map((e) => e.documentKey), p = await o(`${n}/api/teams/${r}/datasets/${a}/documents/lookup`, {
|
|
1614
1615
|
method: "POST",
|
|
1615
1616
|
headers: { "Content-Type": "application/json" },
|
|
1616
1617
|
body: JSON.stringify(f)
|
|
@@ -1657,7 +1658,7 @@ function ce(e, t) {
|
|
|
1657
1658
|
alpha: t.alpha ?? .5
|
|
1658
1659
|
};
|
|
1659
1660
|
t.filter && (l.filter = t.filter), t.timeoutMs && (l.timeOutLimitMilliseconds = t.timeoutMs);
|
|
1660
|
-
let u = await o(`${n}/api/teams/${r}/datasets/${a}/
|
|
1661
|
+
let u = await o(`${n}/api/teams/${r}/datasets/${a}/search/hybrid`, {
|
|
1661
1662
|
method: "POST",
|
|
1662
1663
|
headers: { "Content-Type": "application/json" },
|
|
1663
1664
|
body: JSON.stringify(l)
|
|
@@ -1668,7 +1669,7 @@ function ce(e, t) {
|
|
|
1668
1669
|
c([]);
|
|
1669
1670
|
return;
|
|
1670
1671
|
}
|
|
1671
|
-
let f = d.map((e) => e.documentKey), p = await o(`${n}/api/teams/${r}/datasets/${a}/
|
|
1672
|
+
let f = d.map((e) => e.documentKey), p = await o(`${n}/api/teams/${r}/datasets/${a}/documents/lookup`, {
|
|
1672
1673
|
method: "POST",
|
|
1673
1674
|
headers: { "Content-Type": "application/json" },
|
|
1674
1675
|
body: JSON.stringify(f)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@indxsearch/intrface",
|
|
3
|
-
"version": "3.0.0
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "Indx Search interface components for React. Provides ready-to-use filter panels, search inputs, faceted navigation, and sorting components. Built on @indxsearch/systm.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"indx",
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
"./styles.css": "./dist/intrface.css"
|
|
72
72
|
},
|
|
73
73
|
"dependencies": {
|
|
74
|
-
"@indxsearch/indx-types": "2.0.0
|
|
74
|
+
"@indxsearch/indx-types": "^2.0.0",
|
|
75
75
|
"@indxsearch/pixl": "^1.4.0",
|
|
76
76
|
"@indxsearch/systm": "^2.2.0",
|
|
77
77
|
"react-range": "^1.10.0"
|