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

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 (90) 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_card/_card.scss +5 -0
  12. data/app/pb_kits/playbook/pb_card/_card.tsx +56 -9
  13. data/app/pb_kits/playbook/pb_circle_chart/_circle_chart.tsx +9 -3
  14. data/app/pb_kits/playbook/pb_circle_chart/circleChart.test.js +45 -0
  15. data/app/pb_kits/playbook/pb_circle_chart/circle_chart.rb +24 -1
  16. data/app/pb_kits/playbook/pb_collapsible/__snapshots__/collapsible.test.js.snap +53 -0
  17. data/app/pb_kits/playbook/pb_collapsible/_collapsible.tsx +14 -8
  18. data/app/pb_kits/playbook/pb_collapsible/collapsible.test.js +24 -0
  19. data/app/pb_kits/playbook/pb_dashboard/pbChartsDarkTheme.ts +7 -1
  20. data/app/pb_kits/playbook/pb_dashboard/pbChartsLightTheme.ts +9 -1
  21. data/app/pb_kits/playbook/pb_draggable/_draggable.scss +13 -0
  22. data/app/pb_kits/playbook/pb_draggable/_draggable.tsx +53 -0
  23. data/app/pb_kits/playbook/pb_draggable/context/index.tsx +92 -0
  24. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_default.jsx +53 -0
  25. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_default.md +4 -0
  26. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_multiple_containers.jsx +158 -0
  27. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_cards.jsx +101 -0
  28. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_list.jsx +50 -0
  29. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_list.md +1 -0
  30. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_selectable_list.jsx +51 -0
  31. data/app/pb_kits/playbook/pb_draggable/docs/example.yml +11 -0
  32. data/app/pb_kits/playbook/pb_draggable/docs/index.js +5 -0
  33. data/app/pb_kits/playbook/pb_draggable/draggable.test.jsx +63 -0
  34. data/app/pb_kits/playbook/pb_draggable/subcomponents/DraggableContainer.tsx +54 -0
  35. data/app/pb_kits/playbook/pb_draggable/subcomponents/DraggableItem.tsx +57 -0
  36. data/app/pb_kits/playbook/pb_form_group/_form_group.scss +2 -2
  37. data/app/pb_kits/playbook/pb_gauge/_gauge.tsx +4 -1
  38. data/app/pb_kits/playbook/pb_gauge/gauge.rb +6 -1
  39. data/app/pb_kits/playbook/pb_gauge/gauge.test.js +35 -0
  40. data/app/pb_kits/playbook/pb_icon/icon.rb +3 -2
  41. data/app/pb_kits/playbook/pb_line_graph/_line_graph.tsx +8 -2
  42. data/app/pb_kits/playbook/pb_line_graph/lineGraph.test.js +52 -0
  43. data/app/pb_kits/playbook/pb_line_graph/line_graph.rb +22 -1
  44. data/app/pb_kits/playbook/pb_list/_list.tsx +43 -2
  45. data/app/pb_kits/playbook/pb_list/_list_item.tsx +46 -10
  46. data/app/pb_kits/playbook/pb_selectable_card/_selectable_card.scss +1 -1
  47. data/app/pb_kits/playbook/pb_selectable_list/_item.tsx +35 -28
  48. data/app/pb_kits/playbook/pb_selectable_list/_selectable_list.tsx +5 -1
  49. data/app/pb_kits/playbook/pb_table/_table.tsx +5 -0
  50. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_column.jsx +33 -32
  51. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_column.md +1 -1
  52. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_column_rails.md +2 -0
  53. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_row.jsx +33 -33
  54. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_row.md +1 -1
  55. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_row_rails.html.erb +34 -0
  56. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_row_rails.md +2 -0
  57. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_data.jsx +51 -50
  58. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_data.md +1 -1
  59. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_data_rails.html.erb +54 -0
  60. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_data_rails.md +2 -0
  61. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_row.jsx +37 -38
  62. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_row.md +1 -0
  63. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_row_rails.html.erb +53 -0
  64. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_row_rails.md +1 -0
  65. data/app/pb_kits/playbook/pb_table/docs/{_table_alignment_row.html.erb → _table_outer_padding.html.erb} +7 -7
  66. data/app/pb_kits/playbook/pb_table/docs/_table_outer_padding.jsx +76 -0
  67. data/app/pb_kits/playbook/pb_table/docs/_table_outer_padding.md +1 -0
  68. data/app/pb_kits/playbook/pb_table/docs/example.yml +9 -9
  69. data/app/pb_kits/playbook/pb_table/docs/index.js +1 -0
  70. data/app/pb_kits/playbook/pb_table/styles/_all.scss +1 -0
  71. data/app/pb_kits/playbook/pb_table/styles/_outer_padding.scss +21 -0
  72. data/app/pb_kits/playbook/pb_table/table.rb +14 -1
  73. data/app/pb_kits/playbook/pb_table/table.test.js +5 -1
  74. data/app/pb_kits/playbook/pb_treemap_chart/_treemap_chart.tsx +12 -9
  75. data/app/pb_kits/playbook/pb_treemap_chart/treemapChart.test.js +61 -0
  76. data/app/pb_kits/playbook/pb_treemap_chart/treemap_chart.rb +6 -1
  77. data/app/pb_kits/playbook/playbook-doc.js +2 -0
  78. data/app/pb_kits/playbook/tokens/_vertical_align.scss +18 -0
  79. data/app/pb_kits/playbook/utilities/_vertical_align.scss +16 -0
  80. data/app/pb_kits/playbook/utilities/globalProps.ts +12 -1
  81. data/dist/menu.yml +5 -2
  82. data/dist/playbook-rails.js +7 -7
  83. data/lib/playbook/classnames.rb +1 -0
  84. data/lib/playbook/kit_base.rb +2 -0
  85. data/lib/playbook/version.rb +2 -2
  86. data/lib/playbook/vertical_align.rb +37 -0
  87. metadata +41 -7
  88. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_data.html.erb +0 -63
  89. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_row.html.erb +0 -52
  90. /data/app/pb_kits/playbook/pb_table/docs/{_table_alignment_column.html.erb → _table_alignment_column_rails.html.erb} +0 -0
@@ -0,0 +1,57 @@
1
+ import React from "react";
2
+ import classnames from "classnames";
3
+ import {
4
+ buildAriaProps,
5
+ buildCss,
6
+ buildDataProps,
7
+ buildHtmlProps
8
+ } from "../../utilities/props";
9
+ import { globalProps } from "../../utilities/globalProps";
10
+ import { DraggableContext } from "../context";
11
+
12
+ type DraggableItemProps = {
13
+ aria?: { [key: string]: string };
14
+ children?: React.ReactNode;
15
+ className?: string;
16
+ container?: any;
17
+ data?: { [key: string]: string };
18
+ htmlOptions?: {[key: string]: string | number | boolean | (() => void)},
19
+ id?: string;
20
+ };
21
+
22
+ const DraggableItem = (props: DraggableItemProps) => {
23
+ const { aria = {}, children, className, container, data = {}, htmlOptions = {}, id } = props;
24
+
25
+ const { isDragging, handleDragStart, handleDragEnter, handleDragEnd } =
26
+ DraggableContext();
27
+
28
+ const ariaProps = buildAriaProps(aria);
29
+ const dataProps = buildDataProps(data);
30
+ const htmlProps = buildHtmlProps(htmlOptions);
31
+
32
+ const classes = classnames(
33
+ buildCss("pb_draggable_item"),
34
+ `${isDragging === id ? "is_dragging" : ""}`,
35
+ globalProps(props),
36
+ className
37
+ );
38
+
39
+ return (
40
+ <div
41
+ {...ariaProps}
42
+ {...dataProps}
43
+ {...htmlProps}
44
+ className={classes}
45
+ draggable
46
+ id={id}
47
+ key={id}
48
+ onDragEnd={() => handleDragEnd()}
49
+ onDragEnter={() => handleDragEnter(id, container)}
50
+ onDragStart={() => handleDragStart(id, container)}
51
+ >
52
+ {children}
53
+ </div>
54
+ );
55
+ };
56
+
57
+ export default DraggableItem;
@@ -107,7 +107,7 @@
107
107
  }
108
108
 
109
109
  & > [class^=pb_date_picker_kit]:not(:last-child) {
110
- .text_input_wrapper input, [class^=pb_text_input_kit] .text_input_wrapper .flatpickr-wrapper {
110
+ .input_wrapper input, [class^=pb_text_input_kit] .date_picker_input_wrapper .flatpickr-wrapper {
111
111
  border-bottom-right-radius: 0;
112
112
  border-top-right-radius: 0;
113
113
  border-right-width: 0;
@@ -115,7 +115,7 @@
115
115
  }
116
116
 
117
117
  & > [class^=pb_date_picker_kit]:not(:first-child) {
118
- .text_input_wrapper input, [class^=pb_text_input_kit] .text_input_wrapper .flatpickr-wrapper {
118
+ .input_wrapper input, [class^=pb_text_input_kit] .date_picker_input_wrapper .flatpickr-wrapper {
119
119
  border-bottom-left-radius: 0;
120
120
  border-top-left-radius: 0;
121
121
  }
@@ -13,11 +13,13 @@ import typography from "../tokens/exports/_typography.scss";
13
13
  import { buildAriaProps, buildCss, buildDataProps, buildHtmlProps } from "../utilities/props";
14
14
  import { globalProps } from "../utilities/globalProps";
15
15
  import { GenericObject } from "../types";
16
+ import { merge } from 'lodash'
16
17
 
17
18
  type GaugeProps = {
18
19
  aria: { [key: string]: string };
19
20
  className?: string;
20
21
  chartData?: { name: string; value: number[] | number }[];
22
+ customOptions?: Partial<Highcharts.Options>;
21
23
  dark?: boolean;
22
24
  data?: { [key: string]: string };
23
25
  disableAnimation?: boolean;
@@ -41,6 +43,7 @@ type GaugeProps = {
41
43
  const Gauge = ({
42
44
  aria = {},
43
45
  chartData,
46
+ customOptions = {},
44
47
  dark = false,
45
48
  data = {},
46
49
  disableAnimation = false,
@@ -175,7 +178,7 @@ const Gauge = ({
175
178
  },
176
179
  };
177
180
 
178
- setOptions({ ...staticOptions });
181
+ setOptions(merge(staticOptions, customOptions));
179
182
 
180
183
  if (document.querySelector(".prefix")) {
181
184
  document.querySelectorAll(".prefix").forEach((prefix) => {
@@ -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,