-
- На графике можно увидеть зарплаты в Казахстане по разным специальностям IT. Данные заполняются самими пользователями.
-
+
-
- Вы сможете посмотреть график только после добавления хотя бы одной зарплаты за последний год.
-
+
+
Ваша зарплата «в рынке»?
+
Зарегистрируйтесь и оставьте данные о своей зарплате, чтобы узнать, сколько зарабатывают другие IT-специалисты в Казахстане.
+
+
+
+
-
- TODO: в скором времени будут добавлены график и возможность фльтрации данных по специальностям, грейдам и фреймворкам/языкам программирования
-
+
+
Ваша зарплата «в рынке»?
+
Оставьте данные о своей зарплате, чтобы узнать, сколько зарабатывают другие IT-специалисты в Казахстане.
+
+
+
+
+
+
+
+
+
+
Квалификации:
-
+
+
+
@@ -47,7 +41,7 @@
-
+
Средняя зарплата:
{{ salariesChart.averageSalary }}
@@ -55,13 +49,30 @@
-
-
График зарплат по профессиям
+
+
Рассчитано на основании {{ salariesChart.countOfRecords }} анкет(ы)
+
+
+
+
Данные сгенерированы для демонстрации.
+ для получения актуальных данных.
+
+
+
+
По всем IT-специалистам
+
+ TODO: в скором времени будет добавлена возможность фильтрации данных по специальностям, грейдам и фреймворкам/языкам программирования
+
+
+
+
+ Идея подсмотрена у сервиса
Habr.Карьера, за что им большая благодарность.
+
diff --git a/src/app/modules/salaries/components/salaries-chart/salaries-chart.component.ts b/src/app/modules/salaries/components/salaries-chart/salaries-chart.component.ts
index 04acbcb5..73abb689 100644
--- a/src/app/modules/salaries/components/salaries-chart/salaries-chart.component.ts
+++ b/src/app/modules/salaries/components/salaries-chart/salaries-chart.component.ts
@@ -7,6 +7,7 @@ import { untilDestroyed } from '@shared/subscriptions/until-destroyed';
import { SalariesChart } from './salaries-chart';
import { AuthService } from '@shared/services/auth/auth.service';
import { CookieService } from 'ngx-cookie-service';
+import { StubSalariesChart } from './stub-salaries-chart';
@Component({
templateUrl: './salaries-chart.component.html',
@@ -15,8 +16,16 @@ import { CookieService } from 'ngx-cookie-service';
export class SalariesChartComponent implements OnInit, OnDestroy {
salariesChart: SalariesChart | null = null;
-
+ showDataStub = false;
openAddSalaryModal = false;
+ isAuthenticated = false;
+
+ readonly grades: Array
= [
+ "Junior",
+ "Middle",
+ "Senior",
+ "Lead",
+ ];
constructor(
private readonly service: UserSalariesService,
@@ -28,29 +37,40 @@ export class SalariesChartComponent implements OnInit, OnDestroy {
}
ngOnInit(): void {
- if (this.authService.isAuthenticated()) {
+ this.isAuthenticated = this.authService.isAuthenticated();
+ if (this.isAuthenticated) {
this.load();
return;
}
- console.log('Saving url to cookie', this.router.url);
- this.cookieService.set('url', this.router.url);
- this.authService.login();
+ this.showDataStub = true;
+ this.salariesChart = new StubSalariesChart();
}
load(): void {
this.service.charts()
.pipe(untilDestroyed(this))
.subscribe((x) => {
- this.salariesChart = new SalariesChart(x);
if (x.shouldAddOwnSalary) {
this.openAddSalaryModal = true;
+ this.showDataStub = true;
+ this.salariesChart = new StubSalariesChart();
+ } else {
+ this.salariesChart = new SalariesChart(x);
+ this.showDataStub = false;
}
});
}
openAddSalaryAction(): void {
- this.openAddSalaryModal = true;
+ if (this.authService.isAuthenticated()) {
+ this.openAddSalaryModal = true;
+ return;
+ }
+
+ console.log('Saving url to cookie', this.router.url);
+ this.cookieService.set('url', this.router.url);
+ this.authService.login();
}
closeAddSalaryAction(): 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 70d7987c..e1b544c7 100644
--- a/src/app/modules/salaries/components/salaries-chart/salaries-chart.ts
+++ b/src/app/modules/salaries/components/salaries-chart/salaries-chart.ts
@@ -7,7 +7,7 @@ export class SalariesChart {
readonly medianSalary: string;
readonly countOfRecords: number;
readonly salariesByProfession: Array;
- readonly salariesByMoneyBarChart: SalariesByMoneyBarChart;
+ readonly salariesByMoneyBarChart: SalariesByMoneyBarChart | null;
constructor(readonly data: SalariesChartResponse) {
this.averageSalary = formatNumber(data.averageSalary, 'en-US', '1.0-2');
diff --git a/src/app/modules/salaries/components/salaries-chart/stub-salaries-chart.ts b/src/app/modules/salaries/components/salaries-chart/stub-salaries-chart.ts
new file mode 100644
index 00000000..01baea76
--- /dev/null
+++ b/src/app/modules/salaries/components/salaries-chart/stub-salaries-chart.ts
@@ -0,0 +1,63 @@
+import { Currency } from "@models/salaries/currency";
+import { SalariesChart } from "./salaries-chart";
+import { CompanyType } from "@models/salaries/company-type";
+import { DeveloperGrade } from "@models/enums";
+import { UserProfession } from "@models/salaries/user-profession";
+
+export class StubSalariesChart extends SalariesChart {
+
+ private static readonly salaryLabels = [
+ "250000",
+ "500000",
+ "750000",
+ "1000000",
+ "1250000",
+ "1500000",
+ ]
+
+ constructor() {
+ const salariesCount = 10;
+ const thisYearDate = new Date();
+ const salaries = [];
+
+ for (let index = 0; index < salariesCount; index++) {
+ salaries.push(
+ {
+ value: StubSalariesChart.getRandomNumber(1_500_000, 250_000),
+ quarter: 1,
+ year: thisYearDate.getFullYear(),
+ currency: Currency.KZT,
+ company: CompanyType.Local,
+ grade: DeveloperGrade.Middle,
+ profession: UserProfession.Developer, // TODO mgorbatyuk: randomize
+ createdAt: thisYearDate,
+ });
+ }
+
+ super({
+ averageSalary: 450_000,
+ medianSalary: 356_000,
+ shouldAddOwnSalary: true,
+ salaries: salaries,
+ salariesByProfession: [],
+ salariesByMoneyBarChart: {
+ items: StubSalariesChart.salaryLabels.map((x) => {
+ const value = parseInt(x);
+ return {
+ start: value,
+ end: value + 250_000,
+ count: StubSalariesChart.getRandomNumber(100, 25),
+ };
+ }),
+ itemsByProfession: [],
+ labels: StubSalariesChart.salaryLabels,
+ },
+ rangeStart: new Date(),
+ rangeEnd: new Date(),
+ });
+ }
+
+ private static getRandomNumber(max: number, min: number): number {
+ return Math.floor(Math.random() * (max - min + 1)) + min;
+ }
+}
diff --git a/src/app/services/user-salaries.service.ts b/src/app/services/user-salaries.service.ts
index e829cc4b..dd65ed87 100644
--- a/src/app/services/user-salaries.service.ts
+++ b/src/app/services/user-salaries.service.ts
@@ -25,7 +25,7 @@ export interface SalariesChartResponse {
averageSalary: number;
medianSalary: number;
salariesByProfession: SalariesByProfession[];
- salariesByMoneyBarChart: SalariesByMoneyBarChart;
+ salariesByMoneyBarChart: SalariesByMoneyBarChart | null;
}
export interface SalariesByProfession {