@indxsearch/intrface 3.11.0 → 3.12.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 +25 -0
- package/dist/components/FilterPanelNotice.d.ts +11 -0
- package/dist/components/SearchInput.d.ts +4 -0
- package/dist/components/SearchResultsMessage.d.ts +12 -0
- package/dist/context/SearchContext.d.ts +4 -0
- package/dist/context/searchError.d.ts +37 -0
- package/dist/context/useIndxAuth.d.ts +5 -0
- package/dist/context/useSearchExecution.d.ts +4 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.es.js +790 -587
- package/dist/intrface.css +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,30 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 3.12.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 1533dad: SearchInput shows what the search is doing. A blue chip counts the active filters. A Nearest chip appears when nothing matched your words directly and the list holds the nearest results instead; its tooltip says so. A No results chip appears when a search returns nothing. There is one Clear button, and it now resets the query and the filters together, so it also shows on an empty search with filters set. `showStatus={false}` hides the chips.
|
|
8
|
+
|
|
9
|
+
SearchField leaves room for what sits on its right, such as a Clear button or chips, so typed text no longer runs underneath them.
|
|
10
|
+
|
|
11
|
+
The search icon lights up only while the input has focus. Clicking Clear used to light it for a moment.
|
|
12
|
+
|
|
13
|
+
- 43b8279: SearchResults shows a failed search as a state the visitor can read, not as an error message. Each kind of failure has its own icon and a short line: the server can't be reached, the key was not accepted or has no access, the dataset doesn't exist, the dataset is getting ready, too many searches, or a server error. Under it, a small technical line tells whoever built the page what happened and what to do. Where trying again can help there is a Try again button, and a dataset that is still loading or indexing is retried by itself when the server says it is ready.
|
|
14
|
+
|
|
15
|
+
No results now shows nothing in the list, since SearchInput says it in the field.
|
|
16
|
+
|
|
17
|
+
For your own components, the context has `retry()`, and `authErrorInfo` and `state.errorInfo` next to the existing messages, with the kind of failure, whether retrying can help, and the technical line. `describeSearchError` classifies any error the same way, and `SearchResultsMessage` is the component SearchResults uses, if you want it elsewhere.
|
|
18
|
+
|
|
19
|
+
A key that cannot reach the dataset (403) used to be reported as a failed connection. The startup messages in `authError` now follow the same form as search errors, for example "Dataset status failed: HTTP 404".
|
|
20
|
+
|
|
21
|
+
### Patch Changes
|
|
22
|
+
|
|
23
|
+
- 383e0f5: Filter panels are calmer when something is wrong. A panel whose field isn't set up for it (not Filterable, or not Facetable for a value panel) no longer shows a red message: it keeps its title, says "Not available" in muted text, names the missing role in a small technical line, and tells the console what to change. When the search fails to start, the filter panels step aside instead of each reporting its field as broken or showing a loading skeleton that never ends; the results area explains the failure once.
|
|
24
|
+
- Updated dependencies [f9400f4]
|
|
25
|
+
- Updated dependencies [1533dad]
|
|
26
|
+
- @indxsearch/systm@2.20.0
|
|
27
|
+
|
|
3
28
|
## 3.11.0
|
|
4
29
|
|
|
5
30
|
### Minor Changes
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export interface FilterPanelNoticeProps {
|
|
3
|
+
/** The panel's own title, so the notice sits where the panel would have been. */
|
|
4
|
+
label?: string;
|
|
5
|
+
field: string;
|
|
6
|
+
/** The roles the field lacks, such as ['filterable', 'facetable']. */
|
|
7
|
+
missing: string[];
|
|
8
|
+
}
|
|
9
|
+
/** A filter panel whose field cannot be used: the field is not marked for the role the panel needs.
|
|
10
|
+
* A setup mistake, so it is said quietly in the panel and fully in the console, not in red. */
|
|
11
|
+
export declare const FilterPanelNotice: React.FC<FilterPanelNoticeProps>;
|
|
@@ -2,7 +2,11 @@ import { default as React } from 'react';
|
|
|
2
2
|
import { InputSize } from '@indxsearch/systm';
|
|
3
3
|
export interface SearchInputProps extends React.InputHTMLAttributes<HTMLInputElement> {
|
|
4
4
|
inputSize?: InputSize;
|
|
5
|
+
/** One Clear button that resets the query and the filters, shown whenever there is either. */
|
|
5
6
|
showClear?: boolean;
|
|
6
7
|
showFocus?: boolean;
|
|
8
|
+
/** Chips that say what the search is doing: the number of active filters, "Nearest" when no
|
|
9
|
+
* result reached the coverage bar, and "No results". */
|
|
10
|
+
showStatus?: boolean;
|
|
7
11
|
}
|
|
8
12
|
export declare const SearchInput: React.FC<SearchInputProps>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { SearchErrorInfo } from '../context/searchError';
|
|
3
|
+
export interface SearchResultsMessageProps {
|
|
4
|
+
error: SearchErrorInfo;
|
|
5
|
+
/** Tries again. Shown as a button where retrying can help; a dataset that is getting ready is retried by itself. */
|
|
6
|
+
onRetry?: () => void;
|
|
7
|
+
/** Hides the technical line, for a page whose visitors should not see it. */
|
|
8
|
+
hideTechnical?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/** What SearchResults shows in place of the list when a search fails: an icon, a line for the
|
|
11
|
+
* visitor, the technical reason, and Try again where that can help. */
|
|
12
|
+
export declare const SearchResultsMessage: React.FC<SearchResultsMessageProps>;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
2
|
import { CoverageSetup } from '@indxsearch/indx-types';
|
|
3
|
+
import { SearchErrorInfo } from './searchError';
|
|
3
4
|
import { ValueMatch, NumericRange } from './buildFilterProxy';
|
|
4
5
|
export type { ValueMatch, NumericRange };
|
|
5
6
|
export interface SearchSettings {
|
|
@@ -25,6 +26,7 @@ export interface SearchState {
|
|
|
25
26
|
resultsSuppressed?: boolean;
|
|
26
27
|
facetDebounceDelayMillis?: number;
|
|
27
28
|
error?: string;
|
|
29
|
+
errorInfo?: SearchErrorInfo;
|
|
28
30
|
facets?: any | null;
|
|
29
31
|
filterableFields: string[];
|
|
30
32
|
facetableFields: string[];
|
|
@@ -58,6 +60,8 @@ export interface SearchContextType {
|
|
|
58
60
|
state: SearchState;
|
|
59
61
|
isFetchingInitial: boolean;
|
|
60
62
|
authError?: string;
|
|
63
|
+
authErrorInfo?: SearchErrorInfo;
|
|
64
|
+
retry?: () => void;
|
|
61
65
|
allowEmptySearch: boolean;
|
|
62
66
|
url: string;
|
|
63
67
|
team: string;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What kind of failure stopped the search, so a component can show it to the visitor rather than
|
|
3
|
+
* print the error's text:
|
|
4
|
+
*
|
|
5
|
+
* - `unreachable` — no answer at all: the server is down, the URL is wrong, or the network is gone
|
|
6
|
+
* - `unauthorized` — 401, the key is invalid or has expired
|
|
7
|
+
* - `forbidden` — 403, the key does not reach this dataset
|
|
8
|
+
* - `notFound` — 404, no such team or dataset
|
|
9
|
+
* - `notReady` — 409 `invalidState` with `retryable`: loading or indexing, the same request succeeds soon
|
|
10
|
+
* - `unavailable` — 409 otherwise: the dataset is in a state search cannot use (Error, or a build in progress)
|
|
11
|
+
* - `rateLimited` — 429, too many requests for this key
|
|
12
|
+
* - `server` — 5xx
|
|
13
|
+
* - `setup` — SearchProvider was not given what it needs (url, team, dataset, token)
|
|
14
|
+
* - `unknown` — anything else
|
|
15
|
+
*/
|
|
16
|
+
export type SearchErrorKind = 'unreachable' | 'unauthorized' | 'forbidden' | 'notFound' | 'notReady' | 'unavailable' | 'rateLimited' | 'server' | 'setup' | 'unknown';
|
|
17
|
+
export interface SearchErrorInfo {
|
|
18
|
+
kind: SearchErrorKind;
|
|
19
|
+
/** The error's own message, as `authError` and `state.error` carry it. */
|
|
20
|
+
message: string;
|
|
21
|
+
/** For whoever built the page: the status, the server's code and what to do. */
|
|
22
|
+
technical: string;
|
|
23
|
+
status?: number;
|
|
24
|
+
code?: string;
|
|
25
|
+
/** Seconds the server asked to wait (`Retry-After`), for `notReady` and `rateLimited`. */
|
|
26
|
+
retryAfterSeconds?: number;
|
|
27
|
+
/** Whether trying the same request again can succeed. */
|
|
28
|
+
retryable: boolean;
|
|
29
|
+
}
|
|
30
|
+
/** Thrown for a missing SearchProvider prop, so it is told apart from a failed request. */
|
|
31
|
+
export declare class SearchSetupError extends Error {
|
|
32
|
+
constructor(message: string);
|
|
33
|
+
}
|
|
34
|
+
export declare function describeSearchError(err: unknown, where: {
|
|
35
|
+
team: string;
|
|
36
|
+
dataset: string;
|
|
37
|
+
}): SearchErrorInfo;
|
|
@@ -1,8 +1,13 @@
|
|
|
1
|
+
import { SearchErrorInfo } from './searchError';
|
|
1
2
|
export interface IndxAuthResult {
|
|
2
3
|
token: string | null;
|
|
3
4
|
isFetchingInitial: boolean;
|
|
4
5
|
/** Set when initialization failed (bad token, unknown dataset, unreachable server). */
|
|
5
6
|
authError: string | null;
|
|
7
|
+
/** The same failure, classified: what kind it was, whether retrying can help, and a technical line. */
|
|
8
|
+
authErrorInfo: SearchErrorInfo | null;
|
|
9
|
+
/** Runs initialisation again, after a failure. */
|
|
10
|
+
retry: () => void;
|
|
6
11
|
initialFacetStats: Record<string, {
|
|
7
12
|
min: number;
|
|
8
13
|
max: number;
|
|
@@ -16,5 +16,8 @@ export interface UseSearchExecutionOptions {
|
|
|
16
16
|
source?: string;
|
|
17
17
|
count: boolean;
|
|
18
18
|
}
|
|
19
|
-
export
|
|
19
|
+
export interface UseSearchExecutionResult {
|
|
20
|
+
/** Runs the last search again, after a failure. */
|
|
21
|
+
retrySearch: () => void;
|
|
22
|
+
}
|
|
20
23
|
export declare function useSearchExecution({ state, setState, authenticatedFetch, auth, url, team, dataset, allowEmptySearch, facetsEnabled, enableDebugLogs, shouldFetchMore, sessionId, source, count, }: UseSearchExecutionOptions): UseSearchExecutionResult;
|
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)({}),[C,w]=(0,c.useState)(0),[T,E]=(0,c.useState)(null);return(0,c.useEffect)(()=>{(async()=>{E(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,_,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`),s(`${e}/api/teams/${t}/datasets/${n}/fields/configuration`).catch(()=>null)]);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[x,C,T]=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(x||[]),m(C||[]),g(T||[]),w(d);let E={};if(y?.ok){let e=await y.json().catch(e=>(console.error(`Failed to parse GetFieldConfiguration response:`,e),[]));for(let t of e??[])t?.fieldName&&t?.fieldType&&(E[t.fieldName]=t.fieldType)}else i&&console.log(`[Auth] fields/configuration not available`,y?.status,`- every selected value will be sent as a value filter`);v(E);let D={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?D=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 O={};if(D.facets){for(let[e,t]of Object.entries(D.facets))if(Array.isArray(t)&&t.length>0){let n=t.map(e=>Number(e.key)).filter(e=>!isNaN(e));n.length>0&&(O[e]={min:Math.min(...n),max:Math.max(...n)})}}let k={};if(D.facets)for(let[e,t]of Object.entries(D.facets))Array.isArray(t)&&(k[e]=t.map(e=>e.key));b(O),S(k),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`)),E(t instanceof Error?t.message:String(t))}finally{u(!1)}})()},[e,t,n]),{token:a,isFetchingInitial:s,authError:T,initialFacetStats:y,initialFacetKeys:x,filterableFields:d,facetableFields:p,sortableFields:h,fieldTypes:_,totalDocumentCount:C}}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={},s={},c={}){let l=Object.entries(e??{}).filter(([,e])=>e.length>0),u=Object.entries(t??{}),d=Object.entries(s??{}).filter(([,e])=>e.length>0),f=(e,{min:t,max:o})=>h(`range`,{fieldName:e,lowerLimit:t,upperLimit:o},`Range filter '${e}'`,n,r,i,a),p=(e,t)=>{let o=c[e]===`Number`?Number(t):NaN;return Number.isFinite(o)?f(e,{min:o,max:o}):h(`value`,{fieldName:e,value:t},`Value filter '${e}'`,n,r,i,a)},[m,_,v]=await Promise.all([Promise.all(l.map(async([e,t])=>g(await Promise.all(t.map(t=>p(e,t))),o[e]===`any`?`or`:`and`,n,r,i,a))),Promise.all(u.map(([e,t])=>f(e,t))),Promise.all(d.map(async([e,t])=>g(await Promise.all(t.map(t=>f(e,t))),`or`,n,r,i,a)))]);return g([...m,..._,...v],`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,shouldFetchMore:d,sessionId:f,source:p,count:h}){let g=(0,c.useRef)(0),y=(0,c.useRef)(void 0),b=(0,c.useRef)(!1),[x,S]=(0,c.useState)({}),[C,w]=(0,c.useState)(``),[T,E]=(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,fieldTypes:r.fieldTypes,fieldsSeeded:!0}))},[r.isFetchingInitial,r.initialFacetStats,r.totalDocumentCount,r.filterableFields,r.facetableFields,r.sortableFields,t]);let D=e.searchSettings.maxNumberOfRecordsToReturn,O=e.searchSettings.enableCoverage,k=e.searchSettings.removeDuplicates,A=e.searchSettings.coverageDepth,j=e.searchSettings.minimumScore,M=e.searchSettings.coverageSetup,N=e.sortBy,P=e.sortAscending,F=(0,c.useCallback)(async({enableFacets:c})=>{if(!r.token)return;let l=++g.current;if(t(e=>({...e,isLoading:!0})),e.query.trim()===``){if(!s)return;c=!0}try{let d=c?Array.from(new Set([...Object.keys(e.filters).filter(t=>e.valueMatch[t]===`any`&&(e.filters[t]?.length??0)>0),...Object.keys(e.bucketFilters).filter(t=>(e.bucketFilters[t]?.length??0)>0)])):[],[v,...y]=await Promise.all([_(e.filters,e.rangeFilters,i,a,o,n,e.valueMatch,e.bucketFilters,e.fieldTypes),...d.map(t=>_({...e.filters,[t]:[]},e.rangeFilters,i,a,o,n,e.valueMatch,{...e.bucketFilters,[t]:[]},e.fieldTypes))]),b=s||e.query.trim()!==``,F={text:e.query,enableCoverage:O,removeDuplicates:k,coverageDepth:A,coverageSetup:M},I={...F,maxNumberOfRecordsToReturn:b?D:0,enableFacets:c,...v?{filter:v}:{},...N?{sortBy:N}:{},...P===void 0?{}:{sortAscending:P}};u&&console.log(`[performSearch] request body:`,JSON.stringify(I,null,2));let L=new URLSearchParams({session:f});p&&L.set(`source`,p),h||L.set(`count`,`false`);let R=e=>n(`${i}/api/teams/${a}/datasets/${o}/search?${L}`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)}),[z,...B]=await Promise.all([R(I),...y.map(e=>R({...F,maxNumberOfRecordsToReturn:0,enableFacets:!0,...e?{filter:e}:{}}))]);if(!z.ok)throw await m.fromResponse(`Search`,z);let V=await z.json(),H=z.headers.get(`Indx-Query-Id`)??void 0,U=V.truncationIndex??-1,W={};for(let e=0;e<d.length;e++){let t=d[e];if(!B[e].ok)throw await m.fromResponse(`Facets for '${t}'`,B[e]);let n=await B[e].json();n.facets?.[t]!==void 0&&(W[t]=n.facets[t])}let G=V.records||[],ee=G.map(e=>e.documentKey),K=G.map(e=>e.score),q=[];if(b&&ee.length>0){let e=await n(`${i}/api/teams/${a}/datasets/${o}/documents/lookup`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(ee)});if(!e.ok)throw await m.fromResponse(`Document lookup`,e);q=(await e.json()).map((e,t)=>({document:e,documentKey:ee[t],score:K[t]}))}let J={};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&&(J[e]={min:Math.min(...n),max:Math.max(...n)})}}if(l!==g.current)return;let te=e.query!==C,Y=e.query!==T,X=e.facetStats??{};if(te?(X={...r.initialFacetStats,...J},S(X),w(e.query)):X={...x,...J},Y&&c){let n={...e.rangeBounds};for(let[e,t]of Object.entries(J))n[e]=t;t(e=>({...e,rangeBounds:n})),E(e.query)}let Z=Object.keys(W).length>0?{...V.facets??{},...W}:V.facets;if(c&&(!Z||Object.keys(Z).length===0)){Z={};for(let[e,t]of Object.entries(r.initialFacetKeys))Z[e]=t.map(e=>({key:e,value:null}))}let ne=q.filter(t=>{let n=e.query.trim();return n===``||n.length===1?!0:t.score>=j}).map((e,t)=>({...e,position:t+1}));t(e=>({...e,results:ne,error:void 0,resultsSuppressed:!b,...c?{facets:Z,facetStats:X}:{},isLoading:!1,truncationIndex:U,queryId:H}))}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!==g.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.bucketFilters,e.facetStats,N,P,D,O,k,A,M,j,n,r.initialFacetStats,r.initialFacetKeys,r.token,x,C,T,e.rangeBounds,i,a,o,s,u,t,f,p,h]);(0,c.useEffect)(()=>{y.current=F},[F]);let I=(0,c.useRef)(null);(0,c.useEffect)(()=>(I.current?.cancel(),I.current=v(()=>{u&&console.log(`Debounced searchWithFacets fired`),y.current?.({enableFacets:!0})},e.facetDebounceDelayMillis??500),()=>{I.current?.cancel()}),[e.facetDebounceDelayMillis]),(0,c.useEffect)(()=>{!r.isFetchingInitial&&r.token&&!b.current&&(s&&y.current?.({enableFacets:l}),b.current=!0)},[r.isFetchingInitial,r.token,s,l]),(0,c.useEffect)(()=>{if(!r.token||!b.current)return;let n=e.query.trim(),i=n===``&&s;if(n===``&&!s){e.resultsSuppressed||t(e=>({...e,resultsSuppressed:!0}));return}return i?(I.current?.cancel(),y.current?.({enableFacets:l})):l?(u&&console.log(`Search fired`),y.current?.({enableFacets:!1}),I.current?.()):y.current?.({enableFacets:!1}),()=>{I.current?.cancel()}},[e.query,s,l]),(0,c.useEffect)(()=>{if(!b.current||!r.token||e.filterRevision===0)return;let t=e.query.trim();!s&&t===``||y.current?.({enableFacets:l})},[e.filterRevision]),(0,c.useEffect)(()=>{if(!b.current||!r.token)return;let t=e.query.trim();!s&&t===``||y.current?.({enableFacets:l})},[N,P]);let L=(0,c.useRef)(!0),R=(0,c.useRef)(e.query);(0,c.useEffect)(()=>{if(L.current){L.current=!1;return}if(R.current!==e.query||!b.current||!r.token)return;if(d.current){d.current=!1,y.current?.({enableFacets:!1});return}let t=e.query.trim();!s&&t===``||y.current?.({enableFacets:l})},[D,O,k,A,M,j]),(0,c.useEffect)(()=>{R.current=e.query},[e.query])}function b(){let e=globalThis.crypto;return e?.randomUUID?e.randomUUID():Math.random().toString(36).slice(2)+Date.now().toString(36)}var x=(0,c.createContext)(void 0),S=({children:e,url:t,team:n,dataset:r,allowEmptySearch:i=!1,maxResults:a=10,facetDebounceDelayMillis:o=500,enableFacets:s=!0,coverageDepth:l,removeDuplicates:d=!0,enableCoverage:f=!0,initialCoverageSetup:m={},enableDebugLogs:h=!1,preAuthenticatedToken:g,source:_,count:v=!0})=>{let S=(0,c.useRef)(!1),C=(0,c.useRef)(b()).current,w=(0,c.useRef)(a),[T,E]=(0,c.useState)({query:``,results:null,isLoading:!1,resultsSuppressed:!i,facetDebounceDelayMillis:o,filterableFields:[],facetableFields:[],sortableFields:[],fieldTypes:{},filters:{},valueMatch:{},rangeFilters:{},bucketFilters:{},filterRevision:0,fieldsSeeded:!1,facetStats:{},rangeBounds:{},searchSettings:{maxNumberOfRecordsToReturn:a,coverageDepth:l,enableCoverage:f,removeDuplicates:d,minimumScore:0,showScore:!0,placeholderText:`Type to search`,coverageSetup:{...m}}});(0,c.useEffect)(()=>{h&&console.log(`SearchContext mounted on client`)},[h]),(0,c.useEffect)(()=>{E(e=>({...e,facetDebounceDelayMillis:o}))},[o]);let[D]=(0,c.useState)(s),O=p({url:t,team:n,dataset:r,preAuthenticatedToken:g,enableDebugLogs:h}),k=(0,c.useCallback)((e,t={})=>{if(!O.token)throw Error(`No authentication token available`);return fetch(e,{...t,headers:{...t.headers,Authorization:`Bearer ${O.token}`}})},[O.token]);y({state:T,setState:E,authenticatedFetch:k,auth:O,url:t,team:n,dataset:r,allowEmptySearch:i,facetsEnabled:D,enableDebugLogs:h,shouldFetchMore:S,sessionId:C,source:_,count:v});let A=(0,c.useRef)(void 0);A.current=T.queryId;let j=(0,c.useCallback)(async e=>{if(O.token)try{let i=await k(`${t}/api/teams/${n}/datasets/${r}/events/select`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({queryId:A.current,documentKey:e.documentKey,position:e.position,...v?{}:{count:!1}})});h&&(i.ok?console.log(`[select] document ${e.documentKey} at position ${e.position}`):console.warn(`[select] not recorded: ${i.status}`))}catch(e){h&&console.warn(`[select] failed:`,e)}},[O.token,k,t,n,r,h,v]),M=(0,c.useCallback)(e=>{E(t=>{let n=Object.keys(t.filters).length>0,r=Object.keys(t.rangeFilters).length>0,i=Object.keys(t.bucketFilters).length>0;return{...t,query:e,filters:n?{}:t.filters,rangeFilters:r?{}:t.rangeFilters,bucketFilters:i?{}:t.bucketFilters,searchSettings:{...t.searchSettings,maxNumberOfRecordsToReturn:w.current}}})},[]),N=(0,c.useCallback)(e=>{E(t=>({...t,facetDebounceDelayMillis:e}))},[]),P=(0,c.useCallback)(e=>{typeof e.maxNumberOfRecordsToReturn==`number`&&(w.current=e.maxNumberOfRecordsToReturn),E(t=>{let n={...t.searchSettings,...e};return`coverageSetup`in e?e.coverageSetup?n.coverageSetup={...t.searchSettings.coverageSetup,...e.coverageSetup}:n.coverageSetup={}:n.coverageSetup=t.searchSettings.coverageSetup,{...t,searchSettings:n}})},[]),F=(0,c.useCallback)(e=>{S.current=!0,E(t=>({...t,searchSettings:{...t.searchSettings,maxNumberOfRecordsToReturn:e}}))},[]),I=(0,c.useCallback)((e,t,n=!1)=>{E(r=>{let i={...r.filters},a=i[e]||[],o=a.includes(t)?a.filter(e=>e!==t):n?[t]:[...a,t];return o.length?i[e]=o:delete i[e],{...r,filters:i,filterRevision:r.filterRevision+1}})},[]),L=(0,c.useCallback)((e,t)=>{E(n=>n.valueMatch[e]===t?n:{...n,valueMatch:{...n.valueMatch,[e]:t}})},[]),R=(0,c.useCallback)((e,t,n)=>{E(r=>({...r,rangeFilters:{...r.rangeFilters,[e]:{min:t,max:n}},filterRevision:r.filterRevision+1}))},[]),z=(0,c.useCallback)(()=>{E(e=>({...e,filters:{},rangeFilters:{},bucketFilters:{},filterRevision:e.filterRevision+1}))},[]),B=(0,c.useCallback)((e,t,n=!0)=>{E(r=>{let i={...r.filters},a=(i[e]||[]).filter(e=>e!==t);return a.length>0?i[e]=a:delete i[e],{...r,filters:i,filterRevision:r.filterRevision+ +!!n}})},[]),V=(0,c.useCallback)((e,t=!0)=>{E(n=>{if(!(e in n.rangeFilters))return n;let r={...n.rangeFilters};return delete r[e],{...n,rangeFilters:r,filterRevision:n.filterRevision+ +!!t}})},[]),H=(e,t)=>e.min===t.min&&e.max===t.max,U=(0,c.useCallback)((e,t,n=!1)=>{E(r=>{let i=r.bucketFilters[e]??[],a=i.some(e=>H(e,t))?i.filter(e=>!H(e,t)):n?[t]:[...i,t],o={...r.bucketFilters};return a.length>0?o[e]=a:delete o[e],{...r,bucketFilters:o,filterRevision:r.filterRevision+1}})},[]),W=(0,c.useCallback)((e,t,n=!0)=>{E(r=>{let i={...r.bucketFilters},a=t?(i[e]??[]).filter(e=>!H(e,t)):[];return a.length>0?i[e]=a:delete i[e],{...r,bucketFilters:i,filterRevision:r.filterRevision+ +!!n}})},[]),G=(0,c.useCallback)((e,t)=>{E(n=>({...n,sortBy:e||void 0,sortAscending:e?t:void 0}))},[]);return(0,u.jsx)(x.Provider,{value:{state:T,isFetchingInitial:O.isFetchingInitial||!T.fieldsSeeded,authError:O.authError??void 0,allowEmptySearch:i,url:t,team:n,dataset:r,authenticatedFetch:k,setQuery:M,toggleFilter:I,setValueMatch:L,setRangeFilter:R,resetFilters:z,resetSingleFilter:B,resetRangeFilter:V,toggleBucketFilter:U,resetBucketFilter:W,setSort:G,setDebounceDelay:N,setSearchSettings:P,fetchMoreResults:F,selectResult:j,sessionId:C},children:e})},C=()=>{let e=(0,c.useContext)(x);if(!e)throw Error(`useSearchContext must be used within a SearchProvider`);return e},w=({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}=C();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`})})},T={placeholder:`_placeholder_ee9qi_1`,invalid:`_invalid_ee9qi_11`},E={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`},D=({skeleton:e=!1,index:t,score:n,showScore:r=!1,children:i,skeletonDelay:a=0,skeletonWidths:o=[62,38]})=>(0,u.jsxs)(`div`,{className:E.row,children:[t!==void 0&&(0,u.jsx)(`div`,{className:E.indexNumber,children:t}),(0,u.jsx)(`div`,{className:E.content,children:e?(0,u.jsxs)(`div`,{className:E.skeletonBars,children:[(0,u.jsx)(`div`,{className:E.skeletonBarLg,style:{width:`${o[0]}%`,animationDelay:`${a}s`}}),(0,u.jsx)(`div`,{className:E.skeletonBarSm,style:{width:`${o[1]}%`,animationDelay:`${a+.05}s`}})]}):i}),r&&n!==void 0&&(0,u.jsx)(`div`,{className:E.scoreNumber,children:n})]}),O={wrapper:`_wrapper_81m3c_6`,skeletonAppear:`_skeletonAppear_81m3c_1`},k=[[62,38],[75,45],[58,33],[70,42],[65,50],[55,35],[72,40],[60,30]],A=({rows:e=6})=>(0,u.jsx)(`div`,{className:O.wrapper,children:Array.from({length:e}).map((e,t)=>(0,u.jsx)(D,{skeleton:!0,skeletonDelay:t*.1,skeletonWidths:k[t%k.length]},t))}),j=/^\[\s*(?:'[^']*'(?:\s*,\s*'[^']*')*)?\s*\]$/;function M(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(!j.test(t))return;let n=[],r=/'([^']*)'/g,i;for(;(i=r.exec(t))!==null;)n.push(i[1]);return n}var N=({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:_,selectResult:v}=C(),y=t??30,[b,x]=(0,c.useState)(y),S=(0,c.useRef)(0),w=(0,c.useRef)(``);(0,c.useEffect)(()=>{let e=l!==w.current;(!i||i.length<S.current||e)&&x(y),S.current=i?.length??0,w.current=l},[i,y,l]);let E=i&&i.length>b,O=()=>{let e=b+y;x(e),i&&e>=i.length&&(!s||s===-1||s>i.length)&&_(i.length+y)};if(m)return g?(0,u.jsx)(A,{rows:y}):(0,u.jsx)(`div`,{className:T.placeholder,children:(0,u.jsx)(f.Indx,{size:200,color:`var(--lv5)`})});let k=h??p;return k?(0,u.jsx)(`div`,{className:T.invalid,role:`alert`,children:(0,u.jsx)(`p`,{children:k})}):a||i===null?(0,u.jsx)(`div`,{className:T.placeholder,children:(0,u.jsx)(f.Indx,{size:200,color:`var(--lv5)`})}):i.length===0?(0,u.jsx)(`div`,{className:T.invalid,children:(0,u.jsx)(`p`,{children:`No results found.`})}):(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(`div`,{children:(i??[]).slice(0,b).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:T.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=M(t);n&&(l[e]=n)}}return(0,u.jsx)(D,{index:i,score:s,showScore:o.showScore,children:r(l,{result:t,select:()=>v?.(t)??Promise.resolve()})},i)})}),E&&(0,u.jsx)(`div`,{style:{textAlign:`center`,marginTop:`20px`},children:(0,u.jsx)(d.Button,{variant:`secondary`,size:`micro`,onClick:O,children:l.trim()===``?`Load more`:s!==-1&&s!==void 0&&s>0?`Load results ${b+1}-${Math.min(b+y,i.length,s)} of ${s}`:`Load more`})})]})},P={row:`_row_ujwhc_1`,title:`_title_ujwhc_8`},F=({variant:e=`default`,children:t})=>(0,u.jsx)(`div`,{className:[P.row,e===`title`?P.title:``].filter(Boolean).join(` `),children:t}),I={bar:`_bar_4nxla_12`,skeletonAppear:`_skeletonAppear_4nxla_1`,fade:`_fade_4nxla_1`,listRows:`_listRows_4nxla_19`,sliderArea:`_sliderArea_4nxla_25`,sliderTrack:`_sliderTrack_4nxla_32`,inputRow:`_inputRow_4nxla_40`,inputBar:`_inputBar_4nxla_45`,histogramRow:`_histogramRow_4nxla_55`},L=[65,80,55,72,60,75,50,68],R=({title:e,rows:t=5,variant:n=`list`,withHistogram:r=!1,collapsible:i=!0,startCollapsed:a=!1})=>(0,u.jsx)(d.FilterPanelBase,{title:e,collapsible:i,collapsed:a,children:n===`slider`?(0,u.jsxs)(`div`,{className:I.sliderArea,children:[r&&(0,u.jsx)(`div`,{className:I.histogramRow}),(0,u.jsx)(`div`,{className:I.sliderTrack}),(0,u.jsxs)(`div`,{className:I.inputRow,children:[(0,u.jsx)(`div`,{className:I.inputBar,style:{animationDelay:`0.1s`}}),(0,u.jsx)(`div`,{className:I.inputBar,style:{animationDelay:`0.15s`}})]})]}):(0,u.jsx)(`div`,{className:I.listRows,children:Array.from({length:t}).map((e,t)=>(0,u.jsx)(`div`,{className:I.bar,style:{width:`${L[t%L.length]}%`,animationDelay:`${t*.05}s`}},t))})}),z={list:`_list_18vbb_2`,count:`_count_18vbb_7`,countValue:`_countValue_18vbb_17`,chip:`_chip_18vbb_22`,chipLabel:`_chipLabel_18vbb_32`,grid:`_grid_18vbb_40`,active:`_active_18vbb_54`},B=({field:e,label:t,preserveBlankFacetState:n=!1,preserveBlankFacetStateOrder:r=!1,sortFacetsBy:i=`histogram`,limit:a=10,collapsible:o=!0,startCollapsed:s=!1,control:l,displayType:f,layout:p=`list`,showActivePanel:m=!1,showCount:h=!0,showNull:g=!1,match:_=`all`,displayIfEmptyQuery:v=!0,displayCondition:y=e=>!0})=>{let{state:{facets:b,filterableFields:x,facetableFields:S,filters:w,query:T},toggleFilter:E,setValueMatch:D,isFetchingInitial:O,allowEmptySearch:k}=C(),A=l??f??`checkbox`,j=A===`radio`?`any`:_;(0,c.useEffect)(()=>{D(e,j)},[e,j,D]);let M=(0,c.useRef)(null),[N,P]=(0,c.useState)(a);if((0,c.useEffect)(()=>{P(a)},[b?.[e],a]),!k&&!T)return null;if(O||!b)return A===`toggle`?(0,u.jsx)(R,{rows:1,collapsible:!1}):(0,u.jsx)(R,{title:t,rows:Math.min(a,6),collapsible:o,startCollapsed:s});if(!y({query:T??``,filters:w,facets:b})||!v&&!T&&Object.keys(w).length<1)return null;if(!x?.includes(e)||!S?.includes(e)){let t=[];return x?.includes(e)||t.push(`filterable`),S?.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 F=b?.[e]??(A===`toggle`?[]:void 0);if(!F||!Array.isArray(F))return null;let I=w?.[e]??[];n&&!M.current&&F.length>0&&(M.current=F.reduce((e,t)=>(e[t.key]=t.value,e),{}));let L=new Map;n&&M.current&&Object.keys(M.current).forEach(e=>{L.set(e,0)}),F.forEach(e=>{L.set(e.key,e.value)});let B=new Set([`true`,`false`,`null`]),V=Array.from(L.keys()),H=A===`toggle`&&(V.length>0&&V.every(e=>B.has(e))||V.length===0&&I.length>0);if(H&&L.has(`null`)){let e=L.get(`null`)??0,t=L.get(`false`)??0;L.set(`false`,t+e),L.delete(`null`)}if(A===`toggle`&&!H)return(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,children:(0,u.jsx)(`div`,{className:z.count,children:(0,u.jsx)(d.ToggleSwitch,{label:t,checked:!1,onChange:()=>{},disabled:!0})})});if(H){let n=L.get(`true`),r=typeof n==`number`?n:null,i=I.includes(`true`),a=r===0&&!i,o=h&&(r??0)>0?`${r}`:``;return(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,children:(0,u.jsxs)(`div`,{className:z.count,children:[(0,u.jsx)(d.ToggleSwitch,{label:t,checked:i,onChange:()=>E(e,`true`),disabled:a}),` `,o]})})}let U=Array.from(L.entries());if(g||(U=U.filter(([e])=>e!==`null`)),U.length===0&&!n)return null;if(!r)if(i===`alphabetical`){let e=U.filter(([,e])=>typeof e==`number`&&e>0).sort(([e],[t])=>e.localeCompare(t)),t=U.filter(([,e])=>e===0||e===null).sort(([e],[t])=>e.localeCompare(t));U=[...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=U.filter(([,e])=>typeof e==`number`&&e>0).sort(([t],[n])=>e(t,n)),n=U.filter(([,e])=>e===0||e===null).sort(([t],[n])=>e(t,n));U=[...t,...n]}else{let e=U.filter(([,e])=>typeof e==`number`&&e>0),t=U.filter(([,e])=>e===0||e===null);U=[...e,...t]}let W=typeof a==`number`&&U.length>a,G=W?U.slice(0,N):U,ee=(t,n)=>{let r=I.includes(t),i=n===0,a=h&&(n??0)>0?` (${n})`:``,o=h&&(n??0)>0?n:``,s=()=>E(e,t,A===`radio`);switch(A){case`button`:return p===`list`?(0,u.jsxs)(`div`,{className:z.count,children:[(0,u.jsx)(d.Button,{variant:r?`primary`:`secondary`,onClick:s,disabled:i,size:`micro`,className:z.chip,title:t,children:(0,u.jsx)(`span`,{className:z.chipLabel,children:t})}),(0,u.jsx)(`span`,{className:z.countValue,children:o})]}):(0,u.jsx)(d.Button,{variant:r?`primary`:`secondary`,onClick:s,disabled:i,size:`micro`,className:z.chip,title:`${t}${a}`,children:(0,u.jsx)(`span`,{className:z.chipLabel,children:`${t}${a}`})});case`toggle`:return(0,u.jsx)(d.ToggleSwitch,{label:t,checked:r,onChange:s,disabled:i});case`radio`:{let n=(0,u.jsx)(d.RadioButton,{id:`${e}-${t}`,name:e,value:t,label:p===`grid`?`${t}${a}`:t,checked:r,onChange:s,disabled:i});return p===`list`?(0,u.jsxs)(`div`,{className:z.count,children:[n,(0,u.jsx)(`span`,{className:z.countValue,children:o})]}):n}default:return p===`list`?(0,u.jsxs)(`div`,{className:z.count,children:[(0,u.jsx)(d.Checkbox,{label:t,score:``,checked:r,onChange:s,disabled:i}),(0,u.jsx)(`span`,{className:z.countValue,children:o})]}):(0,u.jsx)(d.Checkbox,{label:t,score:a,checked:r,onChange:s,disabled:i})}};return(0,u.jsx)(d.FilterPanelBase,{title:t,collapsible:o,collapsed:o?s:!1,className:m&&I.length>0?z.active:void 0,children:(0,u.jsxs)(`ul`,{className:p===`grid`?z.grid:z.list,style:{listStyle:`none`,padding:0,margin:0},children:[G.map(([e,t])=>(0,u.jsx)(`li`,{children:ee(e,t)},e)),W&&N<U.length&&(()=>{let e=U.length-N,t=Math.min(50,e);return(0,u.jsx)(`li`,{className:z.toggleItem,children:(0,u.jsx)(d.Button,{variant:`ghost`,size:`micro`,onClick:()=>P(e=>e+50),children:`Show ${t} more of ${U.length} total`})})})()]})})},V={disabledMessage:`_disabledMessage_adany_1`,histogram:`_histogram_adany_6`,histogramLayer:`_histogramLayer_adany_14`,histogramLive:`_histogramLive_adany_22`,histogramLit:`_histogramLit_adany_23`,histogramFill:`_histogramFill_adany_30`,histogramBar:`_histogramBar_adany_43`,histogramSeparators:`_histogramSeparators_adany_61`,histogramSeparator:`_histogramSeparator_adany_48`,active:`_active_adany_76`};function H(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 U(e){let t=0;for(let n of e)t=Math.max(t,H(n));return t===0?1:Number((10**-t).toFixed(t))}function W(e,t){return Number(e.toFixed(H(t)))}function G(e,t,n){let r=t+Math.round((e-t)/n)*n;return Number(r.toFixed(H(n)))}function ee(e,t,n){let r=Math.ceil(Number(((e-t)/n).toFixed(6)));return Number((t+r*n).toFixed(H(n)))}var K=({field:e,label:t,expectedMin:n=0,expectedMax:r=1e3,control:i,displayType:a,showActivePanel:o=!1,collapsible:s=!0,startCollapsed:l=!1,showHistogram:f=!1,resolution:p,step:m,stepMarks:h})=>{let{state:{rangeFilters:g,rangeBounds:_,facetStats:v,facets:y,filterableFields:b,facetableFields:x,query:S,facetDebounceDelayMillis:w},setRangeFilter:T,resetRangeFilter:E,allowEmptySearch:D,isFetchingInitial:O}=C(),k=i??a??`input`,A=_?.[e]!==void 0,j=_?.[e]??{min:n,max:r},M=j.min,N=j.max,P=v?.[e]??j,F=Math.max(M,Math.min(N,P.min)),I=Math.max(M,Math.min(N,P.max)),L=c.default.useMemo(()=>{if(m)return m;let t=Math.max(H(M),H(N)),n=y?.[e];if(Array.isArray(n))for(let e of n)t=Math.max(t,H(Number(e.key)));return t===0?1:Number((10**-t).toFixed(t))},[m,M,N,y,e]),z=A&&M===N,B=z?n:M,U=z?r:N,K=ee(U+L,B,L),q=e=>Math.min(K,Math.max(B,e)),J=g?.[e],te=o&&J!==void 0?V.active:void 0,Y=J?J.min:M,X=J?J.max:N,Z=J!==void 0,ne=F!==M||I!==N,[Q,$]=c.default.useState([Y,X]),[re,ie]=c.default.useState(!1),[ae,oe]=c.default.useState(!1),[se,ce]=c.default.useState(String(Y)),[le,ue]=c.default.useState(String(X)),de=c.default.useMemo(()=>{let e=H(L);return{width:`calc(${Math.max(3,M.toFixed(e).length,N.toFixed(e).length,se.length,le.length)+1}ch + 20px)`}},[L,M,N,se,le]);c.default.useEffect(()=>{ce(String(Q[0])),ue(String(Q[1]))},[Q]);let{finalMin:fe,finalMax:pe,isValidMin:me,isValidMax:he}=c.default.useMemo(()=>{let[e,t]=Q,n=Math.max(M,Math.min(N,e)),r=Math.max(M,Math.min(N,t)),i=Math.min(n,r),a=Math.max(n,r);return{finalMin:i,finalMax:a,isValidMin:i>=M&&i<=a,isValidMax:a<=N&&a>=i}},[Q,M,N]);c.default.useEffect(()=>{if(z)return;if(Q[0]===M&&Q[1]===N){ie(!1),oe(!1);return}let t=w??500,n=setTimeout(()=>{ie(!me),oe(!he)},300),r=setTimeout(()=>{me&&he&&(fe===M&&pe===N?E(e,!1):T(e,fe,pe))},t);return()=>{clearTimeout(n),clearTimeout(r)}},[fe,pe,me,he,M,N,e,E,T,w,z]),c.default.useEffect(()=>{$([Y,X]),ie(!1),oe(!1)},[Y,X,e]);let ge=c.default.useCallback(e=>{let t=W(Math.min(e[0],e[1]-L),L);return[t,W(Math.max(e[1]-L,t),L)]},[L]),_e=c.default.useCallback(e=>{if(z)return;let[t,n]=ge(e);$([Math.max(M,Math.min(I,t)),Math.max(F,Math.min(N,n))])},[z,ge,M,N,F,I]),ve=c.default.useCallback(t=>{if(z)return;let[n,r]=ge(t),i=Math.max(M,Math.min(I,n)),a=Math.max(F,Math.min(N,r));i===M&&a===N?($([M,N]),E(e,!0)):$([i,a])},[z,ge,M,N,F,I,e,E]),ye=c.default.useRef(null),be=c.default.useCallback((t,n)=>{if(z)return;let r=ye.current;if(J&&r&&r.start===t&&r.last===n){ye.current=null,$([M,N]),E(e,!0);return}let i=G(Math.max(M,F,t),M,L),a=Math.max(i,G(Math.min(N,I,n),M,L));ye.current={start:t,last:n},$([i,a])},[z,J,M,N,F,I,L,e,E]),xe=c.default.useCallback(()=>{if(z)return;let e=se.trim(),t=e===``?NaN:Number(e);if(isNaN(t)){ce(String(Q[0]));return}let n=Math.max(M,Math.min(I,t));n<Q[1]?$([n,Q[1]]):$([M,Q[1]]),ce(String(n<Q[1]?n:M))},[z,se,Q,M,I]),Se=c.default.useCallback(()=>{if(z)return;let e=le.trim(),t=e===``?NaN:Number(e);if(isNaN(t)){ue(String(Q[1]));return}let n=Math.max(F,Math.min(N,t));n>Q[0]?$([Q[0],n]):$([Q[0],N]),ue(String(n>Q[0]?n:N))},[z,le,Q,F,N]),Ce=e=>t=>{t.key===`Enter`&&e()},[we,Te]=c.default.useState(null),Ee=c.default.useRef(null);c.default.useEffect(()=>{if(!f)return;let t=`${M}:${N}`;if(t===Ee.current&&Ee.current!==null)return;let n=y?.[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&&(Ee.current=t,Te(r))},[M,N,y,e,f]);let De=c.default.useMemo(()=>{if(!f||!we||we.length===0)return[];let e=N-M;if(e<=0)return[];let t=p??Math.max(L,W(Math.ceil(e/20/L)*L,L)),n=Math.ceil(e/t);return Array.from({length:n},(e,r)=>{let i=M+r*t,a=M+(r+1)*t,o=r===n-1,s=we.filter(e=>{let t=Number(e.key);return t>=i&&(t<a||o&&t<=N)}).reduce((e,t)=>e+t.value,0),c=o?N:W(a-L,L);return{bucketStart:i,bucketEnd:a,count:s,last:c,barEnd:W(c+L,L)}}).map((e,t,n)=>({...e,span:(t+1<n.length?n[t+1].bucketStart:Math.max(e.barEnd,K))-e.bucketStart}))},[f,we,M,N,p,L,K]),Oe=c.default.useMemo(()=>Math.max(...De.map(e=>e.count),1),[De]);return f&&!O&&!x?.includes(e)&&console.warn(`RangeFilterPanel: showHistogram=true but field "${e}" is not facetable. Add .Facetable = true to this field.`),O?(0,u.jsx)(R,{title:t,variant:`slider`,withHistogram:f,collapsible:s,startCollapsed:l}):!D&&!S?null:b?.includes(e)?k===`slider`?(0,u.jsxs)(d.FilterPanelBase,{title:t,collapsed:l,collapsible:s,className:te,children:[z&&(0,u.jsxs)(`div`,{className:V.disabledMessage,children:[`No adjustable range (all results have the same value: `,M,`).`]}),f&&De.length===0&&(0,u.jsx)(`div`,{className:V.histogram}),f&&De.length>0&&(()=>{let[e,t]=I>F&&(F>M||I<N)?[F,I]:[B,U],n=Math.max(fe,e),r=Math.min(pe,t),i=K,a=i-B||1,o=e=>Math.max(0,Math.min(1,(e-B)/a)),s=e=>e>=U?0:Math.max(0,Math.min(1,(i-(e+L))/a)),c=o(n),l=r<n?1-c:s(r),d=e=>`calc(10px + (100% - 20px) * ${e})`,f=`inset(0 ${d(l)} 0 ${d(c)})`,p=`inset(0 ${d(s(t))} 0 ${d(o(e))})`,m=n=>n.last<e||n.bucketStart>t,h=De.slice(1).map(e=>d((e.bucketStart-B)/a)),g=De.map(e=>({...e,height:Math.max(1,Math.ceil(e.count/Oe*20))}));return(0,u.jsxs)(`div`,{className:V.histogram,children:[(0,u.jsx)(`div`,{className:V.histogramLayer,children:g.map((e,t)=>(0,u.jsx)(`button`,{type:`button`,className:V.histogramBar,style:{flexGrow:e.span},"data-testid":`histogram-bar`,disabled:z||m(e),"aria-label":`${e.bucketStart} to ${e.last}: ${e.count}`,title:`${e.bucketStart} to ${e.last}: ${e.count}`,onClick:()=>be(e.bucketStart,e.last),children:(0,u.jsx)(`span`,{className:V.histogramFill,style:{height:`${e.height}px`}})},t))}),(0,u.jsx)(`div`,{className:`${V.histogramLayer} ${V.histogramLive}`,"aria-hidden":`true`,"data-testid":`histogram-live`,style:{clipPath:p},children:g.map((e,t)=>(0,u.jsx)(`span`,{className:V.histogramBar,style:{flexGrow:e.span},children:(0,u.jsx)(`span`,{className:V.histogramFill,style:{height:`${e.height}px`}})},t))}),(0,u.jsx)(`div`,{className:`${V.histogramLayer} ${V.histogramLit}`,"aria-hidden":`true`,"data-testid":`histogram-lit`,style:{clipPath:f},children:g.map((e,t)=>(0,u.jsx)(`span`,{className:V.histogramBar,style:{flexGrow:e.span},children:(0,u.jsx)(`span`,{className:V.histogramFill,style:{height:`${e.height}px`}})},t))}),(0,u.jsx)(`div`,{className:V.histogramSeparators,"aria-hidden":`true`,children:h.map((e,t)=>(0,u.jsx)(`span`,{className:V.histogramSeparator,style:{left:e}},t))})]})})(),(0,u.jsx)(`div`,{style:{padding:`10px 10px 20px 10px`},children:(0,u.jsx)(d.Slider,{min:B,max:K,step:L,stepMarks:h,value:z?[B,K]:[q(G(fe,B,L)),q(G(pe+L,B,L))],isRange:!0,onChange:e=>_e(e),onFinalChange:e=>ve(e),disabled:z,activeMin:F,activeMax:q(W(I+L,L)),isFaceted:ne,highlightFaceted:Z,"aria-label":t||`Filter by ${e}`})}),(0,u.jsxs)(`div`,{style:{display:`flex`,gap:`10px`,alignItems:`flex-start`,justifyContent:`space-between`},children:[(0,u.jsx)(d.InputField,{label:`Min:`,type:`number`,style:de,value:z?String(M):se,min:M,max:W(Math.min(I,Q[1]-L),L),onChange:e=>ce(e.target.value),onBlur:xe,onKeyDown:Ce(xe),disabled:z,isValid:z||!re}),(0,u.jsx)(d.InputField,{label:`Max:`,type:`number`,style:de,value:z?String(N):le,min:W(Math.max(F,Q[0]+L),L),max:N,onChange:e=>ue(e.target.value),onBlur:Se,onKeyDown:Ce(Se),disabled:z,isValid:z||!ae})]})]}):(0,u.jsxs)(d.FilterPanelBase,{title:t,className:te,children:[z&&(0,u.jsxs)(`div`,{className:V.disabledMessage,children:[`No adjustable range (all results have the same value: `,M,`).`]}),(0,u.jsxs)(`div`,{style:{display:`flex`,gap:`10px`,alignItems:`flex-start`},children:[(0,u.jsx)(d.InputField,{label:`Min:`,type:`number`,style:de,value:z?String(M):se,min:M,max:W(Math.min(I,Q[1]-L),L),onChange:e=>ce(e.target.value),onBlur:xe,onKeyDown:Ce(xe),disabled:z,isValid:z||!re}),(0,u.jsx)(d.InputField,{label:`Max:`,type:`number`,style:de,value:z?String(N):le,min:W(Math.max(F,Q[0]+L),L),max:N,onChange:e=>ue(e.target.value),onBlur:Se,onKeyDown:Ce(Se),disabled:z,isValid:z||!ae})]})]}):(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.`]})})},q={list:`_list_apmmi_2`,grid:`_grid_apmmi_9`,count:`_count_apmmi_22`,countValue:`_countValue_apmmi_31`,chip:`_chip_apmmi_35`,error:`_error_apmmi_40`,active:`_active_apmmi_46`};function J(e,t){if(!t)return null;let n=0,r=!1;for(let i of t){let t=Number(i.key);if(!(Number.isNaN(t)||!e.contains(t))){if(typeof i.value!=`number`)return null;n+=i.value,r=!0}}return r?n:0}var te=({field:e,label:t,width:n,buckets:r,control:i,displayType:a,layout:o=`list`,showCount:s=!0,showEmpty:l=!1,limit:f,showActivePanel:p=!1,collapsible:m=!0,startCollapsed:h=!1})=>{let{state:{facets:g,filterableFields:_,facetableFields:v,bucketFilters:y,rangeBounds:b,facetStats:x,query:S},toggleBucketFilter:w,isFetchingInitial:T,allowEmptySearch:E}=C(),D=i??a??`checkbox`,O=g?.[e],k=y[e]??[],[A,j]=(0,c.useState)(f??1/0);(0,c.useEffect)(()=>{j(f??1/0)},[f,O]);let M=b?.[e]??x?.[e],N=(0,c.useMemo)(()=>{let e=[];if(M&&e.push(M.min,M.max),Array.isArray(O))for(let t of O)e.push(Number(t.key));return U(e.filter(Number.isFinite))},[M,O]),P=(0,c.useMemo)(()=>{let e=M?.min??-Number.MAX_VALUE,t=M?.max??Number.MAX_VALUE,i=(n,r,i)=>({label:i??(n===void 0?`up to ${r}`:r===void 0?`${n} and up`:`${n}-${r}`),range:{min:n??e,max:r??t},contains:e=>(n===void 0||e>=n)&&(r===void 0||e<=r)});if(r&&r.length>0)return r.map(e=>i(e.min,e.max,e.label));if(Array.isArray(n)){let e=[...n].sort((e,t)=>e-t),t=[];for(let n=0;n<e.length-1;n++)t.push(i(e[n],W(e[n+1]-N,N)));return t}if(typeof n==`number`&&n>0&&M){let e=[],t=Math.floor(M.min/n)*n;for(let r=t;r<=M.max;r=W(r+n,N))e.push(i(W(r,N),W(r+n-N,N)));return e}return[]},[r,n,M,N]);if(T||!g)return(0,u.jsx)(R,{title:t,rows:Math.max(1,Math.min(P.length||5,8)),collapsible:m,startCollapsed:h});if(!E&&!S)return null;if(!_?.includes(e))return(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,children:(0,u.jsxs)(`div`,{className:q.error,children:[`Cannot render buckets for "`,e,`": field is not filterable.`]})});let F=v?.includes(e)&&Array.isArray(O),I=e=>k.some(t=>t.min===e.range.min&&t.max===e.range.max),L=P.map(e=>({bucket:e,count:F?J(e,O):null}));if(l||(L=L.filter(e=>e.count!==0||I(e.bucket))),L.length===0)return null;let z=L.slice(0,A),B=(t,n)=>{let r=I(t),i=n===0&&!r,a=s&&(n??0)>0?`${n}`:``,c=()=>w(e,t.range,D===`radio`);if(D===`radio`){let n=(0,u.jsx)(d.RadioButton,{id:`${e}-${t.range.min}-${t.range.max}`,name:e,value:t.label,label:o===`grid`&&a?`${t.label} (${a})`:t.label,checked:r,onChange:c,disabled:i});return o===`list`?(0,u.jsxs)(`div`,{className:q.count,children:[n,(0,u.jsx)(`span`,{className:q.countValue,children:a})]}):n}if(D===`button`){let e=(0,u.jsx)(d.Button,{variant:r?`primary`:`secondary`,onClick:c,disabled:i,size:`micro`,className:q.chip,children:o===`grid`&&a?`${t.label} (${a})`:t.label});return o===`list`?(0,u.jsxs)(`div`,{className:q.count,children:[e,(0,u.jsx)(`span`,{className:q.countValue,children:a})]}):e}return o===`list`?(0,u.jsxs)(`div`,{className:q.count,children:[(0,u.jsx)(d.Checkbox,{label:t.label,score:``,checked:r,onChange:c,disabled:i}),(0,u.jsx)(`span`,{className:q.countValue,children:a})]}):(0,u.jsx)(d.Checkbox,{label:t.label,score:a?` (${a})`:``,checked:r,onChange:c,disabled:i})};return(0,u.jsx)(d.FilterPanelBase,{title:t,collapsible:m,collapsed:m?h:!1,className:p&&k.length>0?q.active:void 0,children:(0,u.jsxs)(`ul`,{className:o===`grid`?q.grid:q.list,style:{listStyle:`none`,padding:0,margin:0},children:[z.map(({bucket:e,count:t})=>(0,u.jsx)(`li`,{children:B(e,t)},`${e.range.min}-${e.range.max}`)),z.length<L.length&&(0,u.jsx)(`li`,{children:(0,u.jsx)(d.Button,{variant:`ghost`,size:`micro`,onClick:()=>j(L.length),children:`Show ${L.length-z.length} more of ${L.length} total`})})]})})},Y={grid:`_grid_1xjna_2`,chip:`_chip_1xjna_21`,chipLabel:`_chipLabel_1xjna_32`},X=(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:Y.chip,title:`${e}: ${t}`,children:(0,u.jsxs)(`span`,{className:Y.chipLabel,children:[e,`: `,t]})})})),Z=(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:Y.chip,title:`${e}: ${t} – ${n}`,children:(0,u.jsxs)(`span`,{className:Y.chipLabel,children:[e,`: `,t,` – `,n]})})})),ne=(0,c.memo)(({field:e,label: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:Y.chip,title:`${e}: ${t}`,children:(0,u.jsxs)(`span`,{className:Y.chipLabel,children:[e,`: `,t]})})}));function Q(){let{state:{filters:e,rangeFilters:t,bucketFilters:n},resetFilters:r,resetSingleFilter:i,resetRangeFilter:a,resetBucketFilter:o}=C(),s=(0,c.useMemo)(()=>Object.entries(e).map(([e,t])=>t.map(t=>({field:e,value:t}))).flat(),[e]),l=(0,c.useMemo)(()=>Object.entries(t).map(([e,{min:t,max:n}])=>({field:e,min:t,max:n})),[t]),f=(0,c.useMemo)(()=>Object.entries(n).flatMap(([e,t])=>t.map(t=>({field:e,range:t,label:`${t.min}-${t.max}`}))),[n]);return(0,c.useMemo)(()=>Object.keys(e).length>0||Object.keys(t).length>0||f.length>0,[e,t,f])?(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,title:`Active filters`,children:(0,u.jsxs)(`ul`,{className:Y.grid,children:[s.map(({field:e,value:t})=>(0,u.jsx)(X,{field:e,value:t,onReset:()=>i(e,t)},`${e}-${t}`)),l.map(({field:e,min:t,max:n})=>(0,u.jsx)(Z,{field:e,min:t,max:n,onReset:()=>a(e)},e)),f.map(({field:e,range:t,label:n})=>(0,u.jsx)(ne,{field:e,label:n,onReset:()=>o(e,t)},`${e}-${t.min}-${t.max}`)),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.Button,{onClick:r,size:`micro`,variant:`ghost`,children:`Reset`})})]})}):null}var $={select:`_select_nwf7i_1`,radioGroup:`_radioGroup_nwf7i_6`},re=({options:e,noneLabel:t=`None`,control:n,displayType:r,collapsible:i=!0,startCollapsed:a=!1})=>{let o=n??(r===`radio`?`radio`:`select`),{state:{sortableFields:s,sortBy:c,sortAscending:l},setSort:f,isFetchingInitial:p}=C();if(p)return(0,u.jsx)(R,{title:`Sort by`,rows:o===`radio`?3:1,collapsible:i,startCollapsed:a});if(!s||s.length===0)return null;let m=c?`${c}:${l?`asc`:`desc`}`:`none`,h=e?e.filter(e=>s.includes(e.field)?!0:(console.warn(`[SortByPanel] '${e.field}' is not sortable, so "${e.label}" is left out. Mark the field Sortable in the dataset's field configuration.`),!1)).map(e=>({label:e.label,value:`${e.field}:${e.ascending?`asc`:`desc`}`})):s.flatMap(e=>[{label:`${e} (asc)`,value:`${e}:asc`},{label:`${e} (desc)`,value:`${e}:desc`}]),g=t===null?h:[{label:t,value:`none`},...h],_=e=>{if(e===`none`||e===``)f(null,!0);else{let[t,n]=e.split(`:`);f(t,n===`asc`)}};return(0,u.jsx)(d.FilterPanelBase,{title:`Sort by`,collapsible:i,collapsed:i?a:!1,children:o===`select`?(0,u.jsx)(d.Select,{value:m,onValueChange:_,options:g,placeholder:`Select sort...`,"aria-label":`Sort by`}):(0,u.jsx)(`div`,{className:$.radioGroup,children:g.map(e=>(0,u.jsx)(d.RadioButton,{id:`sort-${e.value}`,name:`sort-by`,value:e.value,label:e.label,checked:m===e.value,onChange:e=>_(e.target.value)},e.value))})})},ie={list:`_list_1y4fk_1`},ae={coverageDepth:500,coverWholeQuery:!0,coverWholeWords:!0,coverFuzzyWords:!0,coverJoinedWords:!0,coverPrefixSuffix:!0,truncate:!0,includePatternMatches:!0,minWordSize:2,levenshteinMaxWordSize:20,truncateWordHitLimit:1,truncateWordHitTolerance:0,truncationScore:65024};function oe(){let{state:{searchSettings:e},setSearchSettings:t,url:n,team:r,dataset:i,authenticatedFetch:a}=C(),[o,s]=(0,c.useState)(!1),[l,p]=(0,c.useState)(null);(0,c.useEffect)(()=>{let e=!0;try{a(`${n}/api/teams/${r}/datasets/${i}/query-parameters`).then(e=>e.ok?e.json():null).then(t=>{e&&t?.effective&&p(t.effective)}).catch(()=>{})}catch{}return()=>{e=!1}},[n,r,i,a]);let m=e.coverageSetup,h=e=>m[e]!==void 0&&m[e]!==null,g=e=>m[e]??l?.coverageSetup?.[e]??ae[e],_=e.coverageDepth??l?.coverageDepth??ae.coverageDepth,v=l?`dataset`:`default`,y=(e,t)=>t?e:`${e} (${v})`,b=e.coverageDepth!==void 0||Object.keys(m).some(e=>h(e)),x=(e,n)=>{let r=parseInt(n,10);isNaN(r)||t({[e]:r})},S=(e,n)=>{t({[e]:n})},w=(n,r)=>{let i=parseInt(r,10);isNaN(i)||t({coverageSetup:{...e.coverageSetup,[n]:i}})},T=(n,r)=>{t({coverageSetup:{...e.coverageSetup,[n]:r}})};return(0,u.jsx)(d.FilterPanelBase,{collapsed:!0,title:`Settings`,children:(0,u.jsxs)(`ul`,{className:ie.list,children:[(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Max Results`,type:`number`,value:e.maxNumberOfRecordsToReturn.toString(),onChange:e=>x(`maxNumberOfRecordsToReturn`,e.target.value)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:y(`Coverage Depth`,e.coverageDepth!==void 0),type:`number`,value:_.toString(),onChange:e=>x(`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=>S(`showScore`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Enable Coverage`,checked:e.enableCoverage,onChange:e=>S(`enableCoverage`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Remove Duplicates`,checked:e.removeDuplicates,onChange:e=>S(`removeDuplicates`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.Button,{variant:`ghost`,size:`micro`,iconRight:o?(0,u.jsx)(f.ArrowDown,{}):(0,u.jsx)(f.ArrowRight,{}),onClick:()=>s(e=>!e),children:o?`Hide Coverage Setup`:`Show Coverage Setup`})}),o&&(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:y(`Cover Whole Query`,h(`coverWholeQuery`)),checked:g(`coverWholeQuery`),onChange:e=>T(`coverWholeQuery`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:y(`Cover Whole Words`,h(`coverWholeWords`)),checked:g(`coverWholeWords`),onChange:e=>T(`coverWholeWords`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:y(`Cover Fuzzy Words`,h(`coverFuzzyWords`)),checked:g(`coverFuzzyWords`),onChange:e=>T(`coverFuzzyWords`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:y(`Cover Joined Words`,h(`coverJoinedWords`)),checked:g(`coverJoinedWords`),onChange:e=>T(`coverJoinedWords`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:y(`Cover Prefix Suffix`,h(`coverPrefixSuffix`)),checked:g(`coverPrefixSuffix`),onChange:e=>T(`coverPrefixSuffix`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:y(`Truncate`,h(`truncate`)),checked:g(`truncate`),onChange:e=>T(`truncate`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:y(`Include Pattern Matches`,h(`includePatternMatches`)),checked:g(`includePatternMatches`),onChange:e=>T(`includePatternMatches`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:y(`Levenshtein Max Word Size`,h(`levenshteinMaxWordSize`)),type:`number`,value:g(`levenshteinMaxWordSize`).toString(),onChange:e=>w(`levenshteinMaxWordSize`,e.target.value)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:y(`Min Word Size`,h(`minWordSize`)),type:`number`,value:g(`minWordSize`).toString(),onChange:e=>w(`minWordSize`,e.target.value)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:y(`Truncate Word Hit Limit`,h(`truncateWordHitLimit`)),type:`number`,value:g(`truncateWordHitLimit`).toString(),onChange:e=>w(`truncateWordHitLimit`,e.target.value)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:y(`Truncate Word Hit Tolerance`,h(`truncateWordHitTolerance`)),type:`number`,value:g(`truncateWordHitTolerance`).toString(),onChange:e=>w(`truncateWordHitTolerance`,e.target.value)})}),b&&(0,u.jsx)(`li`,{children:(0,u.jsx)(d.Button,{variant:`ghost`,size:`micro`,onClick:()=>t({coverageSetup:void 0,coverageDepth:void 0}),children:`Use the dataset's values`})})]})]})})}var se=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 ce(e,t){let{url:n,team:r,dataset:i,authenticatedFetch:a}=C(),[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 le(e,t){let{url:n,team:r,dataset:i,authenticatedFetch:a}=C(),[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=Q,exports.BucketFilterPanel=te,exports.FilterPanelSkeleton=R,exports.IndxApiError=m,exports.RangeFilterPanel=K,exports.SearchContext=x,exports.SearchErrorBoundary=se,exports.SearchInput=w,exports.SearchProvider=S,exports.SearchResult=D,exports.SearchResultRow=F,exports.SearchResults=N,exports.SearchResultsSkeleton=A,exports.SearchSettingsPanel=oe,exports.SortByPanel=re,exports.ValueFilterPanel=B,exports.useHybridSearch=le,exports.useSearch=C,exports.useSearchContext=C,exports.useVectorSearch=ce;
|
|
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");var p=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)}},m=class extends Error{constructor(e){super(e),this.name=`SearchSetupError`}};function h(e,t){let n=e instanceof Error?e.message:String(e);if(e instanceof m)return{kind:`setup`,message:n,technical:n,retryable:!1};if(e instanceof TypeError)return{kind:`unreachable`,message:n,technical:`Network error: no response from the server. Check that it is running and that the url is right.`,retryable:!0};if(e instanceof p){let r={message:n,status:e.status,code:e.code,retryAfterSeconds:e.retryAfterSeconds},i=e.problem?.detail??e.problem?.title,a=t=>`${e.status}${e.code?` ${e.code}`:``}: ${t}`;switch(!0){case e.status===401:return{...r,kind:`unauthorized`,retryable:!1,technical:a(`the key is invalid or has expired. Create a new one in the web console.`)};case e.status===403:return{...r,kind:`forbidden`,retryable:!1,technical:a(`the key does not reach dataset "${t.dataset}" in team "${t.team}".`)};case e.status===404:return{...r,kind:`notFound`,retryable:!1,technical:a(i??`no dataset "${t.dataset}" in team "${t.team}".`)};case e.retryable:return{...r,kind:`notReady`,retryable:!0,technical:a(`the dataset is ${e.problem?.currentState?.toString().toLowerCase()??`not ready`}.`)};case e.status===409:return{...r,kind:`unavailable`,retryable:!1,technical:a(i??`the dataset cannot be searched now.`)};case e.status===429:return{...r,kind:`rateLimited`,retryable:!0,technical:a(i??`too many requests for this key.`)};case e.status>=500:return{...r,kind:`server`,retryable:!0,technical:a(i??`the server ran into a problem.`)};default:return{...r,kind:`unknown`,retryable:!0,technical:a(i??`the request failed.`)}}}return{kind:`unknown`,message:n,technical:n,retryable:!0}}function g({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)([]),[g,_]=(0,c.useState)([]),[v,y]=(0,c.useState)([]),[b,x]=(0,c.useState)({}),[S,C]=(0,c.useState)({}),[w,T]=(0,c.useState)({}),[E,D]=(0,c.useState)(0),[O,k]=(0,c.useState)(null),[A,j]=(0,c.useState)(null),[M,N]=(0,c.useState)(0);return(0,c.useEffect)(()=>{(async()=>{k(null),j(null),u(!0);try{if(!r)throw console.error(`[Auth] ❌ Missing bearer token`),console.error(`[Auth] 💡 Pass preAuthenticatedToken to SearchProvider (create a token on the Indx Dashboard)`),new m(`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`),new m(`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`),new m(`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)throw c.status===401?(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`),await p.fromResponse(`Dataset status`,c)):c.status===404?(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`),await p.fromResponse(`Dataset status`,c)):(console.error(`[Auth] ❌ Failed to get dataset status:`,c.status),await p.fromResponse(`Dataset status`,c));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[h,g,v,b]=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`),s(`${e}/api/teams/${t}/datasets/${n}/fields/configuration`).catch(()=>null)]);if(!h.ok)throw console.error(`[Auth] ❌ GetFilterableFields failed:`,h.status),await p.fromResponse(`Filterable fields`,h);if(!g.ok)throw console.error(`[Auth] ❌ GetFacetableFields failed:`,g.status),await p.fromResponse(`Facetable fields`,g);if(!v.ok)throw console.error(`[Auth] ❌ GetSortableFields failed:`,v.status),await p.fromResponse(`Sortable fields`,v);let[S,w,E]=await Promise.all([h.json().catch(e=>(console.error(`Failed to parse GetFilterableFields response:`,e),[])),g.json().catch(e=>(console.error(`Failed to parse GetFacetableFields response:`,e),[])),v.json().catch(e=>(console.error(`Failed to parse GetSortableFields response:`,e),[]))]);f(S||[]),_(w||[]),y(E||[]),D(d);let O={};if(b?.ok){let e=await b.json().catch(e=>(console.error(`Failed to parse GetFieldConfiguration response:`,e),[]));for(let t of e??[])t?.fieldName&&t?.fieldType&&(O[t.fieldName]=t.fieldType)}else i&&console.log(`[Auth] fields/configuration not available`,b?.status,`- every selected value will be sent as a value filter`);x(O);let k={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?k=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 A={};if(k.facets){for(let[e,t]of Object.entries(k.facets))if(Array.isArray(t)&&t.length>0){let n=t.map(e=>Number(e.key)).filter(e=>!isNaN(e));n.length>0&&(A[e]={min:Math.min(...n),max:Math.max(...n)})}}let j={};if(k.facets)for(let[e,t]of Object.entries(k.facets))Array.isArray(t)&&(j[e]=t.map(e=>e.key));C(A),T(j),i&&console.log(`[Auth] ✅ Initialization complete`)}catch(r){console.error(`[Auth] ❌ Initialization failed:`,r),(r instanceof Error||typeof r==`object`&&r&&`message`in r)&&console.error(`[Auth] 💡 Error:`,r.message),r instanceof TypeError&&r.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`)),k(r instanceof Error?r.message:String(r)),j(h(r,{team:t,dataset:n}))}finally{u(!1)}})()},[e,t,n,M]),{token:a,isFetchingInitial:s,authError:O,authErrorInfo:A,retry:()=>N(e=>e+1),initialFacetStats:S,initialFacetKeys:w,filterableFields:d,facetableFields:g,sortableFields:v,fieldTypes:b,totalDocumentCount:E}}async function _(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 p.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 v(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 _(`combine`,{a:o,b:e[s],useAndOperation:t===`and`},`CombineFilters`,n,r,i,a);return o}async function y(e,t,n,r,i,a,o={},s={},c={}){let l=Object.entries(e??{}).filter(([,e])=>e.length>0),u=Object.entries(t??{}),d=Object.entries(s??{}).filter(([,e])=>e.length>0),f=(e,{min:t,max:o})=>_(`range`,{fieldName:e,lowerLimit:t,upperLimit:o},`Range filter '${e}'`,n,r,i,a),p=(e,t)=>{let o=c[e]===`Number`?Number(t):NaN;return Number.isFinite(o)?f(e,{min:o,max:o}):_(`value`,{fieldName:e,value:t},`Value filter '${e}'`,n,r,i,a)},[m,h,g]=await Promise.all([Promise.all(l.map(async([e,t])=>v(await Promise.all(t.map(t=>p(e,t))),o[e]===`any`?`or`:`and`,n,r,i,a))),Promise.all(u.map(([e,t])=>f(e,t))),Promise.all(d.map(async([e,t])=>v(await Promise.all(t.map(t=>f(e,t))),`or`,n,r,i,a)))]);return v([...m,...h,...g],`and`,n,r,i,a)}function b(e,t){let n,r=(...r)=>{clearTimeout(n),n=setTimeout(()=>e(...r),t)};return r.cancel=()=>clearTimeout(n),r}function x({state:e,setState:t,authenticatedFetch:n,auth:r,url:i,team:a,dataset:o,allowEmptySearch:s,facetsEnabled:l,enableDebugLogs:u,shouldFetchMore:d,sessionId:f,source:m,count:g}){let _=(0,c.useRef)(0),v=(0,c.useRef)(void 0),x=(0,c.useRef)(!1),[S,C]=(0,c.useState)({}),[w,T]=(0,c.useState)(``),[E,D]=(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,fieldTypes:r.fieldTypes,fieldsSeeded:!0}))},[r.isFetchingInitial,r.initialFacetStats,r.totalDocumentCount,r.filterableFields,r.facetableFields,r.sortableFields,t]);let O=e.searchSettings.maxNumberOfRecordsToReturn,k=e.searchSettings.enableCoverage,A=e.searchSettings.removeDuplicates,j=e.searchSettings.coverageDepth,M=e.searchSettings.minimumScore,N=e.searchSettings.coverageSetup,P=e.sortBy,F=e.sortAscending,I=(0,c.useCallback)(async({enableFacets:c})=>{if(!r.token)return;let l=++_.current;if(t(e=>({...e,isLoading:!0})),e.query.trim()===``){if(!s)return;c=!0}try{let d=c?Array.from(new Set([...Object.keys(e.filters).filter(t=>e.valueMatch[t]===`any`&&(e.filters[t]?.length??0)>0),...Object.keys(e.bucketFilters).filter(t=>(e.bucketFilters[t]?.length??0)>0)])):[],[h,...v]=await Promise.all([y(e.filters,e.rangeFilters,i,a,o,n,e.valueMatch,e.bucketFilters,e.fieldTypes),...d.map(t=>y({...e.filters,[t]:[]},e.rangeFilters,i,a,o,n,e.valueMatch,{...e.bucketFilters,[t]:[]},e.fieldTypes))]),b=s||e.query.trim()!==``,x={text:e.query,enableCoverage:k,removeDuplicates:A,coverageDepth:j,coverageSetup:N},I={...x,maxNumberOfRecordsToReturn:b?O:0,enableFacets:c,...h?{filter:h}:{},...P?{sortBy:P}:{},...F===void 0?{}:{sortAscending:F}};u&&console.log(`[performSearch] request body:`,JSON.stringify(I,null,2));let L=new URLSearchParams({session:f});m&&L.set(`source`,m),g||L.set(`count`,`false`);let R=e=>n(`${i}/api/teams/${a}/datasets/${o}/search?${L}`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)}),[z,...B]=await Promise.all([R(I),...v.map(e=>R({...x,maxNumberOfRecordsToReturn:0,enableFacets:!0,...e?{filter:e}:{}}))]);if(!z.ok)throw await p.fromResponse(`Search`,z);let V=await z.json(),H=z.headers.get(`Indx-Query-Id`)??void 0,U=V.truncationIndex??-1,W={};for(let e=0;e<d.length;e++){let t=d[e];if(!B[e].ok)throw await p.fromResponse(`Facets for '${t}'`,B[e]);let n=await B[e].json();n.facets?.[t]!==void 0&&(W[t]=n.facets[t])}let G=V.records||[],K=G.map(e=>e.documentKey),ee=G.map(e=>e.score),q=[];if(b&&K.length>0){let e=await n(`${i}/api/teams/${a}/datasets/${o}/documents/lookup`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(K)});if(!e.ok)throw await p.fromResponse(`Document lookup`,e);q=(await e.json()).map((e,t)=>({document:e,documentKey:K[t],score:ee[t]}))}let J={};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&&(J[e]={min:Math.min(...n),max:Math.max(...n)})}}if(l!==_.current)return;let te=e.query!==w,Y=e.query!==E,X=e.facetStats??{};if(te?(X={...r.initialFacetStats,...J},C(X),T(e.query)):X={...S,...J},Y&&c){let n={...e.rangeBounds};for(let[e,t]of Object.entries(J))n[e]=t;t(e=>({...e,rangeBounds:n})),D(e.query)}let ne=Object.keys(W).length>0?{...V.facets??{},...W}:V.facets;if(c&&(!ne||Object.keys(ne).length===0)){ne={};for(let[e,t]of Object.entries(r.initialFacetKeys))ne[e]=t.map(e=>({key:e,value:null}))}let re=q.filter(t=>{let n=e.query.trim();return n===``||n.length===1?!0:t.score>=M}).map((e,t)=>({...e,position:t+1}));t(e=>({...e,results:re,error:void 0,errorInfo:void 0,resultsSuppressed:!b,...c?{facets:ne,facetStats:X}:{},isLoading:!1,truncationIndex:U,queryId:H}))}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!==_.current)return;t(t=>({...t,results:null,isLoading:!1,resultsSuppressed:!1,error:e instanceof Error?e.message:`Search failed`,errorInfo:h(e,{team:a,dataset:o})}))}},[e.query,e.filters,e.valueMatch,e.rangeFilters,e.bucketFilters,e.facetStats,P,F,O,k,A,j,N,M,n,r.initialFacetStats,r.initialFacetKeys,r.token,S,w,E,e.rangeBounds,i,a,o,s,u,t,f,m,g]);(0,c.useEffect)(()=>{v.current=I},[I]);let L=(0,c.useRef)(null);(0,c.useEffect)(()=>(L.current?.cancel(),L.current=b(()=>{u&&console.log(`Debounced searchWithFacets fired`),v.current?.({enableFacets:!0})},e.facetDebounceDelayMillis??500),()=>{L.current?.cancel()}),[e.facetDebounceDelayMillis]),(0,c.useEffect)(()=>{!r.isFetchingInitial&&r.token&&!x.current&&(s&&v.current?.({enableFacets:l}),x.current=!0)},[r.isFetchingInitial,r.token,s,l]),(0,c.useEffect)(()=>{if(!r.token||!x.current)return;let n=e.query.trim(),i=n===``&&s;if(n===``&&!s){e.resultsSuppressed||t(e=>({...e,resultsSuppressed:!0}));return}return i?(L.current?.cancel(),v.current?.({enableFacets:l})):l?(u&&console.log(`Search fired`),v.current?.({enableFacets:!1}),L.current?.()):v.current?.({enableFacets:!1}),()=>{L.current?.cancel()}},[e.query,s,l]),(0,c.useEffect)(()=>{if(!x.current||!r.token||e.filterRevision===0)return;let t=e.query.trim();!s&&t===``||v.current?.({enableFacets:l})},[e.filterRevision]),(0,c.useEffect)(()=>{if(!x.current||!r.token)return;let t=e.query.trim();!s&&t===``||v.current?.({enableFacets:l})},[P,F]);let R=(0,c.useRef)(!0),z=(0,c.useRef)(e.query);return(0,c.useEffect)(()=>{if(R.current){R.current=!1;return}if(z.current!==e.query||!x.current||!r.token)return;if(d.current){d.current=!1,v.current?.({enableFacets:!1});return}let t=e.query.trim();!s&&t===``||v.current?.({enableFacets:l})},[O,k,A,j,N,M]),(0,c.useEffect)(()=>{z.current=e.query},[e.query]),{retrySearch:(0,c.useCallback)(()=>{v.current?.({enableFacets:l})},[l])}}function S(){let e=globalThis.crypto;return e?.randomUUID?e.randomUUID():Math.random().toString(36).slice(2)+Date.now().toString(36)}var C=(0,c.createContext)(void 0),w=({children:e,url:t,team:n,dataset:r,allowEmptySearch:i=!1,maxResults:a=10,facetDebounceDelayMillis:o=500,enableFacets:s=!0,coverageDepth:l,removeDuplicates:d=!0,enableCoverage:f=!0,initialCoverageSetup:p={},enableDebugLogs:m=!1,preAuthenticatedToken:h,source:_,count:v=!0})=>{let y=(0,c.useRef)(!1),b=(0,c.useRef)(S()).current,w=(0,c.useRef)(a),[T,E]=(0,c.useState)({query:``,results:null,isLoading:!1,resultsSuppressed:!i,facetDebounceDelayMillis:o,filterableFields:[],facetableFields:[],sortableFields:[],fieldTypes:{},filters:{},valueMatch:{},rangeFilters:{},bucketFilters:{},filterRevision:0,fieldsSeeded:!1,facetStats:{},rangeBounds:{},searchSettings:{maxNumberOfRecordsToReturn:a,coverageDepth:l,enableCoverage:f,removeDuplicates:d,minimumScore:0,showScore:!0,placeholderText:`Type to search`,coverageSetup:{...p}}});(0,c.useEffect)(()=>{m&&console.log(`SearchContext mounted on client`)},[m]),(0,c.useEffect)(()=>{E(e=>({...e,facetDebounceDelayMillis:o}))},[o]);let[D]=(0,c.useState)(s),O=g({url:t,team:n,dataset:r,preAuthenticatedToken:h,enableDebugLogs:m}),k=(0,c.useCallback)((e,t={})=>{if(!O.token)throw Error(`No authentication token available`);return fetch(e,{...t,headers:{...t.headers,Authorization:`Bearer ${O.token}`}})},[O.token]),{retrySearch:A}=x({state:T,setState:E,authenticatedFetch:k,auth:O,url:t,team:n,dataset:r,allowEmptySearch:i,facetsEnabled:D,enableDebugLogs:m,shouldFetchMore:y,sessionId:b,source:_,count:v}),j=(0,c.useRef)(void 0);j.current=T.queryId;let M=(0,c.useCallback)(async e=>{if(O.token)try{let i=await k(`${t}/api/teams/${n}/datasets/${r}/events/select`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({queryId:j.current,documentKey:e.documentKey,position:e.position,...v?{}:{count:!1}})});m&&(i.ok?console.log(`[select] document ${e.documentKey} at position ${e.position}`):console.warn(`[select] not recorded: ${i.status}`))}catch(e){m&&console.warn(`[select] failed:`,e)}},[O.token,k,t,n,r,m,v]),N=(0,c.useCallback)(e=>{E(t=>{let n=Object.keys(t.filters).length>0,r=Object.keys(t.rangeFilters).length>0,i=Object.keys(t.bucketFilters).length>0;return{...t,query:e,filters:n?{}:t.filters,rangeFilters:r?{}:t.rangeFilters,bucketFilters:i?{}:t.bucketFilters,searchSettings:{...t.searchSettings,maxNumberOfRecordsToReturn:w.current}}})},[]),P=(0,c.useCallback)(e=>{E(t=>({...t,facetDebounceDelayMillis:e}))},[]),F=(0,c.useCallback)(e=>{typeof e.maxNumberOfRecordsToReturn==`number`&&(w.current=e.maxNumberOfRecordsToReturn),E(t=>{let n={...t.searchSettings,...e};return`coverageSetup`in e?e.coverageSetup?n.coverageSetup={...t.searchSettings.coverageSetup,...e.coverageSetup}:n.coverageSetup={}:n.coverageSetup=t.searchSettings.coverageSetup,{...t,searchSettings:n}})},[]),I=(0,c.useCallback)(e=>{y.current=!0,E(t=>({...t,searchSettings:{...t.searchSettings,maxNumberOfRecordsToReturn:e}}))},[]),L=(0,c.useCallback)((e,t,n=!1)=>{E(r=>{let i={...r.filters},a=i[e]||[],o=a.includes(t)?a.filter(e=>e!==t):n?[t]:[...a,t];return o.length?i[e]=o:delete i[e],{...r,filters:i,filterRevision:r.filterRevision+1}})},[]),R=(0,c.useCallback)((e,t)=>{E(n=>n.valueMatch[e]===t?n:{...n,valueMatch:{...n.valueMatch,[e]:t}})},[]),z=(0,c.useCallback)((e,t,n)=>{E(r=>({...r,rangeFilters:{...r.rangeFilters,[e]:{min:t,max:n}},filterRevision:r.filterRevision+1}))},[]),B=(0,c.useCallback)(()=>{E(e=>({...e,filters:{},rangeFilters:{},bucketFilters:{},filterRevision:e.filterRevision+1}))},[]),V=(0,c.useCallback)((e,t,n=!0)=>{E(r=>{let i={...r.filters},a=(i[e]||[]).filter(e=>e!==t);return a.length>0?i[e]=a:delete i[e],{...r,filters:i,filterRevision:r.filterRevision+ +!!n}})},[]),H=(0,c.useCallback)((e,t=!0)=>{E(n=>{if(!(e in n.rangeFilters))return n;let r={...n.rangeFilters};return delete r[e],{...n,rangeFilters:r,filterRevision:n.filterRevision+ +!!t}})},[]),U=(e,t)=>e.min===t.min&&e.max===t.max,W=(0,c.useCallback)((e,t,n=!1)=>{E(r=>{let i=r.bucketFilters[e]??[],a=i.some(e=>U(e,t))?i.filter(e=>!U(e,t)):n?[t]:[...i,t],o={...r.bucketFilters};return a.length>0?o[e]=a:delete o[e],{...r,bucketFilters:o,filterRevision:r.filterRevision+1}})},[]),G=(0,c.useCallback)((e,t,n=!0)=>{E(r=>{let i={...r.bucketFilters},a=t?(i[e]??[]).filter(e=>!U(e,t)):[];return a.length>0?i[e]=a:delete i[e],{...r,bucketFilters:i,filterRevision:r.filterRevision+ +!!n}})},[]),K=(0,c.useCallback)((e,t)=>{E(n=>({...n,sortBy:e||void 0,sortAscending:e?t:void 0}))},[]);return(0,u.jsx)(C.Provider,{value:{state:T,isFetchingInitial:O.isFetchingInitial||!T.fieldsSeeded,authError:O.authError??void 0,authErrorInfo:O.authErrorInfo??void 0,retry:O.authError?O.retry:A,allowEmptySearch:i,url:t,team:n,dataset:r,authenticatedFetch:k,setQuery:N,toggleFilter:L,setValueMatch:R,setRangeFilter:z,resetFilters:B,resetSingleFilter:V,resetRangeFilter:H,toggleBucketFilter:W,resetBucketFilter:G,setSort:K,setDebounceDelay:P,setSearchSettings:F,fetchMoreResults:I,selectResult:M,sessionId:b},children:e})},T=()=>{let e=(0,c.useContext)(C);if(!e)throw Error(`useSearchContext must be used within a SearchProvider`);return e},E=({className:e=``,autoFocus:t=!1,inputSize:n=`default`,showClear:r=!0,showFocus:i=!1,showStatus:a=!0,...o})=>{let{state:{query:s,filters:c,rangeFilters:l,bucketFilters:p,results:m,truncationIndex:h,searchSettings:g},setQuery:_,resetFilters:v}=T(),y=Object.values(c).reduce((e,t)=>e+t.length,0)+Object.keys(l).length+Object.values(p??{}).reduce((e,t)=>e+t.length,0),b=s.length>0,x=b&&m!==null&&m.length===0,S=b&&g.enableCoverage&&m!==null&&m.length>0&&h===-1,C=()=>{_(``),y>0&&v()};return(0,u.jsxs)(d.SearchField,{type:`text`,value:s,onChange:e=>_(e.target.value),placeholder:g.placeholderText,autoFocus:t,className:e,showSearchIcon:!0,inputSize:n,showFocusBorder:i,...o,children:[a&&x&&(0,u.jsx)(d.Chip,{children:`No results`}),a&&S&&(0,u.jsx)(d.Tooltip,{content:`No direct match. Showing the nearest results.`,children:(0,u.jsx)(`span`,{children:(0,u.jsx)(d.Chip,{icon:(0,u.jsx)(f.Fuzzy_search,{}),children:`Nearest`})})}),a&&y>0&&(0,u.jsx)(d.Tooltip,{content:`${y} filter${y===1?``:`s`} active`,children:(0,u.jsx)(`span`,{children:(0,u.jsx)(d.Chip,{icon:(0,u.jsx)(f.Filter,{}),color:`var(--CLightBlue)`,textColor:`#080809`,children:y})})}),r&&(b||y>0)&&(0,u.jsx)(d.Button,{variant:`ghost`,size:`micro`,onClick:C,"aria-label":y>0?`Clear search and filters`:`Clear search`,children:`Clear`})]})},D={message:`_message_1mgfk_1`,icon:`_icon_1mgfk_10`,title:`_title_1mgfk_15`,detail:`_detail_1mgfk_20`,technical:`_technical_1mgfk_25`,button:`_button_1mgfk_33`},O={unreachable:{icon:f.Cloud,title:`Search is unavailable`,detail:`The search server can’t be reached right now.`},unauthorized:{icon:f.Key,title:`Search is unavailable`,detail:`The search key was not accepted.`},forbidden:{icon:f.Lock,title:`Search is unavailable`,detail:`This search key doesn’t have access to these results.`},notFound:{icon:f.Search,title:`Nothing to search here`,detail:`The collection this page searches doesn’t exist.`},notReady:{icon:f.Hour_glass,title:`Search is getting ready`,detail:`Results will appear in a moment.`},unavailable:{icon:f.Warning,title:`Search is unavailable`,detail:`The collection can’t be searched right now.`},rateLimited:{icon:f.Speedometer,title:`Too many searches`,detail:`Wait a moment, then try again.`},server:{icon:f.Warning,title:`Something went wrong`,detail:`The search server ran into a problem.`},setup:{icon:f.Warning,title:`Search isn’t set up`,detail:`This page is missing part of its search setup.`},unknown:{icon:f.Warning,title:`Something went wrong`,detail:`The search couldn’t be completed.`}},k=({error:e,onRetry:t,hideTechnical:n=!1})=>{let{icon:r,title:i,detail:a}=O[e.kind];(0,c.useEffect)(()=>{if(e.kind!==`notReady`||!t)return;let n=setTimeout(t,(e.retryAfterSeconds??2)*1e3);return()=>clearTimeout(n)},[e,t]);let o=e.retryable&&e.kind!==`notReady`&&t;return(0,u.jsxs)(`div`,{className:D.message,role:`alert`,children:[(0,u.jsx)(`span`,{className:D.icon,children:(0,u.jsx)(r,{size:70,color:`var(--lv4)`})}),(0,u.jsx)(`div`,{className:D.title,children:i}),(0,u.jsx)(`div`,{className:D.detail,children:a}),!n&&(0,u.jsx)(`code`,{className:D.technical,children:e.technical}),o&&(0,u.jsx)(d.Button,{variant:`secondary`,size:`micro`,className:D.button,onClick:t,children:`Try again`})]})},A={placeholder:`_placeholder_ee9qi_1`,invalid:`_invalid_ee9qi_11`},j={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`},M=({skeleton:e=!1,index:t,score:n,showScore:r=!1,children:i,skeletonDelay:a=0,skeletonWidths:o=[62,38]})=>(0,u.jsxs)(`div`,{className:j.row,children:[t!==void 0&&(0,u.jsx)(`div`,{className:j.indexNumber,children:t}),(0,u.jsx)(`div`,{className:j.content,children:e?(0,u.jsxs)(`div`,{className:j.skeletonBars,children:[(0,u.jsx)(`div`,{className:j.skeletonBarLg,style:{width:`${o[0]}%`,animationDelay:`${a}s`}}),(0,u.jsx)(`div`,{className:j.skeletonBarSm,style:{width:`${o[1]}%`,animationDelay:`${a+.05}s`}})]}):i}),r&&n!==void 0&&(0,u.jsx)(`div`,{className:j.scoreNumber,children:n})]}),N={wrapper:`_wrapper_81m3c_6`,skeletonAppear:`_skeletonAppear_81m3c_1`},P=[[62,38],[75,45],[58,33],[70,42],[65,50],[55,35],[72,40],[60,30]],F=({rows:e=6})=>(0,u.jsx)(`div`,{className:N.wrapper,children:Array.from({length:e}).map((e,t)=>(0,u.jsx)(M,{skeleton:!0,skeletonDelay:t*.1,skeletonWidths:P[t%P.length]},t))}),I=/^\[\s*(?:'[^']*'(?:\s*,\s*'[^']*')*)?\s*\]$/;function L(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(!I.test(t))return;let n=[],r=/'([^']*)'/g,i;for(;(i=r.exec(t))!==null;)n.push(i[1]);return n}var R=({fields:e,resultsPerPage:t,parseArrayStrings:n=!1,children:r})=>{let{state:{results:i,resultsSuppressed:a,searchSettings:o,truncationIndex:s,query:l,error:p,errorInfo:m},isFetchingInitial:h,authError:g,authErrorInfo:_,retry:v,allowEmptySearch:y,fetchMoreResults:b,selectResult:x}=T(),S=t??30,[C,w]=(0,c.useState)(S),E=(0,c.useRef)(0),D=(0,c.useRef)(``);(0,c.useEffect)(()=>{let e=l!==D.current;(!i||i.length<E.current||e)&&w(S),E.current=i?.length??0,D.current=l},[i,S,l]);let O=i&&i.length>C,j=()=>{let e=C+S;w(e),i&&e>=i.length&&(!s||s===-1||s>i.length)&&b(i.length+S)};if(h)return y?(0,u.jsx)(F,{rows:S}):(0,u.jsx)(`div`,{className:A.placeholder,children:(0,u.jsx)(f.Indx,{size:200,color:`var(--lv5)`})});let N=g??p;return N?(0,u.jsx)(k,{error:(g?_:m)??{kind:`unknown`,message:N,technical:N,retryable:!1},onRetry:v}):a||i===null?(0,u.jsx)(`div`,{className:A.placeholder,children:(0,u.jsx)(f.Indx,{size:200,color:`var(--lv5)`})}):i.length===0?null:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(`div`,{children:(i??[]).slice(0,C).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:A.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=L(t);n&&(l[e]=n)}}return(0,u.jsx)(M,{index:i,score:s,showScore:o.showScore,children:r(l,{result:t,select:()=>x?.(t)??Promise.resolve()})},i)})}),O&&(0,u.jsx)(`div`,{style:{textAlign:`center`,marginTop:`20px`},children:(0,u.jsx)(d.Button,{variant:`secondary`,size:`micro`,onClick:j,children:l.trim()===``?`Load more`:s!==-1&&s!==void 0&&s>0?`Load results ${C+1}-${Math.min(C+S,i.length,s)} of ${s}`:`Load more`})})]})},z={row:`_row_ujwhc_1`,title:`_title_ujwhc_8`},B=({variant:e=`default`,children:t})=>(0,u.jsx)(`div`,{className:[z.row,e===`title`?z.title:``].filter(Boolean).join(` `),children:t}),V={bar:`_bar_4nxla_12`,skeletonAppear:`_skeletonAppear_4nxla_1`,fade:`_fade_4nxla_1`,listRows:`_listRows_4nxla_19`,sliderArea:`_sliderArea_4nxla_25`,sliderTrack:`_sliderTrack_4nxla_32`,inputRow:`_inputRow_4nxla_40`,inputBar:`_inputBar_4nxla_45`,histogramRow:`_histogramRow_4nxla_55`},H=[65,80,55,72,60,75,50,68],U=({title:e,rows:t=5,variant:n=`list`,withHistogram:r=!1,collapsible:i=!0,startCollapsed:a=!1})=>(0,u.jsx)(d.FilterPanelBase,{title:e,collapsible:i,collapsed:a,children:n===`slider`?(0,u.jsxs)(`div`,{className:V.sliderArea,children:[r&&(0,u.jsx)(`div`,{className:V.histogramRow}),(0,u.jsx)(`div`,{className:V.sliderTrack}),(0,u.jsxs)(`div`,{className:V.inputRow,children:[(0,u.jsx)(`div`,{className:V.inputBar,style:{animationDelay:`0.1s`}}),(0,u.jsx)(`div`,{className:V.inputBar,style:{animationDelay:`0.15s`}})]})]}):(0,u.jsx)(`div`,{className:V.listRows,children:Array.from({length:t}).map((e,t)=>(0,u.jsx)(`div`,{className:V.bar,style:{width:`${H[t%H.length]}%`,animationDelay:`${t*.05}s`}},t))})}),W={list:`_list_18vbb_2`,count:`_count_18vbb_7`,countValue:`_countValue_18vbb_17`,chip:`_chip_18vbb_22`,chipLabel:`_chipLabel_18vbb_32`,grid:`_grid_18vbb_40`,active:`_active_18vbb_54`},G={notice:`_notice_4sel0_1`,technical:`_technical_4sel0_9`},K=({label:e,field:t,missing:n})=>{let r=n.map(e=>e[0].toUpperCase()+e.slice(1)).join(` and `);return(0,c.useEffect)(()=>{console.warn(`[intrface] The panel for "${t}" is hidden: the field is not ${r}. Mark it ${r} in the dataset's field configuration (web console → Fields).`)},[t,r]),(0,u.jsx)(d.FilterPanelBase,{title:e??t,collapsible:!1,children:(0,u.jsxs)(`div`,{className:G.notice,children:[(0,u.jsx)(`span`,{children:`Not available`}),(0,u.jsxs)(`code`,{className:G.technical,children:[t,`: not `,r]})]})})},ee=({field:e,label:t,preserveBlankFacetState:n=!1,preserveBlankFacetStateOrder:r=!1,sortFacetsBy:i=`histogram`,limit:a=10,collapsible:o=!0,startCollapsed:s=!1,control:l,displayType:f,layout:p=`list`,showActivePanel:m=!1,showCount:h=!0,showNull:g=!1,match:_=`all`,displayIfEmptyQuery:v=!0,displayCondition:y=e=>!0})=>{let{state:{facets:b,filterableFields:x,facetableFields:S,filters:C,query:w},toggleFilter:E,setValueMatch:D,authError:O,isFetchingInitial:k,allowEmptySearch:A}=T(),j=l??f??`checkbox`,M=j===`radio`?`any`:_;(0,c.useEffect)(()=>{D(e,M)},[e,M,D]);let N=(0,c.useRef)(null),[P,F]=(0,c.useState)(a);if((0,c.useEffect)(()=>{F(a)},[b?.[e],a]),!A&&!w||O)return null;if(k||!b)return j===`toggle`?(0,u.jsx)(U,{rows:1,collapsible:!1}):(0,u.jsx)(U,{title:t,rows:Math.min(a,6),collapsible:o,startCollapsed:s});if(!y({query:w??``,filters:C,facets:b})||!v&&!w&&Object.keys(C).length<1)return null;if(!x?.includes(e)||!S?.includes(e)){let n=[];return x?.includes(e)||n.push(`filterable`),S?.includes(e)||n.push(`facetable`),(0,u.jsx)(K,{label:t,field:e,missing:n})}let I=b?.[e]??(j===`toggle`?[]:void 0);if(!I||!Array.isArray(I))return null;let L=C?.[e]??[];n&&!N.current&&I.length>0&&(N.current=I.reduce((e,t)=>(e[t.key]=t.value,e),{}));let R=new Map;n&&N.current&&Object.keys(N.current).forEach(e=>{R.set(e,0)}),I.forEach(e=>{R.set(e.key,e.value)});let z=new Set([`true`,`false`,`null`]),B=Array.from(R.keys()),V=j===`toggle`&&(B.length>0&&B.every(e=>z.has(e))||B.length===0&&L.length>0);if(V&&R.has(`null`)){let e=R.get(`null`)??0,t=R.get(`false`)??0;R.set(`false`,t+e),R.delete(`null`)}if(j===`toggle`&&!V)return(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,children:(0,u.jsx)(`div`,{className:W.count,children:(0,u.jsx)(d.ToggleSwitch,{label:t,checked:!1,onChange:()=>{},disabled:!0})})});if(V){let n=R.get(`true`),r=typeof n==`number`?n:null,i=L.includes(`true`),a=r===0&&!i,o=h&&(r??0)>0?`${r}`:``;return(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,children:(0,u.jsxs)(`div`,{className:W.count,children:[(0,u.jsx)(d.ToggleSwitch,{label:t,checked:i,onChange:()=>E(e,`true`),disabled:a}),` `,o]})})}let H=Array.from(R.entries());if(g||(H=H.filter(([e])=>e!==`null`)),H.length===0&&!n)return null;if(!r)if(i===`alphabetical`){let e=H.filter(([,e])=>typeof e==`number`&&e>0).sort(([e],[t])=>e.localeCompare(t)),t=H.filter(([,e])=>e===0||e===null).sort(([e],[t])=>e.localeCompare(t));H=[...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=H.filter(([,e])=>typeof e==`number`&&e>0).sort(([t],[n])=>e(t,n)),n=H.filter(([,e])=>e===0||e===null).sort(([t],[n])=>e(t,n));H=[...t,...n]}else{let e=H.filter(([,e])=>typeof e==`number`&&e>0),t=H.filter(([,e])=>e===0||e===null);H=[...e,...t]}let G=typeof a==`number`&&H.length>a,ee=G?H.slice(0,P):H,q=(t,n)=>{let r=L.includes(t),i=n===0,a=h&&(n??0)>0?` (${n})`:``,o=h&&(n??0)>0?n:``,s=()=>E(e,t,j===`radio`);switch(j){case`button`:return p===`list`?(0,u.jsxs)(`div`,{className:W.count,children:[(0,u.jsx)(d.Button,{variant:r?`primary`:`secondary`,onClick:s,disabled:i,size:`micro`,className:W.chip,title:t,children:(0,u.jsx)(`span`,{className:W.chipLabel,children:t})}),(0,u.jsx)(`span`,{className:W.countValue,children:o})]}):(0,u.jsx)(d.Button,{variant:r?`primary`:`secondary`,onClick:s,disabled:i,size:`micro`,className:W.chip,title:`${t}${a}`,children:(0,u.jsx)(`span`,{className:W.chipLabel,children:`${t}${a}`})});case`toggle`:return(0,u.jsx)(d.ToggleSwitch,{label:t,checked:r,onChange:s,disabled:i});case`radio`:{let n=(0,u.jsx)(d.RadioButton,{id:`${e}-${t}`,name:e,value:t,label:p===`grid`?`${t}${a}`:t,checked:r,onChange:s,disabled:i});return p===`list`?(0,u.jsxs)(`div`,{className:W.count,children:[n,(0,u.jsx)(`span`,{className:W.countValue,children:o})]}):n}default:return p===`list`?(0,u.jsxs)(`div`,{className:W.count,children:[(0,u.jsx)(d.Checkbox,{label:t,score:``,checked:r,onChange:s,disabled:i}),(0,u.jsx)(`span`,{className:W.countValue,children:o})]}):(0,u.jsx)(d.Checkbox,{label:t,score:a,checked:r,onChange:s,disabled:i})}};return(0,u.jsx)(d.FilterPanelBase,{title:t,collapsible:o,collapsed:o?s:!1,className:m&&L.length>0?W.active:void 0,children:(0,u.jsxs)(`ul`,{className:p===`grid`?W.grid:W.list,style:{listStyle:`none`,padding:0,margin:0},children:[ee.map(([e,t])=>(0,u.jsx)(`li`,{children:q(e,t)},e)),G&&P<H.length&&(()=>{let e=H.length-P,t=Math.min(50,e);return(0,u.jsx)(`li`,{className:W.toggleItem,children:(0,u.jsx)(d.Button,{variant:`ghost`,size:`micro`,onClick:()=>F(e=>e+50),children:`Show ${t} more of ${H.length} total`})})})()]})})},q={disabledMessage:`_disabledMessage_adany_1`,histogram:`_histogram_adany_6`,histogramLayer:`_histogramLayer_adany_14`,histogramLive:`_histogramLive_adany_22`,histogramLit:`_histogramLit_adany_23`,histogramFill:`_histogramFill_adany_30`,histogramBar:`_histogramBar_adany_43`,histogramSeparators:`_histogramSeparators_adany_61`,histogramSeparator:`_histogramSeparator_adany_48`,active:`_active_adany_76`};function J(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 te(e){let t=0;for(let n of e)t=Math.max(t,J(n));return t===0?1:Number((10**-t).toFixed(t))}function Y(e,t){return Number(e.toFixed(J(t)))}function X(e,t,n){let r=t+Math.round((e-t)/n)*n;return Number(r.toFixed(J(n)))}function ne(e,t,n){let r=Math.ceil(Number(((e-t)/n).toFixed(6)));return Number((t+r*n).toFixed(J(n)))}var re=({field:e,label:t,expectedMin:n=0,expectedMax:r=1e3,control:i,displayType:a,showActivePanel:o=!1,collapsible:s=!0,startCollapsed:l=!1,showHistogram:f=!1,resolution:p,step:m,stepMarks:h})=>{let{state:{rangeFilters:g,rangeBounds:_,facetStats:v,facets:y,filterableFields:b,facetableFields:x,query:S,facetDebounceDelayMillis:C},setRangeFilter:w,resetRangeFilter:E,allowEmptySearch:D,authError:O,isFetchingInitial:k}=T(),A=i??a??`input`,j=_?.[e]!==void 0,M=_?.[e]??{min:n,max:r},N=M.min,P=M.max,F=v?.[e]??M,I=Math.max(N,Math.min(P,F.min)),L=Math.max(N,Math.min(P,F.max)),R=c.default.useMemo(()=>{if(m)return m;let t=Math.max(J(N),J(P)),n=y?.[e];if(Array.isArray(n))for(let e of n)t=Math.max(t,J(Number(e.key)));return t===0?1:Number((10**-t).toFixed(t))},[m,N,P,y,e]),z=j&&N===P,B=z?n:N,V=z?r:P,H=ne(V+R,B,R),W=e=>Math.min(H,Math.max(B,e)),G=g?.[e],ee=o&&G!==void 0?q.active:void 0,te=G?G.min:N,re=G?G.max:P,Z=G!==void 0,ie=I!==N||L!==P,[Q,$]=c.default.useState([te,re]),[ae,oe]=c.default.useState(!1),[se,ce]=c.default.useState(!1),[le,ue]=c.default.useState(String(te)),[de,fe]=c.default.useState(String(re)),pe=c.default.useMemo(()=>{let e=J(R);return{width:`calc(${Math.max(3,N.toFixed(e).length,P.toFixed(e).length,le.length,de.length)+1}ch + 20px)`}},[R,N,P,le,de]);c.default.useEffect(()=>{ue(String(Q[0])),fe(String(Q[1]))},[Q]);let{finalMin:me,finalMax:he,isValidMin:ge,isValidMax:_e}=c.default.useMemo(()=>{let[e,t]=Q,n=Math.max(N,Math.min(P,e)),r=Math.max(N,Math.min(P,t)),i=Math.min(n,r),a=Math.max(n,r);return{finalMin:i,finalMax:a,isValidMin:i>=N&&i<=a,isValidMax:a<=P&&a>=i}},[Q,N,P]);c.default.useEffect(()=>{if(z)return;if(Q[0]===N&&Q[1]===P){oe(!1),ce(!1);return}let t=C??500,n=setTimeout(()=>{oe(!ge),ce(!_e)},300),r=setTimeout(()=>{ge&&_e&&(me===N&&he===P?E(e,!1):w(e,me,he))},t);return()=>{clearTimeout(n),clearTimeout(r)}},[me,he,ge,_e,N,P,e,E,w,C,z]),c.default.useEffect(()=>{$([te,re]),oe(!1),ce(!1)},[te,re,e]);let ve=c.default.useCallback(e=>{let t=Y(Math.min(e[0],e[1]-R),R);return[t,Y(Math.max(e[1]-R,t),R)]},[R]),ye=c.default.useCallback(e=>{if(z)return;let[t,n]=ve(e);$([Math.max(N,Math.min(L,t)),Math.max(I,Math.min(P,n))])},[z,ve,N,P,I,L]),be=c.default.useCallback(t=>{if(z)return;let[n,r]=ve(t),i=Math.max(N,Math.min(L,n)),a=Math.max(I,Math.min(P,r));i===N&&a===P?($([N,P]),E(e,!0)):$([i,a])},[z,ve,N,P,I,L,e,E]),xe=c.default.useRef(null),Se=c.default.useCallback((t,n)=>{if(z)return;let r=xe.current;if(G&&r&&r.start===t&&r.last===n){xe.current=null,$([N,P]),E(e,!0);return}let i=X(Math.max(N,I,t),N,R),a=Math.max(i,X(Math.min(P,L,n),N,R));xe.current={start:t,last:n},$([i,a])},[z,G,N,P,I,L,R,e,E]),Ce=c.default.useCallback(()=>{if(z)return;let e=le.trim(),t=e===``?NaN:Number(e);if(isNaN(t)){ue(String(Q[0]));return}let n=Math.max(N,Math.min(L,t));n<Q[1]?$([n,Q[1]]):$([N,Q[1]]),ue(String(n<Q[1]?n:N))},[z,le,Q,N,L]),we=c.default.useCallback(()=>{if(z)return;let e=de.trim(),t=e===``?NaN:Number(e);if(isNaN(t)){fe(String(Q[1]));return}let n=Math.max(I,Math.min(P,t));n>Q[0]?$([Q[0],n]):$([Q[0],P]),fe(String(n>Q[0]?n:P))},[z,de,Q,I,P]),Te=e=>t=>{t.key===`Enter`&&e()},[Ee,De]=c.default.useState(null),Oe=c.default.useRef(null);c.default.useEffect(()=>{if(!f)return;let t=`${N}:${P}`;if(t===Oe.current&&Oe.current!==null)return;let n=y?.[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&&(Oe.current=t,De(r))},[N,P,y,e,f]);let ke=c.default.useMemo(()=>{if(!f||!Ee||Ee.length===0)return[];let e=P-N;if(e<=0)return[];let t=p??Math.max(R,Y(Math.ceil(e/20/R)*R,R)),n=Math.ceil(e/t);return Array.from({length:n},(e,r)=>{let i=N+r*t,a=N+(r+1)*t,o=r===n-1,s=Ee.filter(e=>{let t=Number(e.key);return t>=i&&(t<a||o&&t<=P)}).reduce((e,t)=>e+t.value,0),c=o?P:Y(a-R,R);return{bucketStart:i,bucketEnd:a,count:s,last:c,barEnd:Y(c+R,R)}}).map((e,t,n)=>({...e,span:(t+1<n.length?n[t+1].bucketStart:Math.max(e.barEnd,H))-e.bucketStart}))},[f,Ee,N,P,p,R,H]),Ae=c.default.useMemo(()=>Math.max(...ke.map(e=>e.count),1),[ke]);return f&&!k&&!x?.includes(e)&&console.warn(`RangeFilterPanel: showHistogram=true but field "${e}" is not facetable. Add .Facetable = true to this field.`),O?null:k?(0,u.jsx)(U,{title:t,variant:`slider`,withHistogram:f,collapsible:s,startCollapsed:l}):!D&&!S?null:b?.includes(e)?A===`slider`?(0,u.jsxs)(d.FilterPanelBase,{title:t,collapsed:l,collapsible:s,className:ee,children:[z&&(0,u.jsxs)(`div`,{className:q.disabledMessage,children:[`No adjustable range (all results have the same value: `,N,`).`]}),f&&ke.length===0&&(0,u.jsx)(`div`,{className:q.histogram}),f&&ke.length>0&&(()=>{let[e,t]=L>I&&(I>N||L<P)?[I,L]:[B,V],n=Math.max(me,e),r=Math.min(he,t),i=H,a=i-B||1,o=e=>Math.max(0,Math.min(1,(e-B)/a)),s=e=>e>=V?0:Math.max(0,Math.min(1,(i-(e+R))/a)),c=o(n),l=r<n?1-c:s(r),d=e=>`calc(10px + (100% - 20px) * ${e})`,f=`inset(0 ${d(l)} 0 ${d(c)})`,p=`inset(0 ${d(s(t))} 0 ${d(o(e))})`,m=n=>n.last<e||n.bucketStart>t,h=ke.slice(1).map(e=>d((e.bucketStart-B)/a)),g=ke.map(e=>({...e,height:Math.max(1,Math.ceil(e.count/Ae*20))}));return(0,u.jsxs)(`div`,{className:q.histogram,children:[(0,u.jsx)(`div`,{className:q.histogramLayer,children:g.map((e,t)=>(0,u.jsx)(`button`,{type:`button`,className:q.histogramBar,style:{flexGrow:e.span},"data-testid":`histogram-bar`,disabled:z||m(e),"aria-label":`${e.bucketStart} to ${e.last}: ${e.count}`,title:`${e.bucketStart} to ${e.last}: ${e.count}`,onClick:()=>Se(e.bucketStart,e.last),children:(0,u.jsx)(`span`,{className:q.histogramFill,style:{height:`${e.height}px`}})},t))}),(0,u.jsx)(`div`,{className:`${q.histogramLayer} ${q.histogramLive}`,"aria-hidden":`true`,"data-testid":`histogram-live`,style:{clipPath:p},children:g.map((e,t)=>(0,u.jsx)(`span`,{className:q.histogramBar,style:{flexGrow:e.span},children:(0,u.jsx)(`span`,{className:q.histogramFill,style:{height:`${e.height}px`}})},t))}),(0,u.jsx)(`div`,{className:`${q.histogramLayer} ${q.histogramLit}`,"aria-hidden":`true`,"data-testid":`histogram-lit`,style:{clipPath:f},children:g.map((e,t)=>(0,u.jsx)(`span`,{className:q.histogramBar,style:{flexGrow:e.span},children:(0,u.jsx)(`span`,{className:q.histogramFill,style:{height:`${e.height}px`}})},t))}),(0,u.jsx)(`div`,{className:q.histogramSeparators,"aria-hidden":`true`,children:h.map((e,t)=>(0,u.jsx)(`span`,{className:q.histogramSeparator,style:{left:e}},t))})]})})(),(0,u.jsx)(`div`,{style:{padding:`10px 10px 20px 10px`},children:(0,u.jsx)(d.Slider,{min:B,max:H,step:R,stepMarks:h,value:z?[B,H]:[W(X(me,B,R)),W(X(he+R,B,R))],isRange:!0,onChange:e=>ye(e),onFinalChange:e=>be(e),disabled:z,activeMin:I,activeMax:W(Y(L+R,R)),isFaceted:ie,highlightFaceted:Z,"aria-label":t||`Filter by ${e}`})}),(0,u.jsxs)(`div`,{style:{display:`flex`,gap:`10px`,alignItems:`flex-start`,justifyContent:`space-between`},children:[(0,u.jsx)(d.InputField,{label:`Min:`,type:`number`,style:pe,value:z?String(N):le,min:N,max:Y(Math.min(L,Q[1]-R),R),onChange:e=>ue(e.target.value),onBlur:Ce,onKeyDown:Te(Ce),disabled:z,isValid:z||!ae}),(0,u.jsx)(d.InputField,{label:`Max:`,type:`number`,style:pe,value:z?String(P):de,min:Y(Math.max(I,Q[0]+R),R),max:P,onChange:e=>fe(e.target.value),onBlur:we,onKeyDown:Te(we),disabled:z,isValid:z||!se})]})]}):(0,u.jsxs)(d.FilterPanelBase,{title:t,className:ee,children:[z&&(0,u.jsxs)(`div`,{className:q.disabledMessage,children:[`No adjustable range (all results have the same value: `,N,`).`]}),(0,u.jsxs)(`div`,{style:{display:`flex`,gap:`10px`,alignItems:`flex-start`},children:[(0,u.jsx)(d.InputField,{label:`Min:`,type:`number`,style:pe,value:z?String(N):le,min:N,max:Y(Math.min(L,Q[1]-R),R),onChange:e=>ue(e.target.value),onBlur:Ce,onKeyDown:Te(Ce),disabled:z,isValid:z||!ae}),(0,u.jsx)(d.InputField,{label:`Max:`,type:`number`,style:pe,value:z?String(P):de,min:Y(Math.max(I,Q[0]+R),R),max:P,onChange:e=>fe(e.target.value),onBlur:we,onKeyDown:Te(we),disabled:z,isValid:z||!se})]})]}):(0,u.jsx)(K,{label:t,field:e,missing:[`filterable`]})},Z={list:`_list_9je85_2`,grid:`_grid_9je85_9`,count:`_count_9je85_22`,countValue:`_countValue_9je85_31`,chip:`_chip_9je85_35`,active:`_active_9je85_41`};function ie(e,t){if(!t)return null;let n=0,r=!1;for(let i of t){let t=Number(i.key);if(!(Number.isNaN(t)||!e.contains(t))){if(typeof i.value!=`number`)return null;n+=i.value,r=!0}}return r?n:0}var Q=({field:e,label:t,width:n,buckets:r,control:i,displayType:a,layout:o=`list`,showCount:s=!0,showEmpty:l=!1,limit:f,showActivePanel:p=!1,collapsible:m=!0,startCollapsed:h=!1})=>{let{state:{facets:g,filterableFields:_,facetableFields:v,bucketFilters:y,rangeBounds:b,facetStats:x,query:S},toggleBucketFilter:C,authError:w,isFetchingInitial:E,allowEmptySearch:D}=T(),O=i??a??`checkbox`,k=g?.[e],A=y[e]??[],[j,M]=(0,c.useState)(f??1/0);(0,c.useEffect)(()=>{M(f??1/0)},[f,k]);let N=b?.[e]??x?.[e],P=(0,c.useMemo)(()=>{let e=[];if(N&&e.push(N.min,N.max),Array.isArray(k))for(let t of k)e.push(Number(t.key));return te(e.filter(Number.isFinite))},[N,k]),F=(0,c.useMemo)(()=>{let e=N?.min??-Number.MAX_VALUE,t=N?.max??Number.MAX_VALUE,i=(n,r,i)=>({label:i??(n===void 0?`up to ${r}`:r===void 0?`${n} and up`:`${n}-${r}`),range:{min:n??e,max:r??t},contains:e=>(n===void 0||e>=n)&&(r===void 0||e<=r)});if(r&&r.length>0)return r.map(e=>i(e.min,e.max,e.label));if(Array.isArray(n)){let e=[...n].sort((e,t)=>e-t),t=[];for(let n=0;n<e.length-1;n++)t.push(i(e[n],Y(e[n+1]-P,P)));return t}if(typeof n==`number`&&n>0&&N){let e=[],t=Math.floor(N.min/n)*n;for(let r=t;r<=N.max;r=Y(r+n,P))e.push(i(Y(r,P),Y(r+n-P,P)));return e}return[]},[r,n,N,P]);if(w)return null;if(E||!g)return(0,u.jsx)(U,{title:t,rows:Math.max(1,Math.min(F.length||5,8)),collapsible:m,startCollapsed:h});if(!D&&!S)return null;if(!_?.includes(e))return(0,u.jsx)(K,{label:t,field:e,missing:[`filterable`]});let I=v?.includes(e)&&Array.isArray(k),L=e=>A.some(t=>t.min===e.range.min&&t.max===e.range.max),R=F.map(e=>({bucket:e,count:I?ie(e,k):null}));if(l||(R=R.filter(e=>e.count!==0||L(e.bucket))),R.length===0)return null;let z=R.slice(0,j),B=(t,n)=>{let r=L(t),i=n===0&&!r,a=s&&(n??0)>0?`${n}`:``,c=()=>C(e,t.range,O===`radio`);if(O===`radio`){let n=(0,u.jsx)(d.RadioButton,{id:`${e}-${t.range.min}-${t.range.max}`,name:e,value:t.label,label:o===`grid`&&a?`${t.label} (${a})`:t.label,checked:r,onChange:c,disabled:i});return o===`list`?(0,u.jsxs)(`div`,{className:Z.count,children:[n,(0,u.jsx)(`span`,{className:Z.countValue,children:a})]}):n}if(O===`button`){let e=(0,u.jsx)(d.Button,{variant:r?`primary`:`secondary`,onClick:c,disabled:i,size:`micro`,className:Z.chip,children:o===`grid`&&a?`${t.label} (${a})`:t.label});return o===`list`?(0,u.jsxs)(`div`,{className:Z.count,children:[e,(0,u.jsx)(`span`,{className:Z.countValue,children:a})]}):e}return o===`list`?(0,u.jsxs)(`div`,{className:Z.count,children:[(0,u.jsx)(d.Checkbox,{label:t.label,score:``,checked:r,onChange:c,disabled:i}),(0,u.jsx)(`span`,{className:Z.countValue,children:a})]}):(0,u.jsx)(d.Checkbox,{label:t.label,score:a?` (${a})`:``,checked:r,onChange:c,disabled:i})};return(0,u.jsx)(d.FilterPanelBase,{title:t,collapsible:m,collapsed:m?h:!1,className:p&&A.length>0?Z.active:void 0,children:(0,u.jsxs)(`ul`,{className:o===`grid`?Z.grid:Z.list,style:{listStyle:`none`,padding:0,margin:0},children:[z.map(({bucket:e,count:t})=>(0,u.jsx)(`li`,{children:B(e,t)},`${e.range.min}-${e.range.max}`)),z.length<R.length&&(0,u.jsx)(`li`,{children:(0,u.jsx)(d.Button,{variant:`ghost`,size:`micro`,onClick:()=>M(R.length),children:`Show ${R.length-z.length} more of ${R.length} total`})})]})})},$={grid:`_grid_1xjna_2`,chip:`_chip_1xjna_21`,chipLabel:`_chipLabel_1xjna_32`},ae=(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:$.chip,title:`${e}: ${t}`,children:(0,u.jsxs)(`span`,{className:$.chipLabel,children:[e,`: `,t]})})})),oe=(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:$.chip,title:`${e}: ${t} – ${n}`,children:(0,u.jsxs)(`span`,{className:$.chipLabel,children:[e,`: `,t,` – `,n]})})})),se=(0,c.memo)(({field:e,label: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:$.chip,title:`${e}: ${t}`,children:(0,u.jsxs)(`span`,{className:$.chipLabel,children:[e,`: `,t]})})}));function ce(){let{state:{filters:e,rangeFilters:t,bucketFilters:n},resetFilters:r,resetSingleFilter:i,resetRangeFilter:a,resetBucketFilter:o}=T(),s=(0,c.useMemo)(()=>Object.entries(e).map(([e,t])=>t.map(t=>({field:e,value:t}))).flat(),[e]),l=(0,c.useMemo)(()=>Object.entries(t).map(([e,{min:t,max:n}])=>({field:e,min:t,max:n})),[t]),f=(0,c.useMemo)(()=>Object.entries(n).flatMap(([e,t])=>t.map(t=>({field:e,range:t,label:`${t.min}-${t.max}`}))),[n]);return(0,c.useMemo)(()=>Object.keys(e).length>0||Object.keys(t).length>0||f.length>0,[e,t,f])?(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,title:`Active filters`,children:(0,u.jsxs)(`ul`,{className:$.grid,children:[s.map(({field:e,value:t})=>(0,u.jsx)(ae,{field:e,value:t,onReset:()=>i(e,t)},`${e}-${t}`)),l.map(({field:e,min:t,max:n})=>(0,u.jsx)(oe,{field:e,min:t,max:n,onReset:()=>a(e)},e)),f.map(({field:e,range:t,label:n})=>(0,u.jsx)(se,{field:e,label:n,onReset:()=>o(e,t)},`${e}-${t.min}-${t.max}`)),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.Button,{onClick:r,size:`micro`,variant:`ghost`,children:`Reset`})})]})}):null}var le={select:`_select_nwf7i_1`,radioGroup:`_radioGroup_nwf7i_6`},ue=({options:e,noneLabel:t=`None`,control:n,displayType:r,collapsible:i=!0,startCollapsed:a=!1})=>{let o=n??(r===`radio`?`radio`:`select`),{state:{sortableFields:s,sortBy:c,sortAscending:l},setSort:f,isFetchingInitial:p}=T();if(p)return(0,u.jsx)(U,{title:`Sort by`,rows:o===`radio`?3:1,collapsible:i,startCollapsed:a});if(!s||s.length===0)return null;let m=c?`${c}:${l?`asc`:`desc`}`:`none`,h=e?e.filter(e=>s.includes(e.field)?!0:(console.warn(`[SortByPanel] '${e.field}' is not sortable, so "${e.label}" is left out. Mark the field Sortable in the dataset's field configuration.`),!1)).map(e=>({label:e.label,value:`${e.field}:${e.ascending?`asc`:`desc`}`})):s.flatMap(e=>[{label:`${e} (asc)`,value:`${e}:asc`},{label:`${e} (desc)`,value:`${e}:desc`}]),g=t===null?h:[{label:t,value:`none`},...h],_=e=>{if(e===`none`||e===``)f(null,!0);else{let[t,n]=e.split(`:`);f(t,n===`asc`)}};return(0,u.jsx)(d.FilterPanelBase,{title:`Sort by`,collapsible:i,collapsed:i?a:!1,children:o===`select`?(0,u.jsx)(d.Select,{value:m,onValueChange:_,options:g,placeholder:`Select sort...`,"aria-label":`Sort by`}):(0,u.jsx)(`div`,{className:le.radioGroup,children:g.map(e=>(0,u.jsx)(d.RadioButton,{id:`sort-${e.value}`,name:`sort-by`,value:e.value,label:e.label,checked:m===e.value,onChange:e=>_(e.target.value)},e.value))})})},de={list:`_list_1y4fk_1`},fe={coverageDepth:500,coverWholeQuery:!0,coverWholeWords:!0,coverFuzzyWords:!0,coverJoinedWords:!0,coverPrefixSuffix:!0,truncate:!0,includePatternMatches:!0,minWordSize:2,levenshteinMaxWordSize:20,truncateWordHitLimit:1,truncateWordHitTolerance:0,truncationScore:65024};function pe(){let{state:{searchSettings:e},setSearchSettings:t,url:n,team:r,dataset:i,authenticatedFetch:a}=T(),[o,s]=(0,c.useState)(!1),[l,p]=(0,c.useState)(null);(0,c.useEffect)(()=>{let e=!0;try{a(`${n}/api/teams/${r}/datasets/${i}/query-parameters`).then(e=>e.ok?e.json():null).then(t=>{e&&t?.effective&&p(t.effective)}).catch(()=>{})}catch{}return()=>{e=!1}},[n,r,i,a]);let m=e.coverageSetup,h=e=>m[e]!==void 0&&m[e]!==null,g=e=>m[e]??l?.coverageSetup?.[e]??fe[e],_=e.coverageDepth??l?.coverageDepth??fe.coverageDepth,v=l?`dataset`:`default`,y=(e,t)=>t?e:`${e} (${v})`,b=e.coverageDepth!==void 0||Object.keys(m).some(e=>h(e)),x=(e,n)=>{let r=parseInt(n,10);isNaN(r)||t({[e]:r})},S=(e,n)=>{t({[e]:n})},C=(n,r)=>{let i=parseInt(r,10);isNaN(i)||t({coverageSetup:{...e.coverageSetup,[n]:i}})},w=(n,r)=>{t({coverageSetup:{...e.coverageSetup,[n]:r}})};return(0,u.jsx)(d.FilterPanelBase,{collapsed:!0,title:`Settings`,children:(0,u.jsxs)(`ul`,{className:de.list,children:[(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Max Results`,type:`number`,value:e.maxNumberOfRecordsToReturn.toString(),onChange:e=>x(`maxNumberOfRecordsToReturn`,e.target.value)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:y(`Coverage Depth`,e.coverageDepth!==void 0),type:`number`,value:_.toString(),onChange:e=>x(`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=>S(`showScore`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Enable Coverage`,checked:e.enableCoverage,onChange:e=>S(`enableCoverage`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Remove Duplicates`,checked:e.removeDuplicates,onChange:e=>S(`removeDuplicates`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.Button,{variant:`ghost`,size:`micro`,iconRight:o?(0,u.jsx)(f.ArrowDown,{}):(0,u.jsx)(f.ArrowRight,{}),onClick:()=>s(e=>!e),children:o?`Hide Coverage Setup`:`Show Coverage Setup`})}),o&&(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:y(`Cover Whole Query`,h(`coverWholeQuery`)),checked:g(`coverWholeQuery`),onChange:e=>w(`coverWholeQuery`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:y(`Cover Whole Words`,h(`coverWholeWords`)),checked:g(`coverWholeWords`),onChange:e=>w(`coverWholeWords`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:y(`Cover Fuzzy Words`,h(`coverFuzzyWords`)),checked:g(`coverFuzzyWords`),onChange:e=>w(`coverFuzzyWords`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:y(`Cover Joined Words`,h(`coverJoinedWords`)),checked:g(`coverJoinedWords`),onChange:e=>w(`coverJoinedWords`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:y(`Cover Prefix Suffix`,h(`coverPrefixSuffix`)),checked:g(`coverPrefixSuffix`),onChange:e=>w(`coverPrefixSuffix`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:y(`Truncate`,h(`truncate`)),checked:g(`truncate`),onChange:e=>w(`truncate`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:y(`Include Pattern Matches`,h(`includePatternMatches`)),checked:g(`includePatternMatches`),onChange:e=>w(`includePatternMatches`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:y(`Levenshtein Max Word Size`,h(`levenshteinMaxWordSize`)),type:`number`,value:g(`levenshteinMaxWordSize`).toString(),onChange:e=>C(`levenshteinMaxWordSize`,e.target.value)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:y(`Min Word Size`,h(`minWordSize`)),type:`number`,value:g(`minWordSize`).toString(),onChange:e=>C(`minWordSize`,e.target.value)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:y(`Truncate Word Hit Limit`,h(`truncateWordHitLimit`)),type:`number`,value:g(`truncateWordHitLimit`).toString(),onChange:e=>C(`truncateWordHitLimit`,e.target.value)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:y(`Truncate Word Hit Tolerance`,h(`truncateWordHitTolerance`)),type:`number`,value:g(`truncateWordHitTolerance`).toString(),onChange:e=>C(`truncateWordHitTolerance`,e.target.value)})}),b&&(0,u.jsx)(`li`,{children:(0,u.jsx)(d.Button,{variant:`ghost`,size:`micro`,onClick:()=>t({coverageSetup:void 0,coverageDepth:void 0}),children:`Use the dataset's values`})})]})]})})}var me=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 he(e,t){let{url:n,team:r,dataset:i,authenticatedFetch:a}=T(),[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 p.fromResponse(`VectorSearch`,u);let d=await u.json();if(d.length===0){s([]);return}let f=d.map(e=>e.documentKey),m=await a(`${n}/api/teams/${r}/datasets/${i}/documents/lookup`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(f)});if(!m.ok)throw await p.fromResponse(`GetJson`,m);s((await m.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 ge(e,t){let{url:n,team:r,dataset:i,authenticatedFetch:a}=T(),[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 p.fromResponse(`HybridSearch`,u);let d=await u.json();if(d.length===0){s([]);return}let f=d.map(e=>e.documentKey),m=await a(`${n}/api/teams/${r}/datasets/${i}/documents/lookup`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(f)});if(!m.ok)throw await p.fromResponse(`GetJson`,m);s((await m.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=ce,exports.BucketFilterPanel=Q,exports.FilterPanelSkeleton=U,exports.IndxApiError=p,exports.RangeFilterPanel=re,exports.SearchContext=C,exports.SearchErrorBoundary=me,exports.SearchInput=E,exports.SearchProvider=w,exports.SearchResult=M,exports.SearchResultRow=B,exports.SearchResults=R,exports.SearchResultsMessage=k,exports.SearchResultsSkeleton=F,exports.SearchSettingsPanel=pe,exports.SearchSetupError=m,exports.SortByPanel=ue,exports.ValueFilterPanel=ee,exports.describeSearchError=h,exports.useHybridSearch=ge,exports.useSearch=T,exports.useSearchContext=T,exports.useVectorSearch=he;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
export { SearchProvider, useSearchContext, SearchContext } from './context/SearchContext';
|
|
2
2
|
export type { SearchContextType, SearchState, NumericRange, ValueMatch } from './context/SearchContext';
|
|
3
|
+
export { describeSearchError, SearchSetupError } from './context/searchError';
|
|
4
|
+
export type { SearchErrorInfo, SearchErrorKind } from './context/searchError';
|
|
3
5
|
export type { SearchResult as SearchResultData } from './context/SearchContext';
|
|
4
6
|
export type { SearchResultMeta } from './components/SearchResults';
|
|
5
7
|
export { useSearch } from './context/useSearch';
|
|
6
8
|
export { SearchInput } from './components/SearchInput';
|
|
9
|
+
export { SearchResultsMessage } from './components/SearchResultsMessage';
|
|
10
|
+
export type { SearchResultsMessageProps } from './components/SearchResultsMessage';
|
|
7
11
|
export { SearchResults } from './components/SearchResults';
|
|
8
12
|
export { SearchResult } from './components/SearchResult';
|
|
9
13
|
export type { SearchResultProps } from './components/SearchResult';
|