diff --git a/common/script/cron.js b/common/script/cron.js index 53a0e1d6fa..639bbf6b65 100644 --- a/common/script/cron.js +++ b/common/script/cron.js @@ -108,50 +108,3 @@ export function shouldDo (day, dailyTask, options = {}) { return false; // error condition - unexpected frequency string } } - - -/* - Preen history for users with > 7 history entries - This takes an infinite array of single day entries [day day day day day...], and turns it into a condensed array of averages, condensing more the further back in time we go. - Eg, 7 entries each for last 7 days; 1 entry each week of this month; 1 entry for each month of this year; 1 entry per previous year: [day*7 week*4 month*12 year*infinite] - */ - -export function preenHistory (history) { - // 'export' is temporary pending further refactoring - history = _.filter(history, function discardNulls (h) { - return Boolean(h); // nulls are from corruption somehow - TODO is this still needed? - }); - let newHistory = []; - - function preen (amount, groupBy) { - let groups = _.chain(history).groupBy(function getDateGroupings (h) { - return moment(h.date).format(groupBy); - }).sortBy(function sortByDate (h, k) { - return k; - }).value(); // turn into an array - - groups = groups.slice(-amount); - groups.pop(); // get rid of 'this week', 'this month', etc (except for case of days) - return _.each(groups, function recreateHistory (group) { - newHistory.push({ - date: moment(group[0].date).toDate(), - value: _.reduce(group, function makeAverage (m, obj) { - return m + obj.value; - }, 0) / group.length, - }); - return true; - }); - } - - // Keep the last: - preen(50, 'YYYY'); // 50 years (habit will toootally be around that long!) - preen(moment().format('MM'), 'YYYYMM'); // last MM months (eg, if today is 05, keep the last 5 months) - // Then keep all days of this month. Note, the extra logic is to account for Habits, which can be counted multiple times per day - // FIXME I'd rather keep 1-entry/week of this month, then last 'd' days in this week. However, I'm having issues where the 1st starts mid week - let thisMonth = moment().format('YYYYMM'); - - newHistory = newHistory.concat(_.filter(history, function keepThisMonthsData (h) { - return moment(h.date).format('YYYYMM') === thisMonth; - })); - return newHistory; -} diff --git a/common/script/index.js b/common/script/index.js index 1fee62e436..d82a39f04a 100644 --- a/common/script/index.js +++ b/common/script/index.js @@ -1,11 +1,10 @@ import { daysSince, shouldDo, - preenHistory, // temporary pending further refactoring } from '../../common/script/cron'; import * as statHelpers from './statHelpers'; -var $w, _, api, content, i18n, moment, sortOrder, +var $w, _, api, content, i18n, moment, preenHistory, sortOrder, indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; moment = require('moment'); @@ -75,6 +74,48 @@ api.planGemLimits = { convCap: 25 }; +/* +Preen history for users with > 7 history entries +This takes an infinite array of single day entries [day day day day day...], and turns it into a condensed array +of averages, condensing more the further back in time we go. Eg, 7 entries each for last 7 days; 1 entry each week +of this month; 1 entry for each month of this year; 1 entry per previous year: [day*7 week*4 month*12 year*infinite] + */ + +preenHistory = function(history) { + var newHistory, preen, thisMonth; + history = _.filter(history, function(h) { + return !!h; + }); + newHistory = []; + preen = function(amount, groupBy) { + var groups; + groups = _.chain(history).groupBy(function(h) { + return moment(h.date).format(groupBy); + }).sortBy(function(h, k) { + return k; + }).value(); + groups = groups.slice(-amount); + groups.pop(); + return _.each(groups, function(group) { + newHistory.push({ + date: moment(group[0].date).toDate(), + value: _.reduce(group, (function(m, obj) { + return m + obj.value; + }), 0) / group.length + }); + return true; + }); + }; + preen(50, "YYYY"); + preen(moment().format('MM'), "YYYYMM"); + thisMonth = moment().format('YYYYMM'); + newHistory = newHistory.concat(_.filter(history, function(h) { + return moment(h.date).format('YYYYMM') === thisMonth; + })); + return newHistory; +}; + + /* Preen 3-day past-completed To-Dos from Angular & mobile app */