Plan-Feature Matrix

Backend gap: no PlanFeature.svc/GetPlanFeatures endpoint exists, so cells start unset. Toggle cells to preview; edits are held client-side only until a persistence endpoint lands. In compare mode, rows differing across the selected plans are highlighted.
@if (compareMode()) {
Compare: @for (p of plans(); track p.PlanId) { }
} @if (loading()) {

Loading matrix…

} @else {
@for (p of visiblePlans(); track p.PlanId) { } @for (grp of groupedFeatures(); track grp.groupId) { @for (f of grp.feats; track f.FeatureId) { @for (p of visiblePlans(); track p.PlanId) { } } }
Feature{{ p.PlanCode }}
Group #{{ grp.groupId }}
{{ f.FeatureCode }} {{ f.FeatureName }} @if (cellState(p.PlanId, f.FeatureId) === true) { ✓ } @else if (cellState(p.PlanId, f.FeatureId) === false) { ✕ } @else { · }
}