playbook_ui 11.11.0 → 11.12.1.pre.alpha.passphrase1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/index.js +2 -0
  3. data/app/pb_kits/playbook/pb_bar_graph/_bar_graph.jsx +21 -1
  4. data/app/pb_kits/playbook/pb_bar_graph/bar_graph.rb +17 -1
  5. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_legend_position.html.erb +62 -0
  6. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_legend_position.jsx +86 -0
  7. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_legend_position.md +17 -0
  8. data/app/pb_kits/playbook/pb_bar_graph/docs/example.yml +2 -0
  9. data/app/pb_kits/playbook/pb_bar_graph/docs/index.js +1 -0
  10. data/app/pb_kits/playbook/pb_button/_button.scss +6 -0
  11. data/app/pb_kits/playbook/pb_button/docs/_button_default.html.erb +4 -4
  12. data/app/pb_kits/playbook/pb_button/docs/_button_default.jsx +18 -17
  13. data/app/pb_kits/playbook/pb_circle_chart/_circle_chart.jsx +15 -0
  14. data/app/pb_kits/playbook/pb_circle_chart/circle_chart.rb +16 -0
  15. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_legend_position.html.erb +86 -0
  16. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_legend_position.jsx +114 -0
  17. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_legend_position.md +17 -0
  18. data/app/pb_kits/playbook/pb_circle_chart/docs/example.yml +2 -0
  19. data/app/pb_kits/playbook/pb_circle_chart/docs/index.js +1 -0
  20. data/app/pb_kits/playbook/pb_date_picker/date_picker.test.js +50 -50
  21. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_time.jsx +1 -0
  22. data/app/pb_kits/playbook/pb_date_picker/plugins/timeSelect.ts +89 -89
  23. data/app/pb_kits/playbook/pb_date_picker/sass_partials/_time_selection_styles.scss +15 -0
  24. data/app/pb_kits/playbook/pb_dialog/_dialog.scss +30 -1
  25. data/app/pb_kits/playbook/pb_dialog/dialog.html.erb +28 -0
  26. data/app/pb_kits/playbook/pb_dialog/dialog.rb +7 -35
  27. data/app/pb_kits/playbook/pb_dialog/dialogHelper.js +21 -0
  28. data/app/pb_kits/playbook/pb_dialog/dialog_body.html.erb +7 -0
  29. data/app/pb_kits/playbook/pb_dialog/dialog_body.rb +13 -0
  30. data/app/pb_kits/playbook/pb_dialog/dialog_footer.html.erb +13 -0
  31. data/app/pb_kits/playbook/pb_dialog/dialog_footer.rb +16 -0
  32. data/app/pb_kits/playbook/pb_dialog/dialog_header.html.erb +13 -0
  33. data/app/pb_kits/playbook/pb_dialog/dialog_header.rb +3 -20
  34. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_compound_components.html.erb +12 -0
  35. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_compound_components.md +3 -1
  36. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_default.html.erb +11 -0
  37. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_default.md +3 -0
  38. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_sizes.html.erb +29 -0
  39. data/app/pb_kits/playbook/pb_dialog/docs/example.yml +3 -0
  40. data/app/pb_kits/playbook/pb_icon/_icon.tsx +3 -1
  41. data/app/pb_kits/playbook/pb_icon/icon.rb +8 -1
  42. data/app/pb_kits/playbook/pb_icon/icon.test.js +155 -0
  43. data/app/pb_kits/playbook/pb_legend/{_legend.jsx → _legend.tsx} +6 -6
  44. data/app/pb_kits/playbook/pb_legend/legend.test.js +29 -0
  45. data/app/pb_kits/playbook/pb_line_graph/_line_graph.jsx +20 -0
  46. data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_legend_position.html.erb +62 -0
  47. data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_legend_position.jsx +83 -0
  48. data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_legend_position.md +17 -0
  49. data/app/pb_kits/playbook/pb_line_graph/docs/example.yml +2 -0
  50. data/app/pb_kits/playbook/pb_line_graph/docs/index.js +1 -0
  51. data/app/pb_kits/playbook/pb_line_graph/line_graph.rb +17 -1
  52. data/app/pb_kits/playbook/pb_passphrase/_passphrase.jsx +56 -97
  53. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_breached.html.erb +145 -1
  54. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_breached.jsx +127 -3
  55. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_breached.md +11 -2
  56. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_common.html.erb +136 -0
  57. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_common.jsx +90 -8
  58. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_common.md +5 -0
  59. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_confirmation.html.erb +51 -0
  60. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_confirmation.jsx +39 -0
  61. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_default.html.erb +0 -2
  62. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_default.jsx +6 -20
  63. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_input_props.html.erb +2 -2
  64. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_input_props.jsx +1 -1
  65. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_meter_settings.html.erb +318 -5
  66. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_meter_settings.jsx +134 -48
  67. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_meter_settings.md +11 -5
  68. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_strength_change.html.erb +123 -0
  69. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_strength_change.jsx +96 -20
  70. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_strength_change.md +6 -2
  71. data/app/pb_kits/playbook/pb_passphrase/docs/example.yml +4 -0
  72. data/app/pb_kits/playbook/pb_passphrase/docs/index.js +1 -0
  73. data/app/pb_kits/playbook/pb_passphrase/passphrase.html.erb +1 -1
  74. data/app/pb_kits/playbook/pb_passphrase/passphrase.rb +5 -9
  75. data/app/pb_kits/playbook/pb_passphrase/passphrase.test.jsx +0 -47
  76. data/app/pb_kits/playbook/pb_radio/_radio.scss +1 -1
  77. data/app/pb_kits/playbook/pb_title/_title.scss +5 -0
  78. data/app/pb_kits/playbook/pb_title/_title.tsx +4 -1
  79. data/app/pb_kits/playbook/pb_title/docs/{_title_light.html.erb → _title_default.html.erb} +3 -3
  80. data/app/pb_kits/playbook/pb_title/docs/{_title_light.jsx → _title_default.jsx} +14 -14
  81. data/app/pb_kits/playbook/pb_title/docs/{_title_light.md → _title_default.md} +0 -0
  82. data/app/pb_kits/playbook/pb_title/docs/_title_light_weight.html.erb +1 -0
  83. data/app/pb_kits/playbook/pb_title/docs/_title_light_weight.jsx +19 -0
  84. data/app/pb_kits/playbook/pb_title/docs/_title_light_weight.md +4 -0
  85. data/app/pb_kits/playbook/pb_title/docs/example.yml +4 -2
  86. data/app/pb_kits/playbook/pb_title/docs/index.js +2 -1
  87. data/app/pb_kits/playbook/pb_title/title.rb +6 -1
  88. data/app/pb_kits/playbook/pb_title/title.test.js +13 -0
  89. data/app/pb_kits/playbook/playbook-rails.js +4 -0
  90. data/app/pb_kits/playbook/plugins/pb_chart.js +13 -0
  91. data/app/pb_kits/playbook/tokens/_titles.scss +10 -1
  92. data/app/pb_kits/playbook/tokens/_typography.scss +2 -2
  93. data/lib/playbook/version.rb +2 -2
  94. metadata +37 -13
  95. data/app/pb_kits/playbook/pb_dialog/_dialog.html.erb +0 -10
  96. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_default.md +0 -1
  97. data/app/pb_kits/playbook/pb_passphrase/passwordStrength.js +0 -55
  98. data/app/pb_kits/playbook/pb_passphrase/useHaveIBeenPwned.js +0 -52
  99. data/app/pb_kits/playbook/pb_passphrase/useZxcvbn.js +0 -58
@@ -0,0 +1,13 @@
1
+ <%= content_tag(:div,
2
+ id: object.id,
3
+ data: object.data,
4
+ aria: object.aria) do %>
5
+ <%= pb_rails("flex", props: { classname:object.classname, spacing:"between", padding_x:"sm", padding:"sm", padding_bottom:"sm" }) do %>
6
+ <%= pb_rails("button", props: { type: "submit", id: object.confirm_button_id }) do %>
7
+ <%= object.confirm_button %>
8
+ <% end %>
9
+ <%= pb_rails("button", props: { data: {"close-dialog": "#{object.id}" }, id: object.cancel_button_id, variant: "link"}) do %>
10
+ <%= object.cancel_button %>
11
+ <% end %>
12
+ <% end %>
13
+ <% end %>
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbDialog
5
+ class DialogFooter < Playbook::KitBase
6
+ prop :cancel_button
7
+ prop :confirm_button
8
+ prop :confirm_button_id
9
+ prop :cancel_button_id
10
+
11
+ def classname
12
+ generate_classname("dialog_footer")
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,13 @@
1
+ <%= content_tag(:div,
2
+ id: object.id,
3
+ data: object.data,
4
+ aria: object.aria) do %>
5
+ <%= pb_rails("flex", props: {classname:object.classname, spacing:"between", padding:"sm", align:"center"}) do %>
6
+ <%= content.presence || object.title %>
7
+
8
+ <button class="dialog-button-class" data-close-dialog= <%= object.id %> >
9
+ <%= pb_rails("icon", props:{icon: "times"}) %>
10
+ </button>
11
+ <% end %>
12
+ <%= pb_rails("section_separator") %>
13
+ <% end %>
@@ -2,28 +2,11 @@
2
2
 
3
3
  module Playbook
4
4
  module PbDialog
5
- class DialogHeader
6
- include Playbook::Props
7
-
8
- partial "pb_dialog/child_kits/dialog_header"
9
-
10
- prop :closeable, type: Playbook::Props::Boolean, default: true
11
- prop :padding
12
- prop :separator, type: Playbook::Props::Boolean, default: true
13
- prop :spacing
14
- prop :text
5
+ class DialogHeader < Playbook::KitBase
15
6
  prop :title
16
7
 
17
- def dialog_header_options
18
- {
19
- id: id,
20
- closeable: closeable,
21
- padding: padding,
22
- separator: separator,
23
- spacing: spacing,
24
- text: text,
25
- title: title,
26
- }
8
+ def classname
9
+ generate_classname("dialog_header")
27
10
  end
28
11
  end
29
12
  end
@@ -0,0 +1,12 @@
1
+ <%= pb_rails("button", props: { text: "Open Complex Dialog", data:{"open-dialog": "dialog-complex"} }) %>
2
+
3
+ <%= pb_rails("dialog", props: { id:"dialog-complex", size: "lg" }) do %>
4
+ <%= pb_rails("dialog/dialog_header", props: { id: "dialog-complex" } ) do %>
5
+ <%= pb_rails("caption", props: { text: "This is a complex dialog" }) %>
6
+ <% end %>
7
+ <%= pb_rails("dialog/dialog_body") do %>
8
+ <%= pb_rails("caption", props: { text: "Description", margin_bottom: "xs" }) %>
9
+ <%= pb_rails("rich_text_editor", props: {id: "default", value: "Add your text here"}) %>
10
+ <% end %>
11
+ <%= pb_rails("dialog/dialog_footer", props: {cancel_button: "Cancel", confirm_button: "Confirm", confirm_button_id:"confirm-complex", id: "dialog-complex"}) %>
12
+ <% end %>
@@ -1,2 +1,4 @@
1
1
  The dialog kit also supports customizing your dialog with a [compound component](https://kentcdodds.com/blog/compound-components-with-react-hooks) structure.
2
- This allows for greater flexibility and more complex dialogs.
2
+ This allows for greater flexibility and more complex dialogs.
3
+
4
+ For the Rails version, when using the kit as a compound component it is necessary to pass the same value as the id for the dialog, the dialog header and the dialog footer in order for the opening and closing of the dialog to function as expected.
@@ -0,0 +1,11 @@
1
+ <%= pb_rails("button", props: { text: "Open Dialog", data: {"open-dialog": "dialog-1"} }) %>
2
+
3
+ <%= pb_rails("dialog", props: {
4
+ id:"dialog-1",
5
+ size: "sm",
6
+ title: "This is a header",
7
+ text: "This is a dialog.",
8
+ cancel_button: "Cancel",
9
+ confirm_button: "Confirm",
10
+ confirm_button_id: "confirm-button-1"
11
+ }) %>
@@ -0,0 +1,3 @@
1
+ For the Rails version of the dialog kit, the clickable element being used to open the dialog must be given a `open-dialog` data attribute with a value that is the same as the id being given to the dialog itself. See code example below to see this in action.
2
+
3
+ Additionally, both the cancel button and the confirm button have optional id props which can be used to pass in a custom id to allow developers to target that button with custom javascript if needed (`confirm_button_id` and `cancel_button_id`).
@@ -0,0 +1,29 @@
1
+ <%= pb_rails("button", props: { text: "Small Dialog", data:{"open-dialog": "dialog-sm"} }) %>
2
+ <%= pb_rails("button", props: { text: "Medium Dialog", data:{"open-dialog": "dialog-md"} }) %>
3
+ <%= pb_rails("button", props: { text: "Large Dialog", data:{"open-dialog": "dialog-lg"} }) %>
4
+
5
+ <%= pb_rails("dialog", props: {
6
+ id:"dialog-sm",
7
+ size: "sm",
8
+ title: "This is a header",
9
+ text: "I am a small dialog",
10
+ cancel_button: "Cancel",
11
+ confirm_button: "Confirm",
12
+ }) %>
13
+
14
+
15
+ <%= pb_rails("dialog", props: {
16
+ id:"dialog-md",
17
+ size: "md",
18
+ title: "This is a header",
19
+ text: "I am a medium dialog",
20
+ cancel_button: "Cancel", confirm_button: "Confirm",
21
+ }) %>
22
+
23
+ <%= pb_rails("dialog", props: {
24
+ id:"dialog-lg", size: "lg",
25
+ title: "This is a header",
26
+ text: "I am a large dialog",
27
+ cancel_button: "Cancel",
28
+ confirm_button: "Confirm"
29
+ }) %>
@@ -1,6 +1,9 @@
1
1
  examples:
2
2
 
3
3
  rails:
4
+ - dialog_default: Simple
5
+ - dialog_compound_components: Complex
6
+ - dialog_sizes: Sizes
4
7
 
5
8
  react:
6
9
  - dialog_default: Simple
@@ -34,6 +34,7 @@ type IconProps = {
34
34
  pulse?: boolean,
35
35
  rotation?: 90 | 180 | 270,
36
36
  size?: IconSizes,
37
+ fontStyle?: 'far' | 'fas' | 'fab',
37
38
  spin?: boolean,
38
39
  } & GlobalProps
39
40
 
@@ -61,6 +62,7 @@ const Icon = (props: IconProps) => {
61
62
  pulse = false,
62
63
  rotation,
63
64
  size,
65
+ fontStyle = 'far',
64
66
  spin = false,
65
67
  } = props
66
68
 
@@ -85,7 +87,7 @@ const Icon = (props: IconProps) => {
85
87
  const classes = classnames(
86
88
  flipMap[flip],
87
89
  'pb_icon_kit',
88
- customIcon ? '' : 'far',
90
+ customIcon ? '' : fontStyle,
89
91
  faClasses,
90
92
  globalProps(props),
91
93
  className
@@ -32,13 +32,16 @@ module Playbook
32
32
  prop :size, type: Playbook::Props::Enum,
33
33
  values: ["lg", "xs", "sm", "1x", "2x", "3x", "4x", "5x", "6x", "7x", "8x", "9x", "10x", nil],
34
34
  default: nil
35
+ prop :font_style, type: Playbook::Props::Enum,
36
+ values: %w[far fas fab],
37
+ default: "far"
35
38
  prop :spin, type: Playbook::Props::Boolean,
36
39
  default: false
37
40
 
38
41
  def classname
39
42
  generate_classname(
40
43
  "pb_icon_kit",
41
- "far",
44
+ font_style_class,
42
45
  icon_class,
43
46
  border_class,
44
47
  fixed_width_class,
@@ -131,6 +134,10 @@ module Playbook
131
134
  size ? "fa-#{size}" : nil
132
135
  end
133
136
 
137
+ def font_style_class
138
+ font_style ? font_style.to_s : "far"
139
+ end
140
+
134
141
  def spin_class
135
142
  spin ? "fa-spin" : nil
136
143
  end
@@ -0,0 +1,155 @@
1
+ import React from 'react'
2
+ import { render, screen, cleanup } from '../utilities/test-utils'
3
+
4
+ import Icon from './_icon'
5
+
6
+ const testId = "icon-kit"
7
+
8
+ describe("Icon Kit", () => {
9
+ test("renders Icon classname", () => {
10
+ render(
11
+ <Icon
12
+ data={{ testid: testId }}
13
+ fixedWidth
14
+ icon="user"
15
+ />
16
+ )
17
+
18
+ const kit = screen.getByTestId(testId)
19
+ expect(kit).toHaveClass("fa-user pb_icon_kit fa-fw far")
20
+ })
21
+
22
+ test("renders rotate prop", () => {[
23
+ "90", "180", "270"].forEach((rotateProp)=> {
24
+ render(
25
+ <Icon
26
+ data={{ testid: testId }}
27
+ fixedWidth
28
+ icon="user"
29
+ rotation={rotateProp}
30
+ />
31
+ )
32
+
33
+ const kit = screen.getByTestId(testId)
34
+ expect(kit).toHaveClass(`fa-user pb_icon_kit fa-fw fa-rotate-${rotateProp} far`)
35
+
36
+ cleanup()
37
+ })
38
+ })
39
+
40
+ test("renders flip prop", () => {
41
+ render(
42
+ <Icon
43
+ data={{ testid: testId }}
44
+ fixedWidth
45
+ flip="horizontal"
46
+ icon="user"
47
+ />
48
+ )
49
+
50
+ const kit = screen.getByTestId(testId)
51
+ expect(kit).toHaveClass("fa-user pb_icon_kit fa-fw fa-flip-horizontal far")
52
+ })
53
+
54
+
55
+ test("renders spinning icon", () => {
56
+ render(
57
+ <Icon
58
+ data={{ testid: testId }}
59
+ fixedWidth
60
+ icon="spinner"
61
+ spin
62
+ />
63
+ )
64
+
65
+ const kit = screen.getByTestId(testId)
66
+ expect(kit).toHaveClass("fa-spinner pb_icon_kit fa-fw fa-spin far")
67
+ })
68
+
69
+ test("renders pull icon", () => {
70
+ render(
71
+ <Icon
72
+ data={{ testid: testId }}
73
+ fixedWidth
74
+ icon="arrow-left"
75
+ pull="left"
76
+ />
77
+ )
78
+
79
+ const kit = screen.getByTestId(testId)
80
+ expect(kit).toHaveClass("fa-arrow-left pb_icon_kit fa-fw fa-pull-left far")
81
+ })
82
+
83
+ test("renders pull icon", () => {
84
+ render(
85
+ <Icon
86
+ data={{ testid: testId }}
87
+ fixedWidth
88
+ icon="arrow-left"
89
+ pull="left"
90
+ />
91
+ )
92
+
93
+ const kit = screen.getByTestId(testId)
94
+ expect(kit).toHaveClass("fa-arrow-left pb_icon_kit fa-fw fa-pull-left far")
95
+ })
96
+
97
+ test("renders border around icon", () => {
98
+ render(
99
+ <Icon
100
+ border
101
+ data={{ testid: testId }}
102
+ fixedWidth
103
+ icon="user"
104
+ />
105
+ )
106
+
107
+ const kit = screen.getByTestId(testId)
108
+ expect(kit).toHaveClass("fa-user pb_icon_kit fa-border fa-fw far")
109
+ })
110
+
111
+ test("renders size prop", () => {
112
+ ["lg",
113
+ "sm",
114
+ "xs",
115
+ "1x",
116
+ "2x",
117
+ "3x",
118
+ "4x",
119
+ "5x",
120
+ "6x",
121
+ "7x",
122
+ "8x",
123
+ "9x",
124
+ "10x"].forEach(
125
+ (sizeProp) => {
126
+ render(
127
+ <Icon
128
+ data={{ testid: testId }}
129
+ icon="user"
130
+ size={sizeProp}
131
+ />
132
+ )
133
+
134
+ const kit = screen.getByTestId(testId)
135
+ expect(kit).toHaveClass(`pb_icon_kit fa-user fa-fw fa-${sizeProp} far`)
136
+
137
+ cleanup()
138
+ })
139
+ })
140
+
141
+ test("renders fontStyle prop", () => {
142
+ render(
143
+ <Icon
144
+ data={{ testid: testId }}
145
+ fixedWidth
146
+ fontStyle="fas"
147
+ icon="user"
148
+ />
149
+ )
150
+
151
+ const kit = screen.getByTestId(testId)
152
+ expect(kit).toHaveClass("fa-user pb_icon_kit fa-fw fas")
153
+ })
154
+
155
+ })
@@ -1,5 +1,3 @@
1
- /* @flow */
2
-
3
1
  import React from 'react'
4
2
  import classnames from 'classnames'
5
3
 
@@ -10,7 +8,7 @@ import Body from '../pb_body/_body'
10
8
  import Title from '../pb_title/_title'
11
9
 
12
10
  type LegendProps = {
13
- aria?: object,
11
+ aria?: { [key: string]: string },
14
12
  className?: string,
15
13
  color?: string,
16
14
  dark?: boolean,
@@ -59,14 +57,16 @@ const Legend = (props: LegendProps) => {
59
57
  <span className={`${customColor ? "pb_legend_indicator_circle_custom" : "pb_legend_indicator_circle"}`}
60
58
  style={customColorStyle}
61
59
  />
62
- <If condition={prefixText}>
63
- <Title
60
+ {
61
+ prefixText && (
62
+ <Title
64
63
  dark={dark}
65
64
  size={4}
66
65
  tag="span"
67
66
  text={` ${prefixText} `}
68
67
  />
69
- </If>
68
+ )
69
+ }
70
70
  {` ${text} `}
71
71
  </Body>
72
72
  </div>
@@ -27,3 +27,32 @@ test('color prop', () => {
27
27
  const kit = screen.getByTestId('primary-test')
28
28
  expect(kit).toHaveClass('pb_legend_kit_category_17')
29
29
  })
30
+
31
+ test('prefixText prop renders', () => {
32
+ render(
33
+ <Legend
34
+ color="category_17"
35
+ data={{ testid: 'primary-test' }}
36
+ prefixText="10"
37
+ text="Test colors"
38
+ />
39
+ )
40
+
41
+ const kit = screen.getByTestId('primary-test')
42
+ const prefix = kit.querySelector(".pb_title_kit_size_4")
43
+ expect(prefix).toBeInTheDocument()
44
+ })
45
+
46
+ test('Color prop renders with custom HEX value', () => {
47
+ render(
48
+ <Legend
49
+ color="#dc418a"
50
+ data={{ testid: 'primary-test' }}
51
+ text="Test colors"
52
+ />
53
+ )
54
+
55
+ const kit = screen.getByTestId('primary-test')
56
+ const circle = kit.querySelector(".pb_legend_indicator_circle_custom")
57
+ expect(circle).toHaveStyle('background: rgb(220, 65, 138);')
58
+ })
@@ -7,6 +7,7 @@ import { globalProps } from '../utilities/globalProps'
7
7
  import pbChart from '../plugins/pb_chart'
8
8
 
9
9
  type LineGraphProps = {
10
+ align?: "left" | "right" | "center",
10
11
  axisTitle?: string,
11
12
  dark?: Boolean,
12
13
  xAxisCategories: array,
@@ -27,20 +28,30 @@ type LineGraphProps = {
27
28
  toggleLegendClick?: boolean,
28
29
  height?: string,
29
30
  colors: array,
31
+ layout?: "horizontal" | "vertical" | "proximate",
32
+ verticalAlign?: "top" | "middle" | "bottom",
33
+ x?: number,
34
+ y?: number,
30
35
  }
31
36
 
32
37
  export default class LineGraph extends React.Component<LineGraphProps> {
33
38
  static defaultProps = {
39
+ align: "center",
34
40
  className: 'pb_bar_graph',
35
41
  dark: false,
36
42
  gradient: false,
37
43
  type: 'line',
38
44
  legend: false,
39
45
  toggleLegendClick: true,
46
+ layout: "horizontal",
47
+ verticalAlign: "bottom",
48
+ x: 0,
49
+ y: 0,
40
50
  }
41
51
 
42
52
  componentDidMount() {
43
53
  const {
54
+ align,
44
55
  axisTitle,
45
56
  dark,
46
57
  xAxisCategories,
@@ -57,9 +68,14 @@ export default class LineGraph extends React.Component<LineGraphProps> {
57
68
  toggleLegendClick,
58
69
  height,
59
70
  colors = [],
71
+ layout,
72
+ verticalAlign,
73
+ x,
74
+ y,
60
75
  } = this.props
61
76
 
62
77
  new pbChart(`.${className}`, {
78
+ align,
63
79
  axisTitle: axisTitle,
64
80
  chartData: chartData,
65
81
  colors: colors,
@@ -75,6 +91,10 @@ export default class LineGraph extends React.Component<LineGraphProps> {
75
91
  legend: legend,
76
92
  toggleLegendClick: toggleLegendClick,
77
93
  height: height,
94
+ layout,
95
+ verticalAlign,
96
+ x,
97
+ y,
78
98
  })
79
99
  }
80
100
 
@@ -0,0 +1,62 @@
1
+ <% data = [{
2
+ name: 'Installation',
3
+ data: [43934, 52503, 57177, 69658, 97031, 119931, 137133, 154175]
4
+ }, {
5
+ name: 'Manufacturing',
6
+ data: [24916, 24064, 29742, 29851, 32490, 30282, 38121, 40434]
7
+ }, {
8
+ name: 'Sales & Distribution',
9
+ data: [11744, 17722, 16005, 19771, 20185, 24377, 32147, 39387]
10
+ }, {
11
+ name: 'Project Development',
12
+ data: [nil, nil, 7988, 12169, 15112, 22452, 34400, 34227]
13
+ }, {
14
+ name: 'Other',
15
+ data: [12908, 5948, 8105, 11248, 8989, 11816, 18274, 18111]
16
+ }] %>
17
+
18
+ <%= pb_rails("title", props: {size: 4, text: "align | vertical_align", padding_top: "sm", padding_bottom: "sm"})%>
19
+
20
+ <%= pb_rails("line_graph", props: {
21
+ id: "legend-position-line",
22
+ gradient: false,
23
+ chart_data: data,
24
+ x_axis_categories:['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug'],
25
+ title: 'Alignment of Legend',
26
+ axis_title: 'Number of Employees',
27
+ legend: true,
28
+ align: 'right',
29
+ vertical_align: 'top',
30
+ padding_bottom: "sm",
31
+ }) %>
32
+
33
+ <%= pb_rails("title", props: {size: 4, text: "layout", padding_top: "sm", padding_bottom: "sm"})%>
34
+
35
+ <%= pb_rails("line_graph", props: {
36
+ id: "legend-position-line-1",
37
+ gradient: false,
38
+ chart_data: data,
39
+ x_axis_categories:['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug'],
40
+ title: 'Layout of Legend',
41
+ axis_title: 'Number of Employees',
42
+ legend: true,
43
+ layout: 'vertical',
44
+ padding_top: "sm",
45
+ padding_bottom: "sm",
46
+ }) %>
47
+
48
+ <%= pb_rails("title", props: {size: 4, text: "x | y", padding_top: "sm", padding_bottom: "sm"})%>
49
+
50
+ <%= pb_rails("line_graph", props: {
51
+ id: "legend-position-line-2",
52
+ gradient: false,
53
+ chart_data: data,
54
+ x_axis_categories:['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug'],
55
+ title: 'Offset of Legend',
56
+ axis_title: 'Number of Employees',
57
+ legend: true,
58
+ layout: "vertical",
59
+ x: 100,
60
+ y: 10,
61
+ padding_top: "sm",
62
+ }) %>
@@ -0,0 +1,83 @@
1
+ import React from 'react'
2
+ import { LineGraph, Title } from '../..'
3
+
4
+ const data = [{
5
+ name: 'Installation',
6
+ data: [43934, 52503, 57177, 69658, 97031, 119931, 137133, 154175],
7
+ }, {
8
+ name: 'Manufacturing',
9
+ data: [24916, 24064, 29742, 29851, 32490, 30282, 38121, 40434],
10
+ }, {
11
+ name: 'Sales & Distribution',
12
+ data: [11744, 17722, 16005, 19771, 20185, 24377, 32147, 39387],
13
+ }, {
14
+ name: 'Project Development',
15
+ data: [null, null, 7988, 12169, 15112, 22452, 34400, 34227],
16
+ }, {
17
+ name: 'Other',
18
+ data: [12908, 5948, 8105, 11248, 8989, 11816, 18274, 18111],
19
+ }]
20
+
21
+ const LineGraphLegendPosition = (props) => (
22
+ <div>
23
+ <Title
24
+ paddingBottom="sm"
25
+ paddingTop="sm"
26
+ size={4}
27
+ tag="h4"
28
+ text="align | verticalAlign"
29
+ />
30
+ <LineGraph
31
+ align='right'
32
+ axisTitle="Number of Employees"
33
+ chartData={data}
34
+ id="legend-position-line"
35
+ legend
36
+ title="Alignment of Legend"
37
+ verticalAlign="top"
38
+ xAxisCategories={['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug']}
39
+ yAxisMin={0}
40
+ {...props}
41
+ />
42
+ <Title
43
+ paddingBottom="sm"
44
+ paddingTop="sm"
45
+ size={4}
46
+ tag="h4"
47
+ text="layout"
48
+ />
49
+ <LineGraph
50
+ axisTitle="Number of Employees"
51
+ chartData={data}
52
+ id="legend-position-line-1"
53
+ layout="vertical"
54
+ legend
55
+ title="Layout of Legend"
56
+ xAxisCategories={['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug']}
57
+ yAxisMin={0}
58
+ {...props}
59
+ />
60
+ <Title
61
+ paddingBottom="sm"
62
+ paddingTop="sm"
63
+ size={4}
64
+ tag="h4"
65
+ text="x | y"
66
+ />
67
+ <LineGraph
68
+ axisTitle="Number of Employees"
69
+ chartData={data}
70
+ id="legend-position-line-2"
71
+ layout="vertical"
72
+ legend
73
+ title="Offset of Legend"
74
+ x={100}
75
+ xAxisCategories={['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug']}
76
+ y={10}
77
+ yAxisMin={0}
78
+ {...props}
79
+ />
80
+ </div>
81
+ )
82
+
83
+ export default LineGraphLegendPosition
@@ -0,0 +1,17 @@
1
+ ##### Prop
2
+
3
+ `align` **Type**: String | **Values**: left | center | right (defaults to center)
4
+ `verticalAlign` **Type**: String | **Values**: top | middle | bottom (defaults middle)
5
+ `layout` **Type**: String | **Values**: horizontal | vertical | proximate (defaults to horizontal)
6
+ `x` **Type**: Number (defaults to 0)
7
+ `y` **Type**: Number (defaults to 0)
8
+
9
+ -
10
+
11
+ - `layout` determines the position of the legend items
12
+ `layout: proximate` will place the legend items as close as possible to the graphs they're representing. It will also determine whether to place the legend above/below or on the side of the plot area, if the legend is in a corner.
13
+
14
+ - `x` offsets the legend relative to its horizontal alignmnet. Negative x moves it to the left, positive x moves it to the right
15
+
16
+
17
+ - `y` offsets the legend relative to its vertical alignmnet. Negative y moves it up, positive y moves it down.
@@ -3,6 +3,7 @@ examples:
3
3
  rails:
4
4
  - line_graph_default: Default
5
5
  - line_graph_legend: Legend
6
+ - line_graph_legend_position: Legend Position
6
7
  - line_graph_legend_nonclickable: Legend Nonclickable
7
8
  - line_graph_height: Height
8
9
  - line_graph_colors: Color Overrides
@@ -11,6 +12,7 @@ examples:
11
12
  react:
12
13
  - line_graph_default: Default
13
14
  - line_graph_legend: Legend
15
+ - line_graph_legend_position: Legend Position
14
16
  - line_graph_legend_nonclickable: Legend Nonclickable
15
17
  - line_graph_height: Height
16
18
  - line_graph_colors: Color Overrides