playbook_ui 13.28.0.pre.alpha.play829selectablecardalignment2978 → 13.29.0.pre.alpha.testingcollapsibleissue3052

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 (88) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/_playbook.scss +2 -3
  3. data/app/pb_kits/playbook/index.js +2 -0
  4. data/app/pb_kits/playbook/pb_bar_graph/_bar_graph.tsx +4 -1
  5. data/app/pb_kits/playbook/pb_bar_graph/barGraph.test.js +31 -0
  6. data/app/pb_kits/playbook/pb_bar_graph/bar_graph.rb +16 -0
  7. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_custom.md +2 -1
  8. data/app/pb_kits/playbook/pb_bar_graph/docs/{_bar_graph_custom.html.erb → _bar_graph_custom_rails.html.erb} +3 -3
  9. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_custom_rails.md +2 -0
  10. data/app/pb_kits/playbook/pb_bar_graph/docs/example.yml +1 -1
  11. data/app/pb_kits/playbook/pb_circle_chart/_circle_chart.tsx +9 -3
  12. data/app/pb_kits/playbook/pb_circle_chart/circleChart.test.js +45 -0
  13. data/app/pb_kits/playbook/pb_circle_chart/circle_chart.rb +24 -1
  14. data/app/pb_kits/playbook/pb_collapsible/__snapshots__/collapsible.test.js.snap +53 -0
  15. data/app/pb_kits/playbook/pb_collapsible/_collapsible.tsx +15 -13
  16. data/app/pb_kits/playbook/pb_collapsible/collapsible.test.js +24 -0
  17. data/app/pb_kits/playbook/pb_dashboard/pbChartsDarkTheme.ts +7 -1
  18. data/app/pb_kits/playbook/pb_dashboard/pbChartsLightTheme.ts +9 -1
  19. data/app/pb_kits/playbook/pb_draggable/_draggable.scss +13 -0
  20. data/app/pb_kits/playbook/pb_draggable/_draggable.tsx +53 -0
  21. data/app/pb_kits/playbook/pb_draggable/context/index.tsx +92 -0
  22. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_default.jsx +53 -0
  23. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_default.md +4 -0
  24. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_multiple_containers.jsx +158 -0
  25. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_cards.jsx +119 -0
  26. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_list.jsx +50 -0
  27. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_list.md +1 -0
  28. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_selectable_list.jsx +51 -0
  29. data/app/pb_kits/playbook/pb_draggable/docs/example.yml +11 -0
  30. data/app/pb_kits/playbook/pb_draggable/docs/index.js +5 -0
  31. data/app/pb_kits/playbook/pb_draggable/draggable.test.jsx +65 -0
  32. data/app/pb_kits/playbook/pb_draggable/subcomponents/DraggableContainer.tsx +54 -0
  33. data/app/pb_kits/playbook/pb_draggable/subcomponents/DraggableItem.tsx +57 -0
  34. data/app/pb_kits/playbook/pb_form_group/_form_group.scss +2 -2
  35. data/app/pb_kits/playbook/pb_gauge/_gauge.tsx +4 -1
  36. data/app/pb_kits/playbook/pb_gauge/gauge.rb +6 -1
  37. data/app/pb_kits/playbook/pb_gauge/gauge.test.js +35 -0
  38. data/app/pb_kits/playbook/pb_icon/icon.rb +3 -2
  39. data/app/pb_kits/playbook/pb_line_graph/_line_graph.tsx +8 -2
  40. data/app/pb_kits/playbook/pb_line_graph/lineGraph.test.js +52 -0
  41. data/app/pb_kits/playbook/pb_line_graph/line_graph.rb +22 -1
  42. data/app/pb_kits/playbook/pb_list/_list.tsx +43 -2
  43. data/app/pb_kits/playbook/pb_list/_list_item.tsx +46 -10
  44. data/app/pb_kits/playbook/pb_selectable_card/_selectable_card.scss +1 -1
  45. data/app/pb_kits/playbook/pb_selectable_list/_item.tsx +35 -28
  46. data/app/pb_kits/playbook/pb_selectable_list/_selectable_list.tsx +5 -1
  47. data/app/pb_kits/playbook/pb_table/_table.tsx +5 -0
  48. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_column.jsx +33 -32
  49. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_column.md +1 -1
  50. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_column_rails.md +2 -0
  51. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_row.jsx +33 -33
  52. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_row.md +1 -1
  53. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_row_rails.html.erb +34 -0
  54. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_row_rails.md +2 -0
  55. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_data.jsx +51 -50
  56. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_data.md +1 -1
  57. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_data_rails.html.erb +54 -0
  58. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_data_rails.md +2 -0
  59. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_row.jsx +37 -38
  60. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_row.md +1 -0
  61. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_row_rails.html.erb +53 -0
  62. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_row_rails.md +1 -0
  63. data/app/pb_kits/playbook/pb_table/docs/{_table_alignment_row.html.erb → _table_outer_padding.html.erb} +7 -7
  64. data/app/pb_kits/playbook/pb_table/docs/_table_outer_padding.jsx +76 -0
  65. data/app/pb_kits/playbook/pb_table/docs/_table_outer_padding.md +1 -0
  66. data/app/pb_kits/playbook/pb_table/docs/example.yml +9 -9
  67. data/app/pb_kits/playbook/pb_table/docs/index.js +1 -0
  68. data/app/pb_kits/playbook/pb_table/styles/_all.scss +1 -0
  69. data/app/pb_kits/playbook/pb_table/styles/_outer_padding.scss +21 -0
  70. data/app/pb_kits/playbook/pb_table/table.rb +14 -1
  71. data/app/pb_kits/playbook/pb_table/table.test.js +5 -1
  72. data/app/pb_kits/playbook/pb_treemap_chart/_treemap_chart.tsx +12 -9
  73. data/app/pb_kits/playbook/pb_treemap_chart/treemapChart.test.js +61 -0
  74. data/app/pb_kits/playbook/pb_treemap_chart/treemap_chart.rb +6 -1
  75. data/app/pb_kits/playbook/playbook-doc.js +2 -0
  76. data/app/pb_kits/playbook/tokens/_vertical_align.scss +18 -0
  77. data/app/pb_kits/playbook/utilities/_vertical_align.scss +16 -0
  78. data/app/pb_kits/playbook/utilities/globalProps.ts +12 -1
  79. data/dist/menu.yml +5 -2
  80. data/dist/playbook-rails.js +7 -7
  81. data/lib/playbook/classnames.rb +1 -0
  82. data/lib/playbook/kit_base.rb +2 -0
  83. data/lib/playbook/version.rb +2 -2
  84. data/lib/playbook/vertical_align.rb +37 -0
  85. metadata +41 -7
  86. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_data.html.erb +0 -63
  87. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_row.html.erb +0 -52
  88. /data/app/pb_kits/playbook/pb_table/docs/{_table_alignment_column.html.erb → _table_alignment_column_rails.html.erb} +0 -0
@@ -5,6 +5,7 @@ module Playbook
5
5
  class Gauge < Playbook::KitBase
6
6
  prop :chart_data, type: Playbook::Props::Array,
7
7
  default: [{ name: "Name", value: 0 }]
8
+ prop :custom_options, default: {}
8
9
  prop :style, type: Playbook::Props::Enum,
9
10
  values: %w[solidgauge],
10
11
  default: "solidgauge"
@@ -22,7 +23,7 @@ module Playbook
22
23
  prop :max, type: Playbook::Props::Numeric, default: 100
23
24
  prop :colors, type: Playbook::Props::Array, default: []
24
25
 
25
- def chart_options
26
+ def standard_options
26
27
  {
27
28
  id: id,
28
29
  chartData: chart_data,
@@ -43,6 +44,10 @@ module Playbook
43
44
  }
44
45
  end
45
46
 
47
+ def chart_options
48
+ standard_options.deep_merge(custom_options)
49
+ end
50
+
46
51
  def classname
47
52
  generate_classname("pb_gauge_kit")
48
53
  end
@@ -0,0 +1,35 @@
1
+ import React from 'react';
2
+ import { render, screen } from '../utilities/test-utils';
3
+ import Gauge from './_gauge';
4
+
5
+ beforeEach(() => {
6
+ // Silences error logs within the test suite.
7
+ jest.spyOn(console, 'error');
8
+ jest.spyOn(console, 'warn');
9
+ console.error.mockImplementation(() => {});
10
+ console.warn.mockImplementation(() => {});
11
+ });
12
+
13
+ afterEach(() => {
14
+ console.error.mockRestore();
15
+ console.warn.mockRestore();
16
+ });
17
+
18
+ const testId = 'gauge1';
19
+
20
+ test('uses exact classname', () => {
21
+ const data = [
22
+ { name: 'Name', value: 45 },
23
+ ]
24
+ render(
25
+ <Gauge
26
+ chartData={data}
27
+ data={{ testid: testId }}
28
+ id='gaugeid'
29
+ />
30
+ );
31
+
32
+ const kit = screen.getByTestId(testId);
33
+ expect(kit).toHaveClass('pb_gauge_kit');
34
+ });
35
+
@@ -81,9 +81,10 @@ module Playbook
81
81
 
82
82
  def asset_path
83
83
  return unless Rails.application.config.respond_to?(:icon_path)
84
- return unless Dir.entries(Rails.application.config.icon_path).include? "#{icon}.svg"
85
84
 
86
- Rails.root.join(Rails.application.config.icon_path, "#{icon}.svg")
85
+ base_path = Rails.application.config.icon_path
86
+ icon_path = Dir.glob(Rails.root.join(base_path, "**", "#{icon}.svg")).first
87
+ icon_path if icon_path && File.exist?(icon_path)
87
88
  end
88
89
 
89
90
  def render_svg
@@ -8,6 +8,7 @@ import Highcharts from "highcharts";
8
8
  import { highchartsTheme } from "../pb_dashboard/pbChartsLightTheme";
9
9
  import { highchartsDarkTheme } from "../pb_dashboard/pbChartsDarkTheme";
10
10
  import mapColors from "../pb_dashboard/pbChartsColorsHelper";
11
+ import { merge } from 'lodash'
11
12
 
12
13
  type LineGraphProps = {
13
14
  align?: "left" | "right" | "center";
@@ -21,6 +22,7 @@ type LineGraphProps = {
21
22
  name: string;
22
23
  data: number[];
23
24
  }[];
25
+ customOptions?: Partial<Highcharts.Options>;
24
26
  gradient?: boolean;
25
27
  htmlOptions?: {[key: string]: string | number | boolean | (() => void)},
26
28
  id: string;
@@ -45,6 +47,7 @@ const LineGraph = ({
45
47
  data = {},
46
48
  align = "center",
47
49
  className = "pb_bar_graph",
50
+ customOptions = {},
48
51
  dark = false,
49
52
  gradient = false,
50
53
  type = "line",
@@ -130,16 +133,19 @@ const LineGraph = ({
130
133
  staticOptions.plotOptions.series.events = { legendItemClick: () => false };
131
134
  }
132
135
 
136
+ const filteredProps: any = {...props};
137
+ delete filteredProps.verticalAlign;
138
+
133
139
  const [options, setOptions] = useState({});
134
140
 
135
141
  useEffect(() => {
136
- setOptions({ ...staticOptions });
142
+ setOptions(merge(staticOptions, customOptions));
137
143
  }, [chartData]);
138
144
 
139
145
  return (
140
146
  <HighchartsReact
141
147
  containerProps={{
142
- className: classnames(globalProps(props), className),
148
+ className: classnames(globalProps(filteredProps), className),
143
149
  id: id,
144
150
  ...ariaProps,
145
151
  ...dataProps,
@@ -0,0 +1,52 @@
1
+ import React from 'react';
2
+ import { render, screen } from '../utilities/test-utils';
3
+ import LineGraph from './_line_graph';
4
+
5
+ beforeEach(() => {
6
+ // Silences error logs within the test suite.
7
+ jest.spyOn(console, 'error');
8
+ jest.spyOn(console, 'warn');
9
+ console.error.mockImplementation(() => {});
10
+ console.warn.mockImplementation(() => {});
11
+ });
12
+
13
+ afterEach(() => {
14
+ console.error.mockRestore();
15
+ console.warn.mockRestore();
16
+ });
17
+
18
+ const testId = 'linechart1';
19
+
20
+ test('uses exact classname', () => {
21
+ const data = [{
22
+ name: 'Installation',
23
+ data: [43934, 52503, 57177, 69658, 97031, 119931, 137133, 154175],
24
+ }, {
25
+ name: 'Manufacturing',
26
+ data: [24916, 24064, 29742, 29851, 32490, 30282, 38121, 40434],
27
+ }, {
28
+ name: 'Sales & Distribution',
29
+ data: [11744, 17722, 16005, 19771, 20185, 24377, 32147, 39387],
30
+ }, {
31
+ name: 'Project Development',
32
+ data: [null, null, 7988, 12169, 15112, 22452, 34400, 34227],
33
+ }, {
34
+ name: 'Other',
35
+ data: [12908, 5948, 8105, 11248, 8989, 11816, 18274, 18111],
36
+ }]
37
+ render(
38
+ <LineGraph
39
+ axisTitle="Number of Employees"
40
+ chartData={data}
41
+ data={{ testid: testId }}
42
+ id="line-default"
43
+ subTitle="Source: thesolarfoundation.com"
44
+ title="Solar Employment Growth by Sector, 2010-2016"
45
+ xAxisCategories={['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']}
46
+ yAxisMin={0}
47
+ />
48
+ );
49
+
50
+ const kit = screen.getByTestId(testId);
51
+ expect(kit).toHaveClass('pb_bar_graph');
52
+ });
@@ -9,6 +9,7 @@ module Playbook
9
9
  prop :axis_title
10
10
  prop :chart_data, type: Playbook::Props::Array,
11
11
  default: []
12
+ prop :custom_options, default: {}
12
13
  prop :gradient, type: Playbook::Props::Boolean,
13
14
  default: false
14
15
  prop :point_start, type: Playbook::Props::Numeric
@@ -38,7 +39,7 @@ module Playbook
38
39
  gradient ? "area" : "line"
39
40
  end
40
41
 
41
- def chart_options
42
+ def standard_options
42
43
  {
43
44
  align: align,
44
45
  id: id,
@@ -64,6 +65,26 @@ module Playbook
64
65
  }
65
66
  end
66
67
 
68
+ def chart_options
69
+ standard_options.deep_merge(custom_options)
70
+ end
71
+
72
+ def vertical_align_props
73
+ if vertical_align
74
+ if object.vertical_align
75
+ original_result = super
76
+ class_to_remove = "vertical_align_#{object.vertical_align}"
77
+
78
+ modified_result = original_result.gsub(class_to_remove, "").strip
79
+ modified_result.empty? ? nil : modified_result
80
+ else
81
+ super
82
+ end
83
+ else
84
+ super
85
+ end
86
+ end
87
+
67
88
  def classname
68
89
  generate_classname("pb_line_graph")
69
90
  end
@@ -2,6 +2,7 @@ import React 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";
5
+ import Draggable from "../pb_draggable/_draggable";
5
6
 
6
7
  type ListProps = {
7
8
  aria?: { [key: string]: string };
@@ -9,6 +10,7 @@ type ListProps = {
9
10
  className?: string;
10
11
  children: React.ReactNode[] | React.ReactNode;
11
12
  dark?: boolean;
13
+ draggable?: boolean;
12
14
  data?: Record<string, unknown>;
13
15
  htmlOptions?: {[key: string]: string | number | boolean | (() => void)},
14
16
  id?: string;
@@ -30,6 +32,7 @@ const List = (props: ListProps) => {
30
32
  className,
31
33
  dark = false,
32
34
  data = {},
35
+ draggable = false,
33
36
  htmlOptions = {},
34
37
  id,
35
38
  layout = "",
@@ -51,7 +54,7 @@ const List = (props: ListProps) => {
51
54
  const childrenWithProps = React.Children.map(
52
55
  children,
53
56
  (child: React.ReactElement) => {
54
- return React.cloneElement(child, { text, variant });
57
+ return React.cloneElement(child, { text, variant, draggable });
55
58
  }
56
59
  );
57
60
  const ariaProps = buildAriaProps(aria);
@@ -69,7 +72,11 @@ const List = (props: ListProps) => {
69
72
  );
70
73
 
71
74
  return (
72
- <div className={classes}>
75
+ <>
76
+ {
77
+ draggable ? (
78
+ <Draggable.Container>
79
+ <div className={classes}>
73
80
  {ordered ? (
74
81
  <ol
75
82
  {...ariaProps}
@@ -96,6 +103,40 @@ const List = (props: ListProps) => {
96
103
  </ul>
97
104
  )}
98
105
  </div>
106
+ </Draggable.Container>
107
+ ) :
108
+ (
109
+ <div className={classes}>
110
+ {ordered ? (
111
+ <ol
112
+ {...ariaProps}
113
+ {...dataProps}
114
+ {...htmlProps}
115
+ className={className}
116
+ id={id}
117
+ role={role}
118
+ tabIndex={tabIndex}
119
+ >
120
+ {childrenWithProps}
121
+ </ol>
122
+ ) : (
123
+ <ul
124
+ {...ariaProps}
125
+ {...dataProps}
126
+ {...htmlProps}
127
+ className={className}
128
+ id={id}
129
+ role={role}
130
+ tabIndex={tabIndex}
131
+ >
132
+ {childrenWithProps}
133
+ </ul>
134
+ )}
135
+ </div>
136
+ )
137
+ }
138
+
139
+ </>
99
140
  );
100
141
  };
101
142
 
@@ -2,12 +2,16 @@ import React from 'react'
2
2
  import classnames from 'classnames'
3
3
  import { buildAriaProps, buildCss, buildDataProps, buildHtmlProps } from '../utilities/props'
4
4
  import { globalProps, GlobalProps } from '../utilities/globalProps'
5
+ import Icon from '../pb_icon/_icon'
6
+ import Body from '../pb_body/_body'
7
+ import Draggable from '../pb_draggable/_draggable'
5
8
 
6
9
  type ListItemProps = {
7
10
  aria?: { [key: string]: string },
8
11
  children: React.ReactNode[] | React.ReactNode,
9
12
  className?: string,
10
13
  data?: Record<string, unknown>,
14
+ dragHandle?: boolean,
11
15
  htmlOptions?: {[key: string]: string | number | boolean | (() => void)},
12
16
  id?: string,
13
17
  tabIndex?: number,
@@ -19,6 +23,8 @@ const ListItem = (props: ListItemProps) => {
19
23
  children,
20
24
  className,
21
25
  data = {},
26
+ draggable = false,
27
+ dragHandle = true,
22
28
  htmlOptions = {},
23
29
  id,
24
30
  tabIndex,
@@ -35,16 +41,46 @@ const ListItem = (props: ListItemProps) => {
35
41
 
36
42
  return (
37
43
  <>
38
- <li
39
- {...ariaProps}
40
- {...dataProps}
41
- {...htmlProps}
42
- className={classes}
43
- id={id}
44
- tabIndex={tabIndex}
45
- >
46
- {children}
47
- </li>
44
+ {
45
+ draggable ? (
46
+ <Draggable.Item id={id}>
47
+ <li
48
+ {...ariaProps}
49
+ {...dataProps}
50
+ {...htmlProps}
51
+ className={classes}
52
+ id={id}
53
+ tabIndex={tabIndex}
54
+ >
55
+ {
56
+ dragHandle && (
57
+ <span style={{verticalAlign: 'middle'}}>
58
+ <Body color="light">
59
+ <Icon
60
+ icon="grip-dots-vertical"
61
+ verticalAlign="middle"
62
+ />
63
+ </Body>
64
+ </span>
65
+ )
66
+ }
67
+ {children}
68
+ </li>
69
+ </Draggable.Item>
70
+ ) : (
71
+ <li
72
+ {...ariaProps}
73
+ {...dataProps}
74
+ {...htmlProps}
75
+ className={classes}
76
+ id={id}
77
+ tabIndex={tabIndex}
78
+ >
79
+ {children}
80
+ </li>
81
+ )
82
+ }
83
+
48
84
  </>
49
85
  )
50
86
  }
@@ -28,7 +28,7 @@ $pb_selectable_card_border: 2px;
28
28
  padding: $space_sm;
29
29
  margin-bottom: $space_sm;
30
30
  cursor: pointer;
31
- outline: 1px solid transparant;
31
+ outline: 1px solid transparent;
32
32
 
33
33
  @media (hover:hover) {
34
34
  &:hover {
@@ -7,14 +7,16 @@ import { globalProps } from "../utilities/globalProps";
7
7
  import Checkbox from "../pb_checkbox/_checkbox";
8
8
  import ListItem from "../pb_list/_list_item";
9
9
  import Radio from "../pb_radio/_radio";
10
+ import { GenericObject } from "../types";
10
11
 
11
12
  export type SelectableListItemProps = {
12
13
  aria?: { [key: string]: string };
13
14
  children: React.ReactNode[] | React.ReactNode;
14
15
  checked?: boolean;
15
16
  className?: string;
16
- data?: object;
17
+ data?: GenericObject;
17
18
  defaultChecked?: boolean;
19
+ dragHandle?: boolean;
18
20
  htmlOptions?: { [key: string]: string | number | boolean | (() => void) };
19
21
  id?: string;
20
22
  label?: string;
@@ -31,6 +33,7 @@ const SelectableListItem = ({
31
33
  children,
32
34
  className,
33
35
  data = {},
36
+ dragHandle = true,
34
37
  defaultChecked,
35
38
  htmlOptions = {},
36
39
  id,
@@ -39,7 +42,7 @@ const SelectableListItem = ({
39
42
  name = "",
40
43
  value = "",
41
44
  variant = "checkbox",
42
- onChange = () => {},
45
+ onChange = () => {void 0},
43
46
  ...props
44
47
  }: SelectableListItemProps) => {
45
48
  const ariaProps = buildAriaProps(aria);
@@ -61,28 +64,31 @@ const SelectableListItem = ({
61
64
 
62
65
  return (
63
66
  <ListItem
64
- {...props}
65
- className={classnames(checkedState ? "checked_item" : "", className)}
67
+ {...props}
68
+ className={classnames(checkedState ? "checked_item" : "", className)}
69
+ dragHandle={dragHandle}
70
+ id={id}
66
71
  >
67
72
  <div
68
- {...ariaProps}
69
- {...dataProps}
70
- {...htmlProps}
71
- className={classes}
73
+ {...ariaProps}
74
+ {...dataProps}
75
+ {...htmlProps}
76
+ className={classes}
72
77
  >
73
78
  {variant == "checkbox" && (
74
79
  <>
75
80
  <Checkbox
76
- checked={checkedState}
77
- id={id}
78
- name={name}
79
- onChange={handleChecked}
80
- // eslint suppressor, text is needed to display on screen
81
- //@ts-ignore
82
- text={label || (text && false)}
83
- type="checkbox"
84
- value={value}
85
- {...props}
81
+ checked={checkedState}
82
+ id={id}
83
+ name={name}
84
+ onChange={handleChecked}
85
+ // eslint suppressor, text is needed to display on screen
86
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
87
+ //@ts-ignore
88
+ text={label || (text && false)}
89
+ type="checkbox"
90
+ value={value}
91
+ {...props}
86
92
  />
87
93
  {children}
88
94
  </>
@@ -90,16 +96,17 @@ const SelectableListItem = ({
90
96
  {variant == "radio" && (
91
97
  <>
92
98
  <Radio
93
- defaultChecked={defaultChecked}
94
- id={id}
95
- label={label}
96
- name={name}
97
- onChange={onChange}
98
- //@ts-ignore
99
- text={label}
100
- type="radio"
101
- value={value}
102
- {...props}
99
+ defaultChecked={defaultChecked}
100
+ id={id}
101
+ label={label}
102
+ name={name}
103
+ onChange={onChange}
104
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
105
+ //@ts-ignore
106
+ text={label}
107
+ type="radio"
108
+ value={value}
109
+ {...props}
103
110
  />
104
111
  {children}
105
112
  </>
@@ -14,6 +14,7 @@ type SelectableListProps = {
14
14
  children?: React.ReactElement[],
15
15
  className?: string,
16
16
  data?: GenericObject,
17
+ draggable?: boolean,
17
18
  htmlOptions?: {[key: string]: string | number | boolean | (() => void)},
18
19
  id?: string,
19
20
  variant?: 'checkbox' | 'radio',
@@ -25,6 +26,7 @@ const SelectableList = (props: SelectableListProps) => {
25
26
  children,
26
27
  className,
27
28
  data = {},
29
+ draggable = false,
28
30
  htmlOptions = {},
29
31
  id,
30
32
  } = props
@@ -66,7 +68,9 @@ const SelectableList = (props: SelectableListProps) => {
66
68
  className={classes}
67
69
  id={id}
68
70
  >
69
- <List variant={props.variant}>
71
+ <List draggable={draggable}
72
+ variant={props.variant}
73
+ >
70
74
  {selectableListItems}
71
75
  </List>
72
76
  </div>
@@ -23,6 +23,7 @@ type TableProps = {
23
23
  disableHover?: boolean,
24
24
  htmlOptions?: { [key: string]: string | number | boolean | (() => void) },
25
25
  id?: string,
26
+ outerPadding?: "none" | "xxs" | "xs" | "sm" | "md" | "lg" | "xl",
26
27
  responsive?: "collapse" | "scroll" | "none",
27
28
  singleLine?: boolean,
28
29
  size?: "sm" | "md" | "lg",
@@ -45,6 +46,7 @@ const Table = (props: TableProps) => {
45
46
  disableHover = false,
46
47
  htmlOptions = {},
47
48
  id,
49
+ outerPadding = '',
48
50
  responsive = 'collapse',
49
51
  singleLine = false,
50
52
  size = 'sm',
@@ -59,6 +61,8 @@ const Table = (props: TableProps) => {
59
61
  const htmlProps = buildHtmlProps(htmlOptions)
60
62
  const tableCollapseCss = responsive !== 'none' ? `table-collapse-${collapse}` : ''
61
63
  const verticalBorderCss = verticalBorder ? 'vertical-border' : ''
64
+ const spaceCssName = outerPadding !== 'none' ? 'space_' : ''
65
+ const outerPaddingCss = outerPadding ? `outer_padding_${spaceCssName}${outerPadding}` : ''
62
66
  const isTableTag = tag === 'table'
63
67
 
64
68
  const classNames = classnames(
@@ -73,6 +77,7 @@ const Table = (props: TableProps) => {
73
77
  'no-hover': disableHover,
74
78
  'sticky-header': sticky,
75
79
  'striped': striped,
80
+ [outerPaddingCss]: outerPadding !== '',
76
81
  },
77
82
  globalProps(props),
78
83
  tableCollapseCss,
@@ -7,39 +7,40 @@ const TableAlignmentColumn = (props) => {
7
7
  <Table
8
8
  {...props}
9
9
  >
10
- <thead>
11
- <tr>
12
- <th>{'Column 1'}</th>
13
- <th>{'Column 2'}</th>
14
- <th>{'Column 3'}</th>
15
- <th align="center">{'Rating'}</th>
16
- <th align="right">{'Money'}</th>
17
- </tr>
18
- </thead>
19
- <tbody>
20
- <tr>
21
- <td>{'Value 1'}</td>
22
- <td>{'Value 2'}</td>
23
- <td>{'Value 3'}</td>
24
- <td align="center">{'3'}</td>
25
- <td align="right">{'$57.32'}</td>
26
- </tr>
27
- <tr>
28
- <td>{'Value 1'}</td>
29
- <td>{'Value 2'}</td>
30
- <td>{'Value 3'}</td>
31
- <td align="center">{'2'}</td>
32
- <td align="right">{'$5,657.08'}</td>
33
- </tr>
34
- <tr>
35
- <td>{'Value 1'}</td>
36
- <td>{'Value 2'}</td>
37
- <td>{'Value 3'}</td>
38
- <td align="center">{'4'}</td>
39
- <td align="right">{'$358.77'}</td>
40
- </tr>
41
- </tbody>
10
+ <Table.Head>
11
+ <Table.Row>
12
+ <Table.Header>{'Column 1'}</Table.Header>
13
+ <Table.Header>{'Column 2'}</Table.Header>
14
+ <Table.Header>{'Column 3'}</Table.Header>
15
+ <Table.Header textAlign="center">{'Rating'}</Table.Header>
16
+ <Table.Header textAlign="right">{'Money'}</Table.Header>
17
+ </Table.Row>
18
+ </Table.Head>
19
+ <Table.Body>
20
+ <Table.Row>
21
+ <Table.Cell>{'Value 1'}</Table.Cell>
22
+ <Table.Cell>{'Value 2'}</Table.Cell>
23
+ <Table.Cell>{'Value 3'}</Table.Cell>
24
+ <Table.Cell textAlign="center">{'3'}</Table.Cell>
25
+ <Table.Cell textAlign="right">{'$57.32'}</Table.Cell>
26
+ </Table.Row>
27
+ <Table.Row>
28
+ <Table.Cell>{'Value 1'}</Table.Cell>
29
+ <Table.Cell>{'Value 2'}</Table.Cell>
30
+ <Table.Cell>{'Value 3'}</Table.Cell>
31
+ <Table.Cell textAlign="center">{'2'}</Table.Cell>
32
+ <Table.Cell textAlign="right">{'$5,657.08'}</Table.Cell>
33
+ </Table.Row>
34
+ <Table.Row>
35
+ <Table.Cell>{'Value 1'}</Table.Cell>
36
+ <Table.Cell>{'Value 2'}</Table.Cell>
37
+ <Table.Cell>{'Value 3'}</Table.Cell>
38
+ <Table.Cell textAlign="center">{'4'}</Table.Cell>
39
+ <Table.Cell textAlign="right">{'$358.77'}</Table.Cell>
40
+ </Table.Row>
41
+ </Table.Body>
42
42
  </Table>
43
+
43
44
  )
44
45
  }
45
46
 
@@ -1,2 +1,2 @@
1
- You can individually align a piece of table data, but a more practical use would be applied to align a column.
1
+ Pass our `textAlign` global prop to any `table.cell` subcomponent to change the text alignment of individual cells, or apply this prop persistently to align entire columns.
2
2
  In the table above the "Rating" column contents is centered and the "Money" column contents is right aligned.
@@ -0,0 +1,2 @@
1
+ Pass our `text_align` global prop to any `table/table_cell` subcomponent to change the text alignment of individual cells, or apply this prop persistently to align entire columns.
2
+ In the table above the "Rating" column contents is centered and the "Money" column contents is right aligned.