diff --git a/README.md b/README.md index fdcb9ec47..c1b86013a 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ## Swagger Generated Code To regnerate http rune swaagger ``` -BASE=http://ingress.redaction-timo-dev-3011.178.63.47.73.xip.io/ +BASE=http://ingress.redaction-timo-dev-401.178.63.47.73.xip.io/ URL="$BASE"v2/api-docs?group=redaction-gateway-v1 mkdir -p /tmp/swagger swagger-codegen generate -i "$URL" -l typescript-angular -o /tmp/swagger diff --git a/apps/red-ui/src/app/app.module.ts b/apps/red-ui/src/app/app.module.ts index 06a55f50d..9bafbd1d6 100644 --- a/apps/red-ui/src/app/app.module.ts +++ b/apps/red-ui/src/app/app.module.ts @@ -57,6 +57,7 @@ import { AuthErrorComponent } from './screens/auth-error/auth-error.component'; import { RedRoleGuard } from './auth/red-role.guard'; import { MatListModule } from '@angular/material/list'; import { AssignOwnerDialogComponent } from './dialogs/assign-owner-dialog/assign-owner-dialog.component'; +import {MatDatepickerModule} from "@angular/material/datepicker"; export function HttpLoaderFactory(httpClient: HttpClient) { return new TranslateHttpLoader(httpClient, '/assets/i18n/', '.json'); @@ -84,86 +85,87 @@ export function HttpLoaderFactory(httpClient: HttpClient) { AnnotationIconComponent, AuthErrorComponent ], - imports: [ - BrowserModule, - BrowserAnimationsModule, - FormsModule, - ReactiveFormsModule, - HttpClientModule, - AuthModule, - IconsModule, - ApiModule, - MatDialogModule, - TranslateModule.forRoot({ - loader: { - provide: TranslateLoader, - useFactory: HttpLoaderFactory, - deps: [HttpClient] - } - }), - RouterModule.forRoot([ - { - path: '', - redirectTo: 'ui/projects', - pathMatch: 'full' - }, - { - path: 'auth-error', - component: AuthErrorComponent, - canActivate: [AuthGuard] - }, - { - path: 'ui', - component: BaseScreenComponent, - children: [ - { - path: 'projects', - component: ProjectListingScreenComponent, - canActivate: [CompositeRouteGuard], - data: { - routeGuards: [AuthGuard, RedRoleGuard, AppStateGuard] + imports: [ + BrowserModule, + BrowserAnimationsModule, + FormsModule, + ReactiveFormsModule, + HttpClientModule, + AuthModule, + IconsModule, + ApiModule, + MatDialogModule, + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: HttpLoaderFactory, + deps: [HttpClient] } - }, - { - path: 'projects/:projectId', - component: ProjectOverviewScreenComponent, - canActivate: [CompositeRouteGuard], - data: { - routeGuards: [AuthGuard, RedRoleGuard, AppStateGuard] + }), + RouterModule.forRoot([ + { + path: '', + redirectTo: 'ui/projects', + pathMatch: 'full' + }, + { + path: 'auth-error', + component: AuthErrorComponent, + canActivate: [AuthGuard] + }, + { + path: 'ui', + component: BaseScreenComponent, + children: [ + { + path: 'projects', + component: ProjectListingScreenComponent, + canActivate: [CompositeRouteGuard], + data: { + routeGuards: [AuthGuard, RedRoleGuard, AppStateGuard] + } + }, + { + path: 'projects/:projectId', + component: ProjectOverviewScreenComponent, + canActivate: [CompositeRouteGuard], + data: { + routeGuards: [AuthGuard, RedRoleGuard, AppStateGuard] + } + }, + { + path: 'projects/:projectId/file/:fileId', + component: FilePreviewScreenComponent, + canActivate: [CompositeRouteGuard], + data: { + routeGuards: [AuthGuard, RedRoleGuard, AppStateGuard] + } + } + ] } - }, - { - path: 'projects/:projectId/file/:fileId', - component: FilePreviewScreenComponent, - canActivate: [CompositeRouteGuard], - data: { - routeGuards: [AuthGuard, RedRoleGuard, AppStateGuard] - } - } - ] - } - ]), - NgpSortModule, - MatToolbarModule, - MatButtonModule, - MatSlideToggleModule, - MatMenuModule, - MatIconModule, - MatTooltipModule, - MatSnackBarModule, - MatTabsModule, - MatButtonToggleModule, - MatFormFieldModule, - ToastrModule.forRoot(), - MatSelectModule, - MatSidenavModule, - FileUploadModule, - ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production }), - MatProgressSpinnerModule, - MatCheckboxModule, - MatListModule - ], + ]), + NgpSortModule, + MatToolbarModule, + MatButtonModule, + MatSlideToggleModule, + MatMenuModule, + MatIconModule, + MatTooltipModule, + MatSnackBarModule, + MatTabsModule, + MatButtonToggleModule, + MatFormFieldModule, + ToastrModule.forRoot(), + MatSelectModule, + MatSidenavModule, + FileUploadModule, + ServiceWorkerModule.register('ngsw-worker.js', {enabled: environment.production}), + MatProgressSpinnerModule, + MatCheckboxModule, + MatListModule, + MatDatepickerModule + ], providers: [{ provide: HTTP_INTERCEPTORS, multi: true, diff --git a/apps/red-ui/src/app/dialogs/add-edit-project-dialog/add-edit-project-dialog.component.html b/apps/red-ui/src/app/dialogs/add-edit-project-dialog/add-edit-project-dialog.component.html index 524b2d32b..532b0489a 100644 --- a/apps/red-ui/src/app/dialogs/add-edit-project-dialog/add-edit-project-dialog.component.html +++ b/apps/red-ui/src/app/dialogs/add-edit-project-dialog/add-edit-project-dialog.component.html @@ -16,6 +16,17 @@ + + + + + + + + + + +
diff --git a/apps/red-ui/src/app/dialogs/add-edit-project-dialog/add-edit-project-dialog.component.ts b/apps/red-ui/src/app/dialogs/add-edit-project-dialog/add-edit-project-dialog.component.ts index 7704ac224..55254c192 100644 --- a/apps/red-ui/src/app/dialogs/add-edit-project-dialog/add-edit-project-dialog.component.ts +++ b/apps/red-ui/src/app/dialogs/add-edit-project-dialog/add-edit-project-dialog.component.ts @@ -23,7 +23,8 @@ export class AddEditProjectDialogComponent implements OnInit { ngOnInit(): void { this.projectForm = this._formBuilder.group({ projectName: [this.project?.projectName, Validators.required], - description: [this.project?.description] + description: [this.project?.description], + // dueDate: [this.project?.dueDate] }); } @@ -39,6 +40,7 @@ export class AddEditProjectDialogComponent implements OnInit { return { projectName: this.projectForm.get('projectName').value, description: this.projectForm.get('description').value, + // dueDate: this.projectForm.get('dueDate').value } } } diff --git a/apps/red-ui/src/app/dialogs/assign-owner-dialog/assign-owner-dialog.component.ts b/apps/red-ui/src/app/dialogs/assign-owner-dialog/assign-owner-dialog.component.ts index 2c83a0e2b..a8c7f3c1d 100644 --- a/apps/red-ui/src/app/dialogs/assign-owner-dialog/assign-owner-dialog.component.ts +++ b/apps/red-ui/src/app/dialogs/assign-owner-dialog/assign-owner-dialog.component.ts @@ -56,22 +56,11 @@ export class AssignOwnerDialogComponent { const ownerId = this.usersForm.get('singleUser').value; const memberIds = this.usersForm.get('userList').value; - const project = this.data.project; - await this._projectControllerService.addMembersToProject({memberIds: memberIds}, project.projectId).toPromise(); - await this._projectControllerService.assignProjectOwner(project.projectId, ownerId).toPromise(); - - const updatedProject = await this._projectControllerService.getProject(project.projectId).toPromise(); - - const toRemoveMembers = updatedProject.memberIds.filter(m => memberIds.indexOf(m) < 0); - if (toRemoveMembers.length > 0) { - await this._projectControllerService.deleteMembersToProject({memberIds: toRemoveMembers}, project.projectId).toPromise(); - } - - project.ownerId = ownerId; - project.memberIds = [...new Set([ownerId, ...memberIds])]; - + const project = Object.assign({},this.data.project); + project.memberIds = memberIds; + project.ownerId = ownerId; + await this._appStateService.addOrUpdateProject(project); this._notificationService.showToastNotification('Successfully assigned ' + this.userService.getNameForId(ownerId) + ' to project: ' + project.projectName); - } if (this.data.type === 'file') { diff --git a/apps/red-ui/src/app/state/app-state.service.ts b/apps/red-ui/src/app/state/app-state.service.ts index eae08b4d1..32ee1c783 100644 --- a/apps/red-ui/src/app/state/app-state.service.ts +++ b/apps/red-ui/src/app/state/app-state.service.ts @@ -167,12 +167,7 @@ export class AppStateService { async addOrUpdateProject(project: Project) { try { - let updatedProject; - if (project?.projectId) { - updatedProject = await this._projectControllerService.updateProject(project, project.projectId).toPromise(); - } else { - updatedProject = await this._projectControllerService.createProject(project).toPromise(); - } + const updatedProject = await this._projectControllerService.createProjectOrUpdateProject(project).toPromise(); const foundProject = this._appState.projects.find(p => p.project.projectId === updatedProject.projectId); if (foundProject) { Object.assign(foundProject.project, updatedProject); diff --git a/libs/red-ui-http/src/lib/api/projectController.service.ts b/libs/red-ui-http/src/lib/api/projectController.service.ts index a9d201669..20ca8b7cb 100644 --- a/libs/red-ui-http/src/lib/api/projectController.service.ts +++ b/libs/red-ui-http/src/lib/api/projectController.service.ts @@ -16,7 +16,6 @@ import {HttpClient, HttpEvent, HttpHeaders, HttpResponse} from '@angular/common/ import {Observable} from 'rxjs'; import {Project} from '../model/project'; -import {ProjectMembers} from '../model/projectMembers'; import {ProjectRequest} from '../model/projectRequest'; import {BASE_PATH} from '../variables'; @@ -56,128 +55,19 @@ export class ProjectControllerService { /** - * Adds members to project. + * Creates or update a project. * None - * @param body projectMembers - * @param projectId projectId + * @param body project * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. * @param reportProgress flag to report request and response progress. */ - public addMembersToProject(body: ProjectMembers, projectId: string, observe?: 'body', reportProgress?: boolean): Observable; - public addMembersToProject(body: ProjectMembers, projectId: string, observe?: 'response', reportProgress?: boolean): Observable>; - public addMembersToProject(body: ProjectMembers, projectId: string, observe?: 'events', reportProgress?: boolean): Observable>; - public addMembersToProject(body: ProjectMembers, projectId: string, observe: any = 'body', reportProgress: boolean = false): Observable { + public createProjectOrUpdateProject(body: ProjectRequest, observe?: 'body', reportProgress?: boolean): Observable; + public createProjectOrUpdateProject(body: ProjectRequest, observe?: 'response', reportProgress?: boolean): Observable>; + public createProjectOrUpdateProject(body: ProjectRequest, observe?: 'events', reportProgress?: boolean): Observable>; + public createProjectOrUpdateProject(body: ProjectRequest, observe: any = 'body', reportProgress: boolean = false): Observable { if (body === null || body === undefined) { - throw new Error('Required parameter body was null or undefined when calling addMembersToProject.'); - } - - if (projectId === null || projectId === undefined) { - throw new Error('Required parameter projectId was null or undefined when calling addMembersToProject.'); - } - - let headers = this.defaultHeaders; - - // authentication (RED-OAUTH) required - if (this.configuration.accessToken) { - const accessToken = typeof this.configuration.accessToken === 'function' - ? this.configuration.accessToken() - : this.configuration.accessToken; - headers = headers.set('Authorization', 'Bearer ' + accessToken); - } - - // to determine the Accept header - const httpHeaderAccepts: string[] = []; - const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts); - if (httpHeaderAcceptSelected !== undefined) { - headers = headers.set('Accept', httpHeaderAcceptSelected); - } - - // to determine the Content-Type header - const consumes: string[] = [ - 'application/json' - ]; - const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes); - if (httpContentTypeSelected !== undefined) { - headers = headers.set('Content-Type', httpContentTypeSelected); - } - - return this.httpClient.request('post', `${this.basePath}/project/members/${encodeURIComponent(String(projectId))}`, - { - body: body, - withCredentials: this.configuration.withCredentials, - headers: headers, - observe: observe, - reportProgress: reportProgress - } - ); - } - - /** - * Assigns new owner to project. - * None - * @param projectId projectId - * @param ownerId ownerId - * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. - * @param reportProgress flag to report request and response progress. - */ - public assignProjectOwner(projectId: string, ownerId: string, observe?: 'body', reportProgress?: boolean): Observable; - public assignProjectOwner(projectId: string, ownerId: string, observe?: 'response', reportProgress?: boolean): Observable>; - public assignProjectOwner(projectId: string, ownerId: string, observe?: 'events', reportProgress?: boolean): Observable>; - public assignProjectOwner(projectId: string, ownerId: string, observe: any = 'body', reportProgress: boolean = false): Observable { - - if (projectId === null || projectId === undefined) { - throw new Error('Required parameter projectId was null or undefined when calling assignProjectOwner.'); - } - - if (ownerId === null || ownerId === undefined) { - throw new Error('Required parameter ownerId was null or undefined when calling assignProjectOwner.'); - } - - let headers = this.defaultHeaders; - - // authentication (RED-OAUTH) required - if (this.configuration.accessToken) { - const accessToken = typeof this.configuration.accessToken === 'function' - ? this.configuration.accessToken() - : this.configuration.accessToken; - headers = headers.set('Authorization', 'Bearer ' + accessToken); - } - - // to determine the Accept header - const httpHeaderAccepts: string[] = []; - const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts); - if (httpHeaderAcceptSelected !== undefined) { - headers = headers.set('Accept', httpHeaderAcceptSelected); - } - - // to determine the Content-Type header - const consumes: string[] = []; - - return this.httpClient.request('post', `${this.basePath}/project/${encodeURIComponent(String(projectId))}/${encodeURIComponent(String(ownerId))}`, - { - withCredentials: this.configuration.withCredentials, - headers: headers, - observe: observe, - reportProgress: reportProgress - } - ); - } - - /** - * Creates a new project. - * None - * @param body projectRequest - * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. - * @param reportProgress flag to report request and response progress. - */ - public createProject(body: ProjectRequest, observe?: 'body', reportProgress?: boolean): Observable; - public createProject(body: ProjectRequest, observe?: 'response', reportProgress?: boolean): Observable>; - public createProject(body: ProjectRequest, observe?: 'events', reportProgress?: boolean): Observable>; - public createProject(body: ProjectRequest, observe: any = 'body', reportProgress: boolean = false): Observable { - - if (body === null || body === undefined) { - throw new Error('Required parameter body was null or undefined when calling createProject.'); + throw new Error('Required parameter body was null or undefined when calling createProjectOrUpdateProject.'); } let headers = this.defaultHeaders; @@ -219,55 +109,6 @@ export class ProjectControllerService { ); } - /** - * Deletes members from project. - * None - * @param body projectMembers - * @param projectId projectId - * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. - * @param reportProgress flag to report request and response progress. - */ - public deleteMembersToProject(body: ProjectMembers, projectId: string, observe?: 'body', reportProgress?: boolean): Observable; - public deleteMembersToProject(body: ProjectMembers, projectId: string, observe?: 'response', reportProgress?: boolean): Observable>; - public deleteMembersToProject(body: ProjectMembers, projectId: string, observe?: 'events', reportProgress?: boolean): Observable>; - public deleteMembersToProject(body: ProjectMembers, projectId: string, observe: any = 'body', reportProgress: boolean = false): Observable { - - if (body === null || body === undefined) { - throw new Error('Required parameter body was null or undefined when calling deleteMembersToProject.'); - } - - if (projectId === null || projectId === undefined) { - throw new Error('Required parameter projectId was null or undefined when calling deleteMembersToProject.'); - } - - let headers = this.defaultHeaders; - - // authentication (RED-OAUTH) required - if (this.configuration.accessToken) { - const accessToken = typeof this.configuration.accessToken === 'function' - ? this.configuration.accessToken() - : this.configuration.accessToken; - headers = headers.set('Authorization', 'Bearer ' + accessToken); - } - - // to determine the Accept header - const httpHeaderAccepts: string[] = []; - const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts); - if (httpHeaderAcceptSelected !== undefined) { - headers = headers.set('Accept', httpHeaderAcceptSelected); - } - - return this.httpClient.request('delete', `${this.basePath}/project/members/${encodeURIComponent(String(projectId))}`, - { - body: body, - withCredentials: this.configuration.withCredentials, - headers: headers, - observe: observe, - reportProgress: reportProgress - } - ); - } - /** * Deletes an existing project. * None @@ -405,64 +246,4 @@ export class ProjectControllerService { ); } - /** - * Updates an existing project. - * None - * @param body projectRequest - * @param projectId projectId - * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. - * @param reportProgress flag to report request and response progress. - */ - public updateProject(body: ProjectRequest, projectId: string, observe?: 'body', reportProgress?: boolean): Observable; - public updateProject(body: ProjectRequest, projectId: string, observe?: 'response', reportProgress?: boolean): Observable>; - public updateProject(body: ProjectRequest, projectId: string, observe?: 'events', reportProgress?: boolean): Observable>; - public updateProject(body: ProjectRequest, projectId: string, observe: any = 'body', reportProgress: boolean = false): Observable { - - if (body === null || body === undefined) { - throw new Error('Required parameter body was null or undefined when calling updateProject.'); - } - - if (projectId === null || projectId === undefined) { - throw new Error('Required parameter projectId was null or undefined when calling updateProject.'); - } - - let headers = this.defaultHeaders; - - // authentication (RED-OAUTH) required - if (this.configuration.accessToken) { - const accessToken = typeof this.configuration.accessToken === 'function' - ? this.configuration.accessToken() - : this.configuration.accessToken; - headers = headers.set('Authorization', 'Bearer ' + accessToken); - } - - // to determine the Accept header - const httpHeaderAccepts: string[] = [ - 'application/json' - ]; - const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts); - if (httpHeaderAcceptSelected !== undefined) { - headers = headers.set('Accept', httpHeaderAcceptSelected); - } - - // to determine the Content-Type header - const consumes: string[] = [ - 'application/json' - ]; - const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes); - if (httpContentTypeSelected !== undefined) { - headers = headers.set('Content-Type', httpContentTypeSelected); - } - - return this.httpClient.request('post', `${this.basePath}/project/${encodeURIComponent(String(projectId))}`, - { - body: body, - withCredentials: this.configuration.withCredentials, - headers: headers, - observe: observe, - reportProgress: reportProgress - } - ); - } - } diff --git a/libs/red-ui-http/src/lib/model/models.ts b/libs/red-ui-http/src/lib/model/models.ts index e48cc8621..50a168016 100644 --- a/libs/red-ui-http/src/lib/model/models.ts +++ b/libs/red-ui-http/src/lib/model/models.ts @@ -18,7 +18,6 @@ export * from './modelFile'; export * from './pdfMetaData'; export * from './point'; export * from './project'; -export * from './projectMembers'; export * from './projectRequest'; export * from './rectangle'; export * from './redactionLog'; diff --git a/libs/red-ui-http/src/lib/model/project.ts b/libs/red-ui-http/src/lib/model/project.ts index 5376e81b1..4bb07a061 100644 --- a/libs/red-ui-http/src/lib/model/project.ts +++ b/libs/red-ui-http/src/lib/model/project.ts @@ -16,6 +16,7 @@ export interface Project { memberIds?: Array; ownerId?: string; projectId?: string; + dueDate?: string; projectName?: string; status?: Project.StatusEnum; } diff --git a/libs/red-ui-http/src/lib/model/projectMembers.ts b/libs/red-ui-http/src/lib/model/projectMembers.ts deleted file mode 100644 index 0cf46ea1e..000000000 --- a/libs/red-ui-http/src/lib/model/projectMembers.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * API Documentation for Redaction Gateway - * Description for redaction - * - * OpenAPI spec version: 1.0 - * - * - * NOTE: This class is auto generated by the swagger code generator program. - * https://github.com/swagger-api/swagger-codegen.git - * Do not edit the class manually. - */ - -export interface ProjectMembers { - memberIds?: Array; -} diff --git a/libs/red-ui-http/src/lib/model/projectRequest.ts b/libs/red-ui-http/src/lib/model/projectRequest.ts index 66d2db734..5c600f183 100644 --- a/libs/red-ui-http/src/lib/model/projectRequest.ts +++ b/libs/red-ui-http/src/lib/model/projectRequest.ts @@ -3,14 +3,39 @@ * Description for redaction * * OpenAPI spec version: 1.0 - * + * * * NOTE: This class is auto generated by the swagger code generator program. * https://github.com/swagger-api/swagger-codegen.git * Do not edit the class manually. */ -export interface ProjectRequest { - projectName?: string; - description?: string; -} +/** + * Object containing information about a project. + */ +export interface ProjectRequest { + /** + * The project's description (optional). + */ + description?: string; + /** + * The date when the project is due. + */ + dueDate?: string; + /** + * The id(s) of members associated to this project. + */ + memberIds?: Array; + /** + * The id of the owning user. + */ + ownerId?: string; + /** + * The id of the project, can be null for create requests. + */ + projectId?: string; + /** + * The name of the project. Must be unique. + */ + projectName?: string; +} \ No newline at end of file