Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
H
Hire-Guru
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Vigneswaran Shanmugam
Hire-Guru
Commits
3affc117
Commit
3affc117
authored
May 20, 2026
by
Aravind RK
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
refactor: Name changed to HIRE Guru
parent
9a0f25a3
Changes
26
Hide whitespace changes
Inline
Side-by-side
Showing
26 changed files
with
41 additions
and
168 deletions
+41
-168
Frontend/src/app/components/layout/layout.html
Frontend/src/app/components/layout/layout.html
+5
-5
Frontend/src/app/pages/Interviewer/group-interview/group-interview.html
...pp/pages/Interviewer/group-interview/group-interview.html
+0
-3
Frontend/src/app/pages/Interviewer/group-interview/group-interview.ts
.../app/pages/Interviewer/group-interview/group-interview.ts
+0
-11
Frontend/src/app/pages/Interviewer/individual-interview/individual-interview.ts
.../Interviewer/individual-interview/individual-interview.ts
+0
-11
Frontend/src/app/pages/ProjectManager/group-interview/group-interview.html
...pages/ProjectManager/group-interview/group-interview.html
+0
-3
Frontend/src/app/pages/ProjectManager/group-interview/group-interview.ts
...p/pages/ProjectManager/group-interview/group-interview.ts
+0
-11
Frontend/src/app/pages/ProjectManager/individual-interview/individual-interview.html
...ectManager/individual-interview/individual-interview.html
+0
-5
Frontend/src/app/pages/ProjectManager/individual-interview/individual-interview.ts
...ojectManager/individual-interview/individual-interview.ts
+0
-11
Frontend/src/app/pages/admin/generate-quiz/generate-quiz.html
...tend/src/app/pages/admin/generate-quiz/generate-quiz.html
+2
-2
Frontend/src/app/pages/admin/group-interview/group-interview.html
.../src/app/pages/admin/group-interview/group-interview.html
+0
-3
Frontend/src/app/pages/admin/group-interview/group-interview.ts
...nd/src/app/pages/admin/group-interview/group-interview.ts
+0
-14
Frontend/src/app/pages/admin/individual-interview/individual-interview.html
...ages/admin/individual-interview/individual-interview.html
+3
-8
Frontend/src/app/pages/admin/individual-interview/individual-interview.ts
.../pages/admin/individual-interview/individual-interview.ts
+0
-14
Frontend/src/app/pages/candidate/take-quiz/take-quiz.html
Frontend/src/app/pages/candidate/take-quiz/take-quiz.html
+2
-2
Frontend/src/app/pages/hr/generate-quiz/generate-quiz.html
Frontend/src/app/pages/hr/generate-quiz/generate-quiz.html
+2
-2
Frontend/src/app/pages/hr/group-interview/group-interview.html
...end/src/app/pages/hr/group-interview/group-interview.html
+3
-6
Frontend/src/app/pages/hr/group-interview/group-interview.ts
Frontend/src/app/pages/hr/group-interview/group-interview.ts
+0
-14
Frontend/src/app/pages/hr/individual-interview/individual-interview.html
...p/pages/hr/individual-interview/individual-interview.html
+3
-8
Frontend/src/app/pages/hr/individual-interview/individual-interview.ts
...app/pages/hr/individual-interview/individual-interview.ts
+0
-14
Frontend/src/app/pages/login/login.html
Frontend/src/app/pages/login/login.html
+8
-8
Frontend/src/app/pages/register/register.html
Frontend/src/app/pages/register/register.html
+7
-7
Frontend/src/app/pages/student/dashboard/dashboard.html
Frontend/src/app/pages/student/dashboard/dashboard.html
+1
-1
Frontend/src/app/pages/student/profile/profile.html
Frontend/src/app/pages/student/profile/profile.html
+1
-1
Frontend/src/app/pages/student/results/results.html
Frontend/src/app/pages/student/results/results.html
+1
-1
Frontend/src/index.html
Frontend/src/index.html
+2
-2
Frontend/src/styles.css
Frontend/src/styles.css
+1
-1
No files found.
Frontend/src/app/components/layout/layout.html
View file @
3affc117
...
...
@@ -7,8 +7,8 @@
<span
class=
"material-symbols-rounded"
>
menu
</span>
</button>
<span
class=
"mobile-logo"
>
<span
class=
"material-symbols-rounded filled"
>
quiz
</span>
QuizMaster
<span
class=
"material-symbols-rounded filled"
>
business_center
</span>
Hire Guru
</span>
<div
class=
"mobile-actions"
>
<button
class=
"icon-btn"
(click)=
"toggleThemeMenu()"
>
...
...
@@ -29,8 +29,8 @@
<!-- Logo -->
<div
class=
"sidebar-header"
>
<div
class=
"logo"
>
<span
class=
"material-symbols-rounded filled logo-icon"
>
quiz
</span>
<span
class=
"logo-text"
>
QuizMaster
</span>
<span
class=
"material-symbols-rounded filled logo-icon"
>
business_center
</span>
<span
class=
"logo-text"
>
Hire Guru
</span>
</div>
<span
class=
"badge"
[ngClass]=
"roleBadge().class"
>
{{ roleBadge().label }}
</span>
</div>
...
...
@@ -235,7 +235,7 @@
<div
class=
"confirm-icon-wrapper"
>
<span
class=
"material-symbols-rounded"
>
logout
</span>
</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
class=
"confirm-modal-actions"
>
...
...
Frontend/src/app/pages/Interviewer/group-interview/group-interview.html
View file @
3affc117
...
...
@@ -395,9 +395,6 @@
<div
style=
"display: flex; gap: 8px; align-items: center;"
>
@if (allMemberEvaluationsDone()) {
<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 {
<span
class=
"badge badge-warning"
>
Evaluations pending
</span>
}
...
...
Frontend/src/app/pages/Interviewer/group-interview/group-interview.ts
View file @
3affc117
...
...
@@ -53,7 +53,6 @@ export class InterviewerGroupInterviewComponent implements OnInit {
memberEvalComment
=
''
;
memberEvalRecommendation
=
''
;
isMemberSubmitting
=
signal
(
false
);
isPdfGenerating
=
signal
(
false
);
constructor
(
private
quizService
:
QuizService
,
public
authService
:
AuthService
)
{}
...
...
@@ -160,16 +159,6 @@ export class InterviewerGroupInterviewComponent implements OnInit {
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 -----------------------------------------------
getStatusClass
(
status
:
string
):
string
{
const
map
:
any
=
{
...
...
Frontend/src/app/pages/Interviewer/individual-interview/individual-interview.ts
View file @
3affc117
...
...
@@ -23,7 +23,6 @@ export class InterviewerIndividualInterviewComponent implements OnInit {
stats
=
signal
<
any
>
({
total
:
0
,
pending
:
0
,
completed
:
0
,
accepted
:
0
,
rejected
:
0
});
filterStatus
=
signal
(
''
);
isSubmitting
=
signal
(
false
);
isPdfGenerating
=
signal
(
false
);
constructor
(
private
quizService
:
QuizService
,
public
authService
:
AuthService
)
{}
...
...
@@ -150,16 +149,6 @@ export class InterviewerIndividualInterviewComponent implements OnInit {
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
[]
{
if
(
!
evaluations
)
return
[];
const
userId
=
this
.
authService
.
currentUser
()?.
id
;
...
...
Frontend/src/app/pages/ProjectManager/group-interview/group-interview.html
View file @
3affc117
...
...
@@ -395,9 +395,6 @@
<div
style=
"display: flex; gap: 8px; align-items: center;"
>
@if (allMemberEvaluationsDone()) {
<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 {
<span
class=
"badge badge-warning"
>
Evaluations pending
</span>
}
...
...
Frontend/src/app/pages/ProjectManager/group-interview/group-interview.ts
View file @
3affc117
...
...
@@ -53,7 +53,6 @@ export class PMGroupInterviewComponent implements OnInit {
memberEvalComment
=
''
;
memberEvalRecommendation
=
''
;
isMemberSubmitting
=
signal
(
false
);
isPdfGenerating
=
signal
(
false
);
constructor
(
private
quizService
:
QuizService
,
public
authService
:
AuthService
)
{}
...
...
@@ -160,16 +159,6 @@ export class PMGroupInterviewComponent implements OnInit {
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 -----------------------------------------------
getStatusClass
(
status
:
string
):
string
{
const
map
:
any
=
{
...
...
Frontend/src/app/pages/ProjectManager/individual-interview/individual-interview.html
View file @
3affc117
...
...
@@ -249,11 +249,6 @@
<div
class=
"detail-section"
>
<div
style=
"display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px;"
>
<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>
@if (getVisibleEvaluations(selectedInterview().evaluations).length > 0) {
<div
class=
"eval-list"
>
...
...
Frontend/src/app/pages/ProjectManager/individual-interview/individual-interview.ts
View file @
3affc117
...
...
@@ -23,7 +23,6 @@ export class PMIndividualInterviewComponent implements OnInit {
stats
=
signal
<
any
>
({
total
:
0
,
pending
:
0
,
completed
:
0
,
accepted
:
0
,
rejected
:
0
});
filterStatus
=
signal
(
''
);
isSubmitting
=
signal
(
false
);
isPdfGenerating
=
signal
(
false
);
constructor
(
private
quizService
:
QuizService
,
public
authService
:
AuthService
)
{}
...
...
@@ -150,16 +149,6 @@ export class PMIndividualInterviewComponent implements OnInit {
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
[]
{
if
(
!
evaluations
)
return
[];
const
userId
=
this
.
authService
.
currentUser
()?.
id
;
...
...
Frontend/src/app/pages/admin/generate-quiz/generate-quiz.html
View file @
3affc117
<div
class=
"dashboard-layout"
>
<aside
class=
"sidebar"
>
<div
class=
"sidebar-header"
>
<span
class=
"logo-icon"
>
📝
</span>
<h2>
QuizMaster
</h2><span
class=
"role-badge"
>
Admin
</span>
<span
class=
"logo-icon"
>
💼
</span>
<h2>
Hire Guru
</h2><span
class=
"role-badge"
>
Admin
</span>
</div>
<nav
class=
"sidebar-nav"
>
<a
routerLink=
"/admin/dashboard"
class=
"nav-item"
><span
class=
"nav-icon"
>
🏠
</span><span>
Dashboard
</span></a>
...
...
Frontend/src/app/pages/admin/group-interview/group-interview.html
View file @
3affc117
...
...
@@ -642,9 +642,6 @@
<div
style=
"display: flex; gap: 8px; align-items: center;"
>
@if (allMemberEvaluationsDone()) {
<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 {
<span
class=
"badge badge-warning"
>
Evaluations pending
</span>
}
...
...
Frontend/src/app/pages/admin/group-interview/group-interview.ts
View file @
3affc117
...
...
@@ -347,20 +347,6 @@ export class GroupInterviewComponent implements OnInit {
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 ───────────────────────────────────────────────
getStatusClass
(
status
:
string
):
string
{
const
map
:
any
=
{
...
...
Frontend/src/app/pages/admin/individual-interview/individual-interview.html
View file @
3affc117
...
...
@@ -139,7 +139,7 @@
<div
class=
"quiz-select-grid"
style=
"max-height: 120px; overflow-y: auto;"
>
@for (i of interviewers(); track i._id) {
<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>
}
@if (interviewers().length === 0) {
<p
class=
"text-muted"
style=
"font-size: 12px;"
>
No interviewers found
</p>
}
...
...
@@ -150,7 +150,7 @@
<div
class=
"quiz-select-grid"
style=
"max-height: 120px; overflow-y: auto;"
>
@for (p of pms(); track p._id) {
<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>
}
@if (pms().length === 0) {
<p
class=
"text-muted"
style=
"font-size: 12px;"
>
No PMs found
</p>
}
...
...
@@ -161,7 +161,7 @@
<div
class=
"quiz-select-grid"
style=
"max-height: 120px; overflow-y: auto;"
>
@for (h of hrs(); track h._id) {
<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>
}
@if (hrs().length === 0) {
<p
class=
"text-muted"
style=
"font-size: 12px;"
>
No HRs found
</p>
}
...
...
@@ -357,11 +357,6 @@
<div
class=
"detail-section"
>
<div
style=
"display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px;"
>
<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>
@if (selectedInterview().evaluations?.length > 0) {
<div
class=
"eval-list"
>
...
...
Frontend/src/app/pages/admin/individual-interview/individual-interview.ts
View file @
3affc117
...
...
@@ -250,8 +250,6 @@ export class IndividualInterviewComponent implements OnInit {
return
interview
.
evaluations
?.
some
((
e
:
any
)
=>
e
.
evaluatorId
?.
_id
===
userId
);
}
isPdfGenerating
=
signal
(
false
);
getEvaluationByRole
(
role
:
string
):
any
{
const
iv
=
this
.
selectedInterview
();
if
(
!
iv
||
!
iv
.
evaluations
)
return
null
;
...
...
@@ -269,16 +267,4 @@ export class IndividualInterviewComponent implements OnInit {
const
numEvaluations
=
iv
.
evaluations
?.
length
||
0
;
return
numEvaluations
>=
totalExpected
;
}
downloadEvaluationPdf
():
void
{
const
iv
=
this
.
selectedInterview
();
if
(
!
iv
)
return
;
this
.
isPdfGenerating
.
set
(
true
);
setTimeout
(()
=>
{
window
.
print
();
this
.
isPdfGenerating
.
set
(
false
);
},
500
);
}
}
Frontend/src/app/pages/candidate/take-quiz/take-quiz.html
View file @
3affc117
...
...
@@ -31,8 +31,8 @@
<div
class=
"quiz-topbar"
>
<div
class=
"topbar-left"
>
<div
class=
"quiz-brand"
>
<span
class=
"material-symbols-rounded filled brand-icon"
>
quiz
</span>
<span
class=
"brand-name"
>
QuizMaster
</span>
<span
class=
"material-symbols-rounded filled brand-icon"
>
business_center
</span>
<span
class=
"brand-name"
>
Hire Guru
</span>
</div>
<div
class=
"topbar-divider"
></div>
<div
class=
"quiz-title-block"
>
...
...
Frontend/src/app/pages/hr/generate-quiz/generate-quiz.html
View file @
3affc117
<div
class=
"dashboard-layout"
>
<aside
class=
"sidebar"
>
<div
class=
"sidebar-header"
>
<span
class=
"logo-icon"
>
📝
</span>
<h2>
QuizMaster
</h2><span
class=
"role-badge"
>
Admin
</span>
<span
class=
"logo-icon"
>
💼
</span>
<h2>
Hire Guru
</h2><span
class=
"role-badge"
>
Admin
</span>
</div>
<nav
class=
"sidebar-nav"
>
<a
routerLink=
"/admin/dashboard"
class=
"nav-item"
><span
class=
"nav-icon"
>
🏠
</span><span>
Dashboard
</span></a>
...
...
Frontend/src/app/pages/hr/group-interview/group-interview.html
View file @
3affc117
...
...
@@ -191,7 +191,7 @@
<div
class=
"checklist-box"
>
@for (i of interviewers(); track i._id) {
<label
class=
"check-item"
>
<input
type=
"
checkbox
"
[value]=
"i._id"
<input
type=
"
radio
"
[value]=
"i._id"
(change)=
"toggleSelection($event, newGroupInterview.assignedInterviewers)"
>
<span>
{{ i.name }}
</span>
</label>
...
...
@@ -204,7 +204,7 @@
<div
class=
"checklist-box"
>
@for (h of hrs(); track h._id) {
<label
class=
"check-item"
>
<input
type=
"
checkbox
"
[value]=
"h._id"
<input
type=
"
radio
"
[value]=
"h._id"
(change)=
"toggleSelection($event, newGroupInterview.assignedHRs)"
>
<span>
{{ h.name }}
</span>
</label>
...
...
@@ -217,7 +217,7 @@
<div
class=
"checklist-box"
>
@for (p of pms(); track p._id) {
<label
class=
"check-item"
>
<input
type=
"
checkbox
"
[value]=
"p._id"
<input
type=
"
radio
"
[value]=
"p._id"
(change)=
"toggleSelection($event, newGroupInterview.assignedPMs)"
>
<span>
{{ p.name }}
</span>
</label>
...
...
@@ -643,9 +643,6 @@
<div
style=
"display: flex; gap: 8px; align-items: center;"
>
@if (allMemberEvaluationsDone()) {
<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 {
<span
class=
"badge badge-warning"
>
Evaluations pending
</span>
}
...
...
Frontend/src/app/pages/hr/group-interview/group-interview.ts
View file @
3affc117
...
...
@@ -349,20 +349,6 @@ export class HRGroupInterviewComponent implements OnInit {
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 ───────────────────────────────────────────────
getStatusClass
(
status
:
string
):
string
{
const
map
:
any
=
{
...
...
Frontend/src/app/pages/hr/individual-interview/individual-interview.html
View file @
3affc117
...
...
@@ -139,7 +139,7 @@
<div
class=
"quiz-select-grid"
style=
"max-height: 120px; overflow-y: auto;"
>
@for (i of interviewers(); track i._id) {
<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>
}
@if (interviewers().length === 0) {
<p
class=
"text-muted"
style=
"font-size: 12px;"
>
No interviewers found
</p>
}
...
...
@@ -150,7 +150,7 @@
<div
class=
"quiz-select-grid"
style=
"max-height: 120px; overflow-y: auto;"
>
@for (p of pms(); track p._id) {
<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>
}
@if (pms().length === 0) {
<p
class=
"text-muted"
style=
"font-size: 12px;"
>
No PMs found
</p>
}
...
...
@@ -161,7 +161,7 @@
<div
class=
"quiz-select-grid"
style=
"max-height: 120px; overflow-y: auto;"
>
@for (h of hrs(); track h._id) {
<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>
}
@if (hrs().length === 0) {
<p
class=
"text-muted"
style=
"font-size: 12px;"
>
No HRs found
</p>
}
...
...
@@ -357,11 +357,6 @@
<div
class=
"detail-section"
>
<div
style=
"display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px;"
>
<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>
@if (selectedInterview().evaluations?.length > 0) {
<div
class=
"eval-list"
>
...
...
Frontend/src/app/pages/hr/individual-interview/individual-interview.ts
View file @
3affc117
...
...
@@ -250,8 +250,6 @@ export class HRIndividualInterviewComponent implements OnInit {
return
interview
.
evaluations
?.
some
((
e
:
any
)
=>
e
.
evaluatorId
?.
_id
===
userId
);
}
isPdfGenerating
=
signal
(
false
);
getEvaluationByRole
(
role
:
string
):
any
{
const
iv
=
this
.
selectedInterview
();
if
(
!
iv
||
!
iv
.
evaluations
)
return
null
;
...
...
@@ -269,16 +267,4 @@ export class HRIndividualInterviewComponent implements OnInit {
const
numEvaluations
=
iv
.
evaluations
?.
length
||
0
;
return
numEvaluations
>=
totalExpected
;
}
downloadEvaluationPdf
():
void
{
const
iv
=
this
.
selectedInterview
();
if
(
!
iv
)
return
;
this
.
isPdfGenerating
.
set
(
true
);
setTimeout
(()
=>
{
window
.
print
();
this
.
isPdfGenerating
.
set
(
false
);
},
500
);
}
}
Frontend/src/app/pages/login/login.html
View file @
3affc117
...
...
@@ -3,11 +3,11 @@
<div
class=
"auth-brand"
>
<div
class=
"brand-content"
>
<div
class=
"brand-logo"
>
<span
class=
"material-symbols-rounded filled"
>
quiz
</span>
<span
class=
"brand-name"
>
QuizMaster
</span>
<span
class=
"material-symbols-rounded filled"
>
business_center
</span>
<span
class=
"brand-name"
>
Hire Guru
</span>
</div>
<h2
class=
"brand-headline"
>
Assess.
Evaluate
.
<br>
Excel.
</h2>
<p
class=
"brand-desc"
>
The professional
evaluation platform for organizations that demand precision and insight
.
</p>
<h2
class=
"brand-headline"
>
Assess.
Interview
.
<br>
Excel.
</h2>
<p
class=
"brand-desc"
>
The professional
online interview and assessment platform for modern talent acquisition
.
</p>
<div
class=
"brand-features"
>
<div
class=
"feature-item"
>
<span
class=
"material-symbols-rounded"
>
verified
</span>
...
...
@@ -19,11 +19,11 @@
</div>
<div
class=
"feature-item"
>
<span
class=
"material-symbols-rounded"
>
auto_awesome
</span>
<span>
AI-powered
quiz
generation
</span>
<span>
AI-powered
assessment
generation
</span>
</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>
<!-- Right: Login Form -->
...
...
@@ -31,8 +31,8 @@
<div
class=
"auth-card"
>
<div
class=
"auth-header"
>
<div
class=
"mobile-logo"
>
<span
class=
"material-symbols-rounded filled"
>
quiz
</span>
<span>
QuizMaster
</span>
<span
class=
"material-symbols-rounded filled"
>
business_center
</span>
<span>
Hire Guru
</span>
</div>
<h1>
Sign in
</h1>
<p>
Enter your credentials to access your account
</p>
...
...
Frontend/src/app/pages/register/register.html
View file @
3affc117
...
...
@@ -3,11 +3,11 @@
<div
class=
"auth-brand"
>
<div
class=
"brand-content"
>
<div
class=
"brand-logo"
>
<span
class=
"material-symbols-rounded filled"
>
quiz
</span>
<span
class=
"brand-name"
>
QuizMaster
</span>
<span
class=
"material-symbols-rounded filled"
>
business_center
</span>
<span
class=
"brand-name"
>
Hire Guru
</span>
</div>
<h2
class=
"brand-headline"
>
Join the
<br>
Platform.
</h2>
<p
class=
"brand-desc"
>
Create your candidate account and start taking
quizze
s assigned to you by your organization.
</p>
<p
class=
"brand-desc"
>
Create your candidate account and start taking
assessment
s assigned to you by your organization.
</p>
<div
class=
"brand-features"
>
<div
class=
"feature-item"
>
<span
class=
"material-symbols-rounded"
>
speed
</span>
...
...
@@ -19,19 +19,19 @@
</div>
<div
class=
"feature-item"
>
<span
class=
"material-symbols-rounded"
>
devices
</span>
<span>
Take
quizze
s from any device
</span>
<span>
Take
assessment
s from any device
</span>
</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>
<!-- Right: Register Form -->
<div
class=
"auth-form-panel"
>
<div
class=
"auth-card"
>
<div
class=
"mobile-logo"
>
<span
class=
"material-symbols-rounded filled"
>
quiz
</span>
<span>
QuizMaster
</span>
<span
class=
"material-symbols-rounded filled"
>
business_center
</span>
<span>
Hire Guru
</span>
</div>
<div
class=
"auth-header"
>
...
...
Frontend/src/app/pages/student/dashboard/dashboard.html
View file @
3affc117
<div
class=
"dashboard-layout"
>
<aside
class=
"sidebar"
>
<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>
<nav
class=
"sidebar-nav"
>
<a
routerLink=
"/student/dashboard"
class=
"nav-item active"
><span
class=
"nav-icon"
>
🏠
</span><span>
Dashboard
</span></a>
...
...
Frontend/src/app/pages/student/profile/profile.html
View file @
3affc117
<div
class=
"dashboard-layout"
>
<aside
class=
"sidebar"
>
<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>
<nav
class=
"sidebar-nav"
>
<a
routerLink=
"/student/dashboard"
class=
"nav-item"
><span
class=
"nav-icon"
>
🏠
</span><span>
Dashboard
</span></a>
...
...
Frontend/src/app/pages/student/results/results.html
View file @
3affc117
<div
class=
"dashboard-layout"
>
<aside
class=
"sidebar"
>
<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>
<nav
class=
"sidebar-nav"
>
<a
routerLink=
"/student/dashboard"
class=
"nav-item"
><span
class=
"nav-icon"
>
🏠
</span><span>
Dashboard
</span></a>
...
...
Frontend/src/index.html
View file @
3affc117
...
...
@@ -2,10 +2,10 @@
<html
lang=
"en"
data-theme=
"light"
>
<head>
<meta
charset=
"utf-8"
/>
<title>
QuizMaster Pro - Online Assessment Platform
</title>
<title>
Hire Guru - Online Interview Portal
</title>
<meta
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=
"/"
/>
<meta
name=
"viewport"
content=
"width=device-width, initial-scale=1"
/>
...
...
Frontend/src/styles.css
View file @
3affc117
/* ============================================================
QuizMaster Pro
— Global Theme System
Hire Guru
— Global Theme System
CSS Custom Properties with Light (default), Dark, Blue themes
============================================================ */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment