Skip to content

Commit

Permalink
Merge pull request #359 from NREL/issue-356
Browse files Browse the repository at this point in the history
Issue 356: Move NEBs out of Energy Opps.
  • Loading branch information
rmroot authored Jan 21, 2025
2 parents 055eff0 + 64b6036 commit 14b3b00
Show file tree
Hide file tree
Showing 28 changed files with 189 additions and 312 deletions.
8 changes: 6 additions & 2 deletions src/app/indexed-db/non-energy-benefits-idb.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,14 @@ export class NonEnergyBenefitsIdbService {
});
}

getAssessmentNonEnergyBenefits(assessmentId: string): Array<IdbNonEnergyBenefit> {
getAssessmentNonEnergyBenefits(assessmentId: string, filterEnergyOppBenefits: boolean): Array<IdbNonEnergyBenefit> {
let nonEnergyBenefits: Array<IdbNonEnergyBenefit> = this.nonEnergyBenefits.getValue();
return nonEnergyBenefits.filter(neb => {
return neb.assessmentId == assessmentId && neb.energyOpportunityId == undefined;
if (filterEnergyOppBenefits) {
return neb.assessmentId == assessmentId && neb.energyOpportunityId == undefined;
} else {
return neb.assessmentId == assessmentId;
}
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ export class NebsDatabaseTableComponent {
if (modalData.energyOpportunityId) {
selectedNebs = this.nonEnergyBenefitIdbService.getEnergyOpportunityNonEnergyBenefits(modalData.energyOpportunityId);
} else {
selectedNebs = this.nonEnergyBenefitIdbService.getAssessmentNonEnergyBenefits(assessment.guid);
selectedNebs = this.nonEnergyBenefitIdbService.getAssessmentNonEnergyBenefits(assessment.guid, true);
}
let selectedOptionValues = selectedNebs.map(option => {
return option.nebOptionValue;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,18 @@
<div class="d-flex w-100 justify-content-between pb-2">
<h2 class="col-sm-5 col-form-label" for="assessmentName">Energy Efficiency Opportunities</h2>
<button class="btn btn-outline-energy-opp btn-sm" (click)="addEnergyOpportunity()"><fa-icon [icon]="faPlus"
class="me-1"></fa-icon>Add Opportunity</button>
</div>
<h6 class="pb-2">
<div class="d-flex w-100 justify-content-between">
<div class="mt-auto bold">
Energy Efficiency Opportunities
</div>
<button class="btn btn-outline-energy-opp btn-sm" (click)="addEnergyOpportunity()"><fa-icon [icon]="faPlus"
class="me-1"></fa-icon>Add Opportunity</button>
</div>
</h6>

<p class="fw-light small">
Use the "<fa-icon [icon]="faPlus"></fa-icon> Add Opportunity" button to add Energy Efficiency Opportunities to this
assessment.
</p>

<ng-template [ngIf]="assessmentEnergyOpportunityGuids.length > 0" [ngIfElse]="noOpportunitiesBlock">
<div class="accordion" id="energyOpportunityAccordion">
<div class="accordion-item"
Expand All @@ -20,8 +30,8 @@ <h2 class="accordion-header">
<div [id]="'#'+energyOpportunityGuid" class="accordion-collapse collapse"
data-bs-parent="#energyOpportunityAccordion">
<div class="accordion-body">
<app-energy-opportunity-setup-form
[energyOpportunityGuid]="energyOpportunityGuid" (emitInitialized)="childFormInitialized(energyOpportunityGuid)"
<app-energy-opportunity-setup-form [energyOpportunityGuid]="energyOpportunityGuid"
(emitInitialized)="childFormInitialized(energyOpportunityGuid)"
[inWizard]="true"></app-energy-opportunity-setup-form>
</div>
</div>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<h6 class="pb-2">
<div class="d-flex w-100 justify-content-between">
<div class="mt-auto bold">
Assessment Non-Energy Benefits
Non-Energy Benefits
</div>
<div class="dropdown">
<button class="btn btn-outline-neb btn-sm dropdown-toggle" type="button" data-bs-toggle="dropdown"
Expand All @@ -25,13 +25,9 @@ <h6 class="pb-2">
</h6>
<p class="fw-light small">
Use the "<fa-icon [icon]="faPlus"></fa-icon> Add NEB" dropdown to add Non-Energy Benefits
(<fa-icon [icon]="faWeightHanging"></fa-icon>) that
<span class="bold">are not associated with any specific energy efficiency opportunity</span> to this assessment.
(<fa-icon [icon]="faWeightHanging"></fa-icon>) to this assessment.
</p>

<app-neb-forms-accordion [assessment]="assessment"></app-neb-forms-accordion>

<hr>


<app-energy-opportunity-nebs-table [nonEnergyBenefits]="energyOppNonEnergyBenefits"></app-energy-opportunity-nebs-table>
<hr>
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
<div class="ps-2 pe-2 pb-2">
<app-energy-opportunity-nebs-table [nonEnergyBenefits]="nonEnergyBenefits"></app-energy-opportunity-nebs-table>
<hr class="my-2">
<app-assessment-savings-chart [assessmentReport]="assessmentReport"></app-assessment-savings-chart>
<hr class="my-2">
<app-assessment-savings-table [assessmentReport]="assessmentReport"></app-assessment-savings-table>
<div class="alert alert-info w-100 p-1 text-center small">
A printable version of this report can be found in the "Data Evaluation" section of the wizard.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,80 +2,23 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';

import { OnSiteAssessmentResultsComponent } from './on-site-assessment-results.component';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { OnSiteVisitIdbService } from 'src/app/indexed-db/on-site-visit-idb.service';
import { BehaviorSubject } from 'rxjs';
import { IdbOnSiteVisit, getNewIdbOnSiteVisit } from 'src/app/models/onSiteVisit';
import { AssessmentIdbService } from 'src/app/indexed-db/assessment-idb.service';
import { IdbAssessment, getNewIdbAssessment } from 'src/app/models/assessment';
import { RouterTestingModule } from '@angular/router/testing';
import { FacilityIdbService } from 'src/app/indexed-db/facility-idb.service';
import { CompanyIdbService } from 'src/app/indexed-db/company-idb.service';
import { ContactIdbService } from 'src/app/indexed-db/contact-idb.service';
import { EnergyOpportunityIdbService } from 'src/app/indexed-db/energy-opportunity-idb.service';
import { NonEnergyBenefitsIdbService } from 'src/app/indexed-db/non-energy-benefits-idb.service';
import { KeyPerformanceIndicatorsIdbService } from 'src/app/indexed-db/key-performance-indicators-idb.service';
import { IdbCompany, getNewIdbCompany } from 'src/app/models/company';
import { IdbFacility, getNewIdbFacility } from 'src/app/models/facility';
import { IdbNonEnergyBenefit } from 'src/app/models/nonEnergyBenefit';
import { IdbEnergyOpportunity } from 'src/app/models/energyOpportunity';
import { IdbKeyPerformanceIndicator } from 'src/app/models/keyPerformanceIndicator';
import { TableEntriesModule } from 'src/app/shared/table-entries/table-entries.module';
import { HelperPipesModule } from 'src/app/shared/helper-pipes/_helper-pipes.module';
import { ReportsModule } from 'src/app/shared/reports/reports.module';
import { KeyPerformanceMetricImpactsIdbService } from 'src/app/indexed-db/key-performance-metric-impacts-idb.service';
import { IdbKeyPerformanceMetricImpact } from 'src/app/models/keyPerformanceMetricImpact';
import { getDefaultUnitSettings } from 'src/app/models/unitSettings';
import { SharedAssessmentFormsModule } from 'src/app/shared/shared-assessment-forms/shared-assessment-forms.module';
import { stubServiceProviders } from 'src/app/spec-helpers/spec-test-service-stub';


describe('OnSiteAssessmentResultsComponent', () => {
let component: OnSiteAssessmentResultsComponent;
let fixture: ComponentFixture<OnSiteAssessmentResultsComponent>;
let onSiteVisitIdbService: Partial<OnSiteVisitIdbService> = {
selectedVisit: new BehaviorSubject<IdbOnSiteVisit>(getNewIdbOnSiteVisit('', '', ''))
};

let assessmentIdbService: Partial<AssessmentIdbService> = {
selectedAssessment: new BehaviorSubject<IdbAssessment>(getNewIdbAssessment('', '', '', getDefaultUnitSettings()))
}

let companyIdbService: Partial<CompanyIdbService> = {
selectedCompany: new BehaviorSubject<IdbCompany>(getNewIdbCompany('')),
getByGUID: () => { return getNewIdbCompany('') }
};
let facilityIdbService: Partial<FacilityIdbService> = {
selectedFacility: new BehaviorSubject<IdbFacility>(getNewIdbFacility('', '')),
getByGUID: () => { return getNewIdbFacility('', '') }
};
let contactIdbService: Partial<ContactIdbService> = {};
let energyOpportunityIdbService: Partial<EnergyOpportunityIdbService> = {
energyOpportunities: new BehaviorSubject<Array<IdbEnergyOpportunity>>([])
};
let nonEnergyBenefitsIdbService: Partial<NonEnergyBenefitsIdbService> = {
nonEnergyBenefits: new BehaviorSubject<Array<IdbNonEnergyBenefit>>([])
};
let keyPerformanceIndicatorService: Partial<KeyPerformanceIndicatorsIdbService> = {
keyPerformanceIndicators: new BehaviorSubject<Array<IdbKeyPerformanceIndicator>>([]),
getCompanyKeyPerformanceMetrics: () => { return [] }
};
let keyPerformanceMetricImpactsIdbService: Partial<KeyPerformanceMetricImpactsIdbService> = {
keyPerformanceMetricImpacts: new BehaviorSubject<Array<IdbKeyPerformanceMetricImpact>>([])
};

beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [FontAwesomeModule, RouterTestingModule, TableEntriesModule, HelperPipesModule, ReportsModule],
imports: [FontAwesomeModule, RouterTestingModule, TableEntriesModule, HelperPipesModule, ReportsModule, SharedAssessmentFormsModule],
declarations: [OnSiteAssessmentResultsComponent],
providers: [
{ provide: OnSiteVisitIdbService, useValue: onSiteVisitIdbService },
{ provide: AssessmentIdbService, useValue: assessmentIdbService },
{ provide: FacilityIdbService, useValue: facilityIdbService },
{ provide: ContactIdbService, useValue: contactIdbService },
{ provide: EnergyOpportunityIdbService, useValue: energyOpportunityIdbService },
{ provide: NonEnergyBenefitsIdbService, useValue: nonEnergyBenefitsIdbService },
{ provide: KeyPerformanceIndicatorsIdbService, useValue: keyPerformanceIndicatorService },
{ provide: CompanyIdbService, useValue: companyIdbService },
{ provide: KeyPerformanceMetricImpactsIdbService, useValue: keyPerformanceMetricImpactsIdbService },
]
providers: stubServiceProviders
})
.compileComponents();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ export class OnSiteAssessmentResultsComponent {
assessment: IdbAssessment;

assessmentReport: AssessmentReport;
nonEnergyBenefits: Array<IdbNonEnergyBenefit>;
constructor(private assessmentIdbService: AssessmentIdbService,
private energyOpportunityIdbService: EnergyOpportunityIdbService,
private nonEnergyBenefitIdbService: NonEnergyBenefitsIdbService,
Expand All @@ -36,6 +37,7 @@ export class OnSiteAssessmentResultsComponent {
ngOnInit() {
this.assessmentSub = this.assessmentIdbService.selectedAssessment.subscribe(_assessment => {
this.assessment = _assessment;
this.nonEnergyBenefits = this.nonEnergyBenefitIdbService.getAssessmentNonEnergyBenefits(this.assessment.guid, false);
this.setAssessmentReport();
});
}
Expand All @@ -44,7 +46,7 @@ export class OnSiteAssessmentResultsComponent {
this.assessmentSub.unsubscribe();
}

setAssessmentReport(){
setAssessmentReport() {
let allEnergyOpportunities: Array<IdbEnergyOpportunity> = this.energyOpportunityIdbService.energyOpportunities.getValue();
let allNonEnergyBenefits: Array<IdbNonEnergyBenefit> = this.nonEnergyBenefitIdbService.nonEnergyBenefits.getValue();
let companyPerformanceMetrics: Array<KeyPerformanceMetric> = this.keyPerformanceIndicatorIdbService.getCompanyKeyPerformanceMetrics(this.assessment.companyId);
Expand Down
6 changes: 3 additions & 3 deletions src/app/shared/helper-pipes/_helper-pipes.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import { EquipmentTypeIconPipe } from './equipment-type-icon.pipe';
import { IncludesContactPipe } from './includes-contact.pipe';
import { AssessmentNameDisplayPipe } from './assessment-name-display.pipe';
import { ProcessEquipmentDisplayPipe } from './process-equipment-display.pipe';
import { NebDisplayPipe } from './neb-display.pipe';
import { NebItemPipe } from './neb-item.pipe';
import { OnSiteVisitListPipe } from './on-site-visit-list.pipe';
import { AssessmentListOnSitePipe } from './assessment-list-on-site.pipe';
import { NebListPipe } from './neb-list.pipe';
Expand Down Expand Up @@ -55,7 +55,7 @@ import { AssessmentItemPipe } from './assessment-item.pipe';
IncludesContactPipe,
AssessmentNameDisplayPipe,
ProcessEquipmentDisplayPipe,
NebDisplayPipe,
NebItemPipe,
OnSiteVisitListPipe,
AssessmentListOnSitePipe,
NebListPipe,
Expand Down Expand Up @@ -99,7 +99,7 @@ import { AssessmentItemPipe } from './assessment-item.pipe';
IncludesContactPipe,
AssessmentNameDisplayPipe,
ProcessEquipmentDisplayPipe,
NebDisplayPipe,
NebItemPipe,
OnSiteVisitListPipe,
AssessmentListOnSitePipe,
NebListPipe,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { NebDisplayPipe } from './neb-display.pipe';
import { NebItemPipe } from './neb-item.pipe';

describe('NebDisplayPipe', () => {
it('create an instance', () => {
const pipe = new NebDisplayPipe();
const pipe = new NebItemPipe();
expect(pipe).toBeTruthy();
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@ import { Pipe, PipeTransform } from '@angular/core';
import { IdbNonEnergyBenefit } from 'src/app/models/nonEnergyBenefit';

@Pipe({
name: 'nebDisplay',
name: 'nebItem',
pure: false
})
export class NebDisplayPipe implements PipeTransform {
export class NebItemPipe implements PipeTransform {

transform(guid: string, nonEnergyBenefits: Array<IdbNonEnergyBenefit>): string {
transform(guid: string, nonEnergyBenefits: Array<IdbNonEnergyBenefit>): IdbNonEnergyBenefit {
let neb: IdbNonEnergyBenefit = nonEnergyBenefits.find(neb =>{
return neb.guid == guid
});
if(neb){
return neb.name;
return neb;
}
return null;
}
Expand Down
3 changes: 3 additions & 0 deletions src/app/shared/label-with-tooltip/LabelTooltips.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,8 @@ export const LabelTooltips = {
},
"calculationMethod": {
"tooltip": "The method used to calculate impacts on the metric."
},
"associatedEEM": {
"tooltip": "Is this NEB realized because of the implementation of a specific energy efficiency opportunity?"
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<table class="table table-bordered savings-table table-hover">
<table class="table table-bordered savings-table table-hover" *ngIf="assessmentReport">
<thead>
<tr>
<th>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,3 @@
<h6 class="bold">Energy Opportunity Non-Energy Benefits</h6>
<p class="fw-light small">
The below are Non-Energy Benefits (<fa-icon [icon]="faWeightHanging"></fa-icon>) that
<span class="bold">are associated with a specific energy efficiency opportunity</span> within this
assessment.
To modify these NEBs navigate to the "Energy Efficiency Opportunities" tab.
</p>
<table class="table table-bordered table-hover table-sm">
<thead>
<tr>
Expand All @@ -30,7 +23,9 @@ <h6 class="bold">Energy Opportunity Non-Energy Benefits</h6>
<tr *ngFor="let nonEnergyBenefit of nonEnergyBenefits">
<td>
<fa-icon [icon]="faWeightHanging"></fa-icon>
{{nonEnergyBenefit.name}}
<a class="click-link" (click)="goToNeb(nonEnergyBenefit)">
{{nonEnergyBenefit.name}}
</a>
</td>
<td>
@let kpmImpacts = nonEnergyBenefit.guid | associatedPerformanceMetricImpacts:
Expand Down Expand Up @@ -58,9 +53,14 @@ <h6 class="bold">Energy Opportunity Non-Energy Benefits</h6>
</ng-template>
</td>
<td>
<a class="click-link" (click)="goToEnergyOpportunity(nonEnergyBenefit)">
{{nonEnergyBenefit.energyOpportunityId | energyOpportunityDisplay: energyOpportunities}}
</a>
<ng-template [ngIf]="nonEnergyBenefit.energyOpportunityId" [ngIfElse]="noOppBlock">
<a class="click-link" (click)="goToEnergyOpportunity(nonEnergyBenefit)">
{{nonEnergyBenefit.energyOpportunityId | energyOpportunityDisplay: energyOpportunities}}
</a>
</ng-template>
<ng-template #noOppBlock>
&mdash;
</ng-template>
</td>
<td>
<app-single-cell-item [numValue]="nonEnergyBenefit.guid | nebTotalSavings: keyPerformanceMetricImpacts"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import { Router } from '@angular/router';
import { IdbOnSiteVisit } from 'src/app/models/onSiteVisit';
import { OnSiteVisitIdbService } from 'src/app/indexed-db/on-site-visit-idb.service';
import { LocalStorageDataService } from '../../shared-services/local-storage-data.service';
import * as _ from 'lodash';

@Component({
selector: 'app-energy-opportunity-nebs-table',
Expand Down Expand Up @@ -50,6 +51,9 @@ export class EnergyOpportunityNebsTableComponent {
) { }

ngOnInit() {
this.nonEnergyBenefits = _.orderBy(this.nonEnergyBenefits, (neb: IdbNonEnergyBenefit) => {
return neb.energyOpportunityId;
}, 'desc')
this.keyPerformanceMetricImpactsSub = this.keyPerformanceMetricImpactsIdbService.keyPerformanceMetricImpacts.subscribe(kpmImpacts => {
this.keyPerformanceMetricImpacts = kpmImpacts;
});
Expand Down Expand Up @@ -86,4 +90,14 @@ export class EnergyOpportunityNebsTableComponent {
this.router.navigateByUrl('setup-wizard/data-collection/' + onSiteVisit.guid + '/assessment/' + nonEnergyBenefit.assessmentId + '/energy-opportunities')
}
}

goToNeb(nonEnergyBenefit: IdbNonEnergyBenefit) {
if (this.router.url.includes('portfolio')) {
this.router.navigateByUrl('/portfolio/assessment/' + nonEnergyBenefit.assessmentId + '/nebs/' + nonEnergyBenefit.guid)
} else if (this.router.url.includes('setup-wizard')) {
let onSiteVisit: IdbOnSiteVisit = this.onSiteVisitIdbService.getByAssessmentGUID(nonEnergyBenefit.assessmentId);
this.localStorageDataService.setNebAccordionGuid(nonEnergyBenefit.guid);
this.router.navigateByUrl('setup-wizard/data-collection/' + onSiteVisit.guid + '/assessment/' + nonEnergyBenefit.assessmentId + '/nebs')
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -111,40 +111,6 @@ <h6>
id="opportunityNotes"></textarea>
</div>
</div>

<!--NEBs-->
<h6>
<div class="d-flex w-100 justify-content-between">
<div class="mt-auto bold">
Non-Energy Benefits
</div>
<div class="dropdown">
<button class="btn btn-outline-neb btn-sm dropdown-toggle" type="button" data-bs-toggle="dropdown"
aria-expanded="false" (click)="toggleAddNebDropdown()">
<fa-icon [icon]="faPlus"></fa-icon> Add NEB
</button>
<ul class="dropdown-menu" [ngClass]="{'show': showAddNebDropdown}">
<li>
<a class="dropdown-item" (click)="addNEB()">
<fa-icon [icon]="faPlus"></fa-icon> Add Custom NEB
</a>
</li>
<li>
<a class="dropdown-item" (click)="showSuggestedNEBs()">
<fa-icon [icon]="faSearchPlus"></fa-icon> Search NEBs Database
</a>
</li>
</ul>
</div>
</div>
</h6>
<p class="fw-light small">
Use the "<fa-icon [icon]="faPlus"></fa-icon> Add NEB" dropdown to add Non-Energy Benefits
(<fa-icon [icon]="faWeightHanging"></fa-icon>) that are <span class="bold">directly
associated with this energy efficiency opportunity</span>.
</p>

<app-neb-forms-accordion [energyOpportunity]="energyOpportunity"></app-neb-forms-accordion>
</form>

<div [ngClass]="{'window-overlay': displayDeleteModal}"></div>
Expand Down
Loading

0 comments on commit 14b3b00

Please sign in to comment.