-
+
{{status.email}}
-
-
-
-
-
-
-
-
-
- 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