playbook_ui 14.14.0.pre.rc.3 → 14.14.0.pre.rc.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/_playbook.scss +0 -1
  3. data/app/pb_kits/playbook/pb_bar_graph/BarGraphStyles.scss +58 -0
  4. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_pb_styles.jsx +64 -0
  5. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_pb_styles.md +1 -0
  6. data/app/pb_kits/playbook/pb_bar_graph/docs/example.yml +1 -0
  7. data/app/pb_kits/playbook/pb_bar_graph/docs/index.js +1 -0
  8. data/app/pb_kits/playbook/pb_progress_pills/_progress_pills.scss +6 -1
  9. data/app/pb_kits/playbook/pb_progress_pills/_progress_pills.tsx +7 -5
  10. data/app/pb_kits/playbook/pb_progress_pills/docs/_progress_pills_default.html.erb +1 -0
  11. data/app/pb_kits/playbook/pb_progress_pills/docs/_progress_pills_default.jsx +7 -0
  12. data/app/pb_kits/playbook/pb_progress_pills/docs/_progress_pills_default.md +1 -0
  13. data/app/pb_kits/playbook/pb_progress_pills/docs/_progress_pills_full_width.html.erb +1 -0
  14. data/app/pb_kits/playbook/pb_progress_pills/docs/_progress_pills_full_width.jsx +18 -0
  15. data/app/pb_kits/playbook/pb_progress_pills/docs/_progress_pills_full_width_rails.md +1 -0
  16. data/app/pb_kits/playbook/pb_progress_pills/docs/_progress_pills_full_width_react.md +1 -0
  17. data/app/pb_kits/playbook/pb_progress_pills/docs/example.yml +2 -0
  18. data/app/pb_kits/playbook/pb_progress_pills/docs/index.js +1 -0
  19. data/app/pb_kits/playbook/pb_progress_pills/progress_pills.html.erb +1 -1
  20. data/app/pb_kits/playbook/pb_progress_pills/progress_pills.rb +6 -0
  21. data/app/pb_kits/playbook/pb_progress_pills/progress_pills.test.js +26 -1
  22. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible.jsx +1 -1
  23. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_click.html.erb +51 -0
  24. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_click_rails.md +2 -0
  25. data/app/pb_kits/playbook/pb_table/docs/example.yml +1 -0
  26. data/app/pb_kits/playbook/pb_table/index.ts +41 -9
  27. data/app/pb_kits/playbook/pb_table/styles/_collapsible.scss +4 -0
  28. data/app/pb_kits/playbook/pb_table/table_row.html.erb +1 -0
  29. data/app/pb_kits/playbook/pb_table/table_row.rb +10 -1
  30. data/dist/chunks/{_typeahead-C_q1qAtC.js → _typeahead-CAIQfP7X.js} +2 -2
  31. data/dist/chunks/_weekday_stacked-DstwbGUv.js +45 -0
  32. data/dist/chunks/{lib-WQEeEj3t.js → lib-D3us1bGD.js} +1 -1
  33. data/dist/chunks/{pb_form_validation-Cq64l4zn.js → pb_form_validation-BpihMSOQ.js} +1 -1
  34. data/dist/chunks/vendor.js +1 -1
  35. data/dist/menu.yml +0 -7
  36. data/dist/playbook-doc.js +1 -1
  37. data/dist/playbook-rails-react-bindings.js +1 -1
  38. data/dist/playbook-rails.js +1 -1
  39. data/dist/playbook.css +1 -1
  40. data/lib/playbook/version.rb +1 -1
  41. metadata +17 -23
  42. data/app/pb_kits/playbook/pb_avatar_action_button/_avatar_action_button.scss +0 -66
  43. data/app/pb_kits/playbook/pb_avatar_action_button/_avatar_action_button.tsx +0 -98
  44. data/app/pb_kits/playbook/pb_avatar_action_button/avatar_action_button.html.erb +0 -28
  45. data/app/pb_kits/playbook/pb_avatar_action_button/avatar_action_button.rb +0 -42
  46. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_actions.html.erb +0 -19
  47. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_actions.jsx +0 -26
  48. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_default.html.erb +0 -10
  49. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_default.jsx +0 -17
  50. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_on_click.jsx +0 -19
  51. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_onclick.html.erb +0 -16
  52. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_placement.html.erb +0 -35
  53. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_placement.jsx +0 -42
  54. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_tooltip.html.erb +0 -13
  55. data/app/pb_kits/playbook/pb_avatar_action_button/docs/example.yml +0 -15
  56. data/app/pb_kits/playbook/pb_avatar_action_button/docs/index.js +0 -4
  57. data/app/pb_kits/playbook/pb_avatar_action_button/pb_avatar_action_button.test.js +0 -31
  58. data/dist/chunks/_weekday_stacked-DCeouuO3.js +0 -45
  59. /data/app/pb_kits/playbook/pb_table/docs/{_table_with_collapsible_with_custom_click.md → _table_with_collapsible_with_custom_click_react.md} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0a2659b0154123970bd8603b86d5d89e44d148d198b1675eca357f394bbdf404
4
- data.tar.gz: b34b5df725809a814312250861cd58f5713b433aabd2dc82d0c16d5261b6aca6
3
+ metadata.gz: 5a78bc366f1f7086a31c4095eb10e5c5ee0be08a56c68327597848a0d7a9236a
4
+ data.tar.gz: 83701efa1b7889f3359c4e73dde11ce3f2a48d5ec39e42d5c550f5c6299aeb38
5
5
  SHA512:
6
- metadata.gz: ef0c56bcfe1ebb41fe01ebad3ae9270673a12a6402e8e1cc91811eb3356a3c8ccc08fad0bd73825b6176cd649860556634c70319f575bd3a866fe085ada89017
7
- data.tar.gz: 1a0d8cd29a1cb2fb51b346c37bcdeda59676762bebf9edb5759e950542d9586611d5f8c578f4e135494cb1ceb1b0fa3cea554102f26e40eaeab1049fe9e08a84
6
+ metadata.gz: a51f1c37116779e420d0a30abe9aa0617d611103fdb5bf1e44aa3639be7e4d09ab61d71ea2e29173dc6a144110a262eaf7a27370c110db5926d24b80a20d870f
7
+ data.tar.gz: 4dceab2450821e9c3b12a791d4b919d747341b7b73fca55b83ff18fa6c460a0e39204a0d7bd3757b2bd53b46ad37af9a5624222e897e0ffe1f2f5d12938b9c4d
@@ -1,7 +1,6 @@
1
1
 
2
2
  @import 'pb_advanced_table/advanced_table';
3
3
  @import 'pb_avatar/avatar';
4
- @import 'pb_avatar_action_button/avatar_action_button';
5
4
  @import 'pb_background/background';
6
5
  @import 'pb_badge/badge';
7
6
  @import 'pb_bar_graph/bar_graph';
@@ -0,0 +1,58 @@
1
+ @import "../tokens/colors";
2
+ @import "../tokens/typography";
3
+ @import url("https://code.highcharts.com/css/highcharts.css");
4
+
5
+ :root {
6
+ --highcharts-color-0: #{$data_1};
7
+ --highcharts-color-1: #{$data_2};
8
+ --highcharts-color-2: #{$data_3};
9
+ --highcharts-color-3: #{$data_4};
10
+ --highcharts-color-4: #{$data_5};
11
+ --highcharts-color-5: #{$data_6};
12
+ --highcharts-color-6: #{$data_7};
13
+ --highcharts-color-7: #{$data_8};
14
+ }
15
+
16
+ .highcharts-title {
17
+ font-family: $font_family_base;
18
+ font-weight: $bold;
19
+ font-size: $heading_3;
20
+ color: $text_lt_default;
21
+ fill: $text_lt_default;
22
+ }
23
+
24
+ .highcharts-subtitle {
25
+ font-family: $font_family_base;
26
+ color: $text_lt_light;
27
+ fill: $text_lt_light;
28
+ font-weight: $regular;
29
+ font-size: $text_base;
30
+ }
31
+
32
+ .highcharts-yaxis > .highcharts-axis-title {
33
+ color: $text_lt_lighter;
34
+ fill: $text_lt_lighter;
35
+ font-family: $font_family_base;
36
+ font-weight: $bold;
37
+ font-size: $text_smaller;
38
+ }
39
+
40
+ .highcharts-axis-labels {
41
+ font-family: $font_family_base;
42
+ color: $text_lt_lighter;
43
+ fill: $text_lt_lighter;
44
+ font-weight: $bold;
45
+ font-size: $text_smaller;
46
+ }
47
+
48
+ .highcharts-grid-line {
49
+ stroke: $border_light;
50
+ }
51
+
52
+ .highcharts-point {
53
+ border-radius: 3px;
54
+ }
55
+
56
+ .highcharts-axis-line {
57
+ stroke: $border_light;
58
+ }
@@ -0,0 +1,64 @@
1
+ import React from 'react'
2
+ import Highcharts from "highcharts";
3
+ import HighchartsReact from "highcharts-react-official";
4
+
5
+ import "../BarGraphStyles.scss";
6
+ // Your path might look more like this
7
+ //import "playbook-ui/dist/pb_bar_graph/BarGraphStyles.scss";
8
+
9
+ const columnChartData = [
10
+ {
11
+ name: "Installation",
12
+ data: [1475, 200, 3000, 654, 656],
13
+ },
14
+ {
15
+ name: "Manufacturing",
16
+ data: [4434, 524, 2320, 440, 500],
17
+ },
18
+ {
19
+ name: "Sales & Distribution",
20
+ data: [3387, 743, 1344, 434, 440],
21
+ },
22
+ {
23
+ name: "Project Development",
24
+ data: [3227, 878, 999, 780, 1000],
25
+ },
26
+ {
27
+ name: "Other",
28
+ data: [1111, 677, 3245, 500, 200],
29
+ },
30
+ ];
31
+
32
+ const columnOptions = {
33
+ chart: {
34
+ type: "column",
35
+ },
36
+ series: columnChartData,
37
+ title: {
38
+ text: "Solar Employment Growth by Sector, 2010-2016",
39
+ },
40
+ subtitle: {
41
+ text: "Source: thesolarfoundation.com",
42
+ },
43
+ xAxis: {
44
+ categories: ["Jan", "Feb", "Mar", "Apr", "May"],
45
+ },
46
+ yAxis: {
47
+ min: 0,
48
+ title: {
49
+ text: "Number of Employees",
50
+ },
51
+ },
52
+ legend: { enabled: false },
53
+ credits: { enabled: false },
54
+ };
55
+
56
+ const BarGraphPbStyles = () => (
57
+ <div>
58
+ <HighchartsReact highcharts={Highcharts}
59
+ options={columnOptions}
60
+ />
61
+ </div>
62
+ )
63
+
64
+ export default BarGraphPbStyles
@@ -0,0 +1 @@
1
+ You don't need to use the bar graph kit to apply the styles to your Highcharts bar graph. Just import the BarGraphStyles.scss to your component and the styles will apply automatically.
@@ -17,6 +17,7 @@ examples:
17
17
 
18
18
  react:
19
19
  - bar_graph_default: Default
20
+ - bar_graph_pb_styles: Playbook Styles
20
21
  - bar_graph_legend: Legend
21
22
  - bar_graph_legend_position: Legend Position
22
23
  - bar_graph_legend_non_clickable: Legend Non Clickable
@@ -10,3 +10,4 @@ export { default as BarGraphStacked } from './_bar_graph_stacked.jsx'
10
10
  export { default as BarGraphNegativeNumbers } from './_bar_graph_negative_numbers.jsx'
11
11
  export { default as BarGraphSecondaryYAxis } from './_bar_graph_secondary_y_axis.jsx'
12
12
  export { default as BarGraphHorizontal } from './_bar_graph_horizontal.jsx'
13
+ export { default as BarGraphPbStyles } from './_bar_graph_pb_styles.jsx'
@@ -3,7 +3,8 @@
3
3
  @import "../tokens/border_radius";
4
4
 
5
5
  @mixin pb_progress_pill {
6
- width: 45px;
6
+ width: 100%;
7
+ max-width: 45px;
7
8
  height: 4px;
8
9
  border-radius: $border_rad_light;
9
10
  margin-right: $space_xs;
@@ -27,6 +28,10 @@
27
28
  [class*=pb_progress_pill] {
28
29
  @include pb_progress_pill;
29
30
 
31
+ &.full_width_pill {
32
+ max-width: none;
33
+ }
34
+
30
35
  &[class*=_inactive] {
31
36
  background-color: $border_light;
32
37
  &.dark {
@@ -13,6 +13,7 @@ type ProgressPillsProps = {
13
13
  className?: string,
14
14
  data?: { [key: string]: string },
15
15
  dark?: boolean,
16
+ fullWidthPill?: boolean,
16
17
  htmlOptions?: {[key: string]: string | number | boolean | (() => void)},
17
18
  id?: string,
18
19
  steps?: number,
@@ -20,19 +21,19 @@ type ProgressPillsProps = {
20
21
  value?: string,
21
22
  }
22
23
 
23
- const ProgressPill = ({ active, dark, steps: step }: ProgressPillsProps) => (
24
+ const ProgressPill = ({ active, dark, steps: step, fullWidthPill }: ProgressPillsProps) => (
24
25
  <div
25
26
  className={`pb_progress_pill${step <= active ? '_active' : '_inactive'}${dark ? ' dark' : ''
26
- }`}
27
+ }${fullWidthPill ? ' full_width_pill' : ''}`}
27
28
  key={step}
28
29
  />
29
30
  )
30
31
 
31
- const showSteps = (steps: number, active: number, dark: boolean) => {
32
+ const showSteps = (steps: number, active: number, dark: boolean, fullWidthPill: boolean) => {
32
33
  const items = []
33
34
 
34
35
  for (let step = 1; step <= steps; step++) {
35
- items.push(ProgressPill({ steps: step, active, dark }))
36
+ items.push(ProgressPill({ steps: step, active, dark, fullWidthPill }))
36
37
  }
37
38
 
38
39
  return items
@@ -44,6 +45,7 @@ const ProgressPills = (props: ProgressPillsProps) => {
44
45
  aria = { hidden: 'true' },
45
46
  className,
46
47
  data = {},
48
+ fullWidthPill = false,
47
49
  htmlOptions = {},
48
50
  id,
49
51
  steps = 3,
@@ -79,7 +81,7 @@ const ProgressPills = (props: ProgressPillsProps) => {
79
81
  text={value}
80
82
  />
81
83
  </div>}
82
- <div className="progress_pills">{showSteps(steps, active, dark)}</div>
84
+ <div className="progress_pills">{showSteps(steps, active, dark, fullWidthPill)}</div>
83
85
  </div>
84
86
  )
85
87
  }
@@ -1 +1,2 @@
1
1
  <%= pb_rails("progress_pills", props: { aria: { label: "2 out of 3 steps complete" }, steps: 3, active: 2 }) %>
2
+ <%= pb_rails("progress_pills", props: { aria: { label: "9 out of 18 steps complete" }, steps: 18, active: 9, margin_top: "md" }) %>
@@ -10,6 +10,13 @@ const ProgressPillsDefault = (props) => {
10
10
  steps={3}
11
11
  {...props}
12
12
  />
13
+ <ProgressPills
14
+ active={9}
15
+ aria={{ label: '9 out of 18 steps complete' }}
16
+ marginTop="md"
17
+ steps={18}
18
+ {...props}
19
+ />
13
20
  </>
14
21
  )
15
22
  }
@@ -0,0 +1 @@
1
+ Progress pills start at `45px` wide if the container allows, but will shrink down to `1px` as the container gets smaller. Resize this window to see each pill shrink.
@@ -0,0 +1 @@
1
+ <%= pb_rails("progress_pills", props: { aria: { label: "2 out of 5 steps complete" }, steps: 5, active: 2, full_width_pill: true }) %>
@@ -0,0 +1,18 @@
1
+ import React from 'react'
2
+ import ProgressPills from '../_progress_pills'
3
+
4
+ const ProgressPillsFullWidth = (props) => {
5
+ return (
6
+ <>
7
+ <ProgressPills
8
+ active={2}
9
+ aria={{ label: '2 out of 5 steps complete' }}
10
+ fullWidthPill
11
+ steps={5}
12
+ {...props}
13
+ />
14
+ </>
15
+ )
16
+ }
17
+
18
+ export default ProgressPillsFullWidth
@@ -0,0 +1 @@
1
+ Pass `full_width_pill: true` to the Progress Pill kit to get true 100% full width pills. The kit will take up the full width of the container that it is in.
@@ -0,0 +1 @@
1
+ Pass `fullWidthPill` to the Progress Pill kit to get true 100% full width pills. The kit will take up the full width of the container that it is in.
@@ -3,9 +3,11 @@ examples:
3
3
  rails:
4
4
  - progress_pills_default: Default
5
5
  - progress_pills_status: Status
6
+ - progress_pills_full_width: Full Container Width
6
7
 
7
8
 
8
9
 
9
10
  react:
10
11
  - progress_pills_default: Default
11
12
  - progress_pills_status: Status
13
+ - progress_pills_full_width: Full Container Width
@@ -1,2 +1,3 @@
1
1
  export { default as ProgressPillsDefault } from './_progress_pills_default.jsx'
2
2
  export { default as ProgressPillsStatus } from './_progress_pills_status.jsx'
3
+ export { default as ProgressPillsFullWidth } from './_progress_pills_full_width.jsx'
@@ -14,7 +14,7 @@
14
14
 
15
15
  <div class="progress_pills">
16
16
  <% object.each_step do |step| %>
17
- <span class="pb_progress_pill<%= object.active_step(step) %><%= object.dark_pill %>"></span>
17
+ <span class="pb_progress_pill<%= object.active_step(step) %><%= object.make_full_width %><%= object.dark_pill %>"></span>
18
18
  <% end %>
19
19
  </div>
20
20
 
@@ -9,6 +9,8 @@ module Playbook
9
9
  prop :steps, type: Playbook::Props::Number,
10
10
  default: 3
11
11
  prop :title
12
+ prop :full_width_pill, type: Playbook::Props::Boolean,
13
+ default: false
12
14
 
13
15
  def classname
14
16
  generate_classname("pb_progress_pills_kit")
@@ -26,6 +28,10 @@ module Playbook
26
28
  step <= active ? "_active" : "_inactive"
27
29
  end
28
30
 
31
+ def make_full_width
32
+ full_width_pill ? " full_width_pill" : nil
33
+ end
34
+
29
35
  def aria_attributes
30
36
  return aria if aria.present?
31
37
 
@@ -23,6 +23,20 @@ const ProgressPillsDefault = () => {
23
23
  )
24
24
  }
25
25
 
26
+ const ProgressPillsFullWidth = () => {
27
+ return (
28
+ <ProgressPills
29
+ active={2}
30
+ aria={{ label: ariaLabel }}
31
+ data={{ testid: testId }}
32
+ fullWidthPill
33
+ steps={3}
34
+ title={title}
35
+ value={value}
36
+ />
37
+ )
38
+ }
39
+
26
40
  test('should pass data prop', () => {
27
41
  render(<ProgressPillsDefault />)
28
42
  const kit = screen.getByTestId(testId)
@@ -51,4 +65,15 @@ test('should render value', () => {
51
65
  render(<ProgressPillsDefault />)
52
66
  const kit = screen.getByText(value)
53
67
  expect(kit).toBeInTheDocument()
54
- })
68
+ })
69
+
70
+ test('should apply fullWidthPill styling when fullWidthPill prop is true', () => {
71
+ render(<ProgressPillsFullWidth />)
72
+ const container = screen.getByTestId(testId)
73
+ const pillElements = container.querySelectorAll('.full_width_pill')
74
+
75
+ expect(pillElements.length).toBeGreaterThan(0)
76
+ pillElements.forEach((pill) => {
77
+ expect(pill).toHaveClass('full_width_pill')
78
+ })
79
+ })
@@ -16,7 +16,7 @@ const TableWithCollapsible = (props) => {
16
16
  );
17
17
  };
18
18
 
19
- return (
19
+ return (
20
20
  <Table
21
21
  size="sm"
22
22
  {...props}
@@ -0,0 +1,51 @@
1
+ <% content = capture do %>
2
+ <%= pb_rails("card", props: { border_none: true, border_radius: "none", padding: "md" }) do %>
3
+ <%= pb_rails("body", props: { text: "Nested content inside a Table Row" }) %>
4
+ <% end %>
5
+ <% end %>
6
+
7
+ <%= pb_rails("table", props: { size: "sm" }) do %>
8
+ <%= pb_rails("table/table_head") do %>
9
+ <%= pb_rails("table/table_row") do %>
10
+ <%= pb_rails("table/table_header", props: { text: "Column 1"}) %>
11
+ <%= pb_rails("table/table_header", props: { text: "Column 2"}) %>
12
+ <%= pb_rails("table/table_header", props: { text: "Column 3"}) %>
13
+ <%= pb_rails("table/table_header", props: { text: "Column 4"}) %>
14
+ <%= pb_rails("table/table_header", props: { text: "Column 5"}) %>
15
+ <%= pb_rails("table/table_header", props: { text: ""}) %>
16
+ <% end %>
17
+ <% end %>
18
+ <%= pb_rails("table/table_body") do %>
19
+ <%= pb_rails("table/table_row", props: { collapsible: true, collapsible_content: content, collapsible_side_highlight: true, toggle_cell_id: "cell-1", id: "5" }) do %>
20
+ <%= pb_rails("table/table_cell", props: { text: "Value 1"}) %>
21
+ <%= pb_rails("table/table_cell", props: { text: "Value 2"}) %>
22
+ <%= pb_rails("table/table_cell", props: { text: "Value 3"}) %>
23
+ <%= pb_rails("table/table_cell", props: { text: "Value 4"}) %>
24
+ <%= pb_rails("table/table_cell", props: { text: "Value 5"}) %>
25
+ <%= pb_rails("table/table_cell", props: { text_align: "right", id: "cell-1", cursor: "pointer" }) do %>
26
+ <%= pb_rails("icon", props: { icon: "chevron-down", fixed_width: true, color: "primary" }) %>
27
+ <% end %>
28
+ <% end %>
29
+ <%= pb_rails("table/table_row", props: { collapsible: true, collapsible_content: content, collapsible_side_highlight: true, toggle_cell_id: "cell-2", id: "6" }) do %>
30
+ <%= pb_rails("table/table_cell", props: { text: "Value 1"}) %>
31
+ <%= pb_rails("table/table_cell", props: { text: "Value 2"}) %>
32
+ <%= pb_rails("table/table_cell", props: { text: "Value 3"}) %>
33
+ <%= pb_rails("table/table_cell", props: { text: "Value 4"}) %>
34
+ <%= pb_rails("table/table_cell", props: { text: "Value 5"}) %>
35
+ <%= pb_rails("table/table_cell", props: { text_align: "right", id: "cell-2", cursor: "pointer" }) do %>
36
+ <%= pb_rails("icon", props: { icon: "chevron-down", fixed_width: true, color: "primary" }) %>
37
+ <% end %>
38
+ <% end %>
39
+ <%= pb_rails("table/table_row", props: { collapsible: true, collapsible_content: content, collapsible_side_highlight: true, toggle_cell_id: "cell-3", id: "7" }) do %>
40
+ <%= pb_rails("table/table_cell", props: { text: "Value 1"}) %>
41
+ <%= pb_rails("table/table_cell", props: { text: "Value 2"}) %>
42
+ <%= pb_rails("table/table_cell", props: { text: "Value 3"}) %>
43
+ <%= pb_rails("table/table_cell", props: { text: "Value 4"}) %>
44
+ <%= pb_rails("table/table_cell", props: { text: "Value 5"}) %>
45
+ <%= pb_rails("table/table_cell", props: { text_align: "right", id: "cell-3", cursor: "pointer" }) do %>
46
+ <%= pb_rails("icon", props: { icon: "chevron-down", fixed_width: true, color: "primary" }) %>
47
+ <% end %>
48
+ <% end %>
49
+ <% end %>
50
+ <% end %>
51
+
@@ -0,0 +1,2 @@
1
+ When using the `collapsible` prop, the default functionality is that the entire Row will be clickable to toggle the Row. To limit the click event to a specific Table Cell, you can use the `toggle_cell_id` prop to pass in the id of the Cell you want to use as the trigger.
2
+ __NOTE__: `toggle_cell_id` and the `id` on the Cell you want to use as the trigger MUST be the same. Please also be aware that you will need to pass in an `id` to any Table Rows you want to be collapsible. Make sure every `id` is unique if you are using multipe collapsibles.
@@ -31,6 +31,7 @@ examples:
31
31
  - table_with_subcomponents_as_divs: Table with Sub Components (Divs)
32
32
  - table_outer_padding: Outer Padding
33
33
  - table_with_collapsible: Table with Collapsible
34
+ - table_with_collapsible_with_custom_click: Table with Collapsible with Custom Click
34
35
  - table_with_collapsible_with_custom_content_rails: Table with Collapsible with Custom Content
35
36
  - table_with_collapsible_with_nested_rows_rails: Table with Collapsible with Nested Rows
36
37
  - table_with_collapsible_with_nested_table_rails: Table with Collapsible with Nested Table
@@ -2,6 +2,7 @@ import PbEnhancedElement from '../pb_enhanced_element'
2
2
 
3
3
  const TABLE_WRAPPER_SELECTOR = "[data-pb-table-wrapper]";
4
4
  const TABLE_COLLAPSIBLE_WRAPPER_SELECTOR = "[data-pb-table-collapsible-wrapper]";
5
+ const TABLE_COLLAPSIBLE_CELL_SELECTOR = "[data-pb-table-collapsible-cell-id]";
5
6
 
6
7
  export default class PbTable extends PbEnhancedElement {
7
8
  stickyLeftColumns: string[] = [];
@@ -158,18 +159,49 @@ export default class PbTable extends PbEnhancedElement {
158
159
  }
159
160
 
160
161
  handleCollapsibleClick() {
162
+ const cells = this.element.querySelectorAll(TABLE_COLLAPSIBLE_CELL_SELECTOR);
161
163
  const collapsibleElements = this.element.querySelectorAll(TABLE_COLLAPSIBLE_WRAPPER_SELECTOR);
162
- collapsibleElements.forEach((collapsibleElement) => {
163
- collapsibleElement.addEventListener('click', (event) => {
164
- document.dispatchEvent(new CustomEvent(`collapsed-toggle${(event.currentTarget as HTMLElement).id}`))
165
-
166
- const toggleElements = this.element.querySelectorAll(`.collapsible_border_toggle${(event.currentTarget as HTMLElement).id}`);
167
- toggleElements.forEach(element => {
168
- element.classList.toggle('no-border');
169
- element.classList.toggle('border-active');
164
+
165
+ if (cells.length > 0) {
166
+ cells.forEach((cell) => {
167
+ const cellId = (cell as HTMLElement).dataset.pbTableCollapsibleCellId;
168
+
169
+ Array.from(cell.children).forEach((child) => {
170
+ if (child.id === cellId) {
171
+ Array.from(child.children).forEach((svgChild) => {
172
+ svgChild.id = cellId; // Assign cellId to SVG child
173
+ Array.from(svgChild.children).forEach((pathChild) => {
174
+ pathChild.id = cellId; // Assign cellId to path child
175
+ });
176
+ });
177
+ }
178
+ });
179
+ cell.addEventListener('click', (event) => {
180
+ if ((event.target as HTMLElement).id) {
181
+ document.dispatchEvent(new CustomEvent(`collapsed-toggle${(event.currentTarget as HTMLElement).id}`));
182
+
183
+ const toggleElements = this.element.querySelectorAll(`.collapsible_border_toggle${(event.currentTarget as HTMLElement).id}`);
184
+ toggleElements.forEach((element) => {
185
+ element.classList.toggle('no-border');
186
+ element.classList.toggle('border-active');
187
+ });
188
+ }
170
189
  });
190
+ });
191
+
192
+ } else {
193
+ collapsibleElements.forEach((collapsibleElement) => {
194
+ collapsibleElement.addEventListener('click', (event) => {
195
+ document.dispatchEvent(new CustomEvent(`collapsed-toggle${(event.currentTarget as HTMLElement).id}`))
196
+
197
+ const toggleElements = this.element.querySelectorAll(`.collapsible_border_toggle${(event.currentTarget as HTMLElement).id}`);
198
+ toggleElements.forEach(element => {
199
+ element.classList.toggle('no-border');
200
+ element.classList.toggle('border-active');
201
+ });
202
+ })
171
203
  })
172
- })
204
+ }
173
205
  }
174
206
 
175
207
  handleCollapsibleRow() {
@@ -37,6 +37,10 @@
37
37
  cursor: pointer;
38
38
  }
39
39
 
40
+ .collapsible_cell {
41
+ cursor: default;
42
+ }
43
+
40
44
  .no-border {
41
45
  border-bottom: none !important;
42
46
  }
@@ -5,6 +5,7 @@
5
5
  data: object.data.merge(id: object.id),
6
6
  id: object.id,
7
7
  'data-pb-table-collapsible-wrapper' => true,
8
+ 'data-pb-table-collapsible-cell-id' => object.toggle_cell_id,
8
9
  **combined_html_options) do %>
9
10
  <%= content.presence %>
10
11
  <% end %>
@@ -13,13 +13,14 @@ module Playbook
13
13
  prop :collapsible_content
14
14
  prop :collapsible_side_highlight, type: Playbook::Props::Boolean,
15
15
  default: true
16
+ prop :toggle_cell_id, type: Playbook::Props::String
16
17
  prop :draggable_item, type: Playbook::Props::Boolean,
17
18
  default: false
18
19
  prop :drag_id, type: Playbook::Props::String,
19
20
  default: nil
20
21
 
21
22
  def classname
22
- generate_classname("pb_table_row_kit", side_highlight_class) + tag_class
23
+ generate_classname("pb_table_row_kit", side_highlight_class) + tag_class + collapsible_cell_class
23
24
  end
24
25
 
25
26
  def side_highlight_class
@@ -29,6 +30,14 @@ module Playbook
29
30
  def tag_class
30
31
  " pb_table_tr"
31
32
  end
33
+
34
+ def collapsible_cell_class
35
+ if toggle_cell_id
36
+ " collapsible_cell"
37
+ else
38
+ ""
39
+ end
40
+ end
32
41
  end
33
42
  end
34
43
  end