Skip to content

Commit c8738a3

Browse files
committed
fix(common): select and dual list select types
1 parent b5ec583 commit c8738a3

File tree

5 files changed

+31
-29
lines changed

5 files changed

+31
-29
lines changed

packages/common/src/dual-list-select/dual-list-select.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,19 @@ interface DualListSelectComponentProps<T = OptionValue> {
1515
handleMoveLeft: () => void;
1616
handleClearLeftValues: () => void;
1717
handleClearRightValues: () => void;
18-
filterOptions?: (options: SelectOption<T>[], filterValue: string) => SelectOption<T>[];
18+
filterOptions?: (options: SelectOption<T>[], filterValue: string) => SelectOption<T>[] | ((value: string) => void);
1919
filterValue?: string;
2020
filterValueText?: string;
2121
filterPlaceholder?: string;
2222
filterOptionsText?: string;
2323
filterValuePlaceholder?: string;
2424
noOptionsText?: string;
2525
noValueText?: string;
26+
// Missing props that are actually used in implementation
27+
sortOptions: () => void;
28+
sortValues: () => void;
29+
filterValues: (value: string) => void;
30+
state: DualListSelectState<T>;
2631
[key: string]: unknown;
2732
}
2833

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,14 @@
11
import { ReactNode } from "react";
2+
import { FlatSelectOption, OptionValue } from '../types/shared-types';
23

3-
interface Option {
4+
export interface Option {
45
label: string | ReactNode;
56
value: any;
67
selectAll?: boolean;
78
selectNone?: boolean;
89
}
910

10-
interface ResultedOption {
11-
label?: string | ReactNode;
12-
value?: any;
13-
selectAll?: boolean;
14-
selectNone?: boolean;
15-
group?: string | ReactNode;
16-
divider?: boolean;
17-
}
18-
19-
interface Options {
11+
export interface Options {
2012
label?: string | ReactNode;
2113
value?: any;
2214
divider?: boolean;
@@ -25,8 +17,8 @@ interface Options {
2517
options?: Option[];
2618
}
2719

28-
const flatOptions = (options: Options[]): ResultedOption[] =>
29-
options.flatMap((option) => (option.options ? [{ group: option.label }, ...option.options.map(opt => opt as ResultedOption)] : [option as ResultedOption]));
20+
const flatOptions = <T extends OptionValue = OptionValue>(options: Options[]): FlatSelectOption<T>[] =>
21+
options.flatMap((option) => (option.options ? [{ group: option.label } as FlatSelectOption<T>, ...option.options.map(opt => opt as FlatSelectOption<T>)] : [option as FlatSelectOption<T>]));
3022

3123
export default flatOptions;
32-
export type { Option, ResultedOption, Options };
24+
export type ResultedOption = FlatSelectOption;

packages/common/src/select/select.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { AnyObject } from "@data-driven-forms/react-form-renderer";
55
import clsx from 'clsx';
66
import useSelect from '../use-select/use-select';
77
import deepEqual from './deep-equal';
8-
import { SelectOption, OptionValue, SelectValue } from '../types/shared-types';
8+
import { SelectOption, OptionValue, SelectValue, FlatSelectOption } from '../types/shared-types';
99

1010
export interface SelectProps<T = OptionValue> {
1111
options?: SelectOption<T>[];
@@ -26,12 +26,17 @@ export interface SelectProps<T = OptionValue> {
2626
selectVariant?: string;
2727
updatingMessage?: React.ReactNode;
2828
noOptionsMessage?: React.ReactNode;
29+
noResultsMessage?: React.ReactNode;
2930
isSearchable?: boolean;
3031
isClearable?: boolean;
3132
SelectComponent?: React.ComponentType<AnyObject>;
3233
noValueUpdates?: boolean;
33-
optionsTransformer?: (options: AnyObject[]) => SelectOption<T>[];
34+
optionsTransformer?: (options: AnyObject[]) => FlatSelectOption<T>[];
3435
compareValues?: (valueA: T, valueB: T) => boolean;
36+
menuIsPortal?: boolean;
37+
menuPortalTarget?: Element;
38+
showMoreLabel?: string;
39+
showLessLabel?: string;
3540
}
3641

3742
const Select = <T extends OptionValue = OptionValue>({

packages/common/src/use-select/reducer.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,29 @@
11
import { AnyObject } from '@data-driven-forms/react-form-renderer';
2-
import { SelectOption, OptionValue } from '../types/shared-types';
2+
import { SelectOption, OptionValue, FlatSelectOption } from '../types/shared-types';
33

44
export interface SelectState<T = OptionValue> {
55
isLoading: boolean;
6-
options: SelectOption<T>[];
6+
options: (SelectOption<T> | FlatSelectOption<T>)[];
77
promises: AnyObject;
88
isInitialLoaded: boolean;
9-
originalOptions?: SelectOption<T>[];
9+
originalOptions?: (SelectOption<T> | FlatSelectOption<T>)[];
1010
}
1111

1212
interface InitProps<T = OptionValue> {
1313
propsOptions: SelectOption<T>[];
14-
optionsTransformer?: (options: AnyObject[]) => SelectOption<T>[];
14+
optionsTransformer?: (options: AnyObject[]) => FlatSelectOption<T>[];
1515
}
1616

1717
type ReducerAction<T = OptionValue> =
18-
| { type: 'updateOptions'; payload: SelectOption<T>[]; optionsTransformer?: (options: AnyObject[]) => SelectOption<T>[] }
18+
| { type: 'updateOptions'; payload: SelectOption<T>[]; optionsTransformer?: (options: AnyObject[]) => FlatSelectOption<T>[] }
1919
| { type: 'startLoading' }
20-
| { type: 'setOptions'; payload: SelectOption<T>[]; optionsTransformer?: (options: AnyObject[]) => SelectOption<T>[] }
20+
| { type: 'setOptions'; payload: SelectOption<T>[]; optionsTransformer?: (options: AnyObject[]) => FlatSelectOption<T>[] }
2121
| { type: 'initialLoaded' }
2222
| {
2323
type: 'setPromises';
2424
payload: AnyObject;
2525
options?: SelectOption<T>[];
26-
optionsTransformer?: (options: AnyObject[]) => SelectOption<T>[];
26+
optionsTransformer?: (options: AnyObject[]) => FlatSelectOption<T>[];
2727
compareValues?: (value1: T, value2: T) => boolean;
2828
};
2929

packages/common/src/use-select/use-select.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ import { AnyObject } from '@data-driven-forms/react-form-renderer';
66
import useIsMounted from '../hooks/use-is-mounted';
77
import reducer, { init, SelectState } from './reducer';
88
import fnToString from '../utils/fn-to-string';
9-
import { SelectOption, OptionValue, SelectValue } from '../types/shared-types';
9+
import { SelectOption, OptionValue, SelectValue, FlatSelectOption } from '../types/shared-types';
1010

1111
interface UseSelectProps<T = OptionValue> {
1212
loadOptions?: (inputValue?: string) => Promise<SelectOption<T>[]>;
13-
optionsTransformer?: (options: AnyObject[]) => SelectOption<T>[];
13+
optionsTransformer?: (options: AnyObject[]) => FlatSelectOption<T>[];
1414
options?: SelectOption<T>[];
1515
noValueUpdates?: boolean;
1616
onChange?: (value?: SelectValue<T>) => void;
@@ -27,8 +27,8 @@ const getSelectValue = <T extends OptionValue>(
2727
stateValue: SelectValue<T>,
2828
simpleValue: boolean,
2929
isMulti: boolean,
30-
allOptions: SelectOption<T>[]
31-
): SelectOption<T>[] | SelectValue<T> => {
30+
allOptions: (SelectOption<T> | FlatSelectOption<T>)[]
31+
): (SelectOption<T> | FlatSelectOption<T>)[] | SelectValue<T> => {
3232
let enhancedValue = stateValue;
3333

3434
let hasSelectAll = isMulti && allOptions.find(({ selectAll }) => selectAll);
@@ -62,7 +62,7 @@ const handleSelectChange = <T extends OptionValue>(
6262
simpleValue: boolean,
6363
isMulti: boolean,
6464
onChange: (value?: SelectValue<T>) => void,
65-
allOptions: SelectOption<T>[],
65+
allOptions: (SelectOption<T> | FlatSelectOption<T>)[],
6666
removeSelectAll: boolean,
6767
removeSelectNone: boolean
6868
): void => {

0 commit comments

Comments
 (0)