Is there a way to refactor the typescript in this component as to not duplicate the code for each coverage line? This is an angular component with an ngFor in the HTML template, using a different "GroupsView" depending on context.
<div *ngFor="let benefitGroup of medicalBenefitsGroupsView;">
</div>
<div *ngFor="let benefitGroup of dentalBenefitsGroupsView;">
</div>
<div *ngFor="let benefitGroup of visionBenefitsGroupsView;">
</div>
Ideally I'd like to use benefitsGroupsView for all 3 but I'm having trouble figuring this out without moving the filter logic to the template.
benefitGroups = benefitGroups
.filter((x) => x.benefits.length)
.sort((a, b) => a.benefitGroupName.localeCompare(b.benefitGroupName));
const medicalBenefitGroups = benefitGroups.filter((group) => {
return group.benefits.some((benefit) => benefit.coverageLineBenefits.some(b =>b .coverageLineId == 1));
});
const dentalBenefitGroups = benefitGroups.filter((group) => {
return group.benefits.some((benefit) => benefit.coverageLineBenefits.some(b =>b .coverageLineId == 2));
});
const visionBenefitGroups = benefitGroups.filter((group) => {
return group.benefits.some((benefit) => benefit.coverageLineBenefits.some(b =>b .coverageLineId == 3));
});
this.benefitsGroupsView = benefitGroups.map((group) => ({
value: group.benefitGroupId,
viewValue: group.benefitGroupName,
checked: group.benefits.every(b => b.isDisplayable),
coverageLineId: group.benefits[0].coverageLineBenefits[0].coverageLineId,
benefits: group.benefits
.sort((a, b) => a.benefitName.localeCompare(b.benefitName))
.map((b) => ({
value: b.benefitId,
viewValue: b.benefitName,
checked: b.isDisplayable,
groupValue: group.benefitGroupId,
})),
}));
this.medicalBenefitsGroupsView = medicalBenefitGroups.map((group) => ({
value: group.benefitGroupId,
viewValue: group.benefitGroupName,
checked: group.benefits.every(b => b.isDisplayable),
benefits: group.benefits
.sort((a, b) => a.benefitName.localeCompare(b.benefitName))
.map((b) => ({
value: b.benefitId,
viewValue: b.benefitName,
checked: b.isDisplayable,
groupValue: group.benefitGroupId,
})),
}));
this.dentalBenefitsGroupsView = dentalBenefitGroups.map((group) => ({
value: group.benefitGroupId,
viewValue: group.benefitGroupName,
checked: group.benefits.every(b => b.isDisplayable),
benefits: group.benefits
.sort((a, b) => a.benefitName.localeCompare(b.benefitName))
.map((b) => ({
value: b.benefitId,
viewValue: b.benefitName,
checked: b.isDisplayable,
groupValue: group.benefitGroupId,
})),
}));
this.visionBenefitsGroupsView = visionBenefitGroups.map((group) => ({
value: group.benefitGroupId,
viewValue: group.benefitGroupName,
checked: group.benefits.every(b => b.isDisplayable),
benefits: group.benefits
.sort((a, b) => a.benefitName.localeCompare(b.benefitName))
.map((b) => ({
value: b.benefitId,
viewValue: b.benefitName,
checked: b.isDisplayable,
groupValue: group.benefitGroupId,
})),
}));