Code development platform for open source projects from the European Union institutions :large_blue_circle: EU Login authentication by SMS has been phased out. To see alternatives please check here

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

Fix UI participant identifier handling (case-sensitive, scheme mandatory, etc.. )

parent fa461c07
No related branches found
No related tags found
No related merge requests found
Showing
with 92 additions and 39 deletions
...@@ -44,7 +44,6 @@ export class AppComponent { ...@@ -44,7 +44,6 @@ export class AppComponent {
private themeService: ThemeService, private themeService: ThemeService,
) { ) {
this.userController = new UserController(this.http, this.lookups, this.dialog); this.userController = new UserController(this.http, this.lookups, this.dialog);
themeService.updateThemeFromLocalStorage(); themeService.updateThemeFromLocalStorage();
} }
......
...@@ -19,12 +19,12 @@ ...@@ -19,12 +19,12 @@
Active Active
</mat-checkbox> </mat-checkbox>
<mat-form-field style="flex-grow: 1"> <mat-form-field style="flex-grow: 1">
<mat-label>Enter a credential valid date range</mat-label> <mat-label>Validity period of the credentials</mat-label>
<mat-date-range-input [rangePicker]="picker"> <mat-date-range-input [rangePicker]="picker">
<input matStartDate formControlName="activeFrom" placeholder="Start date"> <input matStartDate formControlName="activeFrom" placeholder="Start date">
<input matEndDate formControlName="expireOn" placeholder="End date"> <input matEndDate formControlName="expireOn" placeholder="End date">
</mat-date-range-input> </mat-date-range-input>
<mat-datepicker-toggle matIconSuffix [for]="picker"></mat-datepicker-toggle> <mat-datepicker-toggle *ngIf="!this.isCertificateType" matIconSuffix [for]="picker"></mat-datepicker-toggle>
<mat-date-range-picker #picker></mat-date-range-picker> <mat-date-range-picker #picker></mat-date-range-picker>
<smp-field-error *ngIf="credentialForm.controls.activeFrom.hasError('matStartDateInvalid')">Invalid active from <smp-field-error *ngIf="credentialForm.controls.activeFrom.hasError('matStartDateInvalid')">Invalid active from
date date
...@@ -87,7 +87,7 @@ ...@@ -87,7 +87,7 @@
</button> </button>
<button *ngIf="isCertificateType && !isReadOnly" [disabled]="!credentialForm.valid || isCertificateInvalid " mat-raised-button color="primary" <button *ngIf="isCertificateType && !isReadOnly" [disabled]="!credentialForm.valid " mat-raised-button color="primary"
(click)="storeCertificateCredentials()"> (click)="storeCertificateCredentials()">
<mat-icon>key</mat-icon> <mat-icon>key</mat-icon>
<span>Save Certificate</span> <span>Save Certificate</span>
......
...@@ -60,8 +60,7 @@ export class CredentialDialogComponent { ...@@ -60,8 +60,7 @@ export class CredentialDialogComponent {
'encodedValue': new FormControl({value: null, readonly: true}) 'encodedValue': new FormControl({value: null, readonly: true})
}); });
this.credentialForm.controls['active'].setValue(true);
this.credentialForm.controls['active'].setValue('');
this.credentialForm.controls['description'].setValue(''); this.credentialForm.controls['description'].setValue('');
this.credentialForm.controls['activeFrom'].setValue(''); this.credentialForm.controls['activeFrom'].setValue('');
this.credentialForm.controls['expireOn'].setValue(''); this.credentialForm.controls['expireOn'].setValue('');
...@@ -102,6 +101,11 @@ export class CredentialDialogComponent { ...@@ -102,6 +101,11 @@ export class CredentialDialogComponent {
this.credentialForm.controls['description'].enable(); this.credentialForm.controls['description'].enable();
this.credentialForm.controls['activeFrom'].enable(); this.credentialForm.controls['activeFrom'].enable();
this.credentialForm.controls['expireOn'].enable(); this.credentialForm.controls['expireOn'].enable();
if (this.isCertificateType) {
this.credentialForm.controls['activeFrom'].disable();
this.credentialForm.controls['expireOn'].disable();
}
} }
this.isReadOnly = disabled this.isReadOnly = disabled
...@@ -115,6 +119,7 @@ export class CredentialDialogComponent { ...@@ -115,6 +119,7 @@ export class CredentialDialogComponent {
} }
} }
uploadCertificate(event) { uploadCertificate(event) {
this.newCertFile = null; this.newCertFile = null;
const file = event.target.files[0]; const file = event.target.files[0];
...@@ -136,6 +141,10 @@ export class CredentialDialogComponent { ...@@ -136,6 +141,10 @@ export class CredentialDialogComponent {
} else { } else {
this.clearAlert() this.clearAlert()
} }
this.credentialForm.controls['activeFrom'].setValue(res.validFrom);
this.credentialForm.controls['expireOn'].setValue(res.validTo);
this.isCertificateInvalid = res.invalid; this.isCertificateInvalid = res.invalid;
this.newCertFile = file; this.newCertFile = file;
} else { } else {
......
...@@ -18,10 +18,6 @@ ...@@ -18,10 +18,6 @@
align-self: stretch; align-self: stretch;
} }
.smp-data-panel-field {
width: 100% !important;
}
.smp-column-label { .smp-column-label {
padding-top: 2em; padding-top: 2em;
min-height: 100px; min-height: 100px;
......
...@@ -53,8 +53,6 @@ ...@@ -53,8 +53,6 @@
(click)="domainSelected(row)" (click)="domainSelected(row)"
[ngClass]="{'datatable-row-selected': row==selected,'datatable-row-odd': odd}" [ngClass]="{'datatable-row-selected': row==selected,'datatable-row-odd': odd}"
></tr> ></tr>
<tr class="mat-row" *matNoDataRow> <tr class="mat-row" *matNoDataRow>
<td *ngIf="inputDomainFilter.value;else noDataFound" class="mat-cell" colspan="2">No data matching the filter <td *ngIf="inputDomainFilter.value;else noDataFound" class="mat-cell" colspan="2">No data matching the filter
"{{inputDomainFilter.value}}" "{{inputDomainFilter.value}}"
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
min-height: 600px; min-height: 600px;
padding: 0 2em; padding: 0 2em;
} }
#group-filter { #group-filter {
width: 100%; width: 100%;
padding-top: 1em; padding-top: 1em;
......
...@@ -75,8 +75,9 @@ ...@@ -75,8 +75,9 @@
<mat-paginator class="mat-elevation-z2" [length]="resultsLength" <mat-paginator class="mat-elevation-z2" [length]="resultsLength"
(page)="onPageChanged($event)" (page)="onPageChanged($event)"
[pageSize]="5" [hidePageSize]="true"
[pageSizeOptions]="[5, 10, 25]" [showFirstLastButtons]="true"
[pageSize]="10"
[disabled]="disabledForm" [disabled]="disabledForm"
aria-label="Select pages"></mat-paginator> aria-label="Select pages"></mat-paginator>
</div> </div>
......
...@@ -20,14 +20,37 @@ ...@@ -20,14 +20,37 @@
<mat-label>Resource identifier</mat-label> <mat-label>Resource identifier</mat-label>
<input id="identifierValue_id" type="text" matInput #identifierValue <input id="identifierValue_id" type="text" matInput #identifierValue
formControlName="identifierValue" formControlName="identifierValue"
required auto-focus-directive> required auto-focus-directive
maxlength="255" required>
<div
*ngIf="(newMode && resourceForm.controls['identifierValue'].touched ) && resourceForm.controls['identifierValue'].hasError('required')"
style="color:red; font-size: 70%">
Participant identifier must not be empty and must be up to 255 characters long.
</div>
<div
*ngIf="(newMode && resourceForm.controls['identifierValue'].hasError('dbExist'))"
style="color:red; font-size: 70%">
Participant identifier for given scheme is already defined in database!
</div>
</mat-form-field> </mat-form-field>
<mat-form-field style="width: 100%"> <mat-form-field style="width: 100%">
<mat-label>Resource scheme</mat-label> <mat-label>Resource scheme</mat-label>
<input id="identifierScheme_id" type="text" matInput <input id="identifierScheme_id" type="text" matInput
formControlName="identifierScheme" formControlName="identifierScheme"
maxlength="255"
> >
<div
*ngIf="(newMode && resourceForm.controls['identifierScheme'].touched ) && resourceForm.controls['identifierScheme'].hasError('required')"
style="color:red; font-size: 70%">
Participant scheme must not be empty.
</div>
<div
*ngIf="(newMode && resourceForm.controls['identifierScheme'].touched ) &&
resourceForm.controls['identifierScheme'].hasError('pattern')"
style="color:red; font-size: 70%">
{{participantSchemeMessage}}
</div>
</mat-form-field> </mat-form-field>
......
import {Component, ElementRef, Inject, Input, ViewChild} from '@angular/core'; import {Component, ElementRef, Inject, Input, ViewChild} from '@angular/core';
import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog'; import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';
import {FormBuilder, FormControl, FormGroup} from "@angular/forms"; import {FormBuilder, FormControl, FormGroup, Validators} from "@angular/forms";
import {AlertMessageService} from "../../../../common/alert-message/alert-message.service"; import {AlertMessageService} from "../../../../common/alert-message/alert-message.service";
import {VisibilityEnum} from "../../../../common/enums/visibility.enum"; import {VisibilityEnum} from "../../../../common/enums/visibility.enum";
import {GroupRo} from "../../../../common/model/group-ro.model"; import {GroupRo} from "../../../../common/model/group-ro.model";
...@@ -8,6 +8,8 @@ import {ResourceRo} from "../../../../common/model/resource-ro.model"; ...@@ -8,6 +8,8 @@ import {ResourceRo} from "../../../../common/model/resource-ro.model";
import {DomainRo} from "../../../../common/model/domain-ro.model"; import {DomainRo} from "../../../../common/model/domain-ro.model";
import {ResourceDefinitionRo} from "../../../../system-settings/admin-extension/resource-definition-ro.model"; import {ResourceDefinitionRo} from "../../../../system-settings/admin-extension/resource-definition-ro.model";
import {EditGroupService} from "../../edit-group.service"; import {EditGroupService} from "../../edit-group.service";
import {GlobalLookups} from "../../../../common/global-lookups";
import {EntityStatus} from "../../../../common/enums/entity-status.enum";
@Component({ @Component({
...@@ -20,6 +22,7 @@ export class ResourceDialogComponent { ...@@ -20,6 +22,7 @@ export class ResourceDialogComponent {
.map(el => { .map(el => {
return {key: el, value: VisibilityEnum[el]} return {key: el, value: VisibilityEnum[el]}
}); });
formTitle = "Resource dialog"; formTitle = "Resource dialog";
resourceForm: FormGroup; resourceForm: FormGroup;
message: string; message: string;
...@@ -29,24 +32,39 @@ export class ResourceDialogComponent { ...@@ -29,24 +32,39 @@ export class ResourceDialogComponent {
domain:DomainRo; domain:DomainRo;
domainResourceDefs:ResourceDefinitionRo[]; domainResourceDefs:ResourceDefinitionRo[];
participantSchemePattern = '^[a-z0-9]+-[a-z0-9]+-[a-z0-9]+$';
participantSchemeMessage:string;
@ViewChild('identifierValue', {static: false}) identifierValue: ElementRef; @ViewChild('identifierValue', {static: false}) identifierValue: ElementRef;
constructor(@Inject(MAT_DIALOG_DATA) public data: any, constructor(@Inject(MAT_DIALOG_DATA) public data: any,
public lookups: GlobalLookups,
public dialogRef: MatDialogRef<ResourceDialogComponent>, public dialogRef: MatDialogRef<ResourceDialogComponent>,
private editGroupService: EditGroupService, private editGroupService: EditGroupService,
private alertService: AlertMessageService, private alertService: AlertMessageService,
private formBuilder: FormBuilder private formBuilder: FormBuilder
) { ) {
if (this.lookups.cachedApplicationConfig) {
this.participantSchemePattern = this.lookups.cachedApplicationConfig.participantSchemaRegExp != null ?
this.lookups.cachedApplicationConfig.participantSchemaRegExp : ".*"
this.participantSchemeMessage = this.lookups.cachedApplicationConfig.participantSchemaRegExpMessage;
}
dialogRef.disableClose = true;//disable default close operation dialogRef.disableClose = true;//disable default close operation
this.formTitle = data.formTitle; this.formTitle = data.formTitle;
this.resourceForm = formBuilder.group({ this.resourceForm = formBuilder.group({
'identifierValue': new FormControl({value: null}), 'identifierValue': new FormControl({value: null}, ),
'identifierScheme': new FormControl({value: null}), 'identifierScheme': new FormControl({value: null},[Validators.pattern(this.participantSchemePattern)]),
'visibility': new FormControl({value: null}), 'visibility': new FormControl({value: null}),
'resourceTypeIdentifier': new FormControl({value: null}), 'resourceTypeIdentifier': new FormControl({value: null}),
'': new FormControl({value: null}) '': new FormControl({value: null})
}); });
if (!!lookups.cachedApplicationConfig.partyIDSchemeMandatory) {
this.resourceForm.controls['identifierScheme'].addValidators(Validators.required);
}
this.resource = data.resource; this.resource = data.resource;
this.group = data.group; this.group = data.group;
this.domain = data.domain; this.domain = data.domain;
......
...@@ -18,14 +18,17 @@ ...@@ -18,14 +18,17 @@
<ng-template #searchPanel> <ng-template #searchPanel>
<div style="display: flex;flex-direction: row;width: 100%">
<mat-form-field class="smp-data-panel-field"> <mat-form-field class="smp-data-panel-field">
<input matInput placeholder="Participant Identifier" name="ParticipantIdentifier" <mat-label>Resource Identifier filter</mat-label>
<input matInput name="ResourceIdentifier"
[(ngModel)]="filter.participantIdentifier" [(ngModel)]="filter.participantIdentifier"
#messageId="ngModel" id="participantIdentifier"> #messageId="ngModel" id="ResourceIdentifier">
</mat-form-field> </mat-form-field>
<mat-form-field class="smp-data-panel-field"> <mat-form-field class="smp-data-panel-field">
<input matInput placeholder="Participant scheme" name="patricipantScheme" [(ngModel)]="filter.participantScheme" <mat-label>Resource scheme filter</mat-label>
#messageId="ngModel" id="participantScheme"> <input matInput name="ResourceScheme" [(ngModel)]="filter.participantScheme"
#messageId="ngModel" id="ResourceScheme">
</mat-form-field> </mat-form-field>
<mat-select placeholder="All Domains" [(ngModel)]="filter.domain" name="domain" *ngIf="false" <mat-select placeholder="All Domains" [(ngModel)]="filter.domain" name="domain" *ngIf="false"
id="domain_id"> id="domain_id">
...@@ -34,6 +37,7 @@ ...@@ -34,6 +37,7 @@
{{domain.domainCode}} ({{domain.smlSubdomain}}) {{domain.domainCode}} ({{domain.smlSubdomain}})
</mat-option> </mat-option>
</mat-select> </mat-select>
</div>
</ng-template> </ng-template>
......
...@@ -65,7 +65,7 @@ export class ServiceGroupSearchComponent implements OnInit, AfterViewInit, After ...@@ -65,7 +65,7 @@ export class ServiceGroupSearchComponent implements OnInit, AfterViewInit, After
resizable: "false", resizable: "false",
}, },
{ {
name: 'Participant scheme', name: 'Resource scheme',
prop: 'participantScheme', prop: 'participantScheme',
showInitially: true, showInitially: true,
width: 300, width: 300,
...@@ -73,13 +73,13 @@ export class ServiceGroupSearchComponent implements OnInit, AfterViewInit, After ...@@ -73,13 +73,13 @@ export class ServiceGroupSearchComponent implements OnInit, AfterViewInit, After
resizable: "false" resizable: "false"
}, },
{ {
name: 'Participant identifier', name: 'Resource identifier',
prop: 'participantIdentifier', prop: 'participantIdentifier',
showInitially: true, showInitially: true,
}, },
{ {
cellTemplate: this.rowSMPUrlLinkAction, cellTemplate: this.rowSMPUrlLinkAction,
name: 'OASIS ServiceGroup URL', name: 'Resource URL',
showInitially: true, showInitially: true,
width: 250, width: 250,
maxWidth: 250, maxWidth: 250,
......
...@@ -15,8 +15,9 @@ ...@@ -15,8 +15,9 @@
[tableTitle]="tableTitle" [tableTitle]="tableTitle"
> >
<ng-template #searchPanel> <ng-template #searchPanel>
<mat-form-field> <mat-form-field style="width: 100%" >
<input matInput placeholder="Property" name="Property" <mat-label>Filter by property name</mat-label>
<input matInput name="Property"
[(ngModel)]="filter.property" [(ngModel)]="filter.property"
[matTooltip]='"Filter by property name"' (input)="searchPropertyChanged()" id="searchProperty"> [matTooltip]='"Filter by property name"' (input)="searchPropertyChanged()" id="searchProperty">
</mat-form-field> </mat-form-field>
......
...@@ -17,8 +17,6 @@ import {ApplicationRoleEnum} from "../../common/enums/application-role.enum"; ...@@ -17,8 +17,6 @@ import {ApplicationRoleEnum} from "../../common/enums/application-role.enum";
export class UserController implements SearchTableController { export class UserController implements SearchTableController {
nullCert:CertificateRo; nullCert:CertificateRo;
compareUserProperties = ["username","password","emailAddress","active","role","certificate"]; compareUserProperties = ["username","password","emailAddress","active","role","certificate"];
compareCertProperties = ["certificateId","subject","issuer","serialNumber","crlUrl","validFrom","validTo"]; compareCertProperties = ["certificateId","subject","issuer","serialNumber","crlUrl","validFrom","validTo"];
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
<mat-form-field appearance="fill" style="flex-grow: 1"> <mat-form-field appearance="fill" style="flex-grow: 1">
<mat-label>Enter a valid date range</mat-label> <mat-label>Enter a valid date range</mat-label>
<mat-date-range-input [rangePicker]="picker" > <mat-date-range-input [rangePicker]="picker" [min]="minSelectableDate" >
<input matStartDate formControlName="activeFrom" placeholder="Start date"> <input matStartDate formControlName="activeFrom" placeholder="Start date">
<input matEndDate formControlName="expireOn" placeholder="End date"> <input matEndDate formControlName="expireOn" placeholder="End date">
</mat-date-range-input> </mat-date-range-input>
......
...@@ -11,6 +11,7 @@ import {BeforeLeaveGuard} from "../../../window/sidenav/navigation-on-leave-guar ...@@ -11,6 +11,7 @@ import {BeforeLeaveGuard} from "../../../window/sidenav/navigation-on-leave-guar
}) })
export class AccessTokenPanelComponent implements BeforeLeaveGuard { export class AccessTokenPanelComponent implements BeforeLeaveGuard {
@Output() minSelectableDate: Date = new Date();
@Output() onDeleteEvent: EventEmitter<CredentialRo> = new EventEmitter(); @Output() onDeleteEvent: EventEmitter<CredentialRo> = new EventEmitter();
@Output() onSaveEvent: EventEmitter<CredentialRo> = new EventEmitter(); @Output() onSaveEvent: EventEmitter<CredentialRo> = new EventEmitter();
......
...@@ -16,7 +16,6 @@ import {AccessTokenPanelComponent} from "./access-token-panel/access-token-panel ...@@ -16,7 +16,6 @@ import {AccessTokenPanelComponent} from "./access-token-panel/access-token-panel
}) })
export class UserAccessTokensComponent implements BeforeLeaveGuard { export class UserAccessTokensComponent implements BeforeLeaveGuard {
accessTokens: CredentialRo[] = []; accessTokens: CredentialRo[] = [];
@ViewChildren(AccessTokenPanelComponent) @ViewChildren(AccessTokenPanelComponent)
userTokenCredentialComponents: QueryList<AccessTokenPanelComponent>; userTokenCredentialComponents: QueryList<AccessTokenPanelComponent>;
......
<div class="panel smp-data-panel" [formGroup]="credentialForm" (ngSubmit)="onSaveButtonClicked()"> <div class="panel smp-data-panel" [formGroup]="credentialForm" (ngSubmit)="onSaveButtonClicked()">
<smp-warning-panel *ngIf="_credential.certificate?.invalid;"
icon="error"
label="Invalid certificate: {{_credential.certificate.invalidReason}}">
</smp-warning-panel>
<div style="display: flex;flex-flow: row wrap;"> <div style="display: flex;flex-flow: row wrap;">
<mat-form-field style="flex-grow: 2"> <mat-form-field style="flex-grow: 2">
<mat-label>Certificate ID</mat-label> <mat-label>Certificate ID</mat-label>
...@@ -40,13 +44,11 @@ ...@@ -40,13 +44,11 @@
Active Active
</mat-checkbox> </mat-checkbox>
<mat-form-field appearance="fill" style="flex-grow: 1"> <mat-form-field appearance="fill" style="flex-grow: 1">
<mat-label>Enter a valid date range</mat-label> <mat-label>Validity period of the certificate</mat-label>
<mat-date-range-input [rangePicker]="picker" > <mat-date-range-input >
<input matStartDate formControlName="activeFrom" placeholder="Start date"> <input matStartDate formControlName="activeFrom" placeholder="Start date">
<input matEndDate formControlName="expireOn" placeholder="End date"> <input matEndDate formControlName="expireOn" placeholder="End date">
</mat-date-range-input> </mat-date-range-input>
<mat-datepicker-toggle matIconSuffix [for]="picker"></mat-datepicker-toggle>
<mat-date-range-picker #picker></mat-date-range-picker>
<smp-field-error *ngIf="credentialForm.controls.activeFrom.hasError('matStartDateInvalid')">Invalid active from date</smp-field-error > <smp-field-error *ngIf="credentialForm.controls.activeFrom.hasError('matStartDateInvalid')">Invalid active from date</smp-field-error >
<smp-field-error *ngIf="credentialForm.controls.expireOn.hasError('matEndDateInvalid')">Invalid expire on date</smp-field-error > <smp-field-error *ngIf="credentialForm.controls.expireOn.hasError('matEndDateInvalid')">Invalid expire on date</smp-field-error >
</mat-form-field> </mat-form-field>
......
...@@ -21,7 +21,6 @@ export class UserCertificatePanelComponent implements BeforeLeaveGuard { ...@@ -21,7 +21,6 @@ export class UserCertificatePanelComponent implements BeforeLeaveGuard {
credentialForm: FormGroup; credentialForm: FormGroup;
constructor(private formBuilder: FormBuilder) { constructor(private formBuilder: FormBuilder) {
this.credentialForm = formBuilder.group({ this.credentialForm = formBuilder.group({
// common values // common values
...@@ -47,6 +46,8 @@ export class UserCertificatePanelComponent implements BeforeLeaveGuard { ...@@ -47,6 +46,8 @@ export class UserCertificatePanelComponent implements BeforeLeaveGuard {
this.credentialForm.controls['description'].setValue(this._credential.description); this.credentialForm.controls['description'].setValue(this._credential.description);
this.credentialForm.controls['activeFrom'].setValue(this._credential.activeFrom); this.credentialForm.controls['activeFrom'].setValue(this._credential.activeFrom);
this.credentialForm.controls['expireOn'].setValue(this._credential.expireOn); this.credentialForm.controls['expireOn'].setValue(this._credential.expireOn);
this.credentialForm.controls['activeFrom'].disable()
this.credentialForm.controls['expireOn'].disable()
} else { } else {
this.credentialForm.controls['active'].setValue(null); this.credentialForm.controls['active'].setValue(null);
this.credentialForm.controls['description'].setValue(null); this.credentialForm.controls['description'].setValue(null);
......
import {Component, ViewChild,} from '@angular/core'; import {Component, Output, ViewChild,} from '@angular/core';
import {SecurityService} from "../../security/security.service"; import {SecurityService} from "../../security/security.service";
import {User} from "../../security/user.model"; import {User} from "../../security/user.model";
import {UserService} from "../../system-settings/user/user.service"; import {UserService} from "../../system-settings/user/user.service";
...@@ -20,7 +20,6 @@ import {UserDetailsDialogMode} from "../../system-settings/user/user-details-dia ...@@ -20,7 +20,6 @@ import {UserDetailsDialogMode} from "../../system-settings/user/user-details-dia
}) })
export class UserProfileComponent implements BeforeLeaveGuard { export class UserProfileComponent implements BeforeLeaveGuard {
@ViewChild('userProfilePanel') userProfilePanel: UserProfilePanelComponent; @ViewChild('userProfilePanel') userProfilePanel: UserProfilePanelComponent;
currentUserData: UserRo; currentUserData: UserRo;
loggedInUser: User; loggedInUser: User;
......
...@@ -16,6 +16,9 @@ td , th { ...@@ -16,6 +16,9 @@ td , th {
} }
.smp-data-panel-field {
width: 100% !important;
}
.smp-no-data-panel { .smp-no-data-panel {
padding:2em; padding:2em;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment