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

154 lines
6.5 KiB
React
Raw Normal View History

import React from 'react';
import PropTypes from 'prop-types';
2020-02-27 23:12:49 +01:00
import { debounce } from 'debounce';
import { Link } from 'react-router-dom';
2017-08-28 21:40:44 +02:00
import { Icon, FABButton, Textfield, Menu, MenuItem, Card, CardActions, List } from 'react-mdl';
import Feature from './feature-list-item-component';
2017-08-28 21:40:44 +02:00
import { MenuItemWithIcon, DropdownButton, styles as commonStyles } from '../common';
2016-12-04 11:56:41 +01:00
import styles from './feature.scss';
import { CREATE_FEATURE } from '../../permissions';
2016-11-10 14:26:24 +01:00
export default class FeatureListComponent extends React.Component {
static propTypes = {
features: PropTypes.array.isRequired,
featureMetrics: PropTypes.object.isRequired,
fetchFeatureToggles: PropTypes.func,
fetchArchive: PropTypes.func,
revive: PropTypes.func,
updateSetting: PropTypes.func.isRequired,
2018-03-03 21:34:38 +01:00
toggleFeature: PropTypes.func,
settings: PropTypes.object,
history: PropTypes.object.isRequired,
hasPermission: PropTypes.func.isRequired,
};
2016-11-10 14:26:24 +01:00
constructor(props) {
super();
this.state = {
filter: props.settings.filter,
2020-02-27 23:12:49 +01:00
updateFilter: debounce(props.updateSetting.bind(this, 'filter'), 250),
};
}
componentDidMount() {
if (this.props.fetchFeatureToggles) {
this.props.fetchFeatureToggles();
} else {
this.props.fetchArchive();
}
2016-11-10 14:26:24 +01:00
}
toggleMetrics() {
2017-08-28 21:40:44 +02:00
this.props.updateSetting('showLastHour', !this.props.settings.showLastHour);
2016-12-04 11:56:41 +01:00
}
setFilter(v) {
const value = typeof v === 'string' ? v : '';
2020-02-27 23:12:49 +01:00
this.setState({ filter: value });
this.state.updateFilter(value);
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, revive, hasPermission } = this.props;
features.forEach(e => {
e.reviveName = e.name;
});
return (
<div>
<div className={styles.toolbar}>
<Textfield
floatingLabel
value={this.state.filter}
onChange={e => {
this.setFilter(e.target.value);
}}
label="Search"
style={{ width: '100%' }}
/>
{hasPermission(CREATE_FEATURE) ? (
<Link to="/features/create" className={styles.toolbarButton}>
<FABButton accent title="Create feature toggle">
<Icon name="add" />
</FABButton>
</Link>
) : (
''
)}
</div>
2017-08-28 21:40:44 +02:00
<Card shadow={0} className={commonStyles.fullwidth} style={{ overflow: 'visible' }}>
<CardActions>
2017-08-28 21:40:44 +02:00
<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>
2017-08-28 21:40:44 +02:00
<DropdownButton id="sorting" label={`By ${settings.sort}`} />
<Menu
target="sorting"
2017-08-28 21:40:44 +02:00
onClick={e => this.setSort(e.target.getAttribute('data-target'))}
style={{ width: '168px' }}
>
2017-08-28 21:40:44 +02:00
<MenuItem disabled={settings.sort === 'name'} data-target="name">
Name
</MenuItem>
2020-08-05 21:36:28 +02:00
<MenuItem disabled={settings.sort === 'type'} data-target="type">
Type
</MenuItem>
2017-08-28 21:40:44 +02:00
<MenuItem disabled={settings.sort === 'enabled'} data-target="enabled">
Enabled
</MenuItem>
2020-08-07 10:12:05 +02:00
<MenuItem disabled={settings.sort === 'stale'} data-target="stale">
Stale
</MenuItem>
2017-08-28 21:40:44 +02:00
<MenuItem disabled={settings.sort === 'created'} data-target="created">
Created
</MenuItem>
2017-08-28 21:40:44 +02:00
<MenuItem disabled={settings.sort === 'strategies'} data-target="strategies">
Strategies
</MenuItem>
2017-08-28 21:40:44 +02:00
<MenuItem disabled={settings.sort === 'metrics'} data-target="metrics">
Metrics
</MenuItem>
</Menu>
</CardActions>
<hr />
<List>
2019-05-04 06:19:21 +02:00
{features.length > 0 ? (
features.map((feature, i) => (
<Feature
key={i}
settings={settings}
metricsLastHour={featureMetrics.lastHour[feature.name]}
metricsLastMinute={featureMetrics.lastMinute[feature.name]}
feature={feature}
toggleFeature={toggleFeature}
revive={revive}
hasPermission={hasPermission}
/>
))
) : (
2019-05-04 06:26:02 +02:00
<p style={{ textAlign: 'center', marginTop: '50px', color: 'gray' }}>
Empty list of feature toggles
</p>
2019-05-04 06:19:21 +02:00
)}
</List>
</Card>
</div>
2016-11-10 14:26:24 +01:00
);
}
}