1
0
mirror of https://github.com/Unleash/unleash.git synced 2024-10-18 20:09:08 +02:00
unleash.unleash/frontend/src/component/feature/list-component.jsx

188 lines
6.4 KiB
React
Raw Normal View History

2016-11-10 14:26:24 +01:00
import React, { PropTypes } from 'react';
2016-12-05 12:57:21 +01:00
import Feature from './feature-list-item-component';
2016-11-15 21:52:46 +01:00
import { Link } from 'react-router';
import {
Icon,
FABButton,
Textfield,
Menu,
MenuItem,
Card,
CardActions,
List,
} from 'react-mdl';
2016-12-04 11:56:41 +01:00
import {
MenuItemWithIcon,
DropdownButton,
styles as commonStyles,
} from '../common';
2016-12-04 11:56:41 +01:00
import styles from './feature.scss';
2016-11-10 14:26:24 +01:00
2016-11-26 10:01:48 +01:00
export default class FeatureListComponent extends React.PureComponent {
static propTypes = {
features: PropTypes.array.isRequired,
featureMetrics: PropTypes.object.isRequired,
fetchFeatureToggles: PropTypes.func.isRequired,
fetchFeatureMetrics: PropTypes.func.isRequired,
updateSetting: PropTypes.func.isRequired,
settings: React.PropTypes.object,
};
2016-11-10 14:26:24 +01:00
static contextTypes = {
router: React.PropTypes.object,
};
2016-11-10 14:26:24 +01:00
componentDidMount() {
2016-11-10 14:26:24 +01:00
this.props.fetchFeatureToggles();
this.props.fetchFeatureMetrics();
this.timer = setInterval(() => {
this.props.fetchFeatureMetrics();
}, 5000);
}
componentWillUnmount() {
2016-11-10 14:26:24 +01:00
clearInterval(this.timer);
}
toggleMetrics() {
this.props.updateSetting(
'showLastHour',
!this.props.settings.showLastHour
);
2016-12-04 11:56:41 +01:00
}
setFilter(v) {
this.props.updateSetting('filter', typeof v === 'string' ? v : '');
2016-12-04 11:56:41 +01:00
}
setSort(v) {
2016-12-04 11:56:41 +01:00
this.props.updateSetting('sort', typeof v === 'string' ? v.trim() : '');
}
render() {
const {
features,
toggleFeature,
featureMetrics,
settings,
} = this.props;
2016-11-10 14:26:24 +01:00
return (
<div>
<div className={styles.toolbar}>
<Textfield
floatingLabel
value={settings.filter}
onChange={e => {
this.setFilter(e.target.value);
}}
label="Search"
style={{ width: '100%' }}
/>
<Link
to="/features/create"
className={styles.toolbarButton}
>
<FABButton accent title="Create feature toggle">
<Icon name="add" />
</FABButton>
</Link>
</div>
<Card
shadow={0}
className={commonStyles.fullwidth}
style={{ overflow: 'visible' }}
>
<CardActions>
<DropdownButton
id="metric"
label={`Last ${settings.showLastHour
? 'hour'
: 'minute'}`}
/>
<Menu
target="metric"
onClick={() => this.toggleMetrics()}
style={{ width: '168px' }}
>
<MenuItemWithIcon
icon="hourglass_empty"
disabled={!settings.showLastHour}
data-target="minute"
label="Last minute"
/>
<MenuItemWithIcon
icon="hourglass_full"
disabled={settings.showLastHour}
data-target="hour"
label="Last hour"
/>
</Menu>
<DropdownButton
id="sorting"
label={`By ${settings.sort}`}
/>
<Menu
target="sorting"
onClick={e =>
this.setSort(
e.target.getAttribute('data-target')
)}
style={{ width: '168px' }}
>
<MenuItem
disabled={settings.sort === 'name'}
data-target="name"
>
Name
</MenuItem>
<MenuItem
disabled={settings.sort === 'enabled'}
data-target="enabled"
>
Enabled
</MenuItem>
<MenuItem
disabled={settings.sort === 'created'}
data-target="created"
>
Created
</MenuItem>
<MenuItem
disabled={settings.sort === 'strategies'}
data-target="strategies"
>
Strategies
</MenuItem>
<MenuItem
disabled={settings.sort === 'metrics'}
data-target="metrics"
>
Metrics
</MenuItem>
</Menu>
</CardActions>
<hr />
<List>
{features.map((feature, i) => (
<Feature
key={i}
settings={settings}
metricsLastHour={
featureMetrics.lastHour[feature.name]
}
metricsLastMinute={
featureMetrics.lastMinute[feature.name]
}
feature={feature}
toggleFeature={toggleFeature}
/>
))}
</List>
</Card>
</div>
2016-11-10 14:26:24 +01:00
);
}
}