playbook_ui 14.24.0.pre.alpha.PLAY2346reactpaginationexternalcontrol9346 → 14.24.0.pre.alpha.PLAY2360circleiconbuttonvariantdatabug9438
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.
- checksums.yaml +4 -4
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +34 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_headers_vertical_border.html.erb +43 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_headers_vertical_border.jsx +64 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +1 -1
- data/app/pb_kits/playbook/pb_advanced_table/table_subrow_header.rb +1 -1
- data/app/pb_kits/playbook/pb_circle_icon_button/circle_icon_button.html.erb +10 -1
- data/app/pb_kits/playbook/pb_circle_icon_button/circle_icon_button.rb +2 -0
- data/app/pb_kits/playbook/pb_circle_icon_button/docs/_circle_icon_button_input_options.html.erb +24 -0
- data/app/pb_kits/playbook/pb_circle_icon_button/docs/_circle_icon_button_input_options.md +3 -0
- data/app/pb_kits/playbook/pb_circle_icon_button/docs/example.yml +1 -0
- data/app/pb_kits/playbook/pb_date/_date.tsx +5 -3
- data/app/pb_kits/playbook/pb_date/date.html.erb +6 -6
- data/app/pb_kits/playbook/pb_date/date.rb +2 -0
- data/app/pb_kits/playbook/pb_date/docs/_date_with_show_current_year.html.erb +4 -0
- data/app/pb_kits/playbook/pb_date/docs/_date_with_show_current_year.jsx +17 -0
- data/app/pb_kits/playbook/pb_date/docs/_date_with_show_current_year.md +1 -0
- data/app/pb_kits/playbook/pb_date/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_date/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_pagination/_pagination.tsx +1 -8
- data/app/pb_kits/playbook/pb_pagination/docs/example.yml +0 -1
- data/app/pb_kits/playbook/pb_pagination/docs/index.js +0 -1
- data/app/pb_kits/playbook/pb_table/styles/_vertical_border.scss +49 -1
- data/dist/chunks/{_weekday_stacked-BavTnN0s.js → _weekday_stacked-CJIFKKe7.js} +1 -1
- data/dist/chunks/vendor.js +1 -1
- data/dist/menu.yml +1 -1
- data/dist/playbook-doc.js +1 -1
- data/dist/playbook.css +1 -1
- data/lib/playbook/version.rb +1 -1
- metadata +10 -6
- data/app/pb_kits/playbook/pb_pagination/_pagination.test.jsx +0 -212
- data/app/pb_kits/playbook/pb_pagination/docs/_pagination_external_control.jsx +0 -112
- data/app/pb_kits/playbook/pb_pagination/docs/_pagination_external_control_react.md +0 -3
data/lib/playbook/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: playbook_ui
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 14.24.0.pre.alpha.
|
4
|
+
version: 14.24.0.pre.alpha.PLAY2360circleiconbuttonvariantdatabug9438
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Power UX
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2025-08-
|
12
|
+
date: 2025-08-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: actionpack
|
@@ -308,6 +308,8 @@ files:
|
|
308
308
|
- app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_headers_multiple.html.erb
|
309
309
|
- app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_headers_multiple.jsx
|
310
310
|
- app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_headers_multiple.md
|
311
|
+
- app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_headers_vertical_border.html.erb
|
312
|
+
- app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_headers_vertical_border.jsx
|
311
313
|
- app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling.jsx
|
312
314
|
- app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling.md
|
313
315
|
- app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_column_headers.jsx
|
@@ -810,6 +812,8 @@ files:
|
|
810
812
|
- app/pb_kits/playbook/pb_circle_icon_button/docs/_circle_icon_button_click.jsx
|
811
813
|
- app/pb_kits/playbook/pb_circle_icon_button/docs/_circle_icon_button_default.html.erb
|
812
814
|
- app/pb_kits/playbook/pb_circle_icon_button/docs/_circle_icon_button_default.jsx
|
815
|
+
- app/pb_kits/playbook/pb_circle_icon_button/docs/_circle_icon_button_input_options.html.erb
|
816
|
+
- app/pb_kits/playbook/pb_circle_icon_button/docs/_circle_icon_button_input_options.md
|
813
817
|
- app/pb_kits/playbook/pb_circle_icon_button/docs/_circle_icon_button_link.html.erb
|
814
818
|
- app/pb_kits/playbook/pb_circle_icon_button/docs/_circle_icon_button_link.jsx
|
815
819
|
- app/pb_kits/playbook/pb_circle_icon_button/docs/_circle_icon_button_link.md
|
@@ -980,6 +984,9 @@ files:
|
|
980
984
|
- app/pb_kits/playbook/pb_date/docs/_date_variants.html.erb
|
981
985
|
- app/pb_kits/playbook/pb_date/docs/_date_variants.jsx
|
982
986
|
- app/pb_kits/playbook/pb_date/docs/_date_variants_swift.md
|
987
|
+
- app/pb_kits/playbook/pb_date/docs/_date_with_show_current_year.html.erb
|
988
|
+
- app/pb_kits/playbook/pb_date/docs/_date_with_show_current_year.jsx
|
989
|
+
- app/pb_kits/playbook/pb_date/docs/_date_with_show_current_year.md
|
983
990
|
- app/pb_kits/playbook/pb_date/docs/_description.md
|
984
991
|
- app/pb_kits/playbook/pb_date/docs/example.yml
|
985
992
|
- app/pb_kits/playbook/pb_date/docs/index.js
|
@@ -2383,14 +2390,11 @@ files:
|
|
2383
2390
|
- app/pb_kits/playbook/pb_overlay/subcomponents/_overlay_percentage.tsx
|
2384
2391
|
- app/pb_kits/playbook/pb_overlay/subcomponents/_overlay_token.tsx
|
2385
2392
|
- app/pb_kits/playbook/pb_pagination/_pagination.scss
|
2386
|
-
- app/pb_kits/playbook/pb_pagination/_pagination.test.jsx
|
2387
2393
|
- app/pb_kits/playbook/pb_pagination/_pagination.tsx
|
2388
2394
|
- app/pb_kits/playbook/pb_pagination/docs/_pagination_default.html.erb
|
2389
2395
|
- app/pb_kits/playbook/pb_pagination/docs/_pagination_default.jsx
|
2390
2396
|
- app/pb_kits/playbook/pb_pagination/docs/_pagination_default_rails.md
|
2391
2397
|
- app/pb_kits/playbook/pb_pagination/docs/_pagination_default_react.md
|
2392
|
-
- app/pb_kits/playbook/pb_pagination/docs/_pagination_external_control.jsx
|
2393
|
-
- app/pb_kits/playbook/pb_pagination/docs/_pagination_external_control_react.md
|
2394
2398
|
- app/pb_kits/playbook/pb_pagination/docs/_pagination_page_change.jsx
|
2395
2399
|
- app/pb_kits/playbook/pb_pagination/docs/_pagination_page_change_react.md
|
2396
2400
|
- app/pb_kits/playbook/pb_pagination/docs/data.js
|
@@ -3635,7 +3639,7 @@ files:
|
|
3635
3639
|
- app/pb_kits/playbook/utilities/validEmojiChecker.ts
|
3636
3640
|
- dist/chunks/_line_graph-D7DgMqnT.js
|
3637
3641
|
- dist/chunks/_typeahead-BzYZCpJO.js
|
3638
|
-
- dist/chunks/_weekday_stacked-
|
3642
|
+
- dist/chunks/_weekday_stacked-CJIFKKe7.js
|
3639
3643
|
- dist/chunks/lazysizes-B7xYodB-.js
|
3640
3644
|
- dist/chunks/lib-CY5ZPzic.js
|
3641
3645
|
- dist/chunks/pb_form_validation-D3b0JKHH.js
|
@@ -1,212 +0,0 @@
|
|
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,112 +0,0 @@
|
|
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
|
@@ -1,3 +0,0 @@
|
|
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.
|