Commit 831930da authored by Aravind RK's avatar Aravind RK

feat : Combined all the evaluators evaluation and put it in a pdf

parent 9caafb31
...@@ -221,9 +221,13 @@ ...@@ -221,9 +221,13 @@
const interviews = await Interview.find({ candidateId: userId }) const interviews = await Interview.find({ candidateId: userId })
.populate('interviewerId', 'name email role') .populate('interviewerId', 'name email role')
.populate('assignedInterviewers', 'name email')
.populate('assignedHRs', 'name email')
.populate('assignedPMs', 'name email')
.populate('createdBy', 'name') .populate('createdBy', 'name')
.populate('decidedBy', 'name') .populate('decidedBy', 'name')
.populate('quizzes.quizId', 'title category difficulty timer totalQuestions') .populate('quizzes.quizId', 'title category difficulty timer totalQuestions')
.populate('evaluations.evaluatorId', 'name email role')
.sort({ createdAt: -1 }); .sort({ createdAt: -1 });
res.json({ user, interviews }); res.json({ user, interviews });
......
Initial chunk files | Names  |  Raw size | Estimated transfer size
chunk-MIRC6W6E.js  | -  | 246.95 kB |  67.80 kB
styles-4EG7DNWJ.css | styles  |  11.07 kB |  776 bytes
main-PZJZRLKZ.js  | main  |  2.51 kB |  802 bytes
chunk-RTK3EC7A.js  | -  |  1.35 kB |  548 bytes
   | Initial total  | 261.89 kB |  69.92 kB
Lazy chunk files  | Names  |  Raw size | Estimated transfer size
chunk-ZWSSD7ZD.js  | -  |  29.23 kB |  6.50 kB
chunk-F5TCWNSW.js  | generate-quiz  |  14.44 kB |  3.89 kB
chunk-T4IU55DP.js  | take-quiz  |  13.50 kB |  3.73 kB
chunk-GPZWIEOZ.js  | results  |  12.05 kB |  3.13 kB
chunk-D642GFQ6.js  | submission-detail |  11.32 kB |  3.04 kB
chunk-7KH36PB3.js  | profile  |  11.30 kB |  3.03 kB
chunk-JIQZZPSH.js  | user-history  |  10.56 kB |  2.90 kB
chunk-NDRVNEE6.js  | dashboard  |  9.60 kB |  2.70 kB
chunk-5TGG3WZ6.js  | users  |  9.40 kB |  2.56 kB
chunk-RPGMXBIO.js  | register  |  8.49 kB |  2.47 kB
chunk-JD4GHZ43.js  | login  |  7.61 kB |  2.33 kB
chunk-DX5QOEI4.js  | dashboard  |  7.39 kB |  1.99 kB
chunk-CJBJHMWZ.js  | -  |  1.25 kB |  412 bytes
Application bundle generation complete. [3.660 seconds] - 2026-04-07T13:08:03.882Z
▲ [WARNING] src/app/pages/admin/users/users.css exceeded maximum budget. Budget 4.00 kB was not met by 283 bytes with a total of 4.28 kB.
▲ [WARNING] src/app/pages/admin/submission-detail/submission-detail.css exceeded maximum budget. Budget 4.00 kB was not met by 746 bytes with a total of 4.75 kB.
▲ [WARNING] src/app/pages/admin/user-history/user-history.css exceeded maximum budget. Budget 4.00 kB was not met by 582 bytes with a total of 4.58 kB.
▲ [WARNING] src/app/pages/student/results/results.css exceeded maximum budget. Budget 4.00 kB was not met by 1.11 kB with a total of 5.12 kB.
▲ [WARNING] src/app/pages/student/dashboard/dashboard.css exceeded maximum budget. Budget 4.00 kB was not met by 364 bytes with a total of 4.36 kB.
▲ [WARNING] src/app/pages/admin/generate-quiz/generate-quiz.css exceeded maximum budget. Budget 4.00 kB was not met by 1.71 kB with a total of 5.71 kB.
▲ [WARNING] src/app/pages/student/profile/profile.css exceeded maximum budget. Budget 4.00 kB was not met by 937 bytes with a total of 4.94 kB.
▲ [WARNING] src/app/pages/student/take-quiz/take-quiz.css exceeded maximum budget. Budget 4.00 kB was not met by 1.05 kB with a total of 5.05 kB.

Output location: C:\Users\Ramesh\Aravind\Studies\intern\Evaluation_App3\Frontend\dist\quiz-app
> quiz-app@0.0.0 build
> ng build
❯ Building...
✔ Building...
Initial chunk files | Names  |  Raw size | Estimated transfer size
chunk-MIRC6W6E.js  | -  | 246.95 kB |  67.80 kB
styles-4EG7DNWJ.css | styles  |  11.07 kB |  776 bytes
main-PZJZRLKZ.js  | main  |  2.51 kB |  802 bytes
chunk-RTK3EC7A.js  | -  |  1.35 kB |  548 bytes
   | Initial total  | 261.89 kB |  69.92 kB
Lazy chunk files  | Names  |  Raw size | Estimated transfer size
chunk-ZWSSD7ZD.js  | -  |  29.23 kB |  6.50 kB
chunk-F5TCWNSW.js  | generate-quiz  |  14.44 kB |  3.89 kB
chunk-T4IU55DP.js  | take-quiz  |  13.50 kB |  3.73 kB
chunk-GPZWIEOZ.js  | results  |  12.05 kB |  3.13 kB
chunk-D642GFQ6.js  | submission-detail |  11.32 kB |  3.04 kB
chunk-7KH36PB3.js  | profile  |  11.30 kB |  3.03 kB
chunk-JIQZZPSH.js  | user-history  |  10.56 kB |  2.90 kB
chunk-NDRVNEE6.js  | dashboard  |  9.60 kB |  2.70 kB
chunk-5TGG3WZ6.js  | users  |  9.40 kB |  2.56 kB
chunk-RPGMXBIO.js  | register  |  8.49 kB |  2.47 kB
chunk-JD4GHZ43.js  | login  |  7.61 kB |  2.33 kB
chunk-DX5QOEI4.js  | dashboard  |  7.39 kB |  1.99 kB
chunk-CJBJHMWZ.js  | -  |  1.25 kB |  412 bytes
Application bundle generation complete. [3.462 seconds] - 2026-04-07T13:09:03.363Z
Output location: C:\Users\Ramesh\Aravind\Studies\intern\Evaluation_App3\Frontend\dist\quiz-app
Binary files a/Frontend/build_output.txt and /dev/null differ Binary files a/Frontend/build_output.txt and /dev/null differ
...@@ -116,7 +116,7 @@ ...@@ -116,7 +116,7 @@
<span>Select a candidate to evaluate</span> <span>Select a candidate to evaluate</span>
</div> </div>
@for (m of g.members; track m._id) { @for (m of g.members; track m._id) {
<div class="qep-row" [class.qep-done]="!needsEvaluation(m)"> <div class="qep-row" [class.qep-done]="!['quiz_phase', 'coding_phase'].includes(m.status) && !needsEvaluation(m)">
<div class="qep-candidate"> <div class="qep-candidate">
<div class="qep-avatar" [ngClass]="getStatusClass(m.status)"> <div class="qep-avatar" [ngClass]="getStatusClass(m.status)">
{{ m.candidateId?.name?.charAt(0)?.toUpperCase() }} {{ m.candidateId?.name?.charAt(0)?.toUpperCase() }}
...@@ -127,7 +127,12 @@ ...@@ -127,7 +127,12 @@
</div> </div>
</div> </div>
<div class="qep-action"> <div class="qep-action">
@if (needsEvaluation(m)) { @if (['quiz_phase', 'coding_phase'].includes(m.status)) {
<span class="qep-pending-label" style="color:var(--text-muted); font-size:12px; font-weight:500; display:flex; align-items:center; gap:4px;">
<span class="material-symbols-rounded" style="font-size:16px;">hourglass_empty</span>
Pending
</span>
} @else if (needsEvaluation(m)) {
<button class="btn-evaluate" (click)="openMemberDetail(m._id, $event)"> <button class="btn-evaluate" (click)="openMemberDetail(m._id, $event)">
<span class="material-symbols-rounded">rate_review</span> <span class="material-symbols-rounded">rate_review</span>
Evaluate Evaluate
......
...@@ -116,7 +116,7 @@ ...@@ -116,7 +116,7 @@
<span>Select a candidate to evaluate</span> <span>Select a candidate to evaluate</span>
</div> </div>
@for (m of g.members; track m._id) { @for (m of g.members; track m._id) {
<div class="qep-row" [class.qep-done]="!needsEvaluation(m)"> <div class="qep-row" [class.qep-done]="!['quiz_phase', 'coding_phase'].includes(m.status) && !needsEvaluation(m)">
<div class="qep-candidate"> <div class="qep-candidate">
<div class="qep-avatar" [ngClass]="getStatusClass(m.status)"> <div class="qep-avatar" [ngClass]="getStatusClass(m.status)">
{{ m.candidateId?.name?.charAt(0)?.toUpperCase() }} {{ m.candidateId?.name?.charAt(0)?.toUpperCase() }}
...@@ -127,7 +127,12 @@ ...@@ -127,7 +127,12 @@
</div> </div>
</div> </div>
<div class="qep-action"> <div class="qep-action">
@if (needsEvaluation(m)) { @if (['quiz_phase', 'coding_phase'].includes(m.status)) {
<span class="qep-pending-label" style="color:var(--text-muted); font-size:12px; font-weight:500; display:flex; align-items:center; gap:4px;">
<span class="material-symbols-rounded" style="font-size:16px;">hourglass_empty</span>
Pending
</span>
} @else if (needsEvaluation(m)) {
<button class="btn-evaluate" (click)="openMemberDetail(m._id, $event)"> <button class="btn-evaluate" (click)="openMemberDetail(m._id, $event)">
<span class="material-symbols-rounded">rate_review</span> <span class="material-symbols-rounded">rate_review</span>
Evaluate Evaluate
......
...@@ -116,7 +116,7 @@ ...@@ -116,7 +116,7 @@
<span>Select a candidate to evaluate</span> <span>Select a candidate to evaluate</span>
</div> </div>
@for (m of g.members; track m._id) { @for (m of g.members; track m._id) {
<div class="qep-row" [class.qep-done]="!needsEvaluation(m)"> <div class="qep-row" [class.qep-done]="!['quiz_phase', 'coding_phase'].includes(m.status) && !needsEvaluation(m)">
<div class="qep-candidate"> <div class="qep-candidate">
<div class="qep-avatar" [ngClass]="getStatusClass(m.status)"> <div class="qep-avatar" [ngClass]="getStatusClass(m.status)">
{{ m.candidateId?.name?.charAt(0)?.toUpperCase() }} {{ m.candidateId?.name?.charAt(0)?.toUpperCase() }}
...@@ -127,7 +127,12 @@ ...@@ -127,7 +127,12 @@
</div> </div>
</div> </div>
<div class="qep-action"> <div class="qep-action">
@if (needsEvaluation(m)) { @if (['quiz_phase', 'coding_phase'].includes(m.status)) {
<span class="qep-pending-label" style="color:var(--text-muted); font-size:12px; font-weight:500; display:flex; align-items:center; gap:4px;">
<span class="material-symbols-rounded" style="font-size:16px;">hourglass_empty</span>
Pending
</span>
} @else if (needsEvaluation(m)) {
<button class="btn-evaluate" (click)="openMemberDetail(m._id, $event)"> <button class="btn-evaluate" (click)="openMemberDetail(m._id, $event)">
<span class="material-symbols-rounded">rate_review</span> <span class="material-symbols-rounded">rate_review</span>
Evaluate Evaluate
...@@ -268,7 +273,7 @@ ...@@ -268,7 +273,7 @@
<span class="material-symbols-rounded">quiz</span> Quiz Configuration <span class="material-symbols-rounded">quiz</span> Quiz Configuration
@if (quizSets.length > 0) { @if (quizSets.length > 0) {
<button class="btn btn-outline btn-sm" style="margin-left: auto;" (click)="addMoreSet()"> <button class="btn btn-outline btn-sm" style="margin-left: auto;" (click)="addMoreSet()">
<span class="material-symbols-rounded">add</span> Add Set <span class="material-symbols-rounded">add</span> Add Quiz
</button> </button>
} }
</div> </div>
...@@ -276,7 +281,7 @@ ...@@ -276,7 +281,7 @@
@if (quizSets.length === 0 && !showQuizSetup) { @if (quizSets.length === 0 && !showQuizSetup) {
<div class="quiz-empty-hint"> <div class="quiz-empty-hint">
<span class="material-symbols-rounded">quiz</span> <span class="material-symbols-rounded">quiz</span>
<p>No quiz sets configured yet.</p> <p>No quizzes configured yet.</p>
<button class="btn btn-primary" (click)="showQuizSetup = true"> <button class="btn btn-primary" (click)="showQuizSetup = true">
<span class="material-symbols-rounded">add</span> Add Quiz <span class="material-symbols-rounded">add</span> Add Quiz
</button> </button>
...@@ -286,7 +291,7 @@ ...@@ -286,7 +291,7 @@
@if (showQuizSetup) { @if (showQuizSetup) {
<div class="quiz-setup-prompt"> <div class="quiz-setup-prompt">
<span class="material-symbols-rounded">help_outline</span> <span class="material-symbols-rounded">help_outline</span>
<span>How many quiz sets?</span> <span>How many quizzes?</span>
<input type="number" min="1" max="10" class="sets-count-input" <input type="number" min="1" max="10" class="sets-count-input"
[(ngModel)]="pendingSetsCount" placeholder="e.g. 2"> [(ngModel)]="pendingSetsCount" placeholder="e.g. 2">
<button class="btn btn-primary btn-sm" (click)="confirmSetsCount()">Confirm</button> <button class="btn btn-primary btn-sm" (click)="confirmSetsCount()">Confirm</button>
...@@ -299,11 +304,11 @@ ...@@ -299,11 +304,11 @@
<div class="quiz-set-block"> <div class="quiz-set-block">
<div class="quiz-set-header"> <div class="quiz-set-header">
<div class="quiz-set-title"> <div class="quiz-set-title">
<span class="set-badge">Set {{ si + 1 }}</span> <span class="set-badge">Quiz {{ si + 1 }}</span>
@if (isSingleQuizSet(set)) { @if (isSingleQuizSet(set)) {
<span class="set-note">📌 Assigned to all candidates</span> <span class="set-note">📌 Assigned to all candidates</span>
} @else if (isMultiQuizSet(set)) { } @else if (isMultiQuizSet(set)) {
<span class="set-note">🎯 {{ validEntries(set).length }} quizzes · {{ set.mode === 'random' ? '🎲 Random' : 'Direct' }} assignment</span> <span class="set-note">🎯 {{ validEntries(set).length }} sets · {{ set.mode === 'random' ? '🎲 Random' : 'Direct' }} assignment</span>
} }
</div> </div>
<button class="icon-btn danger" (click)="removeQuizSet(si)"> <button class="icon-btn danger" (click)="removeQuizSet(si)">
...@@ -315,7 +320,7 @@ ...@@ -315,7 +320,7 @@
@for (entry of set.quizEntries; track $index; let ei = $index) { @for (entry of set.quizEntries; track $index; let ei = $index) {
<div class="quiz-entry-row"> <div class="quiz-entry-row">
<select class="form-input" [(ngModel)]="entry.quizId"> <select class="form-input" [(ngModel)]="entry.quizId">
<option value="">— Select quiz</option> <option value="">— Select set</option>
@for (q of getAvailableQuizzes(si, ei); track q._id) { @for (q of getAvailableQuizzes(si, ei); track q._id) {
<option [value]="q._id">{{ q.title }}</option> <option [value]="q._id">{{ q.title }}</option>
} }
...@@ -327,7 +332,7 @@ ...@@ -327,7 +332,7 @@
} }
<button class="btn btn-ghost btn-sm" (click)="addQuizToSet(si)"> <button class="btn btn-ghost btn-sm" (click)="addQuizToSet(si)">
<span class="material-symbols-rounded">add</span> Add quiz to Set {{ si + 1 }} <span class="material-symbols-rounded">add</span> Add set to Quiz {{ si + 1 }}
</button> </button>
<!-- Assignment mode — only shown when multiple quizzes --> <!-- Assignment mode — only shown when multiple quizzes -->
......
...@@ -127,7 +127,7 @@ export class GroupInterviewComponent implements OnInit { ...@@ -127,7 +127,7 @@ export class GroupInterviewComponent implements OnInit {
this.hrs.set(staff.filter((s: any) => s.role === 'hr')); this.hrs.set(staff.filter((s: any) => s.role === 'hr'));
} }
}); });
this.quizService.getAdminQuizzes().subscribe({ next: r => this.quizzes.set(r.quizzes || []) }); this.quizService.getQuizzes().subscribe({ next: r => this.quizzes.set(r.quizzes || []) });
this.showCreateModal.set(true); this.showCreateModal.set(true);
} }
......
...@@ -118,11 +118,18 @@ ...@@ -118,11 +118,18 @@
</span> </span>
</td> </td>
<td class="date-cell">{{ interview.dateOfInterview | date:'dd MMM yyyy' }}</td> <td class="date-cell">{{ interview.dateOfInterview | date:'dd MMM yyyy' }}</td>
<td> <td>
<button class="view-btn" (click)="selectInterview(interview)"> <div style="display:flex;gap:8px;align-items:center;flex-wrap:wrap;">
View Quizzes <span class="material-symbols-rounded" style="font-size:16px;vertical-align:middle;">arrow_forward</span> <button class="view-btn" (click)="selectInterview(interview)">
</button> View Quizzes <span class="material-symbols-rounded" style="font-size:16px;vertical-align:middle;">arrow_forward</span>
</td> </button>
@if (hasEvaluations(interview)) {
<button class="view-btn" style="background:var(--accent,#4472C4);color:#fff;border-color:#3360b0;" (click)="downloadEvaluationForm(interview)">
<span class="material-symbols-rounded" style="font-size:16px;vertical-align:middle;">download</span> Eval Form
</button>
}
</div>
</td>
</tr> </tr>
} }
</tbody> </tbody>
......
...@@ -116,7 +116,7 @@ ...@@ -116,7 +116,7 @@
<span>Select a candidate to evaluate</span> <span>Select a candidate to evaluate</span>
</div> </div>
@for (m of g.members; track m._id) { @for (m of g.members; track m._id) {
<div class="qep-row" [class.qep-done]="!needsEvaluation(m)"> <div class="qep-row" [class.qep-done]="!['quiz_phase', 'coding_phase'].includes(m.status) && !needsEvaluation(m)">
<div class="qep-candidate"> <div class="qep-candidate">
<div class="qep-avatar" [ngClass]="getStatusClass(m.status)"> <div class="qep-avatar" [ngClass]="getStatusClass(m.status)">
{{ m.candidateId?.name?.charAt(0)?.toUpperCase() }} {{ m.candidateId?.name?.charAt(0)?.toUpperCase() }}
...@@ -127,7 +127,12 @@ ...@@ -127,7 +127,12 @@
</div> </div>
</div> </div>
<div class="qep-action"> <div class="qep-action">
@if (needsEvaluation(m)) { @if (['quiz_phase', 'coding_phase'].includes(m.status)) {
<span class="qep-pending-label" style="color:var(--text-muted); font-size:12px; font-weight:500; display:flex; align-items:center; gap:4px;">
<span class="material-symbols-rounded" style="font-size:16px;">hourglass_empty</span>
Pending
</span>
} @else if (needsEvaluation(m)) {
<button class="btn-evaluate" (click)="openMemberDetail(m._id, $event)"> <button class="btn-evaluate" (click)="openMemberDetail(m._id, $event)">
<span class="material-symbols-rounded">rate_review</span> <span class="material-symbols-rounded">rate_review</span>
Evaluate Evaluate
...@@ -269,7 +274,7 @@ ...@@ -269,7 +274,7 @@
<span class="material-symbols-rounded">quiz</span> Quiz Configuration <span class="material-symbols-rounded">quiz</span> Quiz Configuration
@if (quizSets.length > 0) { @if (quizSets.length > 0) {
<button class="btn btn-outline btn-sm" style="margin-left: auto;" (click)="addMoreSet()"> <button class="btn btn-outline btn-sm" style="margin-left: auto;" (click)="addMoreSet()">
<span class="material-symbols-rounded">add</span> Add Set <span class="material-symbols-rounded">add</span> Add Quiz
</button> </button>
} }
</div> </div>
...@@ -277,7 +282,7 @@ ...@@ -277,7 +282,7 @@
@if (quizSets.length === 0 && !showQuizSetup) { @if (quizSets.length === 0 && !showQuizSetup) {
<div class="quiz-empty-hint"> <div class="quiz-empty-hint">
<span class="material-symbols-rounded">quiz</span> <span class="material-symbols-rounded">quiz</span>
<p>No quiz sets configured yet.</p> <p>No quizzes configured yet.</p>
<button class="btn btn-primary" (click)="showQuizSetup = true"> <button class="btn btn-primary" (click)="showQuizSetup = true">
<span class="material-symbols-rounded">add</span> Add Quiz <span class="material-symbols-rounded">add</span> Add Quiz
</button> </button>
...@@ -287,7 +292,7 @@ ...@@ -287,7 +292,7 @@
@if (showQuizSetup) { @if (showQuizSetup) {
<div class="quiz-setup-prompt"> <div class="quiz-setup-prompt">
<span class="material-symbols-rounded">help_outline</span> <span class="material-symbols-rounded">help_outline</span>
<span>How many quiz sets?</span> <span>How many quizzes?</span>
<input type="number" min="1" max="10" class="sets-count-input" <input type="number" min="1" max="10" class="sets-count-input"
[(ngModel)]="pendingSetsCount" placeholder="e.g. 2"> [(ngModel)]="pendingSetsCount" placeholder="e.g. 2">
<button class="btn btn-primary btn-sm" (click)="confirmSetsCount()">Confirm</button> <button class="btn btn-primary btn-sm" (click)="confirmSetsCount()">Confirm</button>
...@@ -300,11 +305,11 @@ ...@@ -300,11 +305,11 @@
<div class="quiz-set-block"> <div class="quiz-set-block">
<div class="quiz-set-header"> <div class="quiz-set-header">
<div class="quiz-set-title"> <div class="quiz-set-title">
<span class="set-badge">Set {{ si + 1 }}</span> <span class="set-badge">Quiz {{ si + 1 }}</span>
@if (isSingleQuizSet(set)) { @if (isSingleQuizSet(set)) {
<span class="set-note">📌 Assigned to all candidates</span> <span class="set-note">📌 Assigned to all candidates</span>
} @else if (isMultiQuizSet(set)) { } @else if (isMultiQuizSet(set)) {
<span class="set-note">🎯 {{ validEntries(set).length }} quizzes · {{ set.mode === 'random' ? '🎲 Random' : 'Direct' }} assignment</span> <span class="set-note">🎯 {{ validEntries(set).length }} sets · {{ set.mode === 'random' ? '🎲 Random' : 'Direct' }} assignment</span>
} }
</div> </div>
<button class="icon-btn danger" (click)="removeQuizSet(si)"> <button class="icon-btn danger" (click)="removeQuizSet(si)">
...@@ -316,7 +321,7 @@ ...@@ -316,7 +321,7 @@
@for (entry of set.quizEntries; track $index; let ei = $index) { @for (entry of set.quizEntries; track $index; let ei = $index) {
<div class="quiz-entry-row"> <div class="quiz-entry-row">
<select class="form-input" [(ngModel)]="entry.quizId"> <select class="form-input" [(ngModel)]="entry.quizId">
<option value="">— Select quiz</option> <option value="">— Select set</option>
@for (q of getAvailableQuizzes(si, ei); track q._id) { @for (q of getAvailableQuizzes(si, ei); track q._id) {
<option [value]="q._id">{{ q.title }}</option> <option [value]="q._id">{{ q.title }}</option>
} }
...@@ -328,7 +333,7 @@ ...@@ -328,7 +333,7 @@
} }
<button class="btn btn-ghost btn-sm" (click)="addQuizToSet(si)"> <button class="btn btn-ghost btn-sm" (click)="addQuizToSet(si)">
<span class="material-symbols-rounded">add</span> Add quiz to Set {{ si + 1 }} <span class="material-symbols-rounded">add</span> Add set to Quiz {{ si + 1 }}
</button> </button>
<!-- Assignment mode — only shown when multiple quizzes --> <!-- Assignment mode — only shown when multiple quizzes -->
......
...@@ -127,7 +127,7 @@ export class HRGroupInterviewComponent implements OnInit { ...@@ -127,7 +127,7 @@ export class HRGroupInterviewComponent implements OnInit {
this.hrs.set(staff.filter((s: any) => s.role === 'hr')); this.hrs.set(staff.filter((s: any) => s.role === 'hr'));
} }
}); });
this.quizService.getAdminQuizzes().subscribe({ next: r => this.quizzes.set(r.quizzes || []) }); this.quizService.getQuizzes().subscribe({ next: r => this.quizzes.set(r.quizzes || []) });
this.showCreateModal.set(true); this.showCreateModal.set(true);
} }
......
...@@ -118,11 +118,18 @@ ...@@ -118,11 +118,18 @@
</span> </span>
</td> </td>
<td class="date-cell">{{ interview.dateOfInterview | date:'dd MMM yyyy' }}</td> <td class="date-cell">{{ interview.dateOfInterview | date:'dd MMM yyyy' }}</td>
<td> <td>
<button class="view-btn" (click)="selectInterview(interview)"> <div style="display:flex;gap:8px;align-items:center;flex-wrap:wrap;">
View Quizzes <span class="material-symbols-rounded" style="font-size:16px;vertical-align:middle;">arrow_forward</span> <button class="view-btn" (click)="selectInterview(interview)">
</button> View Quizzes <span class="material-symbols-rounded" style="font-size:16px;vertical-align:middle;">arrow_forward</span>
</td> </button>
@if (hasEvaluations(interview)) {
<button class="view-btn" style="background:var(--accent,#4472C4);color:#fff;border-color:#3360b0;" (click)="downloadEvaluationForm(interview)">
<span class="material-symbols-rounded" style="font-size:16px;vertical-align:middle;">download</span> Eval Form
</button>
}
</div>
</td>
</tr> </tr>
} }
</tbody> </tbody>
......
...@@ -214,6 +214,10 @@ ...@@ -214,6 +214,10 @@
return this.adminUrl; return this.adminUrl;
} }
getQuizzes(): Observable<any> {
return this.http.get(`${this.getBaseUrl()}/quizzes`);
}
createGroup(name: string): Observable<any> { createGroup(name: string): Observable<any> {
return this.http.post(`${this.getBaseUrl()}/groups`, { name }); return this.http.post(`${this.getBaseUrl()}/groups`, { name });
} }
......
This diff is collapsed.
logo.jpeg

10.5 KB

Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment