Commit 3affc117 authored by Aravind RK's avatar Aravind RK

refactor: Name changed to HIRE Guru

parent 9a0f25a3
...@@ -7,8 +7,8 @@ ...@@ -7,8 +7,8 @@
<span class="material-symbols-rounded">menu</span> <span class="material-symbols-rounded">menu</span>
</button> </button>
<span class="mobile-logo"> <span class="mobile-logo">
<span class="material-symbols-rounded filled">quiz</span> <span class="material-symbols-rounded filled">business_center</span>
QuizMaster Hire Guru
</span> </span>
<div class="mobile-actions"> <div class="mobile-actions">
<button class="icon-btn" (click)="toggleThemeMenu()"> <button class="icon-btn" (click)="toggleThemeMenu()">
...@@ -29,8 +29,8 @@ ...@@ -29,8 +29,8 @@
<!-- Logo --> <!-- Logo -->
<div class="sidebar-header"> <div class="sidebar-header">
<div class="logo"> <div class="logo">
<span class="material-symbols-rounded filled logo-icon">quiz</span> <span class="material-symbols-rounded filled logo-icon">business_center</span>
<span class="logo-text">QuizMaster</span> <span class="logo-text">Hire Guru</span>
</div> </div>
<span class="badge" [ngClass]="roleBadge().class">{{ roleBadge().label }}</span> <span class="badge" [ngClass]="roleBadge().class">{{ roleBadge().label }}</span>
</div> </div>
...@@ -235,7 +235,7 @@ ...@@ -235,7 +235,7 @@
<div class="confirm-icon-wrapper"> <div class="confirm-icon-wrapper">
<span class="material-symbols-rounded">logout</span> <span class="material-symbols-rounded">logout</span>
</div> </div>
<p class="confirm-text">Are you sure you want to sign out of QuizMaster?</p> <p class="confirm-text">Are you sure you want to sign out of Hire Guru?</p>
</div> </div>
<div class="confirm-modal-actions"> <div class="confirm-modal-actions">
......
...@@ -395,9 +395,6 @@ ...@@ -395,9 +395,6 @@
<div style="display: flex; gap: 8px; align-items: center;"> <div style="display: flex; gap: 8px; align-items: center;">
@if (allMemberEvaluationsDone()) { @if (allMemberEvaluationsDone()) {
<span class="badge badge-success">All evaluations done</span> <span class="badge badge-success">All evaluations done</span>
<button class="btn btn-primary btn-sm" (click)="downloadEvaluationPdf()">
@if (isPdfGenerating()) { <span class="spinner spinner-sm"></span> Generating... } @else { <span class="material-symbols-rounded" style="font-size: 16px; margin-right: 4px;">download</span> Download PDF }
</button>
} @else { } @else {
<span class="badge badge-warning">Evaluations pending</span> <span class="badge badge-warning">Evaluations pending</span>
} }
......
...@@ -53,7 +53,6 @@ export class InterviewerGroupInterviewComponent implements OnInit { ...@@ -53,7 +53,6 @@ export class InterviewerGroupInterviewComponent implements OnInit {
memberEvalComment = ''; memberEvalComment = '';
memberEvalRecommendation = ''; memberEvalRecommendation = '';
isMemberSubmitting = signal(false); isMemberSubmitting = signal(false);
isPdfGenerating = signal(false);
constructor(private quizService: QuizService, public authService: AuthService) {} constructor(private quizService: QuizService, public authService: AuthService) {}
...@@ -160,16 +159,6 @@ export class InterviewerGroupInterviewComponent implements OnInit { ...@@ -160,16 +159,6 @@ export class InterviewerGroupInterviewComponent implements OnInit {
return (m.evaluations?.length || 0) < total; return (m.evaluations?.length || 0) < total;
} }
downloadEvaluationPdf(): void {
const m = this.selectedMember();
if (!m) return;
this.isPdfGenerating.set(true);
setTimeout(() => {
window.print();
this.isPdfGenerating.set(false);
}, 500);
}
// -- Helpers ----------------------------------------------- // -- Helpers -----------------------------------------------
getStatusClass(status: string): string { getStatusClass(status: string): string {
const map: any = { const map: any = {
......
...@@ -23,7 +23,6 @@ export class InterviewerIndividualInterviewComponent implements OnInit { ...@@ -23,7 +23,6 @@ export class InterviewerIndividualInterviewComponent implements OnInit {
stats = signal<any>({ total: 0, pending: 0, completed: 0, accepted: 0, rejected: 0 }); stats = signal<any>({ total: 0, pending: 0, completed: 0, accepted: 0, rejected: 0 });
filterStatus = signal(''); filterStatus = signal('');
isSubmitting = signal(false); isSubmitting = signal(false);
isPdfGenerating = signal(false);
constructor(private quizService: QuizService, public authService: AuthService) {} constructor(private quizService: QuizService, public authService: AuthService) {}
...@@ -150,16 +149,6 @@ export class InterviewerIndividualInterviewComponent implements OnInit { ...@@ -150,16 +149,6 @@ export class InterviewerIndividualInterviewComponent implements OnInit {
return numEvaluations >= totalExpected; return numEvaluations >= totalExpected;
} }
downloadEvaluationPdf(): void {
const iv = this.selectedInterview();
if (!iv) return;
this.isPdfGenerating.set(true);
setTimeout(() => {
window.print();
this.isPdfGenerating.set(false);
}, 500);
}
getVisibleEvaluations(evaluations: any[]): any[] { getVisibleEvaluations(evaluations: any[]): any[] {
if (!evaluations) return []; if (!evaluations) return [];
const userId = this.authService.currentUser()?.id; const userId = this.authService.currentUser()?.id;
......
...@@ -395,9 +395,6 @@ ...@@ -395,9 +395,6 @@
<div style="display: flex; gap: 8px; align-items: center;"> <div style="display: flex; gap: 8px; align-items: center;">
@if (allMemberEvaluationsDone()) { @if (allMemberEvaluationsDone()) {
<span class="badge badge-success">All evaluations done</span> <span class="badge badge-success">All evaluations done</span>
<button class="btn btn-primary btn-sm" (click)="downloadEvaluationPdf()">
@if (isPdfGenerating()) { <span class="spinner spinner-sm"></span> Generating... } @else { <span class="material-symbols-rounded" style="font-size: 16px; margin-right: 4px;">download</span> Download PDF }
</button>
} @else { } @else {
<span class="badge badge-warning">Evaluations pending</span> <span class="badge badge-warning">Evaluations pending</span>
} }
......
...@@ -53,7 +53,6 @@ export class PMGroupInterviewComponent implements OnInit { ...@@ -53,7 +53,6 @@ export class PMGroupInterviewComponent implements OnInit {
memberEvalComment = ''; memberEvalComment = '';
memberEvalRecommendation = ''; memberEvalRecommendation = '';
isMemberSubmitting = signal(false); isMemberSubmitting = signal(false);
isPdfGenerating = signal(false);
constructor(private quizService: QuizService, public authService: AuthService) {} constructor(private quizService: QuizService, public authService: AuthService) {}
...@@ -160,16 +159,6 @@ export class PMGroupInterviewComponent implements OnInit { ...@@ -160,16 +159,6 @@ export class PMGroupInterviewComponent implements OnInit {
return (m.evaluations?.length || 0) < total; return (m.evaluations?.length || 0) < total;
} }
downloadEvaluationPdf(): void {
const m = this.selectedMember();
if (!m) return;
this.isPdfGenerating.set(true);
setTimeout(() => {
window.print();
this.isPdfGenerating.set(false);
}, 500);
}
// -- Helpers ----------------------------------------------- // -- Helpers -----------------------------------------------
getStatusClass(status: string): string { getStatusClass(status: string): string {
const map: any = { const map: any = {
......
...@@ -249,11 +249,6 @@ ...@@ -249,11 +249,6 @@
<div class="detail-section"> <div class="detail-section">
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px;"> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px;">
<h3 class="detail-section-title" style="margin: 0;">Evaluations</h3> <h3 class="detail-section-title" style="margin: 0;">Evaluations</h3>
@if (allEvaluationsDone()) {
<button class="btn btn-primary" (click)="downloadEvaluationPdf()">
@if (isPdfGenerating()) { <span class="spinner spinner-sm"></span> Generating... } @else { <span class="material-symbols-rounded">download</span> Download PDF }
</button>
}
</div> </div>
@if (getVisibleEvaluations(selectedInterview().evaluations).length > 0) { @if (getVisibleEvaluations(selectedInterview().evaluations).length > 0) {
<div class="eval-list"> <div class="eval-list">
......
...@@ -23,7 +23,6 @@ export class PMIndividualInterviewComponent implements OnInit { ...@@ -23,7 +23,6 @@ export class PMIndividualInterviewComponent implements OnInit {
stats = signal<any>({ total: 0, pending: 0, completed: 0, accepted: 0, rejected: 0 }); stats = signal<any>({ total: 0, pending: 0, completed: 0, accepted: 0, rejected: 0 });
filterStatus = signal(''); filterStatus = signal('');
isSubmitting = signal(false); isSubmitting = signal(false);
isPdfGenerating = signal(false);
constructor(private quizService: QuizService, public authService: AuthService) {} constructor(private quizService: QuizService, public authService: AuthService) {}
...@@ -150,16 +149,6 @@ export class PMIndividualInterviewComponent implements OnInit { ...@@ -150,16 +149,6 @@ export class PMIndividualInterviewComponent implements OnInit {
return numEvaluations >= totalExpected; return numEvaluations >= totalExpected;
} }
downloadEvaluationPdf(): void {
const iv = this.selectedInterview();
if (!iv) return;
this.isPdfGenerating.set(true);
setTimeout(() => {
window.print();
this.isPdfGenerating.set(false);
}, 500);
}
getVisibleEvaluations(evaluations: any[]): any[] { getVisibleEvaluations(evaluations: any[]): any[] {
if (!evaluations) return []; if (!evaluations) return [];
const userId = this.authService.currentUser()?.id; const userId = this.authService.currentUser()?.id;
......
<div class="dashboard-layout"> <div class="dashboard-layout">
<aside class="sidebar"> <aside class="sidebar">
<div class="sidebar-header"> <div class="sidebar-header">
<span class="logo-icon">📝</span> <span class="logo-icon">💼</span>
<h2>QuizMaster</h2><span class="role-badge">Admin</span> <h2>Hire Guru</h2><span class="role-badge">Admin</span>
</div> </div>
<nav class="sidebar-nav"> <nav class="sidebar-nav">
<a routerLink="/admin/dashboard" class="nav-item"><span class="nav-icon">🏠</span><span>Dashboard</span></a> <a routerLink="/admin/dashboard" class="nav-item"><span class="nav-icon">🏠</span><span>Dashboard</span></a>
......
...@@ -642,9 +642,6 @@ ...@@ -642,9 +642,6 @@
<div style="display: flex; gap: 8px; align-items: center;"> <div style="display: flex; gap: 8px; align-items: center;">
@if (allMemberEvaluationsDone()) { @if (allMemberEvaluationsDone()) {
<span class="badge badge-success">All evaluations done</span> <span class="badge badge-success">All evaluations done</span>
<button class="btn btn-primary btn-sm" (click)="downloadEvaluationPdf()">
@if (isPdfGenerating()) { <span class="spinner spinner-sm"></span> Generating... } @else { <span class="material-symbols-rounded" style="font-size: 16px; margin-right: 4px;">download</span> Download PDF }
</button>
} @else { } @else {
<span class="badge badge-warning">Evaluations pending</span> <span class="badge badge-warning">Evaluations pending</span>
} }
......
...@@ -347,20 +347,6 @@ export class GroupInterviewComponent implements OnInit { ...@@ -347,20 +347,6 @@ export class GroupInterviewComponent implements OnInit {
return (m.evaluations?.length || 0) < total; return (m.evaluations?.length || 0) < total;
} }
isPdfGenerating = signal(false);
downloadEvaluationPdf(): void {
const m = this.selectedMember();
if (!m) return;
this.isPdfGenerating.set(true);
setTimeout(() => {
window.print();
this.isPdfGenerating.set(false);
}, 500);
}
// ── Helpers ─────────────────────────────────────────────── // ── Helpers ───────────────────────────────────────────────
getStatusClass(status: string): string { getStatusClass(status: string): string {
const map: any = { const map: any = {
......
...@@ -139,7 +139,7 @@ ...@@ -139,7 +139,7 @@
<div class="quiz-select-grid" style="max-height: 120px; overflow-y: auto;"> <div class="quiz-select-grid" style="max-height: 120px; overflow-y: auto;">
@for (i of interviewers(); track i._id) { @for (i of interviewers(); track i._id) {
<label class="quiz-select-item" style="cursor: pointer;"> <label class="quiz-select-item" style="cursor: pointer;">
<input type="checkbox" [value]="i._id" (change)="toggleSelection($event, newInterview.assignedInterviewers)" style="margin-right: 8px;"> {{ i.name }} <input type="radio" [value]="i._id" (change)="toggleSelection($event, newInterview.assignedInterviewers)" style="margin-right: 8px;"> {{ i.name }}
</label> </label>
} }
@if (interviewers().length === 0) { <p class="text-muted" style="font-size: 12px;">No interviewers found</p> } @if (interviewers().length === 0) { <p class="text-muted" style="font-size: 12px;">No interviewers found</p> }
...@@ -150,7 +150,7 @@ ...@@ -150,7 +150,7 @@
<div class="quiz-select-grid" style="max-height: 120px; overflow-y: auto;"> <div class="quiz-select-grid" style="max-height: 120px; overflow-y: auto;">
@for (p of pms(); track p._id) { @for (p of pms(); track p._id) {
<label class="quiz-select-item" style="cursor: pointer;"> <label class="quiz-select-item" style="cursor: pointer;">
<input type="checkbox" [value]="p._id" (change)="toggleSelection($event, newInterview.assignedPMs)" style="margin-right: 8px;"> {{ p.name }} <input type="radio" [value]="p._id" (change)="toggleSelection($event, newInterview.assignedPMs)" style="margin-right: 8px;"> {{ p.name }}
</label> </label>
} }
@if (pms().length === 0) { <p class="text-muted" style="font-size: 12px;">No PMs found</p> } @if (pms().length === 0) { <p class="text-muted" style="font-size: 12px;">No PMs found</p> }
...@@ -161,7 +161,7 @@ ...@@ -161,7 +161,7 @@
<div class="quiz-select-grid" style="max-height: 120px; overflow-y: auto;"> <div class="quiz-select-grid" style="max-height: 120px; overflow-y: auto;">
@for (h of hrs(); track h._id) { @for (h of hrs(); track h._id) {
<label class="quiz-select-item" style="cursor: pointer;"> <label class="quiz-select-item" style="cursor: pointer;">
<input type="checkbox" [value]="h._id" (change)="toggleSelection($event, newInterview.assignedHRs)" style="margin-right: 8px;"> {{ h.name }} <input type="radio" [value]="h._id" (change)="toggleSelection($event, newInterview.assignedHRs)" style="margin-right: 8px;"> {{ h.name }}
</label> </label>
} }
@if (hrs().length === 0) { <p class="text-muted" style="font-size: 12px;">No HRs found</p> } @if (hrs().length === 0) { <p class="text-muted" style="font-size: 12px;">No HRs found</p> }
...@@ -357,11 +357,6 @@ ...@@ -357,11 +357,6 @@
<div class="detail-section"> <div class="detail-section">
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px;"> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px;">
<h3 class="detail-section-title" style="margin: 0;">Evaluations</h3> <h3 class="detail-section-title" style="margin: 0;">Evaluations</h3>
@if (allEvaluationsDone()) {
<button class="btn btn-primary" (click)="downloadEvaluationPdf()">
@if (isPdfGenerating()) { <span class="spinner spinner-sm"></span> Generating... } @else { <span class="material-symbols-rounded">download</span> Download PDF }
</button>
}
</div> </div>
@if (selectedInterview().evaluations?.length > 0) { @if (selectedInterview().evaluations?.length > 0) {
<div class="eval-list"> <div class="eval-list">
......
...@@ -250,8 +250,6 @@ export class IndividualInterviewComponent implements OnInit { ...@@ -250,8 +250,6 @@ export class IndividualInterviewComponent implements OnInit {
return interview.evaluations?.some((e: any) => e.evaluatorId?._id === userId); return interview.evaluations?.some((e: any) => e.evaluatorId?._id === userId);
} }
isPdfGenerating = signal(false);
getEvaluationByRole(role: string): any { getEvaluationByRole(role: string): any {
const iv = this.selectedInterview(); const iv = this.selectedInterview();
if (!iv || !iv.evaluations) return null; if (!iv || !iv.evaluations) return null;
...@@ -269,16 +267,4 @@ export class IndividualInterviewComponent implements OnInit { ...@@ -269,16 +267,4 @@ export class IndividualInterviewComponent implements OnInit {
const numEvaluations = iv.evaluations?.length || 0; const numEvaluations = iv.evaluations?.length || 0;
return numEvaluations >= totalExpected; return numEvaluations >= totalExpected;
} }
downloadEvaluationPdf(): void {
const iv = this.selectedInterview();
if (!iv) return;
this.isPdfGenerating.set(true);
setTimeout(() => {
window.print();
this.isPdfGenerating.set(false);
}, 500);
}
} }
...@@ -31,8 +31,8 @@ ...@@ -31,8 +31,8 @@
<div class="quiz-topbar"> <div class="quiz-topbar">
<div class="topbar-left"> <div class="topbar-left">
<div class="quiz-brand"> <div class="quiz-brand">
<span class="material-symbols-rounded filled brand-icon">quiz</span> <span class="material-symbols-rounded filled brand-icon">business_center</span>
<span class="brand-name">QuizMaster</span> <span class="brand-name">Hire Guru</span>
</div> </div>
<div class="topbar-divider"></div> <div class="topbar-divider"></div>
<div class="quiz-title-block"> <div class="quiz-title-block">
......
<div class="dashboard-layout"> <div class="dashboard-layout">
<aside class="sidebar"> <aside class="sidebar">
<div class="sidebar-header"> <div class="sidebar-header">
<span class="logo-icon">📝</span> <span class="logo-icon">💼</span>
<h2>QuizMaster</h2><span class="role-badge">Admin</span> <h2>Hire Guru</h2><span class="role-badge">Admin</span>
</div> </div>
<nav class="sidebar-nav"> <nav class="sidebar-nav">
<a routerLink="/admin/dashboard" class="nav-item"><span class="nav-icon">🏠</span><span>Dashboard</span></a> <a routerLink="/admin/dashboard" class="nav-item"><span class="nav-icon">🏠</span><span>Dashboard</span></a>
......
...@@ -191,7 +191,7 @@ ...@@ -191,7 +191,7 @@
<div class="checklist-box"> <div class="checklist-box">
@for (i of interviewers(); track i._id) { @for (i of interviewers(); track i._id) {
<label class="check-item"> <label class="check-item">
<input type="checkbox" [value]="i._id" <input type="radio" [value]="i._id"
(change)="toggleSelection($event, newGroupInterview.assignedInterviewers)"> (change)="toggleSelection($event, newGroupInterview.assignedInterviewers)">
<span>{{ i.name }}</span> <span>{{ i.name }}</span>
</label> </label>
...@@ -204,7 +204,7 @@ ...@@ -204,7 +204,7 @@
<div class="checklist-box"> <div class="checklist-box">
@for (h of hrs(); track h._id) { @for (h of hrs(); track h._id) {
<label class="check-item"> <label class="check-item">
<input type="checkbox" [value]="h._id" <input type="radio" [value]="h._id"
(change)="toggleSelection($event, newGroupInterview.assignedHRs)"> (change)="toggleSelection($event, newGroupInterview.assignedHRs)">
<span>{{ h.name }}</span> <span>{{ h.name }}</span>
</label> </label>
...@@ -217,7 +217,7 @@ ...@@ -217,7 +217,7 @@
<div class="checklist-box"> <div class="checklist-box">
@for (p of pms(); track p._id) { @for (p of pms(); track p._id) {
<label class="check-item"> <label class="check-item">
<input type="checkbox" [value]="p._id" <input type="radio" [value]="p._id"
(change)="toggleSelection($event, newGroupInterview.assignedPMs)"> (change)="toggleSelection($event, newGroupInterview.assignedPMs)">
<span>{{ p.name }}</span> <span>{{ p.name }}</span>
</label> </label>
...@@ -643,9 +643,6 @@ ...@@ -643,9 +643,6 @@
<div style="display: flex; gap: 8px; align-items: center;"> <div style="display: flex; gap: 8px; align-items: center;">
@if (allMemberEvaluationsDone()) { @if (allMemberEvaluationsDone()) {
<span class="badge badge-success">All evaluations done</span> <span class="badge badge-success">All evaluations done</span>
<button class="btn btn-primary btn-sm" (click)="downloadEvaluationPdf()">
@if (isPdfGenerating()) { <span class="spinner spinner-sm"></span> Generating... } @else { <span class="material-symbols-rounded" style="font-size: 16px; margin-right: 4px;">download</span> Download PDF }
</button>
} @else { } @else {
<span class="badge badge-warning">Evaluations pending</span> <span class="badge badge-warning">Evaluations pending</span>
} }
......
...@@ -349,20 +349,6 @@ export class HRGroupInterviewComponent implements OnInit { ...@@ -349,20 +349,6 @@ export class HRGroupInterviewComponent implements OnInit {
return (m.evaluations?.length || 0) < total; return (m.evaluations?.length || 0) < total;
} }
isPdfGenerating = signal(false);
downloadEvaluationPdf(): void {
const m = this.selectedMember();
if (!m) return;
this.isPdfGenerating.set(true);
setTimeout(() => {
window.print();
this.isPdfGenerating.set(false);
}, 500);
}
// ── Helpers ─────────────────────────────────────────────── // ── Helpers ───────────────────────────────────────────────
getStatusClass(status: string): string { getStatusClass(status: string): string {
const map: any = { const map: any = {
......
...@@ -139,7 +139,7 @@ ...@@ -139,7 +139,7 @@
<div class="quiz-select-grid" style="max-height: 120px; overflow-y: auto;"> <div class="quiz-select-grid" style="max-height: 120px; overflow-y: auto;">
@for (i of interviewers(); track i._id) { @for (i of interviewers(); track i._id) {
<label class="quiz-select-item" style="cursor: pointer;"> <label class="quiz-select-item" style="cursor: pointer;">
<input type="checkbox" [value]="i._id" (change)="toggleSelection($event, newInterview.assignedInterviewers)" style="margin-right: 8px;"> {{ i.name }} <input type="radio" [value]="i._id" (change)="toggleSelection($event, newInterview.assignedInterviewers)" style="margin-right: 8px;"> {{ i.name }}
</label> </label>
} }
@if (interviewers().length === 0) { <p class="text-muted" style="font-size: 12px;">No interviewers found</p> } @if (interviewers().length === 0) { <p class="text-muted" style="font-size: 12px;">No interviewers found</p> }
...@@ -150,7 +150,7 @@ ...@@ -150,7 +150,7 @@
<div class="quiz-select-grid" style="max-height: 120px; overflow-y: auto;"> <div class="quiz-select-grid" style="max-height: 120px; overflow-y: auto;">
@for (p of pms(); track p._id) { @for (p of pms(); track p._id) {
<label class="quiz-select-item" style="cursor: pointer;"> <label class="quiz-select-item" style="cursor: pointer;">
<input type="checkbox" [value]="p._id" (change)="toggleSelection($event, newInterview.assignedPMs)" style="margin-right: 8px;"> {{ p.name }} <input type="radio" [value]="p._id" (change)="toggleSelection($event, newInterview.assignedPMs)" style="margin-right: 8px;"> {{ p.name }}
</label> </label>
} }
@if (pms().length === 0) { <p class="text-muted" style="font-size: 12px;">No PMs found</p> } @if (pms().length === 0) { <p class="text-muted" style="font-size: 12px;">No PMs found</p> }
...@@ -161,7 +161,7 @@ ...@@ -161,7 +161,7 @@
<div class="quiz-select-grid" style="max-height: 120px; overflow-y: auto;"> <div class="quiz-select-grid" style="max-height: 120px; overflow-y: auto;">
@for (h of hrs(); track h._id) { @for (h of hrs(); track h._id) {
<label class="quiz-select-item" style="cursor: pointer;"> <label class="quiz-select-item" style="cursor: pointer;">
<input type="checkbox" [value]="h._id" (change)="toggleSelection($event, newInterview.assignedHRs)" style="margin-right: 8px;"> {{ h.name }} <input type="radio" [value]="h._id" (change)="toggleSelection($event, newInterview.assignedHRs)" style="margin-right: 8px;"> {{ h.name }}
</label> </label>
} }
@if (hrs().length === 0) { <p class="text-muted" style="font-size: 12px;">No HRs found</p> } @if (hrs().length === 0) { <p class="text-muted" style="font-size: 12px;">No HRs found</p> }
...@@ -357,11 +357,6 @@ ...@@ -357,11 +357,6 @@
<div class="detail-section"> <div class="detail-section">
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px;"> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px;">
<h3 class="detail-section-title" style="margin: 0;">Evaluations</h3> <h3 class="detail-section-title" style="margin: 0;">Evaluations</h3>
@if (allEvaluationsDone()) {
<button class="btn btn-primary" (click)="downloadEvaluationPdf()">
@if (isPdfGenerating()) { <span class="spinner spinner-sm"></span> Generating... } @else { <span class="material-symbols-rounded">download</span> Download PDF }
</button>
}
</div> </div>
@if (selectedInterview().evaluations?.length > 0) { @if (selectedInterview().evaluations?.length > 0) {
<div class="eval-list"> <div class="eval-list">
......
...@@ -250,8 +250,6 @@ export class HRIndividualInterviewComponent implements OnInit { ...@@ -250,8 +250,6 @@ export class HRIndividualInterviewComponent implements OnInit {
return interview.evaluations?.some((e: any) => e.evaluatorId?._id === userId); return interview.evaluations?.some((e: any) => e.evaluatorId?._id === userId);
} }
isPdfGenerating = signal(false);
getEvaluationByRole(role: string): any { getEvaluationByRole(role: string): any {
const iv = this.selectedInterview(); const iv = this.selectedInterview();
if (!iv || !iv.evaluations) return null; if (!iv || !iv.evaluations) return null;
...@@ -269,16 +267,4 @@ export class HRIndividualInterviewComponent implements OnInit { ...@@ -269,16 +267,4 @@ export class HRIndividualInterviewComponent implements OnInit {
const numEvaluations = iv.evaluations?.length || 0; const numEvaluations = iv.evaluations?.length || 0;
return numEvaluations >= totalExpected; return numEvaluations >= totalExpected;
} }
downloadEvaluationPdf(): void {
const iv = this.selectedInterview();
if (!iv) return;
this.isPdfGenerating.set(true);
setTimeout(() => {
window.print();
this.isPdfGenerating.set(false);
}, 500);
}
} }
...@@ -3,11 +3,11 @@ ...@@ -3,11 +3,11 @@
<div class="auth-brand"> <div class="auth-brand">
<div class="brand-content"> <div class="brand-content">
<div class="brand-logo"> <div class="brand-logo">
<span class="material-symbols-rounded filled">quiz</span> <span class="material-symbols-rounded filled">business_center</span>
<span class="brand-name">QuizMaster</span> <span class="brand-name">Hire Guru</span>
</div> </div>
<h2 class="brand-headline">Assess. Evaluate.<br>Excel.</h2> <h2 class="brand-headline">Assess. Interview.<br>Excel.</h2>
<p class="brand-desc">The professional evaluation platform for organizations that demand precision and insight.</p> <p class="brand-desc">The professional online interview and assessment platform for modern talent acquisition.</p>
<div class="brand-features"> <div class="brand-features">
<div class="feature-item"> <div class="feature-item">
<span class="material-symbols-rounded">verified</span> <span class="material-symbols-rounded">verified</span>
...@@ -19,11 +19,11 @@ ...@@ -19,11 +19,11 @@
</div> </div>
<div class="feature-item"> <div class="feature-item">
<span class="material-symbols-rounded">auto_awesome</span> <span class="material-symbols-rounded">auto_awesome</span>
<span>AI-powered quiz generation</span> <span>AI-powered assessment generation</span>
</div> </div>
</div> </div>
</div> </div>
<div class="brand-footer">© 2026 QuizMaster Pro. All rights reserved.</div> <div class="brand-footer">© 2026 Hire Guru. All rights reserved.</div>
</div> </div>
<!-- Right: Login Form --> <!-- Right: Login Form -->
...@@ -31,8 +31,8 @@ ...@@ -31,8 +31,8 @@
<div class="auth-card"> <div class="auth-card">
<div class="auth-header"> <div class="auth-header">
<div class="mobile-logo"> <div class="mobile-logo">
<span class="material-symbols-rounded filled">quiz</span> <span class="material-symbols-rounded filled">business_center</span>
<span>QuizMaster</span> <span>Hire Guru</span>
</div> </div>
<h1>Sign in</h1> <h1>Sign in</h1>
<p>Enter your credentials to access your account</p> <p>Enter your credentials to access your account</p>
......
...@@ -3,11 +3,11 @@ ...@@ -3,11 +3,11 @@
<div class="auth-brand"> <div class="auth-brand">
<div class="brand-content"> <div class="brand-content">
<div class="brand-logo"> <div class="brand-logo">
<span class="material-symbols-rounded filled">quiz</span> <span class="material-symbols-rounded filled">business_center</span>
<span class="brand-name">QuizMaster</span> <span class="brand-name">Hire Guru</span>
</div> </div>
<h2 class="brand-headline">Join the<br>Platform.</h2> <h2 class="brand-headline">Join the<br>Platform.</h2>
<p class="brand-desc">Create your candidate account and start taking quizzes assigned to you by your organization.</p> <p class="brand-desc">Create your candidate account and start taking assessments assigned to you by your organization.</p>
<div class="brand-features"> <div class="brand-features">
<div class="feature-item"> <div class="feature-item">
<span class="material-symbols-rounded">speed</span> <span class="material-symbols-rounded">speed</span>
...@@ -19,19 +19,19 @@ ...@@ -19,19 +19,19 @@
</div> </div>
<div class="feature-item"> <div class="feature-item">
<span class="material-symbols-rounded">devices</span> <span class="material-symbols-rounded">devices</span>
<span>Take quizzes from any device</span> <span>Take assessments from any device</span>
</div> </div>
</div> </div>
</div> </div>
<div class="brand-footer">© 2026 QuizMaster Pro. All rights reserved.</div> <div class="brand-footer">© 2026 Hire Guru. All rights reserved.</div>
</div> </div>
<!-- Right: Register Form --> <!-- Right: Register Form -->
<div class="auth-form-panel"> <div class="auth-form-panel">
<div class="auth-card"> <div class="auth-card">
<div class="mobile-logo"> <div class="mobile-logo">
<span class="material-symbols-rounded filled">quiz</span> <span class="material-symbols-rounded filled">business_center</span>
<span>QuizMaster</span> <span>Hire Guru</span>
</div> </div>
<div class="auth-header"> <div class="auth-header">
......
<div class="dashboard-layout"> <div class="dashboard-layout">
<aside class="sidebar"> <aside class="sidebar">
<div class="sidebar-header"> <div class="sidebar-header">
<span class="logo-icon">📝</span><h2>QuizMaster</h2><span class="role-badge student">Student</span> <span class="logo-icon">💼</span><h2>Hire Guru</h2><span class="role-badge student">Student</span>
</div> </div>
<nav class="sidebar-nav"> <nav class="sidebar-nav">
<a routerLink="/student/dashboard" class="nav-item active"><span class="nav-icon">🏠</span><span>Dashboard</span></a> <a routerLink="/student/dashboard" class="nav-item active"><span class="nav-icon">🏠</span><span>Dashboard</span></a>
......
<div class="dashboard-layout"> <div class="dashboard-layout">
<aside class="sidebar"> <aside class="sidebar">
<div class="sidebar-header"> <div class="sidebar-header">
<span class="logo-icon">📝</span><h2>QuizMaster</h2><span class="role-badge student">Student</span> <span class="logo-icon">💼</span><h2>Hire Guru</h2><span class="role-badge student">Student</span>
</div> </div>
<nav class="sidebar-nav"> <nav class="sidebar-nav">
<a routerLink="/student/dashboard" class="nav-item"><span class="nav-icon">🏠</span><span>Dashboard</span></a> <a routerLink="/student/dashboard" class="nav-item"><span class="nav-icon">🏠</span><span>Dashboard</span></a>
......
<div class="dashboard-layout"> <div class="dashboard-layout">
<aside class="sidebar"> <aside class="sidebar">
<div class="sidebar-header"> <div class="sidebar-header">
<span class="logo-icon">📝</span><h2>QuizMaster</h2><span class="role-badge student">Student</span> <span class="logo-icon">💼</span><h2>Hire Guru</h2><span class="role-badge student">Student</span>
</div> </div>
<nav class="sidebar-nav"> <nav class="sidebar-nav">
<a routerLink="/student/dashboard" class="nav-item"><span class="nav-icon">🏠</span><span>Dashboard</span></a> <a routerLink="/student/dashboard" class="nav-item"><span class="nav-icon">🏠</span><span>Dashboard</span></a>
......
...@@ -2,10 +2,10 @@ ...@@ -2,10 +2,10 @@
<html lang="en" data-theme="light"> <html lang="en" data-theme="light">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<title>QuizMaster Pro - Online Assessment Platform</title> <title>Hire Guru - Online Interview Portal</title>
<meta <meta
name="description" name="description"
content="QuizMaster Pro - Professional online quiz and assessment platform for organizations" content="Hire Guru - Professional online interview and assessment platform for organizations"
/> />
<base href="/" /> <base href="/" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
......
/* ============================================================ /* ============================================================
QuizMaster Pro — Global Theme System Hire Guru — Global Theme System
CSS Custom Properties with Light (default), Dark, Blue themes CSS Custom Properties with Light (default), Dark, Blue themes
============================================================ */ ============================================================ */
......
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