@indxsearch/intrface 3.0.1 → 3.1.1
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 +42 -0
- package/README.md +8 -0
- package/dist/components/RangeFilterPanel.d.ts +1 -0
- package/dist/components/SearchErrorBoundary.d.ts +6 -3
- package/dist/components/SearchResults.d.ts +9 -0
- package/dist/components/ValueFilterPanel.d.ts +8 -0
- package/dist/context/SearchContext.d.ts +4 -0
- package/dist/context/buildFilterProxy.d.ts +13 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.es.js +549 -445
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,13 +1,39 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 3.1.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Restore AND as the default for several selected values on one field. 3.1.0 switched this to OR, which broke narrowing on multi-valued fields (a movie tagged both "horror" and "comedy" must match both ticks). The OR behaviour is now opt-in per panel with `<ValueFilterPanel match="any" />` for scalar fields.
|
|
8
|
+
|
|
9
|
+
Also fixes react-range's "`values` property is in conflict with the current `step`, `min`, and `max`" warning: `RangeFilterPanel` derives its slider `step` from the precision of the field's values (new `step` prop to override) and snaps thumbs onto the grid, and the Minimum Score slider in `SearchSettingsPanel` uses step 1. Requires `@indxsearch/systm` ^2.6.1.
|
|
10
|
+
|
|
11
|
+
3.1.0 is deprecated on npm because of the OR default; upgrade to 3.1.1.
|
|
12
|
+
|
|
3
13
|
All notable changes to `@indxsearch/intrface` will be documented in this file.
|
|
4
14
|
|
|
5
15
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
16
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
17
|
|
|
18
|
+
## 3.1.0
|
|
19
|
+
|
|
20
|
+
### Minor Changes
|
|
21
|
+
|
|
22
|
+
- 04afd27: Filter, settings and error-handling fixes across the components.
|
|
23
|
+
|
|
24
|
+
- Several selected values on the **same** field are now ORed (a document matches any of them) before the per-field results are ANDed together with the range filters. Previously every value was ANDed, so ticking a second box in one panel returned nothing.
|
|
25
|
+
- A failed `/filters/*` call, search or document lookup now sets `state.error` instead of silently running an unfiltered search or showing an empty result. `SearchResults` renders `authError` / `state.error` in place of the idle placeholder.
|
|
26
|
+
- `ValueFilterPanel` with `displayType="toggle"` stays on and clickable after the filtered response narrows the facet to `{ true }` only (or removes it). The `null → false` merge now applies to boolean toggles only, so `showNull` works on checkbox and button panels and no `false` option is fabricated for non-boolean fields.
|
|
27
|
+
- `RangeFilterPanel` Min/Max inputs keep what you type and commit (clamp/revert) on blur or Enter instead of clamping every keystroke. The panel now reports a field that is not filterable instead of rendering a slider whose filter the server rejects.
|
|
28
|
+
- `SearchSettingsPanel` changes now trigger a new search. A `maxNumberOfRecordsToReturn` set through `setSearchSettings` survives query changes; the "load more" expansion still resets.
|
|
29
|
+
- Filter and sort changes refresh results when `enableFacets={false}`.
|
|
30
|
+
- **Breaking:** `SearchResults` no longer splits string values that start with `[` into arrays. Opt in with the new `parseArrayStrings` prop, which parses only proper JSON or Python-style list literals.
|
|
31
|
+
- `SearchErrorBoundary` documents that it catches render errors only and uses the systm `Button`.
|
|
32
|
+
|
|
8
33
|
## [3.0.1] - 2026-08-27
|
|
9
34
|
|
|
10
35
|
### Fixed
|
|
36
|
+
|
|
11
37
|
- `authError` was missing from the published type declarations (`SearchContextType` and
|
|
12
38
|
`IndxAuthResult`) — the property existed at runtime in 3.0.0 but TypeScript consumers
|
|
13
39
|
could not access it without a compile error. Types only; no runtime change.
|
|
@@ -20,6 +46,7 @@ First stable release of the v3 line, for IndxCloudApi v2 (IndxSearchLib v5).
|
|
|
20
46
|
(Supersedes `3.0.0-alpha.20260617`, previously published under the `next` tag.)
|
|
21
47
|
|
|
22
48
|
### Changed
|
|
49
|
+
|
|
23
50
|
- **BREAKING**: All dataset operations use the team-scoped IndxCloudApi v2 routes
|
|
24
51
|
(`/api/teams/{team}/datasets/{dataset}/…`). `SearchProvider` takes a required
|
|
25
52
|
`team` prop alongside `dataset`.
|
|
@@ -31,11 +58,13 @@ First stable release of the v3 line, for IndxCloudApi v2 (IndxSearchLib v5).
|
|
|
31
58
|
creating an empty dataset on the server.
|
|
32
59
|
|
|
33
60
|
### Added
|
|
61
|
+
|
|
34
62
|
- `authError` on the search context — set when initialization fails (bad token,
|
|
35
63
|
unknown dataset, unreachable server). Previously such failures surfaced only as
|
|
36
64
|
an unhandled promise rejection in the console.
|
|
37
65
|
|
|
38
66
|
### Compatibility
|
|
67
|
+
|
|
39
68
|
- Requires IndxCloudApi v2
|
|
40
69
|
- `@indxsearch/indx-types` ^2.0.0 · `@indxsearch/systm` ^2.2.0
|
|
41
70
|
- React ^19.0.0 · React DOM ^19.0.0
|
|
@@ -45,6 +74,7 @@ First stable release of the v3 line, for IndxCloudApi v2 (IndxSearchLib v5).
|
|
|
45
74
|
## [2.1.1] - 2026-01-21
|
|
46
75
|
|
|
47
76
|
### Fixed
|
|
77
|
+
|
|
48
78
|
- **CRITICAL**: Fixed missing TypeScript declaration files (.d.ts) in published package
|
|
49
79
|
- v2.1.0 was published without declaration files, causing TypeScript compilation errors
|
|
50
80
|
- All type definitions are now properly included in the npm package
|
|
@@ -52,12 +82,14 @@ First stable release of the v3 line, for IndxCloudApi v2 (IndxSearchLib v5).
|
|
|
52
82
|
## [2.1.0] - 2026-01-21
|
|
53
83
|
|
|
54
84
|
### Added
|
|
85
|
+
|
|
55
86
|
- Added dependency on `@indxsearch/indx-types` for centralized API type definitions
|
|
56
87
|
- Added `RequiredCoverageSetup` type for internal use (all properties guaranteed present)
|
|
57
88
|
- Added new CoverageSetup properties: `truncateWordHitLimit`, `truncateWordHitTolerance`, `includePatternMatches`
|
|
58
89
|
- Added "Include Pattern Matches" toggle to SearchSettingsPanel
|
|
59
90
|
|
|
60
91
|
### Fixed
|
|
92
|
+
|
|
61
93
|
- **BREAKING FIX**: Fixed `SystemStatus.state` → `systemStatus.systemState` to match actual API response
|
|
62
94
|
- **BREAKING FIX**: Fixed `SearchResult.documentKey` type from `string` to `number` (Int32) to match API
|
|
63
95
|
- Fixed SystemState enum usage with proper numeric comparisons
|
|
@@ -65,6 +97,7 @@ First stable release of the v3 line, for IndxCloudApi v2 (IndxSearchLib v5).
|
|
|
65
97
|
- Fixed `truncationScore` default value: 254 → 255
|
|
66
98
|
|
|
67
99
|
### Changed
|
|
100
|
+
|
|
68
101
|
- **BREAKING**: Updated CoverageSetup interface to match IndxCloudApi v1.0.2
|
|
69
102
|
- Removed obsolete properties: `coverageMinWordHitsAbs`, `coverageMinWordHitsRelative`, `coverageLcsErrorToleranceRelativeq`, `coverageQLimitForErrorTolerance`
|
|
70
103
|
- These properties no longer exist in the API specification
|
|
@@ -74,9 +107,11 @@ First stable release of the v3 line, for IndxCloudApi v2 (IndxSearchLib v5).
|
|
|
74
107
|
- Imports `SystemState` enum as value (not just type) for runtime comparisons
|
|
75
108
|
|
|
76
109
|
### Technical Details
|
|
110
|
+
|
|
77
111
|
This release aligns `@indxsearch/intrface` with the official IndxCloudApi v1.0.2 Swagger specification. The breaking changes fix discrepancies between the package and the actual API that could cause runtime errors or unexpected behavior.
|
|
78
112
|
|
|
79
113
|
### Migration Guide
|
|
114
|
+
|
|
80
115
|
If upgrading from 2.0.x:
|
|
81
116
|
|
|
82
117
|
1. **SystemStatus access**: Change `statusData.state` to `statusData.systemState`
|
|
@@ -84,6 +119,7 @@ If upgrading from 2.0.x:
|
|
|
84
119
|
3. **CoverageSetup**: Remove any usage of the deleted properties listed above
|
|
85
120
|
|
|
86
121
|
### Compatibility
|
|
122
|
+
|
|
87
123
|
- Requires IndxCloudApi v1.0.2
|
|
88
124
|
- Requires `@indxsearch/indx-types` ^1.0.0
|
|
89
125
|
- React ^19.0.0
|
|
@@ -92,20 +128,24 @@ If upgrading from 2.0.x:
|
|
|
92
128
|
## [2.0.1] - 2026-01-16
|
|
93
129
|
|
|
94
130
|
### Fixed
|
|
131
|
+
|
|
95
132
|
- Fixed search firing 3 times per keystroke instead of 2 (immediate + debounced)
|
|
96
133
|
- Fixed reset filters not triggering new search when user clicks "Reset" button
|
|
97
134
|
- Fixed filter effect race conditions with automatic range filter cleanups
|
|
98
135
|
- Fixed range filter panel automatically triggering searches when cleaning up full-range filters
|
|
99
136
|
|
|
100
137
|
### Changed
|
|
138
|
+
|
|
101
139
|
- Added optional `isUserAction` parameter to `resetSingleFilter` method to distinguish between user-initiated actions and automatic code cleanups
|
|
102
140
|
- Optimized `coverageSetup` reference preservation in `setSearchSettings` to prevent unnecessary re-renders
|
|
103
141
|
- Removed verbose `useMemo` dependencies for `coverageSetup` (replaced with stable reference approach)
|
|
104
142
|
|
|
105
143
|
### Technical Details
|
|
144
|
+
|
|
106
145
|
The root cause of the 3-search bug was `RangeFilterPanel` automatically calling `resetSingleFilter` after every search to clean up full-range filters. This was setting the `filtersChangedByUser` flag, causing the filter effect to fire an extra search. The fix distinguishes between user-initiated resets (should trigger search) and automatic cleanups (should not trigger search).
|
|
107
146
|
|
|
108
147
|
### Compatibility
|
|
148
|
+
|
|
109
149
|
- Requires IndxCloudApi 1.0.0
|
|
110
150
|
- React ^19.0.0
|
|
111
151
|
- React DOM ^19.0.0
|
|
@@ -113,6 +153,7 @@ The root cause of the 3-search bug was `RangeFilterPanel` automatically calling
|
|
|
113
153
|
## [2.0.0] - [Previous Date]
|
|
114
154
|
|
|
115
155
|
### Added
|
|
156
|
+
|
|
116
157
|
- Initial public release with major architectural improvements
|
|
117
158
|
- Full TypeScript support
|
|
118
159
|
- Comprehensive authentication system (bearer token + email/password)
|
|
@@ -126,6 +167,7 @@ The root cause of the 3-search bug was `RangeFilterPanel` automatically calling
|
|
|
126
167
|
- Mobile-responsive design
|
|
127
168
|
|
|
128
169
|
### Compatibility
|
|
170
|
+
|
|
129
171
|
- Requires IndxCloudApi 1.0.0
|
|
130
172
|
- React ^19.0.0
|
|
131
173
|
- React DOM ^19.0.0
|
package/README.md
CHANGED
|
@@ -350,8 +350,11 @@ export default function AdvancedSearch() {
|
|
|
350
350
|
|------|------|----------|-------------|
|
|
351
351
|
| `fields` | `string[]` | ✅ | Document fields to fetch |
|
|
352
352
|
| `resultsPerPage` | `number` | ✅ | Results per page |
|
|
353
|
+
| `parseArrayStrings` | `boolean` | ❌ | Convert string fields holding a JSON (`["a","b"]`) or Python-style (`['a', 'b']`) list literal into a `string[]` before `children` sees them. Default `false`; other strings are never altered. |
|
|
353
354
|
| `children` | `(item: any) => ReactNode` | ✅ | Render function for each result |
|
|
354
355
|
|
|
356
|
+
Initialisation failures (bad token, unknown dataset, unreachable server) and failed searches are stored in the context as `authError` / `state.error`, and `SearchResults` renders the message in place of the result list. `SearchErrorBoundary` only catches errors thrown while rendering.
|
|
357
|
+
|
|
355
358
|
### ValueFilterPanel Props
|
|
356
359
|
|
|
357
360
|
| Prop | Type | Default | Description |
|
|
@@ -363,6 +366,10 @@ export default function AdvancedSearch() {
|
|
|
363
366
|
| `limit` | `number` | `undefined` | Max filters to show |
|
|
364
367
|
| `startCollapsed` | `boolean` | `false` | Start collapsed |
|
|
365
368
|
| `showCount` | `boolean` | `true` | Show facet counts |
|
|
369
|
+
| `showNull` | `boolean` | `false` | List the `null` facet bucket (documents without the field) as an option |
|
|
370
|
+
| `match` | `'all' \| 'any'` | `'all'` | How several selected values combine. `'all'` requires every selected value (right for multi-valued fields such as genres: each click narrows). `'any'` matches at least one (use on scalar fields, where a document holds a single value). |
|
|
371
|
+
|
|
372
|
+
Different fields and range filters always narrow the result set (ANDed). With `displayType="toggle"` the field is treated as boolean whenever its facet keys are `true` / `false` / `null`, and the `null` bucket counts as `false`.
|
|
366
373
|
|
|
367
374
|
### RangeFilterPanel Props
|
|
368
375
|
|
|
@@ -373,6 +380,7 @@ export default function AdvancedSearch() {
|
|
|
373
380
|
| `displayType` | `'slider' \| 'input'` | ❌ | Filter UI style (default `'input'`) |
|
|
374
381
|
| `expectedMin` | `number` | ❌ | Expected lower bound (default `0`) |
|
|
375
382
|
| `expectedMax` | `number` | ❌ | Expected upper bound (default `1000`) |
|
|
383
|
+
| `step` | `number` | ❌ | Slider step. Derived from the precision of the field's values if omitted (1 for integers, 0.1 for one decimal, …) |
|
|
376
384
|
| `showHistogram` | `boolean` | ❌ | Show a histogram above the slider (requires the field to be facetable; default `false`) |
|
|
377
385
|
| `resolution` | `number` | ❌ | Value-range per histogram bucket (e.g. `200` → 5 bars over 0–1000). Auto-derived (~20 bars) if omitted |
|
|
378
386
|
| `collapsible` | `boolean` | ❌ | Whether the panel can collapse (default `true`) |
|
|
@@ -8,10 +8,13 @@ interface State {
|
|
|
8
8
|
error: Error | null;
|
|
9
9
|
}
|
|
10
10
|
/**
|
|
11
|
-
* Error boundary
|
|
11
|
+
* Error boundary for the search components.
|
|
12
12
|
*
|
|
13
|
-
* Catches errors
|
|
14
|
-
*
|
|
13
|
+
* Catches errors thrown while *rendering* the tree below it (a render prop
|
|
14
|
+
* that throws, a misconfigured component). It does not see failed requests:
|
|
15
|
+
* initialisation failures (bad token, unknown dataset, unreachable server)
|
|
16
|
+
* and failed searches are stored in the search context as `authError` and
|
|
17
|
+
* `state.error`, and `SearchResults` renders them in place of the result list.
|
|
15
18
|
*
|
|
16
19
|
* @example
|
|
17
20
|
* <SearchErrorBoundary>
|
|
@@ -2,6 +2,15 @@ import { default as React } from 'react';
|
|
|
2
2
|
export interface SearchResultsProps {
|
|
3
3
|
fields?: string[];
|
|
4
4
|
resultsPerPage?: number;
|
|
5
|
+
/**
|
|
6
|
+
* Convert string fields that hold a serialised list — JSON (`["a","b"]`) or
|
|
7
|
+
* Python-style (`['a', 'b']`) — into a real string[] before they reach the
|
|
8
|
+
* render prop. Off by default: any other string, including ones that merely
|
|
9
|
+
* start with '[' such as "[Draft] Report", is passed through untouched.
|
|
10
|
+
*/
|
|
11
|
+
parseArrayStrings?: boolean;
|
|
5
12
|
children: (item: Record<string, any>) => React.ReactNode;
|
|
6
13
|
}
|
|
14
|
+
/** Returns the list a string encodes, or undefined when it is not a list literal. */
|
|
15
|
+
export declare function parseArrayString(value: string): string[] | undefined;
|
|
7
16
|
export declare const SearchResults: React.FC<SearchResultsProps>;
|
|
@@ -13,6 +13,14 @@ export interface ValueFilterPanelProps {
|
|
|
13
13
|
showActivePanel?: boolean;
|
|
14
14
|
showCount?: boolean;
|
|
15
15
|
showNull?: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* How several selected values combine. `'all'` (default) requires a document to
|
|
18
|
+
* carry every selected value — right for multi-valued fields such as genres,
|
|
19
|
+
* where each click narrows the results. `'any'` matches documents with at least
|
|
20
|
+
* one of them — use it on scalar fields, where a document can only hold one value
|
|
21
|
+
* and AND would always return nothing.
|
|
22
|
+
*/
|
|
23
|
+
match?: 'all' | 'any';
|
|
16
24
|
displayIfEmptyQuery?: boolean;
|
|
17
25
|
displayCondition?: (context: {
|
|
18
26
|
query: string;
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
2
|
import { CoverageSetup } from '@indxsearch/indx-types';
|
|
3
|
+
import { ValueMatch } from './buildFilterProxy';
|
|
4
|
+
export type { ValueMatch };
|
|
3
5
|
export type RequiredCoverageSetup = Required<CoverageSetup>;
|
|
4
6
|
export interface SearchSettings {
|
|
5
7
|
maxNumberOfRecordsToReturn: number;
|
|
@@ -28,6 +30,7 @@ export interface SearchState {
|
|
|
28
30
|
facetableFields: string[];
|
|
29
31
|
sortableFields: string[];
|
|
30
32
|
filters: Record<string, string[]>;
|
|
33
|
+
valueMatch: Record<string, ValueMatch>;
|
|
31
34
|
rangeFilters: Record<string, {
|
|
32
35
|
min: number;
|
|
33
36
|
max: number;
|
|
@@ -57,6 +60,7 @@ export interface SearchContextType {
|
|
|
57
60
|
authenticatedFetch: (url: string, options?: RequestInit) => Promise<Response>;
|
|
58
61
|
setQuery: (query: string) => void;
|
|
59
62
|
toggleFilter: (field: string, value: string) => void;
|
|
63
|
+
setValueMatch: (field: string, match: ValueMatch) => void;
|
|
60
64
|
setRangeFilter: (field: string, min: number, max: number) => void;
|
|
61
65
|
resetFilters: () => void;
|
|
62
66
|
resetSingleFilter: (field: string, value: string, isUserAction?: boolean) => void;
|
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
type AuthenticatedFetch = (url: string, options?: RequestInit) => Promise<Response>;
|
|
2
|
+
export type ValueMatch = 'all' | 'any';
|
|
3
|
+
/**
|
|
4
|
+
* Builds the server-side filter token for the current selection.
|
|
5
|
+
*
|
|
6
|
+
* Several selected values on the *same* field are combined per that field's
|
|
7
|
+
* match mode: `'all'` (default) ANDs them — a document must carry every value,
|
|
8
|
+
* which is the natural reading for multi-valued fields such as genres and
|
|
9
|
+
* narrows the result set with each click; `'any'` ORs them, for scalar fields
|
|
10
|
+
* where a document can only ever hold one of the values. The per-field results
|
|
11
|
+
* are then ANDed with each other and with every range filter. Any failed
|
|
12
|
+
* filter call throws — the caller must not fall back to an unfiltered search.
|
|
13
|
+
*/
|
|
2
14
|
export declare function buildFilterProxy(filters: Record<string, string[]>, rangeFilters: Record<string, {
|
|
3
15
|
min: number;
|
|
4
16
|
max: number;
|
|
5
|
-
}>, url: string, team: string, dataset: string, authenticatedFetch: AuthenticatedFetch): Promise<any>;
|
|
17
|
+
}>, url: string, team: string, dataset: string, authenticatedFetch: AuthenticatedFetch, valueMatch?: Record<string, ValueMatch>): Promise<any>;
|
|
6
18
|
export {};
|
package/dist/index.cjs.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));require("@indxsearch/systm/styles.css");let c=require("react");c=s(c);let l=require("@indxsearch/indx-types"),u=require("react/jsx-runtime"),d=require("@indxsearch/systm"),f=require("@indxsearch/pixl");function p({url:e,team:t,dataset:n,preAuthenticatedToken:r,enableDebugLogs:i=!1}){let[a,o]=(0,c.useState)(null),[s,u]=(0,c.useState)(!0),[d,f]=(0,c.useState)([]),[p,m]=(0,c.useState)([]),[h,g]=(0,c.useState)([]),[_,v]=(0,c.useState)({}),[y,b]=(0,c.useState)({}),[x,S]=(0,c.useState)(0),[C,w]=(0,c.useState)(null);return(0,c.useEffect)(()=>{(async()=>{w(null);try{if(!r)throw console.error(`[Auth] ❌ Missing bearer token`),console.error(`[Auth] 💡 Pass preAuthenticatedToken to SearchProvider (create a token on the IndxCloudApi website)`),Error(`A bearer token is required. Check console for instructions.`);if(!e)throw console.error(`[Auth] ❌ Missing INDX server URL`),console.error(`[Auth] 💡 Pass a url to SearchProvider`),Error(`INDX server URL is required. Check console for instructions.`);if(!n)throw console.error(`[Auth] ❌ Missing dataset name`),console.error(`[Auth] 💡 Pass dataset="your-dataset-name" to SearchProvider`),Error(`Dataset name is required. Check console for instructions.`);i&&console.log(`[Auth] ✅ Using bearer token`);let a=r,s=e=>fetch(e,{method:`GET`,headers:{accept:`text/plain`,Authorization:`Bearer ${a}`}});i&&console.log(`[Auth] 🔍 Checking dataset status...`);let c=await s(`${e}/api/teams/${t}/datasets/${n}/status`);if(!c.ok){if(c.status===401)throw console.error(`[Auth] ❌ Authentication failed (401 Unauthorized)`),console.error(`[Auth] 💡 Your token may be expired or invalid`),console.error(`[Auth] 💡 Create or refresh your token on the IndxCloudApi website`),Error(`Authentication failed (401). Token may be expired. Check console for instructions.`);if(c.status===404)throw console.error(`[Auth] ❌ Dataset "`+n+`" not found (404)`),console.error(`[Auth] 💡 Available datasets can be checked with: curl -X GET "`+e+`/api/me/datasets" -H "Authorization: Bearer YOUR_TOKEN"`),console.error(`[Auth] 💡 Make sure you spelled the dataset name correctly`),Error(`Dataset "`+n+`" not found. Check console for instructions.`);{let t=await c.text();throw console.error(`[Auth] ❌ Failed to get dataset status:`,c.status,t),console.error(`[Auth] 💡 Check if your INDX server is running at:`,e),Error(`Failed to connect to INDX server. Check console for details.`)}}let u=await c.json();i&&console.log(`[Auth] 📊 Dataset status:`,u),i&&console.log(`[Auth] 🔓 Opening dataset session...`);let d=await fetch(`${e}/api/teams/${t}/datasets/${n}?configuration=400`,{method:`PUT`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${a}`},body:`""`});if(!d.ok)throw console.error(`[Auth] ❌ CreateOrOpen failed:`,d.status,await d.text()),Error(`Failed to open dataset session.`);o(a),i&&console.log(`[Auth] ✅ Dataset session established`),u.systemState!==void 0&&u.systemState!==l.SystemState.Ready&&(console.warn(`[Auth] ⚠️ Dataset is not ready yet. Current state:`,l.SystemState[u.systemState]),console.warn(`[Auth] 💡 Wait for indexing to complete before searching`));let p=u.documentCount??u.numberOfRecords??0;p===0?(console.warn(`[Auth] ⚠️ Dataset "`+n+`" is empty (0 records)`),console.warn(`[Auth] 💡 Add documents to your dataset before searching`),console.warn(`[Auth] 💡 Search will work but return no results`)):i&&console.log(`[Auth] ✅ Dataset has`,p,`records`);let[h,_,y]=await Promise.all([s(`${e}/api/teams/${t}/datasets/${n}/fields/filterable`),s(`${e}/api/teams/${t}/datasets/${n}/fields/facetable`),s(`${e}/api/teams/${t}/datasets/${n}/fields/sortable`)]);if(!h.ok)throw console.error(`[Auth] ❌ GetFilterableFields failed:`,h.status,await h.text()),Error(`Failed to get filterable fields. Check console for details.`);if(!_.ok)throw console.error(`[Auth] ❌ GetFacetableFields failed:`,_.status,await _.text()),Error(`Failed to get facetable fields. Check console for details.`);if(!y.ok)throw console.error(`[Auth] ❌ GetSortableFields failed:`,y.status,await y.text()),Error(`Failed to get sortable fields. Check console for details.`);let[x,C,w]=await Promise.all([h.json().catch(e=>(console.error(`Failed to parse GetFilterableFields response:`,e),[])),_.json().catch(e=>(console.error(`Failed to parse GetFacetableFields response:`,e),[])),y.json().catch(e=>(console.error(`Failed to parse GetSortableFields response:`,e),[]))]);f(x||[]),m(C||[]),g(w||[]),S(p);let T={facets:{}};try{let r=await fetch(`${e}/api/teams/${t}/datasets/${n}/search`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${a}`},body:JSON.stringify({text:``,maxNumberOfRecordsToReturn:0,enableFacets:!0})});r.ok?T=await r.json().catch(e=>(console.warn(`Failed to parse blank search response:`,e),{facets:{}})):(console.warn(`Blank search failed:`,r.status,r.statusText),console.warn(`Continuing without initial facet data - facets will be populated after first search`))}catch(e){console.warn(`Blank search error:`,e),console.warn(`Continuing without initial facet data - facets will be populated after first search`)}let E={};if(T.facets){for(let[e,t]of Object.entries(T.facets))if(Array.isArray(t)&&t.length>0){let n=t.map(e=>Number(e.key)).filter(e=>!isNaN(e));n.length>0&&(E[e]={min:Math.min(...n),max:Math.max(...n)})}}let D={};if(T.facets)for(let[e,t]of Object.entries(T.facets))Array.isArray(t)&&(D[e]=t.map(e=>e.key));v(E),b(D),i&&console.log(`[Auth] ✅ Initialization complete`)}catch(t){console.error(`[Auth] ❌ Initialization failed:`,t),(t instanceof Error||typeof t==`object`&&t&&`message`in t)&&console.error(`[Auth] 💡 Error:`,t.message),t instanceof TypeError&&t.message.includes(`fetch`)&&(console.error(`[Auth] ❌ Network error - cannot connect to INDX server`),console.error(`[Auth] 💡 Check if the server is running at:`,e),console.error(`[Auth] 💡 Check the url you passed to SearchProvider`),console.error(`[Auth] 💡 For local development, it should be: http://localhost:5001`)),w(t instanceof Error?t.message:String(t))}finally{u(!1)}})()},[e,t,n]),{token:a,isFetchingInitial:s,authError:C,initialFacetStats:_,initialFacetKeys:y,filterableFields:d,facetableFields:p,sortableFields:h,totalDocumentCount:x}}async function m(e,t,n,r,i){if(e.length===0)return null;if(e.length===1)return e[0];let a=e[0];for(let o=1;o<e.length;o++){let s=await i(`${t}/api/teams/${n}/datasets/${r}/filters/combine`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({a,b:e[o],useAndOperation:!0})});if(!s.ok){let e=await s.json();throw console.error(`CombineFilters failed:`,e),Error(`CombineFilters failed`)}a=await s.json()}return a}async function h(e,t,n,r,i,a){let o=Object.entries(e??{}),s=Object.entries(t??{}),[c,l]=await Promise.all([Promise.all(o.map(([e,t])=>Promise.all(t.map(t=>a(`${n}/api/teams/${r}/datasets/${i}/filters/value`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({fieldName:e,value:t})}).then(e=>e.json()))))),Promise.all(s.map(([e,{min:t,max:o}])=>a(`${n}/api/teams/${r}/datasets/${i}/filters/range`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({fieldName:e,lowerLimit:t,upperLimit:o})}).then(e=>e.json())))]);return m([...c.flat(),...l].filter(e=>e&&typeof e.hashString==`string`),n,r,i,a)}function g(e,t){let n,r=(...r)=>{clearTimeout(n),n=setTimeout(()=>e(...r),t)};return r.cancel=()=>clearTimeout(n),r}function _({state:e,setState:t,authenticatedFetch:n,auth:r,url:i,team:a,dataset:o,allowEmptySearch:s,facetsEnabled:l,enableDebugLogs:u,filtersChangedByUser:d,shouldFetchMore:f}){let p=(0,c.useRef)(0),m=(0,c.useRef)(void 0),_=(0,c.useRef)(!1),[v,y]=(0,c.useState)({}),[b,x]=(0,c.useState)(``),[S,C]=(0,c.useState)(``);(0,c.useEffect)(()=>{r.isFetchingInitial||t(e=>({...e,facetStats:r.initialFacetStats,rangeBounds:r.initialFacetStats,totalDocumentCount:r.totalDocumentCount,filterableFields:r.filterableFields,facetableFields:r.facetableFields,sortableFields:r.sortableFields}))},[r.isFetchingInitial,r.initialFacetStats,r.totalDocumentCount,r.filterableFields,r.facetableFields,r.sortableFields,t]);let w=e.searchSettings.maxNumberOfRecordsToReturn,T=e.searchSettings.enableCoverage,E=e.searchSettings.removeDuplicates,D=e.searchSettings.coverageDepth,O=e.searchSettings.minimumScore,k=e.searchSettings.coverageSetup,A=e.sortBy,j=e.sortAscending,M=(0,c.useCallback)(async({enableFacets:c})=>{if(!r.token)return;let l=++p.current;if(t(e=>({...e,isLoading:!0})),e.query.trim()===``){if(!s)return;c=!0}try{let d=await h(e.filters,e.rangeFilters,i,a,o,n),f=s||e.query.trim()!==``,m={text:e.query,maxNumberOfRecordsToReturn:f?w:0,enableFacets:c,...d?{filter:d}:{},...A?{sortBy:A}:{},...j===void 0?{}:{sortAscending:j},enableCoverage:T,removeDuplicates:E,coverageDepth:D,coverageSetup:k};u&&console.log(`[performSearch] request body:`,JSON.stringify(m,null,2));let g=await(await n(`${i}/api/teams/${a}/datasets/${o}/search`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(m)})).json(),_=g.truncationIndex??-1,M=g.records||[],N=M.map(e=>e.documentKey),P=M.map(e=>e.score),F=[];f&&N.length>0&&(F=(await(await n(`${i}/api/teams/${a}/datasets/${o}/documents/lookup`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(N)})).json()).map((e,t)=>({document:e,documentKey:N[t],score:P[t]})));let I={};if(c&&g.facets){for(let[e,t]of Object.entries(g.facets))if(Array.isArray(t)&&t.length>0){let n=t.map(e=>Number(e.key)).filter(e=>!isNaN(e));n.length>0&&(I[e]={min:Math.min(...n),max:Math.max(...n)})}}let L=e.query!==b,R=e.query!==S,z=e.facetStats??{};if(L?(z={...r.initialFacetStats,...I},y(z),x(e.query)):z={...v,...I},R&&c){let n={...e.rangeBounds};for(let[e,t]of Object.entries(I))n[e]=t;t(e=>({...e,rangeBounds:n})),C(e.query)}let B=g.facets;if(c&&(!B||Object.keys(B).length===0)){B={};for(let[e,t]of Object.entries(r.initialFacetKeys))B[e]=t.map(e=>({key:e,value:null}))}if(l!==p.current)return;let V=F.filter(t=>{let n=e.query.trim();return n===``||n.length===1?!0:t.score>=O});t(e=>({...e,results:V,resultsSuppressed:!f,...c?{facets:B,facetStats:z}:{},isLoading:!1,truncationIndex:_}))}catch(e){if(console.error(`[Search] ❌ Search failed:`,e),e instanceof TypeError&&e.message.includes(`fetch`)?(console.error(`[Search] ❌ Network error - cannot reach INDX server`),console.error(`[Search] 💡 Check if server is running at:`,i)):e instanceof Error&&(e.message.includes(`401`)?(console.error(`[Search] ❌ Authentication failed`),console.error(`[Search] 💡 Your token may have expired. Create or refresh it on the IndxCloudApi website.`)):e.message.includes(`404`)?(console.error(`[Search] ❌ Dataset not found`),console.error(`[Search] 💡 Check that dataset "`+o+`" exists`)):console.error(`[Search] 💡 Error:`,e.message)),l!==p.current)return;t(t=>({...t,results:null,isLoading:!1,resultsSuppressed:!1,error:e instanceof Error?e.message:`Search failed`}))}},[e.query,e.filters,e.rangeFilters,e.facetStats,A,j,w,T,E,D,k,O,n,r.initialFacetStats,r.initialFacetKeys,r.token,v,b,S,e.rangeBounds,i,a,o,s,u,t]);(0,c.useEffect)(()=>{m.current=M},[M]);let N=(0,c.useRef)(null);(0,c.useEffect)(()=>(N.current?.cancel(),N.current=g(()=>{u&&console.log(`Debounced searchWithFacets fired`),m.current?.({enableFacets:!0})},e.facetDebounceDelayMillis??500),()=>{N.current?.cancel()}),[e.facetDebounceDelayMillis]),(0,c.useEffect)(()=>{!r.isFetchingInitial&&r.token&&!_.current&&(s&&m.current?.({enableFacets:l}),_.current=!0)},[r.isFetchingInitial,r.token,s,l]),(0,c.useEffect)(()=>{if(!r.token||!_.current)return;let n=e.query.trim(),i=n===``&&s;if(n===``&&!s){e.resultsSuppressed||t(e=>({...e,resultsSuppressed:!0}));return}return i?(N.current?.cancel(),m.current?.({enableFacets:l})):l?(u&&console.log(`Search fired`),m.current?.({enableFacets:!1}),N.current?.()):m.current?.({enableFacets:!1}),()=>{N.current?.cancel()}},[e.query,s,l]),(0,c.useEffect)(()=>{let t=d.current;if(d.current=!1,!_.current||!r.token||!t)return;let n=e.query.trim();l&&!(!s&&n===``)&&m.current?.({enableFacets:!0})},[e.filters,e.rangeFilters]),(0,c.useEffect)(()=>{if(!_.current||!r.token)return;let t=e.query.trim();l&&!(!s&&t===``)&&m.current?.({enableFacets:!0})},[A,j]),(0,c.useEffect)(()=>{!_.current||!r.token||f.current&&(f.current=!1,m.current?.({enableFacets:!1}))},[w,r.token])}var v=(0,c.createContext)(void 0),y=({children:e,url:t,team:n,dataset:r,allowEmptySearch:i=!1,maxResults:a=10,facetDebounceDelayMillis:o=500,enableFacets:s=!0,coverageDepth:l=500,removeDuplicates:d=!0,enableCoverage:f=!0,initialCoverageSetup:m={},enableDebugLogs:h=!1,preAuthenticatedToken:g})=>{let y=(0,c.useRef)(!1),b=(0,c.useRef)(!1),[x,S]=(0,c.useState)({query:``,results:null,isLoading:!1,resultsSuppressed:!i,facetDebounceDelayMillis:o,filterableFields:[],facetableFields:[],sortableFields:[],filters:{},rangeFilters:{},facetStats:{},rangeBounds:{},searchSettings:{maxNumberOfRecordsToReturn:a,coverageDepth:l,enableCoverage:f,removeDuplicates:d,minimumScore:0,showScore:!0,placeholderText:`Type to search`,coverageSetup:{coverWholeQuery:!0,coverWholeWords:!0,coverFuzzyWords:!0,coverJoinedWords:!0,coverPrefixSuffix:!0,truncate:!0,includePatternMatches:!0,minWordSize:2,levenshteinMaxWordSize:20,truncateWordHitLimit:1,truncateWordHitTolerance:0,truncationScore:65024,...m}}});(0,c.useEffect)(()=>{h&&console.log(`SearchContext mounted on client`)},[h]),(0,c.useEffect)(()=>{S(e=>({...e,facetDebounceDelayMillis:o}))},[o]);let[C]=(0,c.useState)(s),w=p({url:t,team:n,dataset:r,preAuthenticatedToken:g,enableDebugLogs:h}),T=(0,c.useCallback)((e,t={})=>{if(!w.token)throw Error(`No authentication token available`);return fetch(e,{...t,headers:{...t.headers,Authorization:`Bearer ${w.token}`}})},[w.token]);_({state:x,setState:S,authenticatedFetch:T,auth:w,url:t,team:n,dataset:r,allowEmptySearch:i,facetsEnabled:C,enableDebugLogs:h,filtersChangedByUser:y,shouldFetchMore:b});let E=(0,c.useCallback)(e=>{y.current=!1,S(t=>{let n=Object.keys(t.filters).length>0,r=Object.keys(t.rangeFilters).length>0;return{...t,query:e,filters:n?{}:t.filters,rangeFilters:r?{}:t.rangeFilters,searchSettings:{...t.searchSettings,maxNumberOfRecordsToReturn:a}}})},[a]),D=(0,c.useCallback)(e=>{S(t=>({...t,facetDebounceDelayMillis:e}))},[]),O=(0,c.useCallback)(e=>{S(t=>{let n={...t.searchSettings,...e};return e.coverageSetup?n.coverageSetup={...t.searchSettings.coverageSetup,...e.coverageSetup}:n.coverageSetup=t.searchSettings.coverageSetup,{...t,searchSettings:n}})},[]),k=(0,c.useCallback)(e=>{b.current=!0,S(t=>({...t,searchSettings:{...t.searchSettings,maxNumberOfRecordsToReturn:e}}))},[]),A=(0,c.useCallback)((e,t)=>{y.current=!0,S(n=>{let r={...n.filters},i=r[e]||[],a=i.includes(t)?i.filter(e=>e!==t):[...i,t];return a.length?r[e]=a:delete r[e],{...n,filters:r}})},[]),j=(0,c.useCallback)((e,t,n)=>{y.current=!0,S(r=>({...r,rangeFilters:{...r.rangeFilters,[e]:{min:t,max:n}}}))},[]),M=(0,c.useCallback)(()=>{y.current=!0,S(e=>({...e,filters:{},rangeFilters:{}}))},[]),N=(0,c.useCallback)((e,t,n=!0)=>{n&&(y.current=!0),S(n=>{let r={...n.filters},i=(r[e]||[]).filter(e=>e!==t);return i.length>0?r[e]=i:delete r[e],{...n,filters:r}})},[]),P=(0,c.useCallback)((e,t=!0)=>{t&&(y.current=!0),S(t=>{let n={...t.rangeFilters};return delete n[e],{...t,rangeFilters:n}})},[]),F=(0,c.useCallback)((e,t)=>{S(n=>({...n,sortBy:e||void 0,sortAscending:e?t:void 0}))},[]);return(0,u.jsx)(v.Provider,{value:{state:x,isFetchingInitial:w.isFetchingInitial,authError:w.authError??void 0,allowEmptySearch:i,url:t,team:n,dataset:r,authenticatedFetch:T,setQuery:E,toggleFilter:A,setRangeFilter:j,resetFilters:M,resetSingleFilter:N,resetRangeFilter:P,setSort:F,setDebounceDelay:D,setSearchSettings:O,fetchMoreResults:k},children:e})},b=()=>{let e=(0,c.useContext)(v);if(!e)throw Error(`useSearchContext must be used within a SearchProvider`);return e},x=({className:e=``,autoFocus:t=!1,inputSize:n=`default`,showClear:r=!0,showFocus:i=!1,...a})=>{let{state:{query:o,filters:s,rangeFilters:c,searchSettings:l},setQuery:f}=b();Object.keys(s).length>0||Object.keys(c).length;let p=o.length>0;return(0,u.jsx)(d.SearchField,{type:`text`,value:o,onChange:e=>f(e.target.value),placeholder:l.placeholderText,autoFocus:t,className:e,showSearchIcon:!0,inputSize:n,showFocusBorder:i,...a,children:r&&p&&(0,u.jsx)(d.Button,{variant:`ghost`,size:`micro`,onClick:()=>f(``),"aria-label":`Clear search`,children:`Clear`})})},S={placeholder:`_placeholder_ee9qi_1`,invalid:`_invalid_ee9qi_11`},C={row:`_row_1i201_1`,content:`_content_1i201_19`,indexNumber:`_indexNumber_1i201_31`,scoreNumber:`_scoreNumber_1i201_39`,skeletonBars:`_skeletonBars_1i201_53`,skeletonBarLg:`_skeletonBarLg_1i201_59`,fade:`_fade_1i201_1`,skeletonBarSm:`_skeletonBarSm_1i201_66`},w=({skeleton:e=!1,index:t,score:n,showScore:r=!1,children:i,skeletonDelay:a=0,skeletonWidths:o=[62,38]})=>(0,u.jsxs)(`div`,{className:C.row,children:[t!==void 0&&(0,u.jsx)(`div`,{className:C.indexNumber,children:t}),(0,u.jsx)(`div`,{className:C.content,children:e?(0,u.jsxs)(`div`,{className:C.skeletonBars,children:[(0,u.jsx)(`div`,{className:C.skeletonBarLg,style:{width:`${o[0]}%`,animationDelay:`${a}s`}}),(0,u.jsx)(`div`,{className:C.skeletonBarSm,style:{width:`${o[1]}%`,animationDelay:`${a+.05}s`}})]}):i}),r&&n!==void 0&&(0,u.jsx)(`div`,{className:C.scoreNumber,children:n})]}),T={wrapper:`_wrapper_81m3c_6`,skeletonAppear:`_skeletonAppear_81m3c_1`},E=[[62,38],[75,45],[58,33],[70,42],[65,50],[55,35],[72,40],[60,30]],D=({rows:e=6})=>(0,u.jsx)(`div`,{className:T.wrapper,children:Array.from({length:e}).map((e,t)=>(0,u.jsx)(w,{skeleton:!0,skeletonDelay:t*.1,skeletonWidths:E[t%E.length]},t))}),O=({fields:e,resultsPerPage:t,children:n})=>{let{state:{results:r,resultsSuppressed:i,searchSettings:a,truncationIndex:o,query:s},isFetchingInitial:l,allowEmptySearch:p,fetchMoreResults:m}=b(),h=t??30,[g,_]=(0,c.useState)(h),v=(0,c.useRef)(0),y=(0,c.useRef)(``);(0,c.useEffect)(()=>{let e=s!==y.current;(!r||r.length<v.current||e)&&_(h),v.current=r?.length??0,y.current=s},[r,h,s]);let x=r&&r.length>g;return l?p?(0,u.jsx)(D,{rows:h}):(0,u.jsx)(`div`,{className:S.placeholder,children:(0,u.jsx)(f.Indx,{size:200,color:`var(--lv5)`})}):i||r===null?(0,u.jsx)(`div`,{className:S.placeholder,children:(0,u.jsx)(f.Indx,{size:200,color:`var(--lv5)`})}):r.length===0?(0,u.jsx)(`div`,{className:S.invalid,children:(0,u.jsx)(`p`,{children:`No results found.`})}):(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(`div`,{children:(r??[]).slice(0,g).map((t,r)=>{let i=t.document,o=t.score,s;try{s=typeof i==`string`?JSON.parse(i):i}catch{return(0,u.jsx)(`div`,{className:S.invalid,children:(0,u.jsx)(`p`,{children:`Invalid JSON`})},r)}let c;if(e&&e.length>0){c={};for(let t of e)t in s&&(c[t]=s[t])}else c={...s};for(let e in c){let t=c[e];if(typeof t==`string`&&t.startsWith(`[`)&&t.endsWith(`]`)){let n=t.replace(/^\[|\]$/g,``);c[e]=n.split(`,`).map(e=>e.trim().replace(/^'|'$/g,``)).filter(e=>e.length>0)}}return(0,u.jsx)(w,{index:r,score:o,showScore:a.showScore,children:n(c)},r)})}),x&&(0,u.jsx)(`div`,{style:{textAlign:`center`,marginTop:`20px`},children:(0,u.jsx)(d.Button,{variant:`secondary`,size:`micro`,onClick:()=>{let e=g+h;_(e),r&&e>=r.length&&(!o||o===-1||o>r.length)&&m(r.length+h)},children:s.trim()===``?`Load more`:o!==-1&&o!==void 0&&o>0?`Load results ${g+1}-${Math.min(g+h,r.length,o)} of ${o}`:`Load more`})})]})},k={row:`_row_ujwhc_1`,title:`_title_ujwhc_8`},A=({variant:e=`default`,children:t})=>(0,u.jsx)(`div`,{className:[k.row,e===`title`?k.title:``].filter(Boolean).join(` `),children:t}),j={bar:`_bar_145f5_12`,skeletonAppear:`_skeletonAppear_145f5_1`,fade:`_fade_145f5_1`,listRows:`_listRows_145f5_19`,sliderArea:`_sliderArea_145f5_25`,sliderTrack:`_sliderTrack_145f5_32`,inputRow:`_inputRow_145f5_40`,inputBar:`_inputBar_145f5_45`},M=[65,80,55,72,60,75,50,68],N=({title:e,rows:t=5,variant:n=`list`,collapsible:r=!0,startCollapsed:i=!1})=>(0,u.jsx)(d.FilterPanelBase,{title:e,collapsible:r,collapsed:i,children:n===`slider`?(0,u.jsxs)(`div`,{className:j.sliderArea,children:[(0,u.jsx)(`div`,{className:j.sliderTrack}),(0,u.jsxs)(`div`,{className:j.inputRow,children:[(0,u.jsx)(`div`,{className:j.inputBar,style:{animationDelay:`0.1s`}}),(0,u.jsx)(`div`,{className:j.inputBar,style:{animationDelay:`0.15s`}})]})]}):(0,u.jsx)(`div`,{className:j.listRows,children:Array.from({length:t}).map((e,t)=>(0,u.jsx)(`div`,{className:j.bar,style:{width:`${M[t%M.length]}%`,animationDelay:`${t*.05}s`}},t))})}),P={list:`_list_m82u6_2`,count:`_count_m82u6_7`,countValue:`_countValue_m82u6_17`,chip:`_chip_m82u6_22`,chipLabel:`_chipLabel_m82u6_32`,grid:`_grid_m82u6_40`},F=({field:e,label:t,preserveBlankFacetState:n=!1,preserveBlankFacetStateOrder:r=!1,sortFacetsBy:i=`histogram`,limit:a=10,collapsible:o=!0,startCollapsed:s=!1,displayType:l=`checkbox`,layout:f=`list`,showActivePanel:p=!1,showCount:m=!0,showNull:h=!1,displayIfEmptyQuery:g=!0,displayCondition:_=e=>!0})=>{let{state:{facets:v,filterableFields:y,facetableFields:x,filters:S,query:C},toggleFilter:w,isFetchingInitial:T,allowEmptySearch:E}=b(),D=(0,c.useRef)(null),[O,k]=(0,c.useState)(a);if((0,c.useEffect)(()=>{k(a)},[v?.[e],a]),!E&&!C)return null;if(T||!v)return l===`toggle`?(0,u.jsx)(N,{rows:1,collapsible:!1}):(0,u.jsx)(N,{title:t,rows:Math.min(a,6),collapsible:o,startCollapsed:s});if(!_({query:C??``,filters:S,facets:v})||!g&&!C&&Object.keys(S).length<1)return null;if(!y?.includes(e)||!x?.includes(e)){let t=[];return y?.includes(e)||t.push(`filterable`),x?.includes(e)||t.push(`facetable`),(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,children:(0,u.jsxs)(`div`,{style:{color:`red`,fontSize:`12px`},children:[`Cannot render filter for "`,e,`": missing `,t.join(` and `),`.`]})})}let A=v?.[e];if(!A||!Array.isArray(A))return null;let j=S?.[e]??[];n&&!D.current&&A.length>0&&(D.current=A.reduce((e,t)=>(e[t.key]=t.value,e),{}));let M=new Map;n&&D.current&&Object.keys(D.current).forEach(e=>{M.set(e,0)}),A.forEach(e=>{M.set(e.key,e.value)});let F=l===`toggle`&&M.size===2&&M.has(`true`)&&(M.has(`false`)||M.has(`null`));if(M.has(`null`)){let e=M.get(`null`)??0,t=M.get(`false`)??0;M.set(`false`,(t??0)+e),M.delete(`null`)}if(l===`toggle`&&!F)return(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,children:(0,u.jsx)(`div`,{className:P.count,children:(0,u.jsx)(d.ToggleSwitch,{label:t,checked:!1,onChange:()=>{},disabled:!0})})});if(F){let n=M.get(`true`),r=typeof n==`number`?n:null,i=j.includes(`true`),a=r===0,o=m&&(r??0)>0?`${r}`:``;return(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,children:(0,u.jsxs)(`div`,{className:P.count,children:[(0,u.jsx)(d.ToggleSwitch,{label:t,checked:i,onChange:()=>w(e,`true`),disabled:a}),` `,o]})})}let I=Array.from(M.entries());if(h||(I=I.filter(([e])=>e!==`null`)),I.length===0&&!n)return null;if(!r)if(i===`alphabetical`){let e=I.filter(([,e])=>typeof e==`number`&&e>0).sort(([e],[t])=>e.localeCompare(t)),t=I.filter(([,e])=>e===0||e===null).sort(([e],[t])=>e.localeCompare(t));I=[...e,...t]}else if(i===`numeric`){let e=(e,t)=>{let n=Number(e),r=Number(t);return!isNaN(n)&&!isNaN(r)?n-r:e.localeCompare(t)},t=I.filter(([,e])=>typeof e==`number`&&e>0).sort(([t],[n])=>e(t,n)),n=I.filter(([,e])=>e===0||e===null).sort(([t],[n])=>e(t,n));I=[...t,...n]}else{let e=I.filter(([,e])=>typeof e==`number`&&e>0),t=I.filter(([,e])=>e===0||e===null);I=[...e,...t]}let L=typeof a==`number`&&I.length>a,R=L?I.slice(0,O):I,z=(t,n)=>{let r=j.includes(t),i=n===0,a=m&&(n??0)>0?` (${n})`:``,o=m&&(n??0)>0?n:``;switch(l){case`button`:return f===`list`?(0,u.jsxs)(`div`,{className:P.count,children:[(0,u.jsx)(d.Button,{variant:r?`primary`:`secondary`,onClick:()=>w(e,t),disabled:i,size:`micro`,className:P.chip,title:t,children:(0,u.jsx)(`span`,{className:P.chipLabel,children:t})}),(0,u.jsx)(`span`,{className:P.countValue,children:o})]}):(0,u.jsx)(d.Button,{variant:r?`primary`:`secondary`,onClick:()=>w(e,t),disabled:i,size:`micro`,className:P.chip,title:`${t}${a}`,children:(0,u.jsx)(`span`,{className:P.chipLabel,children:`${t}${a}`})});case`toggle`:return(0,u.jsx)(d.ToggleSwitch,{label:t,checked:r,onChange:()=>w(e,t),disabled:i});default:return f===`list`?(0,u.jsxs)(`div`,{className:P.count,children:[(0,u.jsx)(d.Checkbox,{label:t,score:``,checked:r,onChange:()=>w(e,t),disabled:i}),(0,u.jsx)(`span`,{children:o})]}):(0,u.jsx)(d.Checkbox,{label:t,score:a,checked:r,onChange:()=>w(e,t),disabled:i})}};return(0,u.jsx)(d.FilterPanelBase,{title:t,collapsible:o,collapsed:o?s:!1,children:(0,u.jsxs)(`ul`,{className:f===`grid`?P.grid:P.list,style:{listStyle:`none`,padding:0,margin:0},children:[R.map(([e,t])=>(0,u.jsx)(`li`,{children:z(e,t)},e)),L&&O<I.length&&(()=>{let e=I.length-O,t=Math.min(50,e);return(0,u.jsx)(`li`,{className:P.toggleItem,children:(0,u.jsx)(d.Button,{variant:`ghost`,size:`micro`,onClick:()=>k(e=>e+50),children:`Show ${t} more of ${I.length} total`})})})()]})})},I={disabledMessage:`_disabledMessage_uci6n_1`,histogram:`_histogram_uci6n_6`,histogramBar:`_histogramBar_uci6n_15`},L=({field:e,label:t,expectedMin:n=0,expectedMax:r=1e3,displayType:i=`input`,collapsible:a=!0,startCollapsed:o=!1,showHistogram:s=!1,resolution:l})=>{let{state:{rangeFilters:f,rangeBounds:p,facetStats:m,facets:h,facetableFields:g,query:_,facetDebounceDelayMillis:v},setRangeFilter:y,resetRangeFilter:x,allowEmptySearch:S,isFetchingInitial:C}=b(),w=p?.[e]!==void 0,T=p?.[e]??{min:n,max:r},E=T.min,D=T.max,O=m?.[e]??T,k=Math.max(E,Math.min(D,O.min)),A=Math.max(E,Math.min(D,O.max)),j=w&&E===D,M=j?n:E,P=j?r:D,F=f?.[e],L=F?F.min:E,R=F?F.max:D,z=F!==void 0,B=k!==E||A!==D,[V,H]=c.default.useState([L,R]),[U,W]=c.default.useState(!1),[G,K]=c.default.useState(!1),{finalMin:q,finalMax:J,isValidMin:Y,isValidMax:X}=c.default.useMemo(()=>{let[e,t]=V,n=Math.max(E,Math.min(D,e)),r=Math.max(E,Math.min(D,t)),i=Math.min(n,r),a=Math.max(n,r);return{finalMin:i,finalMax:a,isValidMin:i>=E&&i<a,isValidMax:a<=D&&a>i}},[V,E,D]);c.default.useEffect(()=>{if(j)return;if(V[0]===E&&V[1]===D){W(!1),K(!1);return}let t=v??500,n=setTimeout(()=>{W(!Y),K(!X)},300),r=setTimeout(()=>{Y&&X&&(q===E&&J===D?x(e,!1):y(e,q,J))},t);return()=>{clearTimeout(n),clearTimeout(r)}},[q,J,Y,X,E,D,e,x,y,v,j]),c.default.useEffect(()=>{H([L,R]),W(!1),K(!1)},[L,R,e]);let ee=c.default.useCallback(e=>{j||H([Math.max(E,Math.min(A,e[0])),Math.max(k,Math.min(D,e[1]))])},[j,E,D,k,A]),te=c.default.useCallback(t=>{if(j)return;let n=Math.max(E,Math.min(A,t[0])),r=Math.max(k,Math.min(D,t[1]));n===E&&r===D?(H([E,D]),x(e,!0)):H([n,r])},[j,E,D,k,A,e,x]),ne=c.default.useCallback(e=>{if(j)return;let t=Number(e.target.value);isNaN(t)||H([Math.max(E,Math.min(A,t)),V[1]])},[j,V,E,A]),re=c.default.useCallback(e=>{if(j)return;let t=Number(e.target.value);if(!isNaN(t)){let e=Math.max(k,Math.min(D,t));H([V[0],e])}},[j,V,k,D]),ie=c.default.useCallback(()=>{let e=V[0],t=Math.max(E,Math.min(A,e));t<V[1]?H([t,V[1]]):H([E,V[1]])},[V,E,A]),ae=c.default.useCallback(()=>{let e=V[1],t=Math.max(k,Math.min(D,e));t>V[0]?H([V[0],t]):H([V[0],D])},[V,k,D]),[Z,oe]=c.default.useState(null),Q=c.default.useRef(null);c.default.useEffect(()=>{if(!s)return;let t=`${E}:${D}`;if(t===Q.current&&Q.current!==null)return;let n=h?.[e];if(!Array.isArray(n)||n.length===0)return;let r=n.filter(e=>e.value!=null&&!isNaN(Number(e.key))).map(e=>({key:e.key,value:e.value}));r.length>0&&(Q.current=t,oe(r))},[E,D,h,e,s]);let $=c.default.useMemo(()=>{if(!s||!Z||Z.length===0)return[];let e=D-E;if(e<=0)return[];let t=l??(Math.ceil(e/20)||1),n=Math.ceil(e/t);return Array.from({length:n},(e,n)=>{let r=E+n*t,i=E+(n+1)*t;return{bucketStart:r,bucketEnd:i,count:Z.filter(e=>{let t=Number(e.key);return t>=r&&t<i}).reduce((e,t)=>e+t.value,0)}})},[s,Z,E,D,l]),se=c.default.useMemo(()=>Math.max(...$.map(e=>e.count),1),[$]);return s&&!C&&!g?.includes(e)&&console.warn(`RangeFilterPanel: showHistogram=true but field "${e}" is not facetable. Add .Facetable = true to this field.`),C?(0,u.jsx)(N,{title:t,variant:`slider`,collapsible:a,startCollapsed:o}):!S&&!_?null:i===`slider`?(0,u.jsxs)(d.FilterPanelBase,{title:t,collapsed:o,collapsible:a,children:[j&&(0,u.jsxs)(`div`,{className:I.disabledMessage,children:[`No adjustable range (all results have the same value: `,E,`).`]}),s&&$.length>0&&(0,u.jsx)(`div`,{className:I.histogram,children:(()=>{let e=typeof k==`number`&&typeof A==`number`&&A>k&&(k>E||A<D);return $.map((t,n)=>{let r=Math.max(1,Math.ceil(t.count/se*20)),i=e?t.bucketEnd>k&&t.bucketStart<A:t.bucketEnd>q&&t.bucketStart<J;return(0,u.jsx)(`div`,{className:I.histogramBar,"data-testid":`histogram-bar`,"data-active":i,style:{height:`${r}px`,background:i?`var(--lv5)`:`var(--lv3)`}},n)})})()}),(0,u.jsx)(`div`,{style:{padding:`10px 10px 20px 10px`},children:(0,u.jsx)(d.Slider,{min:M,max:P,value:j?[M,P]:[q,J],isRange:!0,onChange:e=>ee(e),onFinalChange:e=>te(e),disabled:j,activeMin:k,activeMax:A,isFaceted:B,highlightFaceted:z,"aria-label":t||`Filter by ${e}`})}),(0,u.jsxs)(`div`,{style:{display:`flex`,flex:`flex-grow`,gap:`10px`,alignItems:`flex-start`,justifyContent:`space-between`},children:[(0,u.jsx)(d.InputField,{label:`Min:`,type:`number`,value:j?E:V[0],min:E,max:Math.min(A,V[1]-1),onChange:ne,onBlur:ie,disabled:j,isValid:j||!U}),(0,u.jsx)(d.InputField,{label:`Max:`,type:`number`,value:j?D:V[1],min:Math.max(k,V[0]+1),max:D,onChange:re,onBlur:ae,disabled:j,isValid:j||!G})]})]}):(0,u.jsxs)(d.FilterPanelBase,{title:t,children:[j&&(0,u.jsxs)(`div`,{className:I.disabledMessage,children:[`No adjustable range (all results have the same value: `,E,`).`]}),(0,u.jsxs)(`div`,{style:{display:`flex`,gap:`10px`,alignItems:`flex-start`},children:[(0,u.jsx)(d.InputField,{label:`Min:`,type:`number`,value:j?E:V[0],min:E,max:Math.min(A,V[1]-1),onChange:ne,onBlur:ie,disabled:j,isValid:j||!U}),(0,u.jsx)(d.InputField,{label:`Max:`,type:`number`,value:j?D:V[1],min:Math.max(k,V[0]+1),max:D,onChange:re,onBlur:ae,disabled:j,isValid:j||!G})]})]})},R={grid:`_grid_xm2uh_2`,chip:`_chip_xm2uh_17`,chipLabel:`_chipLabel_xm2uh_28`},z=(0,c.memo)(({field:e,value:t,onReset:n})=>(0,u.jsx)(`li`,{children:(0,u.jsx)(d.Button,{onClick:n,iconRight:(0,u.jsx)(f.X_or_error,{}),variant:`primary`,size:`micro`,className:R.chip,title:`${e}: ${t}`,children:(0,u.jsxs)(`span`,{className:R.chipLabel,children:[e,`: `,t]})})})),B=(0,c.memo)(({field:e,min:t,max:n,onReset:r})=>(0,u.jsx)(`li`,{children:(0,u.jsx)(d.Button,{onClick:r,iconRight:(0,u.jsx)(f.X_or_error,{}),variant:`primary`,size:`micro`,className:R.chip,title:`${e}: ${t} – ${n}`,children:(0,u.jsxs)(`span`,{className:R.chipLabel,children:[e,`: `,t,` – `,n]})})}));function V(){let{state:{filters:e,rangeFilters:t},resetFilters:n,resetSingleFilter:r,resetRangeFilter:i}=b(),a=(0,c.useMemo)(()=>Object.entries(e).map(([e,t])=>t.map(t=>({field:e,value:t}))).flat(),[e]),o=(0,c.useMemo)(()=>Object.entries(t).map(([e,{min:t,max:n}])=>({field:e,min:t,max:n})),[t]);return(0,c.useMemo)(()=>Object.keys(e).length>0||Object.keys(t).length>0,[e,t])?(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,title:`Active filters`,children:(0,u.jsxs)(`ul`,{className:R.grid,children:[a.map(({field:e,value:t})=>(0,u.jsx)(z,{field:e,value:t,onReset:()=>r(e,t)},`${e}-${t}`)),o.map(({field:e,min:t,max:n})=>(0,u.jsx)(B,{field:e,min:t,max:n,onReset:()=>i(e)},e)),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.Button,{onClick:n,size:`micro`,variant:`ghost`,children:`Reset`})})]})}):null}var H={select:`_select_nwf7i_1`,radioGroup:`_radioGroup_nwf7i_6`},U=({displayType:e=`dropdown`,collapsible:t=!0,startCollapsed:n=!1})=>{let{state:{sortableFields:r,sortBy:i,sortAscending:a},setSort:o,isFetchingInitial:s}=b();if(s)return(0,u.jsx)(N,{title:`Sort by`,rows:e===`radio`?3:1,collapsible:t,startCollapsed:n});if(!r||r.length===0)return null;let c=i?`${i}:${a?`asc`:`desc`}`:`none`,l=[{label:`None`,value:`none`},...r.flatMap(e=>[{label:`${e} (asc)`,value:`${e}:asc`},{label:`${e} (desc)`,value:`${e}:desc`}])],f=e=>{if(e===`none`||e===``)o(null,!0);else{let[t,n]=e.split(`:`);o(t,n===`asc`)}};return(0,u.jsx)(d.FilterPanelBase,{title:`Sort by`,collapsible:t,collapsed:t?n:!1,children:e===`dropdown`?(0,u.jsx)(d.Select,{value:c,onValueChange:f,options:l,placeholder:`Select sort...`,"aria-label":`Sort by`}):(0,u.jsx)(`div`,{className:H.radioGroup,children:l.map(e=>(0,u.jsx)(d.RadioButton,{id:`sort-${e.value}`,name:`sort-by`,value:e.value,label:e.label,checked:c===e.value,onChange:e=>f(e.target.value)},e.value))})})},W={list:`_list_1y4fk_1`};function G(){let{state:{searchSettings:e},setSearchSettings:t}=b(),[n,r]=(0,c.useState)(!1),i=(e,n)=>{let r=parseInt(n,10);isNaN(r)||t({[e]:r})},a=(e,n)=>{t({[e]:n})},o=(n,r)=>{let i=parseInt(r,10);isNaN(i)||t({coverageSetup:{...e.coverageSetup,[n]:i}})},s=(n,r)=>{t({coverageSetup:{...e.coverageSetup,[n]:r}})};return(0,u.jsx)(d.FilterPanelBase,{collapsed:!0,title:`Settings`,children:(0,u.jsxs)(`ul`,{className:W.list,children:[(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Max Results`,type:`number`,value:e.maxNumberOfRecordsToReturn.toString(),onChange:e=>i(`maxNumberOfRecordsToReturn`,e.target.value)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Coverage Depth`,type:`number`,value:e.coverageDepth.toString(),onChange:e=>i(`coverageDepth`,e.target.value)})}),(0,u.jsxs)(`li`,{children:[(0,u.jsx)(d.InputField,{label:`Minimum Score (16 bit)`,type:`number`,value:e.minimumScore.toString(),min:`0`,max:`65535`,onChange:e=>{let n=parseFloat(e.target.value);isNaN(n)||t({minimumScore:n})}}),(0,u.jsx)(`div`,{style:{padding:`10px 10px 20px 10px`},children:(0,u.jsx)(d.Slider,{min:0,max:65535,step:5e3,value:e.minimumScore,onChange:e=>{t({minimumScore:e})},"aria-label":`Minimum score`})})]}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Placeholder text`,type:`text`,value:e.placeholderText,onChange:e=>{t({placeholderText:e.target.value})}})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Show score`,checked:e.showScore,onChange:e=>a(`showScore`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Enable Coverage`,checked:e.enableCoverage,onChange:e=>a(`enableCoverage`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Remove Duplicates`,checked:e.removeDuplicates,onChange:e=>a(`removeDuplicates`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.Button,{variant:`ghost`,size:`micro`,iconRight:n?(0,u.jsx)(f.ArrowDown,{}):(0,u.jsx)(f.ArrowRight,{}),onClick:()=>r(e=>!e),children:n?`Hide Coverage Setup`:`Show Coverage Setup`})}),n&&(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Cover Whole Query`,checked:e.coverageSetup.coverWholeQuery,onChange:e=>s(`coverWholeQuery`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Cover Whole Words`,checked:e.coverageSetup.coverWholeWords,onChange:e=>s(`coverWholeWords`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Cover Fuzzy Words`,checked:e.coverageSetup.coverFuzzyWords,onChange:e=>s(`coverFuzzyWords`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Cover Joined Words`,checked:e.coverageSetup.coverJoinedWords,onChange:e=>s(`coverJoinedWords`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Cover Prefix Suffix`,checked:e.coverageSetup.coverPrefixSuffix,onChange:e=>s(`coverPrefixSuffix`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Truncate`,checked:e.coverageSetup.truncate,onChange:e=>s(`truncate`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Include Pattern Matches`,checked:e.coverageSetup.includePatternMatches,onChange:e=>s(`includePatternMatches`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Levenshtein Max Word Size`,type:`number`,value:e.coverageSetup.levenshteinMaxWordSize.toString(),onChange:e=>o(`levenshteinMaxWordSize`,e.target.value)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Min Word Size`,type:`number`,value:e.coverageSetup.minWordSize.toString(),onChange:e=>o(`minWordSize`,e.target.value)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Truncate Word Hit Limit`,type:`number`,value:e.coverageSetup.truncateWordHitLimit.toString(),onChange:e=>o(`truncateWordHitLimit`,e.target.value)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Truncate Word Hit Tolerance`,type:`number`,value:e.coverageSetup.truncateWordHitTolerance.toString(),onChange:e=>o(`truncateWordHitTolerance`,e.target.value)})})]})]})})}var K=class extends c.Component{constructor(e){super(e),this.state={hasError:!1,error:null}}static getDerivedStateFromError(e){return{hasError:!0,error:e}}componentDidCatch(e,t){console.error(`[SearchErrorBoundary] Caught error:`,e,t)}reset=()=>{this.setState({hasError:!1,error:null})};render(){return this.state.hasError&&this.state.error?this.props.fallback?this.props.fallback(this.state.error,this.reset):(0,u.jsxs)(`div`,{style:{padding:`2rem`,backgroundColor:`#fee`,border:`2px solid #c33`,borderRadius:`8px`,maxWidth:`600px`,margin:`2rem auto`},children:[(0,u.jsx)(`h2`,{style:{color:`#c33`,marginTop:0},children:`⚠️ Search Initialization Error`}),(0,u.jsxs)(`p`,{style:{marginBottom:`1rem`},children:[(0,u.jsx)(`strong`,{children:`Error:`}),` `,this.state.error.message]}),(0,u.jsxs)(`div`,{style:{backgroundColor:`#fff`,padding:`1rem`,borderRadius:`4px`,marginBottom:`1rem`,fontSize:`0.9rem`},children:[(0,u.jsx)(`strong`,{children:`💡 Common fixes:`}),(0,u.jsxs)(`ul`,{style:{marginBottom:0,paddingLeft:`1.5rem`},children:[(0,u.jsx)(`li`,{children:`Check browser console for detailed error messages`}),(0,u.jsx)(`li`,{children:`Verify the url passed to SearchProvider is correct`}),(0,u.jsx)(`li`,{children:`Verify your bearer token is valid (create or check it on the IndxCloudApi website)`}),(0,u.jsx)(`li`,{children:`Ensure INDX server is running`}),(0,u.jsx)(`li`,{children:`Check dataset name spelling`})]})]}),(0,u.jsx)(`button`,{onClick:this.reset,style:{padding:`0.5rem 1rem`,backgroundColor:`#c33`,color:`white`,border:`none`,borderRadius:`4px`,cursor:`pointer`,fontWeight:`bold`},children:`Try Again`})]}):this.props.children}};function q(e,t){let{url:n,team:r,dataset:i,authenticatedFetch:a}=b(),[o,s]=(0,c.useState)(null),[l,u]=(0,c.useState)(!1),[d,f]=(0,c.useState)(void 0);return{results:o,isLoading:l,error:d,search:(0,c.useCallback)(async o=>{u(!0),f(void 0);try{let c=await e(o),l={fieldName:t.fieldName,vector:c,maxResults:t.maxResults??10};t.filter&&(l.filter=t.filter);let u=await a(`${n}/api/teams/${r}/datasets/${i}/search/vector`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(l)});if(!u.ok)throw Error(`VectorSearch failed: ${u.status}`);let d=await u.json();if(d.length===0){s([]);return}let f=d.map(e=>e.documentKey),p=await a(`${n}/api/teams/${r}/datasets/${i}/documents/lookup`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(f)});if(!p.ok)throw Error(`GetJson failed: ${p.status}`);s((await p.json()).map((e,t)=>({document:e,documentKey:f[t],score:d[t].score})))}catch(e){f(e instanceof Error?e.message:`Vector search failed`),s(null)}finally{u(!1)}},[e,t.fieldName,t.maxResults,t.filter,n,r,i,a])}}function J(e,t){let{url:n,team:r,dataset:i,authenticatedFetch:a}=b(),[o,s]=(0,c.useState)(null),[l,u]=(0,c.useState)(!1),[d,f]=(0,c.useState)(void 0);return{results:o,isLoading:l,error:d,search:(0,c.useCallback)(async o=>{u(!0),f(void 0);try{let c=await e(o),l={text:o,embeddingField:t.fieldName,vector:c,maxNumberOfRecordsToReturn:t.maxResults??10,alpha:t.alpha??.5};t.filter&&(l.filter=t.filter),t.timeoutMs&&(l.timeOutLimitMilliseconds=t.timeoutMs);let u=await a(`${n}/api/teams/${r}/datasets/${i}/search/hybrid`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(l)});if(!u.ok)throw Error(`HybridSearch failed: ${u.status}`);let d=await u.json();if(d.length===0){s([]);return}let f=d.map(e=>e.documentKey),p=await a(`${n}/api/teams/${r}/datasets/${i}/documents/lookup`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(f)});if(!p.ok)throw Error(`GetJson failed: ${p.status}`);s((await p.json()).map((e,t)=>({document:e,documentKey:f[t],score:d[t].score})))}catch(e){f(e instanceof Error?e.message:`Hybrid search failed`),s(null)}finally{u(!1)}},[e,t.fieldName,t.alpha,t.maxResults,t.filter,t.timeoutMs,n,r,i,a])}}exports.ActiveFiltersPanel=V,exports.FilterPanelSkeleton=N,exports.RangeFilterPanel=L,exports.SearchContext=v,exports.SearchErrorBoundary=K,exports.SearchInput=x,exports.SearchProvider=y,exports.SearchResult=w,exports.SearchResultRow=A,exports.SearchResults=O,exports.SearchResultsSkeleton=D,exports.SearchSettingsPanel=G,exports.SortByPanel=U,exports.ValueFilterPanel=F,exports.useHybridSearch=J,exports.useSearch=b,exports.useSearchContext=b,exports.useVectorSearch=q;
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));require("@indxsearch/systm/styles.css");let c=require("react");c=s(c);let l=require("@indxsearch/indx-types"),u=require("react/jsx-runtime"),d=require("@indxsearch/systm"),f=require("@indxsearch/pixl");function p({url:e,team:t,dataset:n,preAuthenticatedToken:r,enableDebugLogs:i=!1}){let[a,o]=(0,c.useState)(null),[s,u]=(0,c.useState)(!0),[d,f]=(0,c.useState)([]),[p,m]=(0,c.useState)([]),[h,g]=(0,c.useState)([]),[_,v]=(0,c.useState)({}),[y,b]=(0,c.useState)({}),[x,S]=(0,c.useState)(0),[C,w]=(0,c.useState)(null);return(0,c.useEffect)(()=>{(async()=>{w(null);try{if(!r)throw console.error(`[Auth] ❌ Missing bearer token`),console.error(`[Auth] 💡 Pass preAuthenticatedToken to SearchProvider (create a token on the IndxCloudApi website)`),Error(`A bearer token is required. Check console for instructions.`);if(!e)throw console.error(`[Auth] ❌ Missing INDX server URL`),console.error(`[Auth] 💡 Pass a url to SearchProvider`),Error(`INDX server URL is required. Check console for instructions.`);if(!n)throw console.error(`[Auth] ❌ Missing dataset name`),console.error(`[Auth] 💡 Pass dataset="your-dataset-name" to SearchProvider`),Error(`Dataset name is required. Check console for instructions.`);i&&console.log(`[Auth] ✅ Using bearer token`);let a=r,s=e=>fetch(e,{method:`GET`,headers:{accept:`text/plain`,Authorization:`Bearer ${a}`}});i&&console.log(`[Auth] 🔍 Checking dataset status...`);let c=await s(`${e}/api/teams/${t}/datasets/${n}/status`);if(!c.ok){if(c.status===401)throw console.error(`[Auth] ❌ Authentication failed (401 Unauthorized)`),console.error(`[Auth] 💡 Your token may be expired or invalid`),console.error(`[Auth] 💡 Create or refresh your token on the IndxCloudApi website`),Error(`Authentication failed (401). Token may be expired. Check console for instructions.`);if(c.status===404)throw console.error(`[Auth] ❌ Dataset "`+n+`" not found (404)`),console.error(`[Auth] 💡 Available datasets can be checked with: curl -X GET "`+e+`/api/me/datasets" -H "Authorization: Bearer YOUR_TOKEN"`),console.error(`[Auth] 💡 Make sure you spelled the dataset name correctly`),Error(`Dataset "`+n+`" not found. Check console for instructions.`);{let t=await c.text();throw console.error(`[Auth] ❌ Failed to get dataset status:`,c.status,t),console.error(`[Auth] 💡 Check if your INDX server is running at:`,e),Error(`Failed to connect to INDX server. Check console for details.`)}}let u=await c.json();i&&console.log(`[Auth] 📊 Dataset status:`,u),i&&console.log(`[Auth] 🔓 Opening dataset session...`);let d=await fetch(`${e}/api/teams/${t}/datasets/${n}?configuration=400`,{method:`PUT`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${a}`},body:`""`});if(!d.ok)throw console.error(`[Auth] ❌ CreateOrOpen failed:`,d.status,await d.text()),Error(`Failed to open dataset session.`);o(a),i&&console.log(`[Auth] ✅ Dataset session established`),u.systemState!==void 0&&u.systemState!==l.SystemState.Ready&&(console.warn(`[Auth] ⚠️ Dataset is not ready yet. Current state:`,l.SystemState[u.systemState]),console.warn(`[Auth] 💡 Wait for indexing to complete before searching`));let p=u.documentCount??u.numberOfRecords??0;p===0?(console.warn(`[Auth] ⚠️ Dataset "`+n+`" is empty (0 records)`),console.warn(`[Auth] 💡 Add documents to your dataset before searching`),console.warn(`[Auth] 💡 Search will work but return no results`)):i&&console.log(`[Auth] ✅ Dataset has`,p,`records`);let[h,_,y]=await Promise.all([s(`${e}/api/teams/${t}/datasets/${n}/fields/filterable`),s(`${e}/api/teams/${t}/datasets/${n}/fields/facetable`),s(`${e}/api/teams/${t}/datasets/${n}/fields/sortable`)]);if(!h.ok)throw console.error(`[Auth] ❌ GetFilterableFields failed:`,h.status,await h.text()),Error(`Failed to get filterable fields. Check console for details.`);if(!_.ok)throw console.error(`[Auth] ❌ GetFacetableFields failed:`,_.status,await _.text()),Error(`Failed to get facetable fields. Check console for details.`);if(!y.ok)throw console.error(`[Auth] ❌ GetSortableFields failed:`,y.status,await y.text()),Error(`Failed to get sortable fields. Check console for details.`);let[x,C,w]=await Promise.all([h.json().catch(e=>(console.error(`Failed to parse GetFilterableFields response:`,e),[])),_.json().catch(e=>(console.error(`Failed to parse GetFacetableFields response:`,e),[])),y.json().catch(e=>(console.error(`Failed to parse GetSortableFields response:`,e),[]))]);f(x||[]),m(C||[]),g(w||[]),S(p);let T={facets:{}};try{let r=await fetch(`${e}/api/teams/${t}/datasets/${n}/search`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${a}`},body:JSON.stringify({text:``,maxNumberOfRecordsToReturn:0,enableFacets:!0})});r.ok?T=await r.json().catch(e=>(console.warn(`Failed to parse blank search response:`,e),{facets:{}})):(console.warn(`Blank search failed:`,r.status,r.statusText),console.warn(`Continuing without initial facet data - facets will be populated after first search`))}catch(e){console.warn(`Blank search error:`,e),console.warn(`Continuing without initial facet data - facets will be populated after first search`)}let E={};if(T.facets){for(let[e,t]of Object.entries(T.facets))if(Array.isArray(t)&&t.length>0){let n=t.map(e=>Number(e.key)).filter(e=>!isNaN(e));n.length>0&&(E[e]={min:Math.min(...n),max:Math.max(...n)})}}let D={};if(T.facets)for(let[e,t]of Object.entries(T.facets))Array.isArray(t)&&(D[e]=t.map(e=>e.key));v(E),b(D),i&&console.log(`[Auth] ✅ Initialization complete`)}catch(t){console.error(`[Auth] ❌ Initialization failed:`,t),(t instanceof Error||typeof t==`object`&&t&&`message`in t)&&console.error(`[Auth] 💡 Error:`,t.message),t instanceof TypeError&&t.message.includes(`fetch`)&&(console.error(`[Auth] ❌ Network error - cannot connect to INDX server`),console.error(`[Auth] 💡 Check if the server is running at:`,e),console.error(`[Auth] 💡 Check the url you passed to SearchProvider`),console.error(`[Auth] 💡 For local development, it should be: http://localhost:5001`)),w(t instanceof Error?t.message:String(t))}finally{u(!1)}})()},[e,t,n]),{token:a,isFetchingInitial:s,authError:C,initialFacetStats:_,initialFacetKeys:y,filterableFields:d,facetableFields:p,sortableFields:h,totalDocumentCount:x}}async function m(e,t,n,r,i,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){let e=``;try{let t=await s.json();e=t?.detail??t?.title??``}catch{}throw Error(`${n} failed: HTTP ${s.status}${e?` — ${e}`:``}`)}let c=await s.json();if(!c||typeof c.hashString!=`string`)throw Error(`${n} failed: server returned no filter token`);return c}async function h(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 m(`combine`,{a:o,b:e[s],useAndOperation:t===`and`},`CombineFilters`,n,r,i,a);return o}async function g(e,t,n,r,i,a,o={}){let s=Object.entries(e??{}).filter(([,e])=>e.length>0),c=Object.entries(t??{}),[l,u]=await Promise.all([Promise.all(s.map(async([e,t])=>h(await Promise.all(t.map(t=>m(`value`,{fieldName:e,value:t},`Value filter '${e}'`,n,r,i,a))),o[e]===`any`?`or`:`and`,n,r,i,a))),Promise.all(c.map(([e,{min:t,max:o}])=>m(`range`,{fieldName:e,lowerLimit:t,upperLimit:o},`Range filter '${e}'`,n,r,i,a)))]);return h([...l,...u],`and`,n,r,i,a)}function _(e,t){let n,r=(...r)=>{clearTimeout(n),n=setTimeout(()=>e(...r),t)};return r.cancel=()=>clearTimeout(n),r}function v({state:e,setState:t,authenticatedFetch:n,auth:r,url:i,team:a,dataset:o,allowEmptySearch:s,facetsEnabled:l,enableDebugLogs:u,filtersChangedByUser:d,shouldFetchMore:f}){let p=(0,c.useRef)(0),m=(0,c.useRef)(void 0),h=(0,c.useRef)(!1),[v,y]=(0,c.useState)({}),[b,x]=(0,c.useState)(``),[S,C]=(0,c.useState)(``);(0,c.useEffect)(()=>{r.isFetchingInitial||t(e=>({...e,facetStats:r.initialFacetStats,rangeBounds:r.initialFacetStats,totalDocumentCount:r.totalDocumentCount,filterableFields:r.filterableFields,facetableFields:r.facetableFields,sortableFields:r.sortableFields}))},[r.isFetchingInitial,r.initialFacetStats,r.totalDocumentCount,r.filterableFields,r.facetableFields,r.sortableFields,t]);let w=e.searchSettings.maxNumberOfRecordsToReturn,T=e.searchSettings.enableCoverage,E=e.searchSettings.removeDuplicates,D=e.searchSettings.coverageDepth,O=e.searchSettings.minimumScore,k=e.searchSettings.coverageSetup,A=e.sortBy,j=e.sortAscending,M=(0,c.useCallback)(async({enableFacets:c})=>{if(!r.token)return;let l=++p.current;if(t(e=>({...e,isLoading:!0})),e.query.trim()===``){if(!s)return;c=!0}try{let d=await g(e.filters,e.rangeFilters,i,a,o,n,e.valueMatch),f=s||e.query.trim()!==``,m={text:e.query,maxNumberOfRecordsToReturn:f?w:0,enableFacets:c,...d?{filter:d}:{},...A?{sortBy:A}:{},...j===void 0?{}:{sortAscending:j},enableCoverage:T,removeDuplicates:E,coverageDepth:D,coverageSetup:k};u&&console.log(`[performSearch] request body:`,JSON.stringify(m,null,2));let h=await n(`${i}/api/teams/${a}/datasets/${o}/search`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(m)});if(!h.ok)throw Error(`Search failed: HTTP ${h.status}`);let _=await h.json(),M=_.truncationIndex??-1,N=_.records||[],P=N.map(e=>e.documentKey),F=N.map(e=>e.score),I=[];if(f&&P.length>0){let e=await n(`${i}/api/teams/${a}/datasets/${o}/documents/lookup`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(P)});if(!e.ok)throw Error(`Document lookup failed: HTTP ${e.status}`);I=(await e.json()).map((e,t)=>({document:e,documentKey:P[t],score:F[t]}))}let L={};if(c&&_.facets){for(let[e,t]of Object.entries(_.facets))if(Array.isArray(t)&&t.length>0){let n=t.map(e=>Number(e.key)).filter(e=>!isNaN(e));n.length>0&&(L[e]={min:Math.min(...n),max:Math.max(...n)})}}let R=e.query!==b,z=e.query!==S,B=e.facetStats??{};if(R?(B={...r.initialFacetStats,...L},y(B),x(e.query)):B={...v,...L},z&&c){let n={...e.rangeBounds};for(let[e,t]of Object.entries(L))n[e]=t;t(e=>({...e,rangeBounds:n})),C(e.query)}let V=_.facets;if(c&&(!V||Object.keys(V).length===0)){V={};for(let[e,t]of Object.entries(r.initialFacetKeys))V[e]=t.map(e=>({key:e,value:null}))}if(l!==p.current)return;let H=I.filter(t=>{let n=e.query.trim();return n===``||n.length===1?!0:t.score>=O});t(e=>({...e,results:H,error:void 0,resultsSuppressed:!f,...c?{facets:V,facetStats:B}:{},isLoading:!1,truncationIndex:M}))}catch(e){if(console.error(`[Search] ❌ Search failed:`,e),e instanceof TypeError&&e.message.includes(`fetch`)?(console.error(`[Search] ❌ Network error - cannot reach INDX server`),console.error(`[Search] 💡 Check if server is running at:`,i)):e instanceof Error&&(e.message.includes(`401`)?(console.error(`[Search] ❌ Authentication failed`),console.error(`[Search] 💡 Your token may have expired. Create or refresh it on the IndxCloudApi website.`)):e.message.includes(`404`)?(console.error(`[Search] ❌ Dataset not found`),console.error(`[Search] 💡 Check that dataset "`+o+`" exists`)):console.error(`[Search] 💡 Error:`,e.message)),l!==p.current)return;t(t=>({...t,results:null,isLoading:!1,resultsSuppressed:!1,error:e instanceof Error?e.message:`Search failed`}))}},[e.query,e.filters,e.valueMatch,e.rangeFilters,e.facetStats,A,j,w,T,E,D,k,O,n,r.initialFacetStats,r.initialFacetKeys,r.token,v,b,S,e.rangeBounds,i,a,o,s,u,t]);(0,c.useEffect)(()=>{m.current=M},[M]);let N=(0,c.useRef)(null);(0,c.useEffect)(()=>(N.current?.cancel(),N.current=_(()=>{u&&console.log(`Debounced searchWithFacets fired`),m.current?.({enableFacets:!0})},e.facetDebounceDelayMillis??500),()=>{N.current?.cancel()}),[e.facetDebounceDelayMillis]),(0,c.useEffect)(()=>{!r.isFetchingInitial&&r.token&&!h.current&&(s&&m.current?.({enableFacets:l}),h.current=!0)},[r.isFetchingInitial,r.token,s,l]),(0,c.useEffect)(()=>{if(!r.token||!h.current)return;let n=e.query.trim(),i=n===``&&s;if(n===``&&!s){e.resultsSuppressed||t(e=>({...e,resultsSuppressed:!0}));return}return i?(N.current?.cancel(),m.current?.({enableFacets:l})):l?(u&&console.log(`Search fired`),m.current?.({enableFacets:!1}),N.current?.()):m.current?.({enableFacets:!1}),()=>{N.current?.cancel()}},[e.query,s,l]),(0,c.useEffect)(()=>{let t=d.current;if(d.current=!1,!h.current||!r.token||!t)return;let n=e.query.trim();!s&&n===``||m.current?.({enableFacets:l})},[e.filters,e.rangeFilters]),(0,c.useEffect)(()=>{if(!h.current||!r.token)return;let t=e.query.trim();!s&&t===``||m.current?.({enableFacets:l})},[A,j]);let P=(0,c.useRef)(!0),F=(0,c.useRef)(e.query);(0,c.useEffect)(()=>{if(P.current){P.current=!1;return}if(F.current!==e.query||!h.current||!r.token)return;if(f.current){f.current=!1,m.current?.({enableFacets:!1});return}let t=e.query.trim();!s&&t===``||m.current?.({enableFacets:l})},[w,T,E,D,k,O]),(0,c.useEffect)(()=>{F.current=e.query},[e.query])}var y=(0,c.createContext)(void 0),b=({children:e,url:t,team:n,dataset:r,allowEmptySearch:i=!1,maxResults:a=10,facetDebounceDelayMillis:o=500,enableFacets:s=!0,coverageDepth:l=500,removeDuplicates:d=!0,enableCoverage:f=!0,initialCoverageSetup:m={},enableDebugLogs:h=!1,preAuthenticatedToken:g})=>{let _=(0,c.useRef)(!1),b=(0,c.useRef)(!1),x=(0,c.useRef)(a),[S,C]=(0,c.useState)({query:``,results:null,isLoading:!1,resultsSuppressed:!i,facetDebounceDelayMillis:o,filterableFields:[],facetableFields:[],sortableFields:[],filters:{},valueMatch:{},rangeFilters:{},facetStats:{},rangeBounds:{},searchSettings:{maxNumberOfRecordsToReturn:a,coverageDepth:l,enableCoverage:f,removeDuplicates:d,minimumScore:0,showScore:!0,placeholderText:`Type to search`,coverageSetup:{coverWholeQuery:!0,coverWholeWords:!0,coverFuzzyWords:!0,coverJoinedWords:!0,coverPrefixSuffix:!0,truncate:!0,includePatternMatches:!0,minWordSize:2,levenshteinMaxWordSize:20,truncateWordHitLimit:1,truncateWordHitTolerance:0,truncationScore:65024,...m}}});(0,c.useEffect)(()=>{h&&console.log(`SearchContext mounted on client`)},[h]),(0,c.useEffect)(()=>{C(e=>({...e,facetDebounceDelayMillis:o}))},[o]);let[w]=(0,c.useState)(s),T=p({url:t,team:n,dataset:r,preAuthenticatedToken:g,enableDebugLogs:h}),E=(0,c.useCallback)((e,t={})=>{if(!T.token)throw Error(`No authentication token available`);return fetch(e,{...t,headers:{...t.headers,Authorization:`Bearer ${T.token}`}})},[T.token]);v({state:S,setState:C,authenticatedFetch:E,auth:T,url:t,team:n,dataset:r,allowEmptySearch:i,facetsEnabled:w,enableDebugLogs:h,filtersChangedByUser:_,shouldFetchMore:b});let D=(0,c.useCallback)(e=>{_.current=!1,C(t=>{let n=Object.keys(t.filters).length>0,r=Object.keys(t.rangeFilters).length>0;return{...t,query:e,filters:n?{}:t.filters,rangeFilters:r?{}:t.rangeFilters,searchSettings:{...t.searchSettings,maxNumberOfRecordsToReturn:x.current}}})},[]),O=(0,c.useCallback)(e=>{C(t=>({...t,facetDebounceDelayMillis:e}))},[]),k=(0,c.useCallback)(e=>{typeof e.maxNumberOfRecordsToReturn==`number`&&(x.current=e.maxNumberOfRecordsToReturn),C(t=>{let n={...t.searchSettings,...e};return e.coverageSetup?n.coverageSetup={...t.searchSettings.coverageSetup,...e.coverageSetup}:n.coverageSetup=t.searchSettings.coverageSetup,{...t,searchSettings:n}})},[]),A=(0,c.useCallback)(e=>{b.current=!0,C(t=>({...t,searchSettings:{...t.searchSettings,maxNumberOfRecordsToReturn:e}}))},[]),j=(0,c.useCallback)((e,t)=>{_.current=!0,C(n=>{let r={...n.filters},i=r[e]||[],a=i.includes(t)?i.filter(e=>e!==t):[...i,t];return a.length?r[e]=a:delete r[e],{...n,filters:r}})},[]),M=(0,c.useCallback)((e,t)=>{C(n=>n.valueMatch[e]===t?n:{...n,valueMatch:{...n.valueMatch,[e]:t}})},[]),N=(0,c.useCallback)((e,t,n)=>{_.current=!0,C(r=>({...r,rangeFilters:{...r.rangeFilters,[e]:{min:t,max:n}}}))},[]),P=(0,c.useCallback)(()=>{_.current=!0,C(e=>({...e,filters:{},rangeFilters:{}}))},[]),F=(0,c.useCallback)((e,t,n=!0)=>{n&&(_.current=!0),C(n=>{let r={...n.filters},i=(r[e]||[]).filter(e=>e!==t);return i.length>0?r[e]=i:delete r[e],{...n,filters:r}})},[]),I=(0,c.useCallback)((e,t=!0)=>{t&&(_.current=!0),C(t=>{let n={...t.rangeFilters};return delete n[e],{...t,rangeFilters:n}})},[]),L=(0,c.useCallback)((e,t)=>{C(n=>({...n,sortBy:e||void 0,sortAscending:e?t:void 0}))},[]);return(0,u.jsx)(y.Provider,{value:{state:S,isFetchingInitial:T.isFetchingInitial,authError:T.authError??void 0,allowEmptySearch:i,url:t,team:n,dataset:r,authenticatedFetch:E,setQuery:D,toggleFilter:j,setValueMatch:M,setRangeFilter:N,resetFilters:P,resetSingleFilter:F,resetRangeFilter:I,setSort:L,setDebounceDelay:O,setSearchSettings:k,fetchMoreResults:A},children:e})},x=()=>{let e=(0,c.useContext)(y);if(!e)throw Error(`useSearchContext must be used within a SearchProvider`);return e},S=({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}=x();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`})})},C={placeholder:`_placeholder_ee9qi_1`,invalid:`_invalid_ee9qi_11`},w={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`},T=({skeleton:e=!1,index:t,score:n,showScore:r=!1,children:i,skeletonDelay:a=0,skeletonWidths:o=[62,38]})=>(0,u.jsxs)(`div`,{className:w.row,children:[t!==void 0&&(0,u.jsx)(`div`,{className:w.indexNumber,children:t}),(0,u.jsx)(`div`,{className:w.content,children:e?(0,u.jsxs)(`div`,{className:w.skeletonBars,children:[(0,u.jsx)(`div`,{className:w.skeletonBarLg,style:{width:`${o[0]}%`,animationDelay:`${a}s`}}),(0,u.jsx)(`div`,{className:w.skeletonBarSm,style:{width:`${o[1]}%`,animationDelay:`${a+.05}s`}})]}):i}),r&&n!==void 0&&(0,u.jsx)(`div`,{className:w.scoreNumber,children:n})]}),E={wrapper:`_wrapper_81m3c_6`,skeletonAppear:`_skeletonAppear_81m3c_1`},D=[[62,38],[75,45],[58,33],[70,42],[65,50],[55,35],[72,40],[60,30]],O=({rows:e=6})=>(0,u.jsx)(`div`,{className:E.wrapper,children:Array.from({length:e}).map((e,t)=>(0,u.jsx)(T,{skeleton:!0,skeletonDelay:t*.1,skeletonWidths:D[t%D.length]},t))}),k=/^\[\s*(?:'[^']*'(?:\s*,\s*'[^']*')*)?\s*\]$/;function A(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(!k.test(t))return;let n=[],r=/'([^']*)'/g,i;for(;(i=r.exec(t))!==null;)n.push(i[1]);return n}var j=({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:_}=x(),v=t??30,[y,b]=(0,c.useState)(v),S=(0,c.useRef)(0),w=(0,c.useRef)(``);(0,c.useEffect)(()=>{let e=l!==w.current;(!i||i.length<S.current||e)&&b(v),S.current=i?.length??0,w.current=l},[i,v,l]);let E=i&&i.length>y,D=()=>{let e=y+v;b(e),i&&e>=i.length&&(!s||s===-1||s>i.length)&&_(i.length+v)};if(m)return g?(0,u.jsx)(O,{rows:v}):(0,u.jsx)(`div`,{className:C.placeholder,children:(0,u.jsx)(f.Indx,{size:200,color:`var(--lv5)`})});let k=h??p;return k?(0,u.jsx)(`div`,{className:C.invalid,role:`alert`,children:(0,u.jsx)(`p`,{children:k})}):a||i===null?(0,u.jsx)(`div`,{className:C.placeholder,children:(0,u.jsx)(f.Indx,{size:200,color:`var(--lv5)`})}):i.length===0?(0,u.jsx)(`div`,{className:C.invalid,children:(0,u.jsx)(`p`,{children:`No results found.`})}):(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(`div`,{children:(i??[]).slice(0,y).map((t,i)=>{let a=t.document,s=t.score,c;try{c=typeof a==`string`?JSON.parse(a):a}catch{return(0,u.jsx)(`div`,{className:C.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=A(t);n&&(l[e]=n)}}return(0,u.jsx)(T,{index:i,score:s,showScore:o.showScore,children:r(l)},i)})}),E&&(0,u.jsx)(`div`,{style:{textAlign:`center`,marginTop:`20px`},children:(0,u.jsx)(d.Button,{variant:`secondary`,size:`micro`,onClick:D,children:l.trim()===``?`Load more`:s!==-1&&s!==void 0&&s>0?`Load results ${y+1}-${Math.min(y+v,i.length,s)} of ${s}`:`Load more`})})]})},M={row:`_row_ujwhc_1`,title:`_title_ujwhc_8`},N=({variant:e=`default`,children:t})=>(0,u.jsx)(`div`,{className:[M.row,e===`title`?M.title:``].filter(Boolean).join(` `),children:t}),P={bar:`_bar_145f5_12`,skeletonAppear:`_skeletonAppear_145f5_1`,fade:`_fade_145f5_1`,listRows:`_listRows_145f5_19`,sliderArea:`_sliderArea_145f5_25`,sliderTrack:`_sliderTrack_145f5_32`,inputRow:`_inputRow_145f5_40`,inputBar:`_inputBar_145f5_45`},F=[65,80,55,72,60,75,50,68],I=({title:e,rows:t=5,variant:n=`list`,collapsible:r=!0,startCollapsed:i=!1})=>(0,u.jsx)(d.FilterPanelBase,{title:e,collapsible:r,collapsed:i,children:n===`slider`?(0,u.jsxs)(`div`,{className:P.sliderArea,children:[(0,u.jsx)(`div`,{className:P.sliderTrack}),(0,u.jsxs)(`div`,{className:P.inputRow,children:[(0,u.jsx)(`div`,{className:P.inputBar,style:{animationDelay:`0.1s`}}),(0,u.jsx)(`div`,{className:P.inputBar,style:{animationDelay:`0.15s`}})]})]}):(0,u.jsx)(`div`,{className:P.listRows,children:Array.from({length:t}).map((e,t)=>(0,u.jsx)(`div`,{className:P.bar,style:{width:`${F[t%F.length]}%`,animationDelay:`${t*.05}s`}},t))})}),L={list:`_list_m82u6_2`,count:`_count_m82u6_7`,countValue:`_countValue_m82u6_17`,chip:`_chip_m82u6_22`,chipLabel:`_chipLabel_m82u6_32`,grid:`_grid_m82u6_40`},R=({field:e,label:t,preserveBlankFacetState:n=!1,preserveBlankFacetStateOrder:r=!1,sortFacetsBy:i=`histogram`,limit:a=10,collapsible:o=!0,startCollapsed:s=!1,displayType:l=`checkbox`,layout:f=`list`,showActivePanel:p=!1,showCount:m=!0,showNull:h=!1,match:g=`all`,displayIfEmptyQuery:_=!0,displayCondition:v=e=>!0})=>{let{state:{facets:y,filterableFields:b,facetableFields:S,filters:C,query:w},toggleFilter:T,setValueMatch:E,isFetchingInitial:D,allowEmptySearch:O}=x();(0,c.useEffect)(()=>{E(e,g)},[e,g,E]);let k=(0,c.useRef)(null),[A,j]=(0,c.useState)(a);if((0,c.useEffect)(()=>{j(a)},[y?.[e],a]),!O&&!w)return null;if(D||!y)return l===`toggle`?(0,u.jsx)(I,{rows:1,collapsible:!1}):(0,u.jsx)(I,{title:t,rows:Math.min(a,6),collapsible:o,startCollapsed:s});if(!v({query:w??``,filters:C,facets:y})||!_&&!w&&Object.keys(C).length<1)return null;if(!b?.includes(e)||!S?.includes(e)){let t=[];return b?.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 M=y?.[e]??(l===`toggle`?[]:void 0);if(!M||!Array.isArray(M))return null;let N=C?.[e]??[];n&&!k.current&&M.length>0&&(k.current=M.reduce((e,t)=>(e[t.key]=t.value,e),{}));let P=new Map;n&&k.current&&Object.keys(k.current).forEach(e=>{P.set(e,0)}),M.forEach(e=>{P.set(e.key,e.value)});let F=new Set([`true`,`false`,`null`]),R=Array.from(P.keys()),z=l===`toggle`&&(R.length>0&&R.every(e=>F.has(e))||R.length===0&&N.length>0);if(z&&P.has(`null`)){let e=P.get(`null`)??0,t=P.get(`false`)??0;P.set(`false`,t+e),P.delete(`null`)}if(l===`toggle`&&!z)return(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,children:(0,u.jsx)(`div`,{className:L.count,children:(0,u.jsx)(d.ToggleSwitch,{label:t,checked:!1,onChange:()=>{},disabled:!0})})});if(z){let n=P.get(`true`),r=typeof n==`number`?n:null,i=N.includes(`true`),a=r===0&&!i,o=m&&(r??0)>0?`${r}`:``;return(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,children:(0,u.jsxs)(`div`,{className:L.count,children:[(0,u.jsx)(d.ToggleSwitch,{label:t,checked:i,onChange:()=>T(e,`true`),disabled:a}),` `,o]})})}let B=Array.from(P.entries());if(h||(B=B.filter(([e])=>e!==`null`)),B.length===0&&!n)return null;if(!r)if(i===`alphabetical`){let e=B.filter(([,e])=>typeof e==`number`&&e>0).sort(([e],[t])=>e.localeCompare(t)),t=B.filter(([,e])=>e===0||e===null).sort(([e],[t])=>e.localeCompare(t));B=[...e,...t]}else if(i===`numeric`){let e=(e,t)=>{let n=Number(e),r=Number(t);return!isNaN(n)&&!isNaN(r)?n-r:e.localeCompare(t)},t=B.filter(([,e])=>typeof e==`number`&&e>0).sort(([t],[n])=>e(t,n)),n=B.filter(([,e])=>e===0||e===null).sort(([t],[n])=>e(t,n));B=[...t,...n]}else{let e=B.filter(([,e])=>typeof e==`number`&&e>0),t=B.filter(([,e])=>e===0||e===null);B=[...e,...t]}let V=typeof a==`number`&&B.length>a,H=V?B.slice(0,A):B,U=(t,n)=>{let r=N.includes(t),i=n===0,a=m&&(n??0)>0?` (${n})`:``,o=m&&(n??0)>0?n:``;switch(l){case`button`:return f===`list`?(0,u.jsxs)(`div`,{className:L.count,children:[(0,u.jsx)(d.Button,{variant:r?`primary`:`secondary`,onClick:()=>T(e,t),disabled:i,size:`micro`,className:L.chip,title:t,children:(0,u.jsx)(`span`,{className:L.chipLabel,children:t})}),(0,u.jsx)(`span`,{className:L.countValue,children:o})]}):(0,u.jsx)(d.Button,{variant:r?`primary`:`secondary`,onClick:()=>T(e,t),disabled:i,size:`micro`,className:L.chip,title:`${t}${a}`,children:(0,u.jsx)(`span`,{className:L.chipLabel,children:`${t}${a}`})});case`toggle`:return(0,u.jsx)(d.ToggleSwitch,{label:t,checked:r,onChange:()=>T(e,t),disabled:i});default:return f===`list`?(0,u.jsxs)(`div`,{className:L.count,children:[(0,u.jsx)(d.Checkbox,{label:t,score:``,checked:r,onChange:()=>T(e,t),disabled:i}),(0,u.jsx)(`span`,{children:o})]}):(0,u.jsx)(d.Checkbox,{label:t,score:a,checked:r,onChange:()=>T(e,t),disabled:i})}};return(0,u.jsx)(d.FilterPanelBase,{title:t,collapsible:o,collapsed:o?s:!1,children:(0,u.jsxs)(`ul`,{className:f===`grid`?L.grid:L.list,style:{listStyle:`none`,padding:0,margin:0},children:[H.map(([e,t])=>(0,u.jsx)(`li`,{children:U(e,t)},e)),V&&A<B.length&&(()=>{let e=B.length-A,t=Math.min(50,e);return(0,u.jsx)(`li`,{className:L.toggleItem,children:(0,u.jsx)(d.Button,{variant:`ghost`,size:`micro`,onClick:()=>j(e=>e+50),children:`Show ${t} more of ${B.length} total`})})})()]})})},z={disabledMessage:`_disabledMessage_uci6n_1`,histogram:`_histogram_uci6n_6`,histogramBar:`_histogramBar_uci6n_15`};function B(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 V(e,t,n){let r=t+Math.round((e-t)/n)*n;return Number(r.toFixed(B(n)))}var H=({field:e,label:t,expectedMin:n=0,expectedMax:r=1e3,displayType:i=`input`,collapsible:a=!0,startCollapsed:o=!1,showHistogram:s=!1,resolution:l,step:f})=>{let{state:{rangeFilters:p,rangeBounds:m,facetStats:h,facets:g,filterableFields:_,facetableFields:v,query:y,facetDebounceDelayMillis:b},setRangeFilter:S,resetRangeFilter:C,allowEmptySearch:w,isFetchingInitial:T}=x(),E=m?.[e]!==void 0,D=m?.[e]??{min:n,max:r},O=D.min,k=D.max,A=h?.[e]??D,j=Math.max(O,Math.min(k,A.min)),M=Math.max(O,Math.min(k,A.max)),N=c.default.useMemo(()=>{if(f)return f;let t=Math.max(B(O),B(k)),n=g?.[e];if(Array.isArray(n))for(let e of n)t=Math.max(t,B(Number(e.key)));return t===0?1:Number((10**-t).toFixed(t))},[f,O,k,g,e]),P=E&&O===k,F=P?n:O,L=P?r:k,R=p?.[e],H=R?R.min:O,U=R?R.max:k,ee=R!==void 0,te=j!==O||M!==k,[W,G]=c.default.useState([H,U]),[ne,K]=c.default.useState(!1),[re,q]=c.default.useState(!1),[J,Y]=c.default.useState(String(H)),[X,Z]=c.default.useState(String(U));c.default.useEffect(()=>{Y(String(W[0])),Z(String(W[1]))},[W]);let{finalMin:Q,finalMax:$,isValidMin:ie,isValidMax:ae}=c.default.useMemo(()=>{let[e,t]=W,n=Math.max(O,Math.min(k,e)),r=Math.max(O,Math.min(k,t)),i=Math.min(n,r),a=Math.max(n,r);return{finalMin:i,finalMax:a,isValidMin:i>=O&&i<a,isValidMax:a<=k&&a>i}},[W,O,k]);c.default.useEffect(()=>{if(P)return;if(W[0]===O&&W[1]===k){K(!1),q(!1);return}let t=b??500,n=setTimeout(()=>{K(!ie),q(!ae)},300),r=setTimeout(()=>{ie&&ae&&(Q===O&&$===k?C(e,!1):S(e,Q,$))},t);return()=>{clearTimeout(n),clearTimeout(r)}},[Q,$,ie,ae,O,k,e,C,S,b,P]),c.default.useEffect(()=>{G([H,U]),K(!1),q(!1)},[H,U,e]);let oe=c.default.useCallback(e=>{P||G([Math.max(O,Math.min(M,e[0])),Math.max(j,Math.min(k,e[1]))])},[P,O,k,j,M]),se=c.default.useCallback(t=>{if(P)return;let n=Math.max(O,Math.min(M,t[0])),r=Math.max(j,Math.min(k,t[1]));n===O&&r===k?(G([O,k]),C(e,!0)):G([n,r])},[P,O,k,j,M,e,C]),ce=c.default.useCallback(()=>{if(P)return;let e=J.trim(),t=e===``?NaN:Number(e);if(isNaN(t)){Y(String(W[0]));return}let n=Math.max(O,Math.min(M,t));n<W[1]?G([n,W[1]]):G([O,W[1]]),Y(String(n<W[1]?n:O))},[P,J,W,O,M]),le=c.default.useCallback(()=>{if(P)return;let e=X.trim(),t=e===``?NaN:Number(e);if(isNaN(t)){Z(String(W[1]));return}let n=Math.max(j,Math.min(k,t));n>W[0]?G([W[0],n]):G([W[0],k]),Z(String(n>W[0]?n:k))},[P,X,W,j,k]),ue=e=>t=>{t.key===`Enter`&&e()},[de,fe]=c.default.useState(null),pe=c.default.useRef(null);c.default.useEffect(()=>{if(!s)return;let t=`${O}:${k}`;if(t===pe.current&&pe.current!==null)return;let n=g?.[e];if(!Array.isArray(n)||n.length===0)return;let r=n.filter(e=>e.value!=null&&!isNaN(Number(e.key))).map(e=>({key:e.key,value:e.value}));r.length>0&&(pe.current=t,fe(r))},[O,k,g,e,s]);let me=c.default.useMemo(()=>{if(!s||!de||de.length===0)return[];let e=k-O;if(e<=0)return[];let t=l??(Math.ceil(e/20)||1),n=Math.ceil(e/t);return Array.from({length:n},(e,n)=>{let r=O+n*t,i=O+(n+1)*t;return{bucketStart:r,bucketEnd:i,count:de.filter(e=>{let t=Number(e.key);return t>=r&&t<i}).reduce((e,t)=>e+t.value,0)}})},[s,de,O,k,l]),he=c.default.useMemo(()=>Math.max(...me.map(e=>e.count),1),[me]);return s&&!T&&!v?.includes(e)&&console.warn(`RangeFilterPanel: showHistogram=true but field "${e}" is not facetable. Add .Facetable = true to this field.`),T?(0,u.jsx)(I,{title:t,variant:`slider`,collapsible:a,startCollapsed:o}):!w&&!y?null:_?.includes(e)?i===`slider`?(0,u.jsxs)(d.FilterPanelBase,{title:t,collapsed:o,collapsible:a,children:[P&&(0,u.jsxs)(`div`,{className:z.disabledMessage,children:[`No adjustable range (all results have the same value: `,O,`).`]}),s&&me.length>0&&(0,u.jsx)(`div`,{className:z.histogram,children:(()=>{let e=typeof j==`number`&&typeof M==`number`&&M>j&&(j>O||M<k);return me.map((t,n)=>{let r=Math.max(1,Math.ceil(t.count/he*20)),i=e?t.bucketEnd>j&&t.bucketStart<M:t.bucketEnd>Q&&t.bucketStart<$;return(0,u.jsx)(`div`,{className:z.histogramBar,"data-testid":`histogram-bar`,"data-active":i,style:{height:`${r}px`,background:i?`var(--lv5)`:`var(--lv3)`}},n)})})()}),(0,u.jsx)(`div`,{style:{padding:`10px 10px 20px 10px`},children:(0,u.jsx)(d.Slider,{min:F,max:L,step:N,value:P?[F,L]:[V(Q,F,N),V($,F,N)],isRange:!0,onChange:e=>oe(e),onFinalChange:e=>se(e),disabled:P,activeMin:j,activeMax:M,isFaceted:te,highlightFaceted:ee,"aria-label":t||`Filter by ${e}`})}),(0,u.jsxs)(`div`,{style:{display:`flex`,flex:`flex-grow`,gap:`10px`,alignItems:`flex-start`,justifyContent:`space-between`},children:[(0,u.jsx)(d.InputField,{label:`Min:`,type:`number`,value:P?String(O):J,min:O,max:Math.min(M,W[1]-1),onChange:e=>Y(e.target.value),onBlur:ce,onKeyDown:ue(ce),disabled:P,isValid:P||!ne}),(0,u.jsx)(d.InputField,{label:`Max:`,type:`number`,value:P?String(k):X,min:Math.max(j,W[0]+1),max:k,onChange:e=>Z(e.target.value),onBlur:le,onKeyDown:ue(le),disabled:P,isValid:P||!re})]})]}):(0,u.jsxs)(d.FilterPanelBase,{title:t,children:[P&&(0,u.jsxs)(`div`,{className:z.disabledMessage,children:[`No adjustable range (all results have the same value: `,O,`).`]}),(0,u.jsxs)(`div`,{style:{display:`flex`,gap:`10px`,alignItems:`flex-start`},children:[(0,u.jsx)(d.InputField,{label:`Min:`,type:`number`,value:P?String(O):J,min:O,max:Math.min(M,W[1]-1),onChange:e=>Y(e.target.value),onBlur:ce,onKeyDown:ue(ce),disabled:P,isValid:P||!ne}),(0,u.jsx)(d.InputField,{label:`Max:`,type:`number`,value:P?String(k):X,min:Math.max(j,W[0]+1),max:k,onChange:e=>Z(e.target.value),onBlur:le,onKeyDown:ue(le),disabled:P,isValid:P||!re})]})]}):(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.`]})})},U={grid:`_grid_xm2uh_2`,chip:`_chip_xm2uh_17`,chipLabel:`_chipLabel_xm2uh_28`},ee=(0,c.memo)(({field:e,value:t,onReset:n})=>(0,u.jsx)(`li`,{children:(0,u.jsx)(d.Button,{onClick:n,iconRight:(0,u.jsx)(f.X_or_error,{}),variant:`primary`,size:`micro`,className:U.chip,title:`${e}: ${t}`,children:(0,u.jsxs)(`span`,{className:U.chipLabel,children:[e,`: `,t]})})})),te=(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:U.chip,title:`${e}: ${t} – ${n}`,children:(0,u.jsxs)(`span`,{className:U.chipLabel,children:[e,`: `,t,` – `,n]})})}));function W(){let{state:{filters:e,rangeFilters:t},resetFilters:n,resetSingleFilter:r,resetRangeFilter:i}=x(),a=(0,c.useMemo)(()=>Object.entries(e).map(([e,t])=>t.map(t=>({field:e,value:t}))).flat(),[e]),o=(0,c.useMemo)(()=>Object.entries(t).map(([e,{min:t,max:n}])=>({field:e,min:t,max:n})),[t]);return(0,c.useMemo)(()=>Object.keys(e).length>0||Object.keys(t).length>0,[e,t])?(0,u.jsx)(d.FilterPanelBase,{collapsible:!1,title:`Active filters`,children:(0,u.jsxs)(`ul`,{className:U.grid,children:[a.map(({field:e,value:t})=>(0,u.jsx)(ee,{field:e,value:t,onReset:()=>r(e,t)},`${e}-${t}`)),o.map(({field:e,min:t,max:n})=>(0,u.jsx)(te,{field:e,min:t,max:n,onReset:()=>i(e)},e)),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.Button,{onClick:n,size:`micro`,variant:`ghost`,children:`Reset`})})]})}):null}var G={select:`_select_nwf7i_1`,radioGroup:`_radioGroup_nwf7i_6`},ne=({displayType:e=`dropdown`,collapsible:t=!0,startCollapsed:n=!1})=>{let{state:{sortableFields:r,sortBy:i,sortAscending:a},setSort:o,isFetchingInitial:s}=x();if(s)return(0,u.jsx)(I,{title:`Sort by`,rows:e===`radio`?3:1,collapsible:t,startCollapsed:n});if(!r||r.length===0)return null;let c=i?`${i}:${a?`asc`:`desc`}`:`none`,l=[{label:`None`,value:`none`},...r.flatMap(e=>[{label:`${e} (asc)`,value:`${e}:asc`},{label:`${e} (desc)`,value:`${e}:desc`}])],f=e=>{if(e===`none`||e===``)o(null,!0);else{let[t,n]=e.split(`:`);o(t,n===`asc`)}};return(0,u.jsx)(d.FilterPanelBase,{title:`Sort by`,collapsible:t,collapsed:t?n:!1,children:e===`dropdown`?(0,u.jsx)(d.Select,{value:c,onValueChange:f,options:l,placeholder:`Select sort...`,"aria-label":`Sort by`}):(0,u.jsx)(`div`,{className:G.radioGroup,children:l.map(e=>(0,u.jsx)(d.RadioButton,{id:`sort-${e.value}`,name:`sort-by`,value:e.value,label:e.label,checked:c===e.value,onChange:e=>f(e.target.value)},e.value))})})},K={list:`_list_1y4fk_1`};function re(){let{state:{searchSettings:e},setSearchSettings:t}=x(),[n,r]=(0,c.useState)(!1),i=(e,n)=>{let r=parseInt(n,10);isNaN(r)||t({[e]:r})},a=(e,n)=>{t({[e]:n})},o=(n,r)=>{let i=parseInt(r,10);isNaN(i)||t({coverageSetup:{...e.coverageSetup,[n]:i}})},s=(n,r)=>{t({coverageSetup:{...e.coverageSetup,[n]:r}})};return(0,u.jsx)(d.FilterPanelBase,{collapsed:!0,title:`Settings`,children:(0,u.jsxs)(`ul`,{className:K.list,children:[(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Max Results`,type:`number`,value:e.maxNumberOfRecordsToReturn.toString(),onChange:e=>i(`maxNumberOfRecordsToReturn`,e.target.value)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Coverage Depth`,type:`number`,value:e.coverageDepth.toString(),onChange:e=>i(`coverageDepth`,e.target.value)})}),(0,u.jsxs)(`li`,{children:[(0,u.jsx)(d.InputField,{label:`Minimum Score (16 bit)`,type:`number`,value:e.minimumScore.toString(),min:`0`,max:`65535`,onChange:e=>{let n=parseFloat(e.target.value);isNaN(n)||t({minimumScore:n})}}),(0,u.jsx)(`div`,{style:{padding:`10px 10px 20px 10px`},children:(0,u.jsx)(d.Slider,{min:0,max:65535,step:1,value:Math.max(0,Math.min(65535,Math.round(e.minimumScore))),onChange:e=>{t({minimumScore:e})},"aria-label":`Minimum score`})})]}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Placeholder text`,type:`text`,value:e.placeholderText,onChange:e=>{t({placeholderText:e.target.value})}})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Show score`,checked:e.showScore,onChange:e=>a(`showScore`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Enable Coverage`,checked:e.enableCoverage,onChange:e=>a(`enableCoverage`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Remove Duplicates`,checked:e.removeDuplicates,onChange:e=>a(`removeDuplicates`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.Button,{variant:`ghost`,size:`micro`,iconRight:n?(0,u.jsx)(f.ArrowDown,{}):(0,u.jsx)(f.ArrowRight,{}),onClick:()=>r(e=>!e),children:n?`Hide Coverage Setup`:`Show Coverage Setup`})}),n&&(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Cover Whole Query`,checked:e.coverageSetup.coverWholeQuery,onChange:e=>s(`coverWholeQuery`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Cover Whole Words`,checked:e.coverageSetup.coverWholeWords,onChange:e=>s(`coverWholeWords`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Cover Fuzzy Words`,checked:e.coverageSetup.coverFuzzyWords,onChange:e=>s(`coverFuzzyWords`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Cover Joined Words`,checked:e.coverageSetup.coverJoinedWords,onChange:e=>s(`coverJoinedWords`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Cover Prefix Suffix`,checked:e.coverageSetup.coverPrefixSuffix,onChange:e=>s(`coverPrefixSuffix`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Truncate`,checked:e.coverageSetup.truncate,onChange:e=>s(`truncate`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.ToggleSwitch,{label:`Include Pattern Matches`,checked:e.coverageSetup.includePatternMatches,onChange:e=>s(`includePatternMatches`,e)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Levenshtein Max Word Size`,type:`number`,value:e.coverageSetup.levenshteinMaxWordSize.toString(),onChange:e=>o(`levenshteinMaxWordSize`,e.target.value)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Min Word Size`,type:`number`,value:e.coverageSetup.minWordSize.toString(),onChange:e=>o(`minWordSize`,e.target.value)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Truncate Word Hit Limit`,type:`number`,value:e.coverageSetup.truncateWordHitLimit.toString(),onChange:e=>o(`truncateWordHitLimit`,e.target.value)})}),(0,u.jsx)(`li`,{children:(0,u.jsx)(d.InputField,{label:`Truncate Word Hit Tolerance`,type:`number`,value:e.coverageSetup.truncateWordHitTolerance.toString(),onChange:e=>o(`truncateWordHitTolerance`,e.target.value)})})]})]})})}var q=class extends c.Component{constructor(e){super(e),this.state={hasError:!1,error:null}}static getDerivedStateFromError(e){return{hasError:!0,error:e}}componentDidCatch(e,t){console.error(`[SearchErrorBoundary] Caught error:`,e,t)}reset=()=>{this.setState({hasError:!1,error:null})};render(){return this.state.hasError&&this.state.error?this.props.fallback?this.props.fallback(this.state.error,this.reset):(0,u.jsxs)(`div`,{style:{padding:`2rem`,backgroundColor:`#fee`,border:`2px solid #c33`,borderRadius:`8px`,maxWidth:`600px`,margin:`2rem auto`},children:[(0,u.jsx)(`h2`,{style:{color:`#c33`,marginTop:0},children:`⚠️ Search Initialization Error`}),(0,u.jsxs)(`p`,{style:{marginBottom:`1rem`},children:[(0,u.jsx)(`strong`,{children:`Error:`}),` `,this.state.error.message]}),(0,u.jsxs)(`div`,{style:{backgroundColor:`#fff`,padding:`1rem`,borderRadius:`4px`,marginBottom:`1rem`,fontSize:`0.9rem`},children:[(0,u.jsx)(`strong`,{children:`💡 Common fixes:`}),(0,u.jsxs)(`ul`,{style:{marginBottom:0,paddingLeft:`1.5rem`},children:[(0,u.jsx)(`li`,{children:`Check browser console for detailed error messages`}),(0,u.jsx)(`li`,{children:`Verify the url passed to SearchProvider is correct`}),(0,u.jsx)(`li`,{children:`Verify your bearer token is valid (create or check it on the IndxCloudApi website)`}),(0,u.jsx)(`li`,{children:`Ensure INDX server is running`}),(0,u.jsx)(`li`,{children:`Check dataset name spelling`})]})]}),(0,u.jsx)(d.Button,{variant:`primary`,size:`micro`,onClick:this.reset,children:`Try Again`})]}):this.props.children}};function J(e,t){let{url:n,team:r,dataset:i,authenticatedFetch:a}=x(),[o,s]=(0,c.useState)(null),[l,u]=(0,c.useState)(!1),[d,f]=(0,c.useState)(void 0);return{results:o,isLoading:l,error:d,search:(0,c.useCallback)(async o=>{u(!0),f(void 0);try{let c=await e(o),l={fieldName:t.fieldName,vector:c,maxResults:t.maxResults??10};t.filter&&(l.filter=t.filter);let u=await a(`${n}/api/teams/${r}/datasets/${i}/search/vector`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(l)});if(!u.ok)throw Error(`VectorSearch failed: ${u.status}`);let d=await u.json();if(d.length===0){s([]);return}let f=d.map(e=>e.documentKey),p=await a(`${n}/api/teams/${r}/datasets/${i}/documents/lookup`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(f)});if(!p.ok)throw Error(`GetJson failed: ${p.status}`);s((await p.json()).map((e,t)=>({document:e,documentKey:f[t],score:d[t].score})))}catch(e){f(e instanceof Error?e.message:`Vector search failed`),s(null)}finally{u(!1)}},[e,t.fieldName,t.maxResults,t.filter,n,r,i,a])}}function Y(e,t){let{url:n,team:r,dataset:i,authenticatedFetch:a}=x(),[o,s]=(0,c.useState)(null),[l,u]=(0,c.useState)(!1),[d,f]=(0,c.useState)(void 0);return{results:o,isLoading:l,error:d,search:(0,c.useCallback)(async o=>{u(!0),f(void 0);try{let c=await e(o),l={text:o,embeddingField:t.fieldName,vector:c,maxNumberOfRecordsToReturn:t.maxResults??10,alpha:t.alpha??.5};t.filter&&(l.filter=t.filter),t.timeoutMs&&(l.timeOutLimitMilliseconds=t.timeoutMs);let u=await a(`${n}/api/teams/${r}/datasets/${i}/search/hybrid`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(l)});if(!u.ok)throw Error(`HybridSearch failed: ${u.status}`);let d=await u.json();if(d.length===0){s([]);return}let f=d.map(e=>e.documentKey),p=await a(`${n}/api/teams/${r}/datasets/${i}/documents/lookup`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(f)});if(!p.ok)throw Error(`GetJson failed: ${p.status}`);s((await p.json()).map((e,t)=>({document:e,documentKey:f[t],score:d[t].score})))}catch(e){f(e instanceof Error?e.message:`Hybrid search failed`),s(null)}finally{u(!1)}},[e,t.fieldName,t.alpha,t.maxResults,t.filter,t.timeoutMs,n,r,i,a])}}exports.ActiveFiltersPanel=W,exports.FilterPanelSkeleton=I,exports.RangeFilterPanel=H,exports.SearchContext=y,exports.SearchErrorBoundary=q,exports.SearchInput=S,exports.SearchProvider=b,exports.SearchResult=T,exports.SearchResultRow=N,exports.SearchResults=j,exports.SearchResultsSkeleton=O,exports.SearchSettingsPanel=re,exports.SortByPanel=ne,exports.ValueFilterPanel=R,exports.useHybridSearch=Y,exports.useSearch=x,exports.useSearchContext=x,exports.useVectorSearch=J;
|