Security News
New Python Packaging Proposal Aims to Solve Phantom Dependency Problem with SBOMs
PEP 770 proposes adding SBOM support to Python packages to improve transparency and catch hidden non-Python dependencies that security tools often miss.
@storybook/addon-actions
Advanced tools
The @storybook/addon-actions package is a Storybook addon that allows you to log interactions with your UI components. It is useful for debugging and for getting feedback on how components respond to user actions. With this addon, you can capture events and their payloads, making it easier to understand the behavior of your components during development.
Log Actions
This feature allows you to log actions in the Storybook UI. When the button is clicked, the 'button-click' action is logged, showing the event and its payload.
import { action } from '@storybook/addon-actions';
export default {
title: 'Button',
argTypes: { onClick: { action: 'clicked' } },
};
export const TextButton = () => (
<button onClick={action('button-click')}>Hello Button</button>
);
Customize Output
This feature allows you to customize the output of the action logger. In this example, the default behavior of the click event is prevented, and a custom label is used for logging.
import { action } from '@storybook/addon-actions';
const createClickHandler = (label) => action(label, (e) => e.preventDefault());
export const PreventDefaultButton = () => (
<button onClick={createClickHandler('prevent-default-click')}>Click Me</button>
);
This package allows you to edit React props dynamically using the Storybook UI. It is similar to @storybook/addon-actions in that it enhances the interactive capabilities of Storybook, but it focuses on editing props rather than logging actions.
This addon provides a UI for editing the properties of components. It is the evolution of @storybook/addon-knobs and offers a more integrated and automatic way to create property controls based on component metadata. It differs from @storybook/addon-actions by focusing on component inputs rather than capturing user interactions.
The addon-viewport allows you to adjust the viewport size to test responsive designs within Storybook. While it does not log actions like @storybook/addon-actions, it complements the interactive testing experience by simulating different screen sizes.
Storybook Addon Actions can be used to display data received by event handlers in Storybook.
Install:
npm i -D @storybook/addon-actions
Then, add following content to .storybook/addons.js
import '@storybook/addon-actions/register';
Import the action
function and use it to create actions handlers. When creating action handlers, provide a name to make it easier to identify.
Note: Make sure NOT to use reserved words as function names. issues#29
import { storiesOf } from '@storybook/react';
import { action, configureActions } from '@storybook/addon-actions';
import Button from './button';
storiesOf('Button', module).add('default view', () => (
<Button onClick={action('button-click')}>Hello World!</Button>
));
If your story requires multiple actions, it may be convenient to use actions
to create many at once:
import { storiesOf } from '@storybook/react';
import { actions } from '@storybook/addon-actions';
import Button from './button';
// This will lead to { onClick: action('onClick'), ... }
const eventsFromNames = actions('onClick', 'onMouseOver');
// This will lead to { onClick: action('clicked'), ... }
const eventsFromObject = actions({ onClick: 'clicked', onMouseOver: 'hovered' });
storiesOf('Button', module)
.add('default view', () => <Button {...eventsFromNames}>Hello World!</Button>)
.add('default view, different actions', () => (
<Button {...eventsFromObject}>Hello World!</Button>
));
If you wish to process action data before sending them over to the logger, you can do it with action decorators.
decorate
takes an array of decorator functions. Each decorator function is passed an array of arguments, and should return a new arguments array to use. decorate
returns a object with two functions: action
and actions
, that act like the above, except they log the modified arguments instead of the original arguments.
import { decorate } from '@storybook/addon-actions';
import Button from './button';
const firstArg = decorate([args => args.slice(0, 1)]);
storiesOf('Button', module).add('default view', () => (
<Button onClick={firstArg.action('button-click')}>Hello World!</Button>
));
Arguments which are passed to the action call will have to be serialized while be "transfered" over the channel.
This is not very optimal and can cause lag when large objects are being logged, for this reason it is possible to configure a maximum depth.
The action logger, by default, will log all actions fired during the lifetime of the story. After a while this can make the storybook laggy. As a workaround, you can configure an upper limit to how many actions should be logged.
To apply the configuration globally use the configureActions
function in your config.js
file.
import { configureActions } from '@storybook/addon-actions';
configureActions({
depth: 100,
// Limit the number of items logged into the actions panel
limit: 20,
})
To apply the configuration per action use:
action('my-action', {
depth: 5,
})
Name | Type | Description | Default |
---|---|---|---|
depth | Number | Configures the transfered depth of any logged objects. | 10 |
clearOnStoryChange | Boolean | Flag whether to clear the action logger when switching away from the current story. | true |
limit | Number | Limits the number of items logged in the action logger | 50 |
You can define action handles in a declarative way using withActions
decorators. It accepts the same arguments as actions
Keys have '<eventName> <selector>'
format, e.g. 'click .btn'
. Selector is optional. This can be used with any framework but is especially useful for @storybook/html
.
import { storiesOf } from '@storybook/html';
import { withActions } from '@storybook/addon-actions';
storiesOf('button', module)
// Log mouseovers on entire story and clicks on .btn
.addDecorator(withActions('mouseover', 'click .btn'))
.add('with actions', () => `
<div>
Clicks on this button will be logged: <button className="btn" type="button">Button</button>
</div>
`);
FAQs
Get UI feedback when an action is performed on an interactive element
We found that @storybook/addon-actions demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 12 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
PEP 770 proposes adding SBOM support to Python packages to improve transparency and catch hidden non-Python dependencies that security tools often miss.
Security News
Socket CEO Feross Aboukhadijeh discusses open source security challenges, including zero-day attacks and supply chain risks, on the Cyber Security Council podcast.
Security News
Research
Socket researchers uncover how threat actors weaponize Out-of-Band Application Security Testing (OAST) techniques across the npm, PyPI, and RubyGems ecosystems to exfiltrate sensitive data.