function getPeriod()

in client/src/components/special/periods.js [189:317]


function getPeriod (period, range) {
  const dateNow = getCurrentDate();
  let {start, end, isCurrent} = Range.parse(range, period);
  let before = start ? moment(start).add(-1, 'd') : moment(dateNow).add(-1, 'd');
  const rangeIsSelected = !!start && !!end;
  let tickFormat;
  let previousStart;
  let previousEnd;
  let endStrict;
  let previousEndStrict;
  let previousShiftFn;
  let previousFilterFn;

  switch ((period || '').toLowerCase()) {
    case Period.month:
      if (!rangeIsSelected) {
        start = moment(dateNow).startOf('month');
        end = moment(dateNow).endOf('month');
      }
      before = start ? moment(start).add(-1, 'M') : moment(dateNow).add(-1, 'M');
      tickFormat = '1d';
      previousStart = moment(start).add(-1, 'M');
      previousEnd = moment(previousStart).endOf('M');
      endStrict = moment(end);
      previousEndStrict = moment(previousEnd);
      if (isCurrent) {
        if (dateNow < endStrict) {
          endStrict = moment(dateNow);
        }
        const temp = moment(endStrict).add(-1, 'M');
        if (temp < previousEndStrict) {
          previousEndStrict = temp;
        }
      }
      endStrict = endStrict.endOf('D');
      previousEndStrict = previousEndStrict.endOf('D');
      const daysInMonth = start.daysInMonth();
      previousShiftFn = (momentDate) => moment(momentDate).add(1, 'M');
      previousFilterFn = (momentDate) => momentDate.get('D') <= daysInMonth;
      break;
    case Period.quarter:
      if (!rangeIsSelected) {
        start = moment(dateNow).startOf('Q');
        end = moment(start).endOf('Q');
      }
      before = start ? moment(start).add(-1, 'Q') : moment(dateNow).add(-1, 'Q');
      tickFormat = '1M';
      previousStart = moment(start).add(-1, 'y');
      previousEnd = moment(end).add(-1, 'y');
      endStrict = moment(end);
      previousEndStrict = moment(previousEnd);
      if (isCurrent) {
        if (dateNow < endStrict) {
          endStrict = moment(dateNow);
        }
        const temp = moment(endStrict).add(-1, 'y');
        if (temp < previousEndStrict) {
          previousEndStrict = temp;
        }
      }
      endStrict = endStrict.endOf('D');
      previousEndStrict = previousEndStrict.endOf('D');
      previousShiftFn = (momentDate) => moment(momentDate).add(1, 'y');
      break;
    case Period.year:
      if (!rangeIsSelected) {
        start = moment(dateNow).startOf('Y');
        end = moment(dateNow).endOf('Y');
      }
      before = start ? moment(start).add(-1, 'Y') : moment(dateNow).add(-1, 'Y');
      tickFormat = '1M';
      previousStart = moment(start).add(-1, 'y');
      previousEnd = moment(end).add(-1, 'y');
      endStrict = moment(end);
      previousEndStrict = moment(previousEnd);
      if (isCurrent) {
        if (dateNow < endStrict) {
          endStrict = moment(dateNow);
        }
        const temp = moment(endStrict).add(-1, 'y');
        if (temp < previousEndStrict) {
          previousEndStrict = temp;
        }
      }
      previousShiftFn = (momentDate) => moment(momentDate).add(1, 'y');
      break;
    case Period.day:
      if (!rangeIsSelected) {
        start = moment().startOf('D');
        end = moment().endOf('D');
      }
      before = start ? moment(start).add(-1, 'D') : moment().add(-1, 'D');
      tickFormat = getTickFormat(start, end);
      previousStart = moment(start).add(-1, 'd');
      previousEnd = moment(end).add(-1, 'd');
      endStrict = moment(end);
      previousEndStrict = moment(previousEnd);
      if (isCurrent) {
        if (moment() < endStrict) {
          endStrict = moment();
        }
        const temp = moment(endStrict).add(-1, 'd');
        if (temp < previousEndStrict) {
          previousEndStrict = temp;
        }
      }
      previousShiftFn = (momentDate) => moment(momentDate).add(1, 'd');
      break;
    default:
      tickFormat = getTickFormat(start, end);
      endStrict = moment(end);
      before = undefined;
      break;
  }
  return {
    name: period,
    tick: tickFormat,
    start,
    end,
    endStrict,
    previousStart,
    previousEnd,
    previousEndStrict,
    previousShiftFn,
    previousFilterFn,
    current: Range.build({start}, period),
    before: Range.build({start: before}, period)
  };
}