From a63024f79468e7de831b072b73627455743cb843 Mon Sep 17 00:00:00 2001 From: Conrad Date: Mon, 12 Mar 2018 17:42:33 -0400 Subject: [PATCH 1/4] Add new cbra impact report --- src/containers/BGroup/BGroup.js | 17 +++-- src/containers/BGroup/BGroupBuildingTable.js | 5 +- .../BGroup/BGroupProjectOverview.js | 8 +-- src/containers/Reports/actions.js | 52 +++++++++++--- .../BpImpact.js => Impact/Impact.js} | 20 +++--- .../ImpactWrapper.js} | 63 +++++++++-------- src/containers/Reports/constants.js | 11 +-- src/containers/Reports/index.js | 70 +++++++++++++++---- src/containers/Reports/propTypes.js | 5 +- src/containers/Reports/reducer.js | 48 +++++++++---- src/containers/Reports/sagas.js | 45 +++++++++--- src/utils/restServices.js | 2 + 12 files changed, 243 insertions(+), 103 deletions(-) rename src/containers/Reports/components/{BpImpact/BpImpact.js => Impact/Impact.js} (77%) rename src/containers/Reports/components/{BpImpact/BpImpactWrapper.js => Impact/ImpactWrapper.js} (62%) diff --git a/src/containers/BGroup/BGroup.js b/src/containers/BGroup/BGroup.js index 458b4f41..0102eb6e 100644 --- a/src/containers/BGroup/BGroup.js +++ b/src/containers/BGroup/BGroup.js @@ -22,7 +22,7 @@ import BGroupProjectOverview from './BGroupProjectOverview'; import BGroupBuildingTable from './BGroupBuildingTable'; import completeProjectPropTypes from '../Project/propTypes'; import { loadProjects } from '../Project/actions'; -import { loadCustomBpImpactReport } from '../Reports/actions'; +import { loadCustomImpactReport } from '../Reports/actions'; import reportsPropTypes from '../Reports/propTypes'; import userPropType from '../User/propTypes'; import request from '../../utils/request'; @@ -85,7 +85,9 @@ export class BGroup extends Component { } this.getSimulationDates(buildingIds); this.getSfBuildingImpact(buildingIds); - this.props.loadCustomBpImpactReport(buildingIds); + if (nextProps.user.permissions['read::CustomImpact']) { + this.props.loadCustomImpactReport(buildingIds); + } } } if (nextProps.projects.projects !== this.props.projects.project) { @@ -326,19 +328,20 @@ export class BGroup extends Component { projects={this.props.projects} projectStatusBreakdown={this.state.projectStatusBreakdown} projectTypeBreakdown={this.state.projectTypeBreakdown} - impactSummary={this.props.report.customBpImpactReport} - impactSummaryLoading={this.props.report.loadingCustomBpImpact} + impactSummary={this.props.report.customImpactReport} + impactSummaryLoading={this.props.report.loadingCustomImpact} /> ); break; case 'buildings': content = ( ( deleteBuildingFromBGroup, deleteBGroup, loadProjects, - loadCustomBpImpactReport, + loadCustomImpactReport, }, dispatch) ); diff --git a/src/containers/BGroup/BGroupBuildingTable.js b/src/containers/BGroup/BGroupBuildingTable.js index ab26d832..93155bb7 100644 --- a/src/containers/BGroup/BGroupBuildingTable.js +++ b/src/containers/BGroup/BGroupBuildingTable.js @@ -499,7 +499,7 @@ export default class BGroupBuildingTable extends Component { }, ], }]]; - if (this.state.edit) { + if (this.props.edit) { columns.push({ Header: '', filterable: false, @@ -559,7 +559,7 @@ export default class BGroupBuildingTable extends Component { }); return (
-
+
-
+

Project Impact Summary

-
diff --git a/src/containers/Reports/actions.js b/src/containers/Reports/actions.js index 8941c605..dafcc09e 100644 --- a/src/containers/Reports/actions.js +++ b/src/containers/Reports/actions.js @@ -6,9 +6,12 @@ import { LOAD_BP_IMPACT_REPORT, LOAD_BP_IMPACT_REPORT_SUCCESS, LOAD_BP_IMPACT_REPORT_ERROR, - LOAD_CUSTOM_BP_IMPACT_REPORT, - LOAD_CUSTOM_BP_IMPACT_REPORT_SUCCESS, - LOAD_CUSTOM_BP_IMPACT_REPORT_ERROR, + LOAD_CBRA_IMPACT_REPORT, + LOAD_CBRA_IMPACT_REPORT_SUCCESS, + LOAD_CBRA_IMPACT_REPORT_ERROR, + LOAD_CUSTOM_IMPACT_REPORT, + LOAD_CUSTOM_IMPACT_REPORT_SUCCESS, + LOAD_CUSTOM_IMPACT_REPORT_ERROR, } from './constants'; /** @@ -67,28 +70,55 @@ export function bpImpactReportsLoadingError(error) { } /** - * Load custom bp impact reports + * Load impact reports * - * @returns {object} An action object with a type of LOAD_CUSTOM_BP_IMPACT_REPORT + * @returns {object} An action object with a type of LOAD_BUILDING_CBRA_IMPACT_REPORT */ -export function loadCustomBpImpactReport(buildingIds) { +export function loadCbraImpactReports(limit = -1) { return { - type: LOAD_CUSTOM_BP_IMPACT_REPORT, + type: LOAD_CBRA_IMPACT_REPORT, + limit, + }; +} + +export function cbraImpactReportsLoaded(cbraImpactReports) { + return { + type: LOAD_CBRA_IMPACT_REPORT_SUCCESS, + payload: cbraImpactReports.data, + }; +} + +export function cbraImpactReportsLoadingError(error) { + return { + type: LOAD_CBRA_IMPACT_REPORT_ERROR, + error, + }; +} + +/** + * Load custom impact reports + * + * @returns {object} An action object with a type of LOAD_CUSTOM_IMPACT_REPORT + */ + +export function loadCustomImpactReport(buildingIds) { + return { + type: LOAD_CUSTOM_IMPACT_REPORT, buildingIds, }; } -export function customBpImpactReportsLoaded(bpImpactReport) { +export function customImpactReportsLoaded(bpImpactReport) { return { - type: LOAD_CUSTOM_BP_IMPACT_REPORT_SUCCESS, + type: LOAD_CUSTOM_IMPACT_REPORT_SUCCESS, payload: bpImpactReport.data, }; } -export function customBpImpactReportsLoadingError(error) { +export function customImpactReportsLoadingError(error) { return { - type: LOAD_CUSTOM_BP_IMPACT_REPORT_ERROR, + type: LOAD_CUSTOM_IMPACT_REPORT_ERROR, error, }; } diff --git a/src/containers/Reports/components/BpImpact/BpImpact.js b/src/containers/Reports/components/Impact/Impact.js similarity index 77% rename from src/containers/Reports/components/BpImpact/BpImpact.js rename to src/containers/Reports/components/Impact/Impact.js index 45d60702..82b91f57 100644 --- a/src/containers/Reports/components/BpImpact/BpImpact.js +++ b/src/containers/Reports/components/Impact/Impact.js @@ -2,11 +2,11 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import ReactTooltip from 'react-tooltip'; -import { bpImpactReportPropTypes } from '../../propTypes'; +import { impactReportPropTypes } from '../../propTypes'; import Loading from '../../../../components/Loading'; -export default class BpImpact extends Component { +export default class Impact extends Component { state = {} @@ -14,15 +14,15 @@ export default class BpImpact extends Component { if (this.props.loading) { return ; } - const bpImpactReports = this.props.bpImpactReports; - if (!this.props.bpImpactReports) { + const impactReports = this.props.impactReports; + if (!this.props.impactReports) { return null; } const dateCompareString = ` The blue number represents the difference between the last two generated reports
The last reports were generated on - ${bpImpactReports[0].created} and ${bpImpactReports.length > 1 ? bpImpactReports[1].created : 'n/a'} + ${impactReports[0].created} and ${impactReports.length > 1 ? impactReports[1].created : 'n/a'} `; return (
@@ -30,10 +30,10 @@ export default class BpImpact extends Component { { - bpImpactReports[0].report.map((val, index) => { + impactReports[0].report.map((val, index) => { let change = 0; - if (bpImpactReports.length > 1) { - const previousReport = bpImpactReports[1]; + if (impactReports.length > 1) { + const previousReport = impactReports[1]; change = val.value - previousReport.report[index].value; } let changeString = ''; @@ -75,7 +75,7 @@ export default class BpImpact extends Component { } } -BpImpact.propTypes = { - bpImpactReports: bpImpactReportPropTypes, +Impact.propTypes = { + impactReports: impactReportPropTypes, loading: PropTypes.bool, }; diff --git a/src/containers/Reports/components/BpImpact/BpImpactWrapper.js b/src/containers/Reports/components/Impact/ImpactWrapper.js similarity index 62% rename from src/containers/Reports/components/BpImpact/BpImpactWrapper.js rename to src/containers/Reports/components/Impact/ImpactWrapper.js index eb48e2d4..b74834be 100644 --- a/src/containers/Reports/components/BpImpact/BpImpactWrapper.js +++ b/src/containers/Reports/components/Impact/ImpactWrapper.js @@ -3,13 +3,13 @@ import PropTypes from 'prop-types'; import ReactTooltip from 'react-tooltip'; import { Icon } from 'react-fa'; -import { bpImpactReportPropTypes } from '../../propTypes'; +import { impactReportPropTypes } from '../../propTypes'; import { BGroup } from '../../../../containers/BGroup'; import userPropType from '../../../../containers/User/propTypes'; -import BpImpact from './BpImpact'; +import Impact from './Impact'; -export default class BpImpactWrapper extends Component { +export default class ImpactWrapper extends Component { state = { filterReport: null, @@ -17,9 +17,9 @@ export default class BpImpactWrapper extends Component { componentWillReceiveProps(nextProps) { if ( - nextProps.customBpImpactReport !== this.props.customBpImpactReport + nextProps.customImpactReport !== this.props.customImpactReport ) { - this.setState({ filterReport: [nextProps.customBpImpactReport[0]] }); + this.setState({ filterReport: [nextProps.customImpactReport[0]] }); } } @@ -28,26 +28,28 @@ export default class BpImpactWrapper extends Component { } updateFilterReport = (filter, tableState) => { - const buildingIds = tableState.sortedData.map(val => ( - val._original.building_id // eslint-disable-line - )); - clearTimeout(this.updateFilterReportTimeout); - this.updateFilterReportTimeout = setTimeout( - () => { - this.props.loadCustomBpImpactReport(buildingIds); - }, - 250, - ); + if (this.props.user.permissions['read::CustomImpact']) { + const buildingIds = tableState.sortedData.map(val => ( + val._original.building_id // eslint-disable-line + )); + clearTimeout(this.updateFilterReportTimeout); + this.updateFilterReportTimeout = setTimeout( + () => { + this.props.loadCustomImpactReport(buildingIds); + }, + 250, + ); + } } render() { - if (this.props.bpImpactReports !== null && this.props.bpImpactReports.length < 1) { + if (this.props.impactReports !== null && this.props.impactReports.length < 1) { return
No report
; } if (!this.props.detail) { return ( - ); @@ -63,12 +65,12 @@ export default class BpImpactWrapper extends Component {

Overall Report

-
- @@ -90,7 +92,7 @@ export default class BpImpactWrapper extends Component {

BlocPower Buildings

+ ); + break; + case 'cbraimpact': + loading = ( + this.props.report.cbraImpactReports === null || + this.props.report.loadingCbraImpact + ); + content = ( + ); break; @@ -82,7 +117,8 @@ class Reports extends Component { } if ( (this.state.reportTab === 'lighting' && !this.props.user.permissions['read::KissflowLighting']) || - (this.state.reportTab === 'bpimpact' && !this.props.user.permissions['read::BpImpact']) + (this.state.reportTab === 'bpimpact' && !this.props.user.permissions['read::BpImpact']) || + (this.state.reportTab === 'cbraimpact' && !this.props.user.permissions['read::CbraImpact']) ) { content = 'You do not have the permission to view this report'; } @@ -92,7 +128,7 @@ class Reports extends Component {
diff --git a/src/containers/BGroup/BGroupBuildingTable.js b/src/containers/BGroup/BGroupBuildingTable.js index 93155bb7..41b32d3e 100644 --- a/src/containers/BGroup/BGroupBuildingTable.js +++ b/src/containers/BGroup/BGroupBuildingTable.js @@ -334,7 +334,7 @@ export default class BGroupBuildingTable extends Component { ) : null), }, ], - }], ...(!this.state.displayImpact) ? [] : [{ + }], ...(!this.props.user.permissions['read::SfBuildingImpact'] || !this.state.displayImpact) ? [] : [{ Header: () => ( Impact{' '} @@ -626,6 +626,7 @@ export default class BGroupBuildingTable extends Component { { this.setState({ displayImpact: !this.state.displayImpact }); }} diff --git a/src/containers/Reports/components/Impact/ImpactWrapper.js b/src/containers/Reports/components/Impact/ImpactWrapper.js index b74834be..f0b4f042 100644 --- a/src/containers/Reports/components/Impact/ImpactWrapper.js +++ b/src/containers/Reports/components/Impact/ImpactWrapper.js @@ -1,6 +1,6 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; -import ReactTooltip from 'react-tooltip'; +import { UncontrolledTooltip } from 'reactstrap'; import { Icon } from 'react-fa'; import { impactReportPropTypes } from '../../propTypes'; @@ -54,14 +54,8 @@ export default class ImpactWrapper extends Component { /> ); } - const filterDescriptionString = ` - Filter buildings below to see a new report generated -
- for the subset of buildings that pass the filter - `; return (
-

Overall Report

@@ -72,14 +66,15 @@ export default class ImpactWrapper extends Component {

- + {' '} Filter Report + + Filter buildings below to see a new report generated + for the subset of buildings that pass the filter. +

-

BlocPower Buildings

+

Buildings

); break; - case 'cbraimpact': + case 'MOS Impact': loading = ( this.props.report.cbraImpactReports === null || this.props.report.loadingCbraImpact @@ -96,7 +98,7 @@ class Reports extends Component { /> ); break; - case 'lighting': + case 'Lighting': loading = ( this.props.report.lightingReports === null || this.props.report.loadingLighting @@ -116,49 +118,50 @@ class Reports extends Component { content = 'There was an error'; } if ( - (this.state.reportTab === 'lighting' && !this.props.user.permissions['read::KissflowLighting']) || - (this.state.reportTab === 'bpimpact' && !this.props.user.permissions['read::BpImpact']) || - (this.state.reportTab === 'cbraimpact' && !this.props.user.permissions['read::CbraImpact']) + (this.state.reportTab === 'Lighting' && !this.props.user.permissions['read::KissflowLighting']) || + (this.state.reportTab === 'BP Impact' && !this.props.user.permissions['read::BpImpact']) || + (this.state.reportTab === 'MOS Impact' && !this.props.user.permissions['read::CbraImpact']) ) { content = 'You do not have the permission to view this report'; } return ( // create a simple report that is engaged, out to bid, complete, total active, total inactive -
- +
-
+
{content}
-- GitLab From 4dd87d45388006504d90b80ba11ecf2e2ea1670d Mon Sep 17 00:00:00 2001 From: Conrad Date: Tue, 13 Mar 2018 12:50:40 -0400 Subject: [PATCH 3/4] Add env variables to README --- .env.default | 3 ++- README.md | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.env.default b/.env.default index a31cc652..493a9b48 100644 --- a/.env.default +++ b/.env.default @@ -26,5 +26,6 @@ REACT_APP_AUTH0_CALLBACK_URL REACT_APP_AUTH0_CLAIMS_NAMESPACE REACT_APP_AUTH0_AUDIENCE -# BlocPower Building Group ID +# Building Group IDs for Reports REACT_APP_BP_BGROUP_ID +REACT_APP_CBRA_BGROUP_ID diff --git a/README.md b/README.md index 4cba54a1..15ad3e5f 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ REACT_APP_AUTH0_CLAIMS_NAMESPACE REACT_APP_AUTH0_AUDIENCE REACT_APP_FEEDBACK_LINK REACT_APP_BP_BGROUP_ID +REACT_APP_CBRA_BGROUP_ID ``` ### Optional - [React Devtools](https://github.com/facebook/react-devtools) -- GitLab From 727d9d5b8efdc0bd2b96ef86f64a1ec58c6153bf Mon Sep 17 00:00:00 2001 From: Conrad Date: Tue, 13 Mar 2018 13:31:49 -0400 Subject: [PATCH 4/4] Update arg name of customImpactReport --- src/containers/Reports/actions.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/containers/Reports/actions.js b/src/containers/Reports/actions.js index dafcc09e..9867bbc5 100644 --- a/src/containers/Reports/actions.js +++ b/src/containers/Reports/actions.js @@ -109,10 +109,10 @@ export function loadCustomImpactReport(buildingIds) { }; } -export function customImpactReportsLoaded(bpImpactReport) { +export function customImpactReportsLoaded(impactReport) { return { type: LOAD_CUSTOM_IMPACT_REPORT_SUCCESS, - payload: bpImpactReport.data, + payload: impactReport.data, }; } -- GitLab