playbook_ui 14.19.0.pre.alpha.PLAY2171advancedtable7832 → 14.19.0.pre.alpha.PLAY2172homeaddressstreetundefinedstatebug7716

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.
Files changed (101) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_advanced_table/Components/TableActionBar.tsx +35 -61
  3. data/app/pb_kits/playbook/pb_advanced_table/Components/TableHeaderCell.tsx +22 -36
  4. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +19 -6
  5. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_with_state.jsx +0 -1
  6. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_with_state.md +1 -3
  7. data/app/pb_kits/playbook/pb_dropdown/_dropdown.scss +1 -1
  8. data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +19 -77
  9. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default.html.erb +10 -0
  10. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display.jsx +0 -11
  11. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display.md +1 -1
  12. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display_rails.html.erb +2 -33
  13. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display_rails.md +1 -3
  14. data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +1 -11
  15. data/app/pb_kits/playbook/pb_dropdown/docs/index.js +0 -5
  16. data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +3 -3
  17. data/app/pb_kits/playbook/pb_dropdown/dropdown.rb +2 -16
  18. data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.html.erb +13 -34
  19. data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.rb +1 -3
  20. data/app/pb_kits/playbook/pb_dropdown/hooks/useHandleOnKeydown.tsx +6 -0
  21. data/app/pb_kits/playbook/pb_dropdown/index.js +30 -336
  22. data/app/pb_kits/playbook/pb_dropdown/keyboard_accessibility.js +12 -39
  23. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownOption.tsx +12 -16
  24. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownTrigger.tsx +13 -79
  25. data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +0 -1
  26. data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validate.html.erb +0 -1
  27. data/app/pb_kits/playbook/pb_form_group/_error_state_mixin.scss +2 -2
  28. data/app/pb_kits/playbook/pb_form_pill/_form_pill.scss +12 -19
  29. data/app/pb_kits/playbook/pb_home_address_street/_home_address_street.tsx +3 -7
  30. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +2 -2
  31. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color.html.erb +11 -11
  32. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color.jsx +11 -11
  33. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_default.html.erb +11 -11
  34. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_default.jsx +11 -11
  35. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled.html.erb +11 -11
  36. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled.jsx +11 -11
  37. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options.html.erb +11 -11
  38. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options.jsx +11 -11
  39. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_default.html.erb +11 -11
  40. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_default.jsx +11 -11
  41. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent.html.erb +11 -11
  42. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent.jsx +11 -11
  43. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent_default.html.erb +11 -11
  44. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent_default.jsx +11 -11
  45. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_error.html.erb +11 -11
  46. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_error.jsx +11 -11
  47. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_label.html.erb +11 -11
  48. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_label.jsx +11 -11
  49. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_react_hook.jsx +11 -11
  50. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_reset.html.erb +11 -11
  51. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_return_all_selected.html.erb +11 -11
  52. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_return_all_selected.jsx +11 -11
  53. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids.html.erb +11 -11
  54. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids.md +0 -2
  55. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids_react.jsx +11 -11
  56. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids_react.md +1 -3
  57. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single.html.erb +22 -22
  58. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single.jsx +22 -22
  59. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single_children_only.html.erb +22 -22
  60. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single_children_only.jsx +22 -22
  61. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_with_children.jsx +11 -11
  62. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_with_children_with_radios.jsx +11 -11
  63. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_with_form.html.erb +11 -11
  64. data/app/pb_kits/playbook/pb_person/_person.tsx +2 -12
  65. data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +3 -73
  66. data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +0 -1
  67. data/app/pb_kits/playbook/pb_typeahead/docs/index.js +0 -1
  68. data/dist/chunks/_typeahead-BPSIWtFT.js +22 -0
  69. data/dist/chunks/_weekday_stacked-rph2mGIB.js +45 -0
  70. data/dist/chunks/lib-B20MXZcW.js +29 -0
  71. data/dist/chunks/{pb_form_validation-BZ2AVAi_.js → pb_form_validation-WWvUXPKD.js} +1 -1
  72. data/dist/chunks/vendor.js +1 -1
  73. data/dist/playbook-doc.js +2 -2
  74. data/dist/playbook-rails-react-bindings.js +1 -1
  75. data/dist/playbook-rails.js +1 -1
  76. data/dist/playbook.css +1 -1
  77. data/lib/playbook/version.rb +1 -1
  78. metadata +7 -26
  79. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default_rails.html.erb +0 -31
  80. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default_rails.md +0 -5
  81. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select.jsx +0 -56
  82. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select.md +0 -3
  83. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display.jsx +0 -58
  84. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display.md +0 -3
  85. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display_rails.html.erb +0 -20
  86. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display_rails.md +0 -1
  87. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_rails.html.erb +0 -19
  88. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_rails.md +0 -3
  89. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.html.erb +0 -20
  90. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.jsx +0 -57
  91. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.md +0 -1
  92. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_custom_options.html.erb +0 -50
  93. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_custom_options.jsx +0 -105
  94. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_default.html.erb +0 -22
  95. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_default.jsx +0 -67
  96. data/app/pb_kits/playbook/pb_dropdown/subcomponents/MultiSelectTriggerDisplay.tsx +0 -58
  97. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_preserve_input.jsx +0 -23
  98. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_preserve_input.md +0 -1
  99. data/dist/chunks/_typeahead-BmOWdDtp.js +0 -22
  100. data/dist/chunks/_weekday_stacked-CvcuQyr9.js +0 -45
  101. data/dist/chunks/lib-D5R1BjUn.js +0 -29
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 62cd720222bdb3019a6caaf80b1830c3dc79f86e5494453686ff3c2aeec6b05b
4
- data.tar.gz: 39802a3cb498a500e28e4df930c6335715556321c56baf35620cc44bfa5b5710
3
+ metadata.gz: 179c2af6fd3485ed04bdcf2e4dba6c201309860e7ebab6bc27f3c5bdf78b4119
4
+ data.tar.gz: baeae47fc2895f60c94a0240255545fbd130754b0aaea296d52e06c991fa5df4
5
5
  SHA512:
6
- metadata.gz: b2dc5eac17ce563cbbf67ae68d0593ba9248b4bd979119406791aad10c68629eeaf4ca65b4068fc3f262101feb541f9f8214ebea3070b60673ca0255dfce251c
7
- data.tar.gz: 620f2b58b4d4be27b8cd8e3739ddd21cfa034aadd0b5779262f3d39d51279c6ba35f674a98b69bf05641dfa442ed9075f7ef33c8780549d7f89dc3e014caa0fa
6
+ metadata.gz: 0ee00f8f9f6c6a289588dff01b1b0d549287fad06a680bff17000ca5f9f69b5425fd91c6773a0466b92e94ac5c2339c01afba1177b7cf90434314363cd9f7310
7
+ data.tar.gz: 83978c3f1cc2cf665eaf15c9fc25637c67115d7956793356e72c5512f4ceac85b6354d8140d92041486abd61252caa0ac30693c1a2e61046b4af145f5b92b62e
@@ -1,4 +1,4 @@
1
- import React, { useEffect, useRef, useContext, useState } from "react";
1
+ import React, { useEffect, useRef, useContext } from "react";
2
2
 
3
3
  import AdvancedTableContext from "../Context/AdvancedTableContext";
4
4
  import { buildVisibilityTree } from "../Utilities/VisibilityTree";
@@ -7,11 +7,13 @@ import Card from "../../pb_card/_card";
7
7
  import Caption from "../../pb_caption/_caption";
8
8
  import Flex from "../../pb_flex/_flex";
9
9
  import FlexItem from "../../pb_flex/_flex_item";
10
+ import Dropdown from "../../pb_dropdown/_dropdown";
11
+ import DropdownContainer from "../../pb_dropdown/subcomponents/DropdownContainer";
12
+ import DropdownTrigger from "../../pb_dropdown/subcomponents/DropdownTrigger";
10
13
  import Icon from "../../pb_icon/_icon";
11
14
  import Checkbox from "../../pb_checkbox/_checkbox";
12
15
  import SectionSeparator from "../../pb_section_separator/_section_separator";
13
16
  import Tooltip from "../../pb_tooltip/_tooltip";
14
- import PbReactPopover from "../../pb_popover/_popover";
15
17
 
16
18
  import {
17
19
  showActionBar,
@@ -54,24 +56,11 @@ const TableActionBar: React.FC<TableActionBarProps> = ({
54
56
  const col = table.getColumn(id);
55
57
  const show = col.getIsVisible();
56
58
 
57
- const handleVisibilityChange = () => {
58
- col.toggleVisibility();
59
- if (columnVisibilityControl?.onColumnVisibilityChange) {
60
- const updatedVisibilityState = {
61
- ...table.getAllColumns().reduce((acc: { [x: string]: any; }, col: { id: string | number; getIsVisible: () => any; }) => {
62
- acc[col.id] = col.getIsVisible();
63
- return acc;
64
- }, {}),
65
- };
66
- columnVisibilityControl?.onColumnVisibilityChange(updatedVisibilityState);
67
- }
68
- };
69
-
70
59
  return (
71
60
  <Checkbox
72
61
  checked={show}
73
62
  key={id}
74
- onChange={handleVisibilityChange}
63
+ onChange={() => col.toggleVisibility()}
75
64
  paddingBottom="xs"
76
65
  text={label}
77
66
  />
@@ -91,24 +80,16 @@ const TableActionBar: React.FC<TableActionBarProps> = ({
91
80
  const allOn = visibleArray.every(Boolean);
92
81
  const someOn = visibleArray.some(Boolean);
93
82
 
94
- const handleGroupVisibilityChange = () => {
95
- leaves.forEach((id) => table.getColumn(id).toggleVisibility(!allOn));
96
- if (columnVisibilityControl?.onColumnVisibilityChange) {
97
- const updatedVisibilityState = {
98
- ...table.getAllColumns().reduce((acc: { [x: string]: any; }, col: { id: string | number; getIsVisible: () => any; }) => {
99
- acc[col.id] = col.getIsVisible();
100
- return acc;
101
- }, {}),
102
- };
103
- columnVisibilityControl?.onColumnVisibilityChange(updatedVisibilityState);
104
- }
105
- };
106
83
  return (
107
84
  <>
108
85
  <Checkbox
109
86
  checked={allOn}
110
87
  indeterminate={!allOn && someOn}
111
- onChange={handleGroupVisibilityChange}
88
+ onChange={() =>
89
+ leaves.forEach((id) =>
90
+ table.getColumn(id).toggleVisibility(!allOn),
91
+ )
92
+ }
112
93
  paddingBottom="xs"
113
94
  text={node.label}
114
95
  />
@@ -132,28 +113,7 @@ const TableActionBar: React.FC<TableActionBarProps> = ({
132
113
  hideActionBar(cardRef.current);
133
114
  }
134
115
  }
135
- }, [isVisible, type]);
136
-
137
- const [showPopover, setShowPopover] = useState(false)
138
-
139
- const togglePopover = () => setShowPopover((prev) => !prev)
140
- const handleShouldClose = (shouldClose: boolean) =>
141
- setShowPopover(!shouldClose)
142
-
143
- const popoverReference = (
144
- <Tooltip
145
- placement="top"
146
- text="Column Configuration"
147
- >
148
- <div onClick={togglePopover}>
149
- <Icon
150
- color="primary"
151
- cursor="pointer"
152
- icon="sliders-h"
153
- />
154
- </div>
155
- </Tooltip>
156
- )
116
+ }, [isVisible]);
157
117
 
158
118
  return (
159
119
  <Card
@@ -179,17 +139,30 @@ const TableActionBar: React.FC<TableActionBarProps> = ({
179
139
  <FlexItem>{actions}</FlexItem>
180
140
  </>
181
141
  ) : (
182
- <PbReactPopover
183
- closeOnClick="outside"
184
- placement="bottom-end"
185
- reference={popoverReference}
186
- shouldClosePopover={handleShouldClose}
187
- show={showPopover}
188
- zIndex={3}
142
+ <Dropdown
143
+ className="column-visibility-dropdown-wrapper"
144
+ options={columnDefinitions}
189
145
  >
190
- <>
146
+ <DropdownTrigger>
147
+ <Tooltip
148
+ placement='top'
149
+ text="Column Configuration"
150
+ zIndex={10}
151
+ >
152
+ <Icon
153
+ color="primary"
154
+ cursor="pointer"
155
+ icon="sliders-h"
156
+ />
157
+ </Tooltip>
158
+ </DropdownTrigger>
159
+ <DropdownContainer
160
+ className="column-visibility-dropdown"
161
+ paddingTop="sm"
162
+ >
163
+ <>
191
164
  <Caption
192
- paddingY="sm"
165
+ paddingBottom="sm"
193
166
  text="Columns Config"
194
167
  textAlign="center"
195
168
  />
@@ -204,7 +177,8 @@ const TableActionBar: React.FC<TableActionBarProps> = ({
204
177
  </Flex>
205
178
  ))}
206
179
  </>
207
- </PbReactPopover>
180
+ </DropdownContainer>
181
+ </Dropdown>
208
182
  )}
209
183
  </Flex>
210
184
  </Card>
@@ -1,4 +1,4 @@
1
- import React, { useContext, useState } from "react"
1
+ import React, { useContext } from "react"
2
2
  import classnames from "classnames"
3
3
  import { flexRender, Header, Table, RowModel } from "@tanstack/react-table"
4
4
 
@@ -8,8 +8,10 @@ import { GlobalProps } from "../../utilities/globalProps"
8
8
 
9
9
  import Flex from "../../pb_flex/_flex"
10
10
  import Checkbox from "../../pb_checkbox/_checkbox"
11
- import SectionSeparator from "../../pb_section_separator/_section_separator"
12
- import PbReactPopover from "../../pb_popover/_popover";
11
+ import Dropdown from "../../pb_dropdown/_dropdown"
12
+ import DropdownTrigger from "../../pb_dropdown/subcomponents/DropdownTrigger"
13
+ import DropdownOption from "../../pb_dropdown/subcomponents/DropdownOption"
14
+ import DropdownContainer from "../../pb_dropdown/subcomponents/DropdownContainer"
13
15
  import Icon from "../../pb_icon/_icon"
14
16
 
15
17
  import { SortIconButton } from "./SortIconButton"
@@ -134,20 +136,6 @@ const isToggleExpansionEnabled =
134
136
  justifyHeader = isLeafColumn ? "end" : "center";
135
137
  }
136
138
 
137
- const [showPopover, setShowPopover] = useState(false)
138
-
139
- const togglePopover = () => setShowPopover((prev) => !prev)
140
- const handleShouldClose = (shouldClose: boolean) =>
141
- setShowPopover(!shouldClose)
142
-
143
- const popoverReference = (
144
- <div className="gray-icon toggle-all-icon"
145
- onClick={togglePopover}
146
- >
147
- <Icon icon={displayIcon(toggleExpansionIcon)[0]} />
148
- </div>
149
- )
150
-
151
139
  const handleExpandDepth = (depth: number) => {
152
140
  if (onExpandByDepthClick) {
153
141
  const flatRows = table?.getRowModel().flatRows
@@ -203,33 +191,31 @@ const isToggleExpansionEnabled =
203
191
  <ToggleIconButton onClick={handleExpandOrCollapse} />
204
192
  )}
205
193
  {isToggleExpansionEnabled && hasAnySubRows && expandByDepth && (
206
-
207
- <PbReactPopover
208
- closeOnClick="any"
209
- placement="bottom-start"
210
- reference={popoverReference}
211
- shouldClosePopover={handleShouldClose}
212
- show={showPopover}
213
- zIndex={3}
194
+ <Dropdown className="expand-by-depth-dropdown-wrapper"
195
+ options={expandByDepth}
196
+ >
197
+ <DropdownTrigger className="gray-icon toggle-all-icon">
198
+ <Icon icon={displayIcon(toggleExpansionIcon)[0]} />
199
+ </DropdownTrigger>
200
+ <DropdownContainer className="expand-by-depth-dropdown">
201
+ {expandByDepth.map((option:{ [key: string]: any }, index: number) => (
202
+ <DropdownOption
203
+ key={index}
204
+ option={option}
205
+ padding="none"
214
206
  >
215
- {expandByDepth.map((option:{ [key: string]: any }, index: number) => (
216
- <>
217
207
  <Flex
218
208
  alignItems="center"
219
- className="pb-advanced-table-popover-option"
220
- cursor="pointer"
221
209
  htmlOptions={{onClick: () => {handleExpandDepth(option.depth)} }}
222
210
  paddingX="sm"
223
211
  paddingY="xs"
224
212
  >
225
213
  {option.label}
226
- </Flex>
227
- {index !== expandByDepth.length - 1 && <SectionSeparator/>}
228
- </>
229
- ))}
230
- </PbReactPopover>
231
-
232
-
214
+ </Flex>
215
+ </DropdownOption>
216
+ ))}
217
+ </DropdownContainer>
218
+ </Dropdown>
233
219
  )}
234
220
 
235
221
  {isToggleExpansionEnabledLoading &&(
@@ -53,6 +53,15 @@
53
53
  width: 100%;
54
54
  }
55
55
 
56
+ .column-visibility-dropdown-wrapper {
57
+ position: unset !important;
58
+ }
59
+ .column-visibility-dropdown {
60
+ width: unset !important;
61
+ right: $space_xxs;
62
+ text-align: left;
63
+ }
64
+
56
65
  // Virtualized table styles
57
66
  .virtualized-table-row {
58
67
  display: table !important;
@@ -150,6 +159,13 @@
150
159
  box-sizing: border-box !important;
151
160
  }
152
161
  }
162
+ .expand-by-depth-dropdown-wrapper {
163
+ position: unset !important;
164
+ }
165
+ .expand-by-depth-dropdown {
166
+ width: unset !important;
167
+ text-align: left;
168
+ }
153
169
  }
154
170
 
155
171
  .pb_advanced_table_body {
@@ -538,12 +554,14 @@
538
554
  background-color: $white;
539
555
  box-shadow: $shadow_deep;
540
556
  }
541
-
542
557
  @include advanced-table-sticky-mixin(
543
558
  $border_light,
544
559
  $white,
545
560
  lighten($silver, $opacity_7)
546
561
  );
562
+
563
+ // Apply border colors for sticky columns
564
+ @include apply-sticky-colors("light");
547
565
  }
548
566
 
549
567
  // Responsive Styles
@@ -809,8 +827,3 @@
809
827
  }
810
828
  }
811
829
  }
812
-
813
- // Outside of the pb_advanced_table class for popover
814
- .pb-advanced-table-popover-option:hover {
815
- background-color: $bg_light;
816
- }
@@ -49,7 +49,6 @@ const AdvancedTableColumnVisibilityWithState = (props) => {
49
49
  const columnVisibilityControl = {
50
50
  value: columnVisibility,
51
51
  onChange: setColumnVisibility,
52
- onColumnVisibilityChange: (currentState) => console.log(currentState),
53
52
  }
54
53
  return (
55
54
  <div>
@@ -1,3 +1 @@
1
- The `columnVisibilityControl` prop also allows for greater control over the columnVisibility state. Devs can manage state themselves by passing in `value` and `onChange` as shown.
2
-
3
- The additional `onColumnVisibilityChange` provides a callback with the current state as the argument if needed.
1
+ The `columnVisibilityControl` prop also allows for greater control over the columnVisibility state. Devs can manage state themselves by passing in `value` and `onChange` as shown.
@@ -15,7 +15,7 @@
15
15
  @include pb_body;
16
16
  border: 1px solid $border_light;
17
17
  background-color: $white;
18
- min-height: 45px;
18
+ height: 45px;
19
19
  @media (hover: hover) {
20
20
  &:hover,
21
21
  &:active,
@@ -1,4 +1,4 @@
1
- import React, { useState, useRef, useEffect, forwardRef, useImperativeHandle, useMemo } from "react";
1
+ import React, { useState, useRef, useEffect, forwardRef, useImperativeHandle } from "react";
2
2
  import classnames from "classnames";
3
3
  import { buildAriaProps, buildCss, buildDataProps, buildHtmlProps } from "../utilities/props";
4
4
  import { globalProps } from "../utilities/globalProps";
@@ -25,7 +25,6 @@ type DropdownProps = {
25
25
  blankSelection?: string;
26
26
  children?: React.ReactChild[] | React.ReactChild | React.ReactElement[];
27
27
  className?: string;
28
- formPillProps?: GenericObject;
29
28
  dark?: boolean;
30
29
  data?: { [key: string]: string };
31
30
  defaultValue?: GenericObject;
@@ -34,7 +33,6 @@ type DropdownProps = {
34
33
  id?: string;
35
34
  isClosed?: boolean;
36
35
  label?: string;
37
- multiSelect?: boolean;
38
36
  onSelect?: (arg: GenericObject) => null;
39
37
  options: GenericObject;
40
38
  separators?: boolean;
@@ -63,8 +61,6 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
63
61
  id,
64
62
  isClosed = true,
65
63
  label,
66
- multiSelect = false,
67
- formPillProps,
68
64
  onSelect,
69
65
  options,
70
66
  separators = true,
@@ -84,20 +80,7 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
84
80
  const [isDropDownClosed, setIsDropDownClosed, toggleDropdown] = useDropdown(isClosed);
85
81
 
86
82
  const [filterItem, setFilterItem] = useState("");
87
- const initialSelected = useMemo(() => {
88
- if (multiSelect) {
89
- if (Array.isArray(defaultValue)) return defaultValue;
90
- return defaultValue && Object.keys(defaultValue).length
91
- ? [defaultValue]
92
- : [];
93
- }
94
- return defaultValue || {};
95
- }, [multiSelect, defaultValue]);
96
-
97
- const [selected, setSelected] = useState<GenericObject | GenericObject[]>(
98
- initialSelected
99
- );
100
-
83
+ const [selected, setSelected] = useState<GenericObject>(defaultValue);
101
84
  const [isInputFocused, setIsInputFocused] = useState(false);
102
85
  const [hasTriggerSubcomponent, setHasTriggerSubcomponent] = useState(true);
103
86
  const [hasContainerSubcomponent, setHasContainerSubcomponent] =
@@ -110,12 +93,6 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
110
93
  const inputWrapperRef = useRef(null);
111
94
  const dropdownContainerRef = useRef(null);
112
95
 
113
- const selectedArray = Array.isArray(selected)
114
- ? selected
115
- : selected && Object.keys(selected).length
116
- ? [selected]
117
- : [];
118
-
119
96
  const { trigger, container, otherChildren } =
120
97
  separateChildComponents(children);
121
98
 
@@ -147,23 +124,16 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
147
124
 
148
125
  const blankSelectionOption: GenericObject = blankSelection ? [{ label: blankSelection, value: "" }] : [];
149
126
  const optionsWithBlankSelection = blankSelectionOption.concat(options);
150
-
151
- const availableOptions = useMemo(()=> {
152
- if (!multiSelect) return optionsWithBlankSelection;
153
- return optionsWithBlankSelection.filter((option: GenericObject) => !selectedArray.some((sel) => sel.label === option.label));
154
- }, [optionsWithBlankSelection, selectedArray, multiSelect]);
155
-
156
- const filteredOptions = useMemo(() => {
157
- return availableOptions.filter((opt: GenericObject) =>
158
- String(opt.label).toLowerCase().includes(filterItem.toLowerCase())
159
- );
160
- }, [availableOptions, filterItem]);
127
+ const filteredOptions = optionsWithBlankSelection?.filter((option: GenericObject) => {
128
+ const label = typeof option.label === 'string' ? option.label.toLowerCase() : option.label;
129
+ return String(label).toLowerCase().includes(filterItem.toLowerCase());
130
+ });
161
131
 
162
132
  // For keyboard accessibility: Set focus within dropdown to selected item if it exists
163
133
  useEffect(() => {
164
134
  if (!isDropDownClosed) {
165
135
  let newIndex = 0;
166
- if (selected && !Array.isArray(selected) && selected.label) {
136
+ if (selected && selected?.label) {
167
137
  const selectedIndex = filteredOptions.findIndex((option: GenericObject) => option.label === selected.label);
168
138
  if (selectedIndex >= 0) {
169
139
  newIndex = selectedIndex;
@@ -179,27 +149,12 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
179
149
  setIsDropDownClosed(false);
180
150
  };
181
151
 
182
-
183
- const handleOptionClick = (clickedItem: GenericObject) => {
184
- if (multiSelect) {
185
- setSelected((prev) => {
186
- const list = prev as GenericObject[];
187
- const exists = list.find((option) => option.value === clickedItem.value);
188
- const next = exists
189
- ? list.filter((option) => option.value !== clickedItem.value)
190
- : [...list, clickedItem];
191
- onSelect && onSelect(next);
192
- return next;
193
- });
194
- setFilterItem("");
195
- setIsDropDownClosed(true);
196
- } else {
197
- setSelected(clickedItem);
198
- setFilterItem("");
199
- setIsDropDownClosed(true);
200
- onSelect && onSelect(clickedItem);
201
- }
202
- };
152
+ const handleOptionClick = (selectedItem: GenericObject) => {
153
+ setSelected(selectedItem);
154
+ setFilterItem("");
155
+ setIsDropDownClosed(true);
156
+ onSelect && onSelect(selectedItem);
157
+ };
203
158
 
204
159
  const handleWrapperClick = () => {
205
160
  autocomplete && inputRef?.current?.focus();
@@ -207,14 +162,9 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
207
162
  };
208
163
 
209
164
  const handleBackspace = () => {
210
- if (multiSelect) {
211
- setSelected([]);
212
- onSelect && onSelect([]);
213
- } else {
214
165
  setSelected({});
215
166
  onSelect && onSelect(null);
216
167
  setFocusedOptionIndex(-1);
217
- }
218
168
  };
219
169
 
220
170
  const componentsToRender = prepareSubcomponents({
@@ -228,17 +178,12 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
228
178
  });
229
179
 
230
180
  useImperativeHandle(ref, () => ({
231
- clearSelected: () => {
232
- if (multiSelect) {
233
- setSelected([]);
234
- onSelect && onSelect([]);
235
- } else {
236
- setSelected({});
237
- onSelect && onSelect(null);
238
- }
239
- setFilterItem("");
240
- setIsDropDownClosed(true);
241
- },
181
+ clearSelected: () => {
182
+ setSelected({});
183
+ setFilterItem("");
184
+ setIsDropDownClosed(true);
185
+ onSelect && onSelect(null);
186
+ },
242
187
  }));
243
188
 
244
189
  return (
@@ -256,7 +201,6 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
256
201
  filteredOptions,
257
202
  filterItem,
258
203
  focusedOptionIndex,
259
- formPillProps,
260
204
  handleBackspace,
261
205
  handleChange,
262
206
  handleOptionClick,
@@ -265,8 +209,6 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
265
209
  inputWrapperRef,
266
210
  isDropDownClosed,
267
211
  isInputFocused,
268
- multiSelect,
269
- onSelect,
270
212
  optionsWithBlankSelection,
271
213
  selected,
272
214
  setFocusedOptionIndex,
@@ -0,0 +1,10 @@
1
+ <%
2
+ options = [
3
+ { label: 'United States', value: 'United States', id: 'us' },
4
+ { label: 'Canada', value: 'Canada', id: 'ca' },
5
+ { label: 'Pakistan', value: 'Pakistan', id: 'pk' },
6
+ ]
7
+
8
+ %>
9
+
10
+ <%= pb_rails("dropdown", props: {options: options}) %>
@@ -6,7 +6,6 @@ import Flex from '../../pb_flex/_flex'
6
6
  import FlexItem from '../../pb_flex/_flex_item'
7
7
  import Avatar from '../../pb_avatar/_avatar'
8
8
  import User from '../../pb_user/_user'
9
- import Body from '../../pb_body/_body'
10
9
 
11
10
  const DropdownWithCustomDisplay = (props) => {
12
11
  const [selectedOption, setSelectedOption] = useState();
@@ -51,20 +50,10 @@ const DropdownWithCustomDisplay = (props) => {
51
50
  <>
52
51
  {
53
52
  selectedOption && (
54
- <Flex align="center">
55
53
  <Avatar
56
54
  name={selectedOption.label}
57
55
  size="xs"
58
56
  />
59
- <Body
60
- marginX="xs"
61
- text={selectedOption.label}
62
- />
63
- <Badge
64
- text={selectedOption.status}
65
- variant={selectedOption.status == "Offline" ? "neutral" : selectedOption.status == "Online" ? "success" : "warning"}
66
- />
67
- </Flex>
68
57
  )
69
58
  }
70
59
  </>
@@ -1,4 +1,4 @@
1
- Optionally utilize `customDisplay` on the `Dropdown.Trigger` subcomponent to customize its content after an option is selected. Pass in any combination of kits to create a custom display. When a user clicks on an option, the kits passed into `customDisplay` will display as the selected option.
1
+ Optionally utilize `customDisplay` on the `Dropdown.Trigger` subcomponent to customize its content after an option is selected. The component passed to customDisplay will be rendered to the left of the default text-based display. In this example the Avatar kit is being used.
2
2
 
3
3
  The `placeholder` prop can also be used to customize the placeholder text for the default `Dropdown.Trigger`.
4
4
 
@@ -38,11 +38,7 @@
38
38
 
39
39
  <%
40
40
  custom_display = capture do
41
- pb_rails("flex", props: { align: "center" }) do
42
- concat(pb_rails("avatar", props: { name: "", size: "xs", id: "dropdown-avatar" }))
43
- concat(pb_rails("body", props: { text: "", size: "xs", margin_x: "xs", id: "dropdown-avatar-name" }))
44
- concat(pb_rails("badge", props: { text: "", id: "dropdown-avatar-status" }))
45
- end
41
+ pb_rails("avatar", props: { name: "Courtney Long", size: "xs" })
46
42
  end
47
43
  %>
48
44
 
@@ -66,31 +62,4 @@
66
62
  <% end %>
67
63
  <% end %>
68
64
  <% end %>
69
- <% end %>
70
-
71
-
72
- <script>
73
- document.addEventListener("pb:dropdown:selected", (e) => {
74
- const option = e.detail;
75
- const dropdown = e.target;
76
-
77
- const display = dropdown.querySelector("#dropdown_trigger_custom_display");
78
- if (!display) return;
79
-
80
- const nameEl = display.querySelector("#dropdown-avatar-name");
81
- if (nameEl) nameEl.textContent = option.label;
82
-
83
- const avatarEl = display.querySelector("#dropdown-avatar").querySelector(".avatar_wrapper");
84
- const initials = (option.label[0] + option.label.split(" ").pop()[0]).toUpperCase();
85
- if (avatarEl) {
86
- avatarEl.dataset.name = option.label;
87
- avatarEl.setAttribute("data-initials", initials);
88
- }
89
- const badgeEl = display.querySelector("#dropdown-avatar-status");
90
- const variant = option.status === "Online" ? "success" : option.status === "Offline" ? "neutral" : "warning";
91
- if (badgeEl) {
92
- badgeEl.querySelector("span").textContent = option.status;
93
- badgeEl.className = 'pb_badge_kit_' + variant;
94
- }
95
- });
96
- </script>
65
+ <% end %>
@@ -1,6 +1,4 @@
1
- Optionally utilize `custom_display` on the `dropdown/dropdown_trigger` subcomponent to customize its content after an option is selected. Pass in any combination of kits to create a custom display. When a user clicks on an option, the kits passed into `custom_display` will display as the selected option.
2
-
3
- Make use of a script to help set the custom_display with the correct value. By using the pb:dropdown:selected event listener, you can target the kits with a querySelector and update them dynamically with the values needed to match the selected option. Make sure to add an ID to the kits being passed in.
1
+ Optionally utilize `custom_display` on the `dropdown/dropdown_trigger` subcomponent to customize its content after an option is selected. The component passed to custom_display will be rendered to the left of the default text-based display. In this example the Avatar kit is being used.
4
2
 
5
3
  The `placeholder` prop can also be used to customize the placeholder text for the default `dropdown/dropdown_trigger`.
6
4