diff --git a/projects/social_platform/src/app/auth/login/login.component.html b/projects/social_platform/src/app/auth/login/login.component.html index 6076861c..af835c2d 100644 --- a/projects/social_platform/src/app/auth/login/login.component.html +++ b/projects/social_platform/src/app/auth/login/login.component.html @@ -2,7 +2,6 @@
- + +
+
+

Привет!

+
+ +
+

+ Рады знакомству 🙌
+ Вы находитесь на платформе procollab – здесь проходит программа, на которую вы ранее + регистрировались через форму заявки +

+ +

+ Ваша программа и её закрытая группа (к которой у вас автоматически есть доступ) находится + в одноименной вкладке «программы» +

+ +

+ На платформе есть еще много интересного: цифровой профиль, проекты, новостная лента, чаты + и другое – рекомендуем изучить +

+ +

+ Поздравляем с регистрацией! Желаем удачи в прохождении программы :) +

+
+ + спасибо, понятно +
+
+

Приглашение на текущий проект было удалено

diff --git a/projects/social_platform/src/app/office/office.component.scss b/projects/social_platform/src/app/office/office.component.scss index 808ce9de..6dc3c15a 100644 --- a/projects/social_platform/src/app/office/office.component.scss +++ b/projects/social_platform/src/app/office/office.component.scss @@ -134,6 +134,59 @@ } } +.cancel { + position: relative; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + max-height: calc(100vh - 40px); + + i { + position: absolute; + top: 0; + right: 0; + cursor: pointer; + } + + &__top { + display: flex; + flex-direction: column; + gap: 10px; + align-items: center; + margin-bottom: 10px; + } + + &__title { + text-align: center; + } + + &__text { + width: 40%; + color: var(--dark-grey); + text-align: center; + + &-block { + display: flex; + flex-direction: column; + gap: 12px; + margin: 30px 0; + } + + &-list { + margin-left: 20px; + + li { + list-style-type: disc; + } + } + } + + &__button { + margin-top: 20px; + } +} + .container { width: 100%; max-width: 1040px; diff --git a/projects/social_platform/src/app/office/office.component.ts b/projects/social_platform/src/app/office/office.component.ts index ad397fc5..272b6b4f 100644 --- a/projects/social_platform/src/app/office/office.component.ts +++ b/projects/social_platform/src/app/office/office.component.ts @@ -75,7 +75,13 @@ export class OfficeComponent implements OnInit, OnDestroy { waitVerificationModal = false; waitVerificationAccepted = false; + showRegisteredProgramModal = signal(false); + + registeredProgramToShow?: Program | null = null; + private pendingRegisteredModalCheck = false; + inviteErrorModal = false; + protected readonly programs = signal([]); navItems: { @@ -107,7 +113,6 @@ export class OfficeComponent implements OnInit, OnDestroy { this.subscriptions$.push(profileSub$); this.chatService.connect().subscribe(() => { - // Change users online status this.chatService.onSetOffline().subscribe(evt => { this.chatService.setOnlineStatus(evt.userId, false); }); @@ -133,6 +138,9 @@ export class OfficeComponent implements OnInit, OnDestroy { (program: Program) => Date.now() < Date.parse(program.datetimeRegistrationEnds) ); this.programs.set(resultPrograms.slice(0, 3)); + + console.log(this.programs().find(prog => prog.isUserMember)); + this.tryShowRegisteredProgramModal(); }, }); @@ -146,6 +154,8 @@ export class OfficeComponent implements OnInit, OnDestroy { onAcceptWaitVerification() { this.waitVerificationAccepted = true; localStorage.setItem("waitVerificationAccepted", "true"); + this.pendingRegisteredModalCheck = true; + this.tryShowRegisteredProgramModal(); } onRejectInvite(inviteId: number): void { @@ -187,6 +197,47 @@ export class OfficeComponent implements OnInit, OnDestroy { ); } + private tryShowRegisteredProgramModal(): void { + if (!this.pendingRegisteredModalCheck) return; + + const programs = this.programs(); + if (!programs || programs.length === 0) return; + + const memberProgram = programs.find(p => p.isUserMember); + if (!memberProgram) { + this.pendingRegisteredModalCheck = false; + return; + } + + if (!this.hasSeenRegisteredProgramModal(memberProgram.id)) { + this.registeredProgramToShow = memberProgram; + this.showRegisteredProgramModal.set(true); + this.markSeenRegisteredProgramModal(memberProgram.id); + } + + this.pendingRegisteredModalCheck = false; + } + + private getRegisteredProgramSeenKey(programId: number): string { + return `program_registered_modal_seen_${programId}`; + } + + private hasSeenRegisteredProgramModal(programId: number): boolean { + try { + return !!localStorage.getItem(this.getRegisteredProgramSeenKey(programId)); + } catch (e) { + return false; + } + } + + private markSeenRegisteredProgramModal(programId: number): void { + try { + localStorage.setItem(this.getRegisteredProgramSeenKey(programId), "1"); + } catch (e) { + // ignore storage errors + } + } + private buildNavItems(profile: User) { this.navItems = [ { name: "мой профиль", icon: "person", link: `profile/${profile.id}` }, diff --git a/projects/social_platform/src/app/office/program/detail/list/list.component.html b/projects/social_platform/src/app/office/program/detail/list/list.component.html index 9134795e..630fdea7 100644 --- a/projects/social_platform/src/app/office/program/detail/list/list.component.html +++ b/projects/social_platform/src/app/office/program/detail/list/list.component.html @@ -108,5 +108,59 @@ }
+ } @if (listType !== 'members' && listType !== 'projects') { +
+
+ + + @if (isHintExpertsVisible()) { +
+

+ Нажмите, чтобы открыть подсказку и узнать больше о процессе оценивания проектов +

+

подробнее

+
+ } +
+
+ + +
+
+

Как выставить оценки проекту

+
+ +
+

+ Перед стартом оценки,
+ настройте фильтрацию справа – выберите регион или конкретный кейс, а также работы, которые + ранее не были оценены другими экспертами +

+ +

+ После изучения материалов участников (описания и презентации проекта), проставьте оценки + по критериям. При необходимости оставьте небольшой комментарий +

+ +

+ Для завершения оценивания, нажмите «оценить проект» – ваша оценка сохранилась в системе +

+ +

+ Вы можете исправить свою оценку или комментарий – для этого нажмите на иконку карандаша + справа от кнопки «проект оценен». Этот функционал появится после сохранения оценки +

+ +

Благодарим за вашу работу!

+
+ + спасибо, понятно +
+
}
diff --git a/projects/social_platform/src/app/office/program/detail/list/list.component.scss b/projects/social_platform/src/app/office/program/detail/list/list.component.scss index 5302e26c..fef387b3 100644 --- a/projects/social_platform/src/app/office/program/detail/list/list.component.scss +++ b/projects/social_platform/src/app/office/program/detail/list/list.component.scss @@ -75,6 +75,12 @@ } } } + + &__tooltip { + position: fixed; + right: 320px; + bottom: 30px; + } } .filter { @@ -161,3 +167,85 @@ display: none; } } + +.tooltip { + position: relative; + display: flex; + align-items: center; + + &__wrapper { + position: absolute; + right: 100%; + bottom: 22px; + left: auto; + width: 310px; + padding: 18px 10px 10px 16px; + background-color: var(--white); + border: 0.5px solid var(--grey-for-text); + border-radius: var(--rounded-lg) var(--rounded-lg) 0 var(--rounded-lg); + + :last-child { + color: var(--black); + cursor: pointer; + } + } + + &__text { + color: var(--grey-for-text); + + a { + color: var(--accent); + } + } +} + +.cancel { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + width: 80%; + max-height: calc(100vh - 40px); + padding: 0 24px; + overflow-y: auto; + + @include responsive.apply-desktop { + width: 605px; + max-width: 100%; + } + + &__cross { + position: absolute; + top: 0; + right: 0; + width: 32px; + height: 32px; + cursor: pointer; + + @include responsive.apply-desktop { + top: 8px; + right: 8px; + } + } + + &__top { + display: flex; + flex-direction: column; + margin-bottom: 10px; + } + + &__title { + text-align: center; + } + + &__text { + text-align: center; + + &-block { + display: flex; + flex-direction: column; + gap: 12px; + margin: 30px 0; + } + } +} diff --git a/projects/social_platform/src/app/office/program/detail/list/list.component.ts b/projects/social_platform/src/app/office/program/detail/list/list.component.ts index 99d94ae1..c6a617bb 100644 --- a/projects/social_platform/src/app/office/program/detail/list/list.component.ts +++ b/projects/social_platform/src/app/office/program/detail/list/list.component.ts @@ -47,6 +47,8 @@ import { tagsFilter } from "projects/core/src/consts/filters/tags-filter.const"; import { ExportFileService } from "@office/services/export-file.service"; import { saveFile } from "@utils/helpers/export-file"; import { ProgramDataService } from "@office/program/services/program-data.service"; +import { TooltipComponent } from "@ui/components/tooltip/tooltip.component"; +import { ModalComponent } from "@ui/components/modal/modal.component"; @Component({ selector: "app-list", @@ -62,6 +64,8 @@ import { ProgramDataService } from "@office/program/services/program-data.servic InfoCardComponent, ButtonComponent, IconComponent, + TooltipComponent, + ModalComponent, ], standalone: true, }) @@ -114,6 +118,9 @@ export class ProgramListComponent implements OnInit, OnDestroy, AfterViewInit { readonly ratingOptionsList = tagsFilter; isFilterOpen = false; + readonly isHintExpertsVisible = signal(false); + readonly isHintExpertsModal = signal(false); + protected readonly loadingExportProjects = signal(false); protected readonly loadingExportSubmittedProjects = signal(false); protected readonly loadingExportRates = signal(false); @@ -609,6 +616,12 @@ export class ProgramListComponent implements OnInit, OnDestroy, AfterViewInit { .then(() => console.log("Query change from ProjectsComponent")); } + openHintModal(event: Event): void { + event.preventDefault(); + this.isHintExpertsVisible.set(false); + this.isHintExpertsModal.set(true); + } + private get itemsPerPage(): number { return this.listType === "rating" ? 10 diff --git a/projects/social_platform/src/app/office/program/detail/main/main.component.html b/projects/social_platform/src/app/office/program/detail/main/main.component.html index 354e89f4..c09b8a78 100644 --- a/projects/social_platform/src/app/office/program/detail/main/main.component.html +++ b/projects/social_platform/src/app/office/program/detail/main/main.component.html @@ -165,4 +165,45 @@ > + + +
+
+

поздравляем, с регистрацией на программу! 🎉

+
+ +
+

+ Это закрытая группа программы – доступ к ней есть только у зарегистрированных участников +

+ +

Здесь вы найдете:

+ +
    +
  • + самые актуальные и важные файлы программы (например, Положение) +
  • +
  • контакты организаторов для связи
  • +
  • новости программы
  • +
+ +

+ Важно: именно через закрытую группу и кнопку «подать проект» вы отправляете результаты + работы своей команды, когда будете готовы +

+ +

+ Будьте внимательны: по истечению дедлайна, определенного организаторами, кнопка становится + не кликабельной 👻 +

+
+ + спасибо, понятно +
+
} diff --git a/projects/social_platform/src/app/office/program/detail/main/main.component.scss b/projects/social_platform/src/app/office/program/detail/main/main.component.scss index e0d6b31a..8f6e3b02 100644 --- a/projects/social_platform/src/app/office/program/detail/main/main.component.scss +++ b/projects/social_platform/src/app/office/program/detail/main/main.component.scss @@ -220,6 +220,21 @@ width: 40%; color: var(--dark-grey); text-align: center; + + &-block { + display: flex; + flex-direction: column; + gap: 12px; + margin: 30px 0; + } + + &-list { + margin-left: 20px; + + li { + list-style-type: disc; + } + } } &__button { diff --git a/projects/social_platform/src/app/office/program/detail/main/main.component.ts b/projects/social_platform/src/app/office/program/detail/main/main.component.ts index da41a2fa..ef0af5fc 100644 --- a/projects/social_platform/src/app/office/program/detail/main/main.component.ts +++ b/projects/social_platform/src/app/office/program/detail/main/main.component.ts @@ -98,6 +98,8 @@ export class ProgramDetailMainComponent implements OnInit, OnDestroy { showProgramModal = signal(false); showProgramModalErrorMessage = signal(null); + registeredProgramModal = signal(false); + programId?: number; subscriptions$ = signal([]); @@ -135,6 +137,13 @@ export class ProgramDetailMainComponent implements OnInit, OnDestroy { tap(program => { this.program = program; this.registerDateExpired = Date.now() > Date.parse(program.datetimeRegistrationEnds); + if (program.isUserMember) { + const seen = this.hasSeenRegisteredProgramModal(program.id); + if (!seen) { + this.registeredProgramModal.set(true); + this.markSeenRegisteredProgramModal(program.id); + } + } }), concatMap(program => { if (program.isUserMember) { @@ -318,6 +327,24 @@ export class ProgramDetailMainComponent implements OnInit, OnDestroy { this.descriptionExpandable = descElement.scrollHeight > descElement.clientHeight; } + private getRegisteredProgramSeenKey(programId: number): string { + return `program_registered_modal_seen_${programId}`; + } + + private hasSeenRegisteredProgramModal(programId: number): boolean { + try { + return !!localStorage.getItem(this.getRegisteredProgramSeenKey(programId)); + } catch (e) { + return false; + } + } + + private markSeenRegisteredProgramModal(programId: number): void { + try { + localStorage.setItem(this.getRegisteredProgramSeenKey(programId), "1"); + } catch (e) {} + } + private setupNewsObserver(): void { const observer = new IntersectionObserver(this.onNewsInVew.bind(this), { root: document.querySelector(".office__body"), diff --git a/projects/social_platform/src/app/office/projects/edit/edit.component.html b/projects/social_platform/src/app/office/projects/edit/edit.component.html index d6a32d85..060f0710 100644 --- a/projects/social_platform/src/app/office/projects/edit/edit.component.html +++ b/projects/social_platform/src/app/office/projects/edit/edit.component.html @@ -128,6 +128,45 @@

📢 внимание!

+ +
+
+

Начнем создавать историю!

+
+ +
+

+ Вы находитесь в проектной мастерской – здесь мы с нуля создаем и редактируем проектные идеи +

+ +

+ Есть несколько вкладок – заполнив каждую, вы полностью опишите свой проект.
+ Обязательные поля отмечены красным, обязательно не забудь про вкладку «данные для конкурсов» +

+ +

+ Будьте внимательны: проект единожды создается лидером, команда приглашается в уже созданный + проект +

+ +

+ Если вы понимаете, что заполнить каждую графу пока нет времени (или не хватает информации!), + нажмите «сохранить черновик» – так вы сохраните проект, но не опубликуете его для + пользователей всей платформы +

+ +

Расскажите миру о вашем проекте!

+
+ + вперед +
+
+ + +
+
+ + + @if (isHintTeamVisible()) { +
+

+ Напишите зону ответственности участника, приглашаемого в команду +

+

подробнее

+
+ } +
+
+ + +
+
+

Уверены, большие дела не делаются в одиночку!

+
+ +
+

+ После создания проекта пригласите в команду тех, кто вместе с вами будет причастен к его + реализации +

+ +

+ Вставьте ссылку на профиль участника на платформе, а также кратко напишите зону + ответственности или (при наличии) конкретную роль в команде +

+ +

+ Участник получит приглашение стать частью команды – это приглашение необходимо принять. + Ваш со-командник получит уведомление или может найти приглашение во вкладке «проект» +

+
+ + спасибо, понятно +
+
diff --git a/projects/social_platform/src/app/office/projects/edit/shared/project-team-step/project-team-step.component.scss b/projects/social_platform/src/app/office/projects/edit/shared/project-team-step/project-team-step.component.scss index b20d4722..c86a7c38 100644 --- a/projects/social_platform/src/app/office/projects/edit/shared/project-team-step/project-team-step.component.scss +++ b/projects/social_platform/src/app/office/projects/edit/shared/project-team-step/project-team-step.component.scss @@ -71,6 +71,14 @@ bottom: 0%; left: 50%; } + + &__team { + &-tooltip { + position: fixed; + right: 320px; + bottom: 30px; + } + } } .invite { @@ -133,3 +141,85 @@ display: block; } } + +.tooltip { + position: relative; + display: flex; + align-items: center; + + &__wrapper { + position: absolute; + right: 100%; + bottom: 22px; + left: auto; + width: 310px; + padding: 18px 10px 10px 16px; + background-color: var(--white); + border: 0.5px solid var(--grey-for-text); + border-radius: var(--rounded-lg) var(--rounded-lg) 0 var(--rounded-lg); + + :last-child { + color: var(--black); + cursor: pointer; + } + } + + &__text { + color: var(--grey-for-text); + + a { + color: var(--accent); + } + } +} + +.cancel { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + width: 80%; + max-height: calc(100vh - 40px); + padding: 0 24px; + overflow-y: auto; + + @include responsive.apply-desktop { + width: 605px; + max-width: 100%; + } + + &__cross { + position: absolute; + top: 0; + right: 0; + width: 32px; + height: 32px; + cursor: pointer; + + @include responsive.apply-desktop { + top: 8px; + right: 8px; + } + } + + &__top { + display: flex; + flex-direction: column; + margin-bottom: 10px; + } + + &__title { + text-align: center; + } + + &__text { + text-align: center; + + &-block { + display: flex; + flex-direction: column; + gap: 12px; + margin: 30px 0; + } + } +} diff --git a/projects/social_platform/src/app/office/projects/edit/shared/project-team-step/project-team-step.component.ts b/projects/social_platform/src/app/office/projects/edit/shared/project-team-step/project-team-step.component.ts index 9d757b94..9e4198e1 100644 --- a/projects/social_platform/src/app/office/projects/edit/shared/project-team-step/project-team-step.component.ts +++ b/projects/social_platform/src/app/office/projects/edit/shared/project-team-step/project-team-step.component.ts @@ -1,7 +1,7 @@ /** @format */ import { CommonModule } from "@angular/common"; -import { Component, inject, OnInit } from "@angular/core"; +import { Component, inject, OnInit, signal } from "@angular/core"; import { FormGroup, ReactiveFormsModule } from "@angular/forms"; import { InputComponent, ButtonComponent, SelectComponent } from "@ui/components"; import { ControlErrorPipe } from "@corelib"; @@ -31,6 +31,7 @@ import { Collaborator } from "@office/models/collaborator.model"; InviteCardComponent, CollaboratorCardComponent, TooltipComponent, + ModalComponent, ], }) export class ProjectTeamStepComponent implements OnInit { @@ -43,6 +44,8 @@ export class ProjectTeamStepComponent implements OnInit { readonly rolesMembersList = rolesMembersList; showFields = false; + readonly isHintTeamVisible = signal(false); + readonly isHintTeamModal = signal(false); ngOnInit(): void { this.projectTeamService.setInvites(this.invites); @@ -182,4 +185,10 @@ export class ProjectTeamStepComponent implements OnInit { onCollaboratorRemove(collaboratorId: number): void { this.projectTeamService.removeCollaborator(collaboratorId); } + + openHintModal(event: Event): void { + event.preventDefault(); + this.isHintTeamVisible.set(false); + this.isHintTeamModal.set(true); + } }