From 3b20cdc0640cf7213eb741c584159abaaabb5f35 Mon Sep 17 00:00:00 2001 From: matthieuaudemard Date: Sat, 20 Nov 2021 06:49:36 +0100 Subject: [PATCH] =?UTF-8?q?RI-188:=20[job-board]=20d=C3=A9fini=20le=20desi?= =?UTF-8?q?gn=20du=20board=20et=20des=20cards=20(#189)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend-implicaction/src/app/app.module.ts | 2 ++ .../src/app/board/board.component.html | 15 ++++++++- .../src/app/board/board.component.scss | 6 ++++ .../src/app/board/board.component.ts | 32 +++++++++++++++++-- .../src/app/board/board.module.ts | 14 ++++++-- .../apply-card/apply-card.component.html | 31 ++++++++++++++++++ .../apply-card/apply-card.component.scss | 9 ++++++ .../apply-card/apply-card.component.spec.ts | 25 +++++++++++++++ .../apply-card/apply-card.component.ts | 20 ++++++++++++ .../src/app/board/enums/apply-status-enum.ts | 27 ++++++++++++++++ .../src/app/board/models/job-apply.ts | 12 +++++++ .../src/app/config/constants.ts | 2 ++ .../job-details/job-details.component.html | 6 ++-- .../job-details/job-details.component.ts | 2 ++ .../src/app/job/models/contract-type-enum.ts | 20 ------------ .../src/app/job/models/job-criteria-filter.ts | 4 +-- .../job-filter/job-filter.component.ts | 6 ++-- .../src/app/shared/enums/univers.ts | 3 +- .../src/app/shared/models/contractType.ts | 4 --- frontend-implicaction/src/styles.scss | 2 +- 20 files changed, 203 insertions(+), 39 deletions(-) create mode 100644 frontend-implicaction/src/app/board/components/apply-card/apply-card.component.html create mode 100644 frontend-implicaction/src/app/board/components/apply-card/apply-card.component.scss create mode 100644 frontend-implicaction/src/app/board/components/apply-card/apply-card.component.spec.ts create mode 100644 frontend-implicaction/src/app/board/components/apply-card/apply-card.component.ts create mode 100644 frontend-implicaction/src/app/board/enums/apply-status-enum.ts create mode 100644 frontend-implicaction/src/app/board/models/job-apply.ts delete mode 100644 frontend-implicaction/src/app/job/models/contract-type-enum.ts delete mode 100644 frontend-implicaction/src/app/shared/models/contractType.ts diff --git a/frontend-implicaction/src/app/app.module.ts b/frontend-implicaction/src/app/app.module.ts index 5d4d9509..cdfc3fb7 100644 --- a/frontend-implicaction/src/app/app.module.ts +++ b/frontend-implicaction/src/app/app.module.ts @@ -13,6 +13,7 @@ import {ToastModule} from 'primeng/toast'; import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; import {MessageService} from 'primeng/api'; import {SidebarModule} from 'primeng/sidebar'; +import {BoardModule} from './board/board.module'; @NgModule({ declarations: [ @@ -30,6 +31,7 @@ import {SidebarModule} from 'primeng/sidebar'; BrowserAnimationsModule, ToastModule, SidebarModule, + BoardModule ], providers: [MessageService], bootstrap: [AppComponent] diff --git a/frontend-implicaction/src/app/board/board.component.html b/frontend-implicaction/src/app/board/board.component.html index f0256e75..6ba7d349 100644 --- a/frontend-implicaction/src/app/board/board.component.html +++ b/frontend-implicaction/src/app/board/board.component.html @@ -1 +1,14 @@ -

board works!

+
+
+

+ {{column.status.label}} + {{column.applies.length}} +

+ + +
+
diff --git a/frontend-implicaction/src/app/board/board.component.scss b/frontend-implicaction/src/app/board/board.component.scss index e69de29b..7cba99ba 100644 --- a/frontend-implicaction/src/app/board/board.component.scss +++ b/frontend-implicaction/src/app/board/board.component.scss @@ -0,0 +1,6 @@ +@import "src/assets/variables"; + +h3 { + color: $light-gray; + text-transform: uppercase; +} diff --git a/frontend-implicaction/src/app/board/board.component.ts b/frontend-implicaction/src/app/board/board.component.ts index 16d53c8d..d47bd226 100644 --- a/frontend-implicaction/src/app/board/board.component.ts +++ b/frontend-implicaction/src/app/board/board.component.ts @@ -1,10 +1,38 @@ -import {Component} from '@angular/core'; +import {Component, OnInit} from '@angular/core'; +import {ApplyStatusCode, ApplyStatusEnum} from './enums/apply-status-enum'; +import {JobApply} from './models/job-apply'; + +export class BoardColumn { + status: ApplyStatusEnum; + applies: JobApply[] = []; +} + @Component({ selector: 'app-board', templateUrl: './board.component.html', styleUrls: ['./board.component.scss'] }) -export class BoardComponent { +export class BoardComponent implements OnInit { + + + columns: BoardColumn[] = ApplyStatusEnum.all() + .map(status => { + return {status, applies: []}; + }); + ngOnInit(): void { + this.columns + .find(column => column.status.code === ApplyStatusCode.PENDING) + .applies + .push({ + jobTitle: 'Responsable de la maintenance et de la sécurité', + contractType: 'CDI', + companyImageUrl: 'https://www.netanswer.fr/wp-content/uploads/2017/01/logoNAli400.png', + companyName: 'Net Answer', + location: 'France, Paris(75)', + jobId: '12', + status: ApplyStatusEnum.PENDING + }); + } } diff --git a/frontend-implicaction/src/app/board/board.module.ts b/frontend-implicaction/src/app/board/board.module.ts index cae98a68..3e7f051b 100644 --- a/frontend-implicaction/src/app/board/board.module.ts +++ b/frontend-implicaction/src/app/board/board.module.ts @@ -1,14 +1,24 @@ import {NgModule} from '@angular/core'; import {CommonModule} from '@angular/common'; import {BoardComponent} from './board.component'; +import {BrowserModule} from '@angular/platform-browser'; +import {TagModule} from 'primeng/tag'; +import {ApplyCardComponent} from './components/apply-card/apply-card.component'; +import {SharedModule} from '../shared/shared.module'; +import {RouterModule} from '@angular/router'; @NgModule({ declarations: [ - BoardComponent + BoardComponent, + ApplyCardComponent ], imports: [ - CommonModule + CommonModule, + BrowserModule, + TagModule, + SharedModule, + RouterModule ] }) export class BoardModule { diff --git a/frontend-implicaction/src/app/board/components/apply-card/apply-card.component.html b/frontend-implicaction/src/app/board/components/apply-card/apply-card.component.html new file mode 100644 index 00000000..e5def728 --- /dev/null +++ b/frontend-implicaction/src/app/board/components/apply-card/apply-card.component.html @@ -0,0 +1,31 @@ +
+
+
+ {{apply.companyName}} +
+
{{apply.companyName}}
+ {{apply.location}} +
+
+ +
+ + +
diff --git a/frontend-implicaction/src/app/board/components/apply-card/apply-card.component.scss b/frontend-implicaction/src/app/board/components/apply-card/apply-card.component.scss new file mode 100644 index 00000000..4b7a4232 --- /dev/null +++ b/frontend-implicaction/src/app/board/components/apply-card/apply-card.component.scss @@ -0,0 +1,9 @@ +.c-details span { + font-weight: 300; + font-size: 13px +} + +.icon { + width: 50px; + height: 50px; +} diff --git a/frontend-implicaction/src/app/board/components/apply-card/apply-card.component.spec.ts b/frontend-implicaction/src/app/board/components/apply-card/apply-card.component.spec.ts new file mode 100644 index 00000000..33872b24 --- /dev/null +++ b/frontend-implicaction/src/app/board/components/apply-card/apply-card.component.spec.ts @@ -0,0 +1,25 @@ +import {ComponentFixture, TestBed} from '@angular/core/testing'; + +import {ApplyCardComponent} from './apply-card.component'; + +describe('ApplyCardComponent', () => { + let component: ApplyCardComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ApplyCardComponent] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(ApplyCardComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontend-implicaction/src/app/board/components/apply-card/apply-card.component.ts b/frontend-implicaction/src/app/board/components/apply-card/apply-card.component.ts new file mode 100644 index 00000000..cbe9768b --- /dev/null +++ b/frontend-implicaction/src/app/board/components/apply-card/apply-card.component.ts @@ -0,0 +1,20 @@ +import {Component, Input} from '@angular/core'; +import {JobApply} from '../../models/job-apply'; +import {Constants} from '../../../config/constants'; +import {Univers} from '../../../shared/enums/univers'; + +@Component({ + selector: 'app-apply-card', + templateUrl: './apply-card.component.html', + styleUrls: ['./apply-card.component.scss'] +}) +export class ApplyCardComponent { + + readonly COMPANY_IMAGE_DEFAULT_URI = Constants.COMPANY_IMAGE_DEFAULT_URI; + + @Input() + apply: JobApply; + + univers = Univers; + +} diff --git a/frontend-implicaction/src/app/board/enums/apply-status-enum.ts b/frontend-implicaction/src/app/board/enums/apply-status-enum.ts new file mode 100644 index 00000000..340c5b63 --- /dev/null +++ b/frontend-implicaction/src/app/board/enums/apply-status-enum.ts @@ -0,0 +1,27 @@ +import {EnumCodeLabelAbstract} from '../../shared/enums/enum-code-label-abstract.enum'; + +export enum ApplyStatusCode { + PENDING, SENT, CHASED, INTERVIEW +} + +export class ApplyStatusEnum extends EnumCodeLabelAbstract { + static readonly PENDING = new EnumCodeLabelAbstract(ApplyStatusCode.PENDING, 'Je vais postuler'); + static readonly SENT = new EnumCodeLabelAbstract(ApplyStatusCode.SENT, `J'ai postulé`); + static readonly CHASED = new EnumCodeLabelAbstract(ApplyStatusCode.CHASED, `J'ai relancé`); + static readonly INTERVIEW = new EnumCodeLabelAbstract(ApplyStatusCode.INTERVIEW, `J'ai un entretien`); + + constructor( + readonly code: ApplyStatusCode, + readonly label: string + ) { + super(code, label); + } + + static all(): ApplyStatusEnum[] { + return this.values(); + } + + static from(code: ApplyStatusCode): ApplyStatusEnum { + return this.fromCode(code); + } +} diff --git a/frontend-implicaction/src/app/board/models/job-apply.ts b/frontend-implicaction/src/app/board/models/job-apply.ts new file mode 100644 index 00000000..edbace06 --- /dev/null +++ b/frontend-implicaction/src/app/board/models/job-apply.ts @@ -0,0 +1,12 @@ +import {ApplyStatusEnum} from '../enums/apply-status-enum'; + +export interface JobApply { + id?: string; + jobId: string; + jobTitle: string; + location: string; + companyName: string; + companyImageUrl: string; + status: ApplyStatusEnum; + contractType: string; +} diff --git a/frontend-implicaction/src/app/config/constants.ts b/frontend-implicaction/src/app/config/constants.ts index 413227b6..b8df26af 100644 --- a/frontend-implicaction/src/app/config/constants.ts +++ b/frontend-implicaction/src/app/config/constants.ts @@ -33,5 +33,7 @@ export class Constants { public static readonly GROUP_IMAGE_DEFAULT_URI = 'assets/img/avatar-ia-group.png'; + public static readonly COMPANY_IMAGE_DEFAULT_URI = 'assets/img/avatar-ia-group.png'; + readonly DEFAULT_YEAR_RANGE = `1900:${new Date().getFullYear() + 1}`; } diff --git a/frontend-implicaction/src/app/job/components/job-details/job-details.component.html b/frontend-implicaction/src/app/job/components/job-details/job-details.component.html index b435049d..163eee6a 100644 --- a/frontend-implicaction/src/app/job/components/job-details/job-details.component.html +++ b/frontend-implicaction/src/app/job/components/job-details/job-details.component.html @@ -2,10 +2,10 @@
job-logo

{{job.company?.name}}

diff --git a/frontend-implicaction/src/app/job/components/job-details/job-details.component.ts b/frontend-implicaction/src/app/job/components/job-details/job-details.component.ts index 13deba88..2fbc744c 100644 --- a/frontend-implicaction/src/app/job/components/job-details/job-details.component.ts +++ b/frontend-implicaction/src/app/job/components/job-details/job-details.component.ts @@ -3,6 +3,7 @@ import {JobPosting} from '../../../shared/models/job-posting'; import {JobService} from '../../services/job.service'; import {ToasterService} from '../../../core/services/toaster.service'; import {ActivatedRoute} from '@angular/router'; +import {Constants} from '../../../config/constants'; @Component({ selector: 'app-job-details', @@ -12,6 +13,7 @@ import {ActivatedRoute} from '@angular/router'; export class JobDetailsComponent implements OnInit { job: JobPosting = {}; + constant = Constants; constructor( private jobService: JobService, diff --git a/frontend-implicaction/src/app/job/models/contract-type-enum.ts b/frontend-implicaction/src/app/job/models/contract-type-enum.ts deleted file mode 100644 index eff6c0f4..00000000 --- a/frontend-implicaction/src/app/job/models/contract-type-enum.ts +++ /dev/null @@ -1,20 +0,0 @@ -import {EnumCodeLabelAbstract} from '../../shared/enums/enum-code-label-abstract.enum'; - -export enum ContractTypeCode { - CDD = 'CDD', - CDI = 'CDI' -} - -export class ContractTypeEnum extends EnumCodeLabelAbstract { - - static readonly CDD = new ContractTypeEnum(ContractTypeCode.CDD, 'CDD'); - static readonly CDI = new ContractTypeEnum(ContractTypeCode.CDI, 'CDI'); - - static all(): ContractTypeEnum[] { - return this.values(); - } - - static from(code: ContractTypeCode): ContractTypeEnum { - return this.fromCode(code); - } -} diff --git a/frontend-implicaction/src/app/job/models/job-criteria-filter.ts b/frontend-implicaction/src/app/job/models/job-criteria-filter.ts index 0a74ac2e..f0f34650 100644 --- a/frontend-implicaction/src/app/job/models/job-criteria-filter.ts +++ b/frontend-implicaction/src/app/job/models/job-criteria-filter.ts @@ -1,6 +1,6 @@ -import {ContractTypeCode} from './contract-type-enum'; +import {ContractEnumCode} from '../../shared/enums/contract.enum'; export interface JobCriteriaFilter { search?: string; - contractType?: ContractTypeCode; + contractType?: ContractEnumCode; } diff --git a/frontend-implicaction/src/app/shared/components/job-filter/job-filter.component.ts b/frontend-implicaction/src/app/shared/components/job-filter/job-filter.component.ts index 0b385318..576f080b 100644 --- a/frontend-implicaction/src/app/shared/components/job-filter/job-filter.component.ts +++ b/frontend-implicaction/src/app/shared/components/job-filter/job-filter.component.ts @@ -1,8 +1,8 @@ import {Component, OnDestroy, OnInit} from '@angular/core'; -import {ContractTypeCode, ContractTypeEnum} from '../../../job/models/contract-type-enum'; import {JobCriteriaFilter} from '../../../job/models/job-criteria-filter'; import {JobFilterContextService} from '../../../job/services/job-filter-context.service'; import {Subscription} from 'rxjs'; +import {ContractEnum, ContractEnumCode} from '../../enums/contract.enum'; @Component({ selector: 'app-job-filter', @@ -11,7 +11,7 @@ import {Subscription} from 'rxjs'; }) export class JobFilterComponent implements OnInit, OnDestroy { - contractTypes = ContractTypeEnum.all(); + contractTypes = ContractEnum.all(); criteria: JobCriteriaFilter = {}; subscription: Subscription; @@ -24,7 +24,7 @@ export class JobFilterComponent implements OnInit, OnDestroy { .subscribe(criteria => this.criteria = criteria); } - onContractTypeChange(code: ContractTypeCode): void { + onContractTypeChange(code: ContractEnumCode): void { this.criteria.contractType = code; this.filterContextService.setFilter(this.criteria); } diff --git a/frontend-implicaction/src/app/shared/enums/univers.ts b/frontend-implicaction/src/app/shared/enums/univers.ts index cec1f294..1a4c2227 100644 --- a/frontend-implicaction/src/app/shared/enums/univers.ts +++ b/frontend-implicaction/src/app/shared/enums/univers.ts @@ -1,12 +1,13 @@ import {RoleEnumCode} from './role.enum'; export class Univers { + // l'ordre de déclaration de ces variables correspond à l'ordre d'affichage dans le menu static readonly HOME = new Univers('Accueil', ''); static readonly USERS = new Univers('Communauté', 'users', [RoleEnumCode.USER]); static readonly JOBS = new Univers(`Offres d'emploi`, 'jobs', [RoleEnumCode.USER]); + static readonly BOARD = new Univers('Job Board', 'board', [RoleEnumCode.ADMIN, RoleEnumCode.PREMIUM]); static readonly DISCUSSIONS = new Univers('Discussion', 'discussions', [RoleEnumCode.USER]); static readonly ADMIN = new Univers('Admin', 'admin', [RoleEnumCode.ADMIN]); - static readonly BOARD = new Univers('Job Board', 'board', [RoleEnumCode.ADMIN, RoleEnumCode.PREMIUM]); constructor( readonly title: string, diff --git a/frontend-implicaction/src/app/shared/models/contractType.ts b/frontend-implicaction/src/app/shared/models/contractType.ts deleted file mode 100644 index 0eb36861..00000000 --- a/frontend-implicaction/src/app/shared/models/contractType.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface ContractType { - id?: string; - label?: string; -} diff --git a/frontend-implicaction/src/styles.scss b/frontend-implicaction/src/styles.scss index dc8b2de2..62a52b93 100644 --- a/frontend-implicaction/src/styles.scss +++ b/frontend-implicaction/src/styles.scss @@ -98,7 +98,7 @@ textarea, input { } .theme-primary { - color: $primary; + color: $primary !important; } input:focus::placeholder {