JSFiddle - React, Tailwind, and code Playground
HTML
<script src="https://rawgit.com/lodash/lodash/2.4.1/dist/lodash.js"></script>
<script src="https://rawgit.com/ifandelse/machina.js/master/lib/machina.js"></script>
JavaScript
const moment = require('moment');
const _ = require('lodash');
const reverseDate = (date) => {
const from = date.from.split('-').reverse().join('-');
const to = date.to.split('-').reverse().join('-');
return {
from,
to
}
};
const timeline = [
{ from: "01-2015", to: "02-2016" },
{ from: "05-2015", to: "05-2016" },
{ from: "12-2015", to: "01-2016" },
{ from: "08-2016", to: "07-2017" },
{ from: "06-2016", to: "07-2017" }
].map(reverseDate);
const formatTime = (fromTo) => {
const monthYearFrom = fromTo.from.split('-');
const monthYearTo = fromTo.to.split('-');
const getTimestamp = ([year, month]) => moment().year(year).month(month - 1).startOf('month').valueOf();
return {
start: getTimestamp(monthYearFrom),
end: getTimestamp(monthYearTo)
}
};
const dateContainsIn = (date, timeLine) => {
return moment(date).isBetween(timeLine.from, timeLine.to)
};
const firstDate = formatTime(timeline[0]);
const secondDate = formatTime(timeline[1]);
// console.log(firstDate);
// console.log(secondDate);
// console.log(dateContainsIn(timeline[1].from, timeline[0]));
const addMonths = (date, timeline) => {
const dateCopy = _.clone(date);
if (dateContainsIn(dateCopy, timeline)) {
return addMonths(moment(dateCopy).add(1, 'month').format('YYYY-MM'), timeline);
} else {
return moment(dateCopy).format('YYYY-MM');
}
}
const calculateMonths = ([start, ...arr]) => {
let startCopy = _.clone(start);
const result = [startCopy];
arr.forEach((item) => {
if (dateContainsIn(item.from, startCopy) && !dateContainsIn(item.to, startCopy)) {
console.log(addMonths(item.from, startCopy));
let newItem = {
from: addMonths(item.from, startCopy),
to: item.to
};
result.push(item)
startCopy = newItem;
}
})
...