import { storiesOf } from '@storybook/angular';
import { ButtonComponent } from '../../src/angular/buttons/button.component';
import { ButtonFileOpenerComponent } from '../../src/angular/buttons/button-file-opener.component';
import { moduleMetadata } from '@storybook/angular';
import { SvgIconModule } from '../../src/angular/svg-icon/svg-icon.module';
import { action } from '@storybook/addon-actions';
import { withKnobs, text, number, boolean, array, select, color, date, button } from '@storybook/addon-knobs';
import { withNotes } from '@storybook/addon-notes';
const buttonTypes = ['primary', 'secondary', 'link', 'success', 'error', 'warning', 'info'];
const buttonSizes = ['large', 'medium', 'small', 'x-small', 'default'];
const positions = ['right', 'left'];
const iconsNames = ['settings-o', 'plus-circle-o', 'plus-circle', 'caret2-right-circle-o'];
/**
* There is strange behaviour with Storybook storyname, if the name is string 'aaaa', then all stories
* need to be string, you can not do const aaaa = 'aaaa' and pass the parameter aaaa as storyname.
*/
const storiesNames = {
defaultButton: 'Default button',
typesButtons: 'Button ',
withIcon: 'Button with icon',
withSpinner: 'Button with spinner',
buttonFileOpener: 'Button file opener'
}
let stories = storiesOf('Form elements|Buttons', module)
.addDecorator(withKnobs)
.addDecorator(withNotes)
.addDecorator(
moduleMetadata({
declarations: [
ButtonComponent,
ButtonFileOpenerComponent
],
imports: [
SvgIconModule
]
})
);
stories.add(storiesNames.defaultButton, () => {
const _text1 = text('text', 'Default button long text');
const _testId1 = text('testId', 'button-test-id-1');
const click1 = text('(click)', 'call back function');
const _text2 = text('text', 'Sample button');
const _testId2 = text('testId', 'button-test-id-2');
const click2 = text('(click)', 'call back function');
return {
props: {
buttonClick1: action('Button 1 was clicked'),
buttonClick2: action('Button 2 was clicked'),
_text1, _testId1,
_text2, _testId2
},
template: `
With large text
With small text
`
}
},
{ notes: `Default button
Does not need to supply type or size.
The size of the button set to 'default' so it will shrink or expand according to the content.`
}
);
buttonTypes.forEach((buttonType) => {
stories.add(storiesNames.typesButtons + buttonType, () => {
const _text = text('text', buttonType);
const _type = text('type', buttonType);
// Do not allow this, because we are showing each button type as different story.
// const _type = select('type', buttonTypes, buttonType, '');
const _testId = text('testId', 'button-test-id-' + buttonType);
// No need to add the size to prop, not using it
const _size = text('size', 'Avilable sizes: ' + buttonSizes);
const _disabled = boolean('disabled', true);
const click = text('(click)', 'call back function');
return {
props: {
buttonClick: action('Button was clicked (see in action logger tab)'),
_text, _testId, _type, _disabled
},
template:
`` +
buttonSizes.map((currentSize) => `
`).join('\n') +
`
`
.concat(
buttonSizes.map((currentSize) => `
`).join('\n') +
'
'
)
};
});
});
stories.add(storiesNames.withIcon, () => {
const _text = text('text', 'Sample');
const _testId = text('testId', 'button-test-id-with-icon');
const _type = select('type', buttonTypes, 'primary', '');
const _icon_position = select('icon_position', positions, 'left', '');
const _icon_name = select('icon_name', iconsNames, 'settings-o', '');
const click = text('(click)', 'call back function');
return {
props: {
buttonClick: action('Button was clicked (see in action logger tab)'),
_text, _testId, _type, _icon_position, _icon_name
},
template: `
`
};
});
stories.add(storiesNames.withSpinner, () => {
const _text = text('text', 'Spinner button');
const _testId = text('testId', 'button-test-id-with-icon');
const _type = select('type', buttonTypes, 'primary', '');
const _show_spinner = boolean('show_spinner', false, '');
const _spinner_position = select('spinner_position', positions, 'right', '');
const click = text('(click)', 'call back function');
return {
props: {
buttonClick: (button) => {
button.show_spinner = true;
setTimeout(() => {button.show_spinner = false},2000);
action('Button was clicked (see in action logger tab)');
},
_text, _testId, _type, _show_spinner, _spinner_position
},
template: `
`
};
});
stories.add(storiesNames.buttonFileOpener, () => {
const _text = text('text', 'Open file');
const _testId = text('testId', 'button-test-id-file-opener');
const _type = select('type', buttonTypes, 'primary', '');
const _extensions = text('extensions', 'ts,js');
const fileUpload = text('(fileUpload)', 'call back function when file upload');
return {
props: {
fileUpload: action('File updaload action'),
_text, _testId, _type, _extensions
},
template: `
`
};
});