Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(pagination): add pagination bar component #301

Merged
merged 57 commits into from
Mar 6, 2020
Merged
Show file tree
Hide file tree
Changes from 42 commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
6397a6e
feat(pagination): Initialize component, basic functions working
nikolastsakonas Nov 5, 2019
7610392
feat(pagination): Add support for more than 5 pages
nikolastsakonas Nov 5, 2019
b4f6bfc
feat(pagination): Add go to box for going to page
nikolastsakonas Nov 5, 2019
542c1f3
feat(pagination): More examples and documentation, mobile support
nikolastsakonas Nov 6, 2019
b2b7cad
feat(pagination): Move PaginationButtons to its own component
nikolastsakonas Nov 6, 2019
51816b6
feat(pagination): Clean up README and examples
nikolastsakonas Nov 6, 2019
db28d99
Merge branch 'master' into pagination
nikolastsakonas Nov 6, 2019
590759c
feat(pagination): Added tests for pagination, GoTo, and Pages
nikolastsakonas Nov 7, 2019
d898f25
feat(pagination): Added additional pagination tests clean up misc items
nikolastsakonas Nov 7, 2019
bad32f8
feat(pagination): Remove ellipse pointer events and auto button width
nikolastsakonas Nov 7, 2019
1df9d92
Merge branch 'master' into pagination
nikolastsakonas Nov 7, 2019
5b152b2
feat(pagination): Cleanup Go To example label
nikolastsakonas Nov 7, 2019
9b34066
feat(pagination): Remove prettier modifications from IconButton
nikolastsakonas Nov 7, 2019
75d244f
feat(pagination): Remove unnecessary fragment
nikolastsakonas Nov 7, 2019
aa2a391
feat(pagination): Update README pagination usage
nikolastsakonas Nov 8, 2019
a1da6d4
feat(pagination): Update README change user to candidate
nikolastsakonas Nov 8, 2019
79ae547
feat(pagination): Capitalize descriptions of props in readme
nikolastsakonas Nov 8, 2019
5168986
feat(pagination): Cleanup story example
nikolastsakonas Nov 11, 2019
c4773f8
feat(pagination): Add customLabel prop for customizing label below bar
nikolastsakonas Nov 14, 2019
6cd1fd8
Merge branch 'master' into pagination
nikolastsakonas Nov 15, 2019
9f3ccf6
feat(pagination): Small cleanup changes for PR
nikolastsakonas Nov 25, 2019
53b61d9
feat(pagination): Remove withKnobs declaration
nikolastsakonas Nov 26, 2019
63ce410
Merge branch 'master' into pagination
nikolastsakonas Nov 26, 2019
9718d59
feat(pagination): Fix outline/border on active focus button
nikolastsakonas Nov 27, 2019
8291ea0
feat(pagination): Make focus adjustments for PR, WIP icons flicker
nikolastsakonas Dec 10, 2019
51525d1
Merge branch 'master' into pagination
nikolastsakonas Dec 12, 2019
0142532
feat(pagination): Add customizable aria labels and update tests
nikolastsakonas Dec 12, 2019
7e9f151
feat(pagination): Move mobile detection into useIsMobile hook
nikolastsakonas Dec 16, 2019
eb1d8aa
Merge branch 'master' into pagination
nikolastsakonas Dec 16, 2019
7c1750e
feat(pagination): Remove usage of data test id
nikolastsakonas Dec 16, 2019
17444e2
Merge branch 'master' into pagination
nikolastsakonas Jan 24, 2020
cf80581
feat(pagination): Cleanup isMobile hook
nikolastsakonas Jan 24, 2020
20e2546
feat(pagination): Minor cleanup
nikolastsakonas Jan 24, 2020
fb64e42
Merge branch 'master' into pagination
nikolastsakonas Jan 24, 2020
d7a1ae8
Merge branch 'master' into pagination
nikolastsakonas Jan 28, 2020
dfa4243
feat(pagination): Remove transitions on buttons except hover for flicker
nikolastsakonas Jan 28, 2020
8f64301
feat(pagination): Flatten aria label props
nikolastsakonas Feb 4, 2020
e664bb7
Merge branch 'master' into pagination
nikolastsakonas Feb 4, 2020
d6cbee3
Merge branch 'master' of github.com:Workday/canvas-kit into HEAD
NicholasBoll Feb 11, 2020
49e7a4e
Merge branch 'master' of github.com:Workday/canvas-kit into HEAD
NicholasBoll Feb 20, 2020
c5f8daf
Merge branch 'master' of github.com:Workday/canvas-kit into HEAD
NicholasBoll Feb 24, 2020
738254c
chore(pagination): Add Cypress specifications
NicholasBoll Feb 26, 2020
5ba0f67
fix: Incorporate feedback and fix tests
NicholasBoll Feb 28, 2020
702dfde
Merge branch 'master' of github.com:Workday/canvas-kit into HEAD
NicholasBoll Feb 28, 2020
6b2b270
chore: Add visual stories to Pagination
NicholasBoll Feb 29, 2020
e2de040
fix: Pagination test
NicholasBoll Feb 29, 2020
c174bbf
fix: Fix visual regression of text input
NicholasBoll Feb 29, 2020
46b2c2d
chore: revert unnecessary changes
NicholasBoll Feb 29, 2020
ecb4297
chore: revert unnecessary changes
NicholasBoll Feb 29, 2020
04366aa
chore: Add width detection back to Pagination stories
NicholasBoll Feb 29, 2020
37813e7
Merge branch 'master' of github.com:Workday/canvas-kit into HEAD
NicholasBoll Mar 4, 2020
96c4274
chore(pagination): Add depcheck to package
NicholasBoll Mar 4, 2020
629f0eb
docs(pagination): Fix import in Readme
NicholasBoll Mar 5, 2020
975a886
chore(pagination): Remove unused file
NicholasBoll Mar 5, 2020
1912cd6
ci(pagination): Fix CI error
NicholasBoll Mar 5, 2020
a550680
Merge branch 'master' into pagination
NicholasBoll Mar 5, 2020
bd63a7a
Merge branch 'master' into pagination
NicholasBoll Mar 6, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion commitlint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ module.exports = {
};

// Extra scopes supported outside the `modules` folder
const scopes = ['labs'];
const scopes = ['labs', 'pagination'];
NicholasBoll marked this conversation as resolved.
Show resolved Hide resolved

/**
* @param {{ cwd: string}} context
Expand Down
239 changes: 239 additions & 0 deletions cypress/integration/Pagination.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,239 @@
import * as h from '../helpers';

describe('Button', () => {
before(() => {
h.stories.visit();
});

context('given Default pagination story is rendered', () => {
context('when screen width is larger than 500', () => {
beforeEach(() => {
h.stories.load('Labs/Pagination', 'Default');
});

it('should not have any axe errors', () => {
cy.checkA11y();
});

context('when the first page is selected', () => {
it('should have first page button with an aria label of "Selected, Page 1"', () => {
cy.contains('button', '1').should('have.attr', 'aria-label', 'Selected, Page 1');
});

it('should disable previous page button', () => {
cy.findByLabelText('Previous Page').should('be.disabled');
});

it('should not disable next page button', () => {
cy.findByLabelText('Next Page').should('not.be.disabled');
});

it('should show 5 page buttons', () => {
cy.findAllByLabelText(/Page \d$/).should('have.length', 5);
});

it('should label all page buttons', () => {
cy.contains('button', '2').should('have.attr', 'aria-label', 'Page 2');
cy.contains('button', '3').should('have.attr', 'aria-label', 'Page 3');
cy.contains('button', '4').should('have.attr', 'aria-label', 'Page 4');
cy.contains('button', '5').should('have.attr', 'aria-label', 'Page 5');
});

it('should reflect the current page number', () => {
cy.findByTestId('pageNumber').should('have.text', '1');
});
});

context('when the second page is clicked', () => {
beforeEach(() => {
cy.findByLabelText('Page 2').click();
});

it('should active page 2', () => {
cy.contains('button', '2').should('have.attr', 'aria-label', 'Selected, Page 2');
});

it('should keep focus on page 2', () => {
cy.contains('button', '2').should('have.focus');
});

it('should not disable previous page button', () => {
cy.findByLabelText('Previous Page').should('not.be.disabled');
});

it('should not disable next page button', () => {
cy.findByLabelText('Next Page').should('not.be.disabled');
});

it('should reflect the current page number', () => {
cy.findByTestId('pageNumber').should('have.text', '2');
});
});

context('when there are 10 pages (for page number distribution)', () => {
beforeEach(() => {
cy.changeKnob('total', 100);
});

it('should show 6 numbers', () => {
cy.findAllByLabelText(/Page \d+$/).should('have.length', 6);
});

context('when page 1 is selected', () => {
it('should show pages 1 through 5 and page 10', () => {
cy.findByLabelText(/Page 1$/).should('exist');
cy.findByLabelText(/Page 2$/).should('exist');
cy.findByLabelText(/Page 3$/).should('exist');
cy.findByLabelText(/Page 4$/).should('exist');
cy.findByLabelText(/Page 5$/).should('exist');
cy.findByLabelText(/Page 10$/).should('exist');
});
});

context('when page 2 is selected', () => {
beforeEach(() => {
cy.findByLabelText('Page 2').click();
});

it('should show pages 1 through 5 and page 10', () => {
cy.findByLabelText(/Page 1$/).should('exist');
cy.findByLabelText(/Page 2$/).should('exist');
cy.findByLabelText(/Page 3$/).should('exist');
cy.findByLabelText(/Page 4$/).should('exist');
cy.findByLabelText(/Page 5$/).should('exist');
cy.findByLabelText(/Page 10$/).should('exist');
});
});

context('when page 3 is selected', () => {
beforeEach(() => {
cy.findByLabelText('Page 3').click();
});

it('should show pages 1 through 5 and page 10', () => {
cy.findByLabelText(/Page 1$/).should('exist');
cy.findByLabelText(/Page 2$/).should('exist');
cy.findByLabelText(/Page 3$/).should('exist');
cy.findByLabelText(/Page 4$/).should('exist');
cy.findByLabelText(/Page 5$/).should('exist');
cy.findByLabelText(/Page 10$/).should('exist');
});
});

context('when page 4 is selected', () => {
beforeEach(() => {
cy.findByLabelText('Page 4').click();
});

it('should show pages 2 through 6 and page 10', () => {
cy.findByLabelText(/Page 2$/).should('exist');
cy.findByLabelText(/Page 3$/).should('exist');
cy.findByLabelText(/Page 4$/).should('exist');
cy.findByLabelText(/Page 5$/).should('exist');
cy.findByLabelText(/Page 6$/).should('exist');
cy.findByLabelText(/Page 10$/).should('exist');
});
});

context('when page 6 is selected', () => {
beforeEach(() => {
cy.findByLabelText('Page 10').click();
cy.findByLabelText('Page 6').click();
});

it('should show pages 4 through 8 and page 10', () => {
cy.findByLabelText(/Page 4$/).should('exist');
cy.findByLabelText(/Page 5$/).should('exist');
cy.findByLabelText(/Page 6$/).should('exist');
cy.findByLabelText(/Page 7$/).should('exist');
cy.findByLabelText(/Page 8$/).should('exist');
cy.findByLabelText(/Page 10$/).should('exist');
});
});

context('when page 7 is selected', () => {
beforeEach(() => {
cy.findByLabelText('Page 10').click();
cy.findByLabelText('Page 7').click();
});

it('should show page 1 and pages 6 through 10', () => {
cy.findByLabelText(/Page 1$/).should('exist');
cy.findByLabelText(/Page 6$/).should('exist');
cy.findByLabelText(/Page 7$/).should('exist');
cy.findByLabelText(/Page 8$/).should('exist');
cy.findByLabelText(/Page 9$/).should('exist');
cy.findByLabelText(/Page 10$/).should('exist');
});
});
});
});
});

context('given Default pagination story is rendered', () => {
context('when screen width is larger than 500', () => {
beforeEach(() => {
h.stories.load('Labs/Pagination', 'With Go To');
});

it('should not have any axe errors', () => {
cy.checkA11y();
});

context('when 50 is entered into the Go To input', () => {
beforeEach(() => {
cy.findByLabelText('Go To')
.type('50')
.type('{enter}');
});

it('should set page 50 as the selected page', () => {
cy.findByText('50').should('have.attr', 'aria-label', 'Selected, Page 50');
});
});

context('when -1 is entered into the Go To input', () => {
beforeEach(() => {
cy.findByLabelText('Go To')
.type('-1')
.type('{enter}');
});

it('should not change the selected page', () => {
cy.findByText('1').should('have.attr', 'aria-label', 'Selected, Page 1');
});
});
});
});

context('when screen width is smaller than 500', () => {
beforeEach(() => {
cy.viewport(414, 736); // iPhone 6/7/8 Plus
h.stories.load('Labs/Pagination', 'Default');
});

it('should show 2 page buttons', () => {
cy.findAllByLabelText(/Page \d+$/).should('have.length', 2);
});

context('when the last page is clicked', () => {
NicholasBoll marked this conversation as resolved.
Show resolved Hide resolved
beforeEach(() => {
cy.findByLabelText('Page 5').click();
});

it('should show 3 numbers', () => {
cy.findAllByLabelText(/Page \d+$/).should('have.length', 3);
});
});

context('when there are 3 pages', () => {
beforeEach(() => {
cy.changeKnob('total', 30);
});

it('should show 3 page buttons', () => {
cy.findAllByLabelText(/Page \d+$/).should('have.length', 3);
});
});
});
});
51 changes: 51 additions & 0 deletions modules/_labs/pagination/react/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
Apache License, Version 2.0 Apache License Version 2.0, January 2004

http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

1. Definitions.
"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

2. Grant of Copyright License.
Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

3. Grant of Patent License.
Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

4. Redistribution.
You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
You must give any other recipients of the Work or Derivative Works a copy of this License; and You must cause any modified files to carry prominent notices stating that You changed the files; and You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

5. Submission of Contributions.
Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

6. Trademarks.
This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

7. Disclaimer of Warranty.
Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

8. Limitation of Liability.
In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

9. Accepting Warranty or Additional Liability.
While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

©2019. Workday, Inc. All rights reserved. Workday and the Workday logo are registered trademarks of Workday, Inc. All other brand and product names are trademarks or registered trademarks of their respective holders.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
Loading