playbook_ui 14.24.0.pre.alpha.PLAY1972validatemissingareacodeandrepeatcountrycode9457 → 14.24.0.pre.alpha.PLAY1984responsivegapprops9652

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 (55) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_advanced_table/Components/RegularTableView.tsx +8 -2
  3. data/app/pb_kits/playbook/pb_advanced_table/Components/TableHeaderCell.tsx +1 -2
  4. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +56 -0
  5. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_padding_control.jsx +60 -0
  6. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_padding_control.md +3 -0
  7. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_padding_control_per_row.jsx +57 -0
  8. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_padding_control_per_row.md +1 -0
  9. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +2 -0
  10. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +3 -1
  11. data/app/pb_kits/playbook/pb_circle_icon_button/circle_icon_button.html.erb +10 -1
  12. data/app/pb_kits/playbook/pb_circle_icon_button/circle_icon_button.rb +2 -0
  13. data/app/pb_kits/playbook/pb_circle_icon_button/docs/_circle_icon_button_input_options.html.erb +24 -0
  14. data/app/pb_kits/playbook/pb_circle_icon_button/docs/_circle_icon_button_input_options.md +3 -0
  15. data/app/pb_kits/playbook/pb_circle_icon_button/docs/example.yml +1 -0
  16. data/app/pb_kits/playbook/pb_dropdown/index.js +3 -0
  17. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/_fixed_confirmation_toast.tsx +2 -2
  18. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_fixed_confirmation_toast_no_icon.html.erb +22 -0
  19. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_fixed_confirmation_toast_no_icon.jsx +43 -0
  20. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_fixed_confirmation_toast_no_icon.md +1 -0
  21. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/example.yml +2 -0
  22. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/index.js +1 -0
  23. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/fixed_confirmation_toast.html.erb +2 -1
  24. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/fixed_confirmation_toast.rb +1 -1
  25. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/fixed_confirmation_toast.test.js +6 -0
  26. data/app/pb_kits/playbook/pb_flex/_flex.tsx +9 -6
  27. data/app/pb_kits/playbook/pb_flex/docs/_flex_gap.html.erb +12 -1
  28. data/app/pb_kits/playbook/pb_flex/docs/_flex_gap.jsx +26 -1
  29. data/app/pb_kits/playbook/pb_flex/docs/_flex_gap_rails.md +11 -0
  30. data/app/pb_kits/playbook/pb_flex/docs/_flex_gap_react.md +11 -0
  31. data/app/pb_kits/playbook/pb_flex/flex.rb +6 -12
  32. data/app/pb_kits/playbook/pb_pagination/_pagination.test.jsx +212 -0
  33. data/app/pb_kits/playbook/pb_pagination/_pagination.tsx +8 -1
  34. data/app/pb_kits/playbook/pb_pagination/docs/_pagination_external_control.jsx +112 -0
  35. data/app/pb_kits/playbook/pb_pagination/docs/_pagination_external_control_react.md +3 -0
  36. data/app/pb_kits/playbook/pb_pagination/docs/example.yml +1 -0
  37. data/app/pb_kits/playbook/pb_pagination/docs/index.js +1 -0
  38. data/app/pb_kits/playbook/utilities/_gap.scss +12 -24
  39. data/app/pb_kits/playbook/utilities/globalPropNames.mjs +2 -0
  40. data/app/pb_kits/playbook/utilities/globalProps.ts +28 -4
  41. data/dist/chunks/{_line_graph-qk_BN_J0.js → _line_graph-B9yItXkt.js} +1 -1
  42. data/dist/chunks/_typeahead-Mbp0CWgZ.js +6 -0
  43. data/dist/chunks/{_weekday_stacked-svceGyvR.js → _weekday_stacked-C-5U1QRT.js} +3 -3
  44. data/dist/chunks/vendor.js +1 -1
  45. data/dist/menu.yml +1 -1
  46. data/dist/playbook-doc.js +1 -1
  47. data/dist/playbook-rails-react-bindings.js +1 -1
  48. data/dist/playbook-rails.js +1 -1
  49. data/dist/playbook.css +1 -1
  50. data/lib/playbook/classnames.rb +2 -0
  51. data/lib/playbook/spacing.rb +53 -1
  52. data/lib/playbook/version.rb +1 -1
  53. metadata +19 -6
  54. data/app/pb_kits/playbook/pb_flex/docs/_flex_gap.md +0 -9
  55. data/dist/chunks/_typeahead-ZLTFtAoW.js +0 -6
@@ -24,17 +24,11 @@ module Playbook
24
24
  default: "none",
25
25
  deprecated: true
26
26
 
27
- prop :gap, type: Playbook::Props::Enum,
28
- values: %w[xxs xs sm md lg xl none],
29
- default: "none"
27
+ prop :gap
30
28
 
31
- prop :row_gap, type: Playbook::Props::Enum,
32
- values: %w[xxs xs sm md lg xl none],
33
- default: "none"
29
+ prop :row_gap
34
30
 
35
- prop :column_gap, type: Playbook::Props::Enum,
36
- values: %w[xxs xs sm md lg xl none],
37
- default: "none"
31
+ prop :column_gap
38
32
 
39
33
  prop :reverse, type: Playbook::Props::Boolean,
40
34
  default: false
@@ -133,7 +127,7 @@ module Playbook
133
127
  end
134
128
 
135
129
  def gap_class
136
- if gap == "none"
130
+ if gap == "none" || gap.nil? || gap.is_a?(Hash)
137
131
  nil
138
132
  else
139
133
  "gap_#{gap}"
@@ -141,7 +135,7 @@ module Playbook
141
135
  end
142
136
 
143
137
  def row_gap_class
144
- if row_gap == "none"
138
+ if row_gap == "none" || row_gap.nil? || row_gap.is_a?(Hash)
145
139
  nil
146
140
  else
147
141
  "rowGap_#{row_gap}"
@@ -149,7 +143,7 @@ module Playbook
149
143
  end
150
144
 
151
145
  def column_gap_class
152
- if column_gap == "none"
146
+ if column_gap == "none" || column_gap.nil? || column_gap.is_a?(Hash)
153
147
  nil
154
148
  else
155
149
  "columnGap_#{column_gap}"
@@ -0,0 +1,212 @@
1
+ import React from 'react'
2
+ import { ensureAccessible, renderKit, render, fireEvent, screen } from '../utilities/test-utils'
3
+ import Pagination from './_pagination'
4
+
5
+ const defaultProps = {
6
+ data: { testid: 'pagination-test' },
7
+ total: 10,
8
+ current: 1,
9
+ range: 5,
10
+ }
11
+
12
+ describe('Pagination Component', () => {
13
+ test('returns namespaced class name', () => {
14
+ const kit = renderKit(Pagination, defaultProps)
15
+ expect(kit).toBeInTheDocument()
16
+ expect(kit).toHaveClass('pb_paginate')
17
+ })
18
+
19
+ it("should be accessible", async () => {
20
+ ensureAccessible(Pagination, defaultProps)
21
+ })
22
+
23
+ test('renders with default props', () => {
24
+ render(<Pagination {...defaultProps} />)
25
+
26
+ const pagination = screen.getByTestId('pagination-test')
27
+ expect(pagination).toBeInTheDocument()
28
+ expect(pagination).toHaveClass('pb_paginate')
29
+ })
30
+
31
+ test('renders pagination buttons correctly', () => {
32
+ render(<Pagination {...defaultProps} />)
33
+
34
+ expect(screen.getByText('1')).toBeInTheDocument()
35
+ expect(screen.getByText('2')).toBeInTheDocument()
36
+ expect(screen.getByText('3')).toBeInTheDocument()
37
+ expect(screen.getByText('4')).toBeInTheDocument()
38
+ expect(screen.getByText('5')).toBeInTheDocument()
39
+
40
+ // Check for navigation arrows by looking for the li elements with specific classes
41
+ const leftArrow = document.querySelector('.pagination-left')
42
+ const rightArrow = document.querySelector('.pagination-right')
43
+ expect(leftArrow).toBeInTheDocument()
44
+ expect(rightArrow).toBeInTheDocument()
45
+ })
46
+
47
+ test('highlights current page as active', () => {
48
+ render(<Pagination {...defaultProps}
49
+ current={3}
50
+ />)
51
+
52
+ const activePage = screen.getByText('3')
53
+ expect(activePage).toHaveClass('active')
54
+ })
55
+
56
+ test('calls onChange when page is clicked', () => {
57
+ const mockOnChange = jest.fn()
58
+ render(<Pagination {...defaultProps}
59
+ onChange={mockOnChange}
60
+ />)
61
+
62
+ const pageButton = screen.getByText('3')
63
+ fireEvent.click(pageButton)
64
+
65
+ expect(mockOnChange).toHaveBeenCalledWith(3)
66
+ })
67
+
68
+ test('disables left arrow on first page', () => {
69
+ render(<Pagination {...defaultProps}
70
+ current={1}
71
+ />)
72
+
73
+ const leftArrow = document.querySelector('.pagination-left')
74
+ expect(leftArrow).toHaveClass('disabled')
75
+ })
76
+
77
+ test('disables right arrow on last page', () => {
78
+ render(<Pagination {...defaultProps}
79
+ current={10}
80
+ />)
81
+
82
+ const rightArrow = document.querySelector('.pagination-right')
83
+ expect(rightArrow).toHaveClass('disabled')
84
+ })
85
+
86
+ test('does not render when total is 1 or less', () => {
87
+ const { container } = render(<Pagination {...defaultProps}
88
+ total={1}
89
+ />)
90
+
91
+ expect(container.firstChild).toBeNull()
92
+ })
93
+
94
+ test('renders with custom className', () => {
95
+ render(<Pagination {...defaultProps}
96
+ className="custom-class"
97
+ />)
98
+
99
+ const pagination = screen.getByTestId('pagination-test')
100
+ expect(pagination).toHaveClass('custom-class')
101
+ })
102
+
103
+ test('renders with custom id', () => {
104
+ render(<Pagination {...defaultProps}
105
+ id="custom-id"
106
+ />)
107
+
108
+ const pagination = screen.getByTestId('pagination-test')
109
+ expect(pagination).toHaveAttribute('id', 'custom-id')
110
+ })
111
+
112
+ test('renders with custom range', () => {
113
+ render(<Pagination {...defaultProps}
114
+ range={3}
115
+ />)
116
+
117
+ expect(screen.getByText('1')).toBeInTheDocument()
118
+ expect(screen.getByText('2')).toBeInTheDocument()
119
+ expect(screen.getByText('3')).toBeInTheDocument()
120
+ expect(screen.getByText('9')).toBeInTheDocument()
121
+ expect(screen.getByText('10')).toBeInTheDocument()
122
+ })
123
+
124
+ test('handles large number of pages correctly', () => {
125
+ render(<Pagination {...defaultProps}
126
+ current={50}
127
+ range={5}
128
+ total={100}
129
+ />)
130
+
131
+ const pagination = screen.getByTestId('pagination-test')
132
+ expect(pagination).toBeInTheDocument()
133
+ expect(pagination).toHaveClass('pb_paginate')
134
+
135
+
136
+ expect(screen.getByText('48')).toBeInTheDocument()
137
+ expect(screen.getByText('49')).toBeInTheDocument()
138
+ expect(screen.getByText('50')).toBeInTheDocument()
139
+ expect(screen.getByText('51')).toBeInTheDocument()
140
+ expect(screen.getByText('52')).toBeInTheDocument()
141
+ })
142
+
143
+ test('syncs with external current prop changes', () => {
144
+ const { rerender } = render(<Pagination {...defaultProps}
145
+ current={1}
146
+ />)
147
+
148
+ expect(screen.getByText('1')).toHaveClass('active')
149
+
150
+ rerender(<Pagination {...defaultProps}
151
+ current={3}
152
+ />)
153
+
154
+ expect(screen.getByText('3')).toHaveClass('active')
155
+ expect(screen.getByText('1')).not.toHaveClass('active')
156
+ })
157
+
158
+ test('validates current prop is within valid range', () => {
159
+ const { rerender } = render(<Pagination {...defaultProps}
160
+ current={1}
161
+ />)
162
+
163
+ rerender(<Pagination {...defaultProps}
164
+ current={0}
165
+ />)
166
+
167
+ expect(screen.getByText('1')).toHaveClass('active')
168
+
169
+ rerender(<Pagination {...defaultProps}
170
+ current={15}
171
+ />)
172
+
173
+ expect(screen.getByText('1')).toHaveClass('active')
174
+ })
175
+
176
+ test('handles htmlOptions props', () => {
177
+ const htmlOptions = { 'data-test': 'test-value' }
178
+ render(<Pagination {...defaultProps}
179
+ htmlOptions={htmlOptions}
180
+ />)
181
+
182
+ const pagination = screen.getByTestId('pagination-test')
183
+ expect(pagination).toHaveAttribute('data-test', 'test-value')
184
+ })
185
+
186
+ test('renders first and last page buttons when range is small', () => {
187
+ render(<Pagination {...defaultProps}
188
+ current={10}
189
+ range={3}
190
+ total={20}
191
+ />)
192
+
193
+ expect(screen.getByText('1')).toBeInTheDocument()
194
+ expect(screen.getByText('20')).toBeInTheDocument()
195
+
196
+ expect(screen.getByText('9')).toBeInTheDocument()
197
+ expect(screen.getByText('10')).toBeInTheDocument()
198
+ expect(screen.getByText('11')).toBeInTheDocument()
199
+ })
200
+
201
+ test('renders second and second-to-last page buttons when needed', () => {
202
+ render(<Pagination {...defaultProps}
203
+ current={10}
204
+ range={3}
205
+ total={20}
206
+ />)
207
+
208
+ expect(screen.getByText('2')).toBeInTheDocument()
209
+
210
+ expect(screen.getByText('19')).toBeInTheDocument()
211
+ })
212
+ })
@@ -1,4 +1,4 @@
1
- import React, { useState } from "react";
1
+ import React, { useState, useEffect } from "react";
2
2
  import classnames from 'classnames'
3
3
  import { GlobalProps, globalProps } from '../utilities/globalProps'
4
4
  import { buildAriaProps, buildCss, buildDataProps, buildHtmlProps } from '../utilities/props'
@@ -123,6 +123,13 @@ const Pagination = ( props: PaginationProps) => {
123
123
 
124
124
  return buttons;
125
125
  };
126
+
127
+ // Sync internal state with external current prop
128
+ useEffect(() => {
129
+ if (current >= 1 && current <= total) {
130
+ setCurrentPage(current);
131
+ }
132
+ }, [current, total]);
126
133
 
127
134
 
128
135
  const ariaProps = buildAriaProps(aria)
@@ -0,0 +1,112 @@
1
+ import React, { useState } from "react";
2
+ import Flex from '../../pb_flex/_flex'
3
+ import Pagination from '../../pb_pagination/_pagination'
4
+ import Select from '../../pb_select/_select'
5
+ import Table from '../../pb_table/_table'
6
+
7
+ import { data } from "./data";
8
+
9
+ const PaginationExternalControl = (props) => {
10
+ const [totalItems, setTotalItems] = useState(20);
11
+ const [itemsPerPage, setItemsPerPage] = useState(5);
12
+ const [currentPage, setCurrentPage] = useState(1);
13
+
14
+ const totalPages = Math.ceil(totalItems / itemsPerPage);
15
+
16
+ const handlePageChange = (page) => {
17
+ setCurrentPage(page);
18
+ };
19
+
20
+ const limitedData = data.slice(0, totalItems);
21
+ const startIndex = (currentPage - 1) * itemsPerPage;
22
+ const paginatedItems = limitedData.slice(startIndex, startIndex + itemsPerPage);
23
+
24
+ const handleTotalItemsChange = (event) => {
25
+ const value = Number(event.target.value);
26
+ setTotalItems(value);
27
+ setCurrentPage(1);
28
+ };
29
+
30
+ const handleItemsPerPageChange = (event) => {
31
+ const value = Number(event.target.value);
32
+ setItemsPerPage(value);
33
+ setCurrentPage(1);
34
+ };
35
+
36
+ return (
37
+ <>
38
+ <Flex gap="sm">
39
+ <Select
40
+ label="Total Items"
41
+ onChange={handleTotalItemsChange}
42
+ options={[
43
+ { value: "5", text: "5" },
44
+ { value: "10", text: "10" },
45
+ { value: "20", text: "20" }
46
+ ]}
47
+ size="sm"
48
+ value={String(totalItems)}
49
+ {...props}
50
+ />
51
+
52
+ <Select
53
+ label="Items per Page"
54
+ onChange={handleItemsPerPageChange}
55
+ options={[
56
+ { value: "3", text: "3" },
57
+ { value: "5", text: "5" },
58
+ { value: "10", text: "10" }
59
+ ]}
60
+ size="sm"
61
+ value={String(itemsPerPage)}
62
+ {...props}
63
+ />
64
+ </Flex>
65
+
66
+ <Pagination
67
+ current={currentPage}
68
+ key={`pagination-top-${currentPage}`}
69
+ marginBottom="xs"
70
+ onChange={handlePageChange}
71
+ range={5}
72
+ total={totalPages}
73
+ {...props}
74
+ />
75
+ <Table
76
+ marginBottom="xs"
77
+ responsive="none"
78
+ size="sm"
79
+ {...props}
80
+ >
81
+ <Table.Head>
82
+ <Table.Row>
83
+ <Table.Header>{"Column 1"}</Table.Header>
84
+ <Table.Header>{"Column 2"}</Table.Header>
85
+ <Table.Header>{"Column 3"}</Table.Header>
86
+ <Table.Header>{"Column 4"}</Table.Header>
87
+ <Table.Header>{"Column 5"}</Table.Header>
88
+ </Table.Row>
89
+ </Table.Head>
90
+ <Table.Body>
91
+ {paginatedItems.map((row, index) => (
92
+ <Table.Row key={index}>
93
+ {row.map((cell, cellIndex) => (
94
+ <Table.Cell key={cellIndex}>{cell}</Table.Cell>
95
+ ))}
96
+ </Table.Row>
97
+ ))}
98
+ </Table.Body>
99
+ </Table>
100
+ <Pagination
101
+ current={currentPage}
102
+ key={`pagination-bottom-${currentPage}`}
103
+ onChange={handlePageChange}
104
+ range={5}
105
+ total={totalPages}
106
+ {...props}
107
+ />
108
+ </>
109
+ )
110
+ }
111
+
112
+ export default PaginationExternalControl
@@ -0,0 +1,3 @@
1
+ The Pagination component supports external control of the current page. This allows for programmatically reseting or changing the current page when filters or other criteria change, without needing to unmount and remount the component.
2
+
3
+ In this example, changing the "Total Items" or "Items per Page" dropdowns will automatically reset the pagination to page 1, demonstrating how external control works. The pagination component will update its internal state to reflect the new `current` prop value.
@@ -6,3 +6,4 @@ examples:
6
6
  react:
7
7
  - pagination_default: Default
8
8
  - pagination_page_change: Page Change
9
+ - pagination_external_control: External Control
@@ -1,2 +1,3 @@
1
1
  export { default as PaginationDefault } from './_pagination_default.jsx'
2
2
  export { default as PaginationPageChange } from './_pagination_page_change.jsx'
3
+ export { default as PaginationExternalControl } from './_pagination_external_control.jsx'
@@ -1,29 +1,17 @@
1
1
  @import "spacing";
2
2
 
3
- .gap_none {
4
- gap: 0;
5
- }
3
+ $gap_values: (
4
+ none: 0,
5
+ xxs: $space_xxs,
6
+ xs: $space_xs,
7
+ sm: $space_sm,
8
+ md: $space_md,
9
+ lg: $space_lg,
10
+ xl: $space_xl,
11
+ );
6
12
 
7
- .gap_xxs {
8
- gap: $space_xxs;
9
- }
13
+ @include global_props_responsive_css($gap_values, 'gap', 'gap');
10
14
 
11
- .gap_xs {
12
- gap: $space_xs;
13
- }
15
+ @include global_props_responsive_css($gap_values, 'column_gap', 'column-gap');
14
16
 
15
- .gap_sm {
16
- gap: $space_sm;
17
- }
18
-
19
- .gap_md {
20
- gap: $space_md;
21
- }
22
-
23
- .gap_lg {
24
- gap: $space_lg;
25
- }
26
-
27
- .gap_xl {
28
- gap: $space_xl;
29
- }
17
+ @include global_props_responsive_css($gap_values, 'row_gap', 'row-gap');
@@ -27,6 +27,8 @@ export default [
27
27
  "overflow",
28
28
  "order",
29
29
  "numberSpacing",
30
+ "rowGap",
31
+ "columnGap",
30
32
  "gap",
31
33
  "maxWidth",
32
34
  "minWidth",
@@ -112,6 +112,14 @@ type Gap = {
112
112
  gap?: string,
113
113
  }
114
114
 
115
+ type ColumnGap = {
116
+ columnGap?: string,
117
+ }
118
+
119
+ type RowGap = {
120
+ rowGap?: string,
121
+ }
122
+
115
123
  type NumberSpacing = {
116
124
  numberSpacing?: "tabular",
117
125
  }
@@ -200,7 +208,7 @@ type MinHeight = {
200
208
  export type GlobalProps = AlignContent & AlignItems & AlignSelf &
201
209
  BorderRadius & Cursor & Dark & Display & DisplaySizes & Flex & FlexDirection &
202
210
  FlexGrow & FlexShrink & FlexWrap & JustifyContent & JustifySelf &
203
- LineHeight & Margin & Width & MinWidth & MaxWidth & Gap & NumberSpacing & Order & Overflow & Padding &
211
+ LineHeight & Margin & Width & MinWidth & MaxWidth & Gap & ColumnGap & RowGap & NumberSpacing & Order & Overflow & Padding &
204
212
  Position & Shadow & TextAlign & Truncate & VerticalAlign & ZIndex & { hover?: string } & Top & Right & Bottom & Left & Height & MaxHeight & MinHeight;
205
213
 
206
214
  const getResponsivePropClasses = (prop: {[key: string]: string}, classPrefix: string) => {
@@ -377,9 +385,25 @@ const PROP_CATEGORIES: {[key:string]: (props: {[key: string]: any}) => string} =
377
385
  return css.trimEnd()
378
386
  },
379
387
  gapProps: ({ gap }: Gap) => {
380
- let css = ''
381
- css += gap ? `gap_${gap} ` : ''
382
- return css.trimEnd()
388
+ if (typeof gap === 'object') {
389
+ return getResponsivePropClasses(gap, 'gap')
390
+ } else {
391
+ return gap ? `gap_${gap}` : ''
392
+ }
393
+ },
394
+ columnGapProps: ({ columnGap }: ColumnGap) => {
395
+ if (typeof columnGap === 'object') {
396
+ return getResponsivePropClasses(columnGap, 'column_gap')
397
+ } else {
398
+ return columnGap ? `column_gap_${columnGap}` : ''
399
+ }
400
+ },
401
+ rowGapProps: ({ rowGap }: RowGap) => {
402
+ if (typeof rowGap === 'object') {
403
+ return getResponsivePropClasses(rowGap, 'row_gap')
404
+ } else {
405
+ return rowGap ? `row_gap_${rowGap}` : ''
406
+ }
383
407
  },
384
408
  minHeightProps: ({ minHeight }: MinHeight) => {
385
409
  const heightValues = ["auto", "xs", "sm", "md", "lg", "xl", "xxl", "xxxl"]
@@ -1 +1 @@
1
- import{jsx,Fragment,jsxs}from"react/jsx-runtime";import{useState,useEffect}from"react";import{b as buildAriaProps,c as buildDataProps,d as buildHtmlProps,H as HighchartsReact,e as Highcharts,f as classnames,g as globalProps,h as HighchartsMore,S as SolidGauge,i as buildCss}from"./_typeahead-ZLTFtAoW.js";import{c as colors,h as highchartsTheme,m as merge,a as highchartsDarkTheme,t as typography}from"./lib-CY5ZPzic.js";const mapColors=array=>{const regex=/(data)\-[1-8]/;const newArray=array.map((item=>regex.test(item)?`${colors[`data_${item[item.length-1]}`]}`:item));return newArray};const BarGraph=({aria:aria={},data:data={},align:align="center",axisTitle:axisTitle,dark:dark=false,chartData:chartData,className:className="pb_bar_graph",colors:colors2,htmlOptions:htmlOptions={},customOptions:customOptions={},axisFormat:axisFormat,id:id,pointStart:pointStart,stacking:stacking,subTitle:subTitle,type:type="column",title:title="Title",xAxisCategories:xAxisCategories,yAxisMin:yAxisMin,yAxisMax:yAxisMax,legend:legend=false,toggleLegendClick:toggleLegendClick=true,height:height,layout:layout="horizontal",verticalAlign:verticalAlign="bottom",x:x=0,y:y=0,...props})=>{const ariaProps=buildAriaProps(aria);const dataProps=buildDataProps(data);const htmlProps=buildHtmlProps(htmlOptions);const setupTheme=()=>{dark?Highcharts.setOptions(highchartsDarkTheme):Highcharts.setOptions(highchartsTheme)};setupTheme();const staticOptions={title:{text:title},chart:{height:height,type:type},subtitle:{text:subTitle},yAxis:[{labels:{format:typeof axisFormat==="string"?axisFormat:axisFormat&&axisFormat[0]?axisFormat[0].format:""},min:yAxisMin,max:yAxisMax,opposite:false,title:{text:Array.isArray(axisTitle)?axisTitle.length>0?axisTitle[0].name:null:axisTitle},plotLines:typeof yAxisMin!=="undefined"&&yAxisMin!==null?[]:[{value:0,zIndex:10,color:"#E4E8F0"}]}],xAxis:{categories:xAxisCategories},legend:{enabled:legend,align:align,verticalAlign:verticalAlign,layout:layout,x:x,y:y},colors:colors2!==void 0&&colors2.length>0?mapColors(colors2):highchartsTheme.colors,plotOptions:{series:{stacking:stacking,pointStart:pointStart,borderWidth:stacking?0:"",events:{},dataLabels:{enabled:false}}},series:chartData,credits:false};if(Array.isArray(axisTitle)&&axisTitle.length>1&&axisTitle[1].name){staticOptions.yAxis.push({labels:{format:typeof axisFormat==="string"?axisFormat:axisFormat[1].format},min:yAxisMin,max:yAxisMax,opposite:true,title:{text:axisTitle[1].name},plotLines:typeof yAxisMin!=="undefined"&&yAxisMin!==null?[]:[{value:0,zIndex:10,color:"#E4E8F0"}]})}if(!toggleLegendClick){staticOptions.plotOptions.series.events={legendItemClick:()=>false}}const filteredProps={...props};delete filteredProps.verticalAlign;const[options,setOptions]=useState({});useEffect((()=>{setOptions(merge(staticOptions,customOptions))}),[chartData]);return jsx(HighchartsReact,{containerProps:{className:classnames(globalProps(filteredProps),className),id:id,...ariaProps,...dataProps,...htmlProps},highcharts:Highcharts,options:options})};const alignBlockElement=event=>{const itemToMove=document.querySelector(`#wrapper-circle-chart-${event.target.renderTo.id} .pb-circle-chart-block`);const chartContainer=document.querySelector(`#${event.target.renderTo.id}`);if(itemToMove!==null&&chartContainer!==null){itemToMove.style.height=`${event.target.chartHeight}px`;itemToMove.style.width=`${event.target.chartWidth}px`;if(chartContainer.firstChild!==null){chartContainer.firstChild.before(itemToMove)}}};const CircleChart=({align:align="center",aria:aria={},rounded:rounded=false,borderColor:borderColor=(rounded?null:""),borderWidth:borderWidth=(rounded?20:null),chartData:chartData,children:children,className:className,colors:colors2=[],customOptions:customOptions={},dark:dark=false,data:data={},dataLabelHtml:dataLabelHtml="<div>{point.name}</div>",dataLabels:dataLabels=false,height:height,htmlOptions:htmlOptions={},id:id,innerSize:innerSize="md",legend:legend=false,maxPointSize:maxPointSize=null,minPointSize:minPointSize=null,startAngle:startAngle=null,style:style="pie",title:title,tooltipHtml:tooltipHtml,useHtml:useHtml=false,zMin:zMin=null,layout:layout="horizontal",verticalAlign:verticalAlign="bottom",x:x=0,y:y=0,...props})=>{const ariaProps=buildAriaProps(aria);const dataProps=buildDataProps(data);const htmlProps=buildHtmlProps(htmlOptions);HighchartsMore(Highcharts);const setupTheme=()=>{dark?Highcharts.setOptions(highchartsDarkTheme):Highcharts.setOptions(highchartsTheme)};setupTheme();Highcharts.setOptions({tooltip:{headerFormat:null,pointFormat:tooltipHtml?tooltipHtml:'<span style="font-weight: bold; color:{point.color};">●</span>{point.name}: <b>{point.y}</b>',useHTML:useHtml}});const innerSizes={sm:"35%",md:"50%",lg:"85%",none:"0%"};const innerSizeFormat=size=>innerSizes[size];const filteredProps={...props};delete filteredProps.verticalAlign;const[options,setOptions]=useState({});useEffect((()=>{const formattedChartData=chartData.map((obj=>{obj.y=obj.value;delete obj.value;return obj}));const staticOptions={title:{text:title},chart:{height:height,type:style,events:{render:event=>alignBlockElement(event),redraw:event=>alignBlockElement(event)}},legend:{align:align,verticalAlign:verticalAlign,layout:layout,x:x,y:y},plotOptions:{pie:{colors:colors2.length>0?mapColors(colors2):highchartsTheme.colors,dataLabels:{enabled:dataLabels,connectorShape:"straight",connectorWidth:3,format:dataLabelHtml},showInLegend:legend}},series:[{minPointSize:minPointSize,maxPointSize:maxPointSize,innerSize:borderWidth==20?"100%":innerSizeFormat(innerSize),data:formattedChartData,zMin:zMin,startAngle:startAngle,borderWidth:borderWidth,borderColor:borderColor}],credits:false};setOptions(merge(staticOptions,customOptions))}),[chartData]);return jsx(Fragment,{children:children?jsxs("div",{id:`wrapper-circle-chart-${id}`,children:[jsx(HighchartsReact,{containerProps:{className:classnames("pb_circle_chart",globalProps(filteredProps)),id:id,...ariaProps,...dataProps,...htmlProps},highcharts:Highcharts,options:options}),jsx("div",{className:"pb-circle-chart-block",children:children})]}):jsx(HighchartsReact,{containerProps:{className:classnames("pb_circle_chart",globalProps(filteredProps)),id:id,...ariaProps,...dataProps,...htmlProps},highcharts:Highcharts,options:options})})};const Gauge=({aria:aria={},chartData:chartData,customOptions:customOptions={},dark:dark=false,data:data={},disableAnimation:disableAnimation=false,fullCircle:fullCircle=false,height:height=null,htmlOptions:htmlOptions={},id:id,max:max=100,min:min=0,prefix:prefix="",showLabels:showLabels=false,style:style="solidgauge",suffix:suffix="",title:title="",tooltipHtml:tooltipHtml='<span style="font-weight: bold; color:{point.color};">●</span>{point.name}: <b>{point.y}</b>',colors:colors$1=[],minorTickInterval:minorTickInterval=null,circumference:circumference=(fullCircle?[0,360]:[-100,100]),...props})=>{const ariaProps=buildAriaProps(aria);const dataProps=buildDataProps(data);const htmlProps=buildHtmlProps(htmlOptions);HighchartsMore(Highcharts);SolidGauge(Highcharts);const setupTheme=()=>{dark?Highcharts.setOptions(highchartsDarkTheme):Highcharts.setOptions(highchartsTheme)};setupTheme();Highcharts.setOptions({tooltip:{pointFormat:tooltipHtml,followPointer:true}});const css=buildCss({pb_gauge_kit:true});const[options,setOptions]=useState({});useEffect((()=>{const formattedChartData=chartData.map((obj=>{obj.y=obj.value;delete obj.value;return obj}));const staticOptions={chart:{events:{load(){setTimeout(this.reflow.bind(this),0)}},type:style,height:height},title:{text:title},yAxis:{min:min,max:max,lineWidth:0,tickWidth:0,minorTickInterval:minorTickInterval,tickAmount:2,tickPositions:[min,max],labels:{y:26,enabled:showLabels}},credits:false,series:[{data:formattedChartData}],pane:{center:["50%","50%"],size:"90%",startAngle:circumference[0],endAngle:circumference[1],background:{borderWidth:20,innerRadius:"90%",outerRadius:"90%",shape:"arc",className:"gauge-pane"}},colors:colors$1!==void 0&&colors$1.length>0?mapColors(colors$1):highchartsTheme.colors,plotOptions:{series:{animation:!disableAnimation},solidgauge:{borderColor:colors$1!==void 0&&colors$1.length===1?mapColors(colors$1).join():highchartsTheme.colors[0],borderWidth:20,radius:90,innerRadius:"90%",dataLabels:{borderWidth:0,color:colors.text_lt_default,enabled:true,format:`<span class="prefix${dark?" dark":""}">${prefix}</span><span class="fix${dark?" dark":""}">{y:,f}</span><span class="suffix${dark?" dark":""}">${suffix}</span>`,style:{fontFamily:typography.font_family_base,fontWeight:typography.regular,fontSize:typography.heading_2},y:-26}}}};setOptions(merge(staticOptions,customOptions));if(document.querySelector(".prefix")){document.querySelectorAll(".prefix").forEach((prefix2=>{prefix2.setAttribute("y","28")}));document.querySelectorAll(".fix").forEach((fix=>fix.setAttribute("y","38")))}}),[chartData]);return jsx(HighchartsReact,{containerProps:{className:classnames(css,globalProps(props)),id:id,...ariaProps,...dataProps,...htmlProps},highcharts:Highcharts,options:options})};const LineGraph=({aria:aria={},data:data={},align:align="center",className:className="pb_bar_graph",customOptions:customOptions={},dark:dark=false,gradient:gradient=false,type:type="line",htmlOptions:htmlOptions={},id:id,legend:legend=false,toggleLegendClick:toggleLegendClick=true,layout:layout="horizontal",verticalAlign:verticalAlign="bottom",x:x=0,y:y=0,axisTitle:axisTitle,xAxisCategories:xAxisCategories,yAxisMin:yAxisMin,yAxisMax:yAxisMax,chartData:chartData,pointStart:pointStart,subTitle:subTitle,title:title,height:height,colors:colors2=[],...props})=>{const ariaProps=buildAriaProps(aria);const dataProps=buildDataProps(data);const htmlProps=buildHtmlProps(htmlOptions);const setupTheme=()=>{dark?Highcharts.setOptions(highchartsDarkTheme):Highcharts.setOptions(highchartsTheme)};setupTheme();const staticOptions={title:{text:title},chart:{height:height,type:type},subtitle:{text:subTitle},yAxis:{min:yAxisMin,max:yAxisMax,title:{text:axisTitle}},xAxis:{categories:xAxisCategories},legend:{enabled:legend,align:align,verticalAlign:verticalAlign,layout:layout,x:x,y:y},colors:colors2!==void 0&&colors2.length>0?mapColors(colors2):highchartsTheme.colors,plotOptions:{series:{pointStart:pointStart,events:{},dataLabels:{enabled:false}}},series:chartData,credits:false};if(!toggleLegendClick){staticOptions.plotOptions.series.events={legendItemClick:()=>false}}const filteredProps={...props};delete filteredProps.verticalAlign;const[options,setOptions]=useState({});useEffect((()=>{setOptions(merge(staticOptions,customOptions))}),[chartData]);return jsx(HighchartsReact,{containerProps:{className:classnames(globalProps(filteredProps),className),id:id,...ariaProps,...dataProps,...htmlProps},highcharts:Highcharts,options:options})};export{BarGraph as B,CircleChart as C,Gauge as G,LineGraph as L};
1
+ import{jsx,Fragment,jsxs}from"react/jsx-runtime";import{useState,useEffect}from"react";import{b as buildAriaProps,c as buildDataProps,d as buildHtmlProps,H as HighchartsReact,e as Highcharts,f as classnames,g as globalProps,h as HighchartsMore,S as SolidGauge,i as buildCss}from"./_typeahead-Mbp0CWgZ.js";import{c as colors,h as highchartsTheme,m as merge,a as highchartsDarkTheme,t as typography}from"./lib-CY5ZPzic.js";const mapColors=array=>{const regex=/(data)\-[1-8]/;const newArray=array.map((item=>regex.test(item)?`${colors[`data_${item[item.length-1]}`]}`:item));return newArray};const BarGraph=({aria:aria={},data:data={},align:align="center",axisTitle:axisTitle,dark:dark=false,chartData:chartData,className:className="pb_bar_graph",colors:colors2,htmlOptions:htmlOptions={},customOptions:customOptions={},axisFormat:axisFormat,id:id,pointStart:pointStart,stacking:stacking,subTitle:subTitle,type:type="column",title:title="Title",xAxisCategories:xAxisCategories,yAxisMin:yAxisMin,yAxisMax:yAxisMax,legend:legend=false,toggleLegendClick:toggleLegendClick=true,height:height,layout:layout="horizontal",verticalAlign:verticalAlign="bottom",x:x=0,y:y=0,...props})=>{const ariaProps=buildAriaProps(aria);const dataProps=buildDataProps(data);const htmlProps=buildHtmlProps(htmlOptions);const setupTheme=()=>{dark?Highcharts.setOptions(highchartsDarkTheme):Highcharts.setOptions(highchartsTheme)};setupTheme();const staticOptions={title:{text:title},chart:{height:height,type:type},subtitle:{text:subTitle},yAxis:[{labels:{format:typeof axisFormat==="string"?axisFormat:axisFormat&&axisFormat[0]?axisFormat[0].format:""},min:yAxisMin,max:yAxisMax,opposite:false,title:{text:Array.isArray(axisTitle)?axisTitle.length>0?axisTitle[0].name:null:axisTitle},plotLines:typeof yAxisMin!=="undefined"&&yAxisMin!==null?[]:[{value:0,zIndex:10,color:"#E4E8F0"}]}],xAxis:{categories:xAxisCategories},legend:{enabled:legend,align:align,verticalAlign:verticalAlign,layout:layout,x:x,y:y},colors:colors2!==void 0&&colors2.length>0?mapColors(colors2):highchartsTheme.colors,plotOptions:{series:{stacking:stacking,pointStart:pointStart,borderWidth:stacking?0:"",events:{},dataLabels:{enabled:false}}},series:chartData,credits:false};if(Array.isArray(axisTitle)&&axisTitle.length>1&&axisTitle[1].name){staticOptions.yAxis.push({labels:{format:typeof axisFormat==="string"?axisFormat:axisFormat[1].format},min:yAxisMin,max:yAxisMax,opposite:true,title:{text:axisTitle[1].name},plotLines:typeof yAxisMin!=="undefined"&&yAxisMin!==null?[]:[{value:0,zIndex:10,color:"#E4E8F0"}]})}if(!toggleLegendClick){staticOptions.plotOptions.series.events={legendItemClick:()=>false}}const filteredProps={...props};delete filteredProps.verticalAlign;const[options,setOptions]=useState({});useEffect((()=>{setOptions(merge(staticOptions,customOptions))}),[chartData]);return jsx(HighchartsReact,{containerProps:{className:classnames(globalProps(filteredProps),className),id:id,...ariaProps,...dataProps,...htmlProps},highcharts:Highcharts,options:options})};const alignBlockElement=event=>{const itemToMove=document.querySelector(`#wrapper-circle-chart-${event.target.renderTo.id} .pb-circle-chart-block`);const chartContainer=document.querySelector(`#${event.target.renderTo.id}`);if(itemToMove!==null&&chartContainer!==null){itemToMove.style.height=`${event.target.chartHeight}px`;itemToMove.style.width=`${event.target.chartWidth}px`;if(chartContainer.firstChild!==null){chartContainer.firstChild.before(itemToMove)}}};const CircleChart=({align:align="center",aria:aria={},rounded:rounded=false,borderColor:borderColor=(rounded?null:""),borderWidth:borderWidth=(rounded?20:null),chartData:chartData,children:children,className:className,colors:colors2=[],customOptions:customOptions={},dark:dark=false,data:data={},dataLabelHtml:dataLabelHtml="<div>{point.name}</div>",dataLabels:dataLabels=false,height:height,htmlOptions:htmlOptions={},id:id,innerSize:innerSize="md",legend:legend=false,maxPointSize:maxPointSize=null,minPointSize:minPointSize=null,startAngle:startAngle=null,style:style="pie",title:title,tooltipHtml:tooltipHtml,useHtml:useHtml=false,zMin:zMin=null,layout:layout="horizontal",verticalAlign:verticalAlign="bottom",x:x=0,y:y=0,...props})=>{const ariaProps=buildAriaProps(aria);const dataProps=buildDataProps(data);const htmlProps=buildHtmlProps(htmlOptions);HighchartsMore(Highcharts);const setupTheme=()=>{dark?Highcharts.setOptions(highchartsDarkTheme):Highcharts.setOptions(highchartsTheme)};setupTheme();Highcharts.setOptions({tooltip:{headerFormat:null,pointFormat:tooltipHtml?tooltipHtml:'<span style="font-weight: bold; color:{point.color};">●</span>{point.name}: <b>{point.y}</b>',useHTML:useHtml}});const innerSizes={sm:"35%",md:"50%",lg:"85%",none:"0%"};const innerSizeFormat=size=>innerSizes[size];const filteredProps={...props};delete filteredProps.verticalAlign;const[options,setOptions]=useState({});useEffect((()=>{const formattedChartData=chartData.map((obj=>{obj.y=obj.value;delete obj.value;return obj}));const staticOptions={title:{text:title},chart:{height:height,type:style,events:{render:event=>alignBlockElement(event),redraw:event=>alignBlockElement(event)}},legend:{align:align,verticalAlign:verticalAlign,layout:layout,x:x,y:y},plotOptions:{pie:{colors:colors2.length>0?mapColors(colors2):highchartsTheme.colors,dataLabels:{enabled:dataLabels,connectorShape:"straight",connectorWidth:3,format:dataLabelHtml},showInLegend:legend}},series:[{minPointSize:minPointSize,maxPointSize:maxPointSize,innerSize:borderWidth==20?"100%":innerSizeFormat(innerSize),data:formattedChartData,zMin:zMin,startAngle:startAngle,borderWidth:borderWidth,borderColor:borderColor}],credits:false};setOptions(merge(staticOptions,customOptions))}),[chartData]);return jsx(Fragment,{children:children?jsxs("div",{id:`wrapper-circle-chart-${id}`,children:[jsx(HighchartsReact,{containerProps:{className:classnames("pb_circle_chart",globalProps(filteredProps)),id:id,...ariaProps,...dataProps,...htmlProps},highcharts:Highcharts,options:options}),jsx("div",{className:"pb-circle-chart-block",children:children})]}):jsx(HighchartsReact,{containerProps:{className:classnames("pb_circle_chart",globalProps(filteredProps)),id:id,...ariaProps,...dataProps,...htmlProps},highcharts:Highcharts,options:options})})};const Gauge=({aria:aria={},chartData:chartData,customOptions:customOptions={},dark:dark=false,data:data={},disableAnimation:disableAnimation=false,fullCircle:fullCircle=false,height:height=null,htmlOptions:htmlOptions={},id:id,max:max=100,min:min=0,prefix:prefix="",showLabels:showLabels=false,style:style="solidgauge",suffix:suffix="",title:title="",tooltipHtml:tooltipHtml='<span style="font-weight: bold; color:{point.color};">●</span>{point.name}: <b>{point.y}</b>',colors:colors$1=[],minorTickInterval:minorTickInterval=null,circumference:circumference=(fullCircle?[0,360]:[-100,100]),...props})=>{const ariaProps=buildAriaProps(aria);const dataProps=buildDataProps(data);const htmlProps=buildHtmlProps(htmlOptions);HighchartsMore(Highcharts);SolidGauge(Highcharts);const setupTheme=()=>{dark?Highcharts.setOptions(highchartsDarkTheme):Highcharts.setOptions(highchartsTheme)};setupTheme();Highcharts.setOptions({tooltip:{pointFormat:tooltipHtml,followPointer:true}});const css=buildCss({pb_gauge_kit:true});const[options,setOptions]=useState({});useEffect((()=>{const formattedChartData=chartData.map((obj=>{obj.y=obj.value;delete obj.value;return obj}));const staticOptions={chart:{events:{load(){setTimeout(this.reflow.bind(this),0)}},type:style,height:height},title:{text:title},yAxis:{min:min,max:max,lineWidth:0,tickWidth:0,minorTickInterval:minorTickInterval,tickAmount:2,tickPositions:[min,max],labels:{y:26,enabled:showLabels}},credits:false,series:[{data:formattedChartData}],pane:{center:["50%","50%"],size:"90%",startAngle:circumference[0],endAngle:circumference[1],background:{borderWidth:20,innerRadius:"90%",outerRadius:"90%",shape:"arc",className:"gauge-pane"}},colors:colors$1!==void 0&&colors$1.length>0?mapColors(colors$1):highchartsTheme.colors,plotOptions:{series:{animation:!disableAnimation},solidgauge:{borderColor:colors$1!==void 0&&colors$1.length===1?mapColors(colors$1).join():highchartsTheme.colors[0],borderWidth:20,radius:90,innerRadius:"90%",dataLabels:{borderWidth:0,color:colors.text_lt_default,enabled:true,format:`<span class="prefix${dark?" dark":""}">${prefix}</span><span class="fix${dark?" dark":""}">{y:,f}</span><span class="suffix${dark?" dark":""}">${suffix}</span>`,style:{fontFamily:typography.font_family_base,fontWeight:typography.regular,fontSize:typography.heading_2},y:-26}}}};setOptions(merge(staticOptions,customOptions));if(document.querySelector(".prefix")){document.querySelectorAll(".prefix").forEach((prefix2=>{prefix2.setAttribute("y","28")}));document.querySelectorAll(".fix").forEach((fix=>fix.setAttribute("y","38")))}}),[chartData]);return jsx(HighchartsReact,{containerProps:{className:classnames(css,globalProps(props)),id:id,...ariaProps,...dataProps,...htmlProps},highcharts:Highcharts,options:options})};const LineGraph=({aria:aria={},data:data={},align:align="center",className:className="pb_bar_graph",customOptions:customOptions={},dark:dark=false,gradient:gradient=false,type:type="line",htmlOptions:htmlOptions={},id:id,legend:legend=false,toggleLegendClick:toggleLegendClick=true,layout:layout="horizontal",verticalAlign:verticalAlign="bottom",x:x=0,y:y=0,axisTitle:axisTitle,xAxisCategories:xAxisCategories,yAxisMin:yAxisMin,yAxisMax:yAxisMax,chartData:chartData,pointStart:pointStart,subTitle:subTitle,title:title,height:height,colors:colors2=[],...props})=>{const ariaProps=buildAriaProps(aria);const dataProps=buildDataProps(data);const htmlProps=buildHtmlProps(htmlOptions);const setupTheme=()=>{dark?Highcharts.setOptions(highchartsDarkTheme):Highcharts.setOptions(highchartsTheme)};setupTheme();const staticOptions={title:{text:title},chart:{height:height,type:type},subtitle:{text:subTitle},yAxis:{min:yAxisMin,max:yAxisMax,title:{text:axisTitle}},xAxis:{categories:xAxisCategories},legend:{enabled:legend,align:align,verticalAlign:verticalAlign,layout:layout,x:x,y:y},colors:colors2!==void 0&&colors2.length>0?mapColors(colors2):highchartsTheme.colors,plotOptions:{series:{pointStart:pointStart,events:{},dataLabels:{enabled:false}}},series:chartData,credits:false};if(!toggleLegendClick){staticOptions.plotOptions.series.events={legendItemClick:()=>false}}const filteredProps={...props};delete filteredProps.verticalAlign;const[options,setOptions]=useState({});useEffect((()=>{setOptions(merge(staticOptions,customOptions))}),[chartData]);return jsx(HighchartsReact,{containerProps:{className:classnames(globalProps(filteredProps),className),id:id,...ariaProps,...dataProps,...htmlProps},highcharts:Highcharts,options:options})};export{BarGraph as B,CircleChart as C,Gauge as G,LineGraph as L};