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