playbook_ui 14.21.0.pre.alpha.renovatenpmtrixvulnerability8103 → 14.21.0.pre.rc.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.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_advanced_table/Components/CustomCell.tsx +1 -1
  3. data/app/pb_kits/playbook/pb_advanced_table/Components/RegularTableView.tsx +49 -116
  4. data/app/pb_kits/playbook/pb_advanced_table/Components/TableHeaderCell.tsx +1 -1
  5. data/app/pb_kits/playbook/pb_advanced_table/Context/AdvancedTableContext.tsx +2 -58
  6. data/app/pb_kits/playbook/pb_advanced_table/Hooks/useTableActions.ts +1 -1
  7. data/app/pb_kits/playbook/pb_advanced_table/Hooks/useTableState.ts +4 -16
  8. data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableHeader.tsx +3 -7
  9. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +0 -40
  10. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +3 -13
  11. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.rb +1 -7
  12. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +0 -61
  13. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_no_subrows.jsx +1 -0
  14. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +2 -6
  15. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +1 -3
  16. data/app/pb_kits/playbook/pb_advanced_table/index.js +0 -2
  17. data/app/pb_kits/playbook/pb_checkbox/checkbox.html.erb +11 -4
  18. data/app/pb_kits/playbook/pb_checkbox/checkbox.rb +6 -10
  19. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_indeterminate.html.erb +48 -2
  20. data/app/pb_kits/playbook/pb_draggable/context/index.tsx +58 -17
  21. data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +3 -12
  22. data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +0 -2
  23. data/app/pb_kits/playbook/pb_dropdown/docs/index.js +1 -2
  24. data/app/pb_kits/playbook/pb_dropdown/dropdown.test.jsx +2 -108
  25. data/app/pb_kits/playbook/pb_dropdown/index.js +0 -24
  26. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownOption.tsx +10 -14
  27. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownTrigger.tsx +15 -26
  28. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.tsx +0 -4
  29. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_only_countries.jsx +1 -1
  30. data/app/pb_kits/playbook/pb_phone_number_input/docs/example.yml +3 -4
  31. data/app/pb_kits/playbook/pb_phone_number_input/docs/index.js +0 -1
  32. data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.rb +0 -3
  33. data/app/pb_kits/playbook/pb_popover/index.ts +4 -9
  34. data/app/pb_kits/playbook/pb_table/docs/_table_with_selectable_rows.html.erb +51 -3
  35. data/app/pb_kits/playbook/pb_table/styles/_mobile_collapse.scss +1 -1
  36. data/dist/chunks/{_typeahead-CoOpeYom.js → _typeahead-BmOWdDtp.js} +2 -2
  37. data/dist/chunks/_weekday_stacked-CvcuQyr9.js +45 -0
  38. data/dist/chunks/{lib-D7Va7yqa.js → lib-D5R1BjUn.js} +1 -1
  39. data/dist/chunks/{pb_form_validation-DSkdRDMf.js → pb_form_validation-BZ2AVAi_.js} +1 -1
  40. data/dist/chunks/vendor.js +1 -1
  41. data/dist/menu.yml +1 -1
  42. data/dist/playbook-doc.js +1 -1
  43. data/dist/playbook-rails-react-bindings.js +1 -1
  44. data/dist/playbook-rails.js +1 -1
  45. data/dist/playbook.css +1 -1
  46. data/lib/playbook/version.rb +2 -2
  47. metadata +6 -19
  48. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_no_subrows.html.erb +0 -33
  49. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_pinned_rows.jsx +0 -57
  50. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_pinned_rows_react.md +0 -5
  51. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_scrollbar_none.html.erb +0 -33
  52. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_scrollbar_none.jsx +0 -53
  53. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_indeterminate_rails.md +0 -1
  54. data/app/pb_kits/playbook/pb_checkbox/index.js +0 -56
  55. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_quick_pick_date_display.html.erb +0 -13
  56. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_close_on_select.jsx +0 -42
  57. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_close_on_select.md +0 -1
  58. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_exclude_countries.html.erb +0 -4
  59. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_exclude_countries.jsx +0 -15
  60. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_exclude_countries.md +0 -1
  61. data/dist/chunks/_weekday_stacked-B_jpa2Rz.js +0 -45
@@ -25,7 +25,7 @@ type DropdownOptionProps = {
25
25
  key?: string | number;
26
26
  option?: GenericObject;
27
27
  padding?: string;
28
- } & GlobalProps;
28
+ } & GlobalProps;
29
29
 
30
30
  const DropdownOption = (props: DropdownOptionProps) => {
31
31
  const {
@@ -56,17 +56,16 @@ const DropdownOption = (props: DropdownOptionProps) => {
56
56
 
57
57
  // When multiSelect, then if an option is selected, remove from dropdown
58
58
  const isSelected = Array.isArray(selected)
59
- ? selected.some((item) => item.label === option?.label)
60
- : (selected as GenericObject)?.label === option?.label;
59
+ ? selected.some((item) => item.label === option?.label)
60
+ : (selected as GenericObject)?.label === option?.label;
61
61
 
62
+
62
63
  if (!isItemMatchingFilter(option) || (multiSelect && isSelected)) {
63
64
  return null;
64
65
  }
65
-
66
66
  const isFocused =
67
67
  focusedOptionIndex >= 0 &&
68
68
  filteredOptions[focusedOptionIndex].label === option?.label;
69
-
70
69
  const focusedClass = isFocused && "focused";
71
70
 
72
71
  const selectedClass = isSelected ? "selected" : "list";
@@ -92,10 +91,7 @@ const DropdownOption = (props: DropdownOptionProps) => {
92
91
  className={classes}
93
92
  id={id}
94
93
  key={key}
95
- onClick={(e) => {
96
- e.stopPropagation();
97
- handleOptionClick(option);
98
- }}
94
+ onClick= {() => handleOptionClick(option)}
99
95
  >
100
96
  <ListItem
101
97
  cursor="pointer"
@@ -104,12 +100,12 @@ const DropdownOption = (props: DropdownOptionProps) => {
104
100
  key={option?.label}
105
101
  padding="none"
106
102
  >
107
- {children ?
103
+ {children ?
108
104
  <div className="dropdown_option_wrapper">{children}</div> :
109
- <Body dark={dark}
110
- text={option?.label}
111
- />
112
- }
105
+ <Body dark={dark}
106
+ text={option?.label}
107
+ />
108
+ }
113
109
  </ListItem>
114
110
  </div>
115
111
  );
@@ -44,7 +44,6 @@ const DropdownTrigger = (props: DropdownTriggerProps) => {
44
44
 
45
45
  const {
46
46
  autocomplete,
47
- closeOnSelection,
48
47
  filterItem,
49
48
  handleBackspace,
50
49
  handleChange,
@@ -55,7 +54,6 @@ const DropdownTrigger = (props: DropdownTriggerProps) => {
55
54
  isInputFocused,
56
55
  multiSelect,
57
56
  selected,
58
- setIsDropDownClosed,
59
57
  setIsInputFocused,
60
58
  toggleDropdown,
61
59
  } = useContext(DropdownContext);
@@ -105,26 +103,11 @@ const DropdownTrigger = (props: DropdownTriggerProps) => {
105
103
  ? placeholder
106
104
  : "Select...";
107
105
 
108
- // Click handler that respects closeOnSelection
109
- const handleInputClick = (e: React.MouseEvent) => {
110
- e.stopPropagation(); // keep the wrapper's handler from firing
111
- if (isDropDownClosed) {
112
- // Always open if closed
113
- setIsDropDownClosed(false);
114
- } else if (!closeOnSelection) {
115
- // Keep open if closeOnSelection is false
116
- return;
117
- } else {
118
- // Default behavior - toggle
119
- toggleDropdown();
120
- }
121
- };
122
-
123
106
  return (
124
- <div {...ariaProps}
125
- {...dataProps}
107
+ <div {...ariaProps}
108
+ {...dataProps}
126
109
  {...htmlProps}
127
- className={classes}
110
+ className={classes}
128
111
  id={id}
129
112
  >
130
113
  {
@@ -162,7 +145,7 @@ const DropdownTrigger = (props: DropdownTriggerProps) => {
162
145
  {customDisplay ? (
163
146
  <Flex align="center">
164
147
  {customDisplay}
165
- <Body dark={dark}
148
+ <Body dark={dark}
166
149
  paddingLeft={`${joinedLabels ? "xs" : "none"}`}
167
150
  >
168
151
  {customDisplayPlaceholder}
@@ -181,7 +164,10 @@ const DropdownTrigger = (props: DropdownTriggerProps) => {
181
164
  <input
182
165
  className="dropdown_input"
183
166
  onChange={handleChange}
184
- onClick={handleInputClick}
167
+ onClick={(e) => {
168
+ e.stopPropagation();// keep the wrapper’s handler from firing
169
+ toggleDropdown();
170
+ }}
185
171
  onFocus={() => setIsInputFocused(true)}
186
172
  onKeyDown={(e) => {
187
173
  handleKeyDown(e);
@@ -200,8 +186,8 @@ const DropdownTrigger = (props: DropdownTriggerProps) => {
200
186
  )}
201
187
  </>
202
188
  ) : (
203
- <Body dark={dark}
204
- text={defaultDisplayPlaceholder}
189
+ <Body dark={dark}
190
+ text={defaultDisplayPlaceholder}
205
191
  />
206
192
  )
207
193
  )}
@@ -209,7 +195,10 @@ const DropdownTrigger = (props: DropdownTriggerProps) => {
209
195
  <input
210
196
  className="dropdown_input"
211
197
  onChange={handleChange}
212
- onClick={handleInputClick}
198
+ onClick={(e) => {
199
+ e.stopPropagation();// keep the wrapper’s handler from firing
200
+ toggleDropdown();
201
+ }}
213
202
  onFocus={() => setIsInputFocused(true)}
214
203
  onKeyDown={handleKeyDown}
215
204
  placeholder={
@@ -234,7 +223,7 @@ const DropdownTrigger = (props: DropdownTriggerProps) => {
234
223
  onClick: (e: Event) => {e.stopPropagation();handleWrapperClick()}
235
224
  }}
236
225
  key={`${isDropDownClosed ? "chevron-down" : "chevron-up"}`}
237
- >
226
+ >
238
227
  {
239
228
  selectedArray.length > 0 && (
240
229
  <div onClick={(e)=>{e.stopPropagation();handleBackspace()}}>
@@ -33,7 +33,6 @@ type PhoneNumberInputProps = {
33
33
  onChange?: (e: React.FormEvent<HTMLInputElement>) => void,
34
34
  onValidate?: Callback<boolean, void>,
35
35
  onlyCountries: string[],
36
- excludeCountries: string[],
37
36
  preferredCountries?: string[],
38
37
  required?: boolean,
39
38
  value?: string,
@@ -89,7 +88,6 @@ const PhoneNumberInput = (props: PhoneNumberInputProps, ref?: React.MutableRefOb
89
88
  },
90
89
  onValidate = () => null,
91
90
  onlyCountries = [],
92
- excludeCountries = [],
93
91
  required = false,
94
92
  preferredCountries = [],
95
93
  value = "",
@@ -236,7 +234,6 @@ const PhoneNumberInput = (props: PhoneNumberInputProps, ref?: React.MutableRefOb
236
234
  const fallbackCountry =
237
235
  preferredCountries.length > 0 ? preferredCountries[0] :
238
236
  onlyCountries.length > 0 ? onlyCountries.sort()[0] :
239
- excludeCountries.length > 0 ? excludeCountries.sort()[0] :
240
237
  "af";
241
238
 
242
239
  useEffect(() => {
@@ -247,7 +244,6 @@ const PhoneNumberInput = (props: PhoneNumberInputProps, ref?: React.MutableRefOb
247
244
  autoInsertDialCode: false,
248
245
  initialCountry: initialCountry || fallbackCountry,
249
246
  onlyCountries,
250
- excludeCountries,
251
247
  countrySearch: countrySearch,
252
248
  fixDropdownWidth: false,
253
249
  formatAsYouType: formatAsYouType,
@@ -6,7 +6,7 @@ const PhoneNumberInputOnlyCountries = (props) => (
6
6
  <PhoneNumberInput
7
7
  id='only'
8
8
  onlyCountries={['us', 'br']}
9
- {...props}
9
+ {...props}
10
10
  />
11
11
  </>
12
12
  )
@@ -4,8 +4,7 @@ examples:
4
4
  - phone_number_input_default: Default
5
5
  - phone_number_input_preferred_countries: Preferred Countries
6
6
  - phone_number_input_initial_country: Initial Country
7
- - phone_number_input_only_countries: Only Countries
8
- - phone_number_input_exclude_countries: Exclude Countries
7
+ - phone_number_input_only_countries: Limited Countries
9
8
  - phone_number_input_validation: Form Validation
10
9
  - phone_number_input_clear_field: Clearing the Input Field
11
10
  - phone_number_input_access_input_element: Accessing the Input Element
@@ -16,9 +15,9 @@ examples:
16
15
  - phone_number_input_default: Default
17
16
  - phone_number_input_preferred_countries: Preferred Countries
18
17
  - phone_number_input_initial_country: Initial Country
19
- - phone_number_input_only_countries: Only Countries
20
- - phone_number_input_exclude_countries: Exclude Countries
18
+ - phone_number_input_only_countries: Limited Countries
21
19
  - phone_number_input_validation: Form Validation
22
20
  - phone_number_input_format: Format as You Type
23
21
  - phone_number_input_hidden_inputs: Hidden Inputs
24
22
  - phone_number_input_country_search: Country Search
23
+
@@ -2,7 +2,6 @@ export { default as PhoneNumberInputDefault } from './_phone_number_input_defaul
2
2
  export { default as PhoneNumberInputPreferredCountries } from './_phone_number_input_preferred_countries'
3
3
  export { default as PhoneNumberInputInitialCountry } from './_phone_number_input_initial_country'
4
4
  export { default as PhoneNumberInputOnlyCountries } from './_phone_number_input_only_countries'
5
- export { default as PhoneNumberInputExcludeCountries } from './_phone_number_input_exclude_countries'
6
5
  export { default as PhoneNumberInputValidation } from './_phone_number_input_validation'
7
6
  export { default as PhoneNumberInputClearField } from './_phone_number_input_clear_field'
8
7
  export { default as PhoneNumberInputAccessInputElement } from './_phone_number_input_access_input_element'
@@ -15,8 +15,6 @@ module Playbook
15
15
  default: ""
16
16
  prop :only_countries, type: Playbook::Props::Array,
17
17
  default: []
18
- prop :exclude_countries, type: Playbook::Props::Array,
19
- default: []
20
18
  prop :preferred_countries, type: Playbook::Props::Array,
21
19
  default: []
22
20
  prop :error, type: Playbook::Props::String,
@@ -46,7 +44,6 @@ module Playbook
46
44
  label: label,
47
45
  name: name,
48
46
  onlyCountries: only_countries,
49
- excludeCountries: exclude_countries,
50
47
  preferredCountries: preferred_countries,
51
48
  required: required,
52
49
  value: value,
@@ -13,24 +13,19 @@ export default class PbPopover extends PbEnhancedElement {
13
13
  }
14
14
 
15
15
  moveTooltip() {
16
- let container: HTMLElement | null = document.querySelector('body');
16
+ let container: HTMLElement | null;
17
17
 
18
18
  if (this.appendTo === "parent") {
19
- container = this.element.parentElement && this.element.parentElement
19
+ container = this.element.parentElement;
20
20
  } else if (this.appendTo) {
21
- container = document.querySelector(this.appendTo)
21
+ container = document.querySelector(this.appendTo);
22
22
  }
23
23
 
24
- container.appendChild(this.tooltip);
24
+ (container || document.body).appendChild(this.tooltip);
25
25
  }
26
26
 
27
27
  connect() {
28
- if (!this.triggerElement || !this.tooltip) {
29
- console.warn('Popover requires both trigger and tooltip elements to be defined.')
30
- return
31
- }
32
28
  this.moveTooltip()
33
-
34
29
  this.popper = createPopper (this.triggerElement, this.tooltip, {
35
30
  placement: this.position as Placement,
36
31
  strategy: 'fixed',
@@ -18,7 +18,7 @@
18
18
  checked: true,
19
19
  value: "checkbox-value",
20
20
  name: "main-checkbox-selectable",
21
- indeterminate_main: true,
21
+ indeterminate: true,
22
22
  id: "checkbox-selectable"
23
23
  }) %>
24
24
  <% end %>
@@ -33,7 +33,7 @@
33
33
  <% checkboxes.each_with_index do |checkbox, index| %>
34
34
  <%= pb_rails("table/table_row") do %>
35
35
  <%= pb_rails("table/table_cell") do %>
36
- <%= pb_rails("checkbox", props: { checked: checkbox[:checked], id: "#{checkbox[:id]}-selectable-checkbox", name: "#{checkbox[:id]}-selectable-checkbox", on_change: "updateCheckboxes(#{index})", value: "check-box value", indeterminate_parent: "checkbox-selectable" }) %>
36
+ <%= pb_rails("checkbox", props: { checked: checkbox[:checked], id: "#{checkbox[:id]}-selectable-checkbox", name: "#{checkbox[:id]}-selectable-checkbox", on_change: "updateCheckboxes(#{index})", value: "check-box value" }) %>
37
37
  <% end %>
38
38
  <%= pb_rails("table/table_cell") do %>
39
39
  <%= pb_rails("image", props: { alt: "picture of a misty forest", size: "xs", url: "https://unsplash.it/500/400/?image=634" }) %>
@@ -45,4 +45,52 @@
45
45
  <% end %>
46
46
  <% end %>
47
47
  <% end %>
48
- <% end %>
48
+ <% end %>
49
+
50
+ <script>
51
+ document.addEventListener('DOMContentLoaded', function() {
52
+ const mainCheckboxWrapper = document.getElementById('checkbox-selectable');
53
+ const mainCheckbox = document.getElementsByName("main-checkbox-selectable")[0];
54
+ const childCheckboxes = document.querySelectorAll('input[type="checkbox"][id$="selectable-checkbox"]');
55
+ const deleteButton = document.getElementById('delete-button');
56
+
57
+ const updateDeleteButton = () => {
58
+ const anyChecked = Array.from(childCheckboxes).some(checkbox => checkbox.checked);
59
+ deleteButton.style.display = anyChecked ? 'block' : 'none';
60
+ };
61
+
62
+ const updateMainCheckbox = () => {
63
+ // Count the number of checked child checkboxes
64
+ const checkedCount = Array.from(childCheckboxes).filter(cb => cb.checked).length;
65
+ // Determine if the main checkbox should be in an indeterminate state
66
+ const indeterminate = checkedCount > 0 && checkedCount < childCheckboxes.length;
67
+
68
+ // Set the main checkbox states
69
+ mainCheckbox.indeterminate = indeterminate;
70
+ mainCheckbox.checked = checkedCount > 0;
71
+
72
+ // Determine the icon class to add and remove based on the number of checked checkboxes
73
+ const iconClassToAdd = checkedCount === 0 ? 'pb_checkbox_checkmark' : 'pb_checkbox_indeterminate';
74
+ const iconClassToRemove = checkedCount === 0 ? 'pb_checkbox_indeterminate' : 'pb_checkbox_checkmark';
75
+
76
+ // Add and remove the icon class to the main checkbox wrapper
77
+ mainCheckboxWrapper.querySelector('[data-pb-checkbox-icon-span]').classList.add(iconClassToAdd);
78
+ mainCheckboxWrapper.querySelector('[data-pb-checkbox-icon-span]').classList.remove(iconClassToRemove);
79
+
80
+ // Toggle the visibility of the checkbox icon based on the indeterminate state
81
+ mainCheckboxWrapper.getElementsByClassName("indeterminate_icon")[0].classList.toggle('hidden', !indeterminate);
82
+ mainCheckboxWrapper.getElementsByClassName("check_icon")[0].classList.toggle('hidden', indeterminate);
83
+
84
+ updateDeleteButton();
85
+ };
86
+
87
+ mainCheckbox.addEventListener('change', function() {
88
+ childCheckboxes.forEach(cb => cb.checked = this.checked);
89
+ updateMainCheckbox();
90
+ });
91
+
92
+ childCheckboxes.forEach(cb => {
93
+ cb.addEventListener('change', updateMainCheckbox);
94
+ });
95
+ });
96
+ </script>
@@ -3,7 +3,7 @@
3
3
  @import "../../pb_caption/caption_mixin";
4
4
 
5
5
  @media only screen and (max-width: $screen-xs-max) {
6
- [class^=pb_table]:not(.table-responsive-scroll) {
6
+ [class^=pb_table] {
7
7
  &.table-sm.table-collapse-sm,
8
8
  &.table-md.table-collapse-sm,
9
9
  &.table-lg.table-collapse-sm {