Skip to content

Commit

Permalink
Merge pull request #2679 from storybooks/tmeasday/add-options-to-stor…
Browse files Browse the repository at this point in the history
…y-store

Add parameters to stories in the story store, and render them in app layers
  • Loading branch information
Hypnosphi committed Mar 20, 2018
2 parents c8373ff + 5a81b74 commit 9340dde
Show file tree
Hide file tree
Showing 32 changed files with 349 additions and 86 deletions.
14 changes: 12 additions & 2 deletions app/angular/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,15 @@ export interface IStoribookSection {
stories: IStorybookStory[];
}

export type IGetStory = () => {
export interface IStoryContext {
kind: string;
name: string;
parameters: any;
}

export type IGetStory = (
IStoryContext
) => {
props?: ICollection;
moduleMetadata?: Partial<NgModuleMetadata>;
component?: any;
Expand All @@ -21,13 +29,15 @@ export type IGetStory = () => {
export interface IApi {
kind: string;
addDecorator: (decorator: any) => IApi;
add: (storyName: string, getStory: IGetStory) => IApi;
addParameters: (parameters: any) => IApi;
add: (storyName: string, getStory: IGetStory, parameters?: any) => IApi;
}

declare module '@storybook/angular' {
export function storiesOf(kind: string, module: NodeModule): IApi;
export function setAddon(addon: any): void;
export function addDecorator(decorator: any): IApi;
export function addParameters(parameters: any): IApi;
export function configure(loaders: () => NodeRequire, module: NodeModule): void;
export function getStorybook(): IStoribookSection[];
}
9 changes: 8 additions & 1 deletion app/angular/src/client/index.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
export { storiesOf, setAddon, addDecorator, configure, getStorybook } from './preview';
export {
storiesOf,
setAddon,
addDecorator,
addParameters,
configure,
getStorybook,
} from './preview';

export { moduleMetadata } from './preview/angular/decorators';
12 changes: 5 additions & 7 deletions app/angular/src/client/preview/angular/helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,7 @@ import { NoPreviewComponent } from './components/no-preview.component';
import { STORY } from './app.token';
import {
NgModuleMetadata,
IGetStoryWithContext,
IContext,
IGetStory,
NgProvidedData,
IRenderErrorFn,
IRenderStoryFn,
Expand Down Expand Up @@ -78,11 +77,10 @@ const createComponentFromTemplate = (template: string, styles: string[]): Functi
};

const initModule = (
currentStory: IGetStoryWithContext,
context: IContext,
currentStory: IGetStory,
reRender: boolean = false
): Function => {
const storyObj = currentStory(context);
const storyObj = currentStory();
const { component, template, props, styles, moduleMetadata = {} } = storyObj;

let AnnotatedComponent;
Expand Down Expand Up @@ -154,6 +152,6 @@ export const renderNoPreview = debounce(() => {
draw(Module);
});

export const renderNgApp = debounce((story, context, reRender) => {
draw(initModule(story, context, reRender), reRender);
export const renderNgApp = debounce((story, reRender) => {
draw(initModule(story, reRender), reRender);
});
9 changes: 2 additions & 7 deletions app/angular/src/client/preview/angular/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,10 @@ export interface NgError {

export type NgProvidedData = NgStory | NgError;

export interface IContext {
[p: string]: any;
}

export type IGetStoryWithContext = (context: IContext) => NgStory;
export type IGetStory = () => NgStory;

export type IRenderStoryFn = (
story: IGetStoryWithContext,
context: IContext,
story: IGetStory,
reRender?: boolean
) => void;
export type IRenderErrorFn = (error: Error) => void;
9 changes: 8 additions & 1 deletion app/angular/src/client/preview/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,14 @@ const storyStore = new StoryStore();
const reduxStore = createStore(reducer);
const context = { storyStore, reduxStore };
const clientApi = new ClientApi(context);
export const { storiesOf, setAddon, addDecorator, clearDecorators, getStorybook } = clientApi;
export const {
storiesOf,
setAddon,
addDecorator,
addParameters,
clearDecorators,
getStorybook,
} = clientApi;

let channel;
if (isBrowser) {
Expand Down
8 changes: 2 additions & 6 deletions app/angular/src/client/preview/render.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ export function renderMain(data, storyStore, forceRender) {

const { selectedKind, selectedStory } = data;

const story = storyStore.getStory(selectedKind, selectedStory);
const story = storyStore.getStoryWithContext(selectedKind, selectedStory);
if (!story) {
renderNoPreview();
return null;
Expand All @@ -47,11 +47,7 @@ export function renderMain(data, storyStore, forceRender) {
previousKind = selectedKind;
previousStory = selectedStory;
}
const context = {
kind: selectedKind,
story: selectedStory,
};
return renderNgApp(story, context, reRender);
return renderNgApp(story, reRender);
}

export default function renderPreview({ reduxStore, storyStore }, forceRender = false) {
Expand Down
9 changes: 8 additions & 1 deletion app/polymer/src/client/index.js
Original file line number Diff line number Diff line change
@@ -1 +1,8 @@
export { storiesOf, setAddon, addDecorator, configure, getStorybook } from './preview';
export {
storiesOf,
setAddon,
addDecorator,
addParameters,
configure,
getStorybook,
} from './preview';
9 changes: 8 additions & 1 deletion app/polymer/src/client/preview/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,14 @@ const reduxStore = createStore(reducer);
const context = { storyStore, reduxStore };

const clientApi = new ClientApi(context);
export const { storiesOf, setAddon, addDecorator, clearDecorators, getStorybook } = clientApi;
export const {
storiesOf,
setAddon,
addDecorator,
addParameters,
clearDecorators,
getStorybook,
} = clientApi;

let channel;
if (isBrowser) {
Expand Down
8 changes: 2 additions & 6 deletions app/polymer/src/client/preview/render.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,19 +21,15 @@ export function renderException(error) {
export function renderMain(data, storyStore) {
if (storyStore.size() === 0) return;
const { selectedKind, selectedStory } = data;
const story = storyStore.getStory(selectedKind, selectedStory);
const story = storyStore.getStoryWithContext(selectedKind, selectedStory);

if (selectedKind !== previousKind || previousStory !== selectedStory) {
previousKind = selectedKind;
previousStory = selectedStory;
} else {
return;
}
const context = {
kind: selectedKind,
story: selectedStory,
};
const component = story ? story(context) : nopreview;
const component = story ? story() : nopreview;

if (!component) {
renderError({
Expand Down
1 change: 1 addition & 0 deletions app/react-native/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ const preview = new Preview();
export const storiesOf = preview.storiesOf.bind(preview);
export const setAddon = preview.setAddon.bind(preview);
export const addDecorator = preview.addDecorator.bind(preview);
export const addParameters = preview.addParameters.bind(preview);
export const clearDecorators = preview.clearDecorators.bind(preview);
export const configure = preview.configure.bind(preview);
export const getStorybook = preview.getStorybook.bind(preview);
Expand Down
3 changes: 1 addition & 2 deletions app/react-native/src/preview/components/StoryView/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,9 @@ export default class StoryView extends Component {
return this.renderHelp();
}
const { kind, story } = this.state.selection;
const context = { kind, story };
return (
<View key={`${kind}:::${story}`} style={style.main}>
{this.state.storyFn(context)}
{this.state.storyFn()}
</View>
);
}
Expand Down
11 changes: 9 additions & 2 deletions app/react-native/src/preview/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,14 @@ export default class Preview {
this._stories = new StoryStore();
this._clientApi = new ClientApi({ storyStore: this._stories });

['storiesOf', 'setAddon', 'addDecorator', 'clearDecorators', 'getStorybook'].forEach(method => {
[
'storiesOf',
'setAddon',
'addDecorator',
'addParameters',
'clearDecorators',
'getStorybook',
].forEach(method => {
this[method] = this._clientApi[method].bind(this._clientApi);
});
}
Expand Down Expand Up @@ -87,7 +94,7 @@ export default class Preview {

_selectStory(selection) {
const { kind, story } = selection;
const storyFn = this._stories.getStory(kind, story);
const storyFn = this._stories.getStoryWithContext(kind, story);
this._events.emit('story', storyFn, selection);
}
}
1 change: 1 addition & 0 deletions app/react/src/client/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ export {
storiesOf,
setAddon,
addDecorator,
addParameters,
configure,
getStorybook,
forceReRender,
Expand Down
9 changes: 8 additions & 1 deletion app/react/src/client/preview/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,14 @@ const reduxStore = createStore(reducer);
const context = { storyStore, reduxStore };

const clientApi = new ClientApi(context);
export const { storiesOf, setAddon, addDecorator, clearDecorators, getStorybook } = clientApi;
export const {
storiesOf,
setAddon,
addDecorator,
addParameters,
clearDecorators,
getStorybook,
} = clientApi;

let channel;
if (isBrowser) {
Expand Down
9 changes: 2 additions & 7 deletions app/react/src/client/preview/render.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ export function renderMain(data, storyStore, forceRender) {
const { selectedKind, selectedStory } = data;

const revision = storyStore.getRevision();
const story = storyStore.getStory(selectedKind, selectedStory);
const story = storyStore.getStoryWithContext(selectedKind, selectedStory);
if (!story) {
ReactDOM.render(noPreview, rootEl);
return null;
Expand Down Expand Up @@ -77,12 +77,7 @@ export function renderMain(data, storyStore, forceRender) {
previousStory = selectedStory;
ReactDOM.unmountComponentAtNode(rootEl);

const context = {
kind: selectedKind,
story: selectedStory,
};

const element = story(context);
const element = story();

if (!element) {
const error = {
Expand Down
9 changes: 8 additions & 1 deletion app/vue/src/client/index.js
Original file line number Diff line number Diff line change
@@ -1 +1,8 @@
export { storiesOf, setAddon, addDecorator, configure, getStorybook } from './preview';
export {
storiesOf,
setAddon,
addDecorator,
addParameters,
configure,
getStorybook,
} from './preview';
9 changes: 8 additions & 1 deletion app/vue/src/client/preview/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,14 @@ const decorateStory = (getStory, decorators) =>
);
const context = { storyStore, reduxStore, decorateStory };
const clientApi = new ClientApi(context);
export const { storiesOf, setAddon, addDecorator, clearDecorators, getStorybook } = clientApi;
export const {
storiesOf,
setAddon,
addDecorator,
addParameters,
clearDecorators,
getStorybook,
} = clientApi;

let channel;
if (isBrowser) {
Expand Down
17 changes: 9 additions & 8 deletions app/vue/src/client/preview/render.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,13 @@ function renderErrorDisplay(error) {
return h(
'div',
{ attrs: { id: 'error-display' } },
error ? [h(ErrorDisplay, { props: { message: error.message, stack: error.stack } })] : []
error
? [
h(ErrorDisplay, {
props: { message: error.message, stack: error.stack },
}),
]
: []
);
},
});
Expand Down Expand Up @@ -54,7 +60,7 @@ export function renderMain(data, storyStore, forceRender) {

const { selectedKind, selectedStory } = data;

const story = storyStore.getStory(selectedKind, selectedStory);
const story = storyStore.getStoryWithContext(selectedKind, selectedStory);

// Unmount the previous story only if selectedKind or selectedStory has changed.
// renderMain() gets executed after each action. Actions will cause the whole
Expand All @@ -71,12 +77,7 @@ export function renderMain(data, storyStore, forceRender) {
return;
}

const context = {
kind: selectedKind,
story: selectedStory,
};

const component = story ? story(context) : NoPreview;
const component = story ? story() : NoPreview;

if (!component) {
const error = {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`Storyshots Core|Parameters passed to story 1`] = `
<storybook-dynamic-app-root
cfr={[Function CodegenComponentFactoryResolver]}
data={[Function Object]}
target={[Function ViewContainerRef_]}
>
<storybook-button-component
_nghost-c8=""
>


<button
_ngcontent-c8=""
>
Parameters are {"globalParameter":"globalParameter","chapterParameter":"chapterParameter","storyParameter":"storyParameter"}
</button>


</storybook-button-component>
</storybook-dynamic-app-root>
`;

0 comments on commit 9340dde

Please sign in to comment.