Code development platform for open source projects from the European Union institutions

Skip to content
Snippets Groups Projects
Commit ad172b72 authored by Joze RIHTARSIC's avatar Joze RIHTARSIC
Browse files

Pull request #123: [EDELIVERY-11682] review workflow implementation

Merge in EDELIVERY/smp from feature/EDELIVERY-11682-smp-ui-review-document-process-part-2 to development

* commit '3bc4498a':
  [EDELIVERY-1682] PR updates + implement review list page
  [EDELIVERY-1682] PR updates + implement review list page
  PR
  [EDELIVERY-11682] review workflow implementation
parents 7ad83f26 3bc4498a
No related branches found
No related tags found
No related merge requests found
Pipeline #205333 failed
Showing
with 358 additions and 69 deletions
......@@ -166,6 +166,28 @@ import {
} from "./common/dialogs/document-property-dialog/document-property-dialog.component";
import {NgxTranslateModule} from "./translate/translate.module";
import {WindowSpinnerService} from "./common/services/window-spinner.service";
import {
ExpandablePanelComponent
} from "./common/panels/expandable-panel-component/expandable-panel.component";
import {
ExpandableItemComponent
} from "./common/panels/expandable-panel-component/expandable-item-component/expandable-item.component";
import {
DocumentEventsPanelComponent
} from "./common/panels/document-events-panel/document-events-panel.component";
import {
DocumentVersionsPanelComponent
} from "./common/panels/document-versions-panel/document-versions-panel.component";
import {ReviewTasksComponent} from "./edit/review-task/review-tasks.component";
import {
ReviewTasksPanelComponent
} from "./common/panels/review-tasks-panel/review-tasks-panel.component";
import {
DocumentEditPanelComponent
} from "./common/panels/document-edit-panel/document-edit-panel.component";
import {
ReviewDocumentPanelComponent
} from "./common/panels/review-tasks-panel/review-document-panel/review-document-panel.component";
@NgModule({
......@@ -198,8 +220,11 @@ import {WindowSpinnerService} from "./common/services/window-spinner.service";
DnsToolsComponent,
DnsQueryPanelComponent,
DocumentWizardDialogComponent,
DocumentEditPanelComponent,
DocumentEventsPanelComponent,
DocumentPropertiesPanelComponent,
DocumentPropertyDialogComponent,
DocumentVersionsPanelComponent,
DomainGroupComponent,
DomainPanelComponent,
DomainResourceTypePanelComponent,
......@@ -209,6 +234,8 @@ import {WindowSpinnerService} from "./common/services/window-spinner.service";
EditDomainComponent,
EditGroupComponent,
EditResourceComponent,
ExpandablePanelComponent,
ExpandableItemComponent,
ExpiredPasswordDialogComponent,
ExtensionComponent,
ExtensionPanelComponent,
......@@ -236,6 +263,9 @@ import {WindowSpinnerService} from "./common/services/window-spinner.service";
RowLimiterComponent,
SaveDialogComponent,
SearchTableComponent,
ReviewDocumentPanelComponent,
ReviewTasksComponent,
ReviewTasksPanelComponent,
ResourceSearchComponent,
SidenavComponent,
SmpFieldErrorComponent,
......
import {RouterModule, Routes} from '@angular/router';
import {LoginComponent} from './login/login.component';
import {ResourceSearchComponent} from './resource-search/resource-search.component';
import {PropertyComponent} from "./system-settings/admin-properties/property.component";
import {UserProfileComponent} from "./user-settings/user-profile/user-profile.component";
import {
ResourceSearchComponent
} from './resource-search/resource-search.component';
import {
PropertyComponent
} from "./system-settings/admin-properties/property.component";
import {
UserProfileComponent
} from "./user-settings/user-profile/user-profile.component";
import {authenticationGuard} from "./guards/authentication.guard";
import {UserAccessTokensComponent} from "./user-settings/user-access-tokens/user-access-tokens.component";
import {UserCertificatesComponent} from "./user-settings/user-certificates/user-certificates.component";
import {ExtensionComponent} from "./system-settings/admin-extension/extension.component";
import {AdminTruststoreComponent} from "./system-settings/admin-truststore/admin-truststore.component";
import {AdminKeystoreComponent} from "./system-settings/admin-keystore/admin-keystore.component";
import {AdminDomainComponent} from "./system-settings/admin-domain/admin-domain.component";
import {
UserAccessTokensComponent
} from "./user-settings/user-access-tokens/user-access-tokens.component";
import {
UserCertificatesComponent
} from "./user-settings/user-certificates/user-certificates.component";
import {
ExtensionComponent
} from "./system-settings/admin-extension/extension.component";
import {
AdminTruststoreComponent
} from "./system-settings/admin-truststore/admin-truststore.component";
import {
AdminKeystoreComponent
} from "./system-settings/admin-keystore/admin-keystore.component";
import {
AdminDomainComponent
} from "./system-settings/admin-domain/admin-domain.component";
import {dirtyDeactivateGuard} from "./guards/dirty.guard";
import {AdminUserComponent} from "./system-settings/admin-users/admin-user.component";
import {
AdminUserComponent
} from "./system-settings/admin-users/admin-user.component";
import {EditDomainComponent} from "./edit/edit-domain/edit-domain.component";
import {EditGroupComponent} from "./edit/edit-group/edit-group.component";
import {EditResourceComponent} from "./edit/edit-resources/edit-resource.component";
import {ResourceDocumentPanelComponent} from "./edit/edit-resources/resource-document-panel/resource-document-panel.component";
import {SubresourceDocumentPanelComponent} from "./edit/edit-resources/subresource-document-panel/subresource-document-panel.component";
import {authorizeChildSystemAdminGuard} from "./guards/authorize-child-system-admin.guard";
import {activateChildResourceGuard} from "./guards/activate-child-document.guard";
import {UserAlertsComponent} from "./user-settings/user-alerts/user-alerts.component";
import {AdminAlertsComponent} from "./system-settings/admin-alerts/admin-alerts.component";
import {ResetCredentialComponent} from "./security/reset-credential/reset-credential.component";
import {
EditResourceComponent
} from "./edit/edit-resources/edit-resource.component";
import {
ResourceDocumentPanelComponent
} from "./edit/edit-resources/resource-document-panel/resource-document-panel.component";
import {
SubresourceDocumentPanelComponent
} from "./edit/edit-resources/subresource-document-panel/subresource-document-panel.component";
import {
authorizeChildSystemAdminGuard
} from "./guards/authorize-child-system-admin.guard";
import {
activateChildResourceGuard
} from "./guards/activate-child-document.guard";
import {
UserAlertsComponent
} from "./user-settings/user-alerts/user-alerts.component";
import {
AdminAlertsComponent
} from "./system-settings/admin-alerts/admin-alerts.component";
import {
ResetCredentialComponent
} from "./security/reset-credential/reset-credential.component";
import {DnsToolsComponent} from "./tools/dns-tools/dns-tools.component";
import {ReviewTasksComponent} from "./edit/review-task/review-tasks.component";
import {
ReviewDocumentPanelComponent
} from "./common/panels/review-tasks-panel/review-document-panel/review-document-panel.component";
import {activateChildReviewGuard} from "./guards/activate-child-review.guard";
const appRoutes: Routes = [
......@@ -36,8 +77,16 @@ const appRoutes: Routes = [
path: 'edit',
canActivateChild: [authenticationGuard],
children: [
{path: 'edit-domain', component: EditDomainComponent, canDeactivate: [dirtyDeactivateGuard]},
{path: 'edit-group', component: EditGroupComponent, canDeactivate: [dirtyDeactivateGuard]},
{
path: 'edit-domain',
component: EditDomainComponent,
canDeactivate: [dirtyDeactivateGuard]
},
{
path: 'edit-group',
component: EditGroupComponent,
canDeactivate: [dirtyDeactivateGuard]
},
{
path: 'edit-resource',
canDeactivate: [dirtyDeactivateGuard],
......@@ -54,8 +103,23 @@ const appRoutes: Routes = [
component: SubresourceDocumentPanelComponent,
canDeactivate: [dirtyDeactivateGuard]
},
{path: '', component: EditResourceComponent, canDeactivate: [dirtyDeactivateGuard]},
{
path: '',
component: EditResourceComponent,
canDeactivate: [dirtyDeactivateGuard]
},
]
},
{
path: 'review-tasks',
children: [
{
path: 'review-document',
canActivate: [activateChildReviewGuard],
component: ReviewDocumentPanelComponent,
canDeactivate: [dirtyDeactivateGuard]
},
{path: '', component: ReviewTasksComponent},]
}
]
},
......@@ -63,24 +127,72 @@ const appRoutes: Routes = [
path: 'system-settings',
canActivateChild: [authenticationGuard, authorizeChildSystemAdminGuard],
children: [
{path: 'domain', component: AdminDomainComponent, canDeactivate: [dirtyDeactivateGuard]},
{path: 'user', component: AdminUserComponent, canDeactivate: [dirtyDeactivateGuard]},
{path: 'properties', component: PropertyComponent, canDeactivate: [dirtyDeactivateGuard]},
{path: 'keystore', component: AdminKeystoreComponent, canDeactivate: [dirtyDeactivateGuard]},
{path: 'truststore', component: AdminTruststoreComponent, canDeactivate: [dirtyDeactivateGuard]},
{path: 'extension', component: ExtensionComponent, canDeactivate: [dirtyDeactivateGuard]},
{path: 'alert', component: AdminAlertsComponent, canDeactivate: [dirtyDeactivateGuard]},
{
path: 'domain',
component: AdminDomainComponent,
canDeactivate: [dirtyDeactivateGuard]
},
{
path: 'user',
component: AdminUserComponent,
canDeactivate: [dirtyDeactivateGuard]
},
{
path: 'properties',
component: PropertyComponent,
canDeactivate: [dirtyDeactivateGuard]
},
{
path: 'keystore',
component: AdminKeystoreComponent,
canDeactivate: [dirtyDeactivateGuard]
},
{
path: 'truststore',
component: AdminTruststoreComponent,
canDeactivate: [dirtyDeactivateGuard]
},
{
path: 'extension',
component: ExtensionComponent,
canDeactivate: [dirtyDeactivateGuard]
},
{
path: 'alert',
component: AdminAlertsComponent,
canDeactivate: [dirtyDeactivateGuard]
},
]
},
{
path: 'user-settings',
canActivateChild: [authenticationGuard],
children: [
{path: 'user-profile', component: UserProfileComponent, canDeactivate: [dirtyDeactivateGuard]},
{path: 'user-access-token', component: UserAccessTokensComponent, canDeactivate: [dirtyDeactivateGuard]},
{path: 'user-certificate', component: UserCertificatesComponent, canDeactivate: [dirtyDeactivateGuard]},
{path: 'user-alert', component: UserAlertsComponent, canDeactivate: [dirtyDeactivateGuard]},
{path: 'user-membership', component: UserProfileComponent, canDeactivate: [dirtyDeactivateGuard]},
{
path: 'user-profile',
component: UserProfileComponent,
canDeactivate: [dirtyDeactivateGuard]
},
{
path: 'user-access-token',
component: UserAccessTokensComponent,
canDeactivate: [dirtyDeactivateGuard]
},
{
path: 'user-certificate',
component: UserCertificatesComponent,
canDeactivate: [dirtyDeactivateGuard]
},
{
path: 'user-alert',
component: UserAlertsComponent,
canDeactivate: [dirtyDeactivateGuard]
},
{
path: 'user-membership',
component: UserProfileComponent,
canDeactivate: [dirtyDeactivateGuard]
},
]
},
{path: '**', redirectTo: ''},
......
import {Injectable} from '@angular/core';
import {NavigationEnd, NavigationStart, Router} from '@angular/router';
import {Observable, Subject} from 'rxjs';
import {lastValueFrom, Observable, Subject} from 'rxjs';
import {HttpErrorResponse} from "@angular/common/http";
import {TranslateService} from "@ngx-translate/core";
/**
* AlertMessageRO is the object that will be used to display the message in the SMP alert component in overlay.
......@@ -25,7 +26,8 @@ export class AlertMessageService {
private keepAfterNavigationChange:boolean = false;
private message: AlertMessageRO;
constructor(private router: Router) {
constructor(private router: Router,
private translateService: TranslateService) {
// clear alert message on route change
router.events.subscribe(event => {
if (event instanceof NavigationStart) {
......@@ -80,7 +82,6 @@ export class AlertMessageService {
* @param messageObject
*/
getObjectMessage(messageObject: any): string {
let message = 'An error occurred';
if (typeof messageObject === 'string') {
return messageObject;
}
......@@ -124,6 +125,15 @@ export class AlertMessageService {
this.displayCurrentMessage();
}
async showMessageForTranslation(translationCode: string,type: string, keepAfterNavigationChange = false, timeoutInSeconds: number = null) : Promise<void> {
let message = await lastValueFrom(this.translateService.get(translationCode))
this.showMessage(message, type, keepAfterNavigationChange, timeoutInSeconds);
}
successForTranslation(translationCode: string, keepAfterNavigationChange = false, timeoutInSeconds: number = null) {
this.showMessageForTranslation(translationCode, 'success', keepAfterNavigationChange, timeoutInSeconds);
}
success(message: string, keepAfterNavigationChange = false, timeoutInSeconds: number = null) {
this.showMessage(message, 'success', keepAfterNavigationChange, timeoutInSeconds);
}
......@@ -132,6 +142,10 @@ export class AlertMessageService {
this.showMessage(message, 'warning', keepAfterNavigationChange, timeoutInSeconds);
}
errorForTranslation(translationCode: string, keepAfterNavigationChange = false, timeoutInSeconds: number = null) {
this.showMessageForTranslation(translationCode, 'error', keepAfterNavigationChange, timeoutInSeconds);
}
error(message: any, keepAfterNavigationChange = false, timeoutInSeconds: number = null) {
this.showMessage(message, 'error', keepAfterNavigationChange, timeoutInSeconds);
}
......
......@@ -144,6 +144,7 @@ export class SmpEditorComponent
@Input() set readOnly(readOnly: boolean) {
this._readOnly = readOnly;
console.log("Document readOnly", readOnly)
this.codeMirror?.dispatch({
effects: this.readOnlyDocument.reconfigure(EditorState.readOnly.of(readOnly))
})
......
import {Component, Inject} from '@angular/core';
import {MAT_DIALOG_DATA} from '@angular/material/dialog';
import {UntypedFormBuilder} from "@angular/forms";
import {SmpConstants} from "../../../smp.constants";
import {CertificateRo} from "../../model/certificate-ro.model";
import {TranslateService} from "@ngx-translate/core";
......@@ -10,7 +9,7 @@ import {TranslateService} from "@ngx-translate/core";
templateUrl: './certificate-dialog.component.html'
})
export class CertificateDialogComponent {
readonly dateTimeFormat: string = SmpConstants.DATE_TIME_FORMAT;
formTitle: string;
current: CertificateRo;
......
import {Component, Inject} from '@angular/core';
import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';
import {FormBuilder, FormControl, FormGroup} from "@angular/forms";
import {SmpConstants} from "../../../smp.constants";
import {AccessTokenRo} from "../../model/access-token-ro.model";
import {CredentialRo} from "../../../security/credential.model";
import {HttpErrorHandlerService} from "../../error/http-error-handler.service";
......@@ -19,7 +18,6 @@ export class CredentialDialogComponent {
public static CERTIFICATE_TYPE: string = "CERTIFICATE";
public static ACCESS_TOKEN_TYPE: string = "ACCESS_TOKEN";
dateTimeFormat: string = SmpConstants.DATE_TIME_FORMAT;
formTitle: string;
credentialForm: FormGroup;
certificateForm: FormGroup;
......
.form-field-full-width {
width: 100%;
}
.empty-field-label {
color: gray;
}
#custom-file-upload {
display: none;
}
......@@ -11,3 +14,6 @@
display: inline-block;
cursor: pointer;
}
#member-user-can-review {
max-height: 1.5em
}
......@@ -2,7 +2,7 @@
<mat-dialog-content style="width:700px">
<form [formGroup]="memberForm">
<b *ngIf="newMode">{{ "member.dialog.label.invite.members" | translate: {target: inviteTarget} }}</b>
<mat-form-field style="width: 100%">
<mat-form-field class="form-field-full-width">
<mat-label>{{ "member.dialog.label.choose.user" | translate }}</mat-label>
<input id="member-user" type="text" matInput formControlName="member-user"
[matAutocomplete]="auto" (keyup)="applyUserFilter($event)"
......@@ -16,9 +16,9 @@
</mat-form-field>
<mat-form-field style="width:100%">
<mat-label>Select role for the user</mat-label>
<select matNativeControl placeholder="{{ 'member.dialog.placeholder.role.type' | translate }}"
<mat-form-field class="form-field-full-width">
<mat-label>{{ "member.dialog.label.select.role.type" | translate }}</mat-label>
<select matNativeControl placeholder="{{ 'member.dialog.label.permission.review' | translate }}"
formControlName="member-roleType"
name="Role type"
matTooltip="{{ 'member.dialog.tooltip.role.type' | translate }}"
......@@ -30,6 +30,17 @@
</select>
<mat-hint>{{ "member.dialog.hint.choose.role" | translate }}</mat-hint>
</mat-form-field>
<mat-form-field class="form-field-full-width" >
<mat-checkbox *ngIf="isResourceMember" formControlName="member-can-review" id="member-user-can-review"
matTooltip="{{ 'member.dialog.tooltip.permission.review' | translate }}"
>{{ "member.dialog.label.permission.review" | translate }}
<!-- This input is used to make the mat-checkbox as form filed -->
<input matInput style="display: none;">
</mat-checkbox>
<mat-hint>{{ "member.dialog.hint.can.review" | translate }}</mat-hint>
</mat-form-field>
</form>
</mat-dialog-content>
<mat-dialog-actions>
......
......@@ -2,7 +2,7 @@ import {Component, Inject, Input, OnInit} from '@angular/core';
import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';
import {FormBuilder, FormControl, FormGroup} from "@angular/forms";
import {MembershipRoleEnum} from "../../enums/membership-role.enum";
import {firstValueFrom, lastValueFrom, Observable} from "rxjs";
import {lastValueFrom, Observable} from "rxjs";
import {SearchUserRo} from "../../model/search-user-ro.model";
import {MembershipService} from "../../panels/membership-panel/membership.service";
import {MemberRo} from "../../model/member-ro.model";
......@@ -58,7 +58,8 @@ export class MemberDialogComponent implements OnInit {
'member-user': new FormControl({value: null}),
'member-fullName': new FormControl({value: null}),
'member-memberOf': new FormControl({value: null}),
'member-roleType': new FormControl({value: null})
'member-roleType': new FormControl({value: null}),
'member-can-review': new FormControl({value: null})
});
this.member = {
...data.member
......@@ -79,6 +80,7 @@ export class MemberDialogComponent implements OnInit {
member.fullName = this.memberForm.get('member-fullName').value;
member.memberOf = this.memberForm.get('member-memberOf').value;
member.roleType = this.memberForm.get('member-roleType').value;
member.hasPermissionReview = this.memberForm.get('member-can-review').value
return member;
}
......@@ -102,12 +104,14 @@ export class MemberDialogComponent implements OnInit {
this.memberForm.controls['member-fullName'].setValue(value.fullName);
this.memberForm.controls['member-memberOf'].setValue(value.memberOf);
this.memberForm.controls['member-roleType'].setValue(value.roleType);
this.memberForm.controls['member-can-review'].setValue(value.hasPermissionReview);
} else {
this.memberForm.controls['member-user'].setValue("");
this.memberForm.controls['member-fullName'].setValue("");
this.memberForm.controls['member-memberOf'].setValue("");
this.memberForm.controls['member-roleType'].setValue("");
this.memberForm.controls['member-can-review'].setValue(false);
}
this.memberForm.markAsPristine();
}
......@@ -173,4 +177,8 @@ export class MemberDialogComponent implements OnInit {
return this.membershipService.addEditMemberToResource(this._currentResource, this._currentGroup,this._currentDomain, this.member)
}
}
get isResourceMember(): boolean {
return this.membershipType === MemberTypeEnum.RESOURCE;
}
}
/**
* Enum for document versions status codes
* @Since 5.0
* @Author: Joze RIHTARSIC
*/
export enum DocumentVersionsStatus {
DRAFT="DRAFT",
PUBLISHED="PUBLISHED",
RETIRED="RETIRED",
UNDER_REVIEW="UNDER_REVIEW",
APPROVED="APPROVED",
REJECTED="REJECTED"
}
......@@ -7,8 +7,7 @@ import {AlertMessageService} from "../alert-message/alert-message.service";
export class HttpErrorHandlerService {
constructor (private navigationService: NavigationService,
private alertMessageService: AlertMessageService,) {
private alertMessageService: AlertMessageService) {
}
public logoutOnInvalidSessionError(err: any): boolean {
......@@ -21,4 +20,20 @@ export class HttpErrorHandlerService {
}
return false;
}
public handleHttpError(err: any) {
if (err instanceof HttpErrorResponse) {
if (this.logoutOnInvalidSessionError(err)) {
return;
}
if (err.status === 0) {
this.alertMessageService.error("Server is not reachable. Please try again later.");
} else {
this.alertMessageService.error(err.error.errorDescription);
}
} else {
this.alertMessageService.error(err.error?.errorDescription);
}
}
}
......@@ -14,6 +14,13 @@ import {DateAdapter} from "@angular/material/core";
import {NgxMatDateAdapter} from "@angular-material-components/datetime-picker";
import {DomainRo} from "./model/domain-ro.model";
import {Subject} from "rxjs";
import {
FormatWidth,
getLocaleDateFormat,
getLocaleDateTimeFormat,
getLocaleTimeFormat
} from "@angular/common";
import StringUtils from "./utils/string-utils";
/**
* Purpose of object is to fetch lookups as domains and users
......@@ -24,6 +31,7 @@ export class GlobalLookups {
// global data observers. The components will subscribe to these Subject to get
// data updates.
private smpInfoUpdateSubject: Subject<SmpInfo> = new Subject<SmpInfo>();
private readonly DEFAULT_LOCALE: string = 'fr';
domainObserver: Observable<SearchTableResult>
userObserver: Observable<SearchTableResult>
......@@ -60,8 +68,8 @@ export class GlobalLookups {
}
);
// set default locale
dateAdapter.setLocale('fr');
ngxMatDateAdapter.setLocale('fr');
dateAdapter.setLocale(this.DEFAULT_LOCALE);
ngxMatDateAdapter.setLocale(this.DEFAULT_LOCALE);
}
......@@ -91,6 +99,31 @@ export class GlobalLookups {
});
}
getCurrentLocale(): string {
if (this.securityService.getCurrentUser() == null) {
return this.DEFAULT_LOCALE;
}
return this.securityService.getCurrentUser().smpLocale;
}
public getDateTimeFormat(withSeconds: boolean = true): string {
let locale = this.getCurrentLocale();
locale = locale ? locale : this.DEFAULT_LOCALE;
let format: string = getLocaleDateTimeFormat(locale, FormatWidth.Short);
let fullTime = getLocaleTimeFormat(locale,withSeconds? FormatWidth.Medium:FormatWidth.Short);
let fullDate = getLocaleDateFormat(locale, FormatWidth.Short);
let result = StringUtils.format(format, [fullTime, fullDate]);
return result;
}
private format(str, opt_values) {
if (opt_values) {
str = str.replace(/\{([^}]+)}/g, function (match, key) {
return (opt_values != null && key in opt_values) ? opt_values[key] : match;
});
}
return str;
}
public refreshApplicationInfo() {
......@@ -114,13 +147,14 @@ export class GlobalLookups {
console.log("Refresh application configuration is authenticated " + isAuthenticated)
if (isAuthenticated) {
this.http.get<SmpConfig>(SmpConstants.REST_PUBLIC_APPLICATION_CONFIG)
.subscribe({next: (res :SmpConfig):void => {
this.cachedApplicationConfig = res;
},
error: (err: any)=> {
console.log("getSmpConfig:" + err);
}
});
.subscribe({
next: (res: SmpConfig): void => {
this.cachedApplicationConfig = res;
},
error: (err: any) => {
console.log("getSmpConfig:" + err);
}
});
}
});
}
......
import {DocumentPropertyRo} from "./document-property-ro.model";
import {SearchTableEntity} from "../search-table/search-table-entity.model";
import {EntityStatus} from "../enums/entity-status.enum";
import {
DocumentVersionRo
} from "./document-version-ro.model";
import {DocumentVersionEventRo} from "./document-version-event-ro.model";
import {DocumentVersionsStatus} from "../enums/document-versions-status.enum";
export interface DocumentRo extends SearchTableEntity {
mimeType?: string;
......@@ -13,5 +18,8 @@ export interface DocumentRo extends SearchTableEntity {
payload?:string;
payloadStatus: EntityStatus;
properties?: DocumentPropertyRo[];
documentVersionStatus?: DocumentVersionsStatus;
documentVersionEvents?: DocumentVersionEventRo[];
documentVersions?: DocumentVersionRo[];
}
import {SearchTableEntity} from "../search-table/search-table-entity.model";
export interface DocumentVersionEventRo extends SearchTableEntity {
eventType: string;
eventOn: Date;
username: string;
eventSourceType: string;
details: string;
}
import {SearchTableEntity} from "../search-table/search-table-entity.model";
export interface DocumentVersionRo extends SearchTableEntity {
version: number;
versionStatus:string;
createdOn: Date;
lastUpdatedOn: Date;
}
......@@ -10,4 +10,7 @@ export interface MemberRo extends SearchTableEntity {
memberOf:MemberTypeEnum;
fullName:string;
roleType:MembershipRoleEnum;
// only for resource members
hasPermissionReview?:boolean;
}
......@@ -12,6 +12,7 @@ export interface ResourceRo extends SearchTableEntity {
smlRegistered: boolean;
reviewEnabled?: boolean;
visibility: VisibilityEnum;
}
import {SearchTableEntity} from "../search-table/search-table-entity.model";
export interface ReviewDocumentVersionRo extends SearchTableEntity {
documentId: string;
documentVersionId: string;
resourceId: string;
subresourceId?: string;
version: number;
currentStatus: string;
resourceIdentifierValue: string;
resourceIdentifierScheme: string;
subresourceIdentifierValue?: string;
subresourceIdentifierScheme?: string;
target: string;
lastUpdatedOn: Date;
}
import {SearchTableEntity} from "../search-table/search-table-entity.model";
import {VisibilityEnum} from "../enums/visibility.enum";
export interface SubresourceRo extends SearchTableEntity {
subresourceId?: string;
subresourceTypeIdentifier?: string;
identifierValue: string;
identifierScheme?: string;
}
......@@ -2,7 +2,8 @@ import {
AfterViewChecked,
AfterViewInit,
ChangeDetectorRef,
Component, Input,
Component,
Input,
OnInit,
TemplateRef,
ViewChild
......@@ -13,11 +14,12 @@ import {MatDialog} from '@angular/material/dialog';
import {AlertMessageService} from '../../alert-message/alert-message.service';
import {AlertController} from './alert-controller';
import {HttpClient} from '@angular/common/http';
import {SmpConstants} from "../../../smp.constants";
import {GlobalLookups} from "../../global-lookups";
import {SearchTableComponent} from "../../search-table/search-table.component";
import {SecurityService} from "../../../security/security.service";
import {ObjectPropertiesDialogComponent} from "../../dialogs/object-properties-dialog/object-properties-dialog.component";
import {
ObjectPropertiesDialogComponent
} from "../../dialogs/object-properties-dialog/object-properties-dialog.component";
/**
* This is a generic alert panel component for previewing alert list
......@@ -37,14 +39,10 @@ export class AlertPanelComponent implements OnInit, AfterViewInit, AfterViewChec
@ViewChild('credentialType') credentialType: TemplateRef<any>;
@ViewChild('forUser') forUser: TemplateRef<any>;
readonly dateTimeFormat: string = SmpConstants.DATE_TIME_FORMAT;
readonly dateFormat: string = SmpConstants.DATE_FORMAT;
@Input() baseUrl = null;
@Input() baseUrl = null;
columnPicker: ColumnPicker = new ColumnPicker();
alertController: AlertController;
filter: any = {};
isSMPIntegrationOn: boolean = false;
constructor(public securityService: SecurityService,
protected lookups: GlobalLookups,
......@@ -142,4 +140,8 @@ export class AlertPanelComponent implements OnInit, AfterViewInit, AfterViewChec
isDirty(): boolean {
return this.searchTable.isDirty();
}
get dateTimeFormat(): string {
return this.lookups.getDateTimeFormat();
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment