From ba1fcb45514bb469a8dcd37522e21d92d682d205 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Mon, 16 Sep 2019 19:42:39 +0200 Subject: [PATCH] Improved contributor form. --- .../contributor-add-form.component.html | 2 +- .../contributors-page.component.html | 2 +- .../import-contributors-dialog.component.html | 61 +++++++++----- .../import-contributors-dialog.component.scss | 4 + .../import-contributors-dialog.component.ts | 80 ++++++++++++------- .../angular/status-icon.component.scss | 2 + .../app/shared/state/contributors.forms.ts | 14 +++- 7 files changed, 109 insertions(+), 56 deletions(-) diff --git a/src/Squidex/app/features/settings/pages/contributors/contributor-add-form.component.html b/src/Squidex/app/features/settings/pages/contributors/contributor-add-form.component.html index 6b2032583..b6fea1524 100644 --- a/src/Squidex/app/features/settings/pages/contributors/contributor-add-form.component.html +++ b/src/Squidex/app/features/settings/pages/contributors/contributor-add-form.component.html @@ -2,7 +2,7 @@
- + diff --git a/src/Squidex/app/features/settings/pages/contributors/contributors-page.component.html b/src/Squidex/app/features/settings/pages/contributors/contributors-page.component.html index 6913d0429..b51f5d210 100644 --- a/src/Squidex/app/features/settings/pages/contributors/contributors-page.component.html +++ b/src/Squidex/app/features/settings/pages/contributors/contributors-page.component.html @@ -78,7 +78,7 @@ - diff --git a/src/Squidex/app/features/settings/pages/contributors/import-contributors-dialog.component.html b/src/Squidex/app/features/settings/pages/contributors/import-contributors-dialog.component.html index 1f452ae2a..e8597949c 100644 --- a/src/Squidex/app/features/settings/pages/contributors/import-contributors-dialog.component.html +++ b/src/Squidex/app/features/settings/pages/contributors/import-contributors-dialog.component.html @@ -1,18 +1,44 @@ - + Import contributors -
- + + + + + + + Emails detected: {{emails}} + + +   + + + + +
+
+ {{status.email}} +
+ +
+ +
+
+
+ +
-
+
{{status.email}}
-
+
@@ -20,24 +46,21 @@
- - - - -
- - - - Emails detected: {{emails}} - - -   - + - + + + + + + + + + + diff --git a/src/Squidex/app/features/settings/pages/contributors/import-contributors-dialog.component.scss b/src/Squidex/app/features/settings/pages/contributors/import-contributors-dialog.component.scss index 21a9d0e8e..272f6207c 100644 --- a/src/Squidex/app/features/settings/pages/contributors/import-contributors-dialog.component.scss +++ b/src/Squidex/app/features/settings/pages/contributors/import-contributors-dialog.component.scss @@ -5,6 +5,10 @@ textarea { resize: none; } +.aligned { + line-height: 2.5rem; +} + .content { min-height: 300px; } \ No newline at end of file diff --git a/src/Squidex/app/features/settings/pages/contributors/import-contributors-dialog.component.ts b/src/Squidex/app/features/settings/pages/contributors/import-contributors-dialog.component.ts index 170a7a244..49f4a0868 100644 --- a/src/Squidex/app/features/settings/pages/contributors/import-contributors-dialog.component.ts +++ b/src/Squidex/app/features/settings/pages/contributors/import-contributors-dialog.component.ts @@ -5,7 +5,7 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -import { Component, EventEmitter, Output } from '@angular/core'; +import { Component, EventEmitter, Input, Output } from '@angular/core'; import { FormBuilder } from '@angular/forms'; import { empty, of } from 'rxjs'; import { catchError, mergeMap, tap } from 'rxjs/operators'; @@ -13,13 +13,16 @@ import { catchError, mergeMap, tap } from 'rxjs/operators'; import { ContributorsState, ErrorDto, - ImportContributorsForm + ImmutableArray, + ImportContributorsForm, + RoleDto } from '@app/shared'; interface ImportStatus { email: string; result: 'Pending' | 'Failed' | 'Success'; resultText: string; + role: string; } @Component({ @@ -28,11 +31,17 @@ interface ImportStatus { templateUrl: './import-contributors-dialog.component.html' }) export class ImportContributorsDialogComponent { + public readonly standalone = { standalone: true }; + @Output() public close = new EventEmitter(); + @Input() + public roles: ImmutableArray; + public importForm = new ImportContributorsForm(this.formBuilder); - public importStatus: ImportStatus[]; + public importStatus: ImportStatus[] = []; + public importStage: 'Start' | 'Change' | 'Wait' = 'Start'; constructor( private readonly formBuilder: FormBuilder, @@ -40,51 +49,60 @@ export class ImportContributorsDialogComponent { ) { } - public import() { + public detect() { + this.importStage = 'Change'; + const contributors = this.importForm.submit(); if (contributors && contributors.length > 0) { - this.importStatus = []; - for (let contributor of contributors) { this.importStatus.push({ email: contributor.contributorId, result: 'Pending', - resultText: 'Pending' + resultText: 'Pending', + role: 'Developer' }); } - - of(...contributors).pipe( - mergeMap(c => - this.contributorsState.assign(c, { silent: true }).pipe( - tap(created => { - let status = this.importStatus.find(x => x.email === c.contributorId); - - if (status) { - status.resultText = getSuccess(created); - status.result = 'Success'; - } - }), - catchError((error: ErrorDto) => { - let status = this.importStatus.find(x => x.email === c.contributorId); - - if (status) { - status.resultText = getError(error); - status.result = 'Failed'; - } - - return empty(); - }) - ), 1) - ).subscribe(); } } + public import() { + this.importStage = 'Wait'; + + of(...this.importStatus).pipe( + mergeMap(s => + this.contributorsState.assign(createRequest(s), { silent: true }).pipe( + tap(created => { + let status = this.importStatus.find(x => x.email === s.email); + + if (status) { + status.resultText = getSuccess(created); + status.result = 'Success'; + } + }), + catchError((error: ErrorDto) => { + let status = this.importStatus.find(x => x.email === s.email); + + if (status) { + status.resultText = getError(error); + status.result = 'Failed'; + } + + return empty(); + }) + ), 1) + ).subscribe(); + } + public emitClose() { this.close.emit(); } } +function createRequest(status: ImportStatus) { + return { contributorId: status.email, role: status.role, invite: true }; +} + function getError(error: ErrorDto): string { return error.details[0]; } diff --git a/src/Squidex/app/framework/angular/status-icon.component.scss b/src/Squidex/app/framework/angular/status-icon.component.scss index 54a53a174..f3cbd164a 100644 --- a/src/Squidex/app/framework/angular/status-icon.component.scss +++ b/src/Squidex/app/framework/angular/status-icon.component.scss @@ -8,7 +8,9 @@ $circle-size-lg: 2.8rem; .status { & { text-align: center; + display: inline-block; background: $color-border; + border: 0; color: $color-dark-foreground; vertical-align: middle; } diff --git a/src/Squidex/app/shared/state/contributors.forms.ts b/src/Squidex/app/shared/state/contributors.forms.ts index 1f028849d..ed3e85ac8 100644 --- a/src/Squidex/app/shared/state/contributors.forms.ts +++ b/src/Squidex/app/shared/state/contributors.forms.ts @@ -44,7 +44,7 @@ export class AssignContributorForm extends Form contributorId = contributorId.id; } - return { contributorId, role: value.string, invite: true }; + return { contributorId, role: value.role, invite: true }; } } @@ -69,14 +69,20 @@ export class ImportContributorsForm extends Form