@entur/dropdown 7.3.2 → 7.3.4

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.
@@ -0,0 +1,90 @@
1
+ import { default as React, Dispatch, SetStateAction } from 'react';
2
+ import { VariantType } from '../../utils';
3
+ import { NormalizedDropdownItemType, PotentiallyAsyncDropdownItemType } from './types';
4
+ /** @deprecated use variant="information" instead */
5
+ declare const info = "info";
6
+ /** @deprecated use variant="negative" instead */
7
+ declare const error = "error";
8
+ export type DropdownProps<ValueType> = {
9
+ /** Tilgjengelige valg i dropdown-en */
10
+ items: PotentiallyAsyncDropdownItemType<ValueType>;
11
+ /** Valgt verdi. Bruk null for ingen verdi. */
12
+ selectedItem: NormalizedDropdownItemType<ValueType> | null;
13
+ /** Callback ved valg som skal oppdatere selectedItem */
14
+ onChange?: (selectedItem: NormalizedDropdownItemType<ValueType> | null) => void | Dispatch<SetStateAction<NormalizedDropdownItemType<ValueType> | null>>;
15
+ /** Beskrivende tekst som forklarer feltet */
16
+ label: string;
17
+ /** Placeholder-tekst når ingenting er satt */
18
+ placeholder?: string;
19
+ /** Om man skal ha mulighet for å nullstille Dropdown-en
20
+ * @default false
21
+ */
22
+ clearable?: boolean;
23
+ /** Lar brukeren velge ved å "tab-e" seg ut av komponenten */
24
+ selectOnTab?: boolean;
25
+ /**
26
+ * @deprecated
27
+ * Bruk selectOnTab i stedet
28
+ *
29
+ * Lar brukeren velge ved å "tab-e" seg ut av komponenten */
30
+ selectOnBlur?: boolean;
31
+ /** Deaktiver dropdown-en */
32
+ disabled?: boolean;
33
+ /** Setter dropdown-en i read-only modus */
34
+ readOnly?: boolean;
35
+ /** Hvilken valideringsvariant som gjelder */
36
+ variant?: VariantType | typeof error | typeof info;
37
+ /** Valideringsmelding, brukes sammen med `variant` */
38
+ feedback?: string;
39
+ /** Tekst eller ikon som kommer først i dropdown-feltet */
40
+ prepend?: React.ReactNode;
41
+ /** */
42
+ loading?: boolean;
43
+ /** En tekst som beskriver hva som skjer når man venter på items
44
+ * @default 'Laster inn …'
45
+ */
46
+ loadingText?: string;
47
+ /** Tekst som kommer opp når det ikke er noe elementer å vise
48
+ * @default "Ingen tilgjengelige valg …"
49
+ */
50
+ noMatchesText?: string;
51
+ /** Om man skal ha mulighet for å nullstille Dropdown-en
52
+ * @default "fjern valgt"
53
+ */
54
+ labelClearSelectedItem?: string;
55
+ /** En tooltip som gir ekstra info om inputfeltet */
56
+ labelTooltip?: React.ReactNode;
57
+ /** Plasserer labelen statisk på toppen av inputfeltet
58
+ * @default false
59
+ */
60
+ disableLabelAnimation?: boolean;
61
+ /** Ekstra klassenavn */
62
+ className?: string;
63
+ /** Styling som sendes ned til Dropdown-lista */
64
+ listStyle?: {
65
+ [key: string]: any;
66
+ };
67
+ /** Styling for Dropdown-en */
68
+ style?: {
69
+ [key: string]: any;
70
+ };
71
+ /** Tekst for skjemleser for knapp som lukker listen med valg
72
+ * @default "Lukk liste med valg"
73
+ */
74
+ ariaLabelCloseList?: string;
75
+ /** Tekst for skjemleser for knapp som åpner listen med valg
76
+ * @default "Åpne liste med valg"
77
+ */
78
+ ariaLabelOpenList?: string;
79
+ /** Ord for at et element er valgt i entall
80
+ * eks. 'Element 1, _valgt_'
81
+ * @default 'valgt'
82
+ */
83
+ ariaLabelChosenSingular?: string;
84
+ /** Tekst for skjermleser som beskriver statusen til et element som valgt
85
+ * @default ', valgt element, trykk for å fjerne'
86
+ */
87
+ ariaLabelSelectedItem?: string;
88
+ };
89
+ export declare const Dropdown: <ValueType extends unknown>(props: DropdownProps<ValueType> & React.RefAttributes<HTMLDivElement>) => React.ReactElement | null;
90
+ export {};
@@ -0,0 +1,123 @@
1
+ import { default as React, Dispatch, SetStateAction } from 'react';
2
+ import { DropdownProps } from './Dropdown';
3
+ import { NormalizedDropdownItemType } from './types';
4
+ export type MultiSelectProps<ValueType> = Omit<DropdownProps<ValueType>, 'selectedItem' | 'onChange'> & {
5
+ /** Elementer som er valgt blant 'items'. Bruk tom liste for ingen valgte
6
+ */
7
+ selectedItems: NormalizedDropdownItemType<ValueType>[];
8
+ /** Callback med alle valgte verdier.
9
+ * Bruk denne til å oppdatere selectedItems-listen */
10
+ onChange?: (selectedItems: NormalizedDropdownItemType<ValueType>[]) => void | Dispatch<SetStateAction<NormalizedDropdownItemType<ValueType>[]>>;
11
+ /** Filtreringen som brukes når man skriver inn tekst i inputfeltet
12
+ * @default Regex-test som sjekker om item.label inneholder input-teksten
13
+ */
14
+ itemFilter?: (item: NormalizedDropdownItemType<ValueType>, inputValue: string | undefined) => boolean;
15
+ /** Skjuler «Velg alle» fra listen med valg
16
+ * @default false
17
+ */
18
+ hideSelectAll?: boolean;
19
+ /** Antall millisekunder man venter før man kaller en potensiell items-funksjon
20
+ * @default 250
21
+ */
22
+ debounceTimeout?: number;
23
+ /** Maks antall individuelle valgt-element-tags i MultiSelect-en før de blir til en samle-tag
24
+ * @default 10
25
+ */
26
+ maxChips?: number;
27
+ /** Resetter input etter at et element er valgt i listen
28
+ * @default false
29
+ */
30
+ clearInputOnSelect?: boolean;
31
+ /** Teksten som vises for «Velg alle»-elementet i listen
32
+ * @default "Velg alle"
33
+ */
34
+ labelSelectAll?: string;
35
+ /** Teksten som vises for «Velg alle»-elementet i listen
36
+ * @default "Alle valgt"
37
+ */
38
+ labelAllItemsSelected?: string;
39
+ /** Skjermleser-tekst som for å fjerne alle valg
40
+ * @default "Fjern valgte"
41
+ */
42
+ labelClearAllItems?: string;
43
+ /** Tekst for skjemleser på knapper for å fjerne valgt element
44
+ * @default "trykk for å fjerne valg"
45
+ */
46
+ ariaLabelRemoveSelected?: string;
47
+ /** Tekst for skjemleser for å indikere at et element er valgt
48
+ * @default "valgte"
49
+ */
50
+ ariaLabelChosenPlural?: string;
51
+ /** Tekst for skjemleser for å hoppe til input-feltet
52
+ * @default `${selectedItems.length} valgte elementer, trykk for å hoppe til tekstfeltet`
53
+ */
54
+ ariaLabelJumpToInput?: string;
55
+ /** Callback som kalles når brukeren går ut av input-feltet */
56
+ onBlur?: (event: React.FocusEvent<HTMLInputElement>) => void;
57
+ /** Callback når komponenten klikkes */
58
+ onClick?: (event: React.MouseEvent<HTMLDivElement>) => void;
59
+ /** Callback når en tast trykkes */
60
+ onKeyDown?: (event: React.KeyboardEvent<HTMLDivElement>) => void;
61
+ /** Callback når komponenten får fokus */
62
+ onFocus?: (event: React.FocusEvent<HTMLDivElement>) => void;
63
+ };
64
+ export declare const MultiSelect: <ValueType extends unknown>(props: Omit<DropdownProps<ValueType>, "onChange" | "selectedItem"> & {
65
+ /** Elementer som er valgt blant 'items'. Bruk tom liste for ingen valgte
66
+ */
67
+ selectedItems: NormalizedDropdownItemType<ValueType>[];
68
+ /** Callback med alle valgte verdier.
69
+ * Bruk denne til å oppdatere selectedItems-listen */
70
+ onChange?: ((selectedItems: NormalizedDropdownItemType<ValueType>[]) => void | React.Dispatch<React.SetStateAction<NormalizedDropdownItemType<ValueType>[]>>) | undefined;
71
+ /** Filtreringen som brukes når man skriver inn tekst i inputfeltet
72
+ * @default Regex-test som sjekker om item.label inneholder input-teksten
73
+ */
74
+ itemFilter?: ((item: NormalizedDropdownItemType<ValueType>, inputValue: string | undefined) => boolean) | undefined;
75
+ /** Skjuler «Velg alle» fra listen med valg
76
+ * @default false
77
+ */
78
+ hideSelectAll?: boolean;
79
+ /** Antall millisekunder man venter før man kaller en potensiell items-funksjon
80
+ * @default 250
81
+ */
82
+ debounceTimeout?: number;
83
+ /** Maks antall individuelle valgt-element-tags i MultiSelect-en før de blir til en samle-tag
84
+ * @default 10
85
+ */
86
+ maxChips?: number;
87
+ /** Resetter input etter at et element er valgt i listen
88
+ * @default false
89
+ */
90
+ clearInputOnSelect?: boolean;
91
+ /** Teksten som vises for «Velg alle»-elementet i listen
92
+ * @default "Velg alle"
93
+ */
94
+ labelSelectAll?: string;
95
+ /** Teksten som vises for «Velg alle»-elementet i listen
96
+ * @default "Alle valgt"
97
+ */
98
+ labelAllItemsSelected?: string;
99
+ /** Skjermleser-tekst som for å fjerne alle valg
100
+ * @default "Fjern valgte"
101
+ */
102
+ labelClearAllItems?: string;
103
+ /** Tekst for skjemleser på knapper for å fjerne valgt element
104
+ * @default "trykk for å fjerne valg"
105
+ */
106
+ ariaLabelRemoveSelected?: string;
107
+ /** Tekst for skjemleser for å indikere at et element er valgt
108
+ * @default "valgte"
109
+ */
110
+ ariaLabelChosenPlural?: string;
111
+ /** Tekst for skjemleser for å hoppe til input-feltet
112
+ * @default `${selectedItems.length} valgte elementer, trykk for å hoppe til tekstfeltet`
113
+ */
114
+ ariaLabelJumpToInput?: string;
115
+ /** Callback som kalles når brukeren går ut av input-feltet */
116
+ onBlur?: (event: React.FocusEvent<HTMLInputElement>) => void;
117
+ /** Callback når komponenten klikkes */
118
+ onClick?: (event: React.MouseEvent<HTMLDivElement>) => void;
119
+ /** Callback når en tast trykkes */
120
+ onKeyDown?: (event: React.KeyboardEvent<HTMLDivElement>) => void;
121
+ /** Callback når komponenten får fokus */
122
+ onFocus?: (event: React.FocusEvent<HTMLDivElement>) => void;
123
+ } & React.RefAttributes<HTMLInputElement>) => React.ReactElement | null;
@@ -0,0 +1,55 @@
1
+ import { default as React } from 'react';
2
+ import { VariantType } from '../../utils';
3
+ import { NormalizedDropdownItemType, PotentiallyAsyncDropdownItemType } from './types';
4
+ /** @deprecated use variant="information" instead */
5
+ declare const info = "info";
6
+ /** @deprecated use variant="negative" instead */
7
+ declare const error = "error";
8
+ export type NativeDropdownProps<ValueType> = {
9
+ /** Ekstra klassenavn */
10
+ className?: string;
11
+ /**
12
+ * For å deaktivere dropdow-nen
13
+ * @default false
14
+ **/
15
+ disabled?: boolean;
16
+ /** Valideringsmelding, brukes sammen med `variant` */
17
+ feedback?: string;
18
+ /** Alle valg for dropdown-en å ha */
19
+ items: PotentiallyAsyncDropdownItemType<ValueType>;
20
+ /** Beskrivende tekst som forklarer feltet */
21
+ label: string;
22
+ /** En callback for endringer av value
23
+ * Obs: merk at parameter her denne ikke er samme som i en HTML select.
24
+ * Bruk { target } hvis du trenger info om select-elementet som ble trykket på
25
+ */
26
+ onChange?: ({ value, selectedItem, target, }: {
27
+ value: string;
28
+ selectedItem: NormalizedDropdownItemType<ValueType> | null;
29
+ target: EventTarget & HTMLSelectElement;
30
+ }) => void;
31
+ /** Tekst eller ikon som kommer før dropdown-en */
32
+ prepend?: React.ReactNode;
33
+ /**
34
+ * Setter dropdown-en i read-only modus
35
+ * @default false
36
+ **/
37
+ readOnly?: boolean;
38
+ /** Den valgte verdien som NormalizedDropdownItemType
39
+ * (Brukes når komponenten er 'controlled')
40
+ */
41
+ selectedItem?: NormalizedDropdownItemType<ValueType> | null;
42
+ /** Den valgte verdien som sting
43
+ * (Brukes når komponenten er 'controlled)
44
+ */
45
+ value?: string;
46
+ /** Hvilken valideringsvariant som gjelder*/
47
+ variant?: VariantType | typeof error | typeof info;
48
+ /** Plasserer labelen statisk på toppen av inputfeltet
49
+ * @default false
50
+ */
51
+ disableLabelAnimation?: boolean;
52
+ [key: string]: any;
53
+ };
54
+ export declare const NativeDropdown: <ValueType extends string | number>(props: NativeDropdownProps<ValueType> & React.RefAttributes<HTMLSelectElement>) => React.ReactElement | null;
55
+ export {};
@@ -0,0 +1,47 @@
1
+ import { default as React } from 'react';
2
+ import { DropdownProps } from './Dropdown';
3
+ import { NormalizedDropdownItemType } from './types';
4
+ export type SearchableDropdownProps<ValueType> = DropdownProps<ValueType> & {
5
+ /** Filtreringen som brukes når man skriver inn tekst i inputfeltet
6
+ * @default Regex-test som sjekker om item.label inneholder input-teksten
7
+ */
8
+ itemFilter?: (item: NormalizedDropdownItemType<ValueType>, inputValue: string | undefined) => boolean;
9
+ /** Antall millisekunder man venter etter tekstinput før det gjøres kall for å oppdatere items
10
+ * Denne er kun relevant hvis du sender inn en funksjon som items.
11
+ */
12
+ debounceTimeout?: number;
13
+ /** Tekst som kommer opp når det ikke er noe treff på filtreringsøket
14
+ * @default "Ingen treff for søket"
15
+ */
16
+ noMatchesText?: string;
17
+ /** Callback som kalles når brukeren går ut av input-feltet */
18
+ onBlur?: (event: React.FocusEvent<HTMLInputElement>) => void;
19
+ /** Callback når komponenten klikkes */
20
+ onClick?: (event: React.MouseEvent<HTMLDivElement>) => void;
21
+ /** Callback når en tast trykkes */
22
+ onKeyDown?: (event: React.KeyboardEvent<HTMLDivElement>) => void;
23
+ /** Callback når komponenten får fokus */
24
+ onFocus?: (event: React.FocusEvent<HTMLDivElement>) => void;
25
+ };
26
+ export declare const SearchableDropdown: <ValueType extends unknown>(props: DropdownProps<ValueType> & {
27
+ /** Filtreringen som brukes når man skriver inn tekst i inputfeltet
28
+ * @default Regex-test som sjekker om item.label inneholder input-teksten
29
+ */
30
+ itemFilter?: ((item: NormalizedDropdownItemType<ValueType>, inputValue: string | undefined) => boolean) | undefined;
31
+ /** Antall millisekunder man venter etter tekstinput før det gjøres kall for å oppdatere items
32
+ * Denne er kun relevant hvis du sender inn en funksjon som items.
33
+ */
34
+ debounceTimeout?: number;
35
+ /** Tekst som kommer opp når det ikke er noe treff på filtreringsøket
36
+ * @default "Ingen treff for søket"
37
+ */
38
+ noMatchesText?: string;
39
+ /** Callback som kalles når brukeren går ut av input-feltet */
40
+ onBlur?: (event: React.FocusEvent<HTMLInputElement>) => void;
41
+ /** Callback når komponenten klikkes */
42
+ onClick?: (event: React.MouseEvent<HTMLDivElement>) => void;
43
+ /** Callback når en tast trykkes */
44
+ onKeyDown?: (event: React.KeyboardEvent<HTMLDivElement>) => void;
45
+ /** Callback når komponenten får fokus */
46
+ onFocus?: (event: React.FocusEvent<HTMLDivElement>) => void;
47
+ } & React.RefAttributes<HTMLInputElement>) => React.ReactElement | null;
@@ -0,0 +1,26 @@
1
+ import { default as React } from 'react';
2
+ import { UseComboboxPropGetters, UseSelectPropGetters } from 'downshift';
3
+ import { NormalizedDropdownItemType } from '../types';
4
+ type DropdownListProps<ValueType> = {
5
+ ariaLabelChosenSingular?: string;
6
+ ariaLabelSelectedItem?: string;
7
+ getMenuProps: UseComboboxPropGetters<ValueType>['getMenuProps'] | UseSelectPropGetters<ValueType>['getMenuProps'];
8
+ getItemProps: UseComboboxPropGetters<ValueType>['getItemProps'] | UseSelectPropGetters<ValueType>['getItemProps'];
9
+ highlightedIndex: number;
10
+ isOpen: boolean;
11
+ listItems: NormalizedDropdownItemType<ValueType | string>[];
12
+ floatingStyles: {
13
+ [key: string]: any;
14
+ } | undefined;
15
+ setListRef: (node: HTMLElement | null) => void;
16
+ loading?: boolean;
17
+ loadingText?: string;
18
+ noMatchesText?: string;
19
+ selectAllCheckboxState?: () => boolean | 'indeterminate';
20
+ selectAllItem?: NormalizedDropdownItemType<string>;
21
+ selectedItems: NormalizedDropdownItemType<ValueType>[];
22
+ style?: React.CSSProperties;
23
+ readOnly?: boolean;
24
+ };
25
+ export declare const DropdownList: <ValueType extends unknown>({ ariaLabelChosenSingular, ariaLabelSelectedItem, getItemProps, getMenuProps, isOpen, highlightedIndex, listItems, floatingStyles, setListRef, loading, loadingText, noMatchesText, selectAllCheckboxState, selectAllItem, selectedItems, readOnly, ...rest }: DropdownListProps<ValueType>) => React.JSX.Element;
26
+ export {};
@@ -0,0 +1,32 @@
1
+ import { default as React } from 'react';
2
+ import { UseComboboxGetToggleButtonPropsReturnValue, UseMultipleSelectionGetSelectedItemPropsOptions } from 'downshift';
3
+ import { NormalizedDropdownItemType } from '../types';
4
+ export declare const SelectedItemTag: <ValueType extends unknown>({ ariaLabelRemoveSelected, ariaLabelChosen, disabled, getSelectedItemProps, index, readOnly, removeSelectedItem, selectedItem, }: {
5
+ ariaLabelRemoveSelected: string;
6
+ ariaLabelChosen?: string;
7
+ disabled?: boolean;
8
+ getSelectedItemProps?: (options: UseMultipleSelectionGetSelectedItemPropsOptions<NormalizedDropdownItemType<ValueType>>) => any;
9
+ index?: number;
10
+ readOnly?: boolean;
11
+ removeSelectedItem: (item: NormalizedDropdownItemType<ValueType>) => void;
12
+ selectedItem: NormalizedDropdownItemType<ValueType>;
13
+ }) => React.JSX.Element;
14
+ export declare const DropdownFieldAppendix: (props: Partial<UseComboboxGetToggleButtonPropsReturnValue> & {
15
+ ariaLabelCloseList: string;
16
+ ariaLabelOpenList: string;
17
+ clearable?: boolean;
18
+ labelClearSelected: string;
19
+ disabled?: boolean;
20
+ focusable?: boolean;
21
+ isOpen: boolean;
22
+ loading: boolean;
23
+ loadingText: string | undefined;
24
+ onClear: () => void;
25
+ itemIsSelected: boolean;
26
+ } & React.RefAttributes<HTMLButtonElement>) => React.ReactElement | null;
27
+ export declare const ClearableButton: ({ onClear, labelClearSelectedItems, focusable, }: {
28
+ onClear: () => void;
29
+ labelClearSelectedItems?: string;
30
+ focusable?: boolean;
31
+ ariaLabelClearItems?: string;
32
+ }) => React.JSX.Element;
@@ -525,6 +525,10 @@ const SearchableDropdown = React.forwardRef(
525
525
  selectOnTab = false,
526
526
  style,
527
527
  variant = "info",
528
+ onBlur,
529
+ onClick,
530
+ onKeyDown,
531
+ onFocus,
528
532
  ...rest
529
533
  }, ref) => {
530
534
  const [showSelectedItem, setShowSelectedItem] = React.useState(value !== null);
@@ -697,7 +701,10 @@ const SearchableDropdown = React.forwardRef(
697
701
  if (e.target === e.currentTarget) {
698
702
  getInputProps()?.onClick?.(e);
699
703
  }
704
+ onClick?.(e);
700
705
  },
706
+ onKeyDown,
707
+ onFocus,
701
708
  prepend,
702
709
  readOnly,
703
710
  ref: refs.setReference,
@@ -758,8 +765,9 @@ const SearchableDropdown = React.forwardRef(
758
765
  }
759
766
  }
760
767
  },
761
- onBlur() {
768
+ onBlur(e) {
762
769
  if (selectedItem !== null) setShowSelectedItem(true);
770
+ onBlur?.(e);
763
771
  },
764
772
  onFocus() {
765
773
  if (!readOnly) {
@@ -835,6 +843,10 @@ const MultiSelect = React.forwardRef(
835
843
  ariaLabelOpenList = "Åpne liste med valg",
836
844
  ariaLabelRemoveSelected = "trykk for å fjerne valg",
837
845
  ariaLabelSelectedItem,
846
+ onBlur,
847
+ onClick,
848
+ onKeyDown,
849
+ onFocus,
838
850
  ...rest
839
851
  }, ref) => {
840
852
  const [lastHighlightedIndex, setLastHighlightedIndex] = React.useState(0);
@@ -1060,12 +1072,18 @@ const MultiSelect = React.forwardRef(
1060
1072
  labelId: getLabelProps().id,
1061
1073
  labelProps: getLabelProps(),
1062
1074
  labelTooltip,
1063
- onBlur: () => setInputValue(""),
1075
+ onBlur: (e) => {
1076
+ setInputValue("");
1077
+ onBlur?.(e);
1078
+ },
1064
1079
  onClick: (e) => {
1065
1080
  if (e.target === e.currentTarget) {
1066
1081
  getInputProps()?.onClick?.(e);
1067
1082
  }
1083
+ onClick?.(e);
1068
1084
  },
1085
+ onKeyDown,
1086
+ onFocus,
1069
1087
  readOnly,
1070
1088
  ref: refs.setReference,
1071
1089
  style,