playbook_ui 12.26.1 → 12.27.0
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.
- checksums.yaml +4 -4
- data/app/pb_kits/playbook/pb_date_picker/sass_partials/_flatpickr_styles.scss +11 -9
- data/app/pb_kits/playbook/pb_date_picker/sass_partials/_month_and_year_styles.scss +1 -1
- data/app/pb_kits/playbook/pb_date_picker/sass_partials/_week_styles.scss +1 -1
- data/app/pb_kits/playbook/pb_form_pill/_form_pill.scss +1 -1
- data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +134 -125
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_default.html.erb +17 -17
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_default.jsx +7 -4
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_default.md +2 -2
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_return_all_selected.html.erb +19 -16
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_return_all_selected.jsx +2 -2
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_with_form.html.erb +72 -0
- data/app/pb_kits/playbook/pb_multi_level_select/docs/example.yml +1 -0
- data/app/pb_kits/playbook/pb_multi_level_select/multi_level_select.html.erb +7 -3
- data/app/pb_kits/playbook/pb_multi_level_select/multi_level_select.rb +3 -0
- data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.tsx +109 -44
- data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_validation.html.erb +14 -0
- data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_validation.jsx +60 -0
- data/app/pb_kits/playbook/pb_phone_number_input/docs/example.yml +3 -1
- data/app/pb_kits/playbook/pb_phone_number_input/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.rb +6 -0
- data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.test.js +110 -62
- data/app/pb_kits/playbook/pb_rich_text_editor/_trix_styles.scss +2 -2
- data/app/pb_kits/playbook/pb_title/_title.scss +1 -1
- data/app/pb_kits/playbook/pb_title/_title.tsx +2 -3
- data/app/pb_kits/playbook/pb_title/docs/_title_light_weight.html.erb +1 -0
- data/app/pb_kits/playbook/pb_title/docs/_title_light_weight.jsx +6 -0
- data/app/pb_kits/playbook/pb_title/docs/_title_light_weight.md +1 -2
- data/app/pb_kits/playbook/pb_title/title.rb +3 -10
- data/app/pb_kits/playbook/pb_title/title.test.js +3 -3
- data/app/pb_kits/playbook/utilities/object.ts +3 -0
- data/dist/playbook-rails.js +4 -4
- data/lib/playbook/forms/builder/intl_telephone_field.rb +12 -0
- data/lib/playbook/forms/builder/multi_level_select_field.rb +12 -0
- data/lib/playbook/forms/builder.rb +2 -0
- data/lib/playbook/version.rb +2 -2
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c8a90666ee111265053efa8a6306dcf5312bd5db5b1f9ed04f9f308efc4b800c
|
4
|
+
data.tar.gz: 5ff43b2f9c0b59121483cb30cfd1fcd24ba8fa02c65381000fb86b8ef5097fa9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 23a90f57292ebf633ef4d2305b4ca7c038abd1bfa8a0a2e8729c5c279522c265b76ca3e8f616076d5483990467baeaec22999d70dec6cb015f9064a64cba7e6a
|
7
|
+
data.tar.gz: ca7a82f0e5d3c9de8df3cef5c4913f1dbbd8890b0b29ebfd563f6cb02d5125c664a0a221cb676eb56a68e1f4be7ce26bd1507c0bf7893530a916ccf8e720891d
|
@@ -1,4 +1,6 @@
|
|
1
1
|
// Manual Import -- Flatpickr Styles
|
2
|
+
@import "./tokens/typography";
|
3
|
+
|
2
4
|
.flatpickr-calendar {
|
3
5
|
background: transparent;
|
4
6
|
opacity: 0;
|
@@ -295,7 +297,7 @@
|
|
295
297
|
.flatpickr-current-month {
|
296
298
|
font-size: 135%;
|
297
299
|
line-height: inherit;
|
298
|
-
font-weight:
|
300
|
+
font-weight: $light;
|
299
301
|
color: inherit;
|
300
302
|
position: absolute;
|
301
303
|
width: 75%;
|
@@ -310,7 +312,7 @@
|
|
310
312
|
}
|
311
313
|
.flatpickr-current-month span.cur-month {
|
312
314
|
font-family: inherit;
|
313
|
-
font-weight:
|
315
|
+
font-weight: $bolder;
|
314
316
|
color: inherit;
|
315
317
|
display: inline-block;
|
316
318
|
margin-left: 0.5ch;
|
@@ -341,7 +343,7 @@
|
|
341
343
|
display: inline-block;
|
342
344
|
font-size: inherit;
|
343
345
|
font-family: inherit;
|
344
|
-
font-weight:
|
346
|
+
font-weight: $light;
|
345
347
|
line-height: inherit;
|
346
348
|
height: auto;
|
347
349
|
border: 0;
|
@@ -371,7 +373,7 @@
|
|
371
373
|
cursor: pointer;
|
372
374
|
font-size: inherit;
|
373
375
|
font-family: inherit;
|
374
|
-
font-weight:
|
376
|
+
font-weight: $light;
|
375
377
|
height: auto;
|
376
378
|
line-height: inherit;
|
377
379
|
margin: -1px 0 0 0;
|
@@ -492,7 +494,7 @@ span.flatpickr-weekday {
|
|
492
494
|
box-sizing: border-box;
|
493
495
|
color: #393939;
|
494
496
|
cursor: pointer;
|
495
|
-
font-weight:
|
497
|
+
font-weight: $regular;
|
496
498
|
width: 14.2857143%;
|
497
499
|
-webkit-flex-basis: 14.2857143%;
|
498
500
|
-ms-flex-preferred-size: 14.2857143%;
|
@@ -707,11 +709,11 @@ span.flatpickr-weekday {
|
|
707
709
|
appearance: textfield;
|
708
710
|
}
|
709
711
|
.flatpickr-time input.flatpickr-hour {
|
710
|
-
font-weight:
|
712
|
+
font-weight: $bolder;
|
711
713
|
}
|
712
714
|
.flatpickr-time input.flatpickr-minute,
|
713
715
|
.flatpickr-time input.flatpickr-second {
|
714
|
-
font-weight:
|
716
|
+
font-weight: $regular;
|
715
717
|
}
|
716
718
|
.flatpickr-time input:focus {
|
717
719
|
outline: 0;
|
@@ -723,7 +725,7 @@ span.flatpickr-weekday {
|
|
723
725
|
float: left;
|
724
726
|
line-height: inherit;
|
725
727
|
color: #393939;
|
726
|
-
font-weight:
|
728
|
+
font-weight: $bolder;
|
727
729
|
width: 2%;
|
728
730
|
-webkit-user-select: none;
|
729
731
|
-moz-user-select: none;
|
@@ -738,7 +740,7 @@ span.flatpickr-weekday {
|
|
738
740
|
width: 18%;
|
739
741
|
cursor: pointer;
|
740
742
|
text-align: center;
|
741
|
-
font-weight:
|
743
|
+
font-weight: $regular;
|
742
744
|
}
|
743
745
|
.flatpickr-time input:hover,
|
744
746
|
.flatpickr-time .flatpickr-am-pm:hover,
|
@@ -1,12 +1,12 @@
|
|
1
|
-
import React, { useState, useEffect, useRef } from "react"
|
2
|
-
import classnames from "classnames"
|
3
|
-
import {
|
4
|
-
import {
|
5
|
-
import
|
6
|
-
import
|
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"
|
1
|
+
import React, { useState, useEffect, useRef } from "react"
|
2
|
+
import classnames from "classnames"
|
3
|
+
import { globalProps, GlobalProps } from "../utilities/globalProps"
|
4
|
+
import { buildAriaProps, buildCss, buildDataProps } from "../utilities/props"
|
5
|
+
import Checkbox from "../pb_checkbox/_checkbox"
|
6
|
+
import Icon from "../pb_icon/_icon"
|
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
10
|
|
11
11
|
import {
|
12
12
|
getAncestorsOfUnchecked,
|
@@ -15,17 +15,18 @@ import {
|
|
15
15
|
getCheckedItems,
|
16
16
|
getDefaultCheckedItems,
|
17
17
|
recursiveCheckParent,
|
18
|
-
} from "./_helper_functions"
|
18
|
+
} from "./_helper_functions"
|
19
19
|
|
20
20
|
type MultiLevelSelectProps = {
|
21
|
-
aria?: { [key: string]: string }
|
22
|
-
className?: string
|
23
|
-
data?: { [key: string]: string }
|
24
|
-
id?: string
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
}
|
21
|
+
aria?: { [key: string]: string }
|
22
|
+
className?: string
|
23
|
+
data?: { [key: string]: string }
|
24
|
+
id?: string
|
25
|
+
name?: string
|
26
|
+
returnAllSelected?: boolean
|
27
|
+
treeData?: { [key: string]: string }[]
|
28
|
+
onSelect?: (prop: { [key: string]: any }) => void
|
29
|
+
} & GlobalProps
|
29
30
|
|
30
31
|
const MultiLevelSelect = (props: MultiLevelSelectProps) => {
|
31
32
|
const {
|
@@ -33,71 +34,74 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
|
|
33
34
|
className,
|
34
35
|
data = {},
|
35
36
|
id,
|
37
|
+
name,
|
36
38
|
returnAllSelected = false,
|
37
39
|
treeData,
|
38
40
|
onSelect = () => {},
|
39
|
-
} = props
|
41
|
+
} = props
|
40
42
|
|
41
|
-
const ariaProps = buildAriaProps(aria)
|
42
|
-
const dataProps = buildDataProps(data)
|
43
|
+
const ariaProps = buildAriaProps(aria)
|
44
|
+
const dataProps = buildDataProps(data)
|
43
45
|
const classes = classnames(
|
44
46
|
buildCss("pb_multi_level_select"),
|
45
47
|
globalProps(props),
|
46
48
|
className
|
47
|
-
)
|
49
|
+
)
|
50
|
+
|
51
|
+
const dropdownRef = useRef(null)
|
48
52
|
|
49
|
-
const dropdownRef = useRef(null);
|
50
53
|
|
51
54
|
//state for expanded property
|
52
|
-
const [expanded, setExpanded] = useState([])
|
55
|
+
const [expanded, setExpanded] = useState([])
|
53
56
|
//state for whether dropdown is open or closed
|
54
|
-
const [isClosed, setIsClosed] = useState(true)
|
57
|
+
const [isClosed, setIsClosed] = useState(true)
|
55
58
|
//state from onchange for textinput, to use for filtering to create typeahead
|
56
|
-
const [filterItem, setFilterItem] = useState("")
|
59
|
+
const [filterItem, setFilterItem] = useState("")
|
57
60
|
//this is essentially the return that the user will get when they use the kit
|
58
|
-
const [returnedArray, setReturnedArray] = useState([])
|
61
|
+
const [returnedArray, setReturnedArray] = useState([])
|
59
62
|
//formattedData with checked and parent_id added
|
60
|
-
const [formattedData, setFormattedData] = useState([])
|
63
|
+
const [formattedData, setFormattedData] = useState([])
|
61
64
|
//state for return for default
|
62
|
-
const [defaultReturn, setDefaultReturn] = useState([])
|
65
|
+
const [defaultReturn, setDefaultReturn] = useState([])
|
66
|
+
|
63
67
|
|
64
68
|
useEffect(() => {
|
65
|
-
setFormattedData(addCheckedAndParentProperty(treeData))
|
66
|
-
}, [treeData])
|
69
|
+
setFormattedData(addCheckedAndParentProperty(treeData))
|
70
|
+
}, [treeData])
|
67
71
|
|
68
72
|
useEffect(() => {
|
69
73
|
if (returnAllSelected) {
|
70
|
-
setReturnedArray(getCheckedItems(formattedData))
|
74
|
+
setReturnedArray(getCheckedItems(formattedData))
|
71
75
|
} else {
|
72
|
-
setDefaultReturn(getDefaultCheckedItems(formattedData))
|
76
|
+
setDefaultReturn(getDefaultCheckedItems(formattedData))
|
73
77
|
}
|
74
|
-
}, [formattedData])
|
78
|
+
}, [formattedData])
|
75
79
|
|
76
80
|
useEffect(() => {
|
77
81
|
// Function to handle clicks outside the dropdown
|
78
82
|
const handleClickOutside = (event: any) => {
|
79
83
|
if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
|
80
|
-
setIsClosed(true)
|
84
|
+
setIsClosed(true)
|
81
85
|
}
|
82
|
-
}
|
86
|
+
}
|
83
87
|
// Attach the event listener
|
84
|
-
window.addEventListener("click", handleClickOutside)
|
88
|
+
window.addEventListener("click", handleClickOutside)
|
85
89
|
// Clean up the event listener on unmount
|
86
90
|
return () => {
|
87
|
-
window.removeEventListener("click", handleClickOutside)
|
88
|
-
}
|
89
|
-
}, [])
|
91
|
+
window.removeEventListener("click", handleClickOutside)
|
92
|
+
}
|
93
|
+
}, [])
|
90
94
|
|
91
95
|
const modifyRecursive = (tree: { [key: string]: any }[], check: boolean) => {
|
92
96
|
if (!Array.isArray(tree)) {
|
93
|
-
return
|
97
|
+
return
|
94
98
|
}
|
95
99
|
return tree.map((item: { [key: string]: any }) => {
|
96
|
-
item.checked = check
|
97
|
-
item.children = modifyRecursive(item.children, check)
|
98
|
-
return item
|
99
|
-
})
|
100
|
-
}
|
100
|
+
item.checked = check
|
101
|
+
item.children = modifyRecursive(item.children, check)
|
102
|
+
return item
|
103
|
+
})
|
104
|
+
}
|
101
105
|
|
102
106
|
//iterate over tree, find item and set checked or unchecked
|
103
107
|
const modifyValue = (
|
@@ -106,48 +110,48 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
|
|
106
110
|
check: boolean
|
107
111
|
) => {
|
108
112
|
if (!Array.isArray(tree)) {
|
109
|
-
return
|
113
|
+
return
|
110
114
|
}
|
111
115
|
return tree.map((item: any) => {
|
112
|
-
if (item.id != id) item.children = modifyValue(id, item.children, check)
|
116
|
+
if (item.id != id) item.children = modifyValue(id, item.children, check)
|
113
117
|
else {
|
114
|
-
item.checked = check
|
115
|
-
item.children = modifyRecursive(item.children, check)
|
118
|
+
item.checked = check
|
119
|
+
item.children = modifyRecursive(item.children, check)
|
116
120
|
}
|
117
121
|
|
118
|
-
return item
|
119
|
-
})
|
120
|
-
}
|
122
|
+
return item
|
123
|
+
})
|
124
|
+
}
|
121
125
|
|
122
126
|
//clone tree, check items + children
|
123
127
|
const checkItem = (item: { [key: string]: any }) => {
|
124
|
-
const tree = cloneDeep(formattedData)
|
128
|
+
const tree = cloneDeep(formattedData)
|
125
129
|
if (returnAllSelected) {
|
126
|
-
return modifyValue(item.id, tree, true)
|
130
|
+
return modifyValue(item.id, tree, true)
|
127
131
|
} else {
|
128
|
-
const checkedTree = modifyValue(item.id, tree, true)
|
129
|
-
return recursiveCheckParent(item, checkedTree)
|
132
|
+
const checkedTree = modifyValue(item.id, tree, true)
|
133
|
+
return recursiveCheckParent(item, checkedTree)
|
130
134
|
}
|
131
|
-
}
|
135
|
+
}
|
132
136
|
|
133
137
|
//clone tree, uncheck items + children
|
134
138
|
const unCheckItem = (item: { [key: string]: any }) => {
|
135
|
-
const tree = cloneDeep(formattedData)
|
139
|
+
const tree = cloneDeep(formattedData)
|
136
140
|
if (returnAllSelected) {
|
137
|
-
return modifyValue(item.id, tree, false)
|
141
|
+
return modifyValue(item.id, tree, false)
|
138
142
|
} else {
|
139
|
-
const uncheckedTree = modifyValue(item.id, tree, false)
|
140
|
-
return getAncestorsOfUnchecked(uncheckedTree, item)
|
143
|
+
const uncheckedTree = modifyValue(item.id, tree, false)
|
144
|
+
return getAncestorsOfUnchecked(uncheckedTree, item)
|
141
145
|
}
|
142
|
-
}
|
146
|
+
}
|
143
147
|
|
144
148
|
//setformattedData with proper properties
|
145
149
|
const changeItem = (item: { [key: string]: any }, check: boolean) => {
|
146
|
-
const tree = check ? checkItem(item) : unCheckItem(item)
|
147
|
-
setFormattedData(tree)
|
150
|
+
const tree = check ? checkItem(item) : unCheckItem(item)
|
151
|
+
setFormattedData(tree)
|
148
152
|
|
149
|
-
return tree
|
150
|
-
}
|
153
|
+
return tree
|
154
|
+
}
|
151
155
|
|
152
156
|
//function to map over data and add parent_id + depth property to each item
|
153
157
|
const addCheckedAndParentProperty = (
|
@@ -156,87 +160,86 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
|
|
156
160
|
depth: number = 0
|
157
161
|
) => {
|
158
162
|
if (!Array.isArray(treeData)) {
|
159
|
-
return
|
163
|
+
return
|
160
164
|
}
|
161
165
|
return treeData.map((item: { [key: string]: any } | any) => {
|
162
166
|
const newItem = {
|
163
167
|
...item,
|
164
168
|
parent_id,
|
165
169
|
depth,
|
166
|
-
}
|
170
|
+
}
|
167
171
|
if (newItem.children && newItem.children.length > 0) {
|
168
172
|
const children =
|
169
173
|
item.checked && !returnAllSelected
|
170
174
|
? modifyRecursive(item.children, true)
|
171
|
-
: item.children
|
175
|
+
: item.children
|
172
176
|
newItem.children = addCheckedAndParentProperty(
|
173
177
|
children,
|
174
178
|
newItem.id,
|
175
179
|
depth + 1
|
176
|
-
)
|
180
|
+
)
|
177
181
|
}
|
178
|
-
return newItem
|
179
|
-
})
|
180
|
-
}
|
182
|
+
return newItem
|
183
|
+
})
|
184
|
+
}
|
181
185
|
|
182
186
|
//click event for x on form pill
|
183
187
|
const handlePillClose = (event: any, clickedItem: { [key: string]: any }) => {
|
184
188
|
// prevents the dropdown from closing when clicking on the pill
|
185
|
-
event.stopPropagation()
|
186
|
-
const updatedTree = changeItem(clickedItem, false)
|
189
|
+
event.stopPropagation()
|
190
|
+
const updatedTree = changeItem(clickedItem, false)
|
187
191
|
//logic for removing items from returnArray or defaultReturn when pills clicked
|
188
192
|
if (returnAllSelected) {
|
189
|
-
onSelect(getCheckedItems(updatedTree))
|
193
|
+
onSelect(getCheckedItems(updatedTree))
|
190
194
|
} else {
|
191
|
-
onSelect(getDefaultCheckedItems(updatedTree))
|
195
|
+
onSelect(getDefaultCheckedItems(updatedTree))
|
192
196
|
}
|
193
|
-
}
|
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
212
|
const handledropdownItemClick = (e: any, check: boolean) => {
|
209
|
-
const clickedItem = e.target.parentNode.id
|
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);
|
217
|
+
const filtered = filterFormattedDataById(formattedData, clickedItem)
|
218
|
+
const updatedTree = changeItem(filtered[0], check)
|
216
219
|
if (returnAllSelected) {
|
217
|
-
onSelect(getCheckedItems(updatedTree))
|
220
|
+
onSelect(getCheckedItems(updatedTree))
|
218
221
|
} else {
|
219
|
-
onSelect(getDefaultCheckedItems(updatedTree))
|
222
|
+
onSelect(getDefaultCheckedItems(updatedTree))
|
220
223
|
}
|
221
|
-
}
|
224
|
+
}
|
222
225
|
|
223
|
-
const isExpanded = (item: any) => expanded.indexOf(item.id) > -1
|
226
|
+
const isExpanded = (item: any) => expanded.indexOf(item.id) > -1
|
224
227
|
|
225
228
|
//handle click on chevron toggles in dropdown
|
226
229
|
const handleToggleClick = (id: string, event: React.MouseEvent) => {
|
227
|
-
event.stopPropagation()
|
228
|
-
const clickedItem = filterFormattedDataById(formattedData, id)
|
230
|
+
event.stopPropagation()
|
231
|
+
const clickedItem = filterFormattedDataById(formattedData, id)
|
229
232
|
if (clickedItem) {
|
230
|
-
let expandedArray = [...expanded]
|
231
|
-
const itemExpanded = isExpanded(clickedItem[0])
|
233
|
+
let expandedArray = [...expanded]
|
234
|
+
const itemExpanded = isExpanded(clickedItem[0])
|
232
235
|
|
233
236
|
if (itemExpanded)
|
234
|
-
expandedArray = expandedArray.filter((i) => i != clickedItem[0].id)
|
235
|
-
else expandedArray.push(clickedItem[0].id)
|
237
|
+
expandedArray = expandedArray.filter((i) => i != clickedItem[0].id)
|
238
|
+
else expandedArray.push(clickedItem[0].id)
|
236
239
|
|
237
|
-
setExpanded(expandedArray)
|
240
|
+
setExpanded(expandedArray)
|
238
241
|
}
|
239
|
-
}
|
242
|
+
}
|
240
243
|
|
241
244
|
//rendering formattedData to UI based on typeahead
|
242
245
|
const renderNestedOptions = (items: { [key: string]: any }[]) => {
|
@@ -245,9 +248,9 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
|
|
245
248
|
{Array.isArray(items) &&
|
246
249
|
items.map((item: { [key: string]: any }) => {
|
247
250
|
return (
|
248
|
-
|
249
|
-
<li
|
250
|
-
<div className=
|
251
|
+
<div key={item.id}>
|
252
|
+
<li className='dropdown_item' data-name={item.id}>
|
253
|
+
<div className='dropdown_item_checkbox_row'>
|
251
254
|
<div
|
252
255
|
key={isExpanded(item) ? "chevron-down" : "chevron-right"}
|
253
256
|
>
|
@@ -263,17 +266,17 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
|
|
263
266
|
onClick={(event: any) =>
|
264
267
|
handleToggleClick(item.id, event)
|
265
268
|
}
|
266
|
-
variant=
|
269
|
+
variant='link'
|
267
270
|
/>
|
268
271
|
</div>
|
269
272
|
<Checkbox text={item.label} id={item.id}>
|
270
273
|
<input
|
271
274
|
checked={item.checked}
|
272
|
-
type=
|
275
|
+
type='checkbox'
|
273
276
|
name={item.label}
|
274
277
|
value={item.label}
|
275
278
|
onChange={(e) => {
|
276
|
-
handledropdownItemClick(e, !item.checked)
|
279
|
+
handledropdownItemClick(e, !item.checked)
|
277
280
|
}}
|
278
281
|
/>
|
279
282
|
</Checkbox>
|
@@ -285,24 +288,30 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
|
|
285
288
|
<div>{renderNestedOptions(item.children)}</div>
|
286
289
|
)}
|
287
290
|
</li>
|
288
|
-
|
289
|
-
)
|
291
|
+
</div>
|
292
|
+
)
|
290
293
|
})}
|
291
294
|
</ul>
|
292
|
-
)
|
293
|
-
}
|
295
|
+
)
|
296
|
+
}
|
294
297
|
|
295
298
|
return (
|
296
299
|
<div {...ariaProps} {...dataProps} className={classes} id={id}>
|
297
|
-
<div ref={dropdownRef} className=
|
298
|
-
<div className=
|
299
|
-
<div className=
|
300
|
+
<div ref={dropdownRef} className='wrapper'>
|
301
|
+
<div className='input_wrapper' onClick={handleInputWrapperClick}>
|
302
|
+
<div className='input_inner_container'>
|
303
|
+
{returnedArray.length !== 0 && returnAllSelected
|
304
|
+
? returnedArray.map((item) => (
|
305
|
+
<input type='hidden' name={`${name}[]`} value={item.id} />
|
306
|
+
))
|
307
|
+
: null}
|
308
|
+
|
300
309
|
{returnedArray.length !== 0 && returnAllSelected
|
301
310
|
? returnedArray.map((item, index) => (
|
302
311
|
<FormPill
|
303
312
|
key={index}
|
304
313
|
text={item.label}
|
305
|
-
size=
|
314
|
+
size='small'
|
306
315
|
onClick={(event: any) => handlePillClose(event, item)}
|
307
316
|
/>
|
308
317
|
))
|
@@ -313,29 +322,29 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
|
|
313
322
|
<FormPill
|
314
323
|
key={index}
|
315
324
|
text={item.label}
|
316
|
-
size=
|
325
|
+
size='small'
|
317
326
|
onClick={(event: any) => handlePillClose(event, item)}
|
318
327
|
/>
|
319
328
|
))}
|
320
329
|
{returnedArray.length !== 0 && returnAllSelected && <br />}
|
321
330
|
{defaultReturn.length !== 0 && !returnAllSelected && <br />}
|
322
331
|
<input
|
323
|
-
id=
|
332
|
+
id='multiselect_input'
|
324
333
|
onChange={(e) => {
|
325
|
-
setFilterItem(e.target.value)
|
334
|
+
setFilterItem(e.target.value)
|
326
335
|
}}
|
327
|
-
placeholder=
|
336
|
+
placeholder='Start typing...'
|
328
337
|
value={filterItem}
|
329
338
|
onClick={() => setIsClosed(false)}
|
330
339
|
/>
|
331
340
|
</div>
|
332
341
|
{isClosed ? (
|
333
|
-
<div key=
|
334
|
-
<Icon icon=
|
342
|
+
<div key='chevron-down'>
|
343
|
+
<Icon icon='chevron-down' />
|
335
344
|
</div>
|
336
345
|
) : (
|
337
|
-
<div key=
|
338
|
-
<Icon icon=
|
346
|
+
<div key='chevron-up'>
|
347
|
+
<Icon icon='chevron-up' />
|
339
348
|
</div>
|
340
349
|
)}
|
341
350
|
</div>
|
@@ -346,7 +355,7 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
|
|
346
355
|
</div>
|
347
356
|
</div>
|
348
357
|
</div>
|
349
|
-
)
|
350
|
-
}
|
358
|
+
)
|
359
|
+
}
|
351
360
|
|
352
|
-
export default MultiLevelSelect
|
361
|
+
export default MultiLevelSelect
|
@@ -1,72 +1,72 @@
|
|
1
1
|
<% treeData = [{
|
2
2
|
label: "Power Home Remodeling",
|
3
3
|
value: "Power Home Remodeling",
|
4
|
-
id: "
|
4
|
+
id: "100",
|
5
5
|
expanded: true,
|
6
6
|
children: [
|
7
7
|
{
|
8
8
|
label: "People",
|
9
9
|
value: "People",
|
10
|
-
id: "
|
10
|
+
id: "101",
|
11
11
|
children: [
|
12
12
|
{
|
13
13
|
label: "Talent Acquisition",
|
14
14
|
value: "Talent Acquisition",
|
15
|
-
id: "
|
15
|
+
id: "102",
|
16
16
|
},
|
17
17
|
{
|
18
18
|
label: "Business Affairs",
|
19
19
|
value: "Business Affairs",
|
20
|
-
id: "
|
20
|
+
id: "103",
|
21
21
|
children: [
|
22
22
|
{
|
23
23
|
label: "Initiatives",
|
24
24
|
value: "Initiatives",
|
25
|
-
id: "
|
25
|
+
id: "104",
|
26
26
|
},
|
27
27
|
{
|
28
28
|
label: "Learning & Development",
|
29
29
|
value: "Learning & Development",
|
30
|
-
id: "
|
30
|
+
id: "105",
|
31
31
|
},
|
32
32
|
],
|
33
33
|
},
|
34
34
|
{
|
35
35
|
label: "People Experience",
|
36
36
|
value: "People Experience",
|
37
|
-
id: "
|
37
|
+
id: "106",
|
38
38
|
},
|
39
39
|
],
|
40
40
|
},
|
41
41
|
{
|
42
42
|
label: "Contact Center",
|
43
43
|
value: "Contact Center",
|
44
|
-
id: "
|
44
|
+
id: "107",
|
45
45
|
children: [
|
46
46
|
{
|
47
47
|
label: "Appointment Management",
|
48
48
|
value: "Appointment Management",
|
49
|
-
id: "
|
49
|
+
id: "108",
|
50
50
|
},
|
51
51
|
{
|
52
52
|
label: "Customer Service",
|
53
53
|
value: "Customer Service",
|
54
|
-
id: "
|
54
|
+
id: "109",
|
55
55
|
},
|
56
56
|
{
|
57
57
|
label: "Energy",
|
58
58
|
value: "Energy",
|
59
|
-
id: "
|
59
|
+
id: "110",
|
60
60
|
},
|
61
61
|
],
|
62
62
|
},
|
63
63
|
],
|
64
|
-
|
64
|
+
}] %>
|
65
65
|
|
66
66
|
|
67
|
-
<%= pb_rails("multi_level_select", props: {
|
68
|
-
id: "default-multi-level-select",
|
69
|
-
tree_data:treeData
|
70
|
-
}) %>
|
71
|
-
|
72
67
|
|
68
|
+
<%= pb_rails("multi_level_select", props: {
|
69
|
+
id: "multi-level-select-default-rails",
|
70
|
+
name: "my_array",
|
71
|
+
tree_data: treeData
|
72
|
+
}) %>
|