diff --git a/projects/social_platform/src/app/domain/program/ports/program-registration.repository.port.ts b/projects/social_platform/src/app/domain/program/ports/program-registration.repository.port.ts index 8f3c83faf..093a8a1df 100644 --- a/projects/social_platform/src/app/domain/program/ports/program-registration.repository.port.ts +++ b/projects/social_platform/src/app/domain/program/ports/program-registration.repository.port.ts @@ -16,7 +16,12 @@ export abstract class ProgramRegistrationRepositoryPort { publish: boolean, ): Observable; abstract importOptions(id: number, file: File): Observable; - abstract connect(id: number, url: string, comment: string): Observable; + abstract connect( + id: number, + url: string, + comment: string, + contact: string, + ): Observable; abstract publicForm(id: number): Observable; abstract submit(id: number, data: object, signup: boolean): Observable; abstract tokenAction( diff --git a/projects/social_platform/src/app/domain/program/program-registration.model.ts b/projects/social_platform/src/app/domain/program/program-registration.model.ts index 216b7b4ab..d1de81737 100644 --- a/projects/social_platform/src/app/domain/program/program-registration.model.ts +++ b/projects/social_platform/src/app/domain/program/program-registration.model.ts @@ -24,6 +24,8 @@ export interface RegistrationSettings { externalStatus: "not_connected" | "requested" | "connected"; externalUrl: string; connectionComment: string; + connectionWebsiteUrl: string; + connectionContact: string; answeredFieldIds: string[]; } export interface RegistrationPublic { diff --git a/projects/social_platform/src/app/infrastructure/adapters/program/program-registration-http.adapter.ts b/projects/social_platform/src/app/infrastructure/adapters/program/program-registration-http.adapter.ts index 84722469e..238186c79 100644 --- a/projects/social_platform/src/app/infrastructure/adapters/program/program-registration-http.adapter.ts +++ b/projects/social_platform/src/app/infrastructure/adapters/program/program-registration-http.adapter.ts @@ -32,10 +32,10 @@ export class ProgramRegistrationHttpAdapter implements ProgramRegistrationReposi data, ); } - connect(id: number, url: string, comment: string) { + connect(id: number, url: string, comment: string, contact: string) { return this.api.post( `${this.root(id)}/management/registration/connection/`, - { url, comment }, + { url, comment, contact }, ); } publicForm(id: number) { diff --git a/projects/social_platform/src/app/ui/pages/program/management/registration/registration.component.html b/projects/social_platform/src/app/ui/pages/program/management/registration/registration.component.html index ef8b7b916..9c1c8aeb7 100644 --- a/projects/social_platform/src/app/ui/pages/program/management/registration/registration.component.html +++ b/projects/social_platform/src/app/ui/pages/program/management/registration/registration.component.html @@ -113,9 +113,9 @@

Внешняя форма регистрации

} @else if (data.externalStatus === "requested") {
- Ожидаем подключения + Запрос передан администратору

- Запрос доступен администратору платформы. После подключения можно будет опубликовать + Мы свяжемся с вами в ближайшее время. После подключения можно будет опубликовать внешний способ регистрации.

@@ -317,18 +317,29 @@

Варианты ответа

} @else if (dialog() === "connection") {
-

- Администратор проверит интеграцию. Одна ссылка на сайт не создаёт участников на - платформе. -

+ +

Запрос поступит администратору платформы. Мы свяжемся с вами в ближайшее время.

} @else if (dialog() === "preview") {
diff --git a/projects/social_platform/src/app/ui/pages/program/management/registration/registration.component.spec.ts b/projects/social_platform/src/app/ui/pages/program/management/registration/registration.component.spec.ts index 4dd21938f..3fdcac209 100644 --- a/projects/social_platform/src/app/ui/pages/program/management/registration/registration.component.spec.ts +++ b/projects/social_platform/src/app/ui/pages/program/management/registration/registration.component.spec.ts @@ -27,6 +27,8 @@ const snapshot: RegistrationSettings = { externalStatus: "not_connected", externalUrl: "", connectionComment: "", + connectionWebsiteUrl: "", + connectionContact: "", answeredFieldIds: [], link: null, }; @@ -78,6 +80,24 @@ describe("Редактор анкеты регистрации", () => { expect(component.previewGroup.disabled).toBe(true); expect(api.save).not.toHaveBeenCalled(); }); + it("запрос принимает сайт без необязательных деталей и передаёт контакт отдельно", () => { + const { component, api } = setup(); + component.setMode("external"); + component.open("connection"); + component.connection.controls.url.setValue("https://event.example.test"); + expect(component.connection.valid).toBe(true); + component.connection.controls.contact.setValue("@event_organizer"); + api.connect.mockReturnValue(of({ ...snapshot, externalStatus: "requested" })); + component.requestConnection(); + expect(api.connect).toHaveBeenCalledWith( + 42, + "https://event.example.test", + "", + "@event_organizer", + ); + expect(component.message()).toContain("Мы свяжемся с вами в ближайшее время"); + expect(component.dialog()).toBeNull(); + }); it("ошибка импорта сохраняет старые варианты", () => { const { component, api } = setup(); component.edit(field); diff --git a/projects/social_platform/src/app/ui/pages/program/management/registration/registration.component.ts b/projects/social_platform/src/app/ui/pages/program/management/registration/registration.component.ts index 131021216..cfb0b5ea4 100644 --- a/projects/social_platform/src/app/ui/pages/program/management/registration/registration.component.ts +++ b/projects/social_platform/src/app/ui/pages/program/management/registration/registration.component.ts @@ -98,8 +98,9 @@ export class ManagementRegistrationComponent { position: [1, Validators.min(1)], }); readonly connection = this.fb.group({ - url: ["", [Validators.required, Validators.pattern(/^https?:\/\//)]], + url: ["", [Validators.required, Validators.pattern(/^https?:\/\//), Validators.maxLength(200)]], comment: ["", Validators.maxLength(2000)], + contact: ["", Validators.maxLength(500)], }); readonly fieldTypes = [ { id: "text", label: "Короткий текст" }, @@ -159,6 +160,13 @@ export class ManagementRegistrationComponent { return this.fieldTypes.find(t => t.id === field.type)?.label ?? field.type; } open(dialog: NonNullable>, event?: Event) { + if (dialog === "connection") { + this.connection.reset({ + url: this.snapshot()?.connectionWebsiteUrl ?? "", + comment: this.snapshot()?.connectionComment ?? "", + contact: this.snapshot()?.connectionContact ?? "", + }); + } this.trigger = (event?.currentTarget as HTMLElement) ?? null; this.dialogError.set(null); this.dialog.set(dialog); @@ -329,7 +337,7 @@ export class ManagementRegistrationComponent { this.dialogError.set(null); const value = this.connection.getRawValue(); this.api - .connect(this.programId(), value.url, value.comment) + .connect(this.programId(), value.url, value.comment, value.contact) .pipe( finalize(() => this.busy.set(false)), takeUntilDestroyed(this.destroy), @@ -338,7 +346,7 @@ export class ManagementRegistrationComponent { next: data => { this.snapshot.set(data); this.dialog.set(null); - this.message.set("Запрос сохранён. Подключение формы выполнит администратор платформы."); + this.message.set("Запрос передан администратору. Мы свяжемся с вами в ближайшее время."); }, error: e => this.dialogError.set(evaluationError(e)), });