@ -5,7 +5,7 @@
* Copyright ( c ) Squidex UG ( haftungsbeschränkt ) . All rights reserved .
* 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 { FormBuilder } from '@angular/forms' ;
import { empty , of } from 'rxjs' ;
import { empty , of } from 'rxjs' ;
import { catchError , mergeMap , tap } from 'rxjs/operators' ;
import { catchError , mergeMap , tap } from 'rxjs/operators' ;
@ -13,13 +13,16 @@ import { catchError, mergeMap, tap } from 'rxjs/operators';
import {
import {
ContributorsState ,
ContributorsState ,
ErrorDto ,
ErrorDto ,
ImportContributorsForm
ImmutableArray ,
ImportContributorsForm ,
RoleDto
} from '@app/shared' ;
} from '@app/shared' ;
interface ImportStatus {
interface ImportStatus {
email : string ;
email : string ;
result : 'Pending' | 'Failed' | 'Success' ;
result : 'Pending' | 'Failed' | 'Success' ;
resultText : string ;
resultText : string ;
role : string ;
}
}
@Component ( {
@Component ( {
@ -28,11 +31,17 @@ interface ImportStatus {
templateUrl : './import-contributors-dialog.component.html'
templateUrl : './import-contributors-dialog.component.html'
} )
} )
export class ImportContributorsDialogComponent {
export class ImportContributorsDialogComponent {
public readonly standalone = { standalone : true } ;
@Output ( )
@Output ( )
public close = new EventEmitter ( ) ;
public close = new EventEmitter ( ) ;
@Input ( )
public roles : ImmutableArray < RoleDto > ;
public importForm = new ImportContributorsForm ( this . formBuilder ) ;
public importForm = new ImportContributorsForm ( this . formBuilder ) ;
public importStatus : ImportStatus [ ] ;
public importStatus : ImportStatus [ ] = [ ] ;
public importStage : 'Start' | 'Change' | 'Wait' = 'Start' ;
constructor (
constructor (
private readonly formBuilder : FormBuilder ,
private readonly formBuilder : FormBuilder ,
@ -40,51 +49,60 @@ export class ImportContributorsDialogComponent {
) {
) {
}
}
public import ( ) {
public detect() {
this . importStage = 'Change' ;
const contributors = this . importForm . submit ( ) ;
const contributors = this . importForm . submit ( ) ;
if ( contributors && contributors . length > 0 ) {
if ( contributors && contributors . length > 0 ) {
this . importStatus = [ ] ;
for ( let contributor of contributors ) {
for ( let contributor of contributors ) {
this . importStatus . push ( {
this . importStatus . push ( {
email : contributor.contributorId ,
email : contributor.contributorId ,
result : 'Pending' ,
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() {
public emitClose() {
this . close . emit ( ) ;
this . close . emit ( ) ;
}
}
}
}
function createRequest ( status : ImportStatus ) {
return { contributorId : status.email , role : status.role , invite : true } ;
}
function getError ( error : ErrorDto ) : string {
function getError ( error : ErrorDto ) : string {
return error . details [ 0 ] ;
return error . details [ 0 ] ;
}
}