1
0
mirror of https://github.com/aclindsa/moneygo.git synced 2024-12-27 07:52:28 -05:00

reports: Move flattening tabulations into reducer

This removes some circular control dependencies
This commit is contained in:
Aaron Lindsay 2017-06-17 14:24:02 -04:00
parent 9844785b8d
commit 6d4fdafc02
4 changed files with 68 additions and 56 deletions

View File

@ -87,10 +87,9 @@ function selectionCleared() {
} }
} }
function seriesSelected(flattenedTabulation, seriesTraversal) { function seriesSelected(seriesTraversal) {
return { return {
type: ReportConstants.SERIES_SELECTED, type: ReportConstants.SERIES_SELECTED,
tabulation: flattenedTabulation,
seriesTraversal: seriesTraversal seriesTraversal: seriesTraversal
} }
} }
@ -228,45 +227,6 @@ function tabulate(report) {
}; };
} }
function selectSeries(tabulation, seriesTraversal) {
return function (dispatch) {
if (!seriesTraversal)
seriesTraversal = [];
// Descend the tree to the right series to flatten
var series = tabulation;
for (var i=0; i < seriesTraversal.length; i++) {
if (!series.Series.hasOwnProperty(seriesTraversal[i])) {
dispatch(ErrorActions.clientError("Invalid series"));
return;
}
series = series.Series[seriesTraversal[i]];
}
// Actually flatten the data
var flattenedSeries = series.mapReduceChildren(null,
function(accumulator, currentValue, currentIndex, array) {
return accumulator + currentValue;
}
);
// Add back in any values from the current level
if (series.hasOwnProperty('Values'))
flattenedSeries[Tabulation.topLevelSeriesName()] = series.Values;
var flattenedTabulation = new Tabulation();
flattenedTabulation.ReportId = tabulation.ReportId;
flattenedTabulation.Title = tabulation.Title;
flattenedTabulation.Subtitle = tabulation.Subtitle;
flattenedTabulation.Units = tabulation.Units;
flattenedTabulation.Labels = tabulation.Labels.slice();
flattenedTabulation.FlattenedSeries = flattenedSeries;
dispatch(seriesSelected(flattenedTabulation, seriesTraversal));
};
}
module.exports = { module.exports = {
fetchAll: fetchAll, fetchAll: fetchAll,
create: create, create: create,
@ -274,5 +234,5 @@ module.exports = {
remove: remove, remove: remove,
tabulate: tabulate, tabulate: tabulate,
select: reportSelected, select: reportSelected,
selectSeries: selectSeries selectSeries: seriesSelected
}; };

View File

@ -156,10 +156,6 @@ class ReportsTab extends React.Component {
nextProps.onTabulateReport(nextProps.reports.map[nextProps.reports.list[0]]); nextProps.onTabulateReport(nextProps.reports.map[nextProps.reports.list[0]]);
this.setState({initialized: true}); this.setState({initialized: true});
} }
} else if (selected != -1 &&
nextProps.reports.tabulations.hasOwnProperty(selected) &&
nextProps.reports.selectedTabulation == null) {
nextProps.onSelectSeries(nextProps.reports.tabulations[selected]);
} }
} }
handleSelectSeries(series) { handleSelectSeries(series) {
@ -167,8 +163,7 @@ class ReportsTab extends React.Component {
return; return;
var seriesTraversal = this.props.reports.seriesTraversal.slice(); var seriesTraversal = this.props.reports.seriesTraversal.slice();
seriesTraversal.push(series); seriesTraversal.push(series);
var selectedTabulation = this.props.reports.tabulations[this.props.reports.selected]; this.props.onSelectSeries(seriesTraversal);
this.props.onSelectSeries(selectedTabulation, seriesTraversal);
} }
handleSelectReport(report) { handleSelectReport(report) {
this.props.onSelectReport(report); this.props.onSelectReport(report);
@ -214,10 +209,9 @@ class ReportsTab extends React.Component {
var self = this; var self = this;
var navOnClick = function() { var navOnClick = function() {
var onSelectSeries = self.props.onSelectSeries; var onSelectSeries = self.props.onSelectSeries;
var tabulation = self.props.reports.tabulations[self.props.reports.selected];
var mySeriesTraversal = seriesTraversal.slice(); var mySeriesTraversal = seriesTraversal.slice();
return function() { return function() {
onSelectSeries(tabulation, mySeriesTraversal); onSelectSeries(mySeriesTraversal);
}; };
}(); }();
titleTracks.push(( titleTracks.push((

View File

@ -23,7 +23,7 @@ function mapDispatchToProps(dispatch) {
onDeleteReport: function(report) {dispatch(ReportActions.remove(report))}, onDeleteReport: function(report) {dispatch(ReportActions.remove(report))},
onSelectReport: function(report) {dispatch(ReportActions.select(report))}, onSelectReport: function(report) {dispatch(ReportActions.select(report))},
onTabulateReport: function(report) {dispatch(ReportActions.tabulate(report))}, onTabulateReport: function(report) {dispatch(ReportActions.tabulate(report))},
onSelectSeries: function(tabulation, seriesTraversal) {dispatch(ReportActions.selectSeries(tabulation, seriesTraversal))} onSelectSeries: function(seriesTraversal) {dispatch(ReportActions.selectSeries(seriesTraversal))}
} }
} }

View File

@ -3,6 +3,9 @@ var assign = require('object-assign');
var ReportConstants = require('../constants/ReportConstants'); var ReportConstants = require('../constants/ReportConstants');
var UserConstants = require('../constants/UserConstants'); var UserConstants = require('../constants/UserConstants');
var models = require('../models.js');
var Tabulation = models.Tabulation;
const initialState = { const initialState = {
map: {}, map: {},
tabulations: {}, tabulations: {},
@ -12,6 +15,40 @@ const initialState = {
seriesTraversal: [] seriesTraversal: []
}; };
function getFlattenedTabulation(tabulation, seriesTraversal) {
// Descend the tree to the right series to flatten
var series = tabulation;
for (var i=0; i < seriesTraversal.length; i++) {
if (!series.Series.hasOwnProperty(seriesTraversal[i])) {
dispatch(ErrorActions.clientError("Invalid series"));
return;
}
series = series.Series[seriesTraversal[i]];
}
// Actually flatten the data
var flattenedSeries = series.mapReduceChildren(null,
function(accumulator, currentValue, currentIndex, array) {
return accumulator + currentValue;
}
);
// Add back in any values from the current level
if (series.hasOwnProperty('Values'))
flattenedSeries[Tabulation.topLevelSeriesName()] = series.Values;
var flattenedTabulation = new Tabulation();
flattenedTabulation.ReportId = tabulation.ReportId;
flattenedTabulation.Title = tabulation.Title;
flattenedTabulation.Subtitle = tabulation.Subtitle;
flattenedTabulation.Units = tabulation.Units;
flattenedTabulation.Labels = tabulation.Labels.slice();
flattenedTabulation.FlattenedSeries = flattenedSeries;
return flattenedTabulation;
}
module.exports = function(state = initialState, action) { module.exports = function(state = initialState, action) {
switch (action.type) { switch (action.type) {
case ReportConstants.REPORTS_FETCHED: case ReportConstants.REPORTS_FETCHED:
@ -33,6 +70,13 @@ module.exports = function(state = initialState, action) {
}); });
case ReportConstants.REPORT_CREATED: case ReportConstants.REPORT_CREATED:
case ReportConstants.REPORT_UPDATED: case ReportConstants.REPORT_UPDATED:
var selectedTabulation = state.selectedTabulation;
var seriesTraversal = state.seriesTraversal;
if (state.selected == action.report.ReportId) {
selectedTabulation = initialState.selectedTabulation;
seriesTraversal = initialState.seriesTraversal;
}
var report = action.report; var report = action.report;
var reports = assign({}, state.map, { var reports = assign({}, state.map, {
[report.ReportId]: report [report.ReportId]: report
@ -45,7 +89,9 @@ module.exports = function(state = initialState, action) {
} }
return assign({}, state, { return assign({}, state, {
map: reports, map: reports,
list: list list: list,
selectedTabulation: selectedTabulation,
seriesTraversal: seriesTraversal
}); });
case ReportConstants.REPORT_REMOVED: case ReportConstants.REPORT_REMOVED:
var selected = state.selected; var selected = state.selected;
@ -58,22 +104,34 @@ module.exports = function(state = initialState, action) {
selected: selected selected: selected
}); });
case ReportConstants.REPORT_SELECTED: case ReportConstants.REPORT_SELECTED:
var selectedTabulation = null;
if (state.tabulations.hasOwnProperty(action.report.ReportId)) {
selectedTabulation = getFlattenedTabulation(state.tabulations[action.report.ReportId], initialState.seriesTraversal)
}
return assign({}, state, { return assign({}, state, {
selected: action.report.ReportId, selected: action.report.ReportId,
selectedTabulation: null, selectedTabulation: selectedTabulation,
seriesTraversal: [] seriesTraversal: initialState.seriesTraversal
}); });
case ReportConstants.REPORT_TABULATED: case ReportConstants.REPORT_TABULATED:
var tabulation = action.tabulation; var tabulation = action.tabulation;
var tabulations = assign({}, state.tabulations, { var tabulations = assign({}, state.tabulations, {
[tabulation.ReportId]: tabulation [tabulation.ReportId]: tabulation
}); });
var selectedTabulation = state.selectedTabulation;
var seriesTraversal = state.seriesTraversal;
if (tabulation.ReportId == state.selected) {
selectedTabulation = getFlattenedTabulation(tabulation, initialState.seriesTraversal)
seriesTraversal = initialState.seriesTraversal;
}
return assign({}, state, { return assign({}, state, {
tabulations: tabulations tabulations: tabulations,
selectedTabulation: selectedTabulation,
seriesTraversal: seriesTraversal
}); });
case ReportConstants.SERIES_SELECTED: case ReportConstants.SERIES_SELECTED:
return assign({}, state, { return assign({}, state, {
selectedTabulation: action.tabulation, selectedTabulation: getFlattenedTabulation(state.tabulations[state.selected], action.seriesTraversal),
seriesTraversal: action.seriesTraversal seriesTraversal: action.seriesTraversal
}); });
case UserConstants.USER_LOGGEDOUT: case UserConstants.USER_LOGGEDOUT: