From 41993ad37882f44c7d4fb5510a0cbf67fbe98423 Mon Sep 17 00:00:00 2001 From: Marcelo Rydel Date: Tue, 16 Nov 2021 05:33:01 -0700 Subject: [PATCH] feat(app): create react button component [EE-1948] (#6022) Co-authored-by: Chaim Lev-Ari --- .gitignore | 1 + app/assets/css/app.css | 2 +- .../components/Button/AddButton.module.css | 3 + .../components/Button/AddButton.stories.tsx | 20 +++ .../components/Button/AddButton.test.tsx | 22 ++++ app/portainer/components/Button/AddButton.tsx | 25 ++++ .../components/Button/Button.stories.tsx | 105 ++++++++++++++++ .../components/Button/Button.test.tsx | 37 ++++++ app/portainer/components/Button/Button.tsx | 45 +++++++ .../components/Button/ButtonGroup.stories.tsx | 117 ++++++++++++++++++ .../components/Button/ButtonGroup.test.tsx | 18 +++ .../components/Button/ButtonGroup.tsx | 29 +++++ app/portainer/components/Button/index.ts | 7 ++ package.json | 3 +- 14 files changed, 432 insertions(+), 2 deletions(-) create mode 100644 app/portainer/components/Button/AddButton.module.css create mode 100644 app/portainer/components/Button/AddButton.stories.tsx create mode 100644 app/portainer/components/Button/AddButton.test.tsx create mode 100644 app/portainer/components/Button/AddButton.tsx create mode 100644 app/portainer/components/Button/Button.stories.tsx create mode 100644 app/portainer/components/Button/Button.test.tsx create mode 100644 app/portainer/components/Button/Button.tsx create mode 100644 app/portainer/components/Button/ButtonGroup.stories.tsx create mode 100644 app/portainer/components/Button/ButtonGroup.test.tsx create mode 100644 app/portainer/components/Button/ButtonGroup.tsx create mode 100644 app/portainer/components/Button/index.ts diff --git a/.gitignore b/.gitignore index bec73737e..60bed44fc 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ bower_components dist portainer-checksum.txt api/cmd/portainer/portainer* +storybook-static .tmp **/.vscode/settings.json **/.vscode/tasks.json diff --git a/app/assets/css/app.css b/app/assets/css/app.css index 32b6d01ca..7f348fd09 100644 --- a/app/assets/css/app.css +++ b/app/assets/css/app.css @@ -600,7 +600,7 @@ a[ng-click] { padding-top: 7px; } -.tag { +.tag:not(.token) { padding: 2px 6px; color: white; background-color: var(--blue-2); diff --git a/app/portainer/components/Button/AddButton.module.css b/app/portainer/components/Button/AddButton.module.css new file mode 100644 index 000000000..a46fb8a6d --- /dev/null +++ b/app/portainer/components/Button/AddButton.module.css @@ -0,0 +1,3 @@ +.add-button { + border: none; +} diff --git a/app/portainer/components/Button/AddButton.stories.tsx b/app/portainer/components/Button/AddButton.stories.tsx new file mode 100644 index 000000000..d03344058 --- /dev/null +++ b/app/portainer/components/Button/AddButton.stories.tsx @@ -0,0 +1,20 @@ +import { Meta, Story } from '@storybook/react'; + +import { AddButton, Props } from './AddButton'; + +export default { + component: AddButton, + title: 'Components/Buttons/AddButton', +} as Meta; + +function Template({ label, onClick }: JSX.IntrinsicAttributes & Props) { + return ; +} + +export const Primary: Story = Template.bind({}); +Primary.args = { + label: 'Create new container', + onClick: () => { + alert('Hello AddButton!'); + }, +}; diff --git a/app/portainer/components/Button/AddButton.test.tsx b/app/portainer/components/Button/AddButton.test.tsx new file mode 100644 index 000000000..dd7c2b917 --- /dev/null +++ b/app/portainer/components/Button/AddButton.test.tsx @@ -0,0 +1,22 @@ +import { fireEvent, render } from '@testing-library/react'; + +import { AddButton, Props } from './AddButton'; + +function renderDefault({ + label = 'default label', + onClick = () => {}, +}: Partial = {}) { + return render(); +} + +test('should display a AddButton component and allow onClick', async () => { + const label = 'test label'; + const onClick = jest.fn(); + const { findByText } = renderDefault({ label, onClick }); + + const buttonLabel = await findByText(label); + expect(buttonLabel).toBeTruthy(); + + fireEvent.click(buttonLabel); + expect(onClick).toHaveBeenCalled(); +}); diff --git a/app/portainer/components/Button/AddButton.tsx b/app/portainer/components/Button/AddButton.tsx new file mode 100644 index 000000000..e95718ddc --- /dev/null +++ b/app/portainer/components/Button/AddButton.tsx @@ -0,0 +1,25 @@ +import clsx from 'clsx'; + +import styles from './AddButton.module.css'; + +export interface Props { + label: string; + onClick: () => void; +} + +export function AddButton({ label, onClick }: Props) { + return ( +