@iress-oss/ids-mcp-server 6.0.0-alpha.0 → 6.0.0-alpha.1-canary-20251204014525-3f0dce4

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.
Files changed (108) hide show
  1. package/dist/searchHandlers.test.js +8 -2
  2. package/dist/toolHandler.test.js +9 -9
  3. package/dist/utils.test.js +6 -2
  4. package/package.json +32 -30
  5. package/generated/docs/components-alert-docs.md +0 -702
  6. package/generated/docs/components-autocomplete-docs.md +0 -1433
  7. package/generated/docs/components-autocomplete-recipes-docs.md +0 -104
  8. package/generated/docs/components-badge-docs.md +0 -531
  9. package/generated/docs/components-button-docs.md +0 -1442
  10. package/generated/docs/components-buttongroup-docs.md +0 -748
  11. package/generated/docs/components-card-docs.md +0 -944
  12. package/generated/docs/components-checkbox-docs.md +0 -694
  13. package/generated/docs/components-checkboxgroup-docs.md +0 -1087
  14. package/generated/docs/components-checkboxgroup-recipes-docs.md +0 -119
  15. package/generated/docs/components-col-docs.md +0 -881
  16. package/generated/docs/components-container-docs.md +0 -123
  17. package/generated/docs/components-divider-docs.md +0 -576
  18. package/generated/docs/components-expander-docs.md +0 -594
  19. package/generated/docs/components-field-docs.md +0 -2007
  20. package/generated/docs/components-filter-docs.md +0 -1322
  21. package/generated/docs/components-hide-docs.md +0 -702
  22. package/generated/docs/components-icon-docs.md +0 -816
  23. package/generated/docs/components-image-docs.md +0 -493
  24. package/generated/docs/components-inline-docs.md +0 -2003
  25. package/generated/docs/components-input-docs.md +0 -867
  26. package/generated/docs/components-input-recipes-docs.md +0 -140
  27. package/generated/docs/components-inputcurrency-docs.md +0 -689
  28. package/generated/docs/components-inputcurrency-recipes-docs.md +0 -115
  29. package/generated/docs/components-introduction-docs.md +0 -450
  30. package/generated/docs/components-label-docs.md +0 -562
  31. package/generated/docs/components-link-docs.md +0 -586
  32. package/generated/docs/components-menu-docs.md +0 -1146
  33. package/generated/docs/components-menu-menuitem-docs.md +0 -739
  34. package/generated/docs/components-modal-docs.md +0 -1346
  35. package/generated/docs/components-panel-docs.md +0 -600
  36. package/generated/docs/components-placeholder-docs.md +0 -446
  37. package/generated/docs/components-popover-docs.md +0 -1529
  38. package/generated/docs/components-popover-recipes-docs.md +0 -211
  39. package/generated/docs/components-progress-docs.md +0 -568
  40. package/generated/docs/components-provider-docs.md +0 -160
  41. package/generated/docs/components-radio-docs.md +0 -563
  42. package/generated/docs/components-radiogroup-docs.md +0 -1153
  43. package/generated/docs/components-readonly-docs.md +0 -535
  44. package/generated/docs/components-richselect-docs.md +0 -5836
  45. package/generated/docs/components-row-docs.md +0 -2354
  46. package/generated/docs/components-select-docs.md +0 -940
  47. package/generated/docs/components-skeleton-docs.md +0 -597
  48. package/generated/docs/components-skeleton-recipes-docs.md +0 -76
  49. package/generated/docs/components-skiplink-docs.md +0 -587
  50. package/generated/docs/components-slideout-docs.md +0 -1036
  51. package/generated/docs/components-slider-docs.md +0 -828
  52. package/generated/docs/components-spinner-docs.md +0 -450
  53. package/generated/docs/components-stack-docs.md +0 -923
  54. package/generated/docs/components-table-ag-grid-docs.md +0 -1444
  55. package/generated/docs/components-table-docs.md +0 -2327
  56. package/generated/docs/components-tabset-docs.md +0 -768
  57. package/generated/docs/components-tabset-tab-docs.md +0 -550
  58. package/generated/docs/components-tag-docs.md +0 -548
  59. package/generated/docs/components-text-docs.md +0 -585
  60. package/generated/docs/components-toaster-docs.md +0 -755
  61. package/generated/docs/components-toggle-docs.md +0 -614
  62. package/generated/docs/components-tooltip-docs.md +0 -747
  63. package/generated/docs/components-validationmessage-docs.md +0 -1161
  64. package/generated/docs/contact-us-docs.md +0 -27
  65. package/generated/docs/extensions-editor-docs.md +0 -1181
  66. package/generated/docs/extensions-editor-recipes-docs.md +0 -89
  67. package/generated/docs/foundations-accessibility-docs.md +0 -40
  68. package/generated/docs/foundations-consistency-docs.md +0 -52
  69. package/generated/docs/foundations-content-docs.md +0 -23
  70. package/generated/docs/foundations-grid-docs.md +0 -74
  71. package/generated/docs/foundations-introduction-docs.md +0 -19
  72. package/generated/docs/foundations-principles-docs.md +0 -70
  73. package/generated/docs/foundations-responsive-breakpoints-docs.md +0 -193
  74. package/generated/docs/foundations-tokens-colour-docs.md +0 -564
  75. package/generated/docs/foundations-tokens-elevation-docs.md +0 -155
  76. package/generated/docs/foundations-tokens-introduction-docs.md +0 -190
  77. package/generated/docs/foundations-tokens-radius-docs.md +0 -71
  78. package/generated/docs/foundations-tokens-spacing-docs.md +0 -89
  79. package/generated/docs/foundations-tokens-typography-docs.md +0 -322
  80. package/generated/docs/foundations-user-experience-docs.md +0 -63
  81. package/generated/docs/foundations-visual-design-docs.md +0 -46
  82. package/generated/docs/foundations-z-index-stacking-docs.md +0 -31
  83. package/generated/docs/frequently-asked-questions-docs.md +0 -53
  84. package/generated/docs/get-started-develop-docs.md +0 -209
  85. package/generated/docs/get-started-using-storybook-docs.md +0 -68
  86. package/generated/docs/guidelines.md +0 -2054
  87. package/generated/docs/introduction-docs.md +0 -87
  88. package/generated/docs/news-version-6-docs.md +0 -93
  89. package/generated/docs/patterns-form-docs.md +0 -3902
  90. package/generated/docs/patterns-form-recipes-docs.md +0 -1370
  91. package/generated/docs/patterns-introduction-docs.md +0 -24
  92. package/generated/docs/patterns-loading-docs.md +0 -4043
  93. package/generated/docs/resources-code-katas-docs.md +0 -29
  94. package/generated/docs/resources-introduction-docs.md +0 -38
  95. package/generated/docs/resources-mcp-server-docs.md +0 -27
  96. package/generated/docs/resources-migration-guides-from-v4-to-v5-docs.md +0 -437
  97. package/generated/docs/styling-props-colour-docs.md +0 -172
  98. package/generated/docs/styling-props-elevation-docs.md +0 -88
  99. package/generated/docs/styling-props-radius-docs.md +0 -86
  100. package/generated/docs/styling-props-reference-docs.md +0 -160
  101. package/generated/docs/styling-props-screen-readers-docs.md +0 -71
  102. package/generated/docs/styling-props-sizing-docs.md +0 -627
  103. package/generated/docs/styling-props-spacing-docs.md +0 -2282
  104. package/generated/docs/styling-props-typography-docs.md +0 -121
  105. package/generated/docs/themes-available-themes-docs.md +0 -66
  106. package/generated/docs/themes-introduction-docs.md +0 -121
  107. package/generated/docs/versions-docs.md +0 -17
  108. /package/{LICENSE.txt → LICENSE} +0 -0
@@ -1,1322 +0,0 @@
1
- [](#filter)Filter
2
- =================
3
-
4
- Overview
5
- --------
6
-
7
- A filter allows you to pick one or more options from a list (that may be searchable) and is triggered by an activator button.
8
-
9
- * * *
10
-
11
- Updated
12
-
13
- **Recently updated**
14
-
15
- This component has been recently updated with new props. The props have been marked as beta. Please tell us if there are any issues.
16
-
17
- Filter
18
-
19
- None selected
20
-
21
- Hide code
22
-
23
- \[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
24
-
25
- <IressFilter
26
- label\="Filter"
27
- options\={\[
28
- {
29
- label: 'Option 1',
30
- value: 1
31
- },
32
- {
33
- label: 'Option 2',
34
- value: 2
35
- },
36
- {
37
- label: 'Option 3',
38
- value: 3
39
- },
40
- {
41
- label: 'Option 4',
42
- value: 4
43
- },
44
- {
45
- label: 'Option 5',
46
- value: 5
47
- }
48
- \]}
49
- popoverProps\={{
50
- container: document.body
51
- }}
52
- />
53
-
54
- Copy
55
-
56
- [](#props)Props
57
- ---------------
58
-
59
- | Name | Description | Default | Control |
60
- | --- | --- | --- | --- |
61
- | debounceThreshold |
62
- Time in milliseconds to wait for before performing result search. Only applies to searchable options (function).
63
-
64
- numberundefined
65
-
66
-
67
-
68
- |
69
-
70
- 500
71
-
72
- | Set object |
73
- | defaultValue |
74
-
75
- Value of selected option for uncontrolled filter.
76
-
77
- LabelValueMeta | LabelValueMeta\[\] | undefined
78
-
79
- | \- | Set object |
80
- | initialOptions |
81
-
82
- Initial options data set, shown when the input is empty.
83
-
84
- LabelValueMeta\[\] | undefined
85
-
86
- | \- | Set object |
87
- | inputProps |
88
-
89
- Customise the searchable `IressInput` props for your needs.
90
-
91
- Pick<IressInputProps, "append" | "prepend" | "placeholder" | "clearable"> | undefined
92
-
93
- | { clearable: true, prepend: <IressIcon name="search" />, } | Set object |
94
- | label\* |
95
-
96
- Label to display in the activator button.
97
-
98
- ReactNode
99
-
100
-
101
-
102
- | \- |
103
-
104
- "Filter"
105
-
106
- |
107
- | limitDesktop |
108
-
109
- Maximum number of results displayed on larger screen sizes (>= 768).
110
-
111
- numberundefined
112
-
113
-
114
-
115
- |
116
-
117
- 12
118
-
119
- | Set object |
120
- | limitMobile |
121
-
122
- Maximum number of results displayed on mobile screen sizes (< 768).
123
-
124
- numberundefined
125
-
126
-
127
-
128
- |
129
-
130
- 6
131
-
132
- | Set object |
133
- | minSearchLength |
134
-
135
- Minimum number of characters required before triggering async search. Only applies to searchable options (function). Below this threshold, no search will be triggered and no loading state will be shown.
136
-
137
- numberundefined
138
-
139
-
140
-
141
- |
142
-
143
- 1
144
-
145
- | Set object |
146
- | multiSelect |
147
-
148
- Multi-select mode. When `true`, multiple options can be selected.
149
-
150
- booleanundefined
151
-
152
-
153
-
154
- | \- | Set object |
155
- | onChange |
156
-
157
- Emitted when the value changes.
158
-
159
- ((selected?: ControlledValue<LabelValueMeta, TMultiple> | undefined) => void) | undefined
160
-
161
- | \- | \- |
162
- | onReset |
163
-
164
- Emitted when the value is reset.
165
-
166
- (() => void) | undefined
167
-
168
- | \- | \- |
169
- | options |
170
-
171
- Options data set, shown when the input is not empty.
172
-
173
- LabelValueMeta\[\] | ((query: string) => Promise<LabelValueMeta\[\]>) | undefined
174
-
175
- | \- |
176
-
177
- RAW
178
-
179
- options : \[
180
-
181
- 0 : {...} 2 keys
182
-
183
- 1 : {...} 2 keys
184
-
185
- 2 : {...} 2 keys
186
-
187
- 3 : {...} 2 keys
188
-
189
- 4 : {...} 2 keys
190
-
191
- \]
192
-
193
-
194
-
195
-
196
-
197
- |
198
- | popoverProps |
199
-
200
- Customise the IressPopover props for your needs.
201
-
202
- FilterPopoverPropsundefined
203
-
204
-
205
-
206
- | { align: 'bottom-start' } |
207
-
208
- RAW
209
-
210
- popoverProps : {
211
-
212
- container : {...} 0 keys
213
-
214
- }
215
-
216
-
217
-
218
-
219
-
220
- |
221
- | ref |
222
-
223
- ForwardedRef<FilterRef> | undefined
224
-
225
- | \- | Set object |
226
- | searchable |
227
-
228
- When `true` a search field is shown to search for specific filter option(s).
229
-
230
- booleanundefined
231
-
232
-
233
-
234
- | \- | Set object |
235
- | searchNoResultsText |
236
-
237
- Text to be displayed when no results are found from search. Ignored when `searchable` is `false`
238
-
239
- ReactNode
240
-
241
-
242
-
243
- | \- | Set object |
244
- | selectedOptionsText |
245
-
246
- Text displayed next to label when two or more options are selected.
247
-
248
- stringundefined
249
-
250
-
251
-
252
- | {{numOptions}} selected | Set object |
253
- | value |
254
-
255
- Value of selected option for controlled filter.
256
-
257
- LabelValueMeta | LabelValueMeta\[\] | undefined
258
-
259
- | \- | Set object |
260
- | visibleResetButton |
261
-
262
- When `true`, a reset button will be shown above the options. If provided a string, it will be used as the reset button label.
263
-
264
- stringbooleanundefined
265
-
266
-
267
-
268
- | \- | Set object |
269
-
270
- [](#usage)Usage
271
- ---------------
272
-
273
- The `IressFilter` component has been built to be flexible enough to cover most application needs, allowing a user to add or remove data items from a displayed data set.
274
-
275
- This component is not designed to be used within forms and should be used to provide instant updates to rendered data. Instead, in forms, you should use components like `IressSelect`, `IressCombobox` and `IressCheckboxGroup`.
276
-
277
- Here is an example using multiple `IressFilter`s to filter an `IressTable`.
278
-
279
- Name
280
-
281
- None selected
282
-
283
- Status
284
-
285
- None selected
286
-
287
- Location
288
-
289
- None selected
290
-
291
- Gender
292
-
293
- None selected
294
-
295
- Reset filters
296
-
297
- * * *
298
-
299
- System users
300
- | User | Name | Status | Location | Gender |
301
- | --- | --- | --- | --- | --- |
302
- | No results found |
303
-
304
- Hide code
305
-
306
- \[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
307
-
308
- import {
309
- IressInline,
310
- IressStack,
311
- IressTable,
312
- LabelValueMeta,
313
- IressFilter,
314
- IressFilterProps,
315
- IressButton,
316
- IressDivider,
317
- } from '@iress-oss/ids-components';
318
- import { useMemo, useState } from 'react';
319
- import { searchStarWarsCharacters } from '@/mocks/starWars';
320
- const USERS \= \[
321
- {
322
- user: 'farmboy',
323
- name: 'Luke Skywalker',
324
- location: 'Temple Island',
325
- gender: 'male',
326
- status: 'Inactive',
327
- },
328
- {
329
- user: 'nevertellmetheodds',
330
- name: 'Han Solo',
331
- location: 'unknown',
332
- gender: 'male',
333
- status: 'Inactive',
334
- },
335
- {
336
- user: 'goldenrod',
337
- name: 'C-3PO',
338
- location: 'Space',
339
- gender: 'n/a',
340
- status: 'Active',
341
- },
342
- {
343
- user: 'whistles',
344
- name: 'R2-D2',
345
- location: 'Space',
346
- gender: 'n/a',
347
- status: 'Active',
348
- },
349
- {
350
- user: 'princess',
351
- name: 'Leia Organa',
352
- location: 'unknown',
353
- gender: 'female',
354
- status: 'Inactive',
355
- },
356
- \];
357
- const getUniqueValues \= (key: string): LabelValueMeta\[\] \=> {
358
- const unique: string\[\] \= \[\];
359
- USERS.forEach((user) \=> {
360
- const propVal \= user\[key as never\];
361
- if (!unique.includes(propVal)) unique.push(propVal);
362
- });
363
- return unique.map((item: string) \=> ({
364
- label: item,
365
- value: item,
366
- }));
367
- };
368
- export const FilterSearchTable \= (<false\>) => {
369
- const \[name, setName\] \= useState<LabelValueMeta | undefined\>();
370
- const \[status, setStatus\] \= useState<LabelValueMeta | undefined\>();
371
- const \[location, setLocation\] \= useState<LabelValueMeta | undefined\>();
372
- const \[gender, setGender\] \= useState<LabelValueMeta | undefined\>(undefined);
373
- const columns \= \[
374
- { key: 'user', label: 'User' },
375
- { key: 'name', label: 'Name' },
376
- { key: 'status', label: 'Status' },
377
- { key: 'location', label: 'Location' },
378
- { key: 'gender', label: 'Gender' },
379
- \];
380
- const rows \= useMemo(() \=> {
381
- const match \= (filterItem?: LabelValueMeta, detail?: string): boolean \=>
382
- (filterItem?.value ?? filterItem?.label) \=== detail;
383
- return USERS.filter(
384
- (user) \=>
385
- match(name, user.name) &&
386
- match(status, user.status) &&
387
- match(location, user.location) &&
388
- match(gender, user.gender),
389
- );
390
- }, \[name, status, location, gender\]);
391
- const handleReset \= () \=> {
392
- setName(undefined);
393
- setStatus(undefined);
394
- setLocation(undefined);
395
- setGender(undefined);
396
- };
397
- return (
398
- <IressStack gap\="md"\>
399
- <IressInline gap\="md"\>
400
- <IressFilter
401
- {...{
402
- label: 'Filter',
403
- options: \[
404
- {
405
- label: 'Option 1',
406
- value: 1,
407
- },
408
- {
409
- label: 'Option 2',
410
- value: 2,
411
- },
412
- {
413
- label: 'Option 3',
414
- value: 3,
415
- },
416
- {
417
- label: 'Option 4',
418
- value: 4,
419
- },
420
- {
421
- label: 'Option 5',
422
- value: 5,
423
- },
424
- \],
425
- popoverProps: {
426
- container: document.body,
427
- },
428
- visibleResetButton: true,
429
- }}
430
- label\="Name"
431
- options\={searchStarWarsCharacters}
432
- value\={name}
433
- onChange\={setName}
434
- onReset\={() \=> setName(undefined)}
435
- />
436
- <IressFilter
437
- {...{
438
- label: 'Filter',
439
- options: \[
440
- {
441
- label: 'Option 1',
442
- value: 1,
443
- },
444
- {
445
- label: 'Option 2',
446
- value: 2,
447
- },
448
- {
449
- label: 'Option 3',
450
- value: 3,
451
- },
452
- {
453
- label: 'Option 4',
454
- value: 4,
455
- },
456
- {
457
- label: 'Option 5',
458
- value: 5,
459
- },
460
- \],
461
- popoverProps: {
462
- container: document.body,
463
- },
464
- visibleResetButton: true,
465
- }}
466
- label\="Status"
467
- options\={getUniqueValues('status')}
468
- value\={status}
469
- onChange\={setStatus}
470
- onReset\={() \=> setStatus(undefined)}
471
- />
472
- <IressFilter
473
- {...{
474
- label: 'Filter',
475
- options: \[
476
- {
477
- label: 'Option 1',
478
- value: 1,
479
- },
480
- {
481
- label: 'Option 2',
482
- value: 2,
483
- },
484
- {
485
- label: 'Option 3',
486
- value: 3,
487
- },
488
- {
489
- label: 'Option 4',
490
- value: 4,
491
- },
492
- {
493
- label: 'Option 5',
494
- value: 5,
495
- },
496
- \],
497
- popoverProps: {
498
- container: document.body,
499
- },
500
- visibleResetButton: true,
501
- }}
502
- label\="Location"
503
- options\={getUniqueValues('location')}
504
- value\={location}
505
- onChange\={setLocation}
506
- onReset\={() \=> setLocation(undefined)}
507
- />
508
- <IressFilter
509
- {...{
510
- label: 'Filter',
511
- options: \[
512
- {
513
- label: 'Option 1',
514
- value: 1,
515
- },
516
- {
517
- label: 'Option 2',
518
- value: 2,
519
- },
520
- {
521
- label: 'Option 3',
522
- value: 3,
523
- },
524
- {
525
- label: 'Option 4',
526
- value: 4,
527
- },
528
- {
529
- label: 'Option 5',
530
- value: 5,
531
- },
532
- \],
533
- popoverProps: {
534
- container: document.body,
535
- },
536
- visibleResetButton: true,
537
- }}
538
- label\="Gender"
539
- options\={getUniqueValues('gender')}
540
- value\={gender}
541
- onChange\={setGender}
542
- onReset\={() \=> setGender(undefined)}
543
- />
544
- <IressButton onClick\={handleReset} mode\="tertiary"\>
545
- Reset filters </IressButton\>
546
- </IressInline\>
547
- <IressDivider />
548
- <IressTable
549
- caption\="System users"
550
- columns\={columns}
551
- rows\={rows}
552
- empty\={'No results found'}
553
- />
554
- </IressStack\>
555
- );
556
- };
557
-
558
- Copy
559
-
560
- ### [](#label)Label
561
-
562
- The `label` prop is required for the filter to be displayed. It is used to describe the filter to the user.
563
-
564
- When the filter has selected options, it will append the label of the first option, or the number of selected options if `multiSelect` is true and there is more than one item selected.
565
-
566
- Custom label
567
-
568
- None selected
569
-
570
- Hide code
571
-
572
- \[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
573
-
574
- <IressFilter
575
- label\="Custom label"
576
- multiSelect
577
- options\={\[
578
- {
579
- label: 'Option 1',
580
- value: 1
581
- },
582
- {
583
- label: 'Option 2',
584
- value: 2
585
- },
586
- {
587
- label: 'Option 3',
588
- value: 3
589
- },
590
- {
591
- label: 'Option 4',
592
- value: 4
593
- },
594
- {
595
- label: 'Option 5',
596
- value: 5
597
- }
598
- \]}
599
- popoverProps\={{
600
- container: document.body
601
- }}
602
- />
603
-
604
- Copy
605
-
606
- ### [](#uncontrolled)Uncontrolled
607
-
608
- The `defaultValue` prop can be used to set the initial value of the combobox. The value will be managed by the component.
609
-
610
- **Note:** The `defaultValue` prop is not checked against the options provided, allowing it to work with asynchronous options.
611
-
612
- Filter: Option 1
613
-
614
- None selected
615
-
616
- Hide code
617
-
618
- \[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
619
-
620
- <IressFilter
621
- defaultValue\={{
622
- label: 'Option 1',
623
- value: 1
624
- }}
625
- label\="Filter"
626
- options\={\[
627
- {
628
- label: 'Option 1',
629
- value: 1
630
- },
631
- {
632
- label: 'Option 2',
633
- value: 2
634
- },
635
- {
636
- label: 'Option 3',
637
- value: 3
638
- },
639
- {
640
- label: 'Option 4',
641
- value: 4
642
- },
643
- {
644
- label: 'Option 5',
645
- value: 5
646
- }
647
- \]}
648
- popoverProps\={{
649
- container: document.body
650
- }}
651
- />
652
-
653
- Copy
654
-
655
- ### [](#controlled)Controlled
656
-
657
- The `value` prop can be used to completely control the state of the component. Use the `onChange` and `onReset` props to sync your state with the component.
658
-
659
- **Note:** The `value` prop is not checked against the options provided, allowing it to work with asynchronous options.
660
-
661
- Filter
662
-
663
- None selected
664
-
665
- Hide code
666
-
667
- \[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
668
-
669
- import { IressFilter, IressFilterProps } from '@iress-oss/ids-components';
670
- import { useState } from 'react';
671
- export const FilterUsingState \= <TMultiple extends boolean \= false\>(
672
- <TMultiple\>,
673
- ) => {
674
- const \[value, setValue\] \= useState<IressFilterProps<TMultiple\>\['value'\]\>();
675
- return (
676
- <IressFilter
677
- {...{
678
- label: 'Filter',
679
- options: \[
680
- {
681
- label: 'Option 1',
682
- value: 1,
683
- },
684
- {
685
- label: 'Option 2',
686
- value: 2,
687
- },
688
- {
689
- label: 'Option 3',
690
- value: 3,
691
- },
692
- {
693
- label: 'Option 4',
694
- value: 4,
695
- },
696
- {
697
- label: 'Option 5',
698
- value: 5,
699
- },
700
- \],
701
- popoverProps: {
702
- container: document.body,
703
- },
704
- }}
705
- onChange\={(newValue) \=> setValue(newValue)}
706
- onReset\={() \=> setValue(undefined)}
707
- value\={value}
708
- />
709
- );
710
- };
711
-
712
- Copy
713
-
714
- ### [](#multiple-selection)Multiple selection
715
-
716
- Using the `multiSelect` prop, the `IressFilter` will allow the user to make multiple selections.
717
-
718
- Filter
719
-
720
- None selected
721
-
722
- Hide code
723
-
724
- \[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
725
-
726
- <IressFilter
727
- label\="Filter"
728
- multiSelect
729
- options\={\[
730
- {
731
- label: 'Option 1',
732
- value: 1
733
- },
734
- {
735
- label: 'Option 2',
736
- value: 2
737
- },
738
- {
739
- label: 'Option 3',
740
- value: 3
741
- },
742
- {
743
- label: 'Option 4',
744
- value: 4
745
- },
746
- {
747
- label: 'Option 5',
748
- value: 5
749
- }
750
- \]}
751
- popoverProps\={{
752
- container: document.body
753
- }}
754
- />
755
-
756
- Copy
757
-
758
- ### [](#providing-options)Providing options
759
-
760
- #### [](#options)`options`
761
-
762
- The `options` prop is required for the combobox. You can provide an array of `LabelValueMeta[]` objects to the `options` prop. Filtering is done based on the `label` property.
763
-
764
- Filter
765
-
766
- None selected
767
-
768
- Hide code
769
-
770
- \[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
771
-
772
- <IressFilter
773
- label\="Filter"
774
- options\={\[
775
- {
776
- label: 'Option 1',
777
- value: 1
778
- },
779
- {
780
- label: 'Option 2',
781
- value: 2
782
- },
783
- {
784
- label: 'Option 3',
785
- value: 3
786
- },
787
- {
788
- label: 'Option 4',
789
- value: 4
790
- },
791
- {
792
- label: 'Option 5',
793
- value: 5
794
- }
795
- \]}
796
- popoverProps\={{
797
- container: {}
798
- }}
799
- />
800
-
801
- Copy
802
-
803
- #### [](#asynchronous-options)Asynchronous `options`
804
-
805
- If you would like to render suggestions from the server, you can pass a function to the `options` prop. It accepts a string parameter and returns a promise that resolves to an array of `LabelValueMeta[]` objects. No filtering is done for asynchronous options, you must filter the options yourself using the query.
806
-
807
- **Note:** Asynchronous `options` will automatically set the `searchable` prop to true.
808
-
809
- Filter
810
-
811
- None selected
812
-
813
- Hide code
814
-
815
- \[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
816
-
817
- import { IressFilter, IressFilterProps } from '@iress-oss/ids-components';
818
- interface StarWarsCharacter {
819
- name: string;
820
- gender: string;
821
- }
822
- interface StarWarsCharacterApi {
823
- results: StarWarsCharacter\[\];
824
- }
825
- export const FilterUsingAsync \= <TMultiple extends boolean \= false\>(
826
- <TMultiple\>,
827
- ) => (
828
- <IressFilter
829
- {...{
830
- label: 'Filter',
831
- options: \[
832
- {
833
- label: 'Option 1',
834
- value: 1,
835
- },
836
- {
837
- label: 'Option 2',
838
- value: 2,
839
- },
840
- {
841
- label: 'Option 3',
842
- value: 3,
843
- },
844
- {
845
- label: 'Option 4',
846
- value: 4,
847
- },
848
- {
849
- label: 'Option 5',
850
- value: 5,
851
- },
852
- \],
853
- popoverProps: {
854
- container: document.body,
855
- },
856
- searchable: true,
857
- }}
858
- options\={async (query: string) \=> {
859
- if (!query) return \[\];
860
- const data \= await fetch(
861
- \`https://swapi.py4e.com/api/people/?search=${query}\`,
862
- ).then((response) \=> response.json() as Promise<StarWarsCharacterApi\>);
863
- return data.results.map((character: StarWarsCharacter) \=> ({
864
- label: character.name,
865
- value: character.name,
866
- meta: character.gender,
867
- }));
868
- }}
869
- />
870
- );
871
-
872
- Copy
873
-
874
- #### [](#initialoptions)`initialOptions`
875
-
876
- If you want to provide initial options to the user, you can use the `initialOptions` prop. This is useful when you want to provide a list of options to the user before they start typing (eg. recommended search terms).
877
-
878
- **Note:** `initialOptions` only works if `searchable` is true.
879
-
880
- Filter
881
-
882
- None selected
883
-
884
- Hide code
885
-
886
- \[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
887
-
888
- <IressFilter
889
- initialOptions\={\[
890
- {
891
- label: 'Favourite option 1',
892
- value: 'fav-1'
893
- },
894
- {
895
- label: 'Favourite option 2',
896
- value: 'fav-2'
897
- },
898
- {
899
- label: 'Favourite option 3',
900
- value: 'fav-3'
901
- }
902
- \]}
903
- label\="Filter"
904
- options\={\[
905
- {
906
- label: 'Option 1',
907
- value: 1
908
- },
909
- {
910
- label: 'Option 2',
911
- value: 2
912
- },
913
- {
914
- label: 'Option 3',
915
- value: 3
916
- },
917
- {
918
- label: 'Option 4',
919
- value: 4
920
- },
921
- {
922
- label: 'Option 5',
923
- value: 5
924
- }
925
- \]}
926
- popoverProps\={{
927
- container: document.body
928
- }}
929
- searchable
930
- />
931
-
932
- Copy
933
-
934
- ### [](#complex-options)Complex Options
935
-
936
- The options prop also accepts further properties for each option. This is useful for displaying other data that compliments the main label.
937
-
938
- * append: accepts a ReactNode to append to the end of the option, usually a badge.
939
- * meta: accepts a ReactNode to display additional information about the option.
940
- * prepend: accepts a ReactNode to add to the start of the option, usually an icon.
941
-
942
- All `IressFilter`s accept meta as an attribute in the option array.
943
-
944
- User
945
-
946
- None selected
947
-
948
- Hide code
949
-
950
- \[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
951
-
952
- <IressFilter
953
- label\="User"
954
- options\={\[
955
- {
956
- label: 'John Smith',
957
- meta: \[
958
- <IressText key\="opt1-type" color\="colour.neutral.70" element\="small"\>Individual</IressText\>,
959
- <IressText key\="opt1-email" color\="colour.neutral.70" element\="small"\>test@iress.com</IressText\>
960
- \],
961
- value: 'opt1'
962
- },
963
- {
964
- label: 'Tom Wilson',
965
- meta: \[
966
- <IressText key\="opt2-type" color\="colour.neutral.70" element\="small"\>Individual</IressText\>
967
- \],
968
- value: 'opt2'
969
- },
970
- {
971
- append: <IressBadge mode\="success"\>Active</IressBadge\>,
972
- label: 'Alice Kay',
973
- meta: \[
974
- <IressText key\="opt3-type" color\="colour.neutral.70" element\="small"\>Individual</IressText\>
975
- \],
976
- value: 'opt3'
977
- },
978
- {
979
- label: 'John Smith',
980
- meta: \[
981
- <IressText key\="opt4-type" color\="colour.neutral.70" element\="small"\>Business</IressText\>,
982
- <IressText key\="opt4-phone" color\="colour.neutral.70" element\="small"\>0432325675</IressText\>
983
- \],
984
- value: 'opt4'
985
- },
986
- {
987
- label: 'Eelin Team',
988
- meta: \[
989
- <IressText key\="opt5-contact" color\="colour.neutral.70" element\="small"\>test2@iress.com, 0432325675</IressText\>
990
- \],
991
- value: 'opt5'
992
- },
993
- {
994
- label: 'Eelin Team',
995
- meta: \[
996
- <IressText key\="opt6-contact" color\="colour.neutral.70" element\="small"\>test3@iress.com, 0439873244</IressText\>
997
- \],
998
- value: 'opt6'
999
- }
1000
- \]}
1001
- popoverProps\={{
1002
- container: document.body
1003
- }}
1004
- />
1005
-
1006
- Copy
1007
-
1008
- [](#behaviour)Behaviour
1009
- -----------------------
1010
-
1011
- * When the activator is tapped, the filter will open
1012
- * Up and Down Arrow keys are used to navigate the options
1013
- * When focus is on the search input:
1014
- * Pressing the down key will move focus to the first menu item
1015
- * If `visibleResetButton` is set to true, pressing the down key will focus the reset button instead
1016
- * When focus is on the reset button:
1017
- * Pressing the down key will move focus to the first menu item
1018
- * Pressing the Space or Enter keys when focussed on an option will select it
1019
- * Pressing the Escape key will close the filter and place focus back on to the activator button
1020
-
1021
- [](#examples)Examples
1022
- ---------------------
1023
-
1024
- ### [](#input-props)Input props
1025
-
1026
- You can customise some settings of the query input by setting the `inputProps`.
1027
-
1028
- It does have some defaults to help with user experience. `prepend` automatically has a search icon, and `clearable` is set to true by default.
1029
-
1030
- Filter
1031
-
1032
- None selected
1033
-
1034
- Hide code
1035
-
1036
- \[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
1037
-
1038
- <IressFilter
1039
- inputProps\={{
1040
- placeholder: 'Search...'
1041
- }}
1042
- label\="Filter"
1043
- options\={\[
1044
- {
1045
- label: 'Option 1',
1046
- value: 1
1047
- },
1048
- {
1049
- label: 'Option 2',
1050
- value: 2
1051
- },
1052
- {
1053
- label: 'Option 3',
1054
- value: 3
1055
- },
1056
- {
1057
- label: 'Option 4',
1058
- value: 4
1059
- },
1060
- {
1061
- label: 'Option 5',
1062
- value: 5
1063
- }
1064
- \]}
1065
- popoverProps\={{
1066
- container: document.body
1067
- }}
1068
- searchable
1069
- />
1070
-
1071
- Copy
1072
-
1073
- ### [](#searchable)Searchable
1074
-
1075
- When an `IressFilter` has 10 or more options, it is recommended that you enable the search functionality. This can be done by adding the `searchable` prop.
1076
-
1077
- **Note:** When using asynchronous options, the `searchable` prop is automatically set to true.
1078
-
1079
- Filter
1080
-
1081
- None selected
1082
-
1083
- Hide code
1084
-
1085
- \[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
1086
-
1087
- <IressFilter
1088
- label\="Filter"
1089
- options\={\[
1090
- {
1091
- label: 'Option 1',
1092
- value: 1
1093
- },
1094
- {
1095
- label: 'Option 2',
1096
- value: 2
1097
- },
1098
- {
1099
- label: 'Option 3',
1100
- value: 3
1101
- },
1102
- {
1103
- label: 'Option 4',
1104
- value: 4
1105
- },
1106
- {
1107
- label: 'Option 5',
1108
- value: 5
1109
- }
1110
- \]}
1111
- popoverProps\={{
1112
- container: document.body
1113
- }}
1114
- searchable
1115
- />
1116
-
1117
- Copy
1118
-
1119
- ### [](#reset-filters)Reset filters
1120
-
1121
- Adding the `visibleResetButton` prop adds a way for the user a way to easily reset their choices. This works for single and multiple selection filters.
1122
-
1123
- Below are examples of both single selects and multi selects with `visibleResetButton` enabled.
1124
-
1125
- Filter
1126
-
1127
- None selected
1128
-
1129
- Hide code
1130
-
1131
- \[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
1132
-
1133
- <IressFilter
1134
- label\="Filter"
1135
- options\={\[
1136
- {
1137
- label: 'Option 1',
1138
- value: 1
1139
- },
1140
- {
1141
- label: 'Option 2',
1142
- value: 2
1143
- },
1144
- {
1145
- label: 'Option 3',
1146
- value: 3
1147
- },
1148
- {
1149
- label: 'Option 4',
1150
- value: 4
1151
- },
1152
- {
1153
- label: 'Option 5',
1154
- value: 5
1155
- }
1156
- \]}
1157
- popoverProps\={{
1158
- container: document.body
1159
- }}
1160
- visibleResetButton
1161
- />
1162
-
1163
- Copy
1164
-
1165
- ### [](#no-results)No results
1166
-
1167
- If you would like to show a message when there are no results, you can use the `searchNoResultsText` prop. It accepts any React node.
1168
-
1169
- Filter
1170
-
1171
- None selected
1172
-
1173
- Hide code
1174
-
1175
- \[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
1176
-
1177
- <IressFilter
1178
- inputProps\={{
1179
- placeholder: 'Type "no" to see the no results text'
1180
- }}
1181
- label\="Filter"
1182
- options\={\[
1183
- {
1184
- label: 'Option 1',
1185
- value: 1
1186
- },
1187
- {
1188
- label: 'Option 2',
1189
- value: 2
1190
- },
1191
- {
1192
- label: 'Option 3',
1193
- value: 3
1194
- },
1195
- {
1196
- label: 'Option 4',
1197
- value: 4
1198
- },
1199
- {
1200
- label: 'Option 5',
1201
- value: 5
1202
- }
1203
- \]}
1204
- popoverProps\={{
1205
- container: document.body
1206
- }}
1207
- searchNoResultsText\={<IressPanel\>No results found</IressPanel\>}
1208
- searchable
1209
- />
1210
-
1211
- Copy
1212
-
1213
- ### [](#popover-props)Popover props
1214
-
1215
- Under the hood, filter uses `IressPopover` to display the filter options. You can customise this with `popoverProps`. It accepts `align`, `className`, `container` and `displayMode`.
1216
-
1217
- There are two additional props that filter accepts to customise the popover: `header` and `footer`. You can place additional content above or below the results using these props.
1218
-
1219
- Filter
1220
-
1221
- None selected
1222
-
1223
- Hide code
1224
-
1225
- \[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
1226
-
1227
- <IressFilter
1228
- label\="Filter"
1229
- options\={\[
1230
- {
1231
- label: 'Option 1',
1232
- value: 1
1233
- },
1234
- {
1235
- label: 'Option 2',
1236
- value: 2
1237
- },
1238
- {
1239
- label: 'Option 3',
1240
- value: 3
1241
- },
1242
- {
1243
- label: 'Option 4',
1244
- value: 4
1245
- },
1246
- {
1247
- label: 'Option 5',
1248
- value: 5
1249
- }
1250
- \]}
1251
- popoverProps\={{
1252
- container: document.body,
1253
- footer: <IressPanel\><IressButton\>Add an option</IressButton\></IressPanel\>
1254
- }}
1255
- />
1256
-
1257
- Copy
1258
-
1259
- ### [](#selected-options-text)Selected options text
1260
-
1261
- In `multiSelect` mode, the selections options are displayed using the `selectedOptionsText` prop. You can customise this text to suit your needs. It will replace `{{numOptions}}` with the number of selected options.
1262
-
1263
- Filter
1264
-
1265
- None selected
1266
-
1267
- Hide code
1268
-
1269
- \[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
1270
-
1271
- <IressFilter
1272
- label\="Filter"
1273
- multiSelect
1274
- options\={\[
1275
- {
1276
- label: 'Option 1',
1277
- value: 1
1278
- },
1279
- {
1280
- label: 'Option 2',
1281
- value: 2
1282
- },
1283
- {
1284
- label: 'Option 3',
1285
- value: 3
1286
- },
1287
- {
1288
- label: 'Option 4',
1289
- value: 4
1290
- },
1291
- {
1292
- label: 'Option 5',
1293
- value: 5
1294
- }
1295
- \]}
1296
- popoverProps\={{
1297
- container: {}
1298
- }}
1299
- selectedOptionsText\="{{numOptions}} activated"
1300
- />
1301
-
1302
- Copy
1303
-
1304
- On this page
1305
-
1306
- * [Overview](#overview)
1307
- * [Props](#props)
1308
- * [Usage](#usage)
1309
- * [Label](#label)
1310
- * [Uncontrolled](#uncontrolled)
1311
- * [Controlled](#controlled)
1312
- * [Multiple selection](#multiple-selection)
1313
- * [Providing options](#providing-options)
1314
- * [Complex Options](#complex-options)
1315
- * [Behaviour](#behaviour)
1316
- * [Examples](#examples)
1317
- * [Input props](#input-props)
1318
- * [Searchable](#searchable)
1319
- * [Reset filters](#reset-filters)
1320
- * [No results](#no-results)
1321
- * [Popover props](#popover-props)
1322
- * [Selected options text](#selected-options-text)