@salesforce/design-system-react
Version:
Salesforce Lightning Design System for React
551 lines (490 loc) • 24 kB
JavaScript
"use strict";
var _react = require("react");
var _react2 = _interopRequireDefault(_react);
var _createReactClass = require("create-react-class");
var _createReactClass2 = _interopRequireDefault(_createReactClass);
var _propTypes = require("prop-types");
var _propTypes2 = _interopRequireDefault(_propTypes);
var _react3 = require("@storybook/react");
var _classnames = require("classnames");
var _classnames2 = _interopRequireDefault(_classnames);
var _iconSettings = require("../../icon-settings");
var _iconSettings2 = _interopRequireDefault(_iconSettings);
var _constants = require("../../../utilities/constants");
var _tabs = require("../../tabs");
var _tabs2 = _interopRequireDefault(_tabs);
var _panel = require("../../tabs/panel");
var _panel2 = _interopRequireDefault(_panel);
var _input = require("../../input");
var _input2 = _interopRequireDefault(_input);
var _inputIcon = require("../../icon/input-icon");
var _inputIcon2 = _interopRequireDefault(_inputIcon);
var _checkbox = require("../../checkbox");
var _checkbox2 = _interopRequireDefault(_checkbox);
var _button = require("../../button");
var _button2 = _interopRequireDefault(_button);
var _icon = require("../../icon");
var _icon2 = _interopRequireDefault(_icon);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// Used in the Nested story
// Used in the Conditinal story
// Used in the outside control story
// Used in the custom content story
/* eslint-disable react/display-name */
var getTabs = function getTabs() {
return _react2.default.createElement("div", null, _react2.default.createElement("h2", {
className: "slds-text-heading--large"
}, "Base Tabs Demo"), _react2.default.createElement(_tabs2.default, {
id: "main-tabs-demo",
className: "custom-class-is-custom",
foo: "baz"
}, _react2.default.createElement(_panel2.default, {
label: "Tab 1"
}, _react2.default.createElement("h2", {
className: "slds-text-heading--medium"
}, "This is my tab 1 contents!"), _react2.default.createElement("p", null, "And they\u2019re amazing."), _react2.default.createElement("p", null, "It\"s awesome."), _react2.default.createElement("p", null, "You can use your ", _react2.default.createElement("var", null, "TAB"), " and ", _react2.default.createElement("var", null, "ARROW"), " keys to navigate around. Try it!"), _react2.default.createElement("p", {
className: "slds-box slds-theme--info slds-m-top--large"
}, "(You might have to hit shift+tab to put the focus onto the tab bar ;)")), _react2.default.createElement(_panel2.default, {
label: "Tab 2"
}, _react2.default.createElement("h2", {
className: "slds-text-heading--medium"
}, "This is my tab 2 contents!"), _react2.default.createElement("p", null, "And they\u2019re also amazing.")), _react2.default.createElement(_panel2.default, {
label: "Tab 3"
}, _react2.default.createElement("h2", {
className: "slds-text-heading--medium"
}, "This is my tab 3 contents!"), _react2.default.createElement("p", null, "And they\u2019re quite spectacular."))));
};
/* eslint-enable react/display-name */
/* eslint-disable react/display-name */
var getTabsMoreThanOneAllowGeneratedID = function getTabsMoreThanOneAllowGeneratedID() {
return _react2.default.createElement("div", null, _react2.default.createElement("h2", {
className: "slds-text-heading--large"
}, "Generated Unique IDs Demo"), _react2.default.createElement(_tabs2.default, null, _react2.default.createElement(_panel2.default, {
label: "Only 1 Tab"
}, _react2.default.createElement("h2", {
className: "slds-text-heading--medium"
}, "About this story"), _react2.default.createElement("p", null, "There should be two instances of Tabs in this story, and each should have a unique (generated) ID."))), _react2.default.createElement(_tabs2.default, null, _react2.default.createElement(_panel2.default, {
label: "Only 1 Tab"
}, _react2.default.createElement("h2", {
className: "slds-text-heading--medium"
}, "About this story"), _react2.default.createElement("p", null, "There should be two instances of Tabs in this story, and each should have a unique (generated) ID."))));
};
/* eslint-enable react/display-name */
/* eslint-disable react/display-name */
var getTabsNested = function getTabsNested() {
return _react2.default.createElement("div", null, _react2.default.createElement("h2", {
className: "slds-text-heading--large"
}, "Nested Tabs Demo"), _react2.default.createElement(_tabs2.default, {
id: "nested-tabs-demo"
}, _react2.default.createElement(_panel2.default, {
label: "Tab 1"
}, _react2.default.createElement("h2", {
className: "slds-text-heading--medium"
}, "This is my tab 1 contents!"), _react2.default.createElement("p", null, "And they\u2019re ", _react2.default.createElement("a", {
href: "#amazing"
}, "amazing"), ".")), _react2.default.createElement(_panel2.default, {
label: "Tab 2"
}, _react2.default.createElement("h2", {
className: "slds-text-heading--medium"
}, "This is my tab 2 contents!"), _react2.default.createElement("p", null, "And they\u2019re also amazing."), _react2.default.createElement(_input2.default, {
id: "unique-id-123",
name: "left-clickable-icon",
label: "Input Label",
iconLeft: _react2.default.createElement(_inputIcon2.default, {
name: "search",
category: "utility",
onClick: (0, _react3.action)('search icon clicked')
}),
placeholder: "You can tab onto this to focus it."
})), _react2.default.createElement(_panel2.default, {
label: "Tab 3 (has children)"
}, _react2.default.createElement("h2", {
className: "slds-text-heading--medium"
}, "This is my tab 3 contents!"), _react2.default.createElement("p", null, "And they\u2019re tabceptionish."), _react2.default.createElement("div", {
className: "slds-box slds-m-vertical--large"
}, _react2.default.createElement(_tabs2.default, {
defaultSelectedIndex: 0
}, _react2.default.createElement(_panel2.default, {
label: "Tab 1"
}, _react2.default.createElement("h2", {
className: "slds-text-heading--medium"
}, "This is my tab 1 contents!"), _react2.default.createElement("p", null, "And they\u2019re amazing.")), _react2.default.createElement(_panel2.default, {
label: "Tab 2"
}, _react2.default.createElement("h2", {
className: "slds-text-heading--medium"
}, "This is my tab 2 contents!"), _react2.default.createElement("p", null, "And they\u2019re also amazing.")), _react2.default.createElement(_panel2.default, {
label: "Tab 3 (Also has children!)"
}, _react2.default.createElement("h2", {
className: "slds-text-heading--medium"
}, "This is my tab 3 contents!"), _react2.default.createElement("p", null, "And they\u2019re even ", _react2.default.createElement("em", null, "more"), " tabceptionish."), _react2.default.createElement("div", {
className: "slds-box slds-m-vertical--large"
}, _react2.default.createElement(_tabs2.default, {
defaultSelectedIndex: 0
}, _react2.default.createElement(_panel2.default, {
label: "Tab 1 (no children!)"
}, _react2.default.createElement("h2", {
className: "slds-text-heading--medium"
}, "This is my tab 1 contents!"), _react2.default.createElement("p", null, "And they\u2019re amazing."))))))))));
};
/* eslint-enable react/display-name */
/* eslint-disable react/display-name */
var getTabsScoped = function getTabsScoped() {
return _react2.default.createElement("div", null, _react2.default.createElement("h2", {
className: "slds-text-heading--large"
}, "Scoped Tabs Demo"), _react2.default.createElement(_tabs2.default, {
id: "scoped-tabs-demo",
variant: "scoped"
}, _react2.default.createElement(_panel2.default, {
label: "Tab 1"
}, _react2.default.createElement("h2", {
className: "slds-text-heading--medium"
}, "This is my tab 1 contents!"), _react2.default.createElement("p", null, "And they\u2019re amazing."), _react2.default.createElement("p", null, "It\"s awesome."), _react2.default.createElement("p", null, "You can use your ", _react2.default.createElement("var", null, "TAB"), " and ", _react2.default.createElement("var", null, "ARROW"), " keys to navigate around. Try it!"), _react2.default.createElement("p", {
className: "slds-box slds-theme--info slds-m-top--large"
}, "(You might have to hit shift+tab to put the focus onto the tab bar ;)")), _react2.default.createElement(_panel2.default, {
label: "Tab 2"
}, _react2.default.createElement("h2", {
className: "slds-text-heading--medium"
}, "This is my tab 2 contents!"), _react2.default.createElement("p", null, "And they\u2019re also amazing.")), _react2.default.createElement(_panel2.default, {
label: "Tab 3"
}, _react2.default.createElement("h2", {
className: "slds-text-heading--medium"
}, "This is my tab 3 contents!"), _react2.default.createElement("p", null, "And they\u2019re quite spectacular."))));
};
/* eslint-enable react/display-name */
var DemoTabsConditional = (0, _createReactClass2.default)({
displayName: 'DemoTabsConditional',
// ### Prop Types
propTypes: {
/**
* Class names to be added to the container element and is passed along to its children.
*/
className: _propTypes2.default.oneOfType([_propTypes2.default.array, _propTypes2.default.object, _propTypes2.default.string])
},
getInitialState: function getInitialState() {
return {
showA: true,
showB: true,
showC: true,
disableA: false,
disableB: true,
disableC: true
};
},
handleCheckClicked: function handleCheckClicked(checked, event) {
var state = {};
state[event.target.name] = checked;
this.setState(state);
},
handleCheckClickedDisable: function handleCheckClickedDisable(checked, event) {
var state = {};
state[event.target.name] = checked;
this.setState(state);
},
renderPaneA: function renderPaneA(disabled) {
return _react2.default.createElement(_panel2.default, {
label: "Tab A",
disabled: disabled
}, _react2.default.createElement("p", null, "This is tab A."), _react2.default.createElement("div", null, _react2.default.createElement(_checkbox2.default, {
assistiveText: "Disable tab B",
checked: this.state.disableB,
onChange: this.handleCheckClickedDisable,
label: "Disable tab B",
name: "disableB"
}), _react2.default.createElement(_checkbox2.default, {
assistiveText: "Disable tab C",
checked: this.state.disableC,
onChange: this.handleCheckClickedDisable,
label: "Disable tab C",
name: "disableC"
})));
},
render: function render() {
return _react2.default.createElement("div", null, _react2.default.createElement("h2", {
className: "slds-text-heading--large"
}, "Conditional Tabs Demo"), _react2.default.createElement(_checkbox2.default, {
assistiveText: "Show tab A",
checked: this.state.showA,
onChange: this.handleCheckClicked,
label: "Show tab A",
name: "showA"
}), _react2.default.createElement(_checkbox2.default, {
assistiveText: "Show tab B",
checked: this.state.showB,
onChange: this.handleCheckClicked,
label: "Show tab B",
name: "showB"
}), _react2.default.createElement(_checkbox2.default, {
checked: this.state.showC,
onChange: this.handleCheckClicked,
assistiveText: "Show tab C",
label: "Show tab C",
name: "showC"
}), _react2.default.createElement(_tabs2.default, {
className: (0, _classnames2.default)('slds-m-top--large', this.props.className),
onSelect: this.handleSelectNopesOnThree
}, this.state.showA && this.renderPaneA(this.state.disableA), this.state.showB && this.state.disableB ? _react2.default.createElement(_panel2.default, {
label: "Tab B",
disabled: true
}, _react2.default.createElement("p", null, "This is tab B.")) : this.state.showB && _react2.default.createElement(_panel2.default, {
label: "Tab B"
}, _react2.default.createElement("p", null, "This is tab B.")), this.state.showC && this.state.disableC ? _react2.default.createElement(_panel2.default, {
label: "Tab C",
disabled: true
}, _react2.default.createElement("p", null, "This is tab C.")) : this.state.showC && _react2.default.createElement(_panel2.default, {
label: "Tab C"
}, _react2.default.createElement("p", null, "This is tab C."))));
}
});
var DemoTabsOutsideControl = (0, _createReactClass2.default)({
displayName: 'DemoTabsOutsideControl',
// ### Prop Types
propTypes: {
/**
* Class names to be added to the container element and is passed along to its children.
*/
className: _propTypes2.default.oneOfType([_propTypes2.default.array, _propTypes2.default.object, _propTypes2.default.string]),
/**
* The Tab (and corresponding TabPanel) that is selected when the component renders. Defaults to `0`.
*/
whichOneSelectedYo: _propTypes2.default.number,
prevOneSelectedYo: _propTypes2.default.number
},
getInitialState: function getInitialState() {
return {
whichOneSelectedYo: this.props.whichOneSelectedYo || 0,
prevOneSelectedYo: this.props.prevOneSelectedYo || 0
};
},
handleSelect: function handleSelect(index, last) {
var toReturn = true;
if (index === this.state.whichOneSelectedYo && last === this.state.prevOneSelectedYo) {
toReturn = false;
} else {
(0, _react3.action)('handleSelect')(index, last);
this.setState({
whichOneSelectedYo: index,
prevOneSelectedYo: last
});
}
return toReturn;
},
showState: function showState() {
(0, _react3.action)('showState (current)')(this.state.whichOneSelectedYo);
(0, _react3.action)('showState (previous)')(this.state.prevOneSelectedYo);
},
handleButtonClicked: function handleButtonClicked(event) {
var prevOneSelected = this.state.prevOneSelectedYo;
var thisOneSelected = this.state.whichOneSelectedYo;
(0, _react3.action)('handleButtonClicked')(event.currentTarget.id);
switch (event.currentTarget.id) {
case 'monday':
this.handleSelect(0, thisOneSelected);
break;
case 'tuesday':
this.handleSelect(1, thisOneSelected);
break;
case 'tuesday-alt':
this.handleSelect(1, thisOneSelected);
break;
case 'wednesday':
this.handleSelect(2, thisOneSelected);
break;
case 'thursday':
this.handleSelect(3, thisOneSelected);
break;
case 'friday':
this.handleSelect(4, thisOneSelected);
break;
case 'none':
this.handleSelect(undefined, thisOneSelected);
break;
case 'previous':
this.handleSelect(prevOneSelected, thisOneSelected);
break;
case 'show-state':
this.showState();
break;
default:
// Statements executed when none of the values match the value of the expression
this.handleSelect(thisOneSelected, prevOneSelected);
}
},
render: function render() {
return _react2.default.createElement("div", null, _react2.default.createElement("h2", {
className: "slds-text-heading--large"
}, "Outside Tabs Demo"), _react2.default.createElement("p", null, "Here we have several buttons, which are used to pass a new", ' ', _react2.default.createElement("code", null, "selectedIndex"), " into the Tabs component."), _react2.default.createElement("p", {
className: "slds-m-bottom--large"
}, "This shows that you can pass a new selected index property into the component from the outside and have it re-render."), _react2.default.createElement(_button2.default, {
id: "show-state",
label: "Show State",
onClick: this.showState
}), _react2.default.createElement(_button2.default, {
id: "monday",
label: "Monday",
onClick: this.handleButtonClicked
}), _react2.default.createElement(_button2.default, {
id: "tuesday",
label: "Tuesday",
onClick: this.handleButtonClicked
}), _react2.default.createElement(_button2.default, {
id: "wednesday",
label: "Wednesday",
onClick: this.handleButtonClicked
}), _react2.default.createElement(_button2.default, {
id: "thursday",
label: "Thursday",
onClick: this.handleButtonClicked
}), _react2.default.createElement(_button2.default, {
id: "friday",
label: "Friday",
onClick: this.handleButtonClicked
}), _react2.default.createElement(_button2.default, {
id: "none",
label: "None",
onClick: this.handleButtonClicked
}), _react2.default.createElement(_button2.default, {
id: "previous",
label: "Previous",
onClick: this.handleButtonClicked
}), _react2.default.createElement(_tabs2.default, {
className: (0, _classnames2.default)('slds-m-top--large', this.props.className),
selectedIndex: this.state.whichOneSelectedYo,
onSelect: this.handleSelect
}, _react2.default.createElement(_panel2.default, {
label: "Monday"
}, _react2.default.createElement("p", null, "This is Monday\"s Pane."), _react2.default.createElement(_button2.default, {
id: "tuesday-alt",
label: "Submit and go to next tab",
onClick: this.handleButtonClicked
})), _react2.default.createElement(_panel2.default, {
label: "Tuesday"
}, _react2.default.createElement("p", null, "This is Tuesday\"s Pane.")), _react2.default.createElement(_panel2.default, {
label: "Wednesday"
}, _react2.default.createElement("p", null, "This is Wednesday\"s Pane.")), _react2.default.createElement(_panel2.default, {
label: "Thursday"
}, _react2.default.createElement("p", null, "Thursday\"s Pane has far to go.")), _react2.default.createElement(_panel2.default, {
label: "Friday"
}, _react2.default.createElement("p", null, "This is Friday\"s Pane."))));
}
});
/* eslint-disable react/display-name */
var getTabsDisabled = function getTabsDisabled() {
return _react2.default.createElement("div", null, _react2.default.createElement("h2", {
className: "slds-text-heading--large"
}, "Disabled Tabs Demo"), _react2.default.createElement(_tabs2.default, {
id: "disabled-tabs-demo"
}, _react2.default.createElement(_panel2.default, {
label: "Tab 1"
}, _react2.default.createElement("h2", {
className: "slds-text-heading--medium"
}, "This is my tab 1 contents!"), _react2.default.createElement("p", null, "And they\u2019re amazing."), _react2.default.createElement("p", null, "It\"s awesome."), _react2.default.createElement("p", null, "You can use your ", _react2.default.createElement("var", null, "TAB"), " and ", _react2.default.createElement("var", null, "ARROW"), " keys to navigate around. Try it!"), _react2.default.createElement("p", {
className: "slds-box slds-theme--info slds-m-top--large"
}, "(You might have to hit shift+tab to put the focus onto the tab bar ;)")), _react2.default.createElement(_panel2.default, {
label: "Tab 2",
disabled: true
}, _react2.default.createElement("h2", {
className: "slds-text-heading--medium"
}, "This is my tab 2 contents!"), _react2.default.createElement("p", null, "And they\u2019re also amazing.")), _react2.default.createElement(_panel2.default, {
label: "Tab 3"
}, _react2.default.createElement("h2", {
className: "slds-text-heading--medium"
}, "This is my tab 3 contents!"), _react2.default.createElement("p", null, "And they\u2019re quite spectacular.")), _react2.default.createElement(_panel2.default, {
label: "Tab 4"
}, _react2.default.createElement("h2", {
className: "slds-text-heading--medium"
}, "This is my tab 3 contents!"), _react2.default.createElement("p", null, "Note that using your arrow keys you can loop ", _react2.default.createElement("em", null, "around the tabs"), "! \uD83C\uDF89"))));
};
/* eslint-enable react/display-name */
/* eslint-disable react/display-name */
var getCustomContentTabs = function getCustomContentTabs() {
var tab1Label = _react2.default.createElement("div", {
"aria-label": "test accessibility!"
}, _react2.default.createElement(_icon2.default, {
assistiveText: "",
category: "utility",
name: "list",
style: {
marginRight: '.5rem'
},
size: "x-small"
}), _react2.default.createElement("span", null, "my tab"));
var tab2Label = _react2.default.createElement("span", {
style: {
color: 'red'
}
}, "my other tab");
return _react2.default.createElement("div", null, _react2.default.createElement("h2", {
className: "slds-text-heading--large"
}, "Custom Tab Contents Demo"), _react2.default.createElement(_tabs2.default, null, _react2.default.createElement(_panel2.default, {
label: tab1Label
}, _react2.default.createElement("h2", {
className: "slds-text-heading--medium"
}, "This is my first custom content tab!")), _react2.default.createElement(_panel2.default, {
label: tab2Label
}, _react2.default.createElement("h2", {
className: "slds-text-heading--medium"
}, "This is my second custom content tab!"))));
};
/* eslint-enable react/display-name */
var DemoTabsInterceptSelect = (0, _createReactClass2.default)({
displayName: 'DemoTabsInterceptSelect',
getInitialState: function getInitialState() {
return {
intercepts: 0
};
},
handleTabSelect: function handleTabSelect(next, last) {
(0, _react3.action)('handleTabSelect')(next, last);
var intercepts = this.state.intercepts + 1;
this.setState({
intercepts: intercepts
});
return false;
},
render: function render() {
return _react2.default.createElement("div", null, _react2.default.createElement(_tabs2.default, {
onSelect: this.handleTabSelect
}, _react2.default.createElement(_panel2.default, {
label: "Panel with intercept"
}, _react2.default.createElement("p", null, "Default Panel"), this.state.intercepts > 0 && _react2.default.createElement("p", null, "We've intercepted navigation ".concat(this.state.intercepts, " time(s)"))), _react2.default.createElement(_panel2.default, {
label: "Unreachable panel"
}, _react2.default.createElement("p", null, "You should never see this message"))), _react2.default.createElement("div", {
style: {
height: '20px'
}
}), _react2.default.createElement(_tabs2.default, null, _react2.default.createElement(_panel2.default, {
label: "Panel still working as intended"
}, _react2.default.createElement("p", null, "Default Panel")), _react2.default.createElement(_panel2.default, {
label: "Destination panel"
}, _react2.default.createElement("p", null, "You should be able to reach this panel"))));
}
});
(0, _react3.storiesOf)(_constants.TABS, module).addDecorator(function (getStory) {
return _react2.default.createElement("div", {
className: "slds-p-around--medium"
}, _react2.default.createElement(_iconSettings2.default, {
iconPath: "/assets/icons"
}, getStory()));
}).add('Base', function () {
return getTabs();
}).add('With disabled tab', function () {
return getTabsDisabled();
}).add('Nested', function () {
return getTabsNested();
}).add('Outside Control', function () {
return _react2.default.createElement(DemoTabsOutsideControl, {
className: "controlled-yo"
});
}).add('Conditional', function () {
return _react2.default.createElement(DemoTabsConditional, {
className: "conditional-yo"
});
}).add('Unique Generated IDs', function () {
return getTabsMoreThanOneAllowGeneratedID();
}).add('Scoped', function () {
return getTabsScoped();
}).add('Custom Tab Contents', function () {
return getCustomContentTabs();
}).add('Tab Intercept Panel Select', function () {
return _react2.default.createElement(DemoTabsInterceptSelect, null);
});