playbook_ui 13.28.0.pre.alpha.play829selectablecardalignment2978 → 13.29.0

Sign up to get free protection for your applications and to get access to all the features.
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 +14 -8
  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 +1 -1
  84. data/lib/playbook/vertical_align.rb +37 -0
  85. metadata +44 -10
  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.