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 ( +