From aeabbf3793676838bb35bbc8f7a33dc4c13cb986 Mon Sep 17 00:00:00 2001 From: Derek Holloway Date: Mon, 11 Aug 2025 21:27:53 -0700 Subject: [PATCH] start work on resume editor --- ToDo.yaml | 6 +- src/Client/src/app/app.routes.ts | 2 + .../pages/resumes/editor/editor.component.css | 10 ++ .../resumes/editor/editor.component.html | 145 ++++++++++++++++ .../pages/resumes/editor/editor.component.ts | 162 ++++++++++++++++++ 5 files changed, 322 insertions(+), 3 deletions(-) create mode 100644 src/Client/src/app/pages/resumes/editor/editor.component.css create mode 100644 src/Client/src/app/pages/resumes/editor/editor.component.html create mode 100644 src/Client/src/app/pages/resumes/editor/editor.component.ts diff --git a/ToDo.yaml b/ToDo.yaml index 6aa8ec0..855e616 100755 --- a/ToDo.yaml +++ b/ToDo.yaml @@ -48,14 +48,14 @@ Client: Setup QueryParam's for Edit and New Edit employees not implimented yet + resume/editor: + Not fully tested yet + Company: Need to impliment Add employee Need to impliment Remove employee Edit Company -> Dont allow edit of company email due to it being verified - All: - Make sure im using the new NG format for for and if - database: Add Applied Jobs Table \ No newline at end of file diff --git a/src/Client/src/app/app.routes.ts b/src/Client/src/app/app.routes.ts index df088d1..b221d22 100644 --- a/src/Client/src/app/app.routes.ts +++ b/src/Client/src/app/app.routes.ts @@ -7,6 +7,7 @@ import { JobEditorComponent } from './pages/jobs/editor/jobeditor.component'; import { CompanyEditorComponent } from './pages/company/editor/editor.component'; import { JobViewerComponent } from './pages/jobs/viewer/jobviewer.component'; import { CompanyComponent } from './pages/company/company.component'; +import { ResumesEditorComponent } from './pages/resumes/editor/editor.component'; export const routes: Routes = [ @@ -15,6 +16,7 @@ export const routes: Routes = [ // Resumes { path: "resumes", component: ResumesComponent }, + { path: "resumes/editor", component: ResumesEditorComponent }, // Jobs { path: "jobs", component: JobsComponent }, diff --git a/src/Client/src/app/pages/resumes/editor/editor.component.css b/src/Client/src/app/pages/resumes/editor/editor.component.css new file mode 100644 index 0000000..0daf73e --- /dev/null +++ b/src/Client/src/app/pages/resumes/editor/editor.component.css @@ -0,0 +1,10 @@ +.resume-section { + background-color: #DDDDDD; + margin: 10px; +} + +.resume-sub-section { + border: 1px solid #666666; + margin: 5px; + padding: 10px; +} \ No newline at end of file diff --git a/src/Client/src/app/pages/resumes/editor/editor.component.html b/src/Client/src/app/pages/resumes/editor/editor.component.html new file mode 100644 index 0000000..9cc4cc0 --- /dev/null +++ b/src/Client/src/app/pages/resumes/editor/editor.component.html @@ -0,0 +1,145 @@ +
+ + +
+ + + + + + + + +

Public:

+
+ + +
+ + @for(experience of resume.experience; track experience.trackUUID ){ +
+ + + + + + + + + @if(!experience.stillEmployed){ + + } + + @for(bullet of experience.experienceBullets; track bullet.trackUUID){ +
+ + +
+ } + +
+ } +
+ + +
+

Is Veteran:

+ @if(resume.military.veteran){ + + + +

Still Serving:

+ @if (!resume.military.stillServing){ + + } + + @for(military of resume.military.millitaryBullets; track military.trackUUID ){ +
+ + + +
+ } + } +
+ + +
+ + @for(education of resume.education; track education.trackUUID){ +
+ + + + + + + + + + @if (!education.stillStudying){ + + } + +
+ } +
+ + +
+ + @for(skill of resume.skills; track skill.trackUUID){ +
+ + + +
+ } +
+ + +
+ + @for(language of resume.languages; track language.trackUUID){ +
+ + + +
+ } +
+ + + +
+ + @for(cert of resume.certification; track cert.trackUUID){ +
+ + + + +
+ } +
+ + +
+ + @for(proj of resume.projects; track proj.trackUUID){ +
+ + + + +
+ } +
+ + @if (isNewResume){ + + } @else { + + } + +
\ No newline at end of file diff --git a/src/Client/src/app/pages/resumes/editor/editor.component.ts b/src/Client/src/app/pages/resumes/editor/editor.component.ts new file mode 100644 index 0000000..bbbbd10 --- /dev/null +++ b/src/Client/src/app/pages/resumes/editor/editor.component.ts @@ -0,0 +1,162 @@ +import { Component } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { FormsModule } from '@angular/forms'; +import { Router, ActivatedRoute, RouterModule } from '@angular/router'; +import { Title } from '@angular/platform-browser'; +import { CommonModule } from '@angular/common'; +import { Resume, ResumeCertification, ResumeEducation, ResumeExperience, ResumeExperienceBullet, ResumeLanguage, ResumeMilitaryBullet, ResumeProject, ResumeSkill } from 'app/models/Resume'; +import { Authentication } from 'app/services/Authentication'; +import { HomeComponent } from "app/pages/home/home.component"; + +@Component({ + selector: 'main-resume-editor', + templateUrl: './editor.component.html', + styleUrls: [ './editor.component.css' ], + imports: [FormsModule, CommonModule, RouterModule] +}) +export class ResumesEditorComponent { + + public resume: Resume = new Resume; + public isNewResume: boolean = true; + + public ErrorMsg: string = ""; + + constructor( private http: HttpClient, private router: Router, private route: ActivatedRoute, private title: Title, public auth: Authentication ) { + this.title.setTitle("Resume - Editor | BoredCareers"); + if (!auth.isLoggedIn){ + router.navigate(["/"]); + } + this.route.queryParams.subscribe(params => { + + const ResumeID = params['ResumeID'] ? +params['ResumeID'] : null; + if (ResumeID !== null){ + this.http.get("api/resume?ResumeID=" + ResumeID).subscribe({ + next: data => { + this.resume = data; + this.isNewResume = false; + }, + error: err => { + this.ErrorMsg = err.error; + } + }); + } + }); + }; + + SubmitForm(resume: Resume){ + resume.accountID = this.auth.loggedInUser.id; + this.http.post("api/resume", resume).subscribe({ + next: data => { + this.router.navigate(["/"]); + }, + error: err => { + this.ErrorMsg = err.error; + } + }); + } + + addExperience(){ + this.resume.experience.push( new ResumeExperience ); + } + delExperience(self: ResumeExperience){ + for(let i=0; i