2021-02-25 10:54:53 +01:00
|
|
|
import parseISO from 'date-fns/parseISO';
|
|
|
|
import differenceInDays from 'date-fns/differenceInDays';
|
|
|
|
|
2021-07-07 11:04:36 +02:00
|
|
|
import {
|
|
|
|
EXPERIMENT,
|
|
|
|
OPERATIONAL,
|
|
|
|
RELEASE,
|
|
|
|
} from '../../constants/featureToggleTypes';
|
|
|
|
|
|
|
|
import { FOURTYDAYS, SEVENDAYS } from './constants';
|
2021-02-25 10:54:53 +01:00
|
|
|
|
|
|
|
export const toggleExpiryByTypeMap = {
|
|
|
|
[EXPERIMENT]: FOURTYDAYS,
|
|
|
|
[RELEASE]: FOURTYDAYS,
|
|
|
|
[OPERATIONAL]: SEVENDAYS,
|
|
|
|
};
|
|
|
|
|
|
|
|
export const applyCheckedToFeatures = (features, checkedState) =>
|
|
|
|
features.map(feature => ({ ...feature, checked: checkedState }));
|
|
|
|
|
|
|
|
export const getCheckedState = (name, features) => {
|
|
|
|
const feature = features.find(feature => feature.name === name);
|
|
|
|
|
|
|
|
if (feature) {
|
|
|
|
return feature.checked ? feature.checked : false;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
};
|
|
|
|
|
2021-07-07 11:04:36 +02:00
|
|
|
export const getDiffInDays = (date, now) =>
|
|
|
|
Math.abs(differenceInDays(date, now));
|
2021-02-25 10:54:53 +01:00
|
|
|
|
2021-07-07 11:04:36 +02:00
|
|
|
export const formatProjectOptions = projects =>
|
|
|
|
projects.map(project => ({ key: project.id, label: project.name }));
|
2021-02-25 10:54:53 +01:00
|
|
|
|
|
|
|
export const expired = (diff, type) => {
|
|
|
|
if (diff >= toggleExpiryByTypeMap[type]) return true;
|
|
|
|
return false;
|
|
|
|
};
|
|
|
|
|
|
|
|
export const getObjectProperties = (target, ...keys) => {
|
|
|
|
const newObject = {};
|
|
|
|
|
|
|
|
keys.forEach(key => {
|
|
|
|
if (target[key] !== undefined) {
|
|
|
|
newObject[key] = target[key];
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
return newObject;
|
|
|
|
};
|
|
|
|
|
|
|
|
export const sortFeaturesByNameAscending = features => {
|
|
|
|
const sorted = [...features];
|
|
|
|
sorted.sort((a, b) => {
|
|
|
|
if (a.name < b.name) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (a.name > b.name) {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
});
|
|
|
|
return sorted;
|
|
|
|
};
|
|
|
|
|
2021-07-07 11:04:36 +02:00
|
|
|
export const sortFeaturesByNameDescending = features =>
|
|
|
|
sortFeaturesByNameAscending([...features]).reverse();
|
2021-02-25 10:54:53 +01:00
|
|
|
|
|
|
|
export const sortFeaturesByLastSeenAscending = features => {
|
|
|
|
const sorted = [...features];
|
|
|
|
sorted.sort((a, b) => {
|
|
|
|
if (!a.lastSeenAt) return -1;
|
|
|
|
if (!b.lastSeenAt) return 1;
|
|
|
|
|
|
|
|
const dateA = parseISO(a.lastSeenAt);
|
|
|
|
const dateB = parseISO(b.lastSeenAt);
|
|
|
|
|
|
|
|
return dateA.getTime() - dateB.getTime();
|
|
|
|
});
|
|
|
|
return sorted;
|
|
|
|
};
|
|
|
|
|
2021-07-07 11:04:36 +02:00
|
|
|
export const sortFeaturesByLastSeenDescending = features =>
|
|
|
|
sortFeaturesByLastSeenAscending([...features]).reverse();
|
2021-02-25 10:54:53 +01:00
|
|
|
|
|
|
|
export const sortFeaturesByCreatedAtAscending = features => {
|
|
|
|
const sorted = [...features];
|
|
|
|
sorted.sort((a, b) => {
|
|
|
|
const dateA = parseISO(a.createdAt);
|
|
|
|
const dateB = parseISO(b.createdAt);
|
|
|
|
|
|
|
|
return dateA.getTime() - dateB.getTime();
|
|
|
|
});
|
|
|
|
return sorted;
|
|
|
|
};
|
|
|
|
|
2021-07-07 11:04:36 +02:00
|
|
|
export const sortFeaturesByCreatedAtDescending = features =>
|
|
|
|
sortFeaturesByCreatedAtAscending([...features]).reverse();
|
2021-02-25 10:54:53 +01:00
|
|
|
|
|
|
|
export const sortFeaturesByExpiredAtAscending = features => {
|
|
|
|
const sorted = [...features];
|
|
|
|
sorted.sort((a, b) => {
|
|
|
|
const now = new Date();
|
|
|
|
const dateA = parseISO(a.createdAt);
|
|
|
|
const dateB = parseISO(b.createdAt);
|
|
|
|
|
|
|
|
const diffA = getDiffInDays(dateA, now);
|
|
|
|
const diffB = getDiffInDays(dateB, now);
|
|
|
|
|
2021-03-29 19:24:16 +02:00
|
|
|
if (!expired(diffA, a.type) && expired(diffB, b.type)) {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (expired(diffA, a.type) && !expired(diffB, b.type)) {
|
|
|
|
return -1;
|
|
|
|
}
|
2021-02-25 10:54:53 +01:00
|
|
|
|
|
|
|
const expiredByA = diffA - toggleExpiryByTypeMap[a.type];
|
|
|
|
const expiredByB = diffB - toggleExpiryByTypeMap[b.type];
|
|
|
|
|
2021-03-29 19:24:16 +02:00
|
|
|
return expiredByB - expiredByA;
|
2021-02-25 10:54:53 +01:00
|
|
|
});
|
|
|
|
return sorted;
|
|
|
|
};
|
|
|
|
|
2021-03-29 19:24:16 +02:00
|
|
|
export const sortFeaturesByExpiredAtDescending = features => {
|
|
|
|
const sorted = [...features];
|
|
|
|
const now = new Date();
|
|
|
|
sorted.sort((a, b) => {
|
|
|
|
const dateA = parseISO(a.createdAt);
|
|
|
|
const dateB = parseISO(b.createdAt);
|
|
|
|
|
|
|
|
const diffA = getDiffInDays(dateA, now);
|
|
|
|
const diffB = getDiffInDays(dateB, now);
|
|
|
|
|
|
|
|
if (!expired(diffA, a.type) && expired(diffB, b.type)) {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (expired(diffA, a.type) && !expired(diffB, b.type)) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
const expiredByA = diffA - toggleExpiryByTypeMap[a.type];
|
|
|
|
const expiredByB = diffB - toggleExpiryByTypeMap[b.type];
|
|
|
|
|
|
|
|
return expiredByA - expiredByB;
|
|
|
|
});
|
|
|
|
return sorted;
|
|
|
|
};
|
2021-02-25 10:54:53 +01:00
|
|
|
|
|
|
|
export const sortFeaturesByStatusAscending = features => {
|
|
|
|
const sorted = [...features];
|
|
|
|
sorted.sort((a, b) => {
|
|
|
|
if (a.stale) return 1;
|
|
|
|
if (b.stale) return -1;
|
|
|
|
return 0;
|
|
|
|
});
|
|
|
|
return sorted;
|
|
|
|
};
|
|
|
|
|
2021-07-07 11:04:36 +02:00
|
|
|
export const sortFeaturesByStatusDescending = features =>
|
|
|
|
sortFeaturesByStatusAscending([...features]).reverse();
|
2021-02-25 10:54:53 +01:00
|
|
|
|
|
|
|
export const pluralize = (items, word) => {
|
|
|
|
if (items === 1) return `${items} ${word}`;
|
|
|
|
return `${items} ${word}s`;
|
|
|
|
};
|
|
|
|
|
|
|
|
export const getDates = dateString => {
|
|
|
|
const date = parseISO(dateString);
|
|
|
|
const now = new Date();
|
|
|
|
|
|
|
|
return [date, now];
|
|
|
|
};
|
|
|
|
|
2021-07-07 11:04:36 +02:00
|
|
|
export const filterByProject = selectedProject => feature =>
|
|
|
|
feature.project === selectedProject;
|