@indxsearch/intrface 3.2.0 → 3.3.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 +8 -0
- package/README.md +11 -11
- package/dist/context/IndxApiError.d.ts +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.es.js +25 -35
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 3.3.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- Starting a search no longer sends `PUT …/datasets/{name}`. That is the server's create-or-open endpoint and needs write access, so every front-end had to ship a key that could change data. `SearchProvider` now calls only read endpoints (status, field lists, search, document lookup, filters), and works with a **Search only** API key. Servers without API key access levels are unaffected: the removed call returned 200 without doing anything for an existing dataset.
|
|
8
|
+
- README: use a Search only key, limited to the front-end's datasets.
|
|
9
|
+
|
|
10
|
+
|
|
3
11
|
## 3.2.0
|
|
4
12
|
|
|
5
13
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @indxsearch/intrface
|
|
2
2
|
|
|
3
|
-
A powerful, flexible React search UI library for Indx Search with [
|
|
3
|
+
A powerful, flexible React search UI library for Indx Search with [Indx](https://github.com/indxSearch/Indx).
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
@@ -16,12 +16,12 @@ A powerful, flexible React search UI library for Indx Search with [IndxCloudApi]
|
|
|
16
16
|
|
|
17
17
|
| Package | Version |
|
|
18
18
|
|---------|---------|
|
|
19
|
-
| **
|
|
19
|
+
| **Indx** | `2.0` |
|
|
20
20
|
| **React** | `^19.0.0` |
|
|
21
21
|
| **React DOM** | `^19.0.0` |
|
|
22
22
|
| **Node.js** | `^20.19.0 \|\| >=22.12.0` |
|
|
23
23
|
|
|
24
|
-
> **Note:** This library targets
|
|
24
|
+
> **Note:** This library targets Indx v2.0 (powered by IndxSearchLib v5). Different API versions may have incompatible changes.
|
|
25
25
|
|
|
26
26
|
## Installation
|
|
27
27
|
|
|
@@ -29,7 +29,7 @@ A powerful, flexible React search UI library for Indx Search with [IndxCloudApi]
|
|
|
29
29
|
npm install @indxsearch/intrface @indxsearch/systm @indxsearch/pixl
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
-
> **Note:** TypeScript type definitions for
|
|
32
|
+
> **Note:** TypeScript type definitions for Indx are automatically included via the `@indxsearch/indx-types` dependency.
|
|
33
33
|
|
|
34
34
|
## Quick Start
|
|
35
35
|
|
|
@@ -42,7 +42,7 @@ VITE_INDX_URL=https://your-indx-server.com
|
|
|
42
42
|
VITE_INDX_TOKEN=your-bearer-token-here
|
|
43
43
|
```
|
|
44
44
|
|
|
45
|
-
Create and
|
|
45
|
+
The token is an API key from the Indx console (Account → API keys). **Create it with the access level "Search only"**, limited to the team and the datasets this front-end searches. The key is sent from the browser, so anyone can read it; a Search key can search those datasets and nothing else, which is exactly what `SearchProvider` needs. Never use a Read or Full access key in a front-end — it would let anyone who opens the browser's network tab export or change your data.
|
|
46
46
|
|
|
47
47
|
> Only the server URL and token come from the environment. Your **team** and **dataset** identify *what* you're searching, so they're passed directly as props on `SearchProvider` (shown below) — not as env vars.
|
|
48
48
|
|
|
@@ -53,9 +53,9 @@ VITE_INDX_TOKEN=your-bearer-token-here
|
|
|
53
53
|
```
|
|
54
54
|
|
|
55
55
|
**Security Notes:**
|
|
56
|
-
-
|
|
57
|
-
-
|
|
58
|
-
-
|
|
56
|
+
- The key is visible to every visitor. Use a **Search only** key, limited to the datasets the page searches — Search keys need Indx server with API key access levels.
|
|
57
|
+
- If a key with more access ever shipped in a page, revoke it in the console (Account → API keys); it stays valid until revoked or expired.
|
|
58
|
+
- Never commit `.env.local` to version control.
|
|
59
59
|
|
|
60
60
|
### 2. Import Styles
|
|
61
61
|
|
|
@@ -112,7 +112,7 @@ export default function SearchPage() {
|
|
|
112
112
|
|
|
113
113
|
## Authentication
|
|
114
114
|
|
|
115
|
-
Authentication uses a **pre-issued bearer token**. Create and monitor tokens on the
|
|
115
|
+
Authentication uses a **pre-issued bearer token**. Create and monitor tokens on the Indx Dashboard, then provide the token to `SearchProvider`.
|
|
116
116
|
|
|
117
117
|
**Environment setup:**
|
|
118
118
|
```bash
|
|
@@ -321,7 +321,7 @@ export default function AdvancedSearch() {
|
|
|
321
321
|
| Prop | Type | Required | Default | Description |
|
|
322
322
|
|------|------|----------|---------|-------------|
|
|
323
323
|
| `url` | `string` | ✅ | - | INDX server URL |
|
|
324
|
-
| `preAuthenticatedToken` | `string` | ✅ | - | Bearer token created on the
|
|
324
|
+
| `preAuthenticatedToken` | `string` | ✅ | - | Bearer token created on the Indx Dashboard |
|
|
325
325
|
| `team` | `string` | ✅ | - | Team that owns the dataset — scopes requests to `/api/teams/{team}/datasets/{dataset}/…` |
|
|
326
326
|
| `dataset` | `string` | ✅ | - | Dataset name |
|
|
327
327
|
| `allowEmptySearch` | `boolean` | ❌ | `false` | Show results without query |
|
|
@@ -463,7 +463,7 @@ These components are also exported and can be used for custom layouts:
|
|
|
463
463
|
**Problem:** Authentication failed or token is invalid
|
|
464
464
|
|
|
465
465
|
**Solutions:**
|
|
466
|
-
1. Verify the token is valid and not expired; create a fresh one on the
|
|
466
|
+
1. Verify the token is valid and not expired; create a fresh one on the Indx Dashboard if needed
|
|
467
467
|
2. Check that `VITE_INDX_TOKEN` is correctly set in your environment variables
|
|
468
468
|
3. Verify the server is running and accessible
|
|
469
469
|
4. Check server logs for authentication issues
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { IndxProblem, IndxProblemCode } from '@indxsearch/indx-types';
|
|
2
2
|
/**
|
|
3
|
-
* A failed
|
|
3
|
+
* A failed Indx request, carrying the server's RFC 9457 problem document so a caller
|
|
4
4
|
* can act on the machine-readable `code` rather than the HTTP status:
|
|
5
5
|
*
|
|
6
6
|
* - `unknownFilter` — the filter token could not be honoured; re-create the filter and retry.
|
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),[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}}var m=class e extends Error{status;code;problem;retryAfterSeconds;constructor(e,t,n,r){let i=n?.detail??n?.title;super(`${e} failed: HTTP ${t}${i?` — ${i}`:``}`),this.name=`IndxApiError`,this.status=t,this.code=n?.code,this.problem=n,this.retryAfterSeconds=r}get retryable(){return this.code===`invalidState`&&this.problem?.retryable===!0}static async fromResponse(t,n){let r;try{let e=await n.json();e&&typeof e==`object`&&typeof e.code==`string`?r=e:e&&typeof e==`object`&&(r={...e,code:``})}catch{}let i=n.headers?.get?.(`Retry-After`),a=i!=null&&/^\d+$/.test(i)?Number(i):void 0;return new e(t,n.status,r,a)}};async function h(e,t,n,r,i,a,o){let s=await o(`${r}/api/teams/${i}/datasets/${a}/filters/${e}`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});if(!s.ok)throw await m.fromResponse(n,s);let c=await s.json();if(!c||typeof c.hashString!=`string`)throw Error(`${n} failed: server returned no filter token`);return c}async function g(e,t,n,r,i,a){if(e.length===0)return null;if(e.length===1)return e[0];let o=e[0];for(let s=1;s<e.length;s++)o=await h(`combine`,{a:o,b:e[s],useAndOperation:t===`and`},`CombineFilters`,n,r,i,a);return o}async function _(e,t,n,r,i,a,o={}){let s=Object.entries(e??{}).filter(([,e])=>e.length>0),c=Object.entries(t??{}),[l,u]=await Promise.all([Promise.all(s.map(async([e,t])=>g(await Promise.all(t.map(t=>h(`value`,{fieldName:e,value:t},`Value filter '${e}'`,n,r,i,a))),o[e]===`any`?`or`:`and`,n,r,i,a))),Promise.all(c.map(([e,{min:t,max:o}])=>h(`range`,{fieldName:e,lowerLimit:t,upperLimit:o},`Range filter '${e}'`,n,r,i,a)))]);return g([...l,...u],`and`,n,r,i,a)}function v(e,t){let n,r=(...r)=>{clearTimeout(n),n=setTimeout(()=>e(...r),t)};return r.cancel=()=>clearTimeout(n),r}function y({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),h=(0,c.useRef)(void 0),g=(0,c.useRef)(!1),[y,b]=(0,c.useState)({}),[x,S]=(0,c.useState)(``),[C,w]=(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 T=e.searchSettings.maxNumberOfRecordsToReturn,E=e.searchSettings.enableCoverage,D=e.searchSettings.removeDuplicates,O=e.searchSettings.coverageDepth,k=e.searchSettings.minimumScore,A=e.searchSettings.coverageSetup,j=e.sortBy,M=e.sortAscending,N=(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 _(e.filters,e.rangeFilters,i,a,o,n,e.valueMatch),f=s||e.query.trim()!==``,h={text:e.query,maxNumberOfRecordsToReturn:f?T:0,enableFacets:c,...d?{filter:d}:{},...j?{sortBy:j}:{},...M===void 0?{}:{sortAscending:M},enableCoverage:E,removeDuplicates:D,coverageDepth:O,coverageSetup:A};u&&console.log(`[performSearch] request body:`,JSON.stringify(h,null,2));let g=await n(`${i}/api/teams/${a}/datasets/${o}/search`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(h)});if(!g.ok)throw await m.fromResponse(`Search`,g);let v=await g.json(),N=v.truncationIndex??-1,P=v.records||[],F=P.map(e=>e.documentKey),I=P.map(e=>e.score),L=[];if(f&&F.length>0){let e=await n(`${i}/api/teams/${a}/datasets/${o}/documents/lookup`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(F)});if(!e.ok)throw await m.fromResponse(`Document lookup`,e);L=(await e.json()).map((e,t)=>({document:e,documentKey:F[t],score:I[t]}))}let R={};if(c&&v.facets){for(let[e,t]of Object.entries(v.facets))if(Array.isArray(t)&&t.length>0){let n=t.map(e=>Number(e.key)).filter(e=>!isNaN(e));n.length>0&&(R[e]={min:Math.min(...n),max:Math.max(...n)})}}if(l!==p.current)return;let z=e.query!==x,B=e.query!==C,V=e.facetStats??{};if(z?(V={...r.initialFacetStats,...R},b(V),S(e.query)):V={...y,...R},B&&c){let n={...e.rangeBounds};for(let[e,t]of Object.entries(R))n[e]=t;t(e=>({...e,rangeBounds:n})),w(e.query)}let H=v.facets;if(c&&(!H||Object.keys(H).length===0)){H={};for(let[e,t]of Object.entries(r.initialFacetKeys))H[e]=t.map(e=>({key:e,value:null}))}let U=L.filter(t=>{let n=e.query.trim();return n===``||n.length===1?!0:t.score>=k});t(e=>({...e,results:U,error:void 0,resultsSuppressed:!f,...c?{facets:H,facetStats:V}:{},isLoading:!1,truncationIndex:N}))}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.valueMatch,e.rangeFilters,e.facetStats,j,M,T,E,D,O,A,k,n,r.initialFacetStats,r.initialFacetKeys,r.token,y,x,C,e.rangeBounds,i,a,o,s,u,t]);(0,c.useEffect)(()=>{h.current=N},[N]);let P=(0,c.useRef)(null);(0,c.useEffect)(()=>(P.current?.cancel(),P.current=v(()=>{u&&console.log(`Debounced searchWithFacets fired`),h.current?.({enableFacets:!0})},e.facetDebounceDelayMillis??500),()=>{P.current?.cancel()}),[e.facetDebounceDelayMillis]),(0,c.useEffect)(()=>{!r.isFetchingInitial&&r.token&&!g.current&&(s&&h.current?.({enableFacets:l}),g.current=!0)},[r.isFetchingInitial,r.token,s,l]),(0,c.useEffect)(()=>{if(!r.token||!g.current)return;let n=e.query.trim(),i=n===``&&s;if(n===``&&!s){e.resultsSuppressed||t(e=>({...e,resultsSuppressed:!0}));return}return i?(P.current?.cancel(),h.current?.({enableFacets:l})):l?(u&&console.log(`Search fired`),h.current?.({enableFacets:!1}),P.current?.()):h.current?.({enableFacets:!1}),()=>{P.current?.cancel()}},[e.query,s,l]),(0,c.useEffect)(()=>{let t=d.current;if(d.current=!1,!g.current||!r.token||!t)return;let n=e.query.trim();!s&&n===``||h.current?.({enableFacets:l})},[e.filters,e.rangeFilters]),(0,c.useEffect)(()=>{if(!g.current||!r.token)return;let t=e.query.trim();!s&&t===``||h.current?.({enableFacets:l})},[j,M]);let F=(0,c.useRef)(!0),I=(0,c.useRef)(e.query);(0,c.useEffect)(()=>{if(F.current){F.current=!1;return}if(I.current!==e.query||!g.current||!r.token)return;if(f.current){f.current=!1,h.current?.({enableFacets:!1});return}let t=e.query.trim();!s&&t===``||h.current?.({enableFacets:l})},[T,E,D,O,A,k]),(0,c.useEffect)(()=>{I.current=e.query},[e.query])}var b=(0,c.createContext)(void 0),x=({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 _=(0,c.useRef)(!1),v=(0,c.useRef)(!1),x=(0,c.useRef)(a),[S,C]=(0,c.useState)({query:``,results:null,isLoading:!1,resultsSuppressed:!i,facetDebounceDelayMillis:o,filterableFields:[],facetableFields:[],sortableFields:[],filters:{},valueMatch:{},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)(()=>{C(e=>({...e,facetDebounceDelayMillis:o}))},[o]);let[w]=(0,c.useState)(s),T=p({url:t,team:n,dataset:r,preAuthenticatedToken:g,enableDebugLogs:h}),E=(0,c.useCallback)((e,t={})=>{if(!T.token)throw Error(`No authentication token available`);return fetch(e,{...t,headers:{...t.headers,Authorization:`Bearer ${T.token}`}})},[T.token]);y({state:S,setState:C,authenticatedFetch:E,auth:T,url:t,team:n,dataset:r,allowEmptySearch:i,facetsEnabled:w,enableDebugLogs:h,filtersChangedByUser:_,shouldFetchMore:v});let D=(0,c.useCallback)(e=>{_.current=!1,C(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:x.current}}})},[]),O=(0,c.useCallback)(e=>{C(t=>({...t,facetDebounceDelayMillis:e}))},[]),k=(0,c.useCallback)(e=>{typeof e.maxNumberOfRecordsToReturn==`number`&&(x.current=e.maxNumberOfRecordsToReturn),C(t=>{let n={...t.searchSettings,...e};return e.coverageSetup?n.coverageSetup={...t.searchSettings.coverageSetup,...e.coverageSetup}:n.coverageSetup=t.searchSettings.coverageSetup,{...t,searchSettings:n}})},[]),A=(0,c.useCallback)(e=>{v.current=!0,C(t=>({...t,searchSettings:{...t.searchSettings,maxNumberOfRecordsToReturn:e}}))},[]),j=(0,c.useCallback)((e,t)=>{_.current=!0,C(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}})},[]),M=(0,c.useCallback)((e,t)=>{C(n=>n.valueMatch[e]===t?n:{...n,valueMatch:{...n.valueMatch,[e]:t}})},[]),N=(0,c.useCallback)((e,t,n)=>{_.current=!0,C(r=>({...r,rangeFilters:{...r.rangeFilters,[e]:{min:t,max:n}}}))},[]),P=(0,c.useCallback)(()=>{_.current=!0,C(e=>({...e,filters:{},rangeFilters:{}}))},[]),F=(0,c.useCallback)((e,t,n=!0)=>{n&&(_.current=!0),C(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}})},[]),I=(0,c.useCallback)((e,t=!0)=>{t&&(_.current=!0),C(t=>{let n={...t.rangeFilters};return delete n[e],{...t,rangeFilters:n}})},[]),L=(0,c.useCallback)((e,t)=>{C(n=>({...n,sortBy:e||void 0,sortAscending:e?t:void 0}))},[]);return(0,u.jsx)(b.Provider,{value:{state:S,isFetchingInitial:T.isFetchingInitial,authError:T.authError??void 0,allowEmptySearch:i,url:t,team:n,dataset:r,authenticatedFetch:E,setQuery:D,toggleFilter:j,setValueMatch:M,setRangeFilter:N,resetFilters:P,resetSingleFilter:F,resetRangeFilter:I,setSort:L,setDebounceDelay:O,setSearchSettings:k,fetchMoreResults:A},children:e})},S=()=>{let e=(0,c.useContext)(b);if(!e)throw Error(`useSearchContext must be used within a SearchProvider`);return e},C=({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}=S();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`})})},w={placeholder:`_placeholder_ee9qi_1`,invalid:`_invalid_ee9qi_11`},T={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`},E=({skeleton:e=!1,index:t,score:n,showScore:r=!1,children:i,skeletonDelay:a=0,skeletonWidths:o=[62,38]})=>(0,u.jsxs)(`div`,{className:T.row,children:[t!==void 0&&(0,u.jsx)(`div`,{className:T.indexNumber,children:t}),(0,u.jsx)(`div`,{className:T.content,children:e?(0,u.jsxs)(`div`,{className:T.skeletonBars,children:[(0,u.jsx)(`div`,{className:T.skeletonBarLg,style:{width:`${o[0]}%`,animationDelay:`${a}s`}}),(0,u.jsx)(`div`,{className:T.skeletonBarSm,style:{width:`${o[1]}%`,animationDelay:`${a+.05}s`}})]}):i}),r&&n!==void 0&&(0,u.jsx)(`div`,{className:T.scoreNumber,children:n})]}),D={wrapper:`_wrapper_81m3c_6`,skeletonAppear:`_skeletonAppear_81m3c_1`},O=[[62,38],[75,45],[58,33],[70,42],[65,50],[55,35],[72,40],[60,30]],k=({rows:e=6})=>(0,u.jsx)(`div`,{className:D.wrapper,children:Array.from({length:e}).map((e,t)=>(0,u.jsx)(E,{skeleton:!0,skeletonDelay:t*.1,skeletonWidths:O[t%O.length]},t))}),A=/^\[\s*(?:'[^']*'(?:\s*,\s*'[^']*')*)?\s*\]$/;function j(e){let t=e.trim();if(!t.startsWith(`[`)||!t.endsWith(`]`))return;try{let e=JSON.parse(t);if(Array.isArray(e))return e.map(e=>String(e))}catch{}if(!A.test(t))return;let n=[],r=/'([^']*)'/g,i;for(;(i=r.exec(t))!==null;)n.push(i[1]);return n}var M=({fields:e,resultsPerPage:t,parseArrayStrings:n=!1,children:r})=>{let{state:{results:i,resultsSuppressed:a,searchSettings:o,truncationIndex:s,query:l,error:p},isFetchingInitial:m,authError:h,allowEmptySearch:g,fetchMoreResults:_}=S(),v=t??30,[y,b]=(0,c.useState)(v),x=(0,c.useRef)(0),C=(0,c.useRef)(``);(0,c.useEffect)(()=>{let e=l!==C.current;(!i||i.length<x.current||e)&&b(v),x.current=i?.length??0,C.current=l},[i,v,l]);let T=i&&i.length>y,D=()=>{let e=y+v;b(e),i&&e>=i.length&&(!s||s===-1||s>i.length)&&_(i.length+v)};if(m)return g?(0,u.jsx)(k,{rows:v}):(0,u.jsx)(`div`,{className:w.placeholder,children:(0,u.jsx)(f.Indx,{size:200,color:`var(--lv5)`})});let O=h??p;return O?(0,u.jsx)(`div`,{className:w.invalid,role:`alert`,children:(0,u.jsx)(`p`,{children:O})}):a||i===null?(0,u.jsx)(`div`,{className:w.placeholder,children:(0,u.jsx)(f.Indx,{size:200,color:`var(--lv5)`})}):i.length===0?(0,u.jsx)(`div`,{className:w.invalid,children:(0,u.jsx)(`p`,{children:`No results found.`})}):(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(`div`,{children:(i??[]).slice(0,y).map((t,i)=>{let a=t.document,s=t.score,c;try{c=typeof a==`string`?JSON.parse(a):a}catch{return(0,u.jsx)(`div`,{className:w.invalid,children:(0,u.jsx)(`p`,{children:`Invalid JSON`})},i)}let l;if(e&&e.length>0){l={};for(let t of e)t in c&&(l[t]=c[t])}else l={...c};if(n)for(let e in l){let t=l[e];if(typeof t==`string`){let n=j(t);n&&(l[e]=n)}}return(0,u.jsx)(E,{index:i,score:s,showScore:o.showScore,children:r(l)},i)})}),T&&(0,u.jsx)(`div`,{style:{textAlign:`center`,marginTop:`20px`},children:(0,u.jsx)(d.Button,{variant:`secondary`,size:`micro`,onClick:D,children:l.trim()===``?`Load more`:s!==-1&&s!==void 0&&s>0?`Load results ${y+1}-${Math.min(y+v,i.length,s)} of ${s}`:`Load more`})})]})},N={row:`_row_ujwhc_1`,title:`_title_ujwhc_8`},P=({variant:e=`default`,children:t})=>(0,u.jsx)(`div`,{className:[N.row,e===`title`?N.title:``].filter(Boolean).join(` `),children:t}),F={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`},I=[65,80,55,72,60,75,50,68],L=({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:F.sliderArea,children:[(0,u.jsx)(`div`,{className:F.sliderTrack}),(0,u.jsxs)(`div`,{className:F.inputRow,children:[(0,u.jsx)(`div`,{className:F.inputBar,style:{animationDelay:`0.1s`}}),(0,u.jsx)(`div`,{className:F.inputBar,style:{animationDelay:`0.15s`}})]})]}):(0,u.jsx)(`div`,{className:F.listRows,children:Array.from({length:t}).map((e,t)=>(0,u.jsx)(`div`,{className:F.bar,style:{width:`${I[t%I.length]}%`,animationDelay:`${t*.05}s`}},t))})}),R={list:`_list_m82u6_2`,count:`_count_m82u6_7`,countValue:`_countValue_m82u6_17`,chip:`_chip_m82u6_22`,chipLabel:`_chipLabel_m82u6_32`,grid:`_grid_m82u6_40`},z=({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,match:g=`all`,displayIfEmptyQuery:_=!0,displayCondition:v=e=>!0})=>{let{state:{facets:y,filterableFields:b,facetableFields:x,filters:C,query:w},toggleFilter:T,setValueMatch:E,isFetchingInitial:D,allowEmptySearch:O}=S();(0,c.useEffect)(()=>{E(e,g)},[e,g,E]);let k=(0,c.useRef)(null),[A,j]=(0,c.useState)(a);if((0,c.useEffect)(()=>{j(a)},[y?.[e],a]),!O&&!w)return null;if(D||!y)return l===`toggle`?(0,u.jsx)(L,{rows:1,collapsible:!1}):(0,u.jsx)(L,{title:t,rows:Math.min(a,6),collapsible:o,startCollapsed:s});if(!v({query:w??``,filters:C,facets:y})||!_&&!w&&Object.keys(C).length<1)return null;if(!b?.includes(e)||!x?.includes(e)){let t=[];return b?.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 M=y?.[e]??(l===`toggle`?[]:void 0);if(!M||!Array.isArray(M))return null;let N=C?.[e]??[];n&&!k.current&&M.length>0&&(k.current=M.reduce((e,t)=>(e[t.key]=t.value,e),{}));let P=new Map;n&&k.current&&Object.keys(k.current).forEach(e=>{P.set(e,0)}),M.forEach(e=>{P.set(e.key,e.value)});let F=new Set([`true`,`false`,`null`]),I=Array.from(P.keys()),z=l===`toggle`&&(I.length>0&&I.every(e=>F.has(e))||I.length===0&&N.length>0);if(z&&P.has(`null`)){let e=P.get(`null`)??0,t=P.get(`false`)??0;P.set(`false`,t+e),P.delete(`null`)}if(l===`toggle`&&!z)return(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,children:(0,u.jsx)(`div`,{className:R.count,children:(0,u.jsx)(d.ToggleSwitch,{label:t,checked:!1,onChange:()=>{},disabled:!0})})});if(z){let n=P.get(`true`),r=typeof n==`number`?n:null,i=N.includes(`true`),a=r===0&&!i,o=m&&(r??0)>0?`${r}`:``;return(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,children:(0,u.jsxs)(`div`,{className:R.count,children:[(0,u.jsx)(d.ToggleSwitch,{label:t,checked:i,onChange:()=>T(e,`true`),disabled:a}),` `,o]})})}let B=Array.from(P.entries());if(h||(B=B.filter(([e])=>e!==`null`)),B.length===0&&!n)return null;if(!r)if(i===`alphabetical`){let e=B.filter(([,e])=>typeof e==`number`&&e>0).sort(([e],[t])=>e.localeCompare(t)),t=B.filter(([,e])=>e===0||e===null).sort(([e],[t])=>e.localeCompare(t));B=[...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=B.filter(([,e])=>typeof e==`number`&&e>0).sort(([t],[n])=>e(t,n)),n=B.filter(([,e])=>e===0||e===null).sort(([t],[n])=>e(t,n));B=[...t,...n]}else{let e=B.filter(([,e])=>typeof e==`number`&&e>0),t=B.filter(([,e])=>e===0||e===null);B=[...e,...t]}let V=typeof a==`number`&&B.length>a,H=V?B.slice(0,A):B,U=(t,n)=>{let r=N.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:R.count,children:[(0,u.jsx)(d.Button,{variant:r?`primary`:`secondary`,onClick:()=>T(e,t),disabled:i,size:`micro`,className:R.chip,title:t,children:(0,u.jsx)(`span`,{className:R.chipLabel,children:t})}),(0,u.jsx)(`span`,{className:R.countValue,children:o})]}):(0,u.jsx)(d.Button,{variant:r?`primary`:`secondary`,onClick:()=>T(e,t),disabled:i,size:`micro`,className:R.chip,title:`${t}${a}`,children:(0,u.jsx)(`span`,{className:R.chipLabel,children:`${t}${a}`})});case`toggle`:return(0,u.jsx)(d.ToggleSwitch,{label:t,checked:r,onChange:()=>T(e,t),disabled:i});default:return f===`list`?(0,u.jsxs)(`div`,{className:R.count,children:[(0,u.jsx)(d.Checkbox,{label:t,score:``,checked:r,onChange:()=>T(e,t),disabled:i}),(0,u.jsx)(`span`,{children:o})]}):(0,u.jsx)(d.Checkbox,{label:t,score:a,checked:r,onChange:()=>T(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`?R.grid:R.list,style:{listStyle:`none`,padding:0,margin:0},children:[H.map(([e,t])=>(0,u.jsx)(`li`,{children:U(e,t)},e)),V&&A<B.length&&(()=>{let e=B.length-A,t=Math.min(50,e);return(0,u.jsx)(`li`,{className:R.toggleItem,children:(0,u.jsx)(d.Button,{variant:`ghost`,size:`micro`,onClick:()=>j(e=>e+50),children:`Show ${t} more of ${B.length} total`})})})()]})})},B={disabledMessage:`_disabledMessage_uci6n_1`,histogram:`_histogram_uci6n_6`,histogramBar:`_histogramBar_uci6n_15`};function V(e){if(!Number.isFinite(e))return 0;let t=String(e),n=t.indexOf(`.`);return n===-1?0:Math.min(6,t.length-n-1)}function H(e,t,n){let r=t+Math.round((e-t)/n)*n;return Number(r.toFixed(V(n)))}var U=({field:e,label:t,expectedMin:n=0,expectedMax:r=1e3,displayType:i=`input`,collapsible:a=!0,startCollapsed:o=!1,showHistogram:s=!1,resolution:l,step:f})=>{let{state:{rangeFilters:p,rangeBounds:m,facetStats:h,facets:g,filterableFields:_,facetableFields:v,query:y,facetDebounceDelayMillis:b},setRangeFilter:x,resetRangeFilter:C,allowEmptySearch:w,isFetchingInitial:T}=S(),E=m?.[e]!==void 0,D=m?.[e]??{min:n,max:r},O=D.min,k=D.max,A=h?.[e]??D,j=Math.max(O,Math.min(k,A.min)),M=Math.max(O,Math.min(k,A.max)),N=c.default.useMemo(()=>{if(f)return f;let t=Math.max(V(O),V(k)),n=g?.[e];if(Array.isArray(n))for(let e of n)t=Math.max(t,V(Number(e.key)));return t===0?1:Number((10**-t).toFixed(t))},[f,O,k,g,e]),P=E&&O===k,F=P?n:O,I=P?r:k,R=p?.[e],z=R?R.min:O,U=R?R.max:k,W=R!==void 0,ee=j!==O||M!==k,[G,K]=c.default.useState([z,U]),[te,q]=c.default.useState(!1),[ne,re]=c.default.useState(!1),[J,Y]=c.default.useState(String(z)),[X,Z]=c.default.useState(String(U));c.default.useEffect(()=>{Y(String(G[0])),Z(String(G[1]))},[G]);let{finalMin:Q,finalMax:$,isValidMin:ie,isValidMax:ae}=c.default.useMemo(()=>{let[e,t]=G,n=Math.max(O,Math.min(k,e)),r=Math.max(O,Math.min(k,t)),i=Math.min(n,r),a=Math.max(n,r);return{finalMin:i,finalMax:a,isValidMin:i>=O&&i<a,isValidMax:a<=k&&a>i}},[G,O,k]);c.default.useEffect(()=>{if(P)return;if(G[0]===O&&G[1]===k){q(!1),re(!1);return}let t=b??500,n=setTimeout(()=>{q(!ie),re(!ae)},300),r=setTimeout(()=>{ie&&ae&&(Q===O&&$===k?C(e,!1):x(e,Q,$))},t);return()=>{clearTimeout(n),clearTimeout(r)}},[Q,$,ie,ae,O,k,e,C,x,b,P]),c.default.useEffect(()=>{K([z,U]),q(!1),re(!1)},[z,U,e]);let oe=c.default.useCallback(e=>{P||K([Math.max(O,Math.min(M,e[0])),Math.max(j,Math.min(k,e[1]))])},[P,O,k,j,M]),se=c.default.useCallback(t=>{if(P)return;let n=Math.max(O,Math.min(M,t[0])),r=Math.max(j,Math.min(k,t[1]));n===O&&r===k?(K([O,k]),C(e,!0)):K([n,r])},[P,O,k,j,M,e,C]),ce=c.default.useCallback(()=>{if(P)return;let e=J.trim(),t=e===``?NaN:Number(e);if(isNaN(t)){Y(String(G[0]));return}let n=Math.max(O,Math.min(M,t));n<G[1]?K([n,G[1]]):K([O,G[1]]),Y(String(n<G[1]?n:O))},[P,J,G,O,M]),le=c.default.useCallback(()=>{if(P)return;let e=X.trim(),t=e===``?NaN:Number(e);if(isNaN(t)){Z(String(G[1]));return}let n=Math.max(j,Math.min(k,t));n>G[0]?K([G[0],n]):K([G[0],k]),Z(String(n>G[0]?n:k))},[P,X,G,j,k]),ue=e=>t=>{t.key===`Enter`&&e()},[de,fe]=c.default.useState(null),pe=c.default.useRef(null);c.default.useEffect(()=>{if(!s)return;let t=`${O}:${k}`;if(t===pe.current&&pe.current!==null)return;let n=g?.[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&&(pe.current=t,fe(r))},[O,k,g,e,s]);let me=c.default.useMemo(()=>{if(!s||!de||de.length===0)return[];let e=k-O;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=O+n*t,i=O+(n+1)*t;return{bucketStart:r,bucketEnd:i,count:de.filter(e=>{let t=Number(e.key);return t>=r&&t<i}).reduce((e,t)=>e+t.value,0)}})},[s,de,O,k,l]),he=c.default.useMemo(()=>Math.max(...me.map(e=>e.count),1),[me]);return s&&!T&&!v?.includes(e)&&console.warn(`RangeFilterPanel: showHistogram=true but field "${e}" is not facetable. Add .Facetable = true to this field.`),T?(0,u.jsx)(L,{title:t,variant:`slider`,collapsible:a,startCollapsed:o}):!w&&!y?null:_?.includes(e)?i===`slider`?(0,u.jsxs)(d.FilterPanelBase,{title:t,collapsed:o,collapsible:a,children:[P&&(0,u.jsxs)(`div`,{className:B.disabledMessage,children:[`No adjustable range (all results have the same value: `,O,`).`]}),s&&me.length>0&&(0,u.jsx)(`div`,{className:B.histogram,children:(()=>{let e=typeof j==`number`&&typeof M==`number`&&M>j&&(j>O||M<k);return me.map((t,n)=>{let r=Math.max(1,Math.ceil(t.count/he*20)),i=e?t.bucketEnd>j&&t.bucketStart<M:t.bucketEnd>Q&&t.bucketStart<$;return(0,u.jsx)(`div`,{className:B.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:F,max:I,step:N,value:P?[F,I]:[H(Q,F,N),H($,F,N)],isRange:!0,onChange:e=>oe(e),onFinalChange:e=>se(e),disabled:P,activeMin:j,activeMax:M,isFaceted:ee,highlightFaceted:W,"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:P?String(O):J,min:O,max:Math.min(M,G[1]-1),onChange:e=>Y(e.target.value),onBlur:ce,onKeyDown:ue(ce),disabled:P,isValid:P||!te}),(0,u.jsx)(d.InputField,{label:`Max:`,type:`number`,value:P?String(k):X,min:Math.max(j,G[0]+1),max:k,onChange:e=>Z(e.target.value),onBlur:le,onKeyDown:ue(le),disabled:P,isValid:P||!ne})]})]}):(0,u.jsxs)(d.FilterPanelBase,{title:t,children:[P&&(0,u.jsxs)(`div`,{className:B.disabledMessage,children:[`No adjustable range (all results have the same value: `,O,`).`]}),(0,u.jsxs)(`div`,{style:{display:`flex`,gap:`10px`,alignItems:`flex-start`},children:[(0,u.jsx)(d.InputField,{label:`Min:`,type:`number`,value:P?String(O):J,min:O,max:Math.min(M,G[1]-1),onChange:e=>Y(e.target.value),onBlur:ce,onKeyDown:ue(ce),disabled:P,isValid:P||!te}),(0,u.jsx)(d.InputField,{label:`Max:`,type:`number`,value:P?String(k):X,min:Math.max(j,G[0]+1),max:k,onChange:e=>Z(e.target.value),onBlur:le,onKeyDown:ue(le),disabled:P,isValid:P||!ne})]})]}):(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,children:(0,u.jsxs)(`div`,{style:{color:`red`,fontSize:`12px`},children:[`Cannot render filter for "`,e,`": missing filterable.`]})})},W={grid:`_grid_xm2uh_2`,chip:`_chip_xm2uh_17`,chipLabel:`_chipLabel_xm2uh_28`},ee=(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:W.chip,title:`${e}: ${t}`,children:(0,u.jsxs)(`span`,{className:W.chipLabel,children:[e,`: `,t]})})})),G=(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:W.chip,title:`${e}: ${t} – ${n}`,children:(0,u.jsxs)(`span`,{className:W.chipLabel,children:[e,`: `,t,` – `,n]})})}));function K(){let{state:{filters:e,rangeFilters:t},resetFilters:n,resetSingleFilter:r,resetRangeFilter:i}=S(),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:W.grid,children:[a.map(({field:e,value:t})=>(0,u.jsx)(ee,{field:e,value:t,onReset:()=>r(e,t)},`${e}-${t}`)),o.map(({field:e,min:t,max:n})=>(0,u.jsx)(G,{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 te={select:`_select_nwf7i_1`,radioGroup:`_radioGroup_nwf7i_6`},q=({displayType:e=`dropdown`,collapsible:t=!0,startCollapsed:n=!1})=>{let{state:{sortableFields:r,sortBy:i,sortAscending:a},setSort:o,isFetchingInitial:s}=S();if(s)return(0,u.jsx)(L,{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:te.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))})})},ne={list:`_list_1y4fk_1`};function re(){let{state:{searchSettings:e},setSearchSettings:t}=S(),[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:ne.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:1,value:Math.max(0,Math.min(65535,Math.round(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 J=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)(d.Button,{variant:`primary`,size:`micro`,onClick:this.reset,children:`Try Again`})]}):this.props.children}};function Y(e,t){let{url:n,team:r,dataset:i,authenticatedFetch:a}=S(),[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 await m.fromResponse(`VectorSearch`,u);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 await m.fromResponse(`GetJson`,p);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 X(e,t){let{url:n,team:r,dataset:i,authenticatedFetch:a}=S(),[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 await m.fromResponse(`HybridSearch`,u);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 await m.fromResponse(`GetJson`,p);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=K,exports.FilterPanelSkeleton=L,exports.IndxApiError=m,exports.RangeFilterPanel=U,exports.SearchContext=b,exports.SearchErrorBoundary=J,exports.SearchInput=C,exports.SearchProvider=x,exports.SearchResult=E,exports.SearchResultRow=P,exports.SearchResults=M,exports.SearchResultsSkeleton=k,exports.SearchSettingsPanel=re,exports.SortByPanel=q,exports.ValueFilterPanel=z,exports.useHybridSearch=X,exports.useSearch=S,exports.useSearchContext=S,exports.useVectorSearch=Y;
|
|
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 Indx Dashboard)`),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 Indx Dashboard`),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),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 d=u.documentCount??u.numberOfRecords??0;d===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`,d,`records`);let[p,h,_]=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(!p.ok)throw console.error(`[Auth] ❌ GetFilterableFields failed:`,p.status,await p.text()),Error(`Failed to get filterable fields. Check console for details.`);if(!h.ok)throw console.error(`[Auth] ❌ GetFacetableFields failed:`,h.status,await h.text()),Error(`Failed to get facetable fields. Check console for details.`);if(!_.ok)throw console.error(`[Auth] ❌ GetSortableFields failed:`,_.status,await _.text()),Error(`Failed to get sortable fields. Check console for details.`);let[y,x,C]=await Promise.all([p.json().catch(e=>(console.error(`Failed to parse GetFilterableFields response:`,e),[])),h.json().catch(e=>(console.error(`Failed to parse GetFacetableFields response:`,e),[])),_.json().catch(e=>(console.error(`Failed to parse GetSortableFields response:`,e),[]))]);f(y||[]),m(x||[]),g(C||[]),S(d);let w={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?w=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 T={};if(w.facets){for(let[e,t]of Object.entries(w.facets))if(Array.isArray(t)&&t.length>0){let n=t.map(e=>Number(e.key)).filter(e=>!isNaN(e));n.length>0&&(T[e]={min:Math.min(...n),max:Math.max(...n)})}}let E={};if(w.facets)for(let[e,t]of Object.entries(w.facets))Array.isArray(t)&&(E[e]=t.map(e=>e.key));v(T),b(E),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}}var m=class e extends Error{status;code;problem;retryAfterSeconds;constructor(e,t,n,r){let i=n?.detail??n?.title;super(`${e} failed: HTTP ${t}${i?` — ${i}`:``}`),this.name=`IndxApiError`,this.status=t,this.code=n?.code,this.problem=n,this.retryAfterSeconds=r}get retryable(){return this.code===`invalidState`&&this.problem?.retryable===!0}static async fromResponse(t,n){let r;try{let e=await n.json();e&&typeof e==`object`&&typeof e.code==`string`?r=e:e&&typeof e==`object`&&(r={...e,code:``})}catch{}let i=n.headers?.get?.(`Retry-After`),a=i!=null&&/^\d+$/.test(i)?Number(i):void 0;return new e(t,n.status,r,a)}};async function h(e,t,n,r,i,a,o){let s=await o(`${r}/api/teams/${i}/datasets/${a}/filters/${e}`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});if(!s.ok)throw await m.fromResponse(n,s);let c=await s.json();if(!c||typeof c.hashString!=`string`)throw Error(`${n} failed: server returned no filter token`);return c}async function g(e,t,n,r,i,a){if(e.length===0)return null;if(e.length===1)return e[0];let o=e[0];for(let s=1;s<e.length;s++)o=await h(`combine`,{a:o,b:e[s],useAndOperation:t===`and`},`CombineFilters`,n,r,i,a);return o}async function _(e,t,n,r,i,a,o={}){let s=Object.entries(e??{}).filter(([,e])=>e.length>0),c=Object.entries(t??{}),[l,u]=await Promise.all([Promise.all(s.map(async([e,t])=>g(await Promise.all(t.map(t=>h(`value`,{fieldName:e,value:t},`Value filter '${e}'`,n,r,i,a))),o[e]===`any`?`or`:`and`,n,r,i,a))),Promise.all(c.map(([e,{min:t,max:o}])=>h(`range`,{fieldName:e,lowerLimit:t,upperLimit:o},`Range filter '${e}'`,n,r,i,a)))]);return g([...l,...u],`and`,n,r,i,a)}function v(e,t){let n,r=(...r)=>{clearTimeout(n),n=setTimeout(()=>e(...r),t)};return r.cancel=()=>clearTimeout(n),r}function y({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),h=(0,c.useRef)(void 0),g=(0,c.useRef)(!1),[y,b]=(0,c.useState)({}),[x,S]=(0,c.useState)(``),[C,w]=(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 T=e.searchSettings.maxNumberOfRecordsToReturn,E=e.searchSettings.enableCoverage,D=e.searchSettings.removeDuplicates,O=e.searchSettings.coverageDepth,k=e.searchSettings.minimumScore,A=e.searchSettings.coverageSetup,j=e.sortBy,M=e.sortAscending,N=(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 _(e.filters,e.rangeFilters,i,a,o,n,e.valueMatch),f=s||e.query.trim()!==``,h={text:e.query,maxNumberOfRecordsToReturn:f?T:0,enableFacets:c,...d?{filter:d}:{},...j?{sortBy:j}:{},...M===void 0?{}:{sortAscending:M},enableCoverage:E,removeDuplicates:D,coverageDepth:O,coverageSetup:A};u&&console.log(`[performSearch] request body:`,JSON.stringify(h,null,2));let g=await n(`${i}/api/teams/${a}/datasets/${o}/search`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(h)});if(!g.ok)throw await m.fromResponse(`Search`,g);let v=await g.json(),N=v.truncationIndex??-1,P=v.records||[],F=P.map(e=>e.documentKey),I=P.map(e=>e.score),L=[];if(f&&F.length>0){let e=await n(`${i}/api/teams/${a}/datasets/${o}/documents/lookup`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(F)});if(!e.ok)throw await m.fromResponse(`Document lookup`,e);L=(await e.json()).map((e,t)=>({document:e,documentKey:F[t],score:I[t]}))}let R={};if(c&&v.facets){for(let[e,t]of Object.entries(v.facets))if(Array.isArray(t)&&t.length>0){let n=t.map(e=>Number(e.key)).filter(e=>!isNaN(e));n.length>0&&(R[e]={min:Math.min(...n),max:Math.max(...n)})}}if(l!==p.current)return;let z=e.query!==x,B=e.query!==C,V=e.facetStats??{};if(z?(V={...r.initialFacetStats,...R},b(V),S(e.query)):V={...y,...R},B&&c){let n={...e.rangeBounds};for(let[e,t]of Object.entries(R))n[e]=t;t(e=>({...e,rangeBounds:n})),w(e.query)}let H=v.facets;if(c&&(!H||Object.keys(H).length===0)){H={};for(let[e,t]of Object.entries(r.initialFacetKeys))H[e]=t.map(e=>({key:e,value:null}))}let U=L.filter(t=>{let n=e.query.trim();return n===``||n.length===1?!0:t.score>=k});t(e=>({...e,results:U,error:void 0,resultsSuppressed:!f,...c?{facets:H,facetStats:V}:{},isLoading:!1,truncationIndex:N}))}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 Indx Dashboard.`)):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.valueMatch,e.rangeFilters,e.facetStats,j,M,T,E,D,O,A,k,n,r.initialFacetStats,r.initialFacetKeys,r.token,y,x,C,e.rangeBounds,i,a,o,s,u,t]);(0,c.useEffect)(()=>{h.current=N},[N]);let P=(0,c.useRef)(null);(0,c.useEffect)(()=>(P.current?.cancel(),P.current=v(()=>{u&&console.log(`Debounced searchWithFacets fired`),h.current?.({enableFacets:!0})},e.facetDebounceDelayMillis??500),()=>{P.current?.cancel()}),[e.facetDebounceDelayMillis]),(0,c.useEffect)(()=>{!r.isFetchingInitial&&r.token&&!g.current&&(s&&h.current?.({enableFacets:l}),g.current=!0)},[r.isFetchingInitial,r.token,s,l]),(0,c.useEffect)(()=>{if(!r.token||!g.current)return;let n=e.query.trim(),i=n===``&&s;if(n===``&&!s){e.resultsSuppressed||t(e=>({...e,resultsSuppressed:!0}));return}return i?(P.current?.cancel(),h.current?.({enableFacets:l})):l?(u&&console.log(`Search fired`),h.current?.({enableFacets:!1}),P.current?.()):h.current?.({enableFacets:!1}),()=>{P.current?.cancel()}},[e.query,s,l]),(0,c.useEffect)(()=>{let t=d.current;if(d.current=!1,!g.current||!r.token||!t)return;let n=e.query.trim();!s&&n===``||h.current?.({enableFacets:l})},[e.filters,e.rangeFilters]),(0,c.useEffect)(()=>{if(!g.current||!r.token)return;let t=e.query.trim();!s&&t===``||h.current?.({enableFacets:l})},[j,M]);let F=(0,c.useRef)(!0),I=(0,c.useRef)(e.query);(0,c.useEffect)(()=>{if(F.current){F.current=!1;return}if(I.current!==e.query||!g.current||!r.token)return;if(f.current){f.current=!1,h.current?.({enableFacets:!1});return}let t=e.query.trim();!s&&t===``||h.current?.({enableFacets:l})},[T,E,D,O,A,k]),(0,c.useEffect)(()=>{I.current=e.query},[e.query])}var b=(0,c.createContext)(void 0),x=({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 _=(0,c.useRef)(!1),v=(0,c.useRef)(!1),x=(0,c.useRef)(a),[S,C]=(0,c.useState)({query:``,results:null,isLoading:!1,resultsSuppressed:!i,facetDebounceDelayMillis:o,filterableFields:[],facetableFields:[],sortableFields:[],filters:{},valueMatch:{},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)(()=>{C(e=>({...e,facetDebounceDelayMillis:o}))},[o]);let[w]=(0,c.useState)(s),T=p({url:t,team:n,dataset:r,preAuthenticatedToken:g,enableDebugLogs:h}),E=(0,c.useCallback)((e,t={})=>{if(!T.token)throw Error(`No authentication token available`);return fetch(e,{...t,headers:{...t.headers,Authorization:`Bearer ${T.token}`}})},[T.token]);y({state:S,setState:C,authenticatedFetch:E,auth:T,url:t,team:n,dataset:r,allowEmptySearch:i,facetsEnabled:w,enableDebugLogs:h,filtersChangedByUser:_,shouldFetchMore:v});let D=(0,c.useCallback)(e=>{_.current=!1,C(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:x.current}}})},[]),O=(0,c.useCallback)(e=>{C(t=>({...t,facetDebounceDelayMillis:e}))},[]),k=(0,c.useCallback)(e=>{typeof e.maxNumberOfRecordsToReturn==`number`&&(x.current=e.maxNumberOfRecordsToReturn),C(t=>{let n={...t.searchSettings,...e};return e.coverageSetup?n.coverageSetup={...t.searchSettings.coverageSetup,...e.coverageSetup}:n.coverageSetup=t.searchSettings.coverageSetup,{...t,searchSettings:n}})},[]),A=(0,c.useCallback)(e=>{v.current=!0,C(t=>({...t,searchSettings:{...t.searchSettings,maxNumberOfRecordsToReturn:e}}))},[]),j=(0,c.useCallback)((e,t)=>{_.current=!0,C(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}})},[]),M=(0,c.useCallback)((e,t)=>{C(n=>n.valueMatch[e]===t?n:{...n,valueMatch:{...n.valueMatch,[e]:t}})},[]),N=(0,c.useCallback)((e,t,n)=>{_.current=!0,C(r=>({...r,rangeFilters:{...r.rangeFilters,[e]:{min:t,max:n}}}))},[]),P=(0,c.useCallback)(()=>{_.current=!0,C(e=>({...e,filters:{},rangeFilters:{}}))},[]),F=(0,c.useCallback)((e,t,n=!0)=>{n&&(_.current=!0),C(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}})},[]),I=(0,c.useCallback)((e,t=!0)=>{t&&(_.current=!0),C(t=>{let n={...t.rangeFilters};return delete n[e],{...t,rangeFilters:n}})},[]),L=(0,c.useCallback)((e,t)=>{C(n=>({...n,sortBy:e||void 0,sortAscending:e?t:void 0}))},[]);return(0,u.jsx)(b.Provider,{value:{state:S,isFetchingInitial:T.isFetchingInitial,authError:T.authError??void 0,allowEmptySearch:i,url:t,team:n,dataset:r,authenticatedFetch:E,setQuery:D,toggleFilter:j,setValueMatch:M,setRangeFilter:N,resetFilters:P,resetSingleFilter:F,resetRangeFilter:I,setSort:L,setDebounceDelay:O,setSearchSettings:k,fetchMoreResults:A},children:e})},S=()=>{let e=(0,c.useContext)(b);if(!e)throw Error(`useSearchContext must be used within a SearchProvider`);return e},C=({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}=S();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`})})},w={placeholder:`_placeholder_ee9qi_1`,invalid:`_invalid_ee9qi_11`},T={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`},E=({skeleton:e=!1,index:t,score:n,showScore:r=!1,children:i,skeletonDelay:a=0,skeletonWidths:o=[62,38]})=>(0,u.jsxs)(`div`,{className:T.row,children:[t!==void 0&&(0,u.jsx)(`div`,{className:T.indexNumber,children:t}),(0,u.jsx)(`div`,{className:T.content,children:e?(0,u.jsxs)(`div`,{className:T.skeletonBars,children:[(0,u.jsx)(`div`,{className:T.skeletonBarLg,style:{width:`${o[0]}%`,animationDelay:`${a}s`}}),(0,u.jsx)(`div`,{className:T.skeletonBarSm,style:{width:`${o[1]}%`,animationDelay:`${a+.05}s`}})]}):i}),r&&n!==void 0&&(0,u.jsx)(`div`,{className:T.scoreNumber,children:n})]}),D={wrapper:`_wrapper_81m3c_6`,skeletonAppear:`_skeletonAppear_81m3c_1`},O=[[62,38],[75,45],[58,33],[70,42],[65,50],[55,35],[72,40],[60,30]],k=({rows:e=6})=>(0,u.jsx)(`div`,{className:D.wrapper,children:Array.from({length:e}).map((e,t)=>(0,u.jsx)(E,{skeleton:!0,skeletonDelay:t*.1,skeletonWidths:O[t%O.length]},t))}),A=/^\[\s*(?:'[^']*'(?:\s*,\s*'[^']*')*)?\s*\]$/;function j(e){let t=e.trim();if(!t.startsWith(`[`)||!t.endsWith(`]`))return;try{let e=JSON.parse(t);if(Array.isArray(e))return e.map(e=>String(e))}catch{}if(!A.test(t))return;let n=[],r=/'([^']*)'/g,i;for(;(i=r.exec(t))!==null;)n.push(i[1]);return n}var M=({fields:e,resultsPerPage:t,parseArrayStrings:n=!1,children:r})=>{let{state:{results:i,resultsSuppressed:a,searchSettings:o,truncationIndex:s,query:l,error:p},isFetchingInitial:m,authError:h,allowEmptySearch:g,fetchMoreResults:_}=S(),v=t??30,[y,b]=(0,c.useState)(v),x=(0,c.useRef)(0),C=(0,c.useRef)(``);(0,c.useEffect)(()=>{let e=l!==C.current;(!i||i.length<x.current||e)&&b(v),x.current=i?.length??0,C.current=l},[i,v,l]);let T=i&&i.length>y,D=()=>{let e=y+v;b(e),i&&e>=i.length&&(!s||s===-1||s>i.length)&&_(i.length+v)};if(m)return g?(0,u.jsx)(k,{rows:v}):(0,u.jsx)(`div`,{className:w.placeholder,children:(0,u.jsx)(f.Indx,{size:200,color:`var(--lv5)`})});let O=h??p;return O?(0,u.jsx)(`div`,{className:w.invalid,role:`alert`,children:(0,u.jsx)(`p`,{children:O})}):a||i===null?(0,u.jsx)(`div`,{className:w.placeholder,children:(0,u.jsx)(f.Indx,{size:200,color:`var(--lv5)`})}):i.length===0?(0,u.jsx)(`div`,{className:w.invalid,children:(0,u.jsx)(`p`,{children:`No results found.`})}):(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(`div`,{children:(i??[]).slice(0,y).map((t,i)=>{let a=t.document,s=t.score,c;try{c=typeof a==`string`?JSON.parse(a):a}catch{return(0,u.jsx)(`div`,{className:w.invalid,children:(0,u.jsx)(`p`,{children:`Invalid JSON`})},i)}let l;if(e&&e.length>0){l={};for(let t of e)t in c&&(l[t]=c[t])}else l={...c};if(n)for(let e in l){let t=l[e];if(typeof t==`string`){let n=j(t);n&&(l[e]=n)}}return(0,u.jsx)(E,{index:i,score:s,showScore:o.showScore,children:r(l)},i)})}),T&&(0,u.jsx)(`div`,{style:{textAlign:`center`,marginTop:`20px`},children:(0,u.jsx)(d.Button,{variant:`secondary`,size:`micro`,onClick:D,children:l.trim()===``?`Load more`:s!==-1&&s!==void 0&&s>0?`Load results ${y+1}-${Math.min(y+v,i.length,s)} of ${s}`:`Load more`})})]})},N={row:`_row_ujwhc_1`,title:`_title_ujwhc_8`},P=({variant:e=`default`,children:t})=>(0,u.jsx)(`div`,{className:[N.row,e===`title`?N.title:``].filter(Boolean).join(` `),children:t}),F={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`},I=[65,80,55,72,60,75,50,68],L=({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:F.sliderArea,children:[(0,u.jsx)(`div`,{className:F.sliderTrack}),(0,u.jsxs)(`div`,{className:F.inputRow,children:[(0,u.jsx)(`div`,{className:F.inputBar,style:{animationDelay:`0.1s`}}),(0,u.jsx)(`div`,{className:F.inputBar,style:{animationDelay:`0.15s`}})]})]}):(0,u.jsx)(`div`,{className:F.listRows,children:Array.from({length:t}).map((e,t)=>(0,u.jsx)(`div`,{className:F.bar,style:{width:`${I[t%I.length]}%`,animationDelay:`${t*.05}s`}},t))})}),R={list:`_list_m82u6_2`,count:`_count_m82u6_7`,countValue:`_countValue_m82u6_17`,chip:`_chip_m82u6_22`,chipLabel:`_chipLabel_m82u6_32`,grid:`_grid_m82u6_40`},z=({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,match:g=`all`,displayIfEmptyQuery:_=!0,displayCondition:v=e=>!0})=>{let{state:{facets:y,filterableFields:b,facetableFields:x,filters:C,query:w},toggleFilter:T,setValueMatch:E,isFetchingInitial:D,allowEmptySearch:O}=S();(0,c.useEffect)(()=>{E(e,g)},[e,g,E]);let k=(0,c.useRef)(null),[A,j]=(0,c.useState)(a);if((0,c.useEffect)(()=>{j(a)},[y?.[e],a]),!O&&!w)return null;if(D||!y)return l===`toggle`?(0,u.jsx)(L,{rows:1,collapsible:!1}):(0,u.jsx)(L,{title:t,rows:Math.min(a,6),collapsible:o,startCollapsed:s});if(!v({query:w??``,filters:C,facets:y})||!_&&!w&&Object.keys(C).length<1)return null;if(!b?.includes(e)||!x?.includes(e)){let t=[];return b?.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 M=y?.[e]??(l===`toggle`?[]:void 0);if(!M||!Array.isArray(M))return null;let N=C?.[e]??[];n&&!k.current&&M.length>0&&(k.current=M.reduce((e,t)=>(e[t.key]=t.value,e),{}));let P=new Map;n&&k.current&&Object.keys(k.current).forEach(e=>{P.set(e,0)}),M.forEach(e=>{P.set(e.key,e.value)});let F=new Set([`true`,`false`,`null`]),I=Array.from(P.keys()),z=l===`toggle`&&(I.length>0&&I.every(e=>F.has(e))||I.length===0&&N.length>0);if(z&&P.has(`null`)){let e=P.get(`null`)??0,t=P.get(`false`)??0;P.set(`false`,t+e),P.delete(`null`)}if(l===`toggle`&&!z)return(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,children:(0,u.jsx)(`div`,{className:R.count,children:(0,u.jsx)(d.ToggleSwitch,{label:t,checked:!1,onChange:()=>{},disabled:!0})})});if(z){let n=P.get(`true`),r=typeof n==`number`?n:null,i=N.includes(`true`),a=r===0&&!i,o=m&&(r??0)>0?`${r}`:``;return(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,children:(0,u.jsxs)(`div`,{className:R.count,children:[(0,u.jsx)(d.ToggleSwitch,{label:t,checked:i,onChange:()=>T(e,`true`),disabled:a}),` `,o]})})}let B=Array.from(P.entries());if(h||(B=B.filter(([e])=>e!==`null`)),B.length===0&&!n)return null;if(!r)if(i===`alphabetical`){let e=B.filter(([,e])=>typeof e==`number`&&e>0).sort(([e],[t])=>e.localeCompare(t)),t=B.filter(([,e])=>e===0||e===null).sort(([e],[t])=>e.localeCompare(t));B=[...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=B.filter(([,e])=>typeof e==`number`&&e>0).sort(([t],[n])=>e(t,n)),n=B.filter(([,e])=>e===0||e===null).sort(([t],[n])=>e(t,n));B=[...t,...n]}else{let e=B.filter(([,e])=>typeof e==`number`&&e>0),t=B.filter(([,e])=>e===0||e===null);B=[...e,...t]}let V=typeof a==`number`&&B.length>a,H=V?B.slice(0,A):B,U=(t,n)=>{let r=N.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:R.count,children:[(0,u.jsx)(d.Button,{variant:r?`primary`:`secondary`,onClick:()=>T(e,t),disabled:i,size:`micro`,className:R.chip,title:t,children:(0,u.jsx)(`span`,{className:R.chipLabel,children:t})}),(0,u.jsx)(`span`,{className:R.countValue,children:o})]}):(0,u.jsx)(d.Button,{variant:r?`primary`:`secondary`,onClick:()=>T(e,t),disabled:i,size:`micro`,className:R.chip,title:`${t}${a}`,children:(0,u.jsx)(`span`,{className:R.chipLabel,children:`${t}${a}`})});case`toggle`:return(0,u.jsx)(d.ToggleSwitch,{label:t,checked:r,onChange:()=>T(e,t),disabled:i});default:return f===`list`?(0,u.jsxs)(`div`,{className:R.count,children:[(0,u.jsx)(d.Checkbox,{label:t,score:``,checked:r,onChange:()=>T(e,t),disabled:i}),(0,u.jsx)(`span`,{children:o})]}):(0,u.jsx)(d.Checkbox,{label:t,score:a,checked:r,onChange:()=>T(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`?R.grid:R.list,style:{listStyle:`none`,padding:0,margin:0},children:[H.map(([e,t])=>(0,u.jsx)(`li`,{children:U(e,t)},e)),V&&A<B.length&&(()=>{let e=B.length-A,t=Math.min(50,e);return(0,u.jsx)(`li`,{className:R.toggleItem,children:(0,u.jsx)(d.Button,{variant:`ghost`,size:`micro`,onClick:()=>j(e=>e+50),children:`Show ${t} more of ${B.length} total`})})})()]})})},B={disabledMessage:`_disabledMessage_uci6n_1`,histogram:`_histogram_uci6n_6`,histogramBar:`_histogramBar_uci6n_15`};function V(e){if(!Number.isFinite(e))return 0;let t=String(e),n=t.indexOf(`.`);return n===-1?0:Math.min(6,t.length-n-1)}function H(e,t,n){let r=t+Math.round((e-t)/n)*n;return Number(r.toFixed(V(n)))}var U=({field:e,label:t,expectedMin:n=0,expectedMax:r=1e3,displayType:i=`input`,collapsible:a=!0,startCollapsed:o=!1,showHistogram:s=!1,resolution:l,step:f})=>{let{state:{rangeFilters:p,rangeBounds:m,facetStats:h,facets:g,filterableFields:_,facetableFields:v,query:y,facetDebounceDelayMillis:b},setRangeFilter:x,resetRangeFilter:C,allowEmptySearch:w,isFetchingInitial:T}=S(),E=m?.[e]!==void 0,D=m?.[e]??{min:n,max:r},O=D.min,k=D.max,A=h?.[e]??D,j=Math.max(O,Math.min(k,A.min)),M=Math.max(O,Math.min(k,A.max)),N=c.default.useMemo(()=>{if(f)return f;let t=Math.max(V(O),V(k)),n=g?.[e];if(Array.isArray(n))for(let e of n)t=Math.max(t,V(Number(e.key)));return t===0?1:Number((10**-t).toFixed(t))},[f,O,k,g,e]),P=E&&O===k,F=P?n:O,I=P?r:k,R=p?.[e],z=R?R.min:O,U=R?R.max:k,W=R!==void 0,ee=j!==O||M!==k,[G,K]=c.default.useState([z,U]),[te,q]=c.default.useState(!1),[ne,re]=c.default.useState(!1),[J,Y]=c.default.useState(String(z)),[X,Z]=c.default.useState(String(U));c.default.useEffect(()=>{Y(String(G[0])),Z(String(G[1]))},[G]);let{finalMin:Q,finalMax:$,isValidMin:ie,isValidMax:ae}=c.default.useMemo(()=>{let[e,t]=G,n=Math.max(O,Math.min(k,e)),r=Math.max(O,Math.min(k,t)),i=Math.min(n,r),a=Math.max(n,r);return{finalMin:i,finalMax:a,isValidMin:i>=O&&i<a,isValidMax:a<=k&&a>i}},[G,O,k]);c.default.useEffect(()=>{if(P)return;if(G[0]===O&&G[1]===k){q(!1),re(!1);return}let t=b??500,n=setTimeout(()=>{q(!ie),re(!ae)},300),r=setTimeout(()=>{ie&&ae&&(Q===O&&$===k?C(e,!1):x(e,Q,$))},t);return()=>{clearTimeout(n),clearTimeout(r)}},[Q,$,ie,ae,O,k,e,C,x,b,P]),c.default.useEffect(()=>{K([z,U]),q(!1),re(!1)},[z,U,e]);let oe=c.default.useCallback(e=>{P||K([Math.max(O,Math.min(M,e[0])),Math.max(j,Math.min(k,e[1]))])},[P,O,k,j,M]),se=c.default.useCallback(t=>{if(P)return;let n=Math.max(O,Math.min(M,t[0])),r=Math.max(j,Math.min(k,t[1]));n===O&&r===k?(K([O,k]),C(e,!0)):K([n,r])},[P,O,k,j,M,e,C]),ce=c.default.useCallback(()=>{if(P)return;let e=J.trim(),t=e===``?NaN:Number(e);if(isNaN(t)){Y(String(G[0]));return}let n=Math.max(O,Math.min(M,t));n<G[1]?K([n,G[1]]):K([O,G[1]]),Y(String(n<G[1]?n:O))},[P,J,G,O,M]),le=c.default.useCallback(()=>{if(P)return;let e=X.trim(),t=e===``?NaN:Number(e);if(isNaN(t)){Z(String(G[1]));return}let n=Math.max(j,Math.min(k,t));n>G[0]?K([G[0],n]):K([G[0],k]),Z(String(n>G[0]?n:k))},[P,X,G,j,k]),ue=e=>t=>{t.key===`Enter`&&e()},[de,fe]=c.default.useState(null),pe=c.default.useRef(null);c.default.useEffect(()=>{if(!s)return;let t=`${O}:${k}`;if(t===pe.current&&pe.current!==null)return;let n=g?.[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&&(pe.current=t,fe(r))},[O,k,g,e,s]);let me=c.default.useMemo(()=>{if(!s||!de||de.length===0)return[];let e=k-O;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=O+n*t,i=O+(n+1)*t;return{bucketStart:r,bucketEnd:i,count:de.filter(e=>{let t=Number(e.key);return t>=r&&t<i}).reduce((e,t)=>e+t.value,0)}})},[s,de,O,k,l]),he=c.default.useMemo(()=>Math.max(...me.map(e=>e.count),1),[me]);return s&&!T&&!v?.includes(e)&&console.warn(`RangeFilterPanel: showHistogram=true but field "${e}" is not facetable. Add .Facetable = true to this field.`),T?(0,u.jsx)(L,{title:t,variant:`slider`,collapsible:a,startCollapsed:o}):!w&&!y?null:_?.includes(e)?i===`slider`?(0,u.jsxs)(d.FilterPanelBase,{title:t,collapsed:o,collapsible:a,children:[P&&(0,u.jsxs)(`div`,{className:B.disabledMessage,children:[`No adjustable range (all results have the same value: `,O,`).`]}),s&&me.length>0&&(0,u.jsx)(`div`,{className:B.histogram,children:(()=>{let e=typeof j==`number`&&typeof M==`number`&&M>j&&(j>O||M<k);return me.map((t,n)=>{let r=Math.max(1,Math.ceil(t.count/he*20)),i=e?t.bucketEnd>j&&t.bucketStart<M:t.bucketEnd>Q&&t.bucketStart<$;return(0,u.jsx)(`div`,{className:B.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:F,max:I,step:N,value:P?[F,I]:[H(Q,F,N),H($,F,N)],isRange:!0,onChange:e=>oe(e),onFinalChange:e=>se(e),disabled:P,activeMin:j,activeMax:M,isFaceted:ee,highlightFaceted:W,"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:P?String(O):J,min:O,max:Math.min(M,G[1]-1),onChange:e=>Y(e.target.value),onBlur:ce,onKeyDown:ue(ce),disabled:P,isValid:P||!te}),(0,u.jsx)(d.InputField,{label:`Max:`,type:`number`,value:P?String(k):X,min:Math.max(j,G[0]+1),max:k,onChange:e=>Z(e.target.value),onBlur:le,onKeyDown:ue(le),disabled:P,isValid:P||!ne})]})]}):(0,u.jsxs)(d.FilterPanelBase,{title:t,children:[P&&(0,u.jsxs)(`div`,{className:B.disabledMessage,children:[`No adjustable range (all results have the same value: `,O,`).`]}),(0,u.jsxs)(`div`,{style:{display:`flex`,gap:`10px`,alignItems:`flex-start`},children:[(0,u.jsx)(d.InputField,{label:`Min:`,type:`number`,value:P?String(O):J,min:O,max:Math.min(M,G[1]-1),onChange:e=>Y(e.target.value),onBlur:ce,onKeyDown:ue(ce),disabled:P,isValid:P||!te}),(0,u.jsx)(d.InputField,{label:`Max:`,type:`number`,value:P?String(k):X,min:Math.max(j,G[0]+1),max:k,onChange:e=>Z(e.target.value),onBlur:le,onKeyDown:ue(le),disabled:P,isValid:P||!ne})]})]}):(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,children:(0,u.jsxs)(`div`,{style:{color:`red`,fontSize:`12px`},children:[`Cannot render filter for "`,e,`": missing filterable.`]})})},W={grid:`_grid_xm2uh_2`,chip:`_chip_xm2uh_17`,chipLabel:`_chipLabel_xm2uh_28`},ee=(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:W.chip,title:`${e}: ${t}`,children:(0,u.jsxs)(`span`,{className:W.chipLabel,children:[e,`: `,t]})})})),G=(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:W.chip,title:`${e}: ${t} – ${n}`,children:(0,u.jsxs)(`span`,{className:W.chipLabel,children:[e,`: `,t,` – `,n]})})}));function K(){let{state:{filters:e,rangeFilters:t},resetFilters:n,resetSingleFilter:r,resetRangeFilter:i}=S(),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:W.grid,children:[a.map(({field:e,value:t})=>(0,u.jsx)(ee,{field:e,value:t,onReset:()=>r(e,t)},`${e}-${t}`)),o.map(({field:e,min:t,max:n})=>(0,u.jsx)(G,{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 te={select:`_select_nwf7i_1`,radioGroup:`_radioGroup_nwf7i_6`},q=({displayType:e=`dropdown`,collapsible:t=!0,startCollapsed:n=!1})=>{let{state:{sortableFields:r,sortBy:i,sortAscending:a},setSort:o,isFetchingInitial:s}=S();if(s)return(0,u.jsx)(L,{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:te.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))})})},ne={list:`_list_1y4fk_1`};function re(){let{state:{searchSettings:e},setSearchSettings:t}=S(),[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:ne.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:1,value:Math.max(0,Math.min(65535,Math.round(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 J=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 Indx Dashboard)`}),(0,u.jsx)(`li`,{children:`Ensure INDX server is running`}),(0,u.jsx)(`li`,{children:`Check dataset name spelling`})]})]}),(0,u.jsx)(d.Button,{variant:`primary`,size:`micro`,onClick:this.reset,children:`Try Again`})]}):this.props.children}};function Y(e,t){let{url:n,team:r,dataset:i,authenticatedFetch:a}=S(),[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 await m.fromResponse(`VectorSearch`,u);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 await m.fromResponse(`GetJson`,p);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 X(e,t){let{url:n,team:r,dataset:i,authenticatedFetch:a}=S(),[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 await m.fromResponse(`HybridSearch`,u);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 await m.fromResponse(`GetJson`,p);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=K,exports.FilterPanelSkeleton=L,exports.IndxApiError=m,exports.RangeFilterPanel=U,exports.SearchContext=b,exports.SearchErrorBoundary=J,exports.SearchInput=C,exports.SearchProvider=x,exports.SearchResult=E,exports.SearchResultRow=P,exports.SearchResults=M,exports.SearchResultsSkeleton=k,exports.SearchSettingsPanel=re,exports.SortByPanel=q,exports.ValueFilterPanel=z,exports.useHybridSearch=X,exports.useSearch=S,exports.useSearchContext=S,exports.useVectorSearch=Y;
|
package/dist/index.es.js
CHANGED
|
@@ -11,7 +11,7 @@ function D({ url: e, team: t, dataset: n, preAuthenticatedToken: r, enableDebugL
|
|
|
11
11
|
(async () => {
|
|
12
12
|
T(null);
|
|
13
13
|
try {
|
|
14
|
-
if (!r) throw console.error("[Auth] ❌ Missing bearer token"), console.error("[Auth] 💡 Pass preAuthenticatedToken to SearchProvider (create a token on the
|
|
14
|
+
if (!r) throw console.error("[Auth] ❌ Missing bearer token"), console.error("[Auth] 💡 Pass preAuthenticatedToken to SearchProvider (create a token on the Indx Dashboard)"), Error("A bearer token is required. Check console for instructions.");
|
|
15
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.");
|
|
16
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.");
|
|
17
17
|
i && console.log("[Auth] ✅ Using bearer token");
|
|
@@ -25,7 +25,7 @@ function D({ url: e, team: t, dataset: n, preAuthenticatedToken: r, enableDebugL
|
|
|
25
25
|
i && console.log("[Auth] 🔍 Checking dataset status...");
|
|
26
26
|
let c = await o(`${e}/api/teams/${t}/datasets/${n}/status`);
|
|
27
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
|
|
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 Indx Dashboard"), Error("Authentication failed (401). Token may be expired. Check console for instructions.");
|
|
29
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.");
|
|
30
30
|
{
|
|
31
31
|
let t = await c.text();
|
|
@@ -33,34 +33,24 @@ function D({ url: e, team: t, dataset: n, preAuthenticatedToken: r, enableDebugL
|
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
let l = await c.json();
|
|
36
|
-
i && console.log("[Auth] 📊 Dataset status:", l), i && console.log("[Auth]
|
|
37
|
-
let d =
|
|
38
|
-
|
|
39
|
-
|
|
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;
|
|
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");
|
|
49
|
-
let [m, g, v] = await Promise.all([
|
|
36
|
+
i && console.log("[Auth] 📊 Dataset status:", l), 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"));
|
|
37
|
+
let d = l.documentCount ?? l.numberOfRecords ?? 0;
|
|
38
|
+
d === 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", d, "records");
|
|
39
|
+
let [f, m, g] = await Promise.all([
|
|
50
40
|
o(`${e}/api/teams/${t}/datasets/${n}/fields/filterable`),
|
|
51
41
|
o(`${e}/api/teams/${t}/datasets/${n}/fields/facetable`),
|
|
52
42
|
o(`${e}/api/teams/${t}/datasets/${n}/fields/sortable`)
|
|
53
43
|
]);
|
|
54
|
-
if (!
|
|
55
|
-
if (!
|
|
56
|
-
if (!
|
|
57
|
-
let [b, S
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
44
|
+
if (!f.ok) throw console.error("[Auth] ❌ GetFilterableFields failed:", f.status, await f.text()), Error("Failed to get filterable fields. Check console for details.");
|
|
45
|
+
if (!m.ok) throw console.error("[Auth] ❌ GetFacetableFields failed:", m.status, await m.text()), Error("Failed to get facetable fields. Check console for details.");
|
|
46
|
+
if (!g.ok) throw console.error("[Auth] ❌ GetSortableFields failed:", g.status, await g.text()), Error("Failed to get sortable fields. Check console for details.");
|
|
47
|
+
let [v, b, S] = await Promise.all([
|
|
48
|
+
f.json().catch((e) => (console.error("Failed to parse GetFilterableFields response:", e), [])),
|
|
49
|
+
m.json().catch((e) => (console.error("Failed to parse GetFacetableFields response:", e), [])),
|
|
50
|
+
g.json().catch((e) => (console.error("Failed to parse GetSortableFields response:", e), []))
|
|
61
51
|
]);
|
|
62
|
-
p(
|
|
63
|
-
let
|
|
52
|
+
p(v || []), h(b || []), _(S || []), C(d);
|
|
53
|
+
let w = { facets: {} };
|
|
64
54
|
try {
|
|
65
55
|
let r = await fetch(`${e}/api/teams/${t}/datasets/${n}/search`, {
|
|
66
56
|
method: "POST",
|
|
@@ -74,23 +64,23 @@ function D({ url: e, team: t, dataset: n, preAuthenticatedToken: r, enableDebugL
|
|
|
74
64
|
enableFacets: !0
|
|
75
65
|
})
|
|
76
66
|
});
|
|
77
|
-
r.ok ?
|
|
67
|
+
r.ok ? w = 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"));
|
|
78
68
|
} catch (e) {
|
|
79
69
|
console.warn("Blank search error:", e), console.warn("Continuing without initial facet data - facets will be populated after first search");
|
|
80
70
|
}
|
|
81
|
-
let
|
|
82
|
-
if (
|
|
83
|
-
for (let [e, t] of Object.entries(
|
|
71
|
+
let T = {};
|
|
72
|
+
if (w.facets) {
|
|
73
|
+
for (let [e, t] of Object.entries(w.facets)) if (Array.isArray(t) && t.length > 0) {
|
|
84
74
|
let n = t.map((e) => Number(e.key)).filter((e) => !isNaN(e));
|
|
85
|
-
n.length > 0 && (
|
|
75
|
+
n.length > 0 && (T[e] = {
|
|
86
76
|
min: Math.min(...n),
|
|
87
77
|
max: Math.max(...n)
|
|
88
78
|
});
|
|
89
79
|
}
|
|
90
80
|
}
|
|
91
|
-
let
|
|
92
|
-
if (
|
|
93
|
-
y(
|
|
81
|
+
let E = {};
|
|
82
|
+
if (w.facets) for (let [e, t] of Object.entries(w.facets)) Array.isArray(t) && (E[e] = t.map((e) => e.key));
|
|
83
|
+
y(T), x(E), i && console.log("[Auth] ✅ Initialization complete");
|
|
94
84
|
} catch (t) {
|
|
95
85
|
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));
|
|
96
86
|
} finally {
|
|
@@ -299,7 +289,7 @@ function N({ state: e, setState: t, authenticatedFetch: n, auth: r, url: a, team
|
|
|
299
289
|
truncationIndex: _
|
|
300
290
|
}));
|
|
301
291
|
} catch (e) {
|
|
302
|
-
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:", a)) : 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
|
|
292
|
+
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:", a)) : 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 Indx Dashboard.")) : e.message.includes("404") ? (console.error("[Search] ❌ Dataset not found"), console.error("[Search] 💡 Check that dataset \"" + u + "\" exists")) : console.error("[Search] 💡 Error:", e.message)), o !== g.current) return;
|
|
303
293
|
t((t) => ({
|
|
304
294
|
...t,
|
|
305
295
|
results: null,
|
|
@@ -1691,7 +1681,7 @@ var fe = class extends t {
|
|
|
1691
1681
|
children: [
|
|
1692
1682
|
/* @__PURE__ */ f("li", { children: "Check browser console for detailed error messages" }),
|
|
1693
1683
|
/* @__PURE__ */ f("li", { children: "Verify the url passed to SearchProvider is correct" }),
|
|
1694
|
-
/* @__PURE__ */ f("li", { children: "Verify your bearer token is valid (create or check it on the
|
|
1684
|
+
/* @__PURE__ */ f("li", { children: "Verify your bearer token is valid (create or check it on the Indx Dashboard)" }),
|
|
1695
1685
|
/* @__PURE__ */ f("li", { children: "Ensure INDX server is running" }),
|
|
1696
1686
|
/* @__PURE__ */ f("li", { children: "Check dataset name spelling" })
|
|
1697
1687
|
]
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@indxsearch/intrface",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.3.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",
|