2016-11-10 14:26:24 +01:00
|
|
|
import { connect } from 'react-redux';
|
2017-08-28 21:40:44 +02:00
|
|
|
import { toggleFeature, fetchFeatureToggles } from '../../store/feature-actions';
|
2016-12-04 11:56:41 +01:00
|
|
|
import { updateSettingForGroup } from '../../store/settings/actions';
|
|
|
|
|
2016-11-10 14:26:24 +01:00
|
|
|
import FeatureListComponent from './list-component';
|
|
|
|
|
2018-03-14 11:23:13 +01:00
|
|
|
export const mapStateToPropsConfigurable = isFeature => state => {
|
2016-12-04 11:56:41 +01:00
|
|
|
const featureMetrics = state.featureMetrics.toJS();
|
|
|
|
const settings = state.settings.toJS().feature || {};
|
2018-03-14 11:23:13 +01:00
|
|
|
let features = isFeature ? state.features.toJS() : state.archive.get('list').toArray();
|
2016-12-04 11:56:41 +01:00
|
|
|
if (settings.filter) {
|
2018-01-20 14:01:47 +01:00
|
|
|
try {
|
|
|
|
const regex = new RegExp(settings.filter, 'i');
|
|
|
|
features = features.filter(
|
|
|
|
feature =>
|
|
|
|
regex.test(feature.name) ||
|
|
|
|
regex.test(feature.description) ||
|
|
|
|
feature.strategies.some(s => s && s.name && regex.test(s.name))
|
|
|
|
);
|
|
|
|
} catch (e) {
|
|
|
|
// Invalid filter regex
|
|
|
|
}
|
2016-12-04 11:56:41 +01:00
|
|
|
}
|
|
|
|
|
2017-02-14 11:05:34 +01:00
|
|
|
if (!settings.sort) {
|
|
|
|
settings.sort = 'name';
|
|
|
|
}
|
|
|
|
|
|
|
|
if (settings.sort === 'enabled') {
|
2017-08-28 19:15:47 +02:00
|
|
|
features = features.sort(
|
|
|
|
(a, b) =>
|
|
|
|
// eslint-disable-next-line
|
2017-02-14 11:05:34 +01:00
|
|
|
a.enabled === b.enabled ? 0 : a.enabled ? -1 : 1
|
2017-08-28 19:15:47 +02:00
|
|
|
);
|
2017-02-14 11:05:34 +01:00
|
|
|
} else if (settings.sort === 'created') {
|
2017-08-28 21:40:44 +02:00
|
|
|
features = features.sort((a, b) => (new Date(a.createdAt) > new Date(b.createdAt) ? -1 : 1));
|
2017-02-14 11:05:34 +01:00
|
|
|
} else if (settings.sort === 'name') {
|
|
|
|
features = features.sort((a, b) => {
|
2017-08-28 19:15:47 +02:00
|
|
|
if (a.name < b.name) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (a.name > b.name) {
|
|
|
|
return 1;
|
|
|
|
}
|
2017-02-14 11:05:34 +01:00
|
|
|
return 0;
|
|
|
|
});
|
|
|
|
} else if (settings.sort === 'strategies') {
|
2017-08-28 21:40:44 +02:00
|
|
|
features = features.sort((a, b) => (a.strategies.length > b.strategies.length ? -1 : 1));
|
2017-02-14 11:05:34 +01:00
|
|
|
} else if (settings.sort === 'metrics') {
|
2017-08-28 21:40:44 +02:00
|
|
|
const target = settings.showLastHour ? featureMetrics.lastHour : featureMetrics.lastMinute;
|
2016-12-05 12:57:21 +01:00
|
|
|
|
2017-02-14 11:05:34 +01:00
|
|
|
features = features.sort((a, b) => {
|
2017-08-28 19:15:47 +02:00
|
|
|
if (!target[a.name]) {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
if (!target[b.name]) {
|
|
|
|
return -1;
|
|
|
|
}
|
2017-02-14 11:05:34 +01:00
|
|
|
if (target[a.name].yes > target[b.name].yes) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
});
|
2016-12-04 11:56:41 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return {
|
|
|
|
features,
|
|
|
|
featureMetrics,
|
|
|
|
settings,
|
|
|
|
};
|
|
|
|
};
|
2018-03-14 11:23:13 +01:00
|
|
|
const mapStateToProps = mapStateToPropsConfigurable(true);
|
2016-11-10 14:26:24 +01:00
|
|
|
const mapDispatchToProps = {
|
2017-01-09 11:08:04 +01:00
|
|
|
toggleFeature,
|
2016-11-10 14:26:24 +01:00
|
|
|
fetchFeatureToggles,
|
2016-12-04 11:56:41 +01:00
|
|
|
updateSetting: updateSettingForGroup('feature'),
|
2016-11-10 14:26:24 +01:00
|
|
|
};
|
|
|
|
|
2017-08-28 21:40:44 +02:00
|
|
|
const FeatureListContainer = connect(mapStateToProps, mapDispatchToProps)(FeatureListComponent);
|
2016-11-10 14:26:24 +01:00
|
|
|
|
|
|
|
export default FeatureListContainer;
|