From 5ecb1f607aa29a6ae29b2339205a416e439f4e06 Mon Sep 17 00:00:00 2001 From: "maxim.gorbatyuk" Date: Mon, 22 Jan 2024 16:33:31 +0600 Subject: [PATCH 1/5] Adjusted existing form --- ...html => add-or-edit-salary.component.html} | 0 ...scss => add-or-edit-salary.component.scss} | 0 ...s => add-or-edit-salary.component.spec.ts} | 12 ++++----- ...ent.ts => add-or-edit-salary.component.ts} | 21 ++++++++------- ...add-salary-form.ts => edit-salary-form.ts} | 27 ++++++++++--------- .../salaries-chart.component.html | 5 ++-- src/app/modules/salaries/salaries.module.ts | 4 +-- 7 files changed, 36 insertions(+), 33 deletions(-) rename src/app/modules/salaries/components/add-salary/{add-salary.component.html => add-or-edit-salary.component.html} (100%) rename src/app/modules/salaries/components/add-salary/{add-salary.component.scss => add-or-edit-salary.component.scss} (100%) rename src/app/modules/salaries/components/add-salary/{add-salary.component.spec.ts => add-or-edit-salary.component.spec.ts} (64%) rename src/app/modules/salaries/components/add-salary/{add-salary.component.ts => add-or-edit-salary.component.ts} (78%) rename src/app/modules/salaries/components/add-salary/{add-salary-form.ts => edit-salary-form.ts} (66%) diff --git a/src/app/modules/salaries/components/add-salary/add-salary.component.html b/src/app/modules/salaries/components/add-salary/add-or-edit-salary.component.html similarity index 100% rename from src/app/modules/salaries/components/add-salary/add-salary.component.html rename to src/app/modules/salaries/components/add-salary/add-or-edit-salary.component.html diff --git a/src/app/modules/salaries/components/add-salary/add-salary.component.scss b/src/app/modules/salaries/components/add-salary/add-or-edit-salary.component.scss similarity index 100% rename from src/app/modules/salaries/components/add-salary/add-salary.component.scss rename to src/app/modules/salaries/components/add-salary/add-or-edit-salary.component.scss diff --git a/src/app/modules/salaries/components/add-salary/add-salary.component.spec.ts b/src/app/modules/salaries/components/add-salary/add-or-edit-salary.component.spec.ts similarity index 64% rename from src/app/modules/salaries/components/add-salary/add-salary.component.spec.ts rename to src/app/modules/salaries/components/add-salary/add-or-edit-salary.component.spec.ts index 035696de..d00727dc 100644 --- a/src/app/modules/salaries/components/add-salary/add-salary.component.spec.ts +++ b/src/app/modules/salaries/components/add-salary/add-or-edit-salary.component.spec.ts @@ -1,23 +1,23 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { AddSalaryComponent } from './add-salary.component'; +import { AddOrEditSalaryComponent } from './add-or-edit-salary.component'; import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { mostUsedImports, testUtilStubs, mostUsedServices } from '@shared/test-utils'; -describe('AddSalaryComponent', () => { - let component: AddSalaryComponent; - let fixture: ComponentFixture; +describe('AddOrEditSalaryComponent', () => { + let component: AddOrEditSalaryComponent; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [AddSalaryComponent], + declarations: [AddOrEditSalaryComponent], imports: [...mostUsedImports], providers: [...testUtilStubs, ...mostUsedServices], schemas: [CUSTOM_ELEMENTS_SCHEMA] }) .compileComponents(); - fixture = TestBed.createComponent(AddSalaryComponent); + fixture = TestBed.createComponent(AddOrEditSalaryComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/src/app/modules/salaries/components/add-salary/add-salary.component.ts b/src/app/modules/salaries/components/add-salary/add-or-edit-salary.component.ts similarity index 78% rename from src/app/modules/salaries/components/add-salary/add-salary.component.ts rename to src/app/modules/salaries/components/add-salary/add-or-edit-salary.component.ts index feeac6f6..a6309b69 100644 --- a/src/app/modules/salaries/components/add-salary/add-salary.component.ts +++ b/src/app/modules/salaries/components/add-salary/add-or-edit-salary.component.ts @@ -1,21 +1,22 @@ -import { Component, EventEmitter, OnDestroy, OnInit, Output } from '@angular/core'; +import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core'; import { UserSalariesService } from '@services/user-salaries.service'; -import { AddSalaryForm } from './add-salary-form'; +import { EditSalaryForm } from './edit-salary-form'; import { untilDestroyed } from '@shared/subscriptions/until-destroyed'; import { CompanyTypeSelectItem } from '@shared/select-boxes/company-type-select-item'; import { DeveloperGradeSelectItem } from '@shared/select-boxes/developer-grade-select-item'; import { ProfessionSelectItem } from '@shared/select-boxes/profession-select-item'; import { UserSalary } from '@models/salaries/salary.model'; -import { error } from 'console'; import { AlertService } from '@shared/components/alert/services/alert.service'; -import { catchError, tap } from 'rxjs'; @Component({ - selector: 'app-add-salary-modal', - templateUrl: './add-salary.component.html', - styleUrl: './add-salary.component.scss' + selector: 'app-add-or-edit-salary-modal', + templateUrl: './add-or-edit-salary.component.html', + styleUrl: './add-or-edit-salary.component.scss' }) -export class AddSalaryComponent implements OnInit, OnDestroy { +export class AddOrEditSalaryComponent implements OnInit, OnDestroy { + + @Input() + salarytoBeEdited: UserSalary | null = null; @Output() closed: EventEmitter = new EventEmitter(); @@ -23,7 +24,7 @@ export class AddSalaryComponent implements OnInit, OnDestroy { @Output() salaryAdded: EventEmitter = new EventEmitter(); - addSalaryForm: AddSalaryForm | null = null; + addSalaryForm: EditSalaryForm | null = null; errorMessage: string | null = null; readonly companyTypes: Array = CompanyTypeSelectItem.allItems(); @@ -35,7 +36,7 @@ export class AddSalaryComponent implements OnInit, OnDestroy { private readonly alert: AlertService) {} ngOnInit(): void { - this.addSalaryForm = new AddSalaryForm(); + this.addSalaryForm = new EditSalaryForm(this.salarytoBeEdited); } addSalarySubmitAction(): void { diff --git a/src/app/modules/salaries/components/add-salary/add-salary-form.ts b/src/app/modules/salaries/components/add-salary/edit-salary-form.ts similarity index 66% rename from src/app/modules/salaries/components/add-salary/add-salary-form.ts rename to src/app/modules/salaries/components/add-salary/edit-salary-form.ts index c0a63f96..0c907bc4 100644 --- a/src/app/modules/salaries/components/add-salary/add-salary-form.ts +++ b/src/app/modules/salaries/components/add-salary/edit-salary-form.ts @@ -2,46 +2,47 @@ import { FormControl, FormGroup, Validators } from "@angular/forms"; import { DeveloperGrade } from "@models/enums"; import { CompanyType } from "@models/salaries/company-type"; import { Currency } from "@models/salaries/currency"; +import { UserSalary } from "@models/salaries/salary.model"; import { UserProfession } from "@models/salaries/user-profession"; import { CreateUserSalaryRequest } from "@services/user-salaries.service"; -export class AddSalaryForm extends FormGroup { +export class EditSalaryForm extends FormGroup { static readonly digitsPattern = '^[0-9]*$'; - constructor() { + constructor(private readonly salarytoBeEdited: UserSalary | null) { const now = new Date(Date.now()); const currentQuarter = Math.floor((now.getMonth() + 3) / 3); super({ value: new FormControl( - null, + salarytoBeEdited?.value ?? null, [ - Validators.pattern(AddSalaryForm.digitsPattern), + Validators.pattern(EditSalaryForm.digitsPattern), Validators.required, Validators.min(42500), Validators.max(10000000), ]), quarter: new FormControl( - currentQuarter, + salarytoBeEdited?.quarter ?? currentQuarter, [ - Validators.pattern(AddSalaryForm.digitsPattern), + Validators.pattern(EditSalaryForm.digitsPattern), Validators.min(1), Validators.max(4), Validators.required ]), year: new FormControl( - now.getFullYear(), + salarytoBeEdited?.year ?? now.getFullYear(), [ - Validators.pattern(AddSalaryForm.digitsPattern), + Validators.pattern(EditSalaryForm.digitsPattern), Validators.min(2000), Validators.max(2100), Validators.required ]), - currency: new FormControl(Currency.KZT, [Validators.required]), - company: new FormControl(null, [Validators.required]), - grade: new FormControl(null, []), - profession: new FormControl(null, [Validators.required]), + currency: new FormControl(salarytoBeEdited?.currency ?? Currency.KZT, [Validators.required]), + company: new FormControl(salarytoBeEdited?.currency ?? null, [Validators.required]), + grade: new FormControl(salarytoBeEdited?.currency ?? null, [Validators.required]), + profession: new FormControl(salarytoBeEdited?.currency ?? null, [Validators.required]), }); } @@ -66,4 +67,4 @@ static readonly digitsPattern = '^[0-9]*$'; this.markAllAsTouched(); return null; } -} \ No newline at end of file +} diff --git a/src/app/modules/salaries/components/salaries-chart/salaries-chart.component.html b/src/app/modules/salaries/components/salaries-chart/salaries-chart.component.html index a42e92f3..27fa8c4b 100644 --- a/src/app/modules/salaries/components/salaries-chart/salaries-chart.component.html +++ b/src/app/modules/salaries/components/salaries-chart/salaries-chart.component.html @@ -123,11 +123,12 @@ - + >
diff --git a/src/app/modules/salaries/salaries.module.ts b/src/app/modules/salaries/salaries.module.ts index 5c95c7ff..e64ed26a 100644 --- a/src/app/modules/salaries/salaries.module.ts +++ b/src/app/modules/salaries/salaries.module.ts @@ -5,7 +5,7 @@ import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { NgSelectModule } from '@ng-select/ng-select'; import { SharedModule } from '@shared/shared.module'; import { SalariesChartComponent } from './components/salaries-chart/salaries-chart.component'; -import { AddSalaryComponent } from './components/add-salary/add-salary.component'; +import { AddOrEditSalaryComponent } from './components/add-salary/add-or-edit-salary.component'; import { SalariesByGradesChartComponent } from './components/salaries-by-grades-chart/salaries-by-grades-chart.component'; import { SalaryBlockValueComponent } from './components/salaries-chart/salary-block-value/salary-block-value.component'; import { SalaryBlockRemoteValueComponent } from './components/salaries-chart/salary-block-remote-value/salary-block-remote-value.component'; @@ -14,7 +14,7 @@ import { SalaryChartGlobalFiltersComponent } from './components/salaries-chart/s @NgModule({ declarations: [ SalariesChartComponent, - AddSalaryComponent, + AddOrEditSalaryComponent, SalariesByGradesChartComponent, SalaryBlockValueComponent, SalaryBlockRemoteValueComponent, From e61fb8331d786b8b3d883f0fda45c88347b3d07d Mon Sep 17 00:00:00 2001 From: "maxim.gorbatyuk" Date: Mon, 22 Jan 2024 16:53:23 +0600 Subject: [PATCH 2/5] Adjusted models --- src/app/models/salaries/salary.model.ts | 1 + .../add-or-edit-salary.component.ts | 29 +++++++++++++++---- .../salaries-chart/salaries-chart.ts | 9 ++++++ src/app/services/user-salaries.service.ts | 25 +++++++++++----- 4 files changed, 52 insertions(+), 12 deletions(-) diff --git a/src/app/models/salaries/salary.model.ts b/src/app/models/salaries/salary.model.ts index 7fd6bed3..a02e5a8e 100644 --- a/src/app/models/salaries/salary.model.ts +++ b/src/app/models/salaries/salary.model.ts @@ -8,6 +8,7 @@ export interface UserSalaryAdminDto extends UserSalary{ } export interface UserSalary { + id: string; value: number; quarter: number; year: number; diff --git a/src/app/modules/salaries/components/add-salary/add-or-edit-salary.component.ts b/src/app/modules/salaries/components/add-salary/add-or-edit-salary.component.ts index a6309b69..290f7598 100644 --- a/src/app/modules/salaries/components/add-salary/add-or-edit-salary.component.ts +++ b/src/app/modules/salaries/components/add-salary/add-or-edit-salary.component.ts @@ -5,7 +5,7 @@ import { untilDestroyed } from '@shared/subscriptions/until-destroyed'; import { CompanyTypeSelectItem } from '@shared/select-boxes/company-type-select-item'; import { DeveloperGradeSelectItem } from '@shared/select-boxes/developer-grade-select-item'; import { ProfessionSelectItem } from '@shared/select-boxes/profession-select-item'; -import { UserSalary } from '@models/salaries/salary.model'; +import { UserSalary, UserSalaryAdminDto } from '@models/salaries/salary.model'; import { AlertService } from '@shared/components/alert/services/alert.service'; @Component({ @@ -16,7 +16,7 @@ import { AlertService } from '@shared/components/alert/services/alert.service'; export class AddOrEditSalaryComponent implements OnInit, OnDestroy { @Input() - salarytoBeEdited: UserSalary | null = null; + salarytoBeEdited: UserSalaryAdminDto | null = null; @Output() closed: EventEmitter = new EventEmitter(); @@ -46,6 +46,25 @@ export class AddOrEditSalaryComponent implements OnInit, OnDestroy { return; } + if (this.salarytoBeEdited) { + this.service + .update(this.salarytoBeEdited.id, data) + .pipe(untilDestroyed(this)) + .subscribe( + (x) => { + if (x.isSuccess && x.createdSalary) { + this.errorMessage = null; + this.alert.success(this.salarytoBeEdited ? 'Зарплата обновлена' : 'Зарплата успешно записана'); + this.salaryAdded.emit(x.createdSalary); + } else { + const error = 'За данный квартал уже есть запись'; + this.alert.error(error); + this.errorMessage = error; + }}); + + return; + } + this.service .create(data) .pipe(untilDestroyed(this)) @@ -53,14 +72,14 @@ export class AddOrEditSalaryComponent implements OnInit, OnDestroy { (x) => { if (x.isSuccess && x.createdSalary) { this.errorMessage = null; - this.alert.success('Зарплата успешно записана'); + this.alert.success(this.salarytoBeEdited ? 'Зарплата обновлена' : 'Зарплата успешно записана'); this.salaryAdded.emit(x.createdSalary); } else { const error = 'За данный квартал уже есть запись'; this.alert.error(error); this.errorMessage = error; - } - }); + }}); + } ngOnDestroy(): void { diff --git a/src/app/modules/salaries/components/salaries-chart/salaries-chart.ts b/src/app/modules/salaries/components/salaries-chart/salaries-chart.ts index bcc64f0f..98acf667 100644 --- a/src/app/modules/salaries/components/salaries-chart/salaries-chart.ts +++ b/src/app/modules/salaries/components/salaries-chart/salaries-chart.ts @@ -1,6 +1,7 @@ import { formatNumber } from "@angular/common"; import { SalariesByMoneyBarChart, SalariesChartResponse } from "@services/user-salaries.service"; import { SalariesPerProfession } from "../salaries-per-profession"; +import { UserSalary } from "@models/salaries/salary.model"; export class SalariesChart { @@ -18,6 +19,9 @@ export class SalariesChart { readonly salariesPerProfessionForLocal: Array | null; readonly salariesPerProfessionForRemote: Array | null; + readonly currentUserSalary: UserSalary | null = null; + readonly currentUserSalaryValue: string | null = null; + readonly hasRemoteSalaries: boolean; constructor(readonly data: SalariesChartResponse) { @@ -37,6 +41,11 @@ export class SalariesChart { this.salariesPerProfessionForLocal = salariesPerProfession.local; this.salariesPerProfessionForRemote = salariesPerProfession.remote; this.hasRemoteSalaries = this.salariesPerProfessionForRemote.length > 0; + + this.currentUserSalary = data.currentUserSalary; + this.currentUserSalaryValue = data.currentUserSalary + ? SalariesChart.formatNumber(data.currentUserSalary.value) + : null; } private static formatNumber(value: number | null): string | null { diff --git a/src/app/services/user-salaries.service.ts b/src/app/services/user-salaries.service.ts index 46974013..787cc69c 100644 --- a/src/app/services/user-salaries.service.ts +++ b/src/app/services/user-salaries.service.ts @@ -33,6 +33,8 @@ export interface SalariesChartResponse { salariesByMoneyBarChart: SalariesByMoneyBarChart | null; salariesByMoneyBarChartForRemote: SalariesByMoneyBarChart | null; + + currentUserSalary: UserSalaryAdminDto | null; } export interface SalariesByProfessionMoneyBarChartItem { @@ -58,11 +60,6 @@ export interface CreateSalaryRecordResponse { createdSalary: UserSalary | null; } -export interface UpdateSalaryRequest { - company: CompanyType; - grade: DeveloperGrade | null; -} - export interface AdminAllSalariesQueryParams extends PageParams { page: number; pageSize: number; @@ -75,6 +72,16 @@ export interface SalariesChartFilterData { grade: DeveloperGrade | null; } +export interface SalariesAddingTrendAdminChart { + labels: string[]; + items: Array<{ + count: number, + startedAt: Date, + }>; + + salariesPerUser: number; +} + @Injectable({ providedIn: 'root' }) @@ -87,6 +94,10 @@ export class UserSalariesService { this.root + 'all?' + new ConvertObjectToHttpParams(pageParams).get()); } + addingSalariesaTrendAdminChart(): Observable { + return this.api.get(this.root + 'salaries-adding-trend-chart'); + } + charts(filters: SalariesChartFilterData): Observable { return this.api.get( this.root + 'chart?' + new ConvertObjectToHttpParams(filters).get()); @@ -96,8 +107,8 @@ export class UserSalariesService { return this.api.post(this.root, data); } - update(id: string, data: UpdateSalaryRequest): Observable { - return this.api.post(this.root + id, data); + update(id: string, data: CreateUserSalaryRequest): Observable { + return this.api.post(this.root + id, data); } delete(dataId: string): Observable { From 3b5b455feef63887b021f43c06f403c33a67ee75 Mon Sep 17 00:00:00 2001 From: "maxim.gorbatyuk" Date: Mon, 22 Jan 2024 18:29:33 +0600 Subject: [PATCH 3/5] Adjusted front page --- src/app/models/salaries/salary.model.ts | 1 - .../add-or-edit-salary.component.html | 24 ++--- .../add-or-edit-salary.component.ts | 8 ++ .../components/add-salary/edit-salary-form.ts | 6 +- .../salaries-chart.component.html | 93 +++++++++++-------- .../salaries-chart.component.ts | 31 +++++++ .../salaries-chart/salaries-chart.ts | 4 +- .../salary-block-remote-value.component.html | 2 +- .../salary-block-remote-value.component.ts | 2 +- .../salaries-chart/stub-salaries-chart.ts | 1 + src/styles.scss | 3 +- 11 files changed, 115 insertions(+), 60 deletions(-) diff --git a/src/app/models/salaries/salary.model.ts b/src/app/models/salaries/salary.model.ts index a02e5a8e..7fd6bed3 100644 --- a/src/app/models/salaries/salary.model.ts +++ b/src/app/models/salaries/salary.model.ts @@ -8,7 +8,6 @@ export interface UserSalaryAdminDto extends UserSalary{ } export interface UserSalary { - id: string; value: number; quarter: number; year: number; diff --git a/src/app/modules/salaries/components/add-salary/add-or-edit-salary.component.html b/src/app/modules/salaries/components/add-salary/add-or-edit-salary.component.html index 3b9c31ee..7367625d 100644 --- a/src/app/modules/salaries/components/add-salary/add-or-edit-salary.component.html +++ b/src/app/modules/salaries/components/add-salary/add-or-edit-salary.component.html @@ -2,28 +2,28 @@