playbook_ui 15.3.0.pre.rc.6 → 15.3.0

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 (64) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/_playbook.scss +2 -0
  3. data/app/pb_kits/playbook/pb_bread_crumbs/docs/_bread_crumbs_default.html.erb +4 -4
  4. data/app/pb_kits/playbook/pb_bread_crumbs/docs/_bread_crumbs_default.jsx +4 -0
  5. data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_description.md +3 -0
  6. data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_description.md +3 -0
  7. data/app/pb_kits/playbook/pb_pb_gauge_chart/_pb_gauge_chart.scss +3 -0
  8. data/app/pb_kits/playbook/pb_pb_gauge_chart/_pb_gauge_chart.tsx +69 -0
  9. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_description.md +3 -0
  10. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_color.html.erb +12 -0
  11. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_color.jsx +24 -0
  12. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_color.md +5 -0
  13. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_complex.html.erb +45 -0
  14. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_complex.jsx +119 -0
  15. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_complex.md +1 -0
  16. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_default.html.erb +5 -0
  17. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_default.jsx +17 -0
  18. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_disable_animation.html.erb +12 -0
  19. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_disable_animation.jsx +24 -0
  20. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_full_circle.html.erb +23 -0
  21. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_full_circle.jsx +37 -0
  22. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_height.html.erb +40 -0
  23. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_height.jsx +56 -0
  24. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_live_data.jsx +64 -0
  25. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_min_max.html.erb +27 -0
  26. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_min_max.jsx +40 -0
  27. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_min_max.md +1 -0
  28. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_sizing.html.erb +19 -0
  29. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_sizing.jsx +65 -0
  30. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_sizing.md +3 -0
  31. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_title.html.erb +14 -0
  32. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_title.jsx +27 -0
  33. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_units.html.erb +39 -0
  34. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_units.jsx +58 -0
  35. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/_pb_gauge_chart_units.md +1 -0
  36. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/example.yml +29 -0
  37. data/app/pb_kits/playbook/pb_pb_gauge_chart/docs/index.js +11 -0
  38. data/app/pb_kits/playbook/pb_pb_gauge_chart/pbGaugeGraphTheme.ts +91 -0
  39. data/app/pb_kits/playbook/pb_pb_gauge_chart/pb_gauge_chart.html.erb +1 -0
  40. data/app/pb_kits/playbook/pb_pb_gauge_chart/pb_gauge_chart.rb +25 -0
  41. data/app/pb_kits/playbook/pb_pb_gauge_chart/pb_gauge_chart.test.jsx +80 -0
  42. data/app/pb_kits/playbook/pb_pb_line_graph/docs/_description.md +1 -1
  43. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.tsx +25 -6
  44. data/app/pb_kits/playbook/pb_typeahead/_typeahead.test.jsx +35 -1
  45. data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +71 -2
  46. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_default_options.html.erb +36 -0
  47. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_default_options.md +1 -0
  48. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_default_value.jsx +41 -0
  49. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_default_value.md +1 -0
  50. data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +2 -0
  51. data/app/pb_kits/playbook/pb_typeahead/docs/index.js +1 -0
  52. data/dist/chunks/{_line_graph-BdWJQM89.js → _line_graph-0IiTB9gA.js} +1 -1
  53. data/dist/chunks/_typeahead-BvV7a9cR.js +6 -0
  54. data/dist/chunks/{_weekday_stacked-Cs4JMnk9.js → _weekday_stacked-BZ7z8ukT.js} +1 -1
  55. data/dist/chunks/{lib-QZuu1ltS.js → lib-izYrkvOQ.js} +2 -2
  56. data/dist/chunks/{pb_form_validation-CleM960_.js → pb_form_validation-Cah5Z5J3.js} +1 -1
  57. data/dist/chunks/vendor.js +1 -1
  58. data/dist/menu.yml +6 -0
  59. data/dist/playbook-doc.js +2 -2
  60. data/dist/playbook-rails-react-bindings.js +1 -1
  61. data/dist/playbook-rails.js +1 -1
  62. data/lib/playbook/version.rb +1 -1
  63. metadata +48 -7
  64. data/dist/chunks/_typeahead-BIV3J69k.js +0 -6
@@ -0,0 +1,27 @@
1
+ <% data = [{ name: "Rating", y: 4.5 }] %>
2
+
3
+ <% chart_options = {
4
+ title: {
5
+ text: "Product Rating",
6
+ },
7
+ yAxis: {
8
+ min: 0,
9
+ max: 5,
10
+ lineWidth: 0,
11
+ tickWidth: 0,
12
+ minorTickInterval: nil,
13
+ tickAmount: 2,
14
+ tickPositions: [0, 5],
15
+ labels: {
16
+ y: 26,
17
+ enabled: true,
18
+ style: {
19
+ color: '#C1CDD6',
20
+ fontWeight:'700',
21
+ }
22
+ },
23
+ },
24
+ series: [{ data: data }],
25
+ } %>
26
+
27
+ <%= pb_rails("pb_gauge_chart", props: { options: chart_options }) %>
@@ -0,0 +1,40 @@
1
+ import React from 'react'
2
+ import PbGaugeChart from '../../pb_pb_gauge_chart/_pb_gauge_chart'
3
+ import { colors, typography } from 'playbook-ui'
4
+
5
+ const data = [{ name: "Rating", y: 4.5 }]
6
+
7
+ const chartOptions = {
8
+ title: {
9
+ text: "Product Rating",
10
+ },
11
+ yAxis: {
12
+ min: 0,
13
+ max: 5,
14
+ lineWidth: 0,
15
+ tickWidth: 0,
16
+ minorTickInterval: null,
17
+ tickAmount: 2,
18
+ tickPositions: [0, 5],
19
+ labels: {
20
+ y: 26,
21
+ enabled: true,
22
+ style: {
23
+ color: colors.neutral,
24
+ fontFamily: typography.font_family_base,
25
+ fontWeight: typography.bold,
26
+ }
27
+ },
28
+ },
29
+ series: [{ data: data }],
30
+ };
31
+ const PbGaugeChartMinMax = (props) => (
32
+ <div>
33
+ <PbGaugeChart
34
+ options={chartOptions}
35
+ {...props}
36
+ />
37
+ </div>
38
+ )
39
+
40
+ export default PbGaugeChartMinMax
@@ -0,0 +1 @@
1
+ By default, Highcharts set min to 0 and max to 100 but this can be customized if needed as shown here.
@@ -0,0 +1,19 @@
1
+ <% chart_options = { series: [{ data:[{ name: "Point 1", y: 100 }] }] } %>
2
+ <% chart_options_1 = { series: [{ data:[{ name: "Point 2", y: 75 }] }] } %>
3
+ <% chart_options_2 = { series: [{ data:[{ name: "Point 3", y: 50 }] }] } %>
4
+ <% chart_options_3 = { series: [{ data:[{ name: "Point 4", y: 25 }] }] } %>
5
+
6
+ <%= pb_rails("flex", props: {wrap: true, align: "center"}) do %>
7
+ <%= pb_rails("flex/flex_item", props: {fixed_size: "400px", overflow: "hidden", shrink: true }) do %>
8
+ <%= pb_rails("pb_gauge_chart", props: { options: chart_options }) %>
9
+ <% end %>
10
+ <%= pb_rails("flex/flex_item", props: {fixed_size: "300px", overflow: "hidden", shrink: true }) do %>
11
+ <%= pb_rails("pb_gauge_chart", props: { options: chart_options_1 }) %>
12
+ <% end %>
13
+ <%= pb_rails("flex/flex_item", props: {fixed_size: "200px", overflow: "hidden", shrink: true }) do %>
14
+ <%= pb_rails("pb_gauge_chart", props: { options: chart_options_2 }) %>
15
+ <% end %>
16
+ <%= pb_rails("flex/flex_item", props: {fixed_size: "155px", overflow: "hidden", shrink: true }) do %>
17
+ <%= pb_rails("pb_gauge_chart", props: { options: chart_options_3 }) %>
18
+ <% end %>
19
+ <% end %>
@@ -0,0 +1,65 @@
1
+ import React from 'react'
2
+ import PbGaugeChart from '../../pb_pb_gauge_chart/_pb_gauge_chart'
3
+ import Flex from '../../pb_flex/_flex'
4
+ import FlexItem from '../../pb_flex/_flex_item'
5
+
6
+
7
+ const PbGaugeChartSizing = (props) => (
8
+ <div>
9
+ <Flex
10
+ align="center"
11
+ wrap
12
+ >
13
+ <FlexItem
14
+ fixedSize="400px"
15
+ overflow="hidden"
16
+ shrink
17
+ >
18
+ <PbGaugeChart
19
+ options={{
20
+ series: [{ data: [{ name: "Point 1", y: 100 }] }],
21
+ }}
22
+ />
23
+ </FlexItem>
24
+ <FlexItem
25
+ fixedSize="300px"
26
+ overflow="hidden"
27
+ shrink
28
+ >
29
+ <PbGaugeChart
30
+ options={{
31
+ series: [{ data: [{ name: "Point 2", y: 75 }] }],
32
+ }}
33
+ {...props}
34
+ />
35
+ </FlexItem>
36
+ <FlexItem
37
+ fixedSize="200px"
38
+ overflow="hidden"
39
+ shrink
40
+ >
41
+ <PbGaugeChart
42
+ options={{
43
+ series: [{ data: [{ name: "Point 3", y: 50 }] }],
44
+ }}
45
+ />
46
+ </FlexItem>
47
+ <FlexItem
48
+ fixedSize="125px"
49
+ overflow="hidden"
50
+ shrink
51
+ >
52
+ <PbGaugeChart
53
+ options={{
54
+ chart: {
55
+ height: "100%",
56
+ },
57
+ series: [{ data: [{ name: "Point 4", y: 25 }] }],
58
+ }}
59
+ />
60
+ </FlexItem>
61
+ </Flex>
62
+ </div>
63
+ )
64
+
65
+ export default PbGaugeChartSizing
@@ -0,0 +1,3 @@
1
+ The Gauge chart resizes dynamically to fit whatever element it's placed within.
2
+
3
+ **Note**: set overflow to hidden on the parent element when nesting gauges inside of flex items to best respond to shrinking screens.
@@ -0,0 +1,14 @@
1
+ <% data = [{ name: "Score", y: 780 }] %>
2
+
3
+ <% chart_options = {
4
+ title: {
5
+ text: "Credit Score",
6
+ },
7
+ yAxis: {
8
+ min: 300,
9
+ max: 850,
10
+ },
11
+ series: [{ data: data }],
12
+ } %>
13
+
14
+ <%= pb_rails("pb_gauge_chart", props: { options: chart_options }) %>
@@ -0,0 +1,27 @@
1
+ import React from 'react'
2
+ import PbGaugeChart from '../../pb_pb_gauge_chart/_pb_gauge_chart'
3
+
4
+
5
+ const data = [{ name: "Score", y: 780 }]
6
+
7
+ const chartOptions = {
8
+ title: {
9
+ text: "Credit Score",
10
+ },
11
+ yAxis: {
12
+ min: 300,
13
+ max: 850,
14
+ },
15
+ series: [{ data: data }],
16
+ };
17
+
18
+ const PbGaugeChartTitle = (props) => (
19
+ <div>
20
+ <PbGaugeChart
21
+ options={chartOptions}
22
+ {...props}
23
+ />
24
+ </div>
25
+ )
26
+
27
+ export default PbGaugeChartTitle
@@ -0,0 +1,39 @@
1
+ <% data1 = [{ name: 'Data Used', y: 32 }] %>
2
+ <% data2 = [{ name: 'Sales to Date', y: 65 }] %>
3
+
4
+ <% chart_options_1 = {
5
+ title: {
6
+ text: "Data Usage",
7
+ },
8
+ series: [{ data: data1 }],
9
+ plotOptions: {
10
+ solidgauge: {
11
+ dataLabels: {
12
+ format:
13
+ '<span class="fix">{y:,f}</span>' +
14
+ '<span style="fill: #687887; font-size: 27px;">GB</span>',
15
+ },
16
+ },
17
+ },
18
+ } %>
19
+
20
+ <% chart_options_2 = {
21
+ title: {
22
+ text: "Sales Goal",
23
+ },
24
+ series: [{ data: data2 }],
25
+ plotOptions: {
26
+ solidgauge: {
27
+ dataLabels: {
28
+ format:
29
+ '<span y="28" style="fill: #687887; font-size: 16px;">$</span>' +
30
+ '<span class="fix" y="38">{y:,f}</span>' +
31
+ '<span style="fill: #687887; font-size: 27px;">k</span>',
32
+ },
33
+ },
34
+ },
35
+ } %>
36
+
37
+
38
+ <%= pb_rails("pb_gauge_chart", props: { options: chart_options_1 }) %>
39
+ <%= pb_rails("pb_gauge_chart", props: { options: chart_options_2 }) %>
@@ -0,0 +1,58 @@
1
+ import React from 'react'
2
+ import PbGaugeChart from '../../pb_pb_gauge_chart/_pb_gauge_chart'
3
+ import { colors, typography } from 'playbook-ui'
4
+
5
+
6
+ const data1 = [
7
+ { name: 'Data Used', y: 32 },
8
+ ]
9
+ const data2 = [
10
+ { name: 'Sales to Date', y: 65 },
11
+ ]
12
+
13
+ const chartOptions1 = {
14
+ title: {
15
+ text: "Data Usage",
16
+ },
17
+ series: [{ data: data1 }],
18
+ plotOptions: {
19
+ solidgauge: {
20
+ dataLabels: {
21
+ format:
22
+ `<span class="fix">{y:,f}</span>` +
23
+ `<span style="fill: ${colors.text_lt_light}; font-size: ${typography.text_larger};">GB</span>`,
24
+ },
25
+ },
26
+ },
27
+ };
28
+ const chartOptions2 = {
29
+ title: {
30
+ text: "Sales Goal",
31
+ },
32
+ series: [{ data: data2 }],
33
+ plotOptions: {
34
+ solidgauge: {
35
+ dataLabels: {
36
+ format:
37
+ `<span y="28" style="fill: ${colors.text_lt_light}; font-size: ${typography.text_base};">$</span>` +
38
+ `<span class="fix" y="38">{y:,f}</span>` +
39
+ `<span style="fill: ${colors.text_lt_light}; font-size: ${typography.text_larger};">k</span>`,
40
+ },
41
+ },
42
+ },
43
+ };
44
+
45
+ const PbGaugeChartUnits = (props) => (
46
+ <div>
47
+ <PbGaugeChart
48
+ options={chartOptions1}
49
+ {...props}
50
+ />
51
+ <PbGaugeChart
52
+ options={chartOptions2}
53
+ {...props}
54
+ />
55
+ </div>
56
+ )
57
+
58
+ export default PbGaugeChartUnits
@@ -0,0 +1 @@
1
+ Use custom CSS with classes or inline styles (as shown in these docs) to customize the appearance of prefix and suffix units.
@@ -0,0 +1,29 @@
1
+ examples:
2
+
3
+ rails:
4
+ - pb_gauge_chart_default: Default
5
+ - pb_gauge_chart_disable_animation: Disable Animation
6
+ - pb_gauge_chart_title: With Title
7
+ - pb_gauge_chart_units: With Units
8
+ - pb_gauge_chart_full_circle: Full Circle
9
+ - pb_gauge_chart_min_max: With Min and Max Labels
10
+ - pb_gauge_chart_sizing: Sizing
11
+ - pb_gauge_chart_height: Height
12
+ - pb_gauge_chart_color: Custom Color
13
+ - pb_gauge_chart_complex: Complex Example
14
+
15
+
16
+ react:
17
+ - pb_gauge_chart_default: Default
18
+ - pb_gauge_chart_disable_animation: Disable Animation
19
+ - pb_gauge_chart_title: With Title
20
+ - pb_gauge_chart_units: With Units
21
+ - pb_gauge_chart_full_circle: Full Circle
22
+ - pb_gauge_chart_min_max: With Min and Max Labels
23
+ - pb_gauge_chart_sizing: Sizing
24
+ - pb_gauge_chart_height: Height
25
+ - pb_gauge_chart_live_data: Live Data
26
+ - pb_gauge_chart_color: Custom Color
27
+ - pb_gauge_chart_complex: Complex Example
28
+
29
+
@@ -0,0 +1,11 @@
1
+ export { default as PbGaugeChartDefault } from './_pb_gauge_chart_default.jsx'
2
+ export { default as PbGaugeChartDisableAnimation } from './_pb_gauge_chart_disable_animation.jsx'
3
+ export { default as PbGaugeChartTitle } from './_pb_gauge_chart_title.jsx'
4
+ export { default as PbGaugeChartUnits } from './_pb_gauge_chart_units.jsx'
5
+ export { default as PbGaugeChartFullCircle } from './_pb_gauge_chart_full_circle.jsx'
6
+ export { default as PbGaugeChartMinMax } from './_pb_gauge_chart_min_max.jsx'
7
+ export { default as PbGaugeChartSizing } from './_pb_gauge_chart_sizing.jsx'
8
+ export { default as PbGaugeChartHeight } from './_pb_gauge_chart_height.jsx'
9
+ export { default as PbGaugeChartLiveData } from './_pb_gauge_chart_live_data.jsx'
10
+ export { default as PbGaugeChartColor } from './_pb_gauge_chart_color.jsx'
11
+ export { default as PbGaugeChartComplex } from './_pb_gauge_chart_complex.jsx'
@@ -0,0 +1,91 @@
1
+ import colors from '../tokens/exports/_colors.module.scss'
2
+ import typography from '../tokens/exports/_typography.module.scss'
3
+
4
+ const pbGaugeGraphTheme = {
5
+ title: {
6
+ text: "",
7
+ style: {
8
+ fontFamily: typography.font_family_base,
9
+ fontSize: typography.text_larger,
10
+ },
11
+ },
12
+ chart: {
13
+ type: "solidgauge",
14
+ events: {
15
+ render() {
16
+ this.container
17
+ const arc = this.container.querySelector('path.gauge-pane');
18
+ if (arc) arc.setAttribute('stroke-linejoin', 'round');
19
+ }
20
+ }
21
+ },
22
+ pane: {
23
+ size: "90%",
24
+ startAngle: -100,
25
+ endAngle: 100,
26
+ background: [
27
+ {
28
+ borderWidth: 20,
29
+ innerRadius: "90%",
30
+ outerRadius: "90%",
31
+ shape: "arc",
32
+ className: "gauge-pane",
33
+ borderColor: colors.border_light,
34
+ borderRadius: '50%',
35
+ },
36
+ ],
37
+ },
38
+ tooltip: {
39
+ backgroundColor: {
40
+ linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
41
+ stops: [
42
+ [0, colors.bg_dark],
43
+ [1, colors.bg_dark],
44
+ ],
45
+ },
46
+ pointFormat:
47
+ '<span style="font-weight: bold; color:{point.color};">●</span>{point.name}: ' +
48
+ "<b>{point.y}</b>",
49
+ followPointer: true,
50
+ shadow: false,
51
+ borderWidth: 0,
52
+ borderRadius: 10,
53
+ style: {
54
+ fontFamily: typography.font_family_base,
55
+ color: colors.text_dk_default,
56
+ fontWeight: typography.regular,
57
+ fontSize: typography.text_smaller,
58
+ },
59
+ },
60
+ yAxis: {
61
+ min: 0,
62
+ max: 100,
63
+ lineWidth: 0,
64
+ tickPositions: [] as number[],
65
+ },
66
+ plotOptions: {
67
+ solidgauge: {
68
+ borderColor: colors.data_1,
69
+ borderWidth: 20,
70
+ color: colors.data_1,
71
+ radius: 90,
72
+ innerRadius: "90%",
73
+ y: -26,
74
+ dataLabels: {
75
+ borderWidth: 0,
76
+ color: colors.text_lt_default,
77
+ enabled: true,
78
+ format: '<span class="fix">{y:,f}</span>',
79
+ style: {
80
+ fontFamily: typography.font_family_base,
81
+ fontWeight: typography.regular,
82
+ fontSize: typography.heading_2,
83
+ },
84
+ y: -26,
85
+ },
86
+ },
87
+ },
88
+ credits: { enabled: false }
89
+ }
90
+
91
+ export default pbGaugeGraphTheme;
@@ -0,0 +1 @@
1
+ <%= react_component('PbGaugeChart', object.react_props) %>
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbPbGaugeChart
5
+ class PbGaugeChart < ::Playbook::KitBase
6
+ prop :options, default: {}
7
+
8
+ def react_props
9
+ {
10
+ className: classname,
11
+ data: data,
12
+ options: options,
13
+ id: id,
14
+ }
15
+ end
16
+
17
+ def classname
18
+ # Highcharts react needs classname attached to the container div,
19
+ # we pass an empty string here to avoid conflicts, classname is built in the TSX
20
+ # We still need generate_classnames to retain ability to pass in custom classnames or global props
21
+ generate_classname("")
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,80 @@
1
+ import React from 'react'
2
+ import { render, screen } from '../utilities/test-utils'
3
+
4
+ import { PbGaugeChart } from 'playbook-ui'
5
+
6
+ beforeEach(() => {
7
+ // Silences error logs within the test suite.
8
+ jest.spyOn(console, 'error');
9
+ jest.spyOn(console, 'warn');
10
+ console.error.mockImplementation(() => {});
11
+ console.warn.mockImplementation(() => {});
12
+ });
13
+
14
+ afterEach(() => {
15
+ console.error.mockRestore();
16
+ console.warn.mockRestore();
17
+ });
18
+
19
+ const chartOptions = {
20
+ series:[{data:[{ name: "Name", y: 45 }]}]
21
+ }
22
+
23
+ const testId = 'pbgaugechart1'
24
+
25
+ test('Kit to exist', () => {
26
+ render(
27
+ <PbGaugeChart
28
+ data={{testid: testId}}
29
+ options={chartOptions}
30
+ />
31
+ )
32
+ expect(screen.getByTestId(testId)).toBeInTheDocument()
33
+ })
34
+
35
+ test('Kit to apply base classname', () => {
36
+ render(
37
+ <PbGaugeChart
38
+ data={{testid: testId}}
39
+ options={chartOptions}
40
+ />
41
+ )
42
+
43
+ expect(screen.getByTestId(testId)).toHaveClass('pb_pb_gauge_chart')
44
+ })
45
+
46
+ test('Kit to have custom class', () => {
47
+ render(
48
+ <PbGaugeChart
49
+ className='custom-class'
50
+ data={{testid: testId}}
51
+ options={chartOptions}
52
+ />
53
+ )
54
+
55
+ expect(screen.getByTestId(testId)).toHaveClass('custom-class')
56
+ })
57
+
58
+ test('Kit to apply global props', () => {
59
+ render(
60
+ <PbGaugeChart
61
+ data={{testid: testId}}
62
+ margin="lg"
63
+ options={chartOptions}
64
+ />
65
+ )
66
+
67
+ expect(screen.getByTestId(testId)).toHaveClass('m_lg')
68
+ })
69
+
70
+ test('kit to apply id', () => {
71
+ render(
72
+ <PbGaugeChart
73
+ data={{testid: testId}}
74
+ id='gauge-chart-id'
75
+ options={chartOptions}
76
+ />
77
+ )
78
+
79
+ expect(screen.getByTestId(testId)).toHaveAttribute('id', 'gauge-chart-id')
80
+ })
@@ -1,3 +1,3 @@
1
- This kit is a wrapper around the Highcharts library. It applies styling and default settings but does NOT ship Highcharts. In order to use this kit, 'highcharts' and 'highcharts-react-official' must be installed in your repo. Once done, any prop or functionality provided by Highcharts can be used with this kit without requiring specifc props from Playbook. The doc examples below showcase a few common usecases but are not a comprehensive list of all the functionalities possible.
1
+ This kit is a wrapper around the Highcharts library. It applies styling and default settings but does NOT ship Highcharts. In order to use this kit, 'highcharts' and 'highcharts-react-official' must be installed in your repo. Once done, any prop or functionality provided by Highcharts can be used with this kit without requiring specific props from Playbook. The doc examples below showcase a few common usecases but are not a comprehensive list of all the functionalities possible.
2
2
 
3
3
  See the [highcharts API docs](https://api.highcharts.com/highcharts/) for a comprehensive look at what is possible.
@@ -314,14 +314,18 @@ const PhoneNumberInput = (props: PhoneNumberInputProps, ref?: React.Ref<unknown>
314
314
 
315
315
  const handleOnChange = (evt: React.ChangeEvent<HTMLInputElement>) => {
316
316
  if (!hasTyped) setHasTyped(true)
317
+
317
318
  setInputValue(evt.target.value)
319
+
318
320
  let phoneNumberData
321
+
319
322
  if (formatAsYouType) {
320
323
  const formattedPhoneNumberData = getCurrentSelectedData(itiRef.current, evt.target.value)
321
324
  phoneNumberData = {...formattedPhoneNumberData, number: unformatNumber(formattedPhoneNumberData.number)}
322
325
  } else {
323
326
  phoneNumberData = getCurrentSelectedData(itiRef.current, evt.target.value)
324
327
  }
328
+
325
329
  setSelectedData(phoneNumberData)
326
330
  onChange(phoneNumberData)
327
331
  isValid(itiRef.current.isValidNumber())
@@ -370,11 +374,26 @@ const PhoneNumberInput = (props: PhoneNumberInputProps, ref?: React.Ref<unknown>
370
374
 
371
375
  inputRef.current.addEventListener("open:countrydropdown", () => setDropDownIsOpen(true))
372
376
  inputRef.current.addEventListener("close:countrydropdown", () => setDropDownIsOpen(false))
373
- }
374
- if (formatAsYouType) {
375
- inputRef.current?.addEventListener("input", (evt) => {
376
- handleOnChange(evt as unknown as React.ChangeEvent<HTMLInputElement>);
377
- });
377
+
378
+ // Handle formatAsYouType with input event
379
+ if (formatAsYouType) {
380
+ inputRef.current.addEventListener("input", (evt: Event) => {
381
+ const target = evt.target as HTMLInputElement
382
+ const formattedValue = target.value
383
+
384
+ // Update internal state
385
+ setInputValue(formattedValue)
386
+ setHasTyped(true)
387
+
388
+ // Get phone number data with unformatted number
389
+ const formattedPhoneNumberData = getCurrentSelectedData(telInputInit, formattedValue)
390
+ const phoneNumberData = {...formattedPhoneNumberData, number: unformatNumber(formattedPhoneNumberData.number)}
391
+
392
+ setSelectedData(phoneNumberData)
393
+ onChange(phoneNumberData)
394
+ isValid(telInputInit.isValidNumber())
395
+ })
396
+ }
378
397
  }
379
398
  }, [])
380
399
 
@@ -389,7 +408,7 @@ const PhoneNumberInput = (props: PhoneNumberInputProps, ref?: React.Ref<unknown>
389
408
  label,
390
409
  name,
391
410
  onBlur: validateErrors,
392
- onChange: handleOnChange,
411
+ onChange: formatAsYouType ? undefined : handleOnChange,
393
412
  value: inputValue
394
413
  }
395
414
 
@@ -1,5 +1,5 @@
1
1
  import React from 'react'
2
- import { render, screen } from '../utilities/test-utils'
2
+ import { render, screen, fireEvent, waitFor } from '../utilities/test-utils'
3
3
  import Typeahead from './_typeahead'
4
4
 
5
5
  const options = [
@@ -137,4 +137,38 @@ test('typeahead with colored pills', () => {
137
137
  const kit = screen.getByTestId('pills-color-test')
138
138
  const pill = kit.querySelector(".pb_form_pill_kit.pb_form_pill_neutral")
139
139
  expect(pill).toBeInTheDocument()
140
+ })
141
+
142
+ test('typeahead with defaultValue with focus behavior', async () => {
143
+ render(
144
+ <Typeahead
145
+ data={{ testid: 'default-value-focus-test' }}
146
+ defaultValue={[options[1]]}
147
+ options={options}
148
+ />
149
+ )
150
+
151
+ const kit = screen.getByTestId('default-value-focus-test')
152
+ const inputDiv = kit.querySelector(".typeahead-kit-select__single-value")
153
+ expect(inputDiv).toHaveTextContent("Red")
154
+
155
+ // Test that the control can receive focus
156
+ const control = kit.querySelector('.typeahead-kit-select__control')
157
+ expect(control).toBeInTheDocument()
158
+
159
+ // Simulate opening the menu by clicking the control
160
+ fireEvent.mouseDown(control)
161
+
162
+ // Wait for menu to appear
163
+ await waitFor(() => {
164
+ const menu = kit.querySelector('.typeahead-kit-select__menu')
165
+ expect(menu).toBeInTheDocument()
166
+ })
167
+
168
+ // Check that the correct option has the focused class
169
+ await waitFor(() => {
170
+ const focusedOption = kit.querySelector('.typeahead-kit-select__option--is-focused')
171
+ expect(focusedOption).toBeInTheDocument()
172
+ expect(focusedOption).toHaveTextContent('Red')
173
+ })
140
174
  })