playbook_ui 12.26.0.pre.alpha.multiselectfixes825 → 12.26.0.pre.alpha.railsmultilevelimprovements805

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,31 +1,36 @@
1
- import React, { useState, useEffect, useRef } from "react";
2
- import classnames from "classnames";
3
- import { buildAriaProps, buildCss, buildDataProps } from "../utilities/props";
4
- import { globalProps, GlobalProps } from "../utilities/globalProps";
5
- import Icon from "../pb_icon/_icon";
6
- import Checkbox from "../pb_checkbox/_checkbox";
7
- import FormPill from "../pb_form_pill/_form_pill";
8
- import CircleIconButton from "../pb_circle_icon_button/_circle_icon_button";
9
- import { cloneDeep } from "lodash";
10
-
1
+ import React, { useState, useEffect, useRef } from "react"
2
+ import classnames from "classnames"
3
+ import { buildAriaProps, buildCss, buildDataProps } from "../utilities/props"
4
+ import { globalProps, GlobalProps } from "../utilities/globalProps"
5
+ import Icon from "../pb_icon/_icon"
6
+ import Checkbox from "../pb_checkbox/_checkbox"
7
+ import FormPill from "../pb_form_pill/_form_pill"
8
+ import CircleIconButton from "../pb_circle_icon_button/_circle_icon_button"
11
9
  import {
10
+ unCheckIt,
12
11
  getAncestorsOfUnchecked,
12
+ unCheckedRecursive,
13
+ checkedRecursive,
13
14
  filterFormattedDataById,
14
15
  findByFilter,
15
16
  getCheckedItems,
16
- getDefaultCheckedItems,
17
- recursiveCheckParent,
18
- } from "./_helper_functions";
17
+ updateReturnItems,
18
+ recursiveReturnOnlyParent,
19
+ removeChildrenIfParentChecked,
20
+ getChildIds,
21
+ } from "./_helper_functions"
19
22
 
20
23
  type MultiLevelSelectProps = {
21
- aria?: { [key: string]: string };
22
- className?: string;
23
- data?: { [key: string]: string };
24
- id?: string;
25
- returnAllSelected?: boolean;
26
- treeData?: { [key: string]: string }[];
27
- onSelect?: (prop: { [key: string]: any }) => void;
28
- } & GlobalProps;
24
+ aria?: { [key: string]: string }
25
+ className?: string
26
+ data?: { [key: string]: string }
27
+ id?: string
28
+ name?: string
29
+ returnCompleteData?: boolean
30
+ returnAllSelected?: boolean
31
+ treeData?: { [key: string]: string }[]
32
+ onSelect?: (prop: { [key: string]: any }) => void
33
+ } & GlobalProps
29
34
 
30
35
  const MultiLevelSelect = (props: MultiLevelSelectProps) => {
31
36
  const {
@@ -33,121 +38,100 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
33
38
  className,
34
39
  data = {},
35
40
  id,
41
+ name,
36
42
  returnAllSelected = false,
43
+ returnCompleteData = false,
37
44
  treeData,
38
45
  onSelect = () => {},
39
- } = props;
46
+ } = props
40
47
 
41
- const ariaProps = buildAriaProps(aria);
42
- const dataProps = buildDataProps(data);
48
+ const ariaProps = buildAriaProps(aria)
49
+ const dataProps = buildDataProps(data)
43
50
  const classes = classnames(
44
51
  buildCss("pb_multi_level_select"),
45
52
  globalProps(props),
46
53
  className
47
- );
54
+ )
48
55
 
49
- const dropdownRef = useRef(null);
56
+ const dropdownRef = useRef(null)
50
57
 
51
- //state for expanded property
52
- const [expanded, setExpanded] = useState([]);
53
58
  //state for whether dropdown is open or closed
54
- const [isClosed, setIsClosed] = useState(true);
59
+ const [isClosed, setIsClosed] = useState(true)
55
60
  //state from onchange for textinput, to use for filtering to create typeahead
56
- const [filterItem, setFilterItem] = useState("");
61
+ const [filterItem, setFilterItem] = useState("")
57
62
  //this is essentially the return that the user will get when they use the kit
58
- const [returnedArray, setReturnedArray] = useState([]);
63
+ const [returnedArray, setReturnedArray] = useState([])
59
64
  //formattedData with checked and parent_id added
60
- const [formattedData, setFormattedData] = useState([]);
65
+ const [formattedData, setFormattedData] = useState(treeData)
66
+ //toggle chevron in dropdown
67
+ //@ts-ignore
68
+ const [isToggled, setIsToggled] = useState<{ [id: number]: boolean }>({})
61
69
  //state for return for default
62
- const [defaultReturn, setDefaultReturn] = useState([]);
70
+ const [defaultReturn, setDefaultReturn] = useState([])
63
71
 
64
- useEffect(() => {
65
- setFormattedData(addCheckedAndParentProperty(treeData));
66
- }, [treeData]);
72
+ const [formattedReturn, setFormattedReturn] = useState([])
67
73
 
68
- useEffect(() => {
69
- if (returnAllSelected) {
70
- setReturnedArray(getCheckedItems(formattedData));
74
+ const getSelectedIds = (selectedData: { [key: string]: any }[]) => {
75
+ return selectedData
76
+ .map((item) => item.id)
77
+ .filter((value, index, self) => self.indexOf(value) === index)
78
+ }
79
+
80
+ const getValues = () => {
81
+ if(returnCompleteData){
82
+ if(returnAllSelected){
83
+ return setFormattedReturn(returnedArray)
71
84
  } else {
72
- setDefaultReturn(getDefaultCheckedItems(formattedData));
85
+ return setFormattedReturn(defaultReturn)
86
+ }
87
+ } else {
88
+ if(returnAllSelected){
89
+ setFormattedReturn(getSelectedIds(returnedArray))
90
+ } else {
91
+ setFormattedReturn(getSelectedIds(defaultReturn))
92
+ }
73
93
  }
74
- }, [formattedData]);
94
+ }
95
+
96
+ const updateHiddenInputValue = (value: any) => {
97
+ const hiddenInput = document.querySelector(
98
+ "input#" + id
99
+ ) as HTMLInputElement
100
+ if (hiddenInput) {
101
+ hiddenInput.value = JSON.stringify(value)
102
+ }
103
+ }
104
+
105
+ useEffect(() => {
106
+ getValues()
107
+ }, [returnedArray, defaultReturn])
75
108
 
76
109
  useEffect(() => {
110
+ onSelect(formattedReturn)
111
+ updateHiddenInputValue(formattedReturn)
112
+ }, [formattedReturn])
113
+
114
+ useEffect(() => {
115
+ //Create new formattedData array for use
116
+ setFormattedData(addCheckedAndParentProperty(treeData))
77
117
  // Function to handle clicks outside the dropdown
78
118
  const handleClickOutside = (event: any) => {
79
119
  if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
80
- setIsClosed(true);
120
+ setIsClosed(true)
81
121
  }
82
- };
122
+ }
123
+ //if any items already checked in first render, set return accordingly
124
+ const initialChecked = getCheckedItems(treeData)
125
+ initialChecked && returnAllSelected && setReturnedArray(initialChecked)
126
+ initialChecked && !returnAllSelected && setDefaultReturn(initialChecked)
127
+
83
128
  // Attach the event listener
84
- window.addEventListener("click", handleClickOutside);
129
+ window.addEventListener("click", handleClickOutside)
85
130
  // Clean up the event listener on unmount
86
131
  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;
132
+ window.removeEventListener("click", handleClickOutside)
110
133
  }
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
- };
134
+ }, [])
151
135
 
152
136
  //function to map over data and add parent_id + depth property to each item
153
137
  const addCheckedAndParentProperty = (
@@ -156,87 +140,166 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
156
140
  depth: number = 0
157
141
  ) => {
158
142
  if (!Array.isArray(treeData)) {
159
- return;
143
+ return
160
144
  }
161
145
  return treeData.map((item: { [key: string]: any } | any) => {
162
146
  const newItem = {
163
147
  ...item,
164
148
  parent_id,
165
149
  depth,
166
- };
150
+ }
167
151
  if (newItem.children && newItem.children.length > 0) {
168
- const children =
169
- item.checked && !returnAllSelected
170
- ? modifyRecursive(item.children, true)
171
- : item.children;
172
152
  newItem.children = addCheckedAndParentProperty(
173
- children,
153
+ newItem.children,
174
154
  newItem.id,
175
155
  depth + 1
176
- );
156
+ )
177
157
  }
178
- return newItem;
179
- });
180
- };
158
+ return newItem
159
+ })
160
+ }
181
161
 
182
162
  //click event for x on form pill
183
163
  const handlePillClose = (event: any, clickedItem: { [key: string]: any }) => {
184
164
  // prevents the dropdown from closing when clicking on the pill
185
- event.stopPropagation();
186
- const updatedTree = changeItem(clickedItem, false);
165
+ event.stopPropagation()
187
166
  //logic for removing items from returnArray or defaultReturn when pills clicked
188
167
  if (returnAllSelected) {
189
- onSelect(getCheckedItems(updatedTree));
168
+ if (returnedArray.includes(clickedItem)) {
169
+ if (clickedItem.children && clickedItem.children.length > 0) {
170
+ const childrenOfChecked = getChildIds(clickedItem, returnedArray)
171
+ const updatedFiltered = returnedArray
172
+ .filter((item) => item !== clickedItem)
173
+ .filter((item) => !childrenOfChecked.includes(item.id))
174
+ setReturnedArray(updatedFiltered)
175
+ } else {
176
+ const updatedFiltered = returnedArray.filter(
177
+ (item) => item !== clickedItem
178
+ )
179
+ setReturnedArray(updatedFiltered)
180
+ }
181
+ }
190
182
  } else {
191
- onSelect(getDefaultCheckedItems(updatedTree));
183
+ if (defaultReturn.includes(clickedItem)) {
184
+ getAncestorsOfUnchecked(formattedData, clickedItem)
185
+ const newChecked = getCheckedItems(formattedData)
186
+ const filteredReturn = updateReturnItems(newChecked).filter(
187
+ (item) => item.id !== clickedItem.id
188
+ )
189
+ setDefaultReturn(filteredReturn)
190
+ }
192
191
  }
193
- };
192
+ if (clickedItem.children && clickedItem.children.length > 0) {
193
+ unCheckedRecursive(clickedItem)
194
+ }
195
+ //logic to uncheck clickedItem in formattedData
196
+ unCheckIt(formattedData, clickedItem.id)
197
+ }
194
198
 
195
199
  //handle click on input wrapper(entire div with pills, typeahead, etc) so it doesn't close when input or form pill is clicked
196
200
  const handleInputWrapperClick = (e: any) => {
197
- e.stopPropagation();
201
+ e.stopPropagation()
198
202
  if (
199
203
  e.target.id === "multiselect_input" ||
200
204
  e.target.classList.contains("pb_form_pill_tag")
201
205
  ) {
202
- return;
206
+ return
203
207
  }
204
- setIsClosed(!isClosed);
205
- };
208
+ setIsClosed(!isClosed)
209
+ }
206
210
 
207
211
  //Main function to handle any click inside dropdown
208
- const handledropdownItemClick = (e: any, check: boolean) => {
209
- const clickedItem = e.target.parentNode.id;
212
+ const handledropdownItemClick = (e: any) => {
213
+ const clickedItem = e.target.parentNode.id
210
214
  //setting filterItem to "" will clear textinput and clear typeahead
211
- setFilterItem("");
215
+ setFilterItem("")
212
216
 
213
- const filtered = filterFormattedDataById(formattedData, clickedItem);
214
- const updatedTree = changeItem(filtered[0], check);
215
- console.log(updatedTree);
216
- if (returnAllSelected) {
217
- onSelect(getCheckedItems(updatedTree));
217
+ const filtered = filterFormattedDataById(formattedData, clickedItem)
218
+ //check and uncheck all children of checked/unchecked parent item
219
+ if (filtered[0].children && filtered[0].children.length > 0) {
220
+ if (filtered[0].checked) {
221
+ filtered[0].children.forEach((item: { [key: string]: any }) => {
222
+ checkedRecursive(item)
223
+ })
224
+ } else if (!filtered[0].checked) {
225
+ filtered[0].children.forEach((item: { [key: string]: any }) => {
226
+ unCheckedRecursive(item)
227
+ })
228
+ }
229
+ }
230
+
231
+ const checkedItems = getCheckedItems(formattedData)
232
+
233
+ //checking and unchecking items for returnAllSelected variant
234
+ if (returnedArray.includes(filtered[0])) {
235
+ if (!filtered[0].checked) {
236
+ if (filtered[0].children && filtered[0].children.length > 0) {
237
+ const childrenOfChecked = getChildIds(filtered[0], returnedArray)
238
+ const updatedFiltered = returnedArray
239
+ .filter((item) => item !== filtered[0])
240
+ .filter((item) => !childrenOfChecked.includes(item.id))
241
+
242
+ setReturnedArray(updatedFiltered)
243
+ } else {
244
+ const updatedFiltered = returnedArray.filter(
245
+ (item) => item !== filtered[0]
246
+ )
247
+ setReturnedArray(updatedFiltered)
248
+ }
249
+ }
218
250
  } else {
219
- onSelect(getDefaultCheckedItems(updatedTree));
251
+ setReturnedArray(checkedItems)
252
+ }
253
+
254
+ //when item is unchecked for default variant
255
+ if (!filtered[0].checked && !returnAllSelected) {
256
+ //uncheck parent and grandparent if any child unchecked
257
+ getAncestorsOfUnchecked(formattedData, filtered[0])
258
+
259
+ const newChecked = getCheckedItems(formattedData)
260
+ //get all checked items, and filter to check if all children checked, if yes return only parent
261
+ const filteredReturn = updateReturnItems(newChecked)
262
+ setDefaultReturn(filteredReturn)
220
263
  }
221
- };
222
264
 
223
- const isExpanded = (item: any) => expanded.indexOf(item.id) > -1;
265
+ //when item is checked for default variant
266
+ if (!returnAllSelected && filtered[0].checked) {
267
+ //if checked item has children
268
+ if (filtered[0].children && filtered[0].children.length > 0) {
269
+ removeChildrenIfParentChecked(
270
+ filtered[0],
271
+ defaultReturn,
272
+ setDefaultReturn
273
+ )
274
+ }
275
+
276
+ //if clicked item has parent_id, find parent and check if all children checked or not
277
+ if (filtered[0].parent_id !== null) {
278
+ recursiveReturnOnlyParent(
279
+ filtered[0],
280
+ formattedData,
281
+ defaultReturn,
282
+ setDefaultReturn
283
+ )
284
+ } else {
285
+ setDefaultReturn([filtered[0]])
286
+ }
287
+ }
288
+ }
224
289
 
225
290
  //handle click on chevron toggles in dropdown
226
291
  const handleToggleClick = (id: string, event: React.MouseEvent) => {
227
- event.stopPropagation();
228
- const clickedItem = filterFormattedDataById(formattedData, id);
229
- if (clickedItem) {
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);
292
+ event.stopPropagation()
293
+ setIsToggled((prevState: { [id: string]: boolean }) => ({
294
+ ...prevState,
295
+ [id]: !prevState[id],
296
+ }))
297
+ const clickedItem = filterFormattedDataById(formattedData, id)
236
298
 
237
- setExpanded(expandedArray);
299
+ if (clickedItem) {
300
+ clickedItem[0].expanded = !clickedItem[0].expanded
238
301
  }
239
- };
302
+ }
240
303
 
241
304
  //rendering formattedData to UI based on typeahead
242
305
  const renderNestedOptions = (items: { [key: string]: any }[]) => {
@@ -246,39 +309,34 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
246
309
  items.map((item: { [key: string]: any }) => {
247
310
  return (
248
311
  <>
249
- <li key={item.id} className="dropdown_item" data-name={item.id}>
250
- <div className="dropdown_item_checkbox_row">
251
- <div
252
- key={isExpanded(item) ? "chevron-down" : "chevron-right"}
253
- >
312
+ <li key={item.id} className='dropdown_item' data-name={item.id}>
313
+ <div className='dropdown_item_checkbox_row'>
314
+ <div key={item.expanded ? "chevron-down" : "chevron-right"}>
254
315
  <CircleIconButton
255
- icon={
256
- isExpanded(item) ? "chevron-down" : "chevron-right"
257
- }
316
+ icon={item.expanded ? "chevron-down" : "chevron-right"}
258
317
  className={
259
318
  item.children && item.children.length > 0
260
319
  ? ""
261
320
  : "toggle_icon"
262
321
  }
263
- onClick={(event: any) =>
264
- handleToggleClick(item.id, event)
265
- }
266
- variant="link"
322
+ onClick={(event) => handleToggleClick(item.id, event)}
323
+ variant='link'
267
324
  />
268
325
  </div>
269
326
  <Checkbox text={item.label} id={item.id}>
270
327
  <input
271
328
  checked={item.checked}
272
- type="checkbox"
329
+ type='checkbox'
273
330
  name={item.label}
274
331
  value={item.label}
275
332
  onChange={(e) => {
276
- handledropdownItemClick(e, !item.checked);
333
+ item.checked = !item.checked
334
+ handledropdownItemClick(e)
277
335
  }}
278
336
  />
279
337
  </Checkbox>
280
338
  </div>
281
- {isExpanded(item) &&
339
+ {item.expanded &&
282
340
  item.children &&
283
341
  item.children.length > 0 &&
284
342
  !filterItem && ( // Show children if expanded is true
@@ -286,56 +344,67 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
286
344
  )}
287
345
  </li>
288
346
  </>
289
- );
347
+ )
290
348
  })}
291
349
  </ul>
292
- );
293
- };
350
+ )
351
+ }
294
352
 
295
353
  return (
296
354
  <div {...ariaProps} {...dataProps} className={classes} id={id}>
297
- <div ref={dropdownRef} className="wrapper">
298
- <div className="input_wrapper" onClick={handleInputWrapperClick}>
299
- <div className="input_inner_container">
355
+ <div ref={dropdownRef} className='wrapper'>
356
+ <div className='input_wrapper' onClick={handleInputWrapperClick}>
357
+ <div className='input_inner_container'>
358
+ <input
359
+ type='hidden'
360
+ id={id}
361
+ name={name}
362
+ value={JSON.stringify(formattedReturn)}
363
+ />
300
364
  {returnedArray.length !== 0 && returnAllSelected
301
365
  ? returnedArray.map((item, index) => (
302
366
  <FormPill
303
367
  key={index}
304
368
  text={item.label}
305
- size="small"
306
- onClick={(event: any) => handlePillClose(event, item)}
369
+ size='small'
370
+ onClick={(event) => handlePillClose(event, item)}
307
371
  />
308
372
  ))
309
373
  : null}
310
374
  {!returnAllSelected &&
311
375
  defaultReturn.length !== 0 &&
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
- ))}
376
+ defaultReturn
377
+ .filter(
378
+ (item, index, self) =>
379
+ index === self.findIndex((obj) => obj.id === item.id)
380
+ )
381
+ .map((item, index) => (
382
+ <FormPill
383
+ key={index}
384
+ text={item.label}
385
+ size='small'
386
+ onClick={(event) => handlePillClose(event, item)}
387
+ />
388
+ ))}
320
389
  {returnedArray.length !== 0 && returnAllSelected && <br />}
321
390
  {defaultReturn.length !== 0 && !returnAllSelected && <br />}
322
391
  <input
323
- id="multiselect_input"
392
+ id='multiselect_input'
324
393
  onChange={(e) => {
325
- setFilterItem(e.target.value);
394
+ setFilterItem(e.target.value)
326
395
  }}
327
- placeholder="Start typing..."
396
+ placeholder='Start typing...'
328
397
  value={filterItem}
329
398
  onClick={() => setIsClosed(false)}
330
399
  />
331
400
  </div>
332
401
  {isClosed ? (
333
- <div key="chevron-down">
334
- <Icon icon="chevron-down" />
402
+ <div key='chevron-down'>
403
+ <Icon icon='chevron-down' />
335
404
  </div>
336
405
  ) : (
337
- <div key="chevron-up">
338
- <Icon icon="chevron-up" />
406
+ <div key='chevron-up'>
407
+ <Icon icon='chevron-up' />
339
408
  </div>
340
409
  )}
341
410
  </div>
@@ -346,7 +415,7 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
346
415
  </div>
347
416
  </div>
348
417
  </div>
349
- );
350
- };
418
+ )
419
+ }
351
420
 
352
- export default MultiLevelSelect;
421
+ export default MultiLevelSelect
@@ -61,12 +61,12 @@
61
61
  ],
62
62
  },
63
63
  ],
64
- }] %>
64
+ }] %>
65
65
 
66
66
 
67
67
  <%= pb_rails("multi_level_select", props: {
68
68
  id: "default-multi-level-select",
69
69
  tree_data:treeData
70
- }) %>
70
+ }) %>
71
71
 
72
72
 
@@ -74,7 +74,7 @@ const MultiLevelSelectDefault = (props) => {
74
74
  <MultiLevelSelect
75
75
  id="multiselect-default"
76
76
  onSelect={(selectedNodes) =>
77
- console.log("Selected Items", selectedNodes)
77
+ console.log("Selected Items (default... with ids only)", selectedNodes)
78
78
  }
79
79
  treeData={treeData}
80
80
  {...props}
@@ -2,4 +2,4 @@ The MultiLevelSelect kit renders a multi leveled select dropdown based on data f
2
2
 
3
3
  For the React version of the kit, the `onSelect` prop returns an array of all checked items, irrespective of whether it is a parent, child or grandchild. Open the console on this example and check and uncheck checkboxes to see this is action!
4
4
 
5
- For the Rails version, the array of checked items is attached to the DOM in a data attribute titled `data-tree` on the wrapping div around the MultiLevelSelect.
5
+ By default, the return will be an array of Id's. If you want to return the entire object, you can pass `returnCompleteData` as true. This will return an array of objects.
@@ -64,9 +64,8 @@
64
64
  ],
65
65
  }] %>
66
66
 
67
-
68
67
  <%= pb_rails("multi_level_select", props: {
69
68
  id: "parent-persistence-multi-level-select",
70
69
  tree_data:treeData,
71
70
  return_all_selected: true
72
- }) %>
71
+ }) %>
@@ -74,7 +74,7 @@ const MultiLevelSelectReturnAllSelected = (props) => {
74
74
  <MultiLevelSelect
75
75
  id="multiselect-parent-persistence"
76
76
  onSelect={(selectedNodes) =>
77
- console.log("Selected Items", selectedNodes)
77
+ console.log("Selected Items with Return All Selected Data", selectedNodes)
78
78
  }
79
79
  returnAllSelected
80
80
  treeData={treeData}