playbook_ui 14.18.0.pre.alpha.revert4567revert4553PLAY2056ATcolbordercolors7469 → 14.18.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 (189) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_advanced_table/Components/RegularTableView.tsx +3 -23
  3. data/app/pb_kits/playbook/pb_advanced_table/Components/TableHeaderCell.tsx +3 -67
  4. data/app/pb_kits/playbook/pb_advanced_table/Hooks/useTableActions.ts +2 -1
  5. data/app/pb_kits/playbook/pb_advanced_table/Utilities/ExpansionControlHelpers.tsx +19 -29
  6. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +143 -365
  7. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +1 -14
  8. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.rb +1 -6
  9. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props.html.erb +1 -1
  10. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props.jsx +2 -1
  11. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_rails.md +2 -2
  12. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_react.md +1 -1
  13. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header_rails.md +2 -6
  14. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header_react.md +2 -6
  15. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +3 -10
  16. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +1 -6
  17. data/app/pb_kits/playbook/pb_advanced_table/index.js +0 -7
  18. data/app/pb_kits/playbook/pb_advanced_table/table_row.html.erb +1 -1
  19. data/app/pb_kits/playbook/pb_circle_chart/_circle_chart.tsx +1 -1
  20. data/app/pb_kits/playbook/pb_circle_chart/circleChart.test.js +2 -2
  21. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_block.html.erb +2 -2
  22. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_block.jsx +1 -1
  23. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_colors.html.erb +1 -1
  24. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_colors.jsx +1 -1
  25. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_custom_tooltip.html.erb +1 -1
  26. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_custom_tooltip.jsx +1 -1
  27. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_default.html.erb +1 -1
  28. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_default.jsx +1 -1
  29. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_legend_position.html.erb +1 -1
  30. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_legend_position.jsx +1 -1
  31. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_live_data.jsx +2 -2
  32. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_rounded.html.erb +1 -1
  33. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_rounded.jsx +1 -1
  34. data/app/pb_kits/playbook/pb_circle_chart/docs/example.yml +3 -2
  35. data/app/pb_kits/playbook/pb_circle_chart/docs/index.js +1 -2
  36. data/app/pb_kits/playbook/pb_circle_icon_button/_circle_icon_button.scss +1 -39
  37. data/app/pb_kits/playbook/pb_circle_icon_button/_circle_icon_button.tsx +0 -4
  38. data/app/pb_kits/playbook/pb_circle_icon_button/circle_icon_button.rb +1 -9
  39. data/app/pb_kits/playbook/pb_circle_icon_button/circle_icon_button.test.js +0 -14
  40. data/app/pb_kits/playbook/pb_circle_icon_button/docs/example.yml +0 -2
  41. data/app/pb_kits/playbook/pb_circle_icon_button/docs/index.js +0 -1
  42. data/app/pb_kits/playbook/pb_copy_button/_copy_button.tsx +45 -19
  43. data/app/pb_kits/playbook/pb_copy_button/docs/example.yml +0 -2
  44. data/app/pb_kits/playbook/pb_copy_button/docs/index.js +1 -2
  45. data/app/pb_kits/playbook/pb_copy_button/index.js +20 -46
  46. data/app/pb_kits/playbook/pb_date_picker/_date_picker.tsx +0 -12
  47. data/app/pb_kits/playbook/pb_date_picker/date_picker.rb +0 -12
  48. data/app/pb_kits/playbook/pb_date_picker/date_picker_helper.ts +1 -50
  49. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_error.jsx +1 -4
  50. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_quick_pick_rails.md +0 -4
  51. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_quick_pick_range_limit.md +1 -1
  52. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_quick_pick_react.md +1 -5
  53. data/app/pb_kits/playbook/pb_date_picker/docs/example.yml +0 -2
  54. data/app/pb_kits/playbook/pb_date_picker/docs/index.js +0 -1
  55. data/app/pb_kits/playbook/pb_date_picker/plugins/quickPick.tsx +0 -10
  56. data/app/pb_kits/playbook/pb_dialog/dialog.html.erb +1 -10
  57. data/app/pb_kits/playbook/pb_dialog/dialog.rb +0 -2
  58. data/app/pb_kits/playbook/pb_dialog/docs/example.yml +0 -1
  59. data/app/pb_kits/playbook/pb_dialog/index.js +14 -106
  60. data/app/pb_kits/playbook/pb_draggable/docs/example.yml +1 -3
  61. data/app/pb_kits/playbook/pb_draggable/draggable.rb +1 -9
  62. data/app/pb_kits/playbook/pb_draggable/index.js +142 -139
  63. data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +1 -1
  64. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_error.jsx +1 -4
  65. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownOption.tsx +1 -1
  66. data/app/pb_kits/playbook/pb_filter/docs/example.yml +0 -1
  67. data/app/pb_kits/playbook/pb_form_group/_form_group.scss +3 -23
  68. data/app/pb_kits/playbook/pb_form_group/docs/_form_group_select.html.erb +5 -15
  69. data/app/pb_kits/playbook/pb_form_group/docs/_form_group_select.jsx +6 -39
  70. data/app/pb_kits/playbook/pb_gauge/docs/example.yml +0 -1
  71. data/app/pb_kits/playbook/pb_gauge/docs/index.js +0 -1
  72. data/app/pb_kits/playbook/pb_layout/_layout.scss +1 -70
  73. data/app/pb_kits/playbook/pb_layout/_layout.tsx +2 -29
  74. data/app/pb_kits/playbook/pb_layout/docs/_layout_bracket.jsx +118 -322
  75. data/app/pb_kits/playbook/pb_layout/docs/_layout_bracket.md +1 -1
  76. data/app/pb_kits/playbook/pb_layout/subcomponents/_game.tsx +43 -74
  77. data/app/pb_kits/playbook/pb_layout/subcomponents/_round.tsx +4 -21
  78. data/app/pb_kits/playbook/pb_line_graph/docs/example.yml +0 -1
  79. data/app/pb_kits/playbook/pb_line_graph/docs/index.js +0 -1
  80. data/app/pb_kits/playbook/pb_overlay/_overlay.scss +22 -83
  81. data/app/pb_kits/playbook/pb_overlay/_overlay.tsx +7 -39
  82. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_default.md +7 -1
  83. data/app/pb_kits/playbook/pb_overlay/docs/example.yml +0 -5
  84. data/app/pb_kits/playbook/pb_overlay/docs/index.js +0 -5
  85. data/app/pb_kits/playbook/pb_overlay/overlay.test.jsx +1 -39
  86. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.scss +0 -13
  87. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.tsx +1 -3
  88. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_validation.jsx +1 -8
  89. data/app/pb_kits/playbook/pb_phone_number_input/docs/example.yml +0 -2
  90. data/app/pb_kits/playbook/pb_phone_number_input/docs/index.js +0 -1
  91. data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.rb +0 -3
  92. data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.test.js +0 -19
  93. data/app/pb_kits/playbook/pb_popover/docs/example.yml +0 -1
  94. data/app/pb_kits/playbook/pb_popover/index.ts +1 -13
  95. data/app/pb_kits/playbook/pb_popover/popover.rb +0 -2
  96. data/app/pb_kits/playbook/pb_select/docs/_select_error.jsx +2 -7
  97. data/app/pb_kits/playbook/pb_table/_table.tsx +2 -2
  98. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_nested_rows.md +1 -3
  99. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_nested_rows_rails.md +1 -3
  100. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_nested_table.md +1 -3
  101. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_nested_table_rails.md +1 -3
  102. data/app/pb_kits/playbook/pb_table/styles/_collapsible.scss +1 -1
  103. data/app/pb_kits/playbook/pb_text_input/_text_input.tsx +5 -13
  104. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_error.jsx +1 -9
  105. data/app/pb_kits/playbook/pb_text_input/docs/example.yml +0 -2
  106. data/app/pb_kits/playbook/pb_text_input/docs/index.js +0 -1
  107. data/app/pb_kits/playbook/pb_text_input/inputMask.ts +1 -8
  108. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_error.jsx +1 -7
  109. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_error_state.jsx +2 -6
  110. data/dist/chunks/_typeahead-C2GOKWtm.js +22 -0
  111. data/dist/chunks/_weekday_stacked-CFGTPT0O.js +45 -0
  112. data/dist/chunks/lib-BGzBzFZX.js +29 -0
  113. data/dist/chunks/{pb_form_validation-BWjy4bFn.js → pb_form_validation-BvNy9Bd6.js} +1 -1
  114. data/dist/chunks/vendor.js +1 -1
  115. data/dist/menu.yml +2 -2
  116. data/dist/playbook-doc.js +1 -19
  117. data/dist/playbook-rails-react-bindings.js +1 -1
  118. data/dist/playbook-rails.js +1 -1
  119. data/dist/playbook.css +1 -1
  120. data/lib/playbook/version.rb +2 -2
  121. metadata +8 -71
  122. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color.jsx +0 -80
  123. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color.md +0 -3
  124. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color_rails.html.erb +0 -58
  125. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color_rails.md +0 -3
  126. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_expand_by_depth.jsx +0 -66
  127. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_expand_by_depth.md +0 -10
  128. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_sticky_columns.jsx +0 -58
  129. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_sticky_columns.md +0 -6
  130. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_sticky_columns_and_header.jsx +0 -64
  131. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_sticky_columns_and_header.md +0 -8
  132. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_sticky_header.jsx +0 -55
  133. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_sticky_header.md +0 -3
  134. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_sticky_header_rails.html.erb +0 -33
  135. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_sticky_header_rails.md +0 -3
  136. data/app/pb_kits/playbook/pb_advanced_table/scss_partials/advanced_table_sticky_mixin.scss +0 -97
  137. data/app/pb_kits/playbook/pb_circle_chart/circleChartTheme.ts +0 -53
  138. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_pb_styles.jsx +0 -38
  139. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_pb_styles.md +0 -1
  140. data/app/pb_kits/playbook/pb_circle_icon_button/docs/_circle_icon_button_size.html.erb +0 -28
  141. data/app/pb_kits/playbook/pb_circle_icon_button/docs/_circle_icon_button_size.jsx +0 -42
  142. data/app/pb_kits/playbook/pb_circle_icon_button/docs/_circle_icon_button_size.md +0 -1
  143. data/app/pb_kits/playbook/pb_copy_button/docs/_copy_button_hook.jsx +0 -54
  144. data/app/pb_kits/playbook/pb_copy_button/docs/_copy_button_hook.md +0 -3
  145. data/app/pb_kits/playbook/pb_copy_button/docs/_copy_button_hook_rails.html.erb +0 -14
  146. data/app/pb_kits/playbook/pb_copy_button/docs/_copy_button_hook_rails.md +0 -3
  147. data/app/pb_kits/playbook/pb_copy_button/usePBCopy.ts +0 -45
  148. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_range_pattern.jsx +0 -34
  149. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_range_pattern.md +0 -14
  150. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_range_pattern_rails.html.erb +0 -20
  151. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_range_pattern_rails.md +0 -14
  152. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_turbo_frames.html.erb +0 -117
  153. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_turbo_frames_rails.md +0 -9
  154. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones.html.erb +0 -43
  155. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_colors.html.erb +0 -55
  156. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_colors_rails.md +0 -1
  157. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_event_listeners.html.erb +0 -42
  158. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_event_listeners.md +0 -1
  159. data/app/pb_kits/playbook/pb_filter/docs/_filter_within_turbo_frames.html.erb +0 -41
  160. data/app/pb_kits/playbook/pb_filter/docs/_filter_within_turbo_frames.md +0 -1
  161. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_pb_styles.jsx +0 -30
  162. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_pb_styles.md +0 -1
  163. data/app/pb_kits/playbook/pb_gauge/gaugeTheme.ts +0 -85
  164. data/app/pb_kits/playbook/pb_layout/subcomponents/_participant.tsx +0 -79
  165. data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_pb_styles.jsx +0 -52
  166. data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_pb_styles.md +0 -1
  167. data/app/pb_kits/playbook/pb_line_graph/lineGraphTheme.ts +0 -110
  168. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_color.jsx +0 -63
  169. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_color.md +0 -3
  170. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_fullscreen_background.jsx +0 -49
  171. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_fullscreen_background.md +0 -1
  172. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_fullscreen_opacity.jsx +0 -81
  173. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_fullscreen_opacity.md +0 -1
  174. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_gradient_opacity.jsx +0 -39
  175. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_gradient_opacity.md +0 -1
  176. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_layout.jsx +0 -40
  177. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_layout.md +0 -5
  178. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_country_search.html.erb +0 -10
  179. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_country_search.jsx +0 -20
  180. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_country_search.md +0 -1
  181. data/app/pb_kits/playbook/pb_popover/docs/_popover_append_to.html.erb +0 -46
  182. data/app/pb_kits/playbook/pb_popover/docs/_popover_append_to.md +0 -1
  183. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_sanitize.jsx +0 -94
  184. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_sanitize.md +0 -1
  185. data/dist/chunks/_typeahead-D8CsVBZO.js +0 -22
  186. data/dist/chunks/_weekday_stacked-D3oLTSkH.js +0 -45
  187. data/dist/chunks/lib-BmTAc7Nc.js +0 -29
  188. /data/app/pb_kits/playbook/pb_draggable/docs/{_draggable_drop_zones_react.md → _draggable_drop_zones.md} +0 -0
  189. /data/app/pb_kits/playbook/pb_draggable/docs/{_draggable_drop_zones_colors_react.md → _draggable_drop_zones_colors.md} +0 -0
@@ -1,4 +1,5 @@
1
- import React from 'react'
1
+
2
+ import React, { useState } from 'react'
2
3
  import classnames from 'classnames'
3
4
  import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
4
5
  import { globalProps } from '../utilities/globalProps'
@@ -6,19 +7,16 @@ import { globalProps } from '../utilities/globalProps'
6
7
  import Button from '../pb_button/_button'
7
8
  import Tooltip from '../pb_tooltip/_tooltip'
8
9
 
9
- import usePBCopy from './usePBCopy'
10
-
11
10
  type CopyButtonProps = {
12
- aria?: { [key: string]: string }
13
- className?: string
14
- data?: { [key: string]: string }
15
- id?: string
16
- from?: string
17
- text?: string
18
- tooltipPlacement?: 'top' | 'right' | 'bottom' | 'left'
19
- tooltipText?: string
20
- value?: string
21
- timeout?: number
11
+ aria?: { [key: string]: string },
12
+ className?: string,
13
+ data?: { [key: string]: string },
14
+ id?: string,
15
+ from?: string,
16
+ text?: string,
17
+ tooltipPlacement?: "top" | "right" | "bottom" | "left",
18
+ tooltipText?: string,
19
+ value?: string,
22
20
  }
23
21
 
24
22
  const CopyButton = (props: CopyButtonProps) => {
@@ -29,34 +27,62 @@ const CopyButton = (props: CopyButtonProps) => {
29
27
  from = '',
30
28
  id,
31
29
  text= 'Copy',
32
- timeout = 1000,
33
30
  tooltipPlacement= 'bottom',
34
31
  tooltipText = 'Copied!',
35
32
  value = '',
36
33
  } = props
37
34
 
38
- const [copied, copy] = usePBCopy({ value, from, timeout })
35
+ const [copied, setCopied] = useState(false)
39
36
 
40
37
  const ariaProps = buildAriaProps(aria)
41
38
  const dataProps = buildDataProps(data)
42
39
  const classes = classnames(buildCss('pb_copy_button_kit'), globalProps(props), className)
43
40
 
41
+ const copy = () => {
42
+ if (!from && !value) {
43
+ return
44
+ }
45
+
46
+ if (value) {
47
+ navigator.clipboard.writeText(value)
48
+ } else if (from) {
49
+ const copyElement = document.getElementById(from);
50
+ let copyText = copyElement?.innerText
51
+
52
+ if (copyElement instanceof HTMLTextAreaElement || copyElement instanceof HTMLInputElement) {
53
+ copyText = copyElement.value;
54
+ }
55
+
56
+ if (copyText) {
57
+ navigator.clipboard.writeText(copyText)
58
+ }
59
+ }
60
+
61
+ setCopied(true)
62
+
63
+ setTimeout(() => {
64
+ setCopied(false)
65
+ }, 1000);
66
+ }
67
+
44
68
  return (
45
- <div {...ariaProps}
69
+ <div
70
+ {...ariaProps}
46
71
  {...dataProps}
47
72
  className={classes}
48
73
  id={id}
49
74
  >
50
- <Tooltip
75
+ <Tooltip
51
76
  forceOpenTooltip={copied}
52
77
  placement={tooltipPlacement}
53
78
  showTooltip={false}
54
79
  text={tooltipText}
55
80
  >
56
- <Button icon="copy"
81
+ <Button
82
+ icon='copy'
57
83
  onClick={copy}
58
84
  >
59
- {text}
85
+ { text }
60
86
  </Button>
61
87
  </Tooltip>
62
88
  </div>
@@ -2,9 +2,7 @@ examples:
2
2
  rails:
3
3
  - copy_button_default: Default
4
4
  - copy_button_from: Copy From
5
- - copy_button_hook_rails: Copy Hook
6
5
 
7
6
  react:
8
7
  - copy_button_default: Default
9
8
  - copy_button_from: Copy From
10
- - copy_button_hook: Copy Hook
@@ -1,3 +1,2 @@
1
1
  export { default as CopyButtonDefault } from './_copy_button_default.jsx'
2
- export { default as CopyButtonFrom } from './_copy_button_from.jsx'
3
- export { default as CopyButtonHook } from './_copy_button_hook.jsx'
2
+ export { default as CopyButtonFrom } from './_copy_button_from.jsx'
@@ -1,33 +1,6 @@
1
1
  import PbEnhancedElement from "../pb_enhanced_element"
2
2
 
3
- function getTextFromElement(element) {
4
- if (!element) return ''
5
- return element.tagName.toLowerCase() === 'input'
6
- ? element.value
7
- : element.innerText
8
- }
9
-
10
- function copyTextToClipboard(text) {
11
- if (!text) return
12
- navigator.clipboard.writeText(text)
13
- .catch(err => console.error('Failed to copy text:', err))
14
- }
15
-
16
- function handleExternalControlCopyClick(element) {
17
- const value = element.getAttribute('data-external-copy-value')
18
- const fromId = element.getAttribute('data-external-copy-from')
19
-
20
- if (value) {
21
- copyTextToClipboard(value)
22
- } else if (fromId) {
23
- const fromElement = document.querySelector(`#${fromId}`)
24
- copyTextToClipboard(getTextFromElement(fromElement))
25
- } else {
26
- console.warn('Failed to copy:', element)
27
- }
28
- }
29
-
30
- export class PbCopyButton extends PbEnhancedElement {
3
+ export default class PbCopyButton extends PbEnhancedElement {
31
4
  static get selector() {
32
5
  return '.pb_copy_button_kit'
33
6
  }
@@ -47,27 +20,28 @@ export class PbCopyButton extends PbEnhancedElement {
47
20
  }
48
21
 
49
22
  handleClick() {
50
- const value = this.element.getAttribute('data-copy-value')
51
23
  const fromId = this.element.getAttribute('data-from')
52
-
53
- if (value) {
54
- copyTextToClipboard(value)
55
- } else if (fromId) {
24
+ if (fromId) {
56
25
  const fromElement = document.querySelector(`#${fromId}`)
57
- copyTextToClipboard(getTextFromElement(fromElement))
26
+ if (fromElement) {
27
+ let contentToCopy = ''
28
+ if (fromElement.tagName.toLowerCase() === 'input') {
29
+ contentToCopy = fromElement.value
30
+ } else {
31
+ contentToCopy = fromElement.innerText
32
+ }
33
+ navigator.clipboard.writeText(contentToCopy)
34
+ .catch(err => console.error('Failed to copy text', err))
35
+ return
36
+ }
37
+ }
38
+
39
+ const textToCopy = this.element.getAttribute('data-copy-value')
40
+ if (textToCopy) {
41
+ navigator.clipboard.writeText(textToCopy)
42
+ .catch(err => console.error('Failed to copy text', err))
58
43
  } else {
59
- console.warn('No data-copy-value or data-from attribute found')
44
+ console.warn('No data-copy-value attribute found or data-from element')
60
45
  }
61
46
  }
62
47
  }
63
-
64
- export function addCopyEventListeners() {
65
- const externalCopyElements = [
66
- ...document.querySelectorAll('div[data-external-copy-value]'),
67
- ...document.querySelectorAll('div[data-external-copy-from]')
68
- ]
69
-
70
- externalCopyElements.forEach(element => {
71
- element.addEventListener('click', () => handleExternalControlCopyClick(element))
72
- })
73
- }
@@ -50,10 +50,6 @@ type DatePickerProps = {
50
50
  timeFormat?: string,
51
51
  type?: string,
52
52
  yearRange?: number[],
53
- controlsStartId?: string,
54
- controlsEndId?: string,
55
- syncStartWith?: string,
56
- syncEndWith?: string,
57
53
  } & GlobalProps
58
54
 
59
55
  const DatePicker = (props: DatePickerProps): React.ReactElement => {
@@ -102,10 +98,6 @@ const DatePicker = (props: DatePickerProps): React.ReactElement => {
102
98
  staticPosition = true,
103
99
  thisRangesEndToday = false,
104
100
  yearRange = [1900, 2100],
105
- controlsStartId,
106
- controlsEndId,
107
- syncStartWith,
108
- syncEndWith,
109
101
  } = props
110
102
 
111
103
  const ariaProps = buildAriaProps(aria)
@@ -142,10 +134,6 @@ const DatePicker = (props: DatePickerProps): React.ReactElement => {
142
134
  staticPosition,
143
135
  thisRangesEndToday,
144
136
  yearRange,
145
- controlsStartId,
146
- controlsEndId,
147
- syncStartWith,
148
- syncEndWith,
149
137
  required: false,
150
138
  }, scrollContainer)
151
139
  }, initializeOnce ? [] : undefined)
@@ -77,14 +77,6 @@ module Playbook
77
77
  default: ""
78
78
  prop :validation_message, type: Playbook::Props::String,
79
79
  default: ""
80
- prop :controls_start_id, type: Playbook::Props::String,
81
- default: ""
82
- prop :controls_end_id, type: Playbook::Props::String,
83
- default: ""
84
- prop :sync_start_with, type: Playbook::Props::String,
85
- default: ""
86
- prop :sync_end_with, type: Playbook::Props::String,
87
- default: ""
88
80
 
89
81
  def classname
90
82
  default_margin_bottom = margin_bottom.present? ? "" : " mb_sm"
@@ -116,10 +108,6 @@ module Playbook
116
108
  staticPosition: static_position,
117
109
  thisRangesEndToday: this_ranges_end_today,
118
110
  yearRange: year_range,
119
- controlsStartId: controls_start_id,
120
- controlsEndId: controls_end_id,
121
- syncStartWith: sync_start_with,
122
- syncEndWith: sync_end_with,
123
111
  }.to_json.html_safe
124
112
  end
125
113
 
@@ -32,11 +32,7 @@ type DatePickerConfig = {
32
32
  thisRangesEndToday?: boolean,
33
33
  timeCaption?: string,
34
34
  timeFormat?: string,
35
- yearRange: number[],
36
- controlsStartId?: string,
37
- controlsEndId?: string,
38
- syncStartWith?: string,
39
- syncEndWith?: string,
35
+ yearRange: number[]
40
36
  } & Pick<BaseOptions, "allowInput" | "defaultDate" | "enableTime" | "maxDate" | "minDate" | "mode" | "plugins" | "position" | "positionElement" >
41
37
 
42
38
  const datePickerHelper = (config: DatePickerConfig, scrollContainer: string | HTMLElement) => {
@@ -71,10 +67,6 @@ const datePickerHelper = (config: DatePickerConfig, scrollContainer: string | HT
71
67
  timeCaption = 'Select Time',
72
68
  timeFormat = 'at h:i K',
73
69
  yearRange,
74
- controlsStartId,
75
- controlsEndId,
76
- syncStartWith,
77
- syncEndWith,
78
70
  } = config
79
71
 
80
72
  // ===========================================================
@@ -283,47 +275,6 @@ const datePickerHelper = (config: DatePickerConfig, scrollContainer: string | HT
283
275
  })
284
276
  }
285
277
 
286
- // === Automatic Sync Logic for 3 input range pattern===
287
-
288
- // If this is a quickpick that controls start and end
289
- if (selectionType === "quickpick" && (controlsStartId || controlsEndId)) {
290
- picker.config.onClose.push((selectedDates:string) => {
291
- const [start, end] = selectedDates;
292
-
293
- if (controlsStartId) {
294
- const startPicker = (document.querySelector(`#${controlsStartId}`) as HTMLElement & { _flatpickr?: any })?._flatpickr;
295
- startPicker?.setDate(start, true);
296
- }
297
-
298
- if (controlsEndId) {
299
- const endPicker = (document.querySelector(`#${controlsEndId}`) as HTMLElement & { _flatpickr?: any })?._flatpickr;
300
- endPicker?.setDate(end, true);
301
- }
302
- });
303
- }
304
-
305
- // If this is a start picker that syncs with a quickpick
306
- if (syncStartWith) {
307
- picker.config.onClose.push((selectedDates: string) => {
308
- if (selectedDates?.length) {
309
- const quickpick = (document.querySelector(`#${syncStartWith}`) as HTMLElement & { _flatpickr?: any })?._flatpickr;
310
- quickpick?.clear();
311
- }
312
- });
313
- }
314
-
315
- // If this is an end picker that syncs with a quickpick
316
- if (syncEndWith) {
317
- picker.config.onClose.push((selectedDates: string) => {
318
- if (selectedDates?.length) {
319
- const quickpick = (document.querySelector(`#${syncEndWith}`) as HTMLElement & { _flatpickr?: any })?._flatpickr;
320
- quickpick?.clear();
321
- }
322
- });
323
- }
324
- // === End of Automatic Sync Logic ===
325
-
326
-
327
278
  // Adding dropdown icons to year and month select
328
279
  dropdown.insertAdjacentHTML('afterend', `<i class="year-dropdown-icon">${angleDown}</i>`)
329
280
  if (picker.monthElements[0].parentElement) {
@@ -1,14 +1,11 @@
1
1
  import React from 'react'
2
2
 
3
3
  import DatePicker from '../_date_picker'
4
- import Icon from '../../pb_icon/_icon'
5
4
 
6
5
  const DatePickerError = (props) => (
7
6
  <div>
8
7
  <DatePicker
9
- error={<>
10
- <Icon icon="warning" /> Invalid date. Please pick a valid date.
11
- </>}
8
+ error="Invalid date. Please pick a valid date."
12
9
  pickerId="date-picker-error"
13
10
  {...props}
14
11
  />
@@ -1,7 +1,3 @@
1
- To use the `quickpick`:
2
- - prop `mode` must be set to `range`
3
- - prop `selection_type` must be set to `quickpick`
4
-
5
1
  This date range variant uses hidden inputs to handle start and end dates. While they are not required props, it is advisable to specify a unique `start_date_id`, `start_date_name`, `end_date_id`, and `end_date_name` for each quick pick instance you place in a form and/or on a page.
6
2
 
7
3
  Like all other date pickers, the quick pick does require a `picker_id`.
@@ -1 +1 @@
1
- Use `this_ranges_end_today`/`thisRangesEndToday` to set end date on all ranges that start with 'this' to today's date. For instance, by default 'This Year' will set end day to 12/31/(current year), but if the `this_ranges_end_today`/`thisRangesEndToday` prop is used, end date on that range will be today's date.
1
+ Because the Quick Pick variant has `allowInput` set to `true` by default, use the `onClose` handler function to access the startDate and endDate values. See the `onClose` example for details.
@@ -1,5 +1 @@
1
- To use the `quickpick`:
2
- - prop `mode` must be set to `range`
3
- - prop `selectionType` must be set to `quickpick`
4
-
5
- Use the `onClose` handler function to access the startDate and endDate values. Check the [`onClose` example](https://playbook.powerapp.cloud/kits/date_picker/react#onclose) for more information.
1
+ Use the `onChange` handler function to access the startDate and endDate values. Check the [`onChange` example](https://playbook.powerapp.cloud/kits/date_picker/react#onchange) for more information.
@@ -15,7 +15,6 @@ examples:
15
15
  - date_picker_quick_pick_custom: Custom Quick Pick Dates
16
16
  - date_picker_quick_pick_custom_override: Custom Quick Pick Dates (append to defaults)
17
17
  - date_picker_quick_pick_default_date: Range (Quick Pick w/ Default Date)
18
- - date_picker_range_pattern_rails: Range with 2 Date Pickers and a Quick Pick
19
18
  - date_picker_format: Format
20
19
  - date_picker_disabled: Disabled Dates
21
20
  - date_picker_min_max: Min Max
@@ -48,7 +47,6 @@ examples:
48
47
  - date_picker_quick_pick_custom: Custom Quick Pick Dates
49
48
  - date_picker_quick_pick_custom_override: Custom Quick Pick Dates (append to defaults)
50
49
  - date_picker_quick_pick_default_date: Range (Quick Pick w/ Default Date)
51
- - date_picker_range_pattern: Range with 2 Date Pickers and a Quick Pick
52
50
  - date_picker_format: Format
53
51
  - date_picker_disabled: Disabled Dates
54
52
  - date_picker_min_max: Min Max
@@ -26,4 +26,3 @@ export { default as DatePickerOnClose } from './_date_picker_on_close.jsx'
26
26
  export { default as DatePickerQuickPickCustom } from './_date_picker_quick_pick_custom'
27
27
  export { default as DatePickerQuickPickCustomOverride } from './_date_picker_quick_pick_custom_override'
28
28
  export { default as DatePickerQuickPickDefaultDate } from './_date_picker_quick_pick_default_date'
29
- export { default as DatePickerRangePattern } from './_date_picker_range_pattern'
@@ -238,16 +238,6 @@ const quickPickPlugin = (thisRangesEndToday: boolean, customQuickPickDates: cust
238
238
  },
239
239
 
240
240
  onClose(selectedDates: Array<Date>) {
241
- // Patch .clear() to also remove active state if cleared
242
- const originalClear = fp.clear;
243
- fp.clear = function (...args: any) {
244
- const current = pluginData.rangesNav.querySelector('.active');
245
- if (current) {
246
- current.classList.remove('active');
247
- }
248
- activeLabel = "";
249
- return originalClear.apply(this, args);
250
- };
251
241
  // remove the active class from the button if the selected dates don't match the label
252
242
  if (!isLabelMatchingSelectedDates(selectedDates)) {
253
243
  pluginData.rangesButtons[activeLabel]?.classList.remove('active');
@@ -1,16 +1,7 @@
1
1
  <div
2
2
  class="pb_dialog_wrapper_rails <%= object.full_height_style %>"
3
3
  data-pb-dialog-wrapper="true"
4
- data-overlay-click="<%= object.overlay_close %>"
5
- <% if object.custom_event_type.present? %>
6
- data-custom-event-type="<%= object.custom_event_type %>"
7
- <% end %>
8
- <% if object.confirm_button_id.present? %>
9
- data-confirm-button-id="<%= object.confirm_button_id %>"
10
- <% end %>
11
- <% if object.cancel_button_id.present? %>
12
- data-cancel-button-id="<%= object.cancel_button_id %>"
13
- <% end %>
4
+ data-overlay-click= <%= object.overlay_close %>
14
5
  >
15
6
  <%= pb_content_tag(:dialog) do %>
16
7
  <% if object.status === "" && object.title %>
@@ -21,8 +21,6 @@ module Playbook
21
21
  prop :status, type: Playbook::Props::Enum,
22
22
  values: ["info", "caution", "delete", "error", "success", "default", ""],
23
23
  default: ""
24
- prop :custom_event_type, type: Playbook::Props::String,
25
- default: ""
26
24
 
27
25
  def classname
28
26
  generate_classname("pb_dialog pb_dialog_rails pb_dialog_#{size}_#{placement}")
@@ -11,7 +11,6 @@ examples:
11
11
  - dialog_full_height: Full Height
12
12
  - dialog_full_height_placement: Full Height Placement
13
13
  - dialog_loading: Loading
14
- - dialog_turbo_frames: Within Turbo Frames
15
14
 
16
15
 
17
16
  react:
@@ -10,81 +10,6 @@ export default class PbDialog extends PbEnhancedElement {
10
10
  connect() {
11
11
  window.addEventListener("DOMContentLoaded", () => this.setupDialog())
12
12
  window.addEventListener("turbo:frame-load", () => this.setupDialog())
13
-
14
- // Code for custom_event_type setup (can take multiple events in a string separated by commas)
15
- const customEventTypeString = this.element.dataset.customEventType
16
- if (customEventTypeString && !this.element.hasAttribute("data-custom-event-handled")) {
17
- this.customEventTypes = customEventTypeString.split(",").map(e => e.trim()).filter(Boolean)
18
- this.customEventTypes.forEach(eventType => {
19
- window.addEventListener(eventType, this.handleCustomEvent)
20
- })
21
-
22
- this.element.setAttribute("data-custom-event-handled", "true")
23
- }
24
- }
25
-
26
- disconnect() {
27
- if (this.customEventTypes && Array.isArray(this.customEventTypes)) {
28
- this.customEventTypes.forEach(eventType => {
29
- window.removeEventListener(eventType, this.handleCustomEvent)
30
- })
31
- }
32
- }
33
-
34
- handleCustomEvent = (event) => {
35
- const dialogId = event.detail?.dialogId || this.element.querySelector("dialog")?.id
36
- const dialog = dialogId && document.getElementById(dialogId)
37
-
38
- if (!dialog) {
39
- console.warn(`[PbDialog] Could not find dialog with ID '${dialogId}'`)
40
- return
41
- }
42
-
43
- this.setupDialog()
44
-
45
- const action = event.detail?.action || 'open'
46
-
47
- // Known Actions - four "standard" dialog actions that felt like things devs might want to do
48
- const knownActions = ['open', 'close', 'clickConfirm', 'clickCancel'];
49
-
50
- if (knownActions.includes(action)) {
51
- switch (action) {
52
- case 'open':
53
- if (!dialog.open) dialog.showModal()
54
- break
55
- case 'close':
56
- if (dialog.open) dialog.close(event.detail?.returnValue)
57
- break
58
- case 'clickConfirm':
59
- this.triggerButtonClick(dialog, event, 'confirm')
60
- break
61
- case 'clickCancel':
62
- this.triggerButtonClick(dialog, event, 'cancel')
63
- break
64
- }
65
- }
66
- // Custom Actions - flexible for Turbo or other integration
67
- else if (typeof event.detail?.customAction === 'function') {
68
- event.detail.customAction({ dialog, event })
69
- } else if (window.pbDialogActions?.[action]) {
70
- // Can register custom actions globally
71
- window.pbDialogActions[action]({ dialog, event })
72
- } else {
73
- console.warn(`[PbDialog] Unknown action: ${action}`)
74
- }
75
- }
76
-
77
- triggerButtonClick(dialog, event, type) {
78
- const buttonId = event.detail?.[`${type}ButtonId`] ||
79
- dialog.closest('[data-pb-dialog-wrapper]')?.dataset[`${type}ButtonId`]
80
- const button = buttonId ? document.getElementById(buttonId) :
81
- dialog.querySelector(`[data-${type}-button]`)
82
-
83
- if (button) {
84
- button.click()
85
- } else {
86
- console.warn(`[PbDialog] Could not find ${type} button for dialog`)
87
- }
88
13
  }
89
14
 
90
15
  setupDialog() {
@@ -93,7 +18,7 @@ export default class PbDialog extends PbEnhancedElement {
93
18
  const dialogs = document.querySelectorAll(".pb_dialog_rails")
94
19
 
95
20
  const loadingButton = document.querySelector('[data-disable-with="Loading"]');
96
- if (loadingButton && !loadingButton.dataset.listenerAttached) {
21
+ if (loadingButton) {
97
22
  loadingButton.addEventListener("click", function () {
98
23
  const okayLoadingButton = document.querySelector('[data-disable-with="Loading"]');
99
24
  const cancelButton = document.querySelector('[data-disable-cancel-with="Loading"]');
@@ -110,42 +35,27 @@ export default class PbDialog extends PbEnhancedElement {
110
35
  okayLoadingButton.className = newClass;
111
36
  if (cancelButton) cancelButton.className = newCancelClass;
112
37
  });
113
-
114
- // Prevent multiple registrations
115
- loadingButton.dataset.listenerAttached = "true";
116
38
  }
117
-
118
- openTrigger.forEach((open) => {
119
- const originalClickHandler = open._openDialogClickHandler
120
- if (originalClickHandler) open.removeEventListener("click", originalClickHandler)
121
-
122
- open._openDialogClickHandler = () => {
123
- const openTriggerData = open.dataset.openDialog;
124
- const targetDialogOpen = document.getElementById(openTriggerData)
125
- if (targetDialogOpen && !targetDialogOpen.open) targetDialogOpen.showModal()
126
- };
127
39
 
128
- open.addEventListener("click", open._openDialogClickHandler)
40
+ openTrigger.forEach((open) => {
41
+ open.addEventListener("click", () => {
42
+ var openTriggerData = open.dataset.openDialog;
43
+ var targetDialog = document.getElementById(openTriggerData)
44
+ if (targetDialog.open) return;
45
+ targetDialog.showModal();
46
+ });
129
47
  });
130
48
 
131
49
  closeTrigger.forEach((close) => {
132
- const originalClickHandler = close._closeDialogClickHandler
133
- if (originalClickHandler) close.removeEventListener("click", originalClickHandler)
134
-
135
- close._closeDialogClickHandler = () => {
136
- const closeTriggerData = close.dataset.closeDialog;
137
- const targetDialogClose = document.getElementById(closeTriggerData)
138
- if (targetDialogClose) targetDialogClose.close();
139
- };
140
-
141
- close.addEventListener("click", close._closeDialogClickHandler)
50
+ close.addEventListener("click", () => {
51
+ var closeTriggerData = close.dataset.closeDialog;
52
+ document.getElementById(closeTriggerData).close();
53
+ });
142
54
  });
143
55
 
144
56
  // Close dialog box on outside click
145
57
  dialogs.forEach((dialogElement) => {
146
- const originalMousedownHandler = dialogElement._outsideClickHandler
147
- if (originalMousedownHandler) dialogElement.removeEventListener("mousedown", originalMousedownHandler)
148
- dialogElement._outsideClickHandler = (event) => {
58
+ dialogElement.addEventListener("mousedown", (event) => {
149
59
  const dialogParentDataset = dialogElement.parentElement.dataset
150
60
  if (dialogParentDataset.overlayClick === "overlay_close") return
151
61
 
@@ -159,9 +69,7 @@ export default class PbDialog extends PbEnhancedElement {
159
69
  dialogElement.close()
160
70
  event.stopPropagation()
161
71
  }
162
- }
163
-
164
- dialogElement.addEventListener("mousedown", dialogElement._outsideClickHandler);
72
+ })
165
73
  })
166
74
  }
167
75
  }
@@ -17,6 +17,4 @@ examples:
17
17
  - draggable_with_cards: Draggable with Cards
18
18
  - draggable_with_table: Draggable with Table
19
19
  - draggable_multiple_containers: Dragging Across Multiple Containers
20
- - draggable_drop_zones: Draggable Drop Zones
21
- - draggable_drop_zones_colors: Draggable Drop Zones Colors
22
- - draggable_event_listeners: Draggable Event Listeners
20
+
@@ -5,17 +5,9 @@ module Playbook
5
5
  class Draggable < ::Playbook::KitBase
6
6
  prop :initial_items, type: Playbook::Props::Array,
7
7
  default: []
8
- prop :drop_zone_type, type: Playbook::Props::Enum,
9
- values: %w[ghost shadow outline line],
10
- default: "ghost"
11
- prop :drop_zone_color, type: Playbook::Props::Enum,
12
- values: %w[neutral primary purple],
13
- default: "neutral"
14
8
 
15
9
  def data
16
- Hash(prop(:data)).merge(pb_draggable: true,
17
- drop_zone_type: drop_zone_type,
18
- drop_zone_color: drop_zone_color)
10
+ Hash(prop(:data)).merge(pb_draggable: true)
19
11
  end
20
12
 
21
13
  def classname