playbook_ui 12.26.0.pre.alpha.multiselectfixes797 → 12.26.0.pre.alpha.multiselectfixes821

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bb28619d3962e184fa90f3ae74186c2ae1af998512701e96ac16b4773af46e03
4
- data.tar.gz: 1292e10c121acf557424b1182a40d975c3d048beb1671e04953845033778e049
3
+ metadata.gz: 3921a5868e63be4fc845ce62bf461e9a529105ca767a7bf08a6e59750afd1a7e
4
+ data.tar.gz: a8fdd12e4f31427f8bafafd74cadb518e8904c91ddf05dd611b511b3b365d415
5
5
  SHA512:
6
- metadata.gz: 5ca7d7d6b91997cd0cdf8f9f9c1064006b83080c618bb5412f291b21a9c3e973f42001b6fae6b4ddec7e37f19c1dac859c926ac8d4bd987f063ae3e0fb9a373d
7
- data.tar.gz: bc47e4d4e8b137a3ac76db1f2c3578295dad61e9dd50a9af8b1b91a27274e14d679749144ca36cc01405971cd3bf728624294b1dde468529abe568a821351eab
6
+ metadata.gz: 6e18e3d7e15956c2847c3fa8584db5696f19e8e82a1614786c8f7af71587d6a44872efc2f0cd10a62d2400a55ae7d1a0300e3f5437712be859f34a3dcdfa314a
7
+ data.tar.gz: f1778abccb8f3e4006b3c814b29c8c3a90368f5db3eac1b1875ad67d2164e7a2913c4de4e5f8c84078a70cbd104c84e2122c7cac404dad1c63eb37498377764a
@@ -1,58 +1,16 @@
1
- //function for unchecking items in formattedData
2
- export const unCheckIt = (
3
- formattedData: { [key: string]: any }[],
4
- id: string
5
- ) => {
6
- formattedData.map((item: { [key: string]: any }) => {
7
- if (item.id === id && item.checked) {
8
- item.checked = false;
9
- }
10
- if (item.children && item.children.length > 0) {
11
- unCheckIt(item.children, id);
12
- }
13
- return item;
14
- });
15
- };
16
-
17
1
  //function to retrieve all ancestors of unchecked item and set checked to false
18
2
  export const getAncestorsOfUnchecked = (
19
- formattedData: { [key: string]: any }[],
3
+ data: { [key: string]: any }[],
20
4
  item: { [key: string]: any }
21
5
  ) => {
22
6
  if (item.parent_id) {
23
- const ancestors = filterFormattedDataById(formattedData, item.parent_id);
24
- ancestors[0].checked = false;
25
-
26
- if (ancestors[0].parent_id) {
27
- getAncestorsOfUnchecked(formattedData, ancestors[0]);
28
- }
7
+ const ancestor = filterFormattedDataById(data, item.parent_id);
8
+ ancestor[0].checked = false;
9
+ ancestor[0].parent_id && getAncestorsOfUnchecked(data, ancestor[0])
29
10
  }
11
+ return data;
30
12
  };
31
-
32
- //recursively check all child and grandchild items if parent checked
33
- export const checkedRecursive = (item: { [key: string]: any }) => {
34
- if (!item.checked) {
35
- item.checked = true;
36
- }
37
- if (item.children && item.children.length > 0) {
38
- item.children.forEach((childItem: { [key: string]: any }) => {
39
- checkedRecursive(childItem);
40
- });
41
- }
42
- };
43
-
44
- //recursively uncheck all child and grandchild items if parent unchecked
45
- export const unCheckedRecursive = (item: { [key: string]: any }) => {
46
- if (item.checked) {
47
- item.checked = false;
48
- }
49
- if (item.children && item.children.length > 0) {
50
- item.children.forEach((childItem: { [key: string]: any }) => {
51
- unCheckedRecursive(childItem);
52
- });
53
- }
54
- };
55
-
13
+
56
14
  //function is going over formattedData and returning all objects that match the
57
15
  //id of the clicked item from the dropdown
58
16
  export const filterFormattedDataById = (
@@ -64,6 +22,7 @@ export const filterFormattedDataById = (
64
22
  for (const item of data) {
65
23
  if (item.id.toLowerCase() === (term.toLowerCase())) {
66
24
  matched.push(item);
25
+ return
67
26
  }
68
27
 
69
28
  if (item.children && item.children.length > 0) {
@@ -116,116 +75,57 @@ export const getCheckedItems = (
116
75
  });
117
76
  return checkedItems;
118
77
  };
78
+
79
+ export const getDefaultCheckedItems = (treeData:{ [key: string]: any }[]) => {
80
+ const checkedDefault: { [key: string]: any }[] = [];
81
+
82
+ const traverseTree = (items:{ [key: string]: any }[]) => {
83
+ items.forEach((item:{ [key: string]: any }) => {
84
+ if (item.checked) {
85
+ if (item.children && item.children.length > 0) {
86
+ const uncheckedChildren = item.children.filter((child:{ [key: string]: any }) => !child.checked);
87
+ if (uncheckedChildren.length === 0) {
88
+ checkedDefault.push(item);
89
+ return;
90
+ }
91
+ } else {
92
+ const parent = items.find((parentItem:{ [key: string]: any }) => parentItem.id === item.parentId);
93
+ if (!parent || !parent.checked) {
94
+ checkedDefault.push(item);
95
+ }
96
+ }
97
+ }
119
98
 
120
- export const getChildIds = (
121
- item: { [key: string]: any },
122
- defaultArray: { [key: string]: any }[]
123
- ) => {
124
- let childIds: string[] = [];
125
- item.children.forEach((child: { [key: string]: any }) => {
126
- childIds.push(child.id);
127
- if (child.children && child.children.length > 0) {
128
- const childChildIds = getChildIds(child, defaultArray);
129
- childIds.push(...childChildIds);
130
- }
131
- });
132
- return childIds;
133
- };
134
-
135
- export const updateReturnItems = (newChecked: { [key: string]: any }[]) => {
136
- const updatedCheckedItems: { [key: string]: any }[] = [];
137
- for (const item of newChecked) {
138
- if (item.children && item.children.length > 0) {
139
- const allChildrenChecked = item.children.every(
140
- (child: { [key: string]: any }) => child.checked
141
- );
142
- if (allChildrenChecked) {
143
- updatedCheckedItems.push(item);
99
+ if (item.children && item.children.length > 0) {
100
+ traverseTree(item.children);
144
101
  }
145
- }
146
- const childItem = updatedCheckedItems.some((x) => x.id === item?.parent_id);
147
- if (!childItem) {
148
- updatedCheckedItems.push(item);
149
- }
150
- }
151
- const filteredReturn = updatedCheckedItems.filter((item) => {
152
- return !updatedCheckedItems.find(
153
- (otherItem) => otherItem.id === item.parent_id
154
- );
155
- });
156
- return filteredReturn;
102
+ });
103
+ };
104
+
105
+ traverseTree(treeData);
106
+
107
+ return checkedDefault;
157
108
  };
158
109
 
159
- export const recursiveReturnOnlyParent = (
160
- items: { [key: string]: any },
161
- formattedData: { [key: string]: any }[],
162
- defaultReturn: { [key: string]: any }[],
163
- setDefaultReturn: any
110
+ export const recursiveCheckParent = (
111
+ item: { [key: string]: any },
112
+ data:any
164
113
  ) => {
165
- const parent = filterFormattedDataById(formattedData, items.parent_id);
114
+ if (item.parent_id !== null) {
115
+ const parent = filterFormattedDataById(data, item.parent_id);
166
116
  const allChildrenChecked = parent[0].children.every(
167
117
  (child: { [key: string]: any }) => child.checked
168
118
  );
169
119
  if (allChildrenChecked) {
170
- // Only return the parent and remove its children from defaultReturn
171
120
  parent[0].checked = true;
172
- const filteredDefaultReturn = defaultReturn.filter((item) => {
173
- // Remove children of the specific parent
174
- if (
175
- parent[0].children.find(
176
- (child: { [key: string]: any }) => child.id === item.id
177
- )
178
- ) {
179
- return false;
180
- }
181
- });
182
- setDefaultReturn([...filteredDefaultReturn, parent[0]]);
183
- // Check if the parent has a parent and its children are all checked
184
121
  const parentHasParent = parent[0].parent_id !== null;
185
122
  if (parentHasParent) {
186
- recursiveReturnOnlyParent(
123
+ recursiveCheckParent(
187
124
  parent[0],
188
- formattedData,
189
- filteredDefaultReturn,
190
- setDefaultReturn
125
+ data
191
126
  );
192
127
  }
193
- } else {
194
- const checkedChildren = parent[0].children.filter(
195
- (child: { [key: string]: any }) => child.checked
196
- );
197
- const updatedDefaultReturn = [...defaultReturn, ...checkedChildren];
198
- setDefaultReturn(updatedDefaultReturn);
199
- }
200
- };
201
-
202
- export const removeChildrenIfParentChecked = (
203
- items: { [key: string]: any },
204
- defaultReturn: { [key: string]: any }[],
205
- setDefaultReturn: any
206
- ) => {
207
- const childIds = getChildIds(items, defaultReturn);
208
- const filteredDefaultArray = defaultReturn.filter(
209
- (item: { [key: string]: any }) => childIds !== item.id
210
- );
211
- setDefaultReturn([...filteredDefaultArray, items]);
212
- };
213
-
214
- export const areAllCheckedFalse = (data:any) => {
215
- if (!Array.isArray(data)) {
216
- return;
217
- }
218
- for (const item of data) {
219
- if (item.checked !== false) {
220
- return false; // Return false if any item is not checked: false
221
- }
222
-
223
- if (item.children && item.children.length > 0) {
224
- if (!areAllCheckedFalse(item.children)) {
225
- return false; // Return false if any nested item is not checked: false
226
- }
227
- }
228
- }
229
-
230
- return true; // Return true if all items are checked: false
231
- };
128
+ }
129
+ }
130
+ return data;
131
+ }
@@ -6,19 +6,15 @@ import Icon from "../pb_icon/_icon";
6
6
  import Checkbox from "../pb_checkbox/_checkbox";
7
7
  import FormPill from "../pb_form_pill/_form_pill";
8
8
  import CircleIconButton from "../pb_circle_icon_button/_circle_icon_button";
9
+ import { cloneDeep } from "lodash";
10
+
9
11
  import {
10
- unCheckIt,
11
12
  getAncestorsOfUnchecked,
12
- unCheckedRecursive,
13
- checkedRecursive,
14
13
  filterFormattedDataById,
15
14
  findByFilter,
16
15
  getCheckedItems,
17
- updateReturnItems,
18
- recursiveReturnOnlyParent,
19
- removeChildrenIfParentChecked,
20
- getChildIds,
21
- areAllCheckedFalse
16
+ getDefaultCheckedItems,
17
+ recursiveCheckParent,
22
18
  } from "./_helper_functions";
23
19
 
24
20
  type MultiLevelSelectProps = {
@@ -52,6 +48,8 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
52
48
 
53
49
  const dropdownRef = useRef(null);
54
50
 
51
+ //state for expanded property
52
+ const [expanded, setExpanded] = useState([]);
55
53
  //state for whether dropdown is open or closed
56
54
  const [isClosed, setIsClosed] = useState(true);
57
55
  //state from onchange for textinput, to use for filtering to create typeahead
@@ -59,68 +57,103 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
59
57
  //this is essentially the return that the user will get when they use the kit
60
58
  const [returnedArray, setReturnedArray] = useState([]);
61
59
  //formattedData with checked and parent_id added
62
- const [formattedData, setFormattedData] = useState(treeData);
63
- //toggle chevron in dropdown
64
- //@ts-ignore
65
- const [isToggled, setIsToggled] = useState<{ [id: number]: boolean }>({});
60
+ const [formattedData, setFormattedData] = useState([]);
66
61
  //state for return for default
67
62
  const [defaultReturn, setDefaultReturn] = useState([]);
68
63
 
69
64
  useEffect(() => {
70
- let el = document.getElementById(`pb_data_wrapper_${id}`);
71
- if (el) {
72
- el.setAttribute(
73
- "data-tree",
74
- JSON.stringify(returnAllSelected ? returnedArray : defaultReturn)
75
- );
76
- }
77
- returnAllSelected
78
- ? onSelect(returnedArray)
79
- : onSelect(
80
- defaultReturn.filter(
81
- (item, index, self) =>
82
- index === self.findIndex((obj) => obj.id === item.id)
83
- )
84
- );
85
- console.log("RETURN", returnedArray)
86
- }, [returnedArray, defaultReturn]);
87
-
88
- useEffect(() => {
89
- console.log("TREEDATA", treeData)
90
- //Create new formattedData array for use
91
65
  setFormattedData(addCheckedAndParentProperty(treeData));
92
- //if any items already checked in first render, set return accordingly
93
- const initialChecked = getCheckedItems(treeData)
94
- console.log("INITIAl CHECKED", initialChecked)
95
- const initialUnchecked = areAllCheckedFalse(treeData)
96
- console.log("INIITAL UNCHECKED", initialUnchecked)
97
- initialChecked && returnAllSelected && setReturnedArray(initialChecked)
98
- initialChecked && !returnAllSelected && setDefaultReturn(initialChecked)
99
- // initialUnchecked && returnAllSelected && setReturnedArray([])
100
- // initialUnchecked && !returnAllSelected && setDefaultReturn([])
101
-
102
66
  }, [treeData]);
103
67
 
104
- useEffect(()=> {
68
+ useEffect(() => {
69
+ if (returnAllSelected) {
70
+ setReturnedArray(getCheckedItems(formattedData));
71
+ } else {
72
+ setDefaultReturn(getDefaultCheckedItems(formattedData));
73
+ }
74
+ }, [formattedData]);
75
+
76
+ useEffect(() => {
105
77
  // Function to handle clicks outside the dropdown
106
78
  const handleClickOutside = (event: any) => {
107
79
  if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
108
80
  setIsClosed(true);
109
81
  }
110
82
  };
111
- // Attach the event listener
112
- window.addEventListener("click", handleClickOutside);
113
- // Clean up the event listener on unmount
114
- return () => {
115
- window.removeEventListener("click", handleClickOutside);
116
- };
117
- },[])
83
+ // Attach the event listener
84
+ window.addEventListener("click", handleClickOutside);
85
+ // Clean up the event listener on unmount
86
+ return () => {
87
+ window.removeEventListener("click", handleClickOutside);
88
+ };
89
+ }, []);
90
+
91
+ const modifyRecursive = (tree: { [key: string]: any }[], check: boolean) => {
92
+ if (!Array.isArray(tree)) {
93
+ return;
94
+ }
95
+ return tree.map((item: { [key: string]: any }) => {
96
+ item.checked = check;
97
+ item.children = modifyRecursive(item.children, check);
98
+ return item;
99
+ });
100
+ };
101
+
102
+ //iterate over tree, find item and set checked or unchecked
103
+ const modifyValue = (
104
+ id: string,
105
+ tree: { [key: string]: any }[],
106
+ check: boolean
107
+ ) => {
108
+ if (!Array.isArray(tree)) {
109
+ return;
110
+ }
111
+ return tree.map((item: any) => {
112
+ if (item.id != id) item.children = modifyValue(id, item.children, check);
113
+ else {
114
+ item.checked = check;
115
+ item.children = modifyRecursive(item.children, check);
116
+ }
117
+
118
+ return item;
119
+ });
120
+ };
121
+
122
+ //clone tree, check items + children
123
+ const checkItem = (item: { [key: string]: any }) => {
124
+ const tree = cloneDeep(formattedData);
125
+ if (returnAllSelected) {
126
+ return modifyValue(item.id, tree, true);
127
+ } else {
128
+ const checkedTree = modifyValue(item.id, tree, true);
129
+ return recursiveCheckParent(item, checkedTree);
130
+ }
131
+ };
132
+
133
+ //clone tree, uncheck items + children
134
+ const unCheckItem = (item: { [key: string]: any }) => {
135
+ const tree = cloneDeep(formattedData);
136
+ if (returnAllSelected) {
137
+ return modifyValue(item.id, tree, false);
138
+ } else {
139
+ const uncheckedTree = modifyValue(item.id, tree, false);
140
+ return getAncestorsOfUnchecked(uncheckedTree, item);
141
+ }
142
+ };
143
+
144
+ //setformattedData with proper properties
145
+ const changeItem = (item: { [key: string]: any }, check: boolean) => {
146
+ const tree = check ? checkItem(item) : unCheckItem(item);
147
+ setFormattedData(tree);
148
+
149
+ return tree;
150
+ };
118
151
 
119
152
  //function to map over data and add parent_id + depth property to each item
120
153
  const addCheckedAndParentProperty = (
121
154
  treeData: { [key: string]: any }[],
122
155
  parent_id: string = null,
123
- depth: number = 0,
156
+ depth: number = 0
124
157
  ) => {
125
158
  if (!Array.isArray(treeData)) {
126
159
  return;
@@ -132,10 +165,14 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
132
165
  depth,
133
166
  };
134
167
  if (newItem.children && newItem.children.length > 0) {
168
+ const children =
169
+ item.checked && !returnAllSelected
170
+ ? modifyRecursive(item.children, true)
171
+ : item.children;
135
172
  newItem.children = addCheckedAndParentProperty(
136
- newItem.children,
173
+ children,
137
174
  newItem.id,
138
- depth + 1,
175
+ depth + 1
139
176
  );
140
177
  }
141
178
  return newItem;
@@ -146,37 +183,13 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
146
183
  const handlePillClose = (event: any, clickedItem: { [key: string]: any }) => {
147
184
  // prevents the dropdown from closing when clicking on the pill
148
185
  event.stopPropagation();
186
+ const updatedTree = changeItem(clickedItem, false);
149
187
  //logic for removing items from returnArray or defaultReturn when pills clicked
150
188
  if (returnAllSelected) {
151
- if (returnedArray.includes(clickedItem)) {
152
- if (clickedItem.children && clickedItem.children.length > 0) {
153
- const childrenOfChecked = getChildIds(clickedItem, returnedArray);
154
- const updatedFiltered = returnedArray
155
- .filter((item) => item !== clickedItem)
156
- .filter((item) => !childrenOfChecked.includes(item.id));
157
- setReturnedArray(updatedFiltered);
158
- } else {
159
- const updatedFiltered = returnedArray.filter(
160
- (item) => item !== clickedItem
161
- );
162
- setReturnedArray(updatedFiltered);
163
- }
164
- }
189
+ onSelect(getCheckedItems(updatedTree));
165
190
  } else {
166
- if (defaultReturn.includes(clickedItem)) {
167
- getAncestorsOfUnchecked(formattedData, clickedItem);
168
- const newChecked = getCheckedItems(formattedData);
169
- const filteredReturn = updateReturnItems(newChecked).filter(
170
- (item) => item.id !== clickedItem.id
171
- );
172
- setDefaultReturn(filteredReturn);
173
- }
174
- }
175
- if (clickedItem.children && clickedItem.children.length > 0) {
176
- unCheckedRecursive(clickedItem);
191
+ onSelect(getDefaultCheckedItems(updatedTree));
177
192
  }
178
- //logic to uncheck clickedItem in formattedData
179
- unCheckIt(formattedData, clickedItem.id);
180
193
  };
181
194
 
182
195
  //handle click on input wrapper(entire div with pills, typeahead, etc) so it doesn't close when input or form pill is clicked
@@ -192,95 +205,36 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
192
205
  };
193
206
 
194
207
  //Main function to handle any click inside dropdown
195
- const handledropdownItemClick = (e: any) => {
208
+ const handledropdownItemClick = (e: any, check: boolean) => {
196
209
  const clickedItem = e.target.parentNode.id;
197
210
  //setting filterItem to "" will clear textinput and clear typeahead
198
211
  setFilterItem("");
199
212
 
200
213
  const filtered = filterFormattedDataById(formattedData, clickedItem);
201
- //check and uncheck all children of checked/unchecked parent item
202
- if (filtered[0].children && filtered[0].children.length > 0) {
203
- if (filtered[0].checked) {
204
- filtered[0].children.forEach((item: { [key: string]: any }) => {
205
- checkedRecursive(item);
206
- });
207
- } else if (!filtered[0].checked) {
208
- filtered[0].children.forEach((item: { [key: string]: any }) => {
209
- unCheckedRecursive(item);
210
- });
211
- }
212
- }
213
-
214
- const checkedItems = getCheckedItems(formattedData);
215
-
216
- //checking and unchecking items for returnAllSelected variant
217
- if (returnedArray.includes(filtered[0])) {
218
- if (!filtered[0].checked) {
219
- if (filtered[0].children && filtered[0].children.length > 0) {
220
- const childrenOfChecked = getChildIds(filtered[0], returnedArray);
221
- const updatedFiltered = returnedArray
222
- .filter((item) => item !== filtered[0])
223
- .filter((item) => !childrenOfChecked.includes(item.id));
224
-
225
- setReturnedArray(updatedFiltered);
226
- } else {
227
- const updatedFiltered = returnedArray.filter(
228
- (item) => item !== filtered[0]
229
- );
230
- setReturnedArray(updatedFiltered);
231
- }
232
- }
214
+ const updatedTree = changeItem(filtered[0], check);
215
+ console.log(updatedTree);
216
+ if (returnAllSelected) {
217
+ onSelect(getCheckedItems(updatedTree));
233
218
  } else {
234
- setReturnedArray(checkedItems);
235
- }
236
-
237
- //when item is unchecked for default variant
238
- if (!filtered[0].checked && !returnAllSelected) {
239
- //uncheck parent and grandparent if any child unchecked
240
- getAncestorsOfUnchecked(formattedData, filtered[0]);
241
-
242
- const newChecked = getCheckedItems(formattedData);
243
- //get all checked items, and filter to check if all children checked, if yes return only parent
244
- const filteredReturn = updateReturnItems(newChecked);
245
- setDefaultReturn(filteredReturn);
246
- }
247
-
248
- //when item is checked for default variant
249
- if (!returnAllSelected && filtered[0].checked) {
250
- //if checked item has children
251
- if (filtered[0].children && filtered[0].children.length > 0) {
252
- removeChildrenIfParentChecked(
253
- filtered[0],
254
- defaultReturn,
255
- setDefaultReturn
256
- );
257
- }
258
-
259
- //if clicked item has parent_id, find parent and check if all children checked or not
260
- if (filtered[0].parent_id !== null) {
261
- recursiveReturnOnlyParent(
262
- filtered[0],
263
- formattedData,
264
- defaultReturn,
265
- setDefaultReturn
266
- );
267
- } else {
268
- setDefaultReturn([filtered[0]]);
269
- }
219
+ onSelect(getDefaultCheckedItems(updatedTree));
270
220
  }
271
221
  };
272
222
 
223
+ const isExpanded = (item: any) => expanded.indexOf(item.id) > -1;
224
+
273
225
  //handle click on chevron toggles in dropdown
274
226
  const handleToggleClick = (id: string, event: React.MouseEvent) => {
275
227
  event.stopPropagation();
276
- setIsToggled((prevState: { [id: string]: boolean }) => ({
277
- ...prevState,
278
- [id]: !prevState[id],
279
- }));
280
228
  const clickedItem = filterFormattedDataById(formattedData, id);
281
-
282
229
  if (clickedItem) {
283
- clickedItem[0].expanded = !clickedItem[0].expanded;
230
+ let expandedArray = [...expanded];
231
+ const itemExpanded = isExpanded(clickedItem[0]);
232
+
233
+ if (itemExpanded)
234
+ expandedArray = expandedArray.filter((i) => i != clickedItem[0].id);
235
+ else expandedArray.push(clickedItem[0].id);
236
+
237
+ setExpanded(expandedArray);
284
238
  }
285
239
  };
286
240
 
@@ -292,23 +246,23 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
292
246
  items.map((item: { [key: string]: any }) => {
293
247
  return (
294
248
  <>
295
- <li
296
- key={item.id}
297
- className="dropdown_item"
298
- data-name={item.id}
299
- >
249
+ <li key={item.id} className="dropdown_item" data-name={item.id}>
300
250
  <div className="dropdown_item_checkbox_row">
301
251
  <div
302
- key={
303
- item.expanded ? "chevron-down" : "chevron-right"
304
- }
252
+ key={isExpanded(item) ? "chevron-down" : "chevron-right"}
305
253
  >
306
254
  <CircleIconButton
307
255
  icon={
308
- item.expanded ? "chevron-down" : "chevron-right"
256
+ isExpanded(item) ? "chevron-down" : "chevron-right"
257
+ }
258
+ className={
259
+ item.children && item.children.length > 0
260
+ ? ""
261
+ : "toggle_icon"
262
+ }
263
+ onClick={(event: any) =>
264
+ handleToggleClick(item.id, event)
309
265
  }
310
- className={item.children && item.children.length > 0 ? "" : "toggle_icon"}
311
- onClick={(event) => handleToggleClick(item.id, event)}
312
266
  variant="link"
313
267
  />
314
268
  </div>
@@ -319,13 +273,12 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
319
273
  name={item.label}
320
274
  value={item.label}
321
275
  onChange={(e) => {
322
- item.checked = !item.checked;
323
- handledropdownItemClick(e);
276
+ handledropdownItemClick(e, !item.checked);
324
277
  }}
325
278
  />
326
279
  </Checkbox>
327
280
  </div>
328
- {item.expanded &&
281
+ {isExpanded(item) &&
329
282
  item.children &&
330
283
  item.children.length > 0 &&
331
284
  !filterItem && ( // Show children if expanded is true
@@ -350,25 +303,20 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
350
303
  key={index}
351
304
  text={item.label}
352
305
  size="small"
353
- onClick={(event) => handlePillClose(event, item)}
306
+ onClick={(event: any) => handlePillClose(event, item)}
354
307
  />
355
308
  ))
356
309
  : null}
357
310
  {!returnAllSelected &&
358
311
  defaultReturn.length !== 0 &&
359
- defaultReturn
360
- .filter(
361
- (item, index, self) =>
362
- index === self.findIndex((obj) => obj.id === item.id)
363
- )
364
- .map((item, index) => (
365
- <FormPill
366
- key={index}
367
- text={item.label}
368
- size="small"
369
- onClick={(event) => handlePillClose(event, item)}
370
- />
371
- ))}
312
+ defaultReturn.map((item, index) => (
313
+ <FormPill
314
+ key={index}
315
+ text={item.label}
316
+ size="small"
317
+ onClick={(event: any) => handlePillClose(event, item)}
318
+ />
319
+ ))}
372
320
  {returnedArray.length !== 0 && returnAllSelected && <br />}
373
321
  {defaultReturn.length !== 0 && !returnAllSelected && <br />}
374
322
  <input