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

initial storybook implmentation #1144

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
25 changes: 25 additions & 0 deletions horreum-web/.storybook/main.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import type { StorybookConfig } from "@storybook/react-webpack5"

const config: StorybookConfig = {
stories: ["../src/**/*.mdx", "../src/**/*.stories.@(js|jsx|mjs|ts|tsx)"],
addons: [
"@storybook/addon-links",
"@storybook/addon-essentials",
"@storybook/preset-create-react-app",
"@storybook/addon-onboarding",
"@storybook/addon-interactions",
],
framework: {
name: "@storybook/react-webpack5",
options: {
builder: {
useSWC: true,
},
},
},
docs: {
autodocs: "tag",
},
staticDirs: ["../public"],
}
export default config
15 changes: 15 additions & 0 deletions horreum-web/.storybook/preview.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import type { Preview } from "@storybook/react"
import "@patternfly/patternfly/patternfly.css"
const preview: Preview = {
parameters: {
actions: { argTypesRegex: "^on[A-Z].*" },
controls: {
matchers: {
color: /(background|color)$/i,
date: /Date$/i,
},
},
},
}

export default preview
15,549 changes: 12,200 additions & 3,349 deletions horreum-web/package-lock.json

Large diffs are not rendered by default.

32 changes: 29 additions & 3 deletions horreum-web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
"redux": "4.2.1",
"redux-first-history": "5.1.1",
"redux-thunk": "2.4.1",
"storybook": "^7.6.7",
"typescript": "4.9.5",
"uuid": "9.0.0"
},
Expand All @@ -51,10 +52,23 @@
"test": "react-scripts test",
"eject": "react-scripts eject",
"lint": "eslint \"**/*.{ts,tsx}\"",
"prettier-format": "prettier --config .prettierrc \"**/*.{ts,tsx}\" --write"
"prettier-format": "prettier --config .prettierrc \"**/*.{ts,tsx}\" --write",
"storybook": "storybook dev -p 6006",
"build-storybook": "storybook build"
},
"eslintConfig": {
"extends": "react-app",
"extends": [
"r",
"e",
"a",
"c",
"t",
"-",
"a",
"p",
"p",
"plugin:storybook/recommended"
],
"rules": {
"no-lone-blocks": 0
}
Expand All @@ -72,11 +86,23 @@
]
},
"devDependencies": {
"@storybook/addon-essentials": "^7.6.7",
"@storybook/addon-interactions": "^7.6.7",
"@storybook/addon-links": "^7.6.7",
"@storybook/addon-onboarding": "^1.0.10",
"@storybook/blocks": "^7.6.7",
"@storybook/preset-create-react-app": "^7.6.7",
"@storybook/react": "^7.6.7",
"@storybook/react-webpack5": "^7.6.7",
"@storybook/test": "^7.6.7",
"@typescript-eslint/eslint-plugin": "5.62.0",
"@typescript-eslint/parser": "5.62.0",
"eslint": "8.49.0",
"eslint-plugin-storybook": "^0.6.15",
"prettier": "3.1.1",
"prop-types": "^15.8.1",
"react-error-overlay": "6.0.11",
"react-scripts": "5.0.1"
"react-scripts": "5.0.1",
"webpack": "^5.89.0"
}
}
33 changes: 33 additions & 0 deletions horreum-web/src/components/AccessChoice.stories.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import type { Meta, StoryObj } from '@storybook/react';

import AccessChoice from './AccessChoice';
import { Access } from "../api"

const meta = {
title: "components/AccessChoice",
component: AccessChoice,
parameters: {
layout: 'centered',
},
tags: ['autodocs'],
argTypes: {

}
} satisfies Meta<typeof AccessChoice>;
export default meta;
type Story = StoryObj<typeof meta>;
export const Public: Story = {
args: {
checkedValue: Access.Public
}
}
export const Private: Story = {
args: {
checkedValue: Access.Private
}
}
export const Protected: Story = {
args: {
checkedValue: Access.Protected
}
}
34 changes: 34 additions & 0 deletions horreum-web/src/components/AccessIcon.stories.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import type { Meta, StoryObj } from '@storybook/react';
import AccessIcon from './AccessIcon';
import { Access } from "../api"
const meta = {
title: "components/AccessIcon",
component: AccessIcon,
parameters: {
// Optional parameter to center the component in the Canvas. More info: https://storybook.js.org/docs/configure/story-layout
layout: 'centered',
},
// This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/writing-docs/autodocs
tags: ['autodocs'],
// More on argTypes: https://storybook.js.org/docs/api/argtypes
argTypes: {

},
} satisfies Meta<typeof AccessIcon>;
export default meta;
type Story = StoryObj<typeof meta>;
export const Public: Story = {
args: {
access: Access.Public
}
}
export const Private: Story = {
args: {
access: Access.Private
}
}
export const Protected: Story = {
args: {
access: Access.Protected
}
}
34 changes: 34 additions & 0 deletions horreum-web/src/components/AccessIconOnly.stories.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import type { Meta, StoryObj } from '@storybook/react';
import AccessIconOnly from './AccessIconOnly';
import { Access } from "../api"
const meta = {
title: "components/AccessIconOnly",
component: AccessIconOnly,
parameters: {
// Optional parameter to center the component in the Canvas. More info: https://storybook.js.org/docs/configure/story-layout
layout: 'centered',
},
// This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/writing-docs/autodocs
tags: ['autodocs'],
// More on argTypes: https://storybook.js.org/docs/api/argtypes
argTypes: {

},
} satisfies Meta<typeof AccessIconOnly>;
export default meta;
type Story = StoryObj<typeof meta>;
export const Public: Story = {
args: {
access: Access.Public
}
}
export const Private: Story = {
args: {
access: Access.Private
}
}
export const Protected: Story = {
args: {
access: Access.Protected
}
}
58 changes: 58 additions & 0 deletions horreum-web/src/components/ActionMenu.stories.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@


import type { Meta, StoryObj } from '@storybook/react';
import ActionMenu, {useChangeAccess, useDelete } from './ActionMenu';
//Things we have to import because of component dependencies
import { Access } from "../api"
import {Provider} from "react-redux"
import store from "../store"

/**
* We have to wrap with a Provider because ActionMenu uses useTester
* which directly depends on the redux state from keycloak
*/

const meta = {
title: "components/ActionMenu",
component: ActionMenu,
decorators: [
//{auth: roles: ["tester", "ow-tester"]
(Story) => (<Provider store={store}><Story/></Provider>),
],
parameters: {
layout: 'centered',
},
tags: ['autodocs'],
argTypes: {

}
} satisfies Meta<typeof ActionMenu>;
export default meta;
type Story = StoryObj<typeof meta>;

export const ChangeAccess: Story = {
args: {
id: 0,
owner: "owner",
access: Access.Public,
description: "empty",
items: [useChangeAccess({
onAccessUpdate: (id, owner, access) => {return id},
})]
}
}

//Invalid Hook call (onDelete?) outside of react render
//Cannot read properties of null (reading 'useState')
//useDelete
// export const Delete: Story = {
// args: {
// id: 1,
// owner: "owner",
// access: Access.Public,
// description: "empty",
// items: [useDelete({
// onDelete: (id) => {return new Promise((a,b)=>a)},
// })]
// }
// }
65 changes: 65 additions & 0 deletions horreum-web/src/components/ButtonLink.stories.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import type { Meta, StoryObj } from '@storybook/react';
import ButtonLink from './ButtonLink';
//Things we have to import because of component dependencies
import {Router} from "react-router-dom"
import {createBrowserHistory} from "history";

const meta = {
title: "components/ButtonLink",
component: ButtonLink,
parameters: {
// Optional parameter to center the component in the Canvas. More info: https://storybook.js.org/docs/configure/story-layout
layout: 'centered',
},
decorators: [
(Story) => (<Router history={createBrowserHistory()}><Story/></Router>),
],
// This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/writing-docs/autodocs
tags: ['autodocs'],
// More on argTypes: https://storybook.js.org/docs/api/argtypes
argTypes: {

},
} satisfies Meta<typeof ButtonLink>;
export default meta;
type Story = StoryObj<typeof meta>;
export const Primary: Story = {
args: {
variant: "primary",
to: "link",
isDisabled: false,
children: [<>buttonLink</>]
},
}
export const Secondary: Story = {
args: {
variant: "secondary",
to: "link",
isDisabled: false,
children: [<>buttonLink</>]
},
}
export const Tertiary: Story = {
args: {
variant: "tertiary",
to: "link",
isDisabled: false,
children: [<>buttonLink</>]
},
}
export const Control: Story = {
args: {
variant: "control",
to: "link",
isDisabled: false,
children: [<>buttonLink</>]
},
}
export const Disabled: Story = {
args: {
variant: "primary",
to: "link",
isDisabled: true,
children: [<>buttonLink</>]
},
}
36 changes: 36 additions & 0 deletions horreum-web/src/components/ChangeAccessModal.stories.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import type { Meta, StoryObj } from '@storybook/react';
import ChangeAccessModal from './ChangeAccessModal';

//Things we have to import because of component dependencies
import { Access } from "../api"
import {Provider, useSelector} from "react-redux"
import store from "../store"

const meta = {
title: "components/ChangeAccessModal",
component: ChangeAccessModal,
parameters: {
// Optional parameter to center the component in the Canvas. More info: https://storybook.js.org/docs/configure/story-layout
layout: 'centered',
},
decorators: [
(Story) => (<Provider store={store}><Story/></Provider>),
],
// This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/writing-docs/autodocs
tags: ['autodocs'],
// More on argTypes: https://storybook.js.org/docs/api/argtypes
argTypes: {

},
} satisfies Meta<typeof ChangeAccessModal>;
export default meta;
type Story = StoryObj<typeof meta>;

//render error because it tries to fetch the selection with teamToName
export const Open: Story = {
args: {
isOpen: true,
owner: "owner",
access: Access.Public
},
}
Loading