@laerdal/life-react-components 1.0.1-dev.22.full → 1.0.1-dev.29.full
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/dist/esm/Banners/Banner.js +11 -8
- package/dist/esm/Banners/Banner.js.map +1 -1
- package/dist/esm/Button/Anchor.js +76 -0
- package/dist/esm/Button/Anchor.js.map +1 -0
- package/dist/esm/Button/BackButton.js +1 -1
- package/dist/esm/Button/BackButton.js.map +1 -1
- package/dist/esm/Button/Button.js +46 -19
- package/dist/esm/Button/Button.js.map +1 -1
- package/dist/esm/Button/DualFunctionButton.js +111 -0
- package/dist/esm/Button/DualFunctionButton.js.map +1 -0
- package/dist/esm/Button/Iconbutton.js +21 -1
- package/dist/esm/Button/Iconbutton.js.map +1 -1
- package/dist/esm/Button/__tests__/Button.test.js +2 -1
- package/dist/esm/Button/__tests__/Button.test.js.map +1 -1
- package/dist/esm/Button/index.js +1 -0
- package/dist/esm/Button/index.js.map +1 -1
- package/dist/esm/Dropdown/BasicDropdown.js +60 -127
- package/dist/esm/Dropdown/BasicDropdown.js.map +1 -1
- package/dist/esm/Dropdown/ChipDropdownInput.js +41 -132
- package/dist/esm/Dropdown/ChipDropdownInput.js.map +1 -1
- package/dist/esm/Dropdown/CommonStyling.js +20 -15
- package/dist/esm/Dropdown/CommonStyling.js.map +1 -1
- package/dist/esm/Dropdown/DropdownButton.js +2 -2
- package/dist/esm/Dropdown/DropdownButton.js.map +1 -1
- package/dist/esm/Dropdown/DropdownContent.js +424 -0
- package/dist/esm/Dropdown/DropdownContent.js.map +1 -0
- package/dist/esm/Dropdown/DropdownFilter.js +42 -151
- package/dist/esm/Dropdown/DropdownFilter.js.map +1 -1
- package/dist/esm/GlobalNavigationBar/UserMenu/UserMenu.js +15 -17
- package/dist/esm/GlobalNavigationBar/UserMenu/UserMenu.js.map +1 -1
- package/dist/esm/InputFields/Checkbox.js +19 -10
- package/dist/esm/InputFields/Checkbox.js.map +1 -1
- package/dist/esm/InputFields/QuickSearch.js +22 -12
- package/dist/esm/InputFields/QuickSearch.js.map +1 -1
- package/dist/esm/InputFields/RadioButton.js +18 -11
- package/dist/esm/InputFields/RadioButton.js.map +1 -1
- package/dist/esm/InputFields/components/SearchBarInput.js +1 -1
- package/dist/esm/InputFields/components/SearchBarInput.js.map +1 -1
- package/dist/esm/Modals/ModalDialog.js +14 -14
- package/dist/esm/Modals/ModalDialog.js.map +1 -1
- package/dist/esm/Modals/ModalStyles.js +3 -2
- package/dist/esm/Modals/ModalStyles.js.map +1 -1
- package/dist/esm/Paginator/Paginator.js +18 -8
- package/dist/esm/Paginator/Paginator.js.map +1 -1
- package/dist/esm/Paginator/__tests__/Paginator.test.js +1 -1
- package/dist/esm/Paginator/__tests__/Paginator.test.js.map +1 -1
- package/dist/esm/Table/Table.js +2 -1
- package/dist/esm/Table/Table.js.map +1 -1
- package/dist/esm/Tabs/TabLink.js +1 -1
- package/dist/esm/Tabs/TabLink.js.map +1 -1
- package/dist/esm/Toasters/Toast.js +2 -1
- package/dist/esm/Toasters/Toast.js.map +1 -1
- package/dist/esm/types.js +8 -0
- package/dist/esm/types.js.map +1 -1
- package/dist/js/Banners/Banner.js +13 -11
- package/dist/js/Banners/Banner.js.map +1 -1
- package/dist/js/Button/Anchor.d.ts +7 -0
- package/dist/js/Button/Anchor.js +66 -0
- package/dist/js/Button/Anchor.js.map +1 -0
- package/dist/js/Button/BackButton.js +1 -1
- package/dist/js/Button/BackButton.js.map +1 -1
- package/dist/js/Button/Button.d.ts +4 -1
- package/dist/js/Button/Button.js +44 -18
- package/dist/js/Button/Button.js.map +1 -1
- package/dist/js/Button/DualFunctionButton.d.ts +12 -0
- package/dist/js/Button/DualFunctionButton.js +148 -0
- package/dist/js/Button/DualFunctionButton.js.map +1 -0
- package/dist/js/Button/Iconbutton.d.ts +1 -0
- package/dist/js/Button/Iconbutton.js +23 -3
- package/dist/js/Button/Iconbutton.js.map +1 -1
- package/dist/js/Button/__tests__/Button.test.js +3 -1
- package/dist/js/Button/__tests__/Button.test.js.map +1 -1
- package/dist/js/Button/index.d.ts +1 -0
- package/dist/js/Button/index.js +8 -0
- package/dist/js/Button/index.js.map +1 -1
- package/dist/js/Dropdown/BasicDropdown.d.ts +9 -2
- package/dist/js/Dropdown/BasicDropdown.js +67 -133
- package/dist/js/Dropdown/BasicDropdown.js.map +1 -1
- package/dist/js/Dropdown/ChipDropdownInput.js +45 -138
- package/dist/js/Dropdown/ChipDropdownInput.js.map +1 -1
- package/dist/js/Dropdown/CommonStyling.d.ts +6 -2
- package/dist/js/Dropdown/CommonStyling.js +17 -6
- package/dist/js/Dropdown/CommonStyling.js.map +1 -1
- package/dist/js/Dropdown/DropdownButton.js +1 -1
- package/dist/js/Dropdown/DropdownButton.js.map +1 -1
- package/dist/js/Dropdown/DropdownContent.d.ts +45 -0
- package/dist/js/Dropdown/DropdownContent.js +476 -0
- package/dist/js/Dropdown/DropdownContent.js.map +1 -0
- package/dist/js/Dropdown/DropdownFilter.js +59 -186
- package/dist/js/Dropdown/DropdownFilter.js.map +1 -1
- package/dist/js/GlobalNavigationBar/UserMenu/UserMenu.js +7 -17
- package/dist/js/GlobalNavigationBar/UserMenu/UserMenu.js.map +1 -1
- package/dist/js/InputFields/Checkbox.d.ts +5 -3
- package/dist/js/InputFields/Checkbox.js +16 -9
- package/dist/js/InputFields/Checkbox.js.map +1 -1
- package/dist/js/InputFields/QuickSearch.js +24 -6
- package/dist/js/InputFields/QuickSearch.js.map +1 -1
- package/dist/js/InputFields/RadioButton.d.ts +4 -2
- package/dist/js/InputFields/RadioButton.js +15 -10
- package/dist/js/InputFields/RadioButton.js.map +1 -1
- package/dist/js/InputFields/components/SearchBarInput.js +1 -1
- package/dist/js/InputFields/components/SearchBarInput.js.map +1 -1
- package/dist/js/Modals/ModalDialog.d.ts +2 -1
- package/dist/js/Modals/ModalDialog.js +15 -14
- package/dist/js/Modals/ModalDialog.js.map +1 -1
- package/dist/js/Modals/ModalStyles.d.ts +4 -3
- package/dist/js/Modals/ModalStyles.js +4 -2
- package/dist/js/Modals/ModalStyles.js.map +1 -1
- package/dist/js/Paginator/Paginator.js +7 -5
- package/dist/js/Paginator/Paginator.js.map +1 -1
- package/dist/js/Paginator/__tests__/Paginator.test.js +1 -1
- package/dist/js/Paginator/__tests__/Paginator.test.js.map +1 -1
- package/dist/js/Table/Table.js +3 -1
- package/dist/js/Table/Table.js.map +1 -1
- package/dist/js/Tabs/TabLink.js +1 -1
- package/dist/js/Tabs/TabLink.js.map +1 -1
- package/dist/js/Toasters/Toast.js +1 -1
- package/dist/js/Toasters/Toast.js.map +1 -1
- package/dist/js/types.d.ts +5 -0
- package/dist/js/types.js +10 -1
- package/dist/js/types.js.map +1 -1
- package/dist/umd/Banners/Banner.js +11 -8
- package/dist/umd/Banners/Banner.js.map +1 -1
- package/dist/umd/Button/Anchor.js +201 -0
- package/dist/umd/Button/Anchor.js.map +1 -0
- package/dist/umd/Button/BackButton.js +1 -1
- package/dist/umd/Button/BackButton.js.map +1 -1
- package/dist/umd/Button/Button.js +48 -22
- package/dist/umd/Button/Button.js.map +1 -1
- package/dist/umd/Button/DualFunctionButton.js +237 -0
- package/dist/umd/Button/DualFunctionButton.js.map +1 -0
- package/dist/umd/Button/Iconbutton.js +21 -1
- package/dist/umd/Button/Iconbutton.js.map +1 -1
- package/dist/umd/Button/__tests__/Button.test.js +5 -5
- package/dist/umd/Button/__tests__/Button.test.js.map +1 -1
- package/dist/umd/Button/index.js +10 -4
- package/dist/umd/Button/index.js.map +1 -1
- package/dist/umd/Dropdown/BasicDropdown.js +64 -131
- package/dist/umd/Dropdown/BasicDropdown.js.map +1 -1
- package/dist/umd/Dropdown/ChipDropdownInput.js +44 -134
- package/dist/umd/Dropdown/ChipDropdownInput.js.map +1 -1
- package/dist/umd/Dropdown/CommonStyling.js +23 -19
- package/dist/umd/Dropdown/CommonStyling.js.map +1 -1
- package/dist/umd/Dropdown/DropdownButton.js +1 -1
- package/dist/umd/Dropdown/DropdownButton.js.map +1 -1
- package/dist/umd/Dropdown/DropdownContent.js +458 -0
- package/dist/umd/Dropdown/DropdownContent.js.map +1 -0
- package/dist/umd/Dropdown/DropdownFilter.js +47 -155
- package/dist/umd/Dropdown/DropdownFilter.js.map +1 -1
- package/dist/umd/GlobalNavigationBar/UserMenu/UserMenu.js +18 -21
- package/dist/umd/GlobalNavigationBar/UserMenu/UserMenu.js.map +1 -1
- package/dist/umd/InputFields/Checkbox.js +22 -14
- package/dist/umd/InputFields/Checkbox.js.map +1 -1
- package/dist/umd/InputFields/QuickSearch.js +22 -12
- package/dist/umd/InputFields/QuickSearch.js.map +1 -1
- package/dist/umd/InputFields/RadioButton.js +21 -15
- package/dist/umd/InputFields/RadioButton.js.map +1 -1
- package/dist/umd/InputFields/components/SearchBarInput.js +1 -1
- package/dist/umd/InputFields/components/SearchBarInput.js.map +1 -1
- package/dist/umd/Modals/ModalDialog.js +17 -18
- package/dist/umd/Modals/ModalDialog.js.map +1 -1
- package/dist/umd/Modals/ModalStyles.js +6 -6
- package/dist/umd/Modals/ModalStyles.js.map +1 -1
- package/dist/umd/Paginator/Paginator.js +18 -8
- package/dist/umd/Paginator/Paginator.js.map +1 -1
- package/dist/umd/Paginator/__tests__/Paginator.test.js +1 -1
- package/dist/umd/Paginator/__tests__/Paginator.test.js.map +1 -1
- package/dist/umd/Table/Table.js +5 -5
- package/dist/umd/Table/Table.js.map +1 -1
- package/dist/umd/Tabs/TabLink.js +1 -1
- package/dist/umd/Tabs/TabLink.js.map +1 -1
- package/dist/umd/Toasters/Toast.js +1 -1
- package/dist/umd/Toasters/Toast.js.map +1 -1
- package/dist/umd/types.js +8 -0
- package/dist/umd/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
import _pt from "prop-types";
|
|
2
|
+
import React, { useLayoutEffect, createRef } from 'react';
|
|
3
|
+
import styled from 'styled-components';
|
|
4
|
+
import Button from '../Button/Button';
|
|
5
|
+
import { Size } from '../types';
|
|
6
|
+
import { ButtonDropdownContentStyling, DropdownButton } from './CommonStyling';
|
|
7
|
+
import { COLORS } from '../styles';
|
|
8
|
+
import { Checkbox, RadioButton } from '../InputFields';
|
|
9
|
+
export const DDContainer = styled.div`
|
|
10
|
+
display: none;
|
|
11
|
+
position: absolute;
|
|
12
|
+
background-color: ${COLORS.white};
|
|
13
|
+
width: 100%;
|
|
14
|
+
z-index: 1;
|
|
15
|
+
margin-top: ${props => props.isButton ? '-4px' : '2px'};
|
|
16
|
+
|
|
17
|
+
&.show {
|
|
18
|
+
display: flex;
|
|
19
|
+
flex-direction: column;
|
|
20
|
+
justify-content: center;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
&.up {
|
|
24
|
+
top: auto;
|
|
25
|
+
bottom: 100%;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
${props => props.alignLeft ? 'left: 0px;' : ''}
|
|
29
|
+
|
|
30
|
+
${props => props.isButton ? ButtonDropdownContentStyling : ''};
|
|
31
|
+
|
|
32
|
+
border: 1px solid ${COLORS.neutral_100};
|
|
33
|
+
box-sizing: border-box;
|
|
34
|
+
box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.15);
|
|
35
|
+
padding: 4px 0;
|
|
36
|
+
|
|
37
|
+
min-width: ${props => props.size == Size.Large ? '320px' : props.size == Size.Medium ? '280px' : '240px'};
|
|
38
|
+
border-radius: ${props => props.size == Size.Large ? '10px' : props.size == Size.Medium ? '8px' : '6px'};
|
|
39
|
+
|
|
40
|
+
max-height: ${props => !props.scrollable ? 'auto' : props.maxHeight ? props.maxHeight : props.size == Size.Large ? '320px' : props.size == Size.Medium ? '280px' : '240px'};
|
|
41
|
+
`;
|
|
42
|
+
const ListContainer = styled.div`
|
|
43
|
+
${props => props.scrollable ? 'overflow-y: scroll;' : ''}
|
|
44
|
+
${props => props.itemsType != 'normal' ? 'margin: 2px 6px 0 16px;' : ''}
|
|
45
|
+
|
|
46
|
+
div {
|
|
47
|
+
padding-top: ${props => props.size == Size.Large ? '8px' : props.size == Size.Medium ? '4px' : '0px'};
|
|
48
|
+
padding-bottom: ${props => props.size == Size.Large ? '8px' : props.size == Size.Medium ? '4px' : '0px'};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/* width */
|
|
52
|
+
::-webkit-scrollbar {
|
|
53
|
+
width: 4px;
|
|
54
|
+
cursor: pointer;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/* Track */
|
|
58
|
+
::-webkit-scrollbar-track {
|
|
59
|
+
background: ${COLORS.neutral_100};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* Handle */
|
|
63
|
+
::-webkit-scrollbar-thumb {
|
|
64
|
+
background: ${COLORS.neutral_300};
|
|
65
|
+
border-radius: 8px;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/* Handle on hover */
|
|
69
|
+
::-webkit-scrollbar-thumb:hover {
|
|
70
|
+
background: ${COLORS.neutral_500};
|
|
71
|
+
}
|
|
72
|
+
`;
|
|
73
|
+
const ItemsContainer = styled.div`
|
|
74
|
+
padding: 4px;
|
|
75
|
+
`;
|
|
76
|
+
const TopItemContainer = styled.div`
|
|
77
|
+
border-bottom-style: solid;
|
|
78
|
+
border-bottom-color: ${COLORS.neutral_200};
|
|
79
|
+
border-bottom-width: 1px;
|
|
80
|
+
margin-right: 22px;
|
|
81
|
+
padding-left: 4px;
|
|
82
|
+
`;
|
|
83
|
+
const ActionButtonContainer = styled.div`
|
|
84
|
+
border-top-style: solid;
|
|
85
|
+
border-top-color: ${COLORS.neutral_200};
|
|
86
|
+
border-top-width: 1px;
|
|
87
|
+
padding: 0px 16px 4px 16px;
|
|
88
|
+
|
|
89
|
+
button {
|
|
90
|
+
width: 100%;
|
|
91
|
+
}
|
|
92
|
+
`;
|
|
93
|
+
const MAX_MENU_HEIGHT = 240;
|
|
94
|
+
const AVG_OPTION_HEIGHT = 48;
|
|
95
|
+
|
|
96
|
+
const DropdownContent = ({
|
|
97
|
+
id,
|
|
98
|
+
customizationProps,
|
|
99
|
+
alignLeft,
|
|
100
|
+
isButton,
|
|
101
|
+
size,
|
|
102
|
+
isOpen,
|
|
103
|
+
hideOnClickOutside,
|
|
104
|
+
setIsOpen,
|
|
105
|
+
filter,
|
|
106
|
+
selectedValues,
|
|
107
|
+
setSelectedValues,
|
|
108
|
+
messageOnNoResults
|
|
109
|
+
}) => {
|
|
110
|
+
const [focused, setFocused] = React.useState(null);
|
|
111
|
+
const [isUp, setIsUp] = React.useState(false);
|
|
112
|
+
const dropdownContentRef = React.useRef(null);
|
|
113
|
+
const itemsListRef = React.useRef(null);
|
|
114
|
+
React.useEffect(() => {
|
|
115
|
+
determineDropUp();
|
|
116
|
+
}, [isOpen]);
|
|
117
|
+
|
|
118
|
+
const determineDropUp = () => {
|
|
119
|
+
const options = customizationProps.items;
|
|
120
|
+
const node = dropdownContentRef.current;
|
|
121
|
+
if (!node) return;
|
|
122
|
+
const windowHeight = window.innerHeight;
|
|
123
|
+
const menuHeight = Math.min(MAX_MENU_HEIGHT, options.length * AVG_OPTION_HEIGHT);
|
|
124
|
+
const instOffsetWithMenu = node.getBoundingClientRect().top + menuHeight;
|
|
125
|
+
setIsUp(instOffsetWithMenu >= windowHeight);
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
const setNewFocusedElement = index => {
|
|
129
|
+
const newFocusedElement = elRefs[index];
|
|
130
|
+
|
|
131
|
+
if (newFocusedElement) {
|
|
132
|
+
setFocused(index);
|
|
133
|
+
newFocusedElement?.current?.focus();
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
const handleKeyDown = e => {
|
|
138
|
+
if (isOpen) {
|
|
139
|
+
if (e.keyCode === 38) {
|
|
140
|
+
e.preventDefault();
|
|
141
|
+
var focusedNow = focused;
|
|
142
|
+
|
|
143
|
+
if (focusedNow !== undefined && focusedNow !== null && focusedNow > 0) {
|
|
144
|
+
focusedNow -= 1;
|
|
145
|
+
setNewFocusedElement(focusedNow);
|
|
146
|
+
}
|
|
147
|
+
} else if (e.keyCode === 40) {
|
|
148
|
+
e.preventDefault();
|
|
149
|
+
var focusedNow = focused;
|
|
150
|
+
|
|
151
|
+
if (focusedNow !== undefined && focusedNow !== null) {
|
|
152
|
+
focusedNow++;
|
|
153
|
+
} else {
|
|
154
|
+
focusedNow = 0;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
setNewFocusedElement(focusedNow);
|
|
158
|
+
} else if (e.keyCode === 9) {
|
|
159
|
+
e.preventDefault();
|
|
160
|
+
var focusedNow = focused;
|
|
161
|
+
|
|
162
|
+
if (focusedNow !== undefined && focusedNow !== null) {
|
|
163
|
+
focusedNow++;
|
|
164
|
+
const newFocusedElement = document.getElementById(`${id}_${focusedNow}`);
|
|
165
|
+
|
|
166
|
+
if (!newFocusedElement) {
|
|
167
|
+
setNewFocusedElement(0);
|
|
168
|
+
} else {
|
|
169
|
+
setNewFocusedElement(focusedNow);
|
|
170
|
+
}
|
|
171
|
+
} else {
|
|
172
|
+
setNewFocusedElement(0);
|
|
173
|
+
}
|
|
174
|
+
} else if (e.keyCode === 27) {
|
|
175
|
+
setIsOpen(false);
|
|
176
|
+
setNewFocusedElement(0); //TODO: add onEscapehandler
|
|
177
|
+
|
|
178
|
+
/*
|
|
179
|
+
if (!list.includes(input)) {
|
|
180
|
+
setInput('');
|
|
181
|
+
setPlaceholderSearch(placeholder || '');
|
|
182
|
+
}
|
|
183
|
+
styledFieldRef.current?.focus(); */
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
const handleClickOutside = e => {
|
|
189
|
+
if (hideOnClickOutside && dropdownContentRef?.current && !dropdownContentRef.current.contains(e.target) && !elRefs.some(x => x?.current?.contains(e.target))) {
|
|
190
|
+
if (isOpen) {
|
|
191
|
+
setIsOpen(false);
|
|
192
|
+
setFocused(null);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
React.useEffect(() => {
|
|
198
|
+
document.addEventListener('keydown', handleKeyDown);
|
|
199
|
+
document.addEventListener('click', handleClickOutside);
|
|
200
|
+
return () => {
|
|
201
|
+
document.removeEventListener('keydown', handleKeyDown);
|
|
202
|
+
document.removeEventListener('click', handleClickOutside);
|
|
203
|
+
};
|
|
204
|
+
});
|
|
205
|
+
const scrollPosition = React.useRef(0);
|
|
206
|
+
|
|
207
|
+
const handleScroll = () => {
|
|
208
|
+
scrollPosition.current = itemsListRef.current?.scrollTop;
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
useLayoutEffect(() => {
|
|
212
|
+
if (itemsListRef.current) itemsListRef.current.scrollTop = scrollPosition.current ?? 0;
|
|
213
|
+
}, [selectedValues]);
|
|
214
|
+
|
|
215
|
+
const getFilteredItems = () => {
|
|
216
|
+
const filtrationString = (filter ?? '').toUpperCase();
|
|
217
|
+
return customizationProps.items.filter(x => x?.value?.toUpperCase().includes(filtrationString) || x?.displayLabel?.toUpperCase().includes(filtrationString));
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
const getCorrectRef = ref => {
|
|
221
|
+
switch (customizationProps.itemsType) {
|
|
222
|
+
case 'normal':
|
|
223
|
+
return ref || /*#__PURE__*/createRef();
|
|
224
|
+
|
|
225
|
+
default:
|
|
226
|
+
return ref || /*#__PURE__*/createRef();
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
const arrLength = getFilteredItems().length;
|
|
231
|
+
const [elRefs, setElRefs] = React.useState([]);
|
|
232
|
+
React.useEffect(() => {
|
|
233
|
+
setElRefs(elRefs => Array(arrLength + 1).fill(null).map((_, i) => getCorrectRef(elRefs[i])));
|
|
234
|
+
}, [arrLength, selectedValues]);
|
|
235
|
+
|
|
236
|
+
const getTopItem = () => {
|
|
237
|
+
if (!customizationProps.pinTopItem) return;
|
|
238
|
+
const visibleItems = getFilteredItems();
|
|
239
|
+
const allSelected = selectedValues?.filter(x => visibleItems.some(y => y.value == x)).length == visibleItems.length;
|
|
240
|
+
let showTopItem = false;
|
|
241
|
+
const suggestions = getFilteredItems().filter(x => x.suggestion);
|
|
242
|
+
if (customizationProps.itemsType == 'radio' && selectedValues && selectedValues?.length > 0) showTopItem = true;else if (customizationProps.itemsType == 'checkbox' && (customizationProps.multiSelect || selectedValues?.length > 0)) showTopItem = true;else if (customizationProps.itemsType == 'normal' && suggestions.length > 0) showTopItem = true;
|
|
243
|
+
if (!showTopItem) return;
|
|
244
|
+
return /*#__PURE__*/React.createElement(TopItemContainer, null, customizationProps.itemsType == 'radio' && /*#__PURE__*/React.createElement(RadioButton, {
|
|
245
|
+
ref: elRefs[0],
|
|
246
|
+
iconPointerEventsTransparent: true,
|
|
247
|
+
select: () => {},
|
|
248
|
+
size: size,
|
|
249
|
+
id: `${id}_topitem`,
|
|
250
|
+
label: selectedValues[0],
|
|
251
|
+
selected: true
|
|
252
|
+
}), customizationProps.itemsType == 'checkbox' && /*#__PURE__*/React.createElement(Checkbox, {
|
|
253
|
+
ref: elRefs[0],
|
|
254
|
+
select: selected => {
|
|
255
|
+
if (!customizationProps.multiSelect) return;
|
|
256
|
+
const newValues = selected ? visibleItems.map(x => x.value) : [];
|
|
257
|
+
setSelectedValues(newValues);
|
|
258
|
+
customizationProps.onValueUpdate && customizationProps.onValueUpdate(newValues);
|
|
259
|
+
},
|
|
260
|
+
iconPointerEventsTransparent: true,
|
|
261
|
+
semiSelected: customizationProps.multiSelect && !allSelected && selectedValues?.length > 0,
|
|
262
|
+
size: size,
|
|
263
|
+
id: `${id}_checkbox_selectall`,
|
|
264
|
+
label: customizationProps.multiSelect ? 'Select all' : selectedValues[0],
|
|
265
|
+
selected: !customizationProps.multiSelect || allSelected
|
|
266
|
+
}), customizationProps.itemsType == 'normal' && /*#__PURE__*/React.createElement(React.Fragment, null, suggestions.map(x => /*#__PURE__*/React.createElement(DropdownButton, {
|
|
267
|
+
ref: elRefs[0],
|
|
268
|
+
type: "button",
|
|
269
|
+
id: `${id}_topitem`,
|
|
270
|
+
onClick: e => {
|
|
271
|
+
customizationProps.onValueUpdate([x.value]);
|
|
272
|
+
setSelectedValues([x.value]);
|
|
273
|
+
setIsOpen(false);
|
|
274
|
+
setFocused(null);
|
|
275
|
+
}
|
|
276
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
277
|
+
className: "item-content"
|
|
278
|
+
}, x?.icon && /*#__PURE__*/React.createElement("div", {
|
|
279
|
+
className: "item-icon"
|
|
280
|
+
}, x?.icon), /*#__PURE__*/React.createElement("div", {
|
|
281
|
+
className: "item-label"
|
|
282
|
+
}, x?.displayLabel ?? x?.value, x?.noteLabel && /*#__PURE__*/React.createElement("div", {
|
|
283
|
+
style: {
|
|
284
|
+
fontSize: '12px'
|
|
285
|
+
}
|
|
286
|
+
}, x.noteLabel)))))));
|
|
287
|
+
};
|
|
288
|
+
|
|
289
|
+
const getElements = () => {
|
|
290
|
+
if (getFilteredItems().length === 0) {
|
|
291
|
+
return /*#__PURE__*/React.createElement(ItemsContainer, null, /*#__PURE__*/React.createElement(DropdownButton, {
|
|
292
|
+
disabled: true
|
|
293
|
+
}, /*#__PURE__*/React.createElement("span", null, messageOnNoResults)));
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
let number = 0;
|
|
297
|
+
return /*#__PURE__*/React.createElement(ItemsContainer, null, getFilteredItems().filter(x => x && (customizationProps.itemsType != 'normal' || !x.suggestion)).map(item => {
|
|
298
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, customizationProps.itemsType == 'radio' && /*#__PURE__*/React.createElement(RadioButton, {
|
|
299
|
+
select: selected => {
|
|
300
|
+
if (!selected) return;
|
|
301
|
+
customizationProps.onValueUpdate && customizationProps.onValueUpdate([item.value]);
|
|
302
|
+
setSelectedValues([item.value]);
|
|
303
|
+
},
|
|
304
|
+
ref: elRefs[number + 1],
|
|
305
|
+
size: size,
|
|
306
|
+
iconPointerEventsTransparent: true,
|
|
307
|
+
disabled: item?.disabled,
|
|
308
|
+
key: `key_${id}_${number++}`,
|
|
309
|
+
id: `${id}_${number + 1}`,
|
|
310
|
+
label: item.value,
|
|
311
|
+
selected: selectedValues?.includes(item.value)
|
|
312
|
+
}), customizationProps.itemsType == 'checkbox' && /*#__PURE__*/React.createElement(Checkbox, {
|
|
313
|
+
select: selected => {
|
|
314
|
+
let newValue = [];
|
|
315
|
+
|
|
316
|
+
if (customizationProps.multiSelect) {
|
|
317
|
+
if (selected) newValue = [...selectedValues, item.value];else newValue = selectedValues.filter(x => x != item.value);
|
|
318
|
+
} else newValue = selected ? [item.value] : [];
|
|
319
|
+
|
|
320
|
+
setSelectedValues(newValue);
|
|
321
|
+
customizationProps.onValueUpdate(newValue);
|
|
322
|
+
},
|
|
323
|
+
iconPointerEventsTransparent: true,
|
|
324
|
+
disabled: item?.disabled,
|
|
325
|
+
ref: elRefs[number + 1],
|
|
326
|
+
size: size,
|
|
327
|
+
key: `key_${id}_${number++}`,
|
|
328
|
+
id: `${id}_${number + 1}`,
|
|
329
|
+
label: item.value,
|
|
330
|
+
selected: selectedValues?.includes(item.value)
|
|
331
|
+
}), (customizationProps.itemsType == 'normal' || !customizationProps.itemsType) && /*#__PURE__*/React.createElement(DropdownButton, {
|
|
332
|
+
type: "button",
|
|
333
|
+
size: size,
|
|
334
|
+
disabled: item?.disabled,
|
|
335
|
+
ref: elRefs[number + 1],
|
|
336
|
+
onClick: e => {
|
|
337
|
+
customizationProps.onValueUpdate([item.value]);
|
|
338
|
+
setSelectedValues([item.value]);
|
|
339
|
+
setIsOpen(false);
|
|
340
|
+
setFocused(null);
|
|
341
|
+
},
|
|
342
|
+
className: selectedValues?.includes(item.value) ? 'active' : '',
|
|
343
|
+
key: `key_${id}_${number++}`,
|
|
344
|
+
id: `${id}_${number + 1}`
|
|
345
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
346
|
+
className: "item-content"
|
|
347
|
+
}, item.icon && /*#__PURE__*/React.createElement("div", {
|
|
348
|
+
className: "item-icon"
|
|
349
|
+
}, item.icon), /*#__PURE__*/React.createElement("div", {
|
|
350
|
+
className: "item-label"
|
|
351
|
+
}, item.displayLabel ?? item.value, item.noteLabel && /*#__PURE__*/React.createElement("div", {
|
|
352
|
+
style: {
|
|
353
|
+
fontSize: '12px'
|
|
354
|
+
}
|
|
355
|
+
}, item.noteLabel)))));
|
|
356
|
+
}));
|
|
357
|
+
};
|
|
358
|
+
|
|
359
|
+
return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(DDContainer, {
|
|
360
|
+
ref: dropdownContentRef,
|
|
361
|
+
size: size,
|
|
362
|
+
isButton: isButton,
|
|
363
|
+
alignLeft: alignLeft,
|
|
364
|
+
scrollable: customizationProps.scrollable,
|
|
365
|
+
maxHeight: customizationProps.maxHeight,
|
|
366
|
+
className: [isOpen && 'show', isUp && 'up'].filter(e => !!e).join(' ')
|
|
367
|
+
}, /*#__PURE__*/React.createElement(ListContainer, {
|
|
368
|
+
size: size,
|
|
369
|
+
itemsType: customizationProps.itemsType,
|
|
370
|
+
onScroll: handleScroll,
|
|
371
|
+
ref: itemsListRef,
|
|
372
|
+
scrollable: customizationProps.scrollable
|
|
373
|
+
}, customizationProps.pinTopItem && getTopItem(), getElements()), customizationProps.action && customizationProps.actionLabel && /*#__PURE__*/React.createElement(ActionButtonContainer, null, /*#__PURE__*/React.createElement(Button, {
|
|
374
|
+
width: "100%",
|
|
375
|
+
variant: "primary",
|
|
376
|
+
size: size,
|
|
377
|
+
onClick: () => customizationProps.action()
|
|
378
|
+
}, customizationProps.actionLabel))));
|
|
379
|
+
/* ),
|
|
380
|
+
{
|
|
381
|
+
handleClickOutside: () => () => {
|
|
382
|
+
if (isOpen) {
|
|
383
|
+
setIsOpen(false);
|
|
384
|
+
setFocused(null);
|
|
385
|
+
}
|
|
386
|
+
},
|
|
387
|
+
},
|
|
388
|
+
);
|
|
389
|
+
return <Wrapped />; */
|
|
390
|
+
};
|
|
391
|
+
|
|
392
|
+
DropdownContent.propTypes = {
|
|
393
|
+
isButton: _pt.bool.isRequired,
|
|
394
|
+
customizationProps: _pt.shape({
|
|
395
|
+
itemsType: _pt.oneOf(['radio', 'checkbox', 'normal']),
|
|
396
|
+
scrollable: _pt.bool,
|
|
397
|
+
multiSelect: _pt.bool,
|
|
398
|
+
maxHeight: _pt.string,
|
|
399
|
+
actionLabel: _pt.string,
|
|
400
|
+
action: _pt.func.isRequired,
|
|
401
|
+
pinTopItem: _pt.bool,
|
|
402
|
+
isButton: _pt.bool.isRequired,
|
|
403
|
+
onValueUpdate: _pt.func.isRequired,
|
|
404
|
+
items: _pt.arrayOf(_pt.shape({
|
|
405
|
+
value: _pt.string.isRequired,
|
|
406
|
+
displayLabel: _pt.string,
|
|
407
|
+
noteLabel: _pt.string,
|
|
408
|
+
suggestion: _pt.bool,
|
|
409
|
+
disabled: _pt.bool,
|
|
410
|
+
icon: _pt.node
|
|
411
|
+
})).isRequired
|
|
412
|
+
}).isRequired,
|
|
413
|
+
alignLeft: _pt.bool,
|
|
414
|
+
isOpen: _pt.bool.isRequired,
|
|
415
|
+
setIsOpen: _pt.func.isRequired,
|
|
416
|
+
id: _pt.string.isRequired,
|
|
417
|
+
filter: _pt.string.isRequired,
|
|
418
|
+
hideOnClickOutside: _pt.bool.isRequired,
|
|
419
|
+
selectedValues: _pt.arrayOf(_pt.string).isRequired,
|
|
420
|
+
setSelectedValues: _pt.func.isRequired,
|
|
421
|
+
messageOnNoResults: _pt.string.isRequired
|
|
422
|
+
};
|
|
423
|
+
export default DropdownContent;
|
|
424
|
+
//# sourceMappingURL=DropdownContent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/Dropdown/DropdownContent.tsx"],"names":["React","useLayoutEffect","createRef","styled","Button","Size","ButtonDropdownContentStyling","DropdownButton","COLORS","Checkbox","RadioButton","DDContainer","div","white","props","isButton","alignLeft","neutral_100","size","Large","Medium","scrollable","maxHeight","ListContainer","itemsType","neutral_300","neutral_500","ItemsContainer","TopItemContainer","neutral_200","ActionButtonContainer","MAX_MENU_HEIGHT","AVG_OPTION_HEIGHT","DropdownContent","id","customizationProps","isOpen","hideOnClickOutside","setIsOpen","filter","selectedValues","setSelectedValues","messageOnNoResults","focused","setFocused","useState","isUp","setIsUp","dropdownContentRef","useRef","itemsListRef","useEffect","determineDropUp","options","items","node","current","windowHeight","window","innerHeight","menuHeight","Math","min","length","instOffsetWithMenu","getBoundingClientRect","top","setNewFocusedElement","index","newFocusedElement","elRefs","focus","handleKeyDown","e","keyCode","preventDefault","focusedNow","undefined","document","getElementById","handleClickOutside","contains","target","some","x","addEventListener","removeEventListener","scrollPosition","handleScroll","scrollTop","getFilteredItems","filtrationString","toUpperCase","value","includes","displayLabel","getCorrectRef","ref","arrLength","setElRefs","Array","fill","map","_","i","getTopItem","pinTopItem","visibleItems","allSelected","y","showTopItem","suggestions","suggestion","multiSelect","selected","newValues","onValueUpdate","icon","noteLabel","fontSize","getElements","number","item","disabled","newValue","join","action","actionLabel"],"mappings":"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","sourcesContent":["import React, { useLayoutEffect, useMemo, createRef } from 'react';\nimport styled, { css } from 'styled-components';\nimport { CommonInteractionStyling } from '../common';\nimport Button from '../Button/Button';\nimport { Size } from '../types';\nimport { ButtonDropdownContentStyling, DropdownButton } from './CommonStyling';\nimport { BREAKPOINTS, COLORS } from '../styles';\nimport { Checkbox, RadioButton } from '../InputFields';\n\nexport const DDContainer = styled.div<{ isButton: boolean; alignLeft?: boolean; size?: Size; scrollable?: boolean; maxHeight?: string }>`\n display: none;\n position: absolute;\n background-color: ${COLORS.white};\n width: 100%;\n z-index: 1;\n margin-top: ${props => (props.isButton ? '-4px' : '2px')};\n\n &.show {\n display: flex;\n flex-direction: column;\n justify-content: center;\n }\n\n &.up {\n top: auto;\n bottom: 100%;\n }\n\n ${props => (props.alignLeft ? 'left: 0px;' : '')}\n\n ${props => (props.isButton ? ButtonDropdownContentStyling : '')};\n\n border: 1px solid ${COLORS.neutral_100};\n box-sizing: border-box;\n box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.15);\n padding: 4px 0;\n\n min-width: ${props => (props.size == Size.Large ? '320px' : props.size == Size.Medium ? '280px' : '240px')};\n border-radius: ${props => (props.size == Size.Large ? '10px' : props.size == Size.Medium ? '8px' : '6px')};\n\n max-height: ${props => (!props.scrollable ? 'auto' : props.maxHeight ? props.maxHeight : props.size == Size.Large ? '320px' : props.size == Size.Medium ? '280px' : '240px')};\n`;\n\nconst ListContainer = styled.div<{ scrollable?: boolean, size? : Size, itemsType?: string }>`\n ${props => (props.scrollable ? 'overflow-y: scroll;' : '')}\n ${props => (props.itemsType != 'normal' ? 'margin: 2px 6px 0 16px;' : '')}\n\n div {\n padding-top: ${props => props.size == Size.Large ? '8px' : props.size == Size.Medium ? '4px' : '0px' };\n padding-bottom: ${props => props.size == Size.Large ? '8px' : props.size == Size.Medium ? '4px' : '0px' };\n }\n\n /* width */\n ::-webkit-scrollbar {\n width: 4px;\n cursor: pointer;\n }\n\n /* Track */\n ::-webkit-scrollbar-track {\n background: ${COLORS.neutral_100};\n }\n\n /* Handle */\n ::-webkit-scrollbar-thumb {\n background: ${COLORS.neutral_300};\n border-radius: 8px;\n }\n\n /* Handle on hover */\n ::-webkit-scrollbar-thumb:hover {\n background: ${COLORS.neutral_500};\n }\n`;\n\nconst ItemsContainer = styled.div`\n padding: 4px;\n`;\n\n\nconst TopItemContainer = styled.div`\n border-bottom-style: solid;\n border-bottom-color: ${COLORS.neutral_200};\n border-bottom-width: 1px;\n margin-right: 22px;\n padding-left: 4px;\n`;\n\nconst ActionButtonContainer = styled.div`\n border-top-style: solid;\n border-top-color: ${COLORS.neutral_200};\n border-top-width: 1px;\n padding: 0px 16px 4px 16px;\n\n button {\n width: 100%;\n }\n`;\n\nconst MAX_MENU_HEIGHT = 240;\nconst AVG_OPTION_HEIGHT = 48;\n\nexport interface DropdownItem {\n value: string;\n displayLabel?: string;\n noteLabel?: string;\n suggestion?: boolean;\n disabled?: boolean;\n icon?: React.ReactNode;\n}\n\nexport interface DropdownCustomizationProps {\n itemsType?: 'radio' | 'checkbox' | 'normal';\n scrollable?: boolean;\n multiSelect?: boolean;\n maxHeight?: string;\n actionLabel?: string;\n action: () => void;\n pinTopItem?: boolean;\n isButton: boolean;\n onValueUpdate: (values: string[]) => void;\n items: DropdownItem[];\n}\n\nexport interface DropdownProps {\n isButton: boolean;\n customizationProps: DropdownCustomizationProps;\n alignLeft?: boolean;\n isOpen: boolean;\n setIsOpen: (open: boolean) => void;\n size?: Size;\n id: string;\n filter: string;\n hideOnClickOutside: boolean;\n selectedValues: string[];\n setSelectedValues: (val: string[]) => void;\n messageOnNoResults: string;\n}\n\nconst DropdownContent: React.FunctionComponent<DropdownProps> = ({\n id,\n customizationProps,\n alignLeft,\n isButton,\n size,\n isOpen,\n hideOnClickOutside,\n setIsOpen,\n filter,\n selectedValues,\n setSelectedValues,\n messageOnNoResults,\n}) => {\n const [focused, setFocused] = React.useState<number | null>(null);\n const [isUp, setIsUp] = React.useState<boolean>(false);\n const dropdownContentRef = React.useRef<HTMLDivElement>(null);\n\n const itemsListRef = React.useRef<HTMLDivElement>(null);\n \n React.useEffect(() => {\n determineDropUp();\n }, [isOpen]);\n\n const determineDropUp = () => {\n const options = customizationProps.items;\n const node = dropdownContentRef.current;\n\n if (!node) return;\n\n const windowHeight = window.innerHeight;\n const menuHeight = Math.min(MAX_MENU_HEIGHT, options.length * AVG_OPTION_HEIGHT);\n const instOffsetWithMenu = node.getBoundingClientRect().top + menuHeight;\n setIsUp(instOffsetWithMenu >= windowHeight);\n };\n\n const setNewFocusedElement = (index: number) => {\n const newFocusedElement = elRefs[index];\n if (newFocusedElement) {\n setFocused(index);\n newFocusedElement?.current?.focus();\n }\n };\n \n const handleKeyDown = (e: any) => {\n if (isOpen) {\n if (e.keyCode === 38) {\n e.preventDefault();\n var focusedNow = focused;\n if (focusedNow !== undefined && focusedNow !== null && focusedNow > 0) {\n focusedNow -= 1;\n setNewFocusedElement(focusedNow);\n }\n } else if (e.keyCode === 40) {\n e.preventDefault();\n var focusedNow = focused;\n if (focusedNow !== undefined && focusedNow !== null) {\n focusedNow++;\n } else {\n focusedNow = 0;\n }\n setNewFocusedElement(focusedNow);\n } else if (e.keyCode === 9) {\n e.preventDefault();\n var focusedNow = focused;\n if (focusedNow !== undefined && focusedNow !== null) {\n focusedNow++;\n const newFocusedElement = document.getElementById(`${id}_${focusedNow}`);\n if (!newFocusedElement) {\n setNewFocusedElement(0);\n } else {\n setNewFocusedElement(focusedNow);\n }\n } else {\n setNewFocusedElement(0);\n }\n } else if (e.keyCode === 27) {\n setIsOpen(false);\n setNewFocusedElement(0);\n\n //TODO: add onEscapehandler\n /*\n if (!list.includes(input)) {\n setInput('');\n setPlaceholderSearch(placeholder || '');\n }\n styledFieldRef.current?.focus(); */\n }\n }\n };\n\n const handleClickOutside = (e: any) => {\n if (hideOnClickOutside && dropdownContentRef?.current && !dropdownContentRef.current.contains(e.target) && !elRefs.some(x => x?.current?.contains(e.target))) {\n if (isOpen) {\n setIsOpen(false);\n setFocused(null);\n }\n }\n };\n\n React.useEffect(() => {\n document.addEventListener('keydown', handleKeyDown);\n document.addEventListener('click', handleClickOutside);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n document.removeEventListener('click', handleClickOutside);\n };\n });\n\n const scrollPosition = React.useRef<number | undefined>(0); \n const handleScroll = () => {\n scrollPosition.current = itemsListRef.current?.scrollTop;\n }\n useLayoutEffect(() => {\n if (itemsListRef.current) itemsListRef.current.scrollTop = scrollPosition.current ?? 0;\n }, [selectedValues]);\n\n const getFilteredItems = () => {\n const filtrationString = (filter ?? '').toUpperCase();\n return customizationProps.items.\n filter(x => x?.value?.toUpperCase().includes(filtrationString) ||x?.displayLabel?.toUpperCase().includes(filtrationString));\n };\n\n const getCorrectRef = (ref: React.RefObject<HTMLElement>): React.RefObject<HTMLElement> => {\n switch(customizationProps.itemsType)\n {\n case 'normal':\n return ref as React.RefObject<HTMLButtonElement> || createRef<HTMLButtonElement>();\n default:\n return ref as React.RefObject<HTMLDivElement> || createRef<HTMLDivElement>();\n }\n }\n\n const arrLength = getFilteredItems().length;\n const [elRefs, setElRefs] = React.useState<React.RefObject<HTMLElement>[]>([]);\n\n React.useEffect(() => {\n setElRefs(elRefs => \n Array(arrLength + 1).fill(null)\n .map((_, i) => getCorrectRef(elRefs[i])));\n }, [arrLength, selectedValues]);\n\n\n const getTopItem = () => {\n if (!customizationProps.pinTopItem) return;\n const visibleItems = getFilteredItems();\n const allSelected = selectedValues?.filter(x => visibleItems.some(y => y.value == x)).length == visibleItems.length;\n let showTopItem = false;\n const suggestions = getFilteredItems().filter(x => x.suggestion);\n\n if (customizationProps.itemsType == 'radio' && selectedValues && selectedValues?.length > 0) showTopItem = true;\n else if (customizationProps.itemsType == 'checkbox' && (customizationProps.multiSelect || selectedValues?.length > 0)) showTopItem = true;\n else if (customizationProps.itemsType == 'normal' && suggestions.length > 0) showTopItem = true;\n\n if (!showTopItem) return;\n \n return (\n <TopItemContainer>\n {customizationProps.itemsType == 'radio' && (\n <RadioButton\n ref={elRefs[0] as React.RefObject<HTMLDivElement>}\n iconPointerEventsTransparent={true}\n select={() => {}} size={size} id={`${id}_topitem`} label={selectedValues[0]} selected={true} />\n )}\n {customizationProps.itemsType == 'checkbox' && (\n <Checkbox\n ref={elRefs[0] as React.RefObject<HTMLDivElement>}\n select={(selected: boolean) => {\n if (!customizationProps.multiSelect) return;\n\n const newValues = selected ? visibleItems.map(x => x.value) : [];\n setSelectedValues(newValues);\n customizationProps.onValueUpdate && customizationProps.onValueUpdate(newValues);\n }}\n iconPointerEventsTransparent={true}\n semiSelected={customizationProps.multiSelect && !allSelected && selectedValues?.length > 0}\n size={size}\n id={`${id}_checkbox_selectall`}\n label={customizationProps.multiSelect ? 'Select all' : selectedValues[0]}\n selected={!customizationProps.multiSelect || allSelected}\n />\n )}\n {customizationProps.itemsType == 'normal' && (\n <>\n {suggestions.map(x => \n <DropdownButton ref={elRefs[0] as React.RefObject<HTMLButtonElement>} type=\"button\" id={`${id}_topitem`}\n onClick={(e: any) => {\n customizationProps.onValueUpdate([x.value]);\n setSelectedValues([x.value]);\n setIsOpen(false);\n setFocused(null);\n }}>\n <div className=\"item-content\">\n {x?.icon && <div className=\"item-icon\">{x?.icon}</div>}\n <div className=\"item-label\">\n {x?.displayLabel ?? x?.value}\n {x?.noteLabel && <div style={{fontSize: '12px'}}>{x.noteLabel}</div>}\n </div>\n </div>\n </DropdownButton>)}\n </>\n )}\n </TopItemContainer>\n );\n };\n\n const getElements = () => {\n if (getFilteredItems().length === 0) {\n return (\n <ItemsContainer>\n <DropdownButton disabled>\n <span>{messageOnNoResults}</span>\n </DropdownButton>\n </ItemsContainer>\n );\n }\n let number = 0;\n return (\n <ItemsContainer>\n {getFilteredItems().filter(x => x && (customizationProps.itemsType != 'normal' || !x.suggestion)).map(item => {\n return (\n <>\n {customizationProps.itemsType == 'radio' && (\n <RadioButton\n select={(selected: boolean) => {\n if (!selected) return;\n customizationProps.onValueUpdate && customizationProps.onValueUpdate([item.value]);\n setSelectedValues([item.value]);\n }}\n ref={elRefs[number + 1] as React.RefObject<HTMLDivElement>}\n size={size}\n iconPointerEventsTransparent={true}\n disabled={item?.disabled}\n key={`key_${id}_${number++}`}\n id={`${id}_${number + 1}`}\n label={item.value}\n selected={selectedValues?.includes(item.value)}\n />\n )}\n {customizationProps.itemsType == 'checkbox' && (\n <Checkbox\n select={(selected: boolean) => {\n let newValue: string[] = [];\n if (customizationProps.multiSelect) {\n if (selected) newValue = [...selectedValues, item.value];\n else newValue = selectedValues.filter(x => x != item.value);\n } else newValue = selected ? [item.value] : [];\n\n setSelectedValues(newValue);\n customizationProps.onValueUpdate(newValue);\n }}\n iconPointerEventsTransparent={true}\n disabled={item?.disabled} \n ref={elRefs[number + 1] as React.RefObject<HTMLDivElement>}\n size={size}\n key={`key_${id}_${number++}`}\n id={`${id}_${number + 1}`}\n label={item.value}\n selected={selectedValues?.includes(item.value)}\n />\n )}\n {(customizationProps.itemsType == 'normal' || !customizationProps.itemsType) && (\n <DropdownButton\n type=\"button\"\n size={size}\n disabled={item?.disabled}\n ref={elRefs[number + 1] as React.RefObject<HTMLButtonElement>}\n onClick={(e: any) => {\n customizationProps.onValueUpdate([item.value]);\n setSelectedValues([item.value]);\n setIsOpen(false);\n setFocused(null);\n }}\n className={selectedValues?.includes(item.value) ? 'active' : ''}\n key={`key_${id}_${number++}`}\n id={`${id}_${number + 1}`}>\n <div className=\"item-content\">\n {item.icon && <div className=\"item-icon\">{item.icon}</div>}\n <div className=\"item-label\">\n {item.displayLabel ?? item.value}\n {item.noteLabel && <div style={{fontSize: '12px'}}>{item.noteLabel}</div>}\n </div>\n </div>\n </DropdownButton>\n )}\n </>\n );\n })}\n </ItemsContainer>\n );\n };\n\n return <div>\n <DDContainer\n ref={dropdownContentRef}\n size={size}\n isButton={isButton}\n alignLeft={alignLeft}\n scrollable={customizationProps.scrollable}\n maxHeight={customizationProps.maxHeight}\n className={[isOpen && 'show', isUp && 'up'].filter(e => !!e).join(' ')}>\n <ListContainer size={size} itemsType={customizationProps.itemsType} onScroll={handleScroll} ref={itemsListRef} scrollable={customizationProps.scrollable}>\n {customizationProps.pinTopItem && getTopItem()}\n {getElements()}\n </ListContainer>\n {customizationProps.action && customizationProps.actionLabel && (\n <ActionButtonContainer>\n <Button width=\"100%\" variant=\"primary\" size={size} onClick={() => customizationProps.action()}>\n {customizationProps.actionLabel}\n </Button>\n </ActionButtonContainer>\n )}\n </DDContainer>\n </div>;\n /* ),\n {\n handleClickOutside: () => () => {\n if (isOpen) {\n setIsOpen(false);\n setFocused(null);\n }\n },\n },\n );\n\n return <Wrapped />; */\n};\n\nexport default DropdownContent;\n"],"file":"DropdownContent.js"}
|