diff --git a/client/src/app/components/constraint-summary-view/constraint-summary.component.html b/client/src/app/components/constraint-summary-view/constraint-summary.component.html index cf9b708d..abcc9dcb 100644 --- a/client/src/app/components/constraint-summary-view/constraint-summary.component.html +++ b/client/src/app/components/constraint-summary-view/constraint-summary.component.html @@ -13,6 +13,18 @@

Constraint Summary

Add Constraint + + @if (isCompanyGreedyMode) { +
+
Greedy Matching Strategy
+
+ The system builds matches step by step by selecting the best currently available option. Participants are + organized into priority tiers, and higher-priority candidates are matched first. This makes the process fast + and efficient for larger datasets, but because each decision is made locally, the final allocation may not + always be the globally optimal solution. +
+
+ } @if (constraintWrappers.length) {
diff --git a/client/src/app/components/constraint-summary-view/constraint-summary.component.scss b/client/src/app/components/constraint-summary-view/constraint-summary.component.scss index 9d45b299..fcb64a61 100644 --- a/client/src/app/components/constraint-summary-view/constraint-summary.component.scss +++ b/client/src/app/components/constraint-summary-view/constraint-summary.component.scss @@ -39,3 +39,12 @@ th { } } } + +.greedy-strategy-note { + padding: 0.875rem 1rem; + border: 1px solid $border-color; + border-radius: 0.5rem; + background: $accent-color-light; + color: $text-color; + line-height: 1.5; +} \ No newline at end of file diff --git a/client/src/app/components/constraint-summary-view/constraint-summary.component.ts b/client/src/app/components/constraint-summary-view/constraint-summary.component.ts index 54214123..0b5a8c85 100644 --- a/client/src/app/components/constraint-summary-view/constraint-summary.component.ts +++ b/client/src/app/components/constraint-summary-view/constraint-summary.component.ts @@ -24,8 +24,7 @@ import { ToastsService } from 'src/app/shared/services/toasts.service'; import { StudentSortService } from 'src/app/shared/services/student-sort.service'; import { ConstraintBuilderNationalityComponent } from '../constraint-builder-nationality/constraint-builder-nationality.component'; import { Subscription } from 'rxjs'; -import { MatchingRouterService } from 'src/app/shared/matching/matching-router.service'; -import { CourseIterationsService } from 'src/app/shared/data/course-iteration.service'; +import { MatchingMode, MatchingRouterService } from 'src/app/shared/matching/matching-router.service';import { CourseIterationsService } from 'src/app/shared/data/course-iteration.service'; @Component({ selector: 'app-constraint-summary', @@ -48,6 +47,7 @@ export class ConstraintSummaryComponent implements OverlayComponentData, OnInit, constraintWrappers: ConstraintWrapper[] = []; projects: Project[] = []; + matchingMode: MatchingMode; private subscription: Subscription; @@ -69,6 +69,13 @@ export class ConstraintSummaryComponent implements OverlayComponentData, OnInit, this.constraintWrappers = constraintWrappers; }); this.projects = this.projectsService.getProjects(); + this.matchingMode = this.matchingRouterService.getMatchingMode({ + students: this.studentsService.getStudents(), + projects: this.projects, + constraintWrappers: this.constraintWrappers, + locks: this.lockedStudentsService.getLocks(), + courseIteration: this.courseIterationsService.getCourseIteration(), + }); } ngOnDestroy(): void { @@ -120,4 +127,8 @@ export class ConstraintSummaryComponent implements OverlayComponentData, OnInit, this.constraintsService.setActive(id, active); this.constraintWrappers = this.constraintsService.getConstraints(); } + + get isCompanyGreedyMode(): boolean { + return this.matchingMode === 'company-greedy'; + } }