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 @@
const interviews = await Interview.find({ candidateId: userId })
.populate('interviewerId', 'name email role')
.populate('assignedInterviewers', 'name email')
.populate('assignedHRs', 'name email')
.populate('assignedPMs', 'name email')
.populate('createdBy', 'name')
.populate('decidedBy', 'name')
.populate('quizzes.quizId', 'title category difficulty timer totalQuestions')
.populate('evaluations.evaluatorId', 'name email role')
.sort({ createdAt: -1 });
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
......@@ -116,7 +116,7 @@
<span>Select a candidate to evaluate</span>
</div>
@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-avatar" [ngClass]="getStatusClass(m.status)">
{{ m.candidateId?.name?.charAt(0)?.toUpperCase() }}
......@@ -127,7 +127,12 @@
</div>
</div>
<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)">
<span class="material-symbols-rounded">rate_review</span>
Evaluate
......
......@@ -116,7 +116,7 @@
<span>Select a candidate to evaluate</span>
</div>
@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-avatar" [ngClass]="getStatusClass(m.status)">
{{ m.candidateId?.name?.charAt(0)?.toUpperCase() }}
......@@ -127,7 +127,12 @@
</div>
</div>
<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)">
<span class="material-symbols-rounded">rate_review</span>
Evaluate
......
......@@ -116,7 +116,7 @@
<span>Select a candidate to evaluate</span>
</div>
@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-avatar" [ngClass]="getStatusClass(m.status)">
{{ m.candidateId?.name?.charAt(0)?.toUpperCase() }}
......@@ -127,7 +127,12 @@
</div>
</div>
<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)">
<span class="material-symbols-rounded">rate_review</span>
Evaluate
......@@ -268,7 +273,7 @@
<span class="material-symbols-rounded">quiz</span> Quiz Configuration
@if (quizSets.length > 0) {
<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>
}
</div>
......@@ -276,7 +281,7 @@
@if (quizSets.length === 0 && !showQuizSetup) {
<div class="quiz-empty-hint">
<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">
<span class="material-symbols-rounded">add</span> Add Quiz
</button>
......@@ -286,7 +291,7 @@
@if (showQuizSetup) {
<div class="quiz-setup-prompt">
<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"
[(ngModel)]="pendingSetsCount" placeholder="e.g. 2">
<button class="btn btn-primary btn-sm" (click)="confirmSetsCount()">Confirm</button>
......@@ -299,11 +304,11 @@
<div class="quiz-set-block">
<div class="quiz-set-header">
<div class="quiz-set-title">
<span class="set-badge">Set {{ si + 1 }}</span>
<span class="set-badge">Quiz {{ si + 1 }}</span>
@if (isSingleQuizSet(set)) {
<span class="set-note">📌 Assigned to all candidates</span>
} @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>
<button class="icon-btn danger" (click)="removeQuizSet(si)">
......@@ -315,7 +320,7 @@
@for (entry of set.quizEntries; track $index; let ei = $index) {
<div class="quiz-entry-row">
<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) {
<option [value]="q._id">{{ q.title }}</option>
}
......@@ -327,7 +332,7 @@
}
<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>
<!-- Assignment mode — only shown when multiple quizzes -->
......
......@@ -127,7 +127,7 @@ export class GroupInterviewComponent implements OnInit {
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);
}
......
......@@ -118,11 +118,18 @@
</span>
</td>
<td class="date-cell">{{ interview.dateOfInterview | date:'dd MMM yyyy' }}</td>
<td>
<button class="view-btn" (click)="selectInterview(interview)">
View Quizzes <span class="material-symbols-rounded" style="font-size:16px;vertical-align:middle;">arrow_forward</span>
</button>
</td>
<td>
<div style="display:flex;gap:8px;align-items:center;flex-wrap:wrap;">
<button class="view-btn" (click)="selectInterview(interview)">
View Quizzes <span class="material-symbols-rounded" style="font-size:16px;vertical-align:middle;">arrow_forward</span>
</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>
}
</tbody>
......
......@@ -116,7 +116,7 @@
<span>Select a candidate to evaluate</span>
</div>
@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-avatar" [ngClass]="getStatusClass(m.status)">
{{ m.candidateId?.name?.charAt(0)?.toUpperCase() }}
......@@ -127,7 +127,12 @@
</div>
</div>
<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)">
<span class="material-symbols-rounded">rate_review</span>
Evaluate
......@@ -269,7 +274,7 @@
<span class="material-symbols-rounded">quiz</span> Quiz Configuration
@if (quizSets.length > 0) {
<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>
}
</div>
......@@ -277,7 +282,7 @@
@if (quizSets.length === 0 && !showQuizSetup) {
<div class="quiz-empty-hint">
<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">
<span class="material-symbols-rounded">add</span> Add Quiz
</button>
......@@ -287,7 +292,7 @@
@if (showQuizSetup) {
<div class="quiz-setup-prompt">
<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"
[(ngModel)]="pendingSetsCount" placeholder="e.g. 2">
<button class="btn btn-primary btn-sm" (click)="confirmSetsCount()">Confirm</button>
......@@ -300,11 +305,11 @@
<div class="quiz-set-block">
<div class="quiz-set-header">
<div class="quiz-set-title">
<span class="set-badge">Set {{ si + 1 }}</span>
<span class="set-badge">Quiz {{ si + 1 }}</span>
@if (isSingleQuizSet(set)) {
<span class="set-note">📌 Assigned to all candidates</span>
} @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>
<button class="icon-btn danger" (click)="removeQuizSet(si)">
......@@ -316,7 +321,7 @@
@for (entry of set.quizEntries; track $index; let ei = $index) {
<div class="quiz-entry-row">
<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) {
<option [value]="q._id">{{ q.title }}</option>
}
......@@ -328,7 +333,7 @@
}
<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>
<!-- Assignment mode — only shown when multiple quizzes -->
......
......@@ -127,7 +127,7 @@ export class HRGroupInterviewComponent implements OnInit {
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);
}
......
......@@ -118,11 +118,18 @@
</span>
</td>
<td class="date-cell">{{ interview.dateOfInterview | date:'dd MMM yyyy' }}</td>
<td>
<button class="view-btn" (click)="selectInterview(interview)">
View Quizzes <span class="material-symbols-rounded" style="font-size:16px;vertical-align:middle;">arrow_forward</span>
</button>
</td>
<td>
<div style="display:flex;gap:8px;align-items:center;flex-wrap:wrap;">
<button class="view-btn" (click)="selectInterview(interview)">
View Quizzes <span class="material-symbols-rounded" style="font-size:16px;vertical-align:middle;">arrow_forward</span>
</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>
}
</tbody>
......
......@@ -214,6 +214,10 @@
return this.adminUrl;
}
getQuizzes(): Observable<any> {
return this.http.get(`${this.getBaseUrl()}/quizzes`);
}
createGroup(name: string): Observable<any> {
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