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:
parent
9844785b8d
commit
6d4fdafc02
@ -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
|
||||||
};
|
};
|
||||||
|
@ -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((
|
||||||
|
@ -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))}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
Loading…
Reference in New Issue
Block a user