Skip to content

Commit f2ea422

Browse files
committed
implement logic to project edit from facades into components
1 parent 3b6fff1 commit f2ea422

36 files changed

Lines changed: 585 additions & 3232 deletions

projects/social_platform/src/app/api/project/facades/edit/project-achievements.service.ts

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -46,22 +46,24 @@ export class ProjectAchievementsService {
4646
}
4747

4848
private readonly achievements = this.projectFormService.achievements;
49+
4950
readonly hasAchievements = computed(
5051
() => this.achievementsItems().length > 0 || this.achievements.length > 0
5152
);
5253

54+
private readonly projectForm = this.projectFormService.getForm();
55+
5356
/**
5457
* Добавляет новое достижение или сохраняет изменения существующего.
5558
* @param achievementsFormArray FormArray, содержащий формы достижений
56-
* @param projectForm основная форма проекта (FormGroup)
5759
*/
58-
public addAchievement(achievementsFormArray: FormArray, projectForm: FormGroup): void {
60+
public addAchievement(achievementsFormArray: FormArray): void {
5961
// Инициализируем сигнал при первом вызове
6062
this.initializeAchievementsItems(achievementsFormArray);
6163

6264
// Считываем вводимые данные
63-
const title = projectForm.get("title")?.value;
64-
const status = projectForm.get("status")?.value;
65+
const title = this.projectForm.get("title")?.value;
66+
const status = this.projectForm.get("status")?.value;
6567

6668
// Проверяем, что поля не пустые
6769
if (!title || !status || title.trim().length === 0 || status.trim().length === 0) {
@@ -94,32 +96,27 @@ export class ProjectAchievementsService {
9496
}
9597

9698
// Очищаем поля ввода формы проекта
97-
projectForm.get("title")?.reset();
98-
projectForm.get("title")?.setValue("");
99+
this.projectForm.get("title")?.reset();
100+
this.projectForm.get("title")?.setValue("");
99101

100-
projectForm.get("status")?.reset();
101-
projectForm.get("status")?.setValue("");
102+
this.projectForm.get("status")?.reset();
103+
this.projectForm.get("status")?.setValue("");
102104
}
103105

104106
/**
105107
* Инициализирует редактирование существующего достижения.
106108
* @param index индекс достижения в списке
107109
* @param achievementsFormArray FormArray достижений
108-
* @param projectForm основная форма проекта
109110
*/
110-
public editAchievement(
111-
index: number,
112-
achievementsFormArray: FormArray,
113-
projectForm: FormGroup
114-
): void {
111+
public editAchievement(index: number, achievementsFormArray: FormArray): void {
115112
// Инициализируем сигнал при необходимости
116113
this.initializeAchievementsItems(achievementsFormArray);
117114

118115
// Используем данные из FormArray как источник истины
119116
const source = achievementsFormArray.value[index];
120117

121118
// Заполняем поля формы проекта для редактирования
122-
projectForm.patchValue({
119+
this.projectForm.patchValue({
123120
achievementsName: source?.achievementsName || "",
124121
achievementsDate: source?.achievementsDate || "",
125122
});

projects/social_platform/src/app/api/project/facades/edit/project-contacts.service.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,12 @@ export class ProjectContactsService {
4040
* Полезно вызывать после загрузки данных с сервера
4141
*/
4242
public syncLinksItems(linksFormArray: FormArray): void {
43-
if (linksFormArray) {
43+
if (linksFormArray && linksFormArray.length > 0) {
4444
this.linksItems.set(linksFormArray.value);
45+
} else {
46+
this.linksItems.set([]);
4547
}
48+
this.initialized = true;
4649
}
4750

4851
readonly hasLinks = computed(() => this.linksItems().length > 0);
@@ -76,7 +79,7 @@ export class ProjectContactsService {
7679
public addLink(linksFormArray: FormArray): void {
7780
this.initializeLinksItems(linksFormArray);
7881
linksFormArray.push(this.fb.control("", Validators.required));
79-
this.linksItems.update(items => [...items, ""]);
82+
this.syncLinksItems(linksFormArray);
8083
}
8184

8285
/**
@@ -107,8 +110,8 @@ export class ProjectContactsService {
107110
*/
108111
public removeLink(index: number, linksFormArray: FormArray): void {
109112
// Удаляем из сигнала и из FormArray
110-
this.linksItems.update(items => items.filter((_, i) => i !== index));
111113
linksFormArray.removeAt(index);
114+
this.syncLinksItems(linksFormArray);
112115
}
113116

114117
/**

projects/social_platform/src/app/api/project/facades/edit/project-team.service.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ export class ProjectTeamService {
7373
this.inviteService
7474
.updateInvite(inviteId, role, specialization)
7575
.pipe(takeUntil(this.destroy$))
76-
.subscribe(() => {});
76+
.subscribe(() => this.projectTeamUIService.applyEditInvitation(params));
7777
}
7878

7979
/**
@@ -84,7 +84,7 @@ export class ProjectTeamService {
8484
this.inviteService
8585
.revokeInvite(invitationId)
8686
.pipe(takeUntil(this.destroy$))
87-
.subscribe(() => {});
87+
.subscribe(() => this.projectTeamUIService.applyRemoveInvitation(invitationId));
8888
}
8989

9090
/**

projects/social_platform/src/app/api/project/facades/edit/project-vacancy.service.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import { inject, Injectable } from "@angular/core";
44
import { Validators } from "@angular/forms";
55
import { ValidationService } from "@corelib";
6-
import { Skill } from "../../../../domain/skills/skill";
76
import { VacancyService } from "../../../vacancy/vacancy.service";
87
import { Subject, takeUntil } from "rxjs";
98
import { ProjectVacancyUIService } from "./ui/project-vacancy-ui.service";

projects/social_platform/src/app/api/project/facades/edit/projects-edit-info.service.ts

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import { computed, inject, Injectable, signal } from "@angular/core";
44
import { NavService } from "@ui/services/nav/nav.service";
5-
import { ProjectAssign } from "projects/social_platform/src/app/domain/project/project-assign.model";
65
import {
76
distinctUntilChanged,
87
forkJoin,
@@ -20,7 +19,6 @@ import { Goal } from "projects/social_platform/src/app/domain/project/goals.mode
2019
import { Partner } from "projects/social_platform/src/app/domain/project/partner.model";
2120
import { Resource } from "projects/social_platform/src/app/domain/project/resource.model";
2221
import { Invite } from "projects/social_platform/src/app/domain/invite/invite.model";
23-
import { Skill } from "projects/social_platform/src/app/domain/skills/skill";
2422
import { HttpErrorResponse } from "@angular/common/http";
2523
import { ValidationService } from "@corelib";
2624
import { SnackbarService } from "@ui/services/snackbar/snackbar.service";
@@ -30,7 +28,6 @@ import { IndustryService } from "../../../industry/industry.service";
3028
import { SkillsService } from "../../../skills/skills.service";
3129
import { ProjectFormService } from "./project-form.service";
3230
import { ProjectGoalService } from "./project-goals.service";
33-
import { ProjectVacancyService } from "./project-vacancy.service";
3431
import { ProjectPartnerService } from "./project-partner.service";
3532
import { ProjectResourceService } from "./project-resources.service";
3633
import { ProjectAchievementsService } from "./project-achievements.service";
@@ -39,6 +36,8 @@ import { SkillsInfoService } from "../../../skills/facades/skills-info.service";
3936
import { ProjectsEditUIInfoService } from "./ui/projects-edit-ui-info.service";
4037
import { ProjectVacancyUIService } from "./ui/project-vacancy-ui.service";
4138
import { ProjectTeamUIService } from "./ui/project-team-ui.service";
39+
import { ProjectContactsService } from "./project-contacts.service";
40+
import { ProjectVacancyService } from "./project-vacancy.service";
4241

4342
@Injectable()
4443
export class ProjectsEditInfoService {
@@ -70,6 +69,8 @@ export class ProjectsEditInfoService {
7069
private readonly projectAchievementsService = inject(ProjectAchievementsService);
7170
private readonly projectAdditionalService = inject(ProjectAdditionalService);
7271

72+
private readonly projectContactsService = inject(ProjectContactsService);
73+
7374
private readonly destroy$ = new Subject<void>();
7475

7576
// Текущий шаг редактирования
@@ -116,11 +117,19 @@ export class ProjectsEditInfoService {
116117
readonly nestedSkills$ = this.skillsService.getSkillsNested();
117118

118119
// Состояние отправки форм
119-
readonly projSubmitInitiated = signal<boolean>(false);
120120
readonly submitMode = signal<"draft" | "published" | null>(null);
121+
122+
readonly projSubmitInitiated = signal<boolean>(false);
121123
readonly projFormIsSubmittingAsPublished = signal<boolean>(false);
122124
readonly projFormIsSubmittingAsDraft = signal<boolean>(false);
125+
123126
readonly openGroupIds = signal<Set<number>>(new Set());
127+
readonly openSkillGroup = signal<string | null>(null);
128+
129+
/**
130+
* Проверяет, есть ли открытые группы навыков
131+
*/
132+
readonly hasOpenSkillsGroups = this.openSkillGroup() !== null;
124133

125134
initializationEditInfo(): void {
126135
this.navService.setNavTitle("Создание проекта");
@@ -195,12 +204,18 @@ export class ProjectsEditInfoService {
195204
* Удаление проекта с проверкой удаления у пользователя
196205
*/
197206
deleteProject(): void {
207+
const programId = this.projectForm.get("partnerProgramId")?.value;
208+
198209
this.projectService
199210
.remove(Number(this.route.snapshot.paramMap.get("projectId")))
200211
.pipe(takeUntil(this.destroy$))
201212
.subscribe({
202213
next: () => {
203-
this.router.navigateByUrl(`/office/projects/my`);
214+
if (this.fromProgram()) {
215+
this.router.navigateByUrl(`/office/program/${programId}`);
216+
} else {
217+
this.router.navigateByUrl(`/office/projects/my`);
218+
}
204219
},
205220
});
206221
}
@@ -348,6 +363,9 @@ export class ProjectsEditInfoService {
348363
this.projectTeamUIService.applySetInvites(invites);
349364
this.projectTeamUIService.applySetCollaborators(project.collaborators);
350365

366+
// Синхронизируем ссылки после инициализации данных проекта
367+
this.projectContactsService.syncLinksItems(this.projectFormService.links);
368+
351369
if (project.partnerProgram) {
352370
this.isCompetitive.set(
353371
!!project.partnerProgram.programId && project.partnerProgram.canSubmit
@@ -361,7 +379,6 @@ export class ProjectsEditInfoService {
361379
}
362380

363381
this.projectVacancyUIService.applySetVacancies(project.vacancies);
364-
this.projectTeamUIService.applySetInvites(invites);
365382
}
366383
);
367384
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/** @format */
2+
3+
import { inject, Injectable, signal } from "@angular/core";
4+
import { ProjectFormService } from "../project-form.service";
5+
import { ToggleFieldsInfoService } from "../../../../toggle-fields/toggle-fields-info.service";
6+
7+
@Injectable({
8+
providedIn: "root",
9+
})
10+
export class ProjectAchievementUIService {
11+
private readonly projectFormService = inject(ProjectFormService);
12+
private readonly toggleFieldsInfoService = inject(ToggleFieldsInfoService);
13+
14+
private readonly editIndex = this.projectFormService.editIndex;
15+
private readonly projectForm = this.projectFormService.getForm();
16+
17+
/**
18+
* Скрывает поля ввода и очищает их
19+
*/
20+
hideFields(): void {
21+
this.toggleFieldsInfoService.hideFields();
22+
this.clearInputFields();
23+
}
24+
25+
private clearInputFields(): void {
26+
this.projectForm.get("achievementsName")?.reset();
27+
this.projectForm.get("achievementsName")?.setValue("");
28+
29+
if (this.editIndex() !== null) {
30+
this.projectFormService.editIndex.set(null);
31+
}
32+
}
33+
}

projects/social_platform/src/app/api/project/facades/edit/ui/project-team-ui.service.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/** @format */
22

3-
import { inject, Injectable, signal } from "@angular/core";
4-
import { FormBuilder, FormGroup, Validators } from "@angular/forms";
3+
import { computed, inject, Injectable, signal } from "@angular/core";
4+
import { FormBuilder, Validators } from "@angular/forms";
55
import { Invite } from "projects/social_platform/src/app/domain/invite/invite.model";
66
import { Collaborator } from "projects/social_platform/src/app/domain/project/collaborator.model";
77

@@ -18,6 +18,8 @@ export class ProjectTeamUIService {
1818
readonly inviteSubmitInitiated = signal(false);
1919
readonly inviteFormIsSubmitting = signal(false);
2020

21+
readonly invitesFill = computed(() => this.invites().some(inv => inv.isAccepted === null));
22+
2123
/**
2224
* Создает форму приглашения с контролами role, link и specialization, устанавливая валидаторы.
2325
*/

0 commit comments

Comments
 (0)