list item ui component
This commit is contained in:
parent
73240d9165
commit
83d5350c81
18
ui/src/components/list/collapsed.js
Normal file
18
ui/src/components/list/collapsed.js
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
const React = require('react');
|
||||||
|
|
||||||
|
module.exports = (Component) => (props) => {
|
||||||
|
// eslint-disable-next-line react/prop-types
|
||||||
|
const _children = React.Children.map(props.children, (c) => {
|
||||||
|
return React.cloneElement(c, {
|
||||||
|
...c.props,
|
||||||
|
// eslint-disable-next-line react/prop-types
|
||||||
|
collapsed: props.collapsed
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Component {...props}>
|
||||||
|
{_children}
|
||||||
|
</Component>
|
||||||
|
);
|
||||||
|
};
|
43
ui/src/components/list/description.js
Normal file
43
ui/src/components/list/description.js
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
const Title = require('./title');
|
||||||
|
const Styled = require('styled-components');
|
||||||
|
const React = require('react');
|
||||||
|
|
||||||
|
const {
|
||||||
|
default: styled
|
||||||
|
} = Styled;
|
||||||
|
|
||||||
|
const margin = (props) => props.collapsed ? `
|
||||||
|
margin-left: auto;
|
||||||
|
` : '';
|
||||||
|
|
||||||
|
const justify = (props) => props.collapsed ? 'flex-end' : 'flex-start';
|
||||||
|
const xs = (props) => props.collapsed ? 6 : 12;
|
||||||
|
|
||||||
|
const StyledTitle = styled(Title)`
|
||||||
|
font-weight: normal !important;
|
||||||
|
flex-grow: 2;
|
||||||
|
`;
|
||||||
|
|
||||||
|
const InnerDescription = styled.div`
|
||||||
|
${margin}
|
||||||
|
justify-content: ${justify};
|
||||||
|
`;
|
||||||
|
|
||||||
|
const Description = (props) => (
|
||||||
|
<StyledTitle
|
||||||
|
collapsed={props.collapsed}
|
||||||
|
name='list-item-description'
|
||||||
|
xs={xs(props)}
|
||||||
|
>
|
||||||
|
<InnerDescription collapsed={props.collapsed}>
|
||||||
|
{props.children}
|
||||||
|
</InnerDescription>
|
||||||
|
</StyledTitle>
|
||||||
|
);
|
||||||
|
|
||||||
|
Description.propTypes = {
|
||||||
|
children: React.PropTypes.node,
|
||||||
|
collapsed: React.PropTypes.bool
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = Description;
|
10
ui/src/components/list/index.js
Normal file
10
ui/src/components/list/index.js
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
module.exports = {
|
||||||
|
ListItem: require('./item'),
|
||||||
|
ListItemView: require('./view'),
|
||||||
|
ListItemTitle: require('./title'),
|
||||||
|
ListItemSubTitle: require('./subtitle'),
|
||||||
|
ListItemDescription: require('./description'),
|
||||||
|
ListItemMeta: require('./meta'),
|
||||||
|
ListItemOutlet: require('./outlet'),
|
||||||
|
ListItemOptions: require('./options')
|
||||||
|
};
|
34
ui/src/components/list/item.js
Normal file
34
ui/src/components/list/item.js
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
const Collapsed = require('./collapsed');
|
||||||
|
const constants = require('../../shared/constants');
|
||||||
|
const fns = require('../../shared/functions');
|
||||||
|
const React = require('react');
|
||||||
|
const Row = require('../row');
|
||||||
|
const Styled = require('styled-components');
|
||||||
|
|
||||||
|
const {
|
||||||
|
boxes,
|
||||||
|
colors
|
||||||
|
} = constants;
|
||||||
|
|
||||||
|
const {
|
||||||
|
remcalc
|
||||||
|
} = fns;
|
||||||
|
|
||||||
|
const {
|
||||||
|
default: styled
|
||||||
|
} = Styled;
|
||||||
|
|
||||||
|
const height = (props) => props.collapsed ? remcalc(48) : remcalc(126);
|
||||||
|
|
||||||
|
const Item = styled(Row)`
|
||||||
|
height: ${height}
|
||||||
|
box-shadow: ${boxes.bottomShaddow};
|
||||||
|
border: 1px solid ${colors.borderSecondary};
|
||||||
|
background-color: ${colors.brandSecondary};
|
||||||
|
`;
|
||||||
|
|
||||||
|
module.exports = Collapsed((props) => (
|
||||||
|
<Item name='list-item' {...props}>
|
||||||
|
{props.children}
|
||||||
|
</Item>
|
||||||
|
));
|
27
ui/src/components/list/meta.js
Normal file
27
ui/src/components/list/meta.js
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
const Collapsed = require('./collapsed');
|
||||||
|
const Column = require('../column');
|
||||||
|
const Styled = require('styled-components');
|
||||||
|
const React = require('react');
|
||||||
|
const Row = require('../row');
|
||||||
|
|
||||||
|
const {
|
||||||
|
default: styled
|
||||||
|
} = Styled;
|
||||||
|
|
||||||
|
const xs = (props) => props.collapsed ? 12 : 6;
|
||||||
|
|
||||||
|
const InnerRow = styled(Row)`
|
||||||
|
height: 100%;
|
||||||
|
`;
|
||||||
|
|
||||||
|
module.exports = Collapsed((props) => (
|
||||||
|
<Column
|
||||||
|
name='list-item-meta'
|
||||||
|
xs={xs(props)}
|
||||||
|
{...props}
|
||||||
|
>
|
||||||
|
<InnerRow>
|
||||||
|
{props.children}
|
||||||
|
</InnerRow>
|
||||||
|
</Column>
|
||||||
|
));
|
63
ui/src/components/list/options.js
Normal file
63
ui/src/components/list/options.js
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
const Button = require('../button');
|
||||||
|
const constants = require('../../shared/constants');
|
||||||
|
const fns = require('../../shared/functions');
|
||||||
|
const React = require('react');
|
||||||
|
const Styled = require('styled-components');
|
||||||
|
|
||||||
|
const {
|
||||||
|
colors
|
||||||
|
} = constants;
|
||||||
|
|
||||||
|
const {
|
||||||
|
remcalc
|
||||||
|
} = fns;
|
||||||
|
|
||||||
|
const {
|
||||||
|
default: styled
|
||||||
|
} = Styled;
|
||||||
|
|
||||||
|
const height = (props) => props.collapsed ? remcalc(46) : remcalc(124);
|
||||||
|
|
||||||
|
const Nav = styled.nav`
|
||||||
|
flex: 0 0 ${remcalc(47)};
|
||||||
|
border-left: 1px solid ${colors.borderSecondary};
|
||||||
|
`;
|
||||||
|
|
||||||
|
const StyledButton = styled(Button)`
|
||||||
|
border-width: 0;
|
||||||
|
box-shadow: none;
|
||||||
|
width: 100%;
|
||||||
|
height: ${height}; /* 100% doest work on safari */
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
border-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
border-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active,
|
||||||
|
&:active:hover,
|
||||||
|
&:active:focus {
|
||||||
|
border-width: 0;
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
const Options = (props) => (
|
||||||
|
<Nav name='list-item-options'>
|
||||||
|
<StyledButton
|
||||||
|
rect
|
||||||
|
secondary
|
||||||
|
{...props}
|
||||||
|
>
|
||||||
|
{props.children}
|
||||||
|
</StyledButton>
|
||||||
|
</Nav>
|
||||||
|
);
|
||||||
|
|
||||||
|
Options.propTypes = {
|
||||||
|
children: React.PropTypes.node
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = Options;
|
25
ui/src/components/list/outlet.js
Normal file
25
ui/src/components/list/outlet.js
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
const Column = require('../column');
|
||||||
|
const React = require('react');
|
||||||
|
|
||||||
|
const Outlet = (props) => {
|
||||||
|
if (props.collapsed) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Column
|
||||||
|
name='list-item-outlet'
|
||||||
|
xs={6}
|
||||||
|
{...props}
|
||||||
|
>
|
||||||
|
{props.children}
|
||||||
|
</Column>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
Outlet.propTypes = {
|
||||||
|
children: React.PropTypes.node,
|
||||||
|
collapsed: React.PropTypes.bool
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = Outlet;
|
33
ui/src/components/list/subtitle.js
Normal file
33
ui/src/components/list/subtitle.js
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
const Title = require('./title');
|
||||||
|
const React = require('react');
|
||||||
|
const Styled = require('styled-components');
|
||||||
|
|
||||||
|
const {
|
||||||
|
default: styled
|
||||||
|
} = Styled;
|
||||||
|
|
||||||
|
const Span = styled.span`
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: flex-start;
|
||||||
|
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: normal;
|
||||||
|
font-stretch: normal;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #646464;
|
||||||
|
`;
|
||||||
|
|
||||||
|
const Subtitle = (props) => (
|
||||||
|
<Title name='list-item-subtitle' {...props}>
|
||||||
|
<Span>
|
||||||
|
{props.children}
|
||||||
|
</Span>
|
||||||
|
</Title>
|
||||||
|
);
|
||||||
|
|
||||||
|
Subtitle.propTypes = {
|
||||||
|
children: React.PropTypes.node
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = Subtitle;
|
70
ui/src/components/list/title.js
Normal file
70
ui/src/components/list/title.js
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
const constants = require('../../shared/constants');
|
||||||
|
const fns = require('../../shared/functions');
|
||||||
|
const isString = require('lodash.isstring');
|
||||||
|
const Styled = require('styled-components');
|
||||||
|
const React = require('react');
|
||||||
|
|
||||||
|
const {
|
||||||
|
colors
|
||||||
|
} = constants;
|
||||||
|
|
||||||
|
const {
|
||||||
|
remcalc
|
||||||
|
} = fns;
|
||||||
|
|
||||||
|
const {
|
||||||
|
default: styled
|
||||||
|
} = Styled;
|
||||||
|
|
||||||
|
const justify = (props) => props.collapsed ? 'center' : 'flex-start';
|
||||||
|
const width = (props) => props.collapsed ? 'auto' : '100%';
|
||||||
|
const direction = (props) => props.collapsed ? 'column' : 'row';
|
||||||
|
const grow = (props) => props.collapsed ? 0 : 2;
|
||||||
|
const xs = (props) => props.collapsed ? 6 : 12;
|
||||||
|
|
||||||
|
const Container = styled.div`
|
||||||
|
font-size: ${remcalc(16)};
|
||||||
|
font-weight: 600;
|
||||||
|
line-height: 1.5;
|
||||||
|
color: ${colors.brandSecondaryColor};
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
flex-direction: ${direction};
|
||||||
|
justify-content: ${justify};
|
||||||
|
|
||||||
|
flex-grow: ${grow};
|
||||||
|
width: ${width};
|
||||||
|
|
||||||
|
padding-left: 0.5rem;
|
||||||
|
padding-right: 0.5rem;
|
||||||
|
`;
|
||||||
|
|
||||||
|
const Span = styled.span`
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
`;
|
||||||
|
|
||||||
|
const Title = (props) => {
|
||||||
|
const _children = !isString(props.children) ? props.children : (
|
||||||
|
<Span>{props.children}</Span>
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Container
|
||||||
|
collapsed={props.collapsed}
|
||||||
|
name='list-item-title'
|
||||||
|
xs={xs(props)}
|
||||||
|
{...props}
|
||||||
|
>
|
||||||
|
{_children}
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
Title.propTypes = {
|
||||||
|
children: React.PropTypes.node,
|
||||||
|
collapsed: React.PropTypes.bool
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = Title;
|
20
ui/src/components/list/view.js
Normal file
20
ui/src/components/list/view.js
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
const Collapsed = require('./collapsed');
|
||||||
|
const React = require('react');
|
||||||
|
const Row = require('../row');
|
||||||
|
const Styled = require('styled-components');
|
||||||
|
|
||||||
|
const {
|
||||||
|
default: styled
|
||||||
|
} = Styled;
|
||||||
|
|
||||||
|
const View = styled(Row)`
|
||||||
|
flex: 1;
|
||||||
|
margin: 0;
|
||||||
|
height: 100%;
|
||||||
|
`;
|
||||||
|
|
||||||
|
module.exports = Collapsed((props) => (
|
||||||
|
<View name='list-item-view' {...props}>
|
||||||
|
{props.children}
|
||||||
|
</View>
|
||||||
|
));
|
@ -12,7 +12,7 @@ const Item = require('./item');
|
|||||||
const find = require('lodash.find');
|
const find = require('lodash.find');
|
||||||
const classNames = require('classnames');
|
const classNames = require('classnames');
|
||||||
const React = require('react');
|
const React = require('react');
|
||||||
const styles = require('./style.css');
|
// const styles = require('./style.css');
|
||||||
|
|
||||||
const RadioGroup = React.createClass({
|
const RadioGroup = React.createClass({
|
||||||
propTypes: {
|
propTypes: {
|
||||||
@ -93,8 +93,7 @@ const RadioGroup = React.createClass({
|
|||||||
} = this;
|
} = this;
|
||||||
|
|
||||||
const cn = classNames(
|
const cn = classNames(
|
||||||
className,
|
className
|
||||||
styles.group
|
|
||||||
);
|
);
|
||||||
|
|
||||||
const _children = React.Children.map(children, (child, i) => {
|
const _children = React.Children.map(children, (child, i) => {
|
||||||
|
@ -6,6 +6,7 @@ module.exports = {
|
|||||||
Column: require('./components/column'),
|
Column: require('./components/column'),
|
||||||
Container: require('./components/container'),
|
Container: require('./components/container'),
|
||||||
Input: require('./components/input'),
|
Input: require('./components/input'),
|
||||||
|
List: require('./components/list'),
|
||||||
Modal: require('./components/modal'),
|
Modal: require('./components/modal'),
|
||||||
MiniMetric: require('./components/mini-metric'),
|
MiniMetric: require('./components/mini-metric'),
|
||||||
Notificaton: require('./components/notification'),
|
Notificaton: require('./components/notification'),
|
||||||
|
@ -14,6 +14,16 @@ const {
|
|||||||
Column,
|
Column,
|
||||||
Avatar,
|
Avatar,
|
||||||
Input,
|
Input,
|
||||||
|
List: {
|
||||||
|
ListItem,
|
||||||
|
ListItemView,
|
||||||
|
ListItemTitle,
|
||||||
|
ListItemSubTitle,
|
||||||
|
ListItemDescription,
|
||||||
|
ListItemMeta,
|
||||||
|
ListItemOutlet,
|
||||||
|
ListItemOptions,
|
||||||
|
},
|
||||||
MiniMetric,
|
MiniMetric,
|
||||||
Modal,
|
Modal,
|
||||||
Notificaton,
|
Notificaton,
|
||||||
@ -30,6 +40,8 @@ const {
|
|||||||
RadioGroup
|
RadioGroup
|
||||||
} = require('../src/');
|
} = require('../src/');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const seed = require('./seed');
|
const seed = require('./seed');
|
||||||
const {
|
const {
|
||||||
selectData
|
selectData
|
||||||
@ -471,3 +483,43 @@ storiesOf('Metrics', module)
|
|||||||
name='Memory'
|
name='Memory'
|
||||||
/>
|
/>
|
||||||
));
|
));
|
||||||
|
|
||||||
|
storiesOf('ListItem', module)
|
||||||
|
.add('default', () => (
|
||||||
|
<Base>
|
||||||
|
<ListItem>
|
||||||
|
<ListItemView>
|
||||||
|
<ListItemMeta>
|
||||||
|
<ListItemTitle>Nginx 01</ListItemTitle>
|
||||||
|
<ListItemSubTitle>4 instances</ListItemSubTitle>
|
||||||
|
<ListItemDescription>Flags</ListItemDescription>
|
||||||
|
</ListItemMeta>
|
||||||
|
<ListItemOutlet>
|
||||||
|
Metrics
|
||||||
|
</ListItemOutlet>
|
||||||
|
</ListItemView>
|
||||||
|
<ListItemOptions>
|
||||||
|
…
|
||||||
|
</ListItemOptions>
|
||||||
|
</ListItem>
|
||||||
|
</Base>
|
||||||
|
))
|
||||||
|
.add('collapsed', () => (
|
||||||
|
<Base>
|
||||||
|
<ListItem collapsed>
|
||||||
|
<ListItemView>
|
||||||
|
<ListItemMeta>
|
||||||
|
<ListItemTitle>Nginx 01</ListItemTitle>
|
||||||
|
<ListItemSubTitle>4 instances</ListItemSubTitle>
|
||||||
|
<ListItemDescription>Flags</ListItemDescription>
|
||||||
|
</ListItemMeta>
|
||||||
|
<ListItemOutlet>
|
||||||
|
Metrics
|
||||||
|
</ListItemOutlet>
|
||||||
|
</ListItemView>
|
||||||
|
<ListItemOptions>
|
||||||
|
…
|
||||||
|
</ListItemOptions>
|
||||||
|
</ListItem>
|
||||||
|
</Base>
|
||||||
|
));
|
||||||
|
Loading…
Reference in New Issue
Block a user