Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions src/app/admin/users/user-minimal.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,4 +43,12 @@ export class UserMinimalService {
)?.name;
return username;
}

setHasSeenWelcomeScreen(): void {
localStorage.setItem('hasSeenWelcomeScreen', true.toString());
}

getHasSeenWelcomeScreen(): boolean {
return !!localStorage.getItem('hasSeenWelcomeScreen');
}
}
4 changes: 3 additions & 1 deletion src/app/admin/users/user.model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ export class UserRequest {
password: string;
active: boolean;
globalAdmin: boolean;
showWelcomeScreen: boolean;
}

export interface UserResponse {
Expand All @@ -23,9 +24,10 @@ export interface UserResponse {
active: boolean;
lastLogin: Date;
permissions: PermissionResponse[];
showWelcomeScreen: boolean;
}

export interface UserGetManyResponse {
data: UserResponse[];
count: number;
}
}
4 changes: 4 additions & 0 deletions src/app/admin/users/user.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,4 +63,8 @@ export class UserService {
});
}
}

hideWelcome(id: number): Observable<boolean> {
return this.restService.put(`${this.URL}/${id}/hide-welcome`, null, null);
}
}
4 changes: 1 addition & 3 deletions src/app/app-routing.module.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
import { NgModule } from '@angular/core';
import { Routes, RouterModule, PreloadAllModules } from '@angular/router';
import { AuthComponent } from './auth/auth.component';
import { DashboardComponent } from './dashboard/dashboard.component';
import { ErrorPageComponent } from './error-page/error-page.component';
import { SearchComponent } from './search/search.component';
import { AuthGuardService as AuthGuard } from './auth/auth-guard.service';

const routes: Routes = [
{ path: 'admin', loadChildren: () => import('./admin/admin.module').then(m => m.AdminModule), canActivate: [AuthGuard] },
{ path: 'auth', component: AuthComponent },
{ path: 'dashboard', component: DashboardComponent, canActivate: [AuthGuard] },
{ path: 'applications', loadChildren: () => import('./applications/applications.module').then(m => m.ApplicationsModule), canActivate: [AuthGuard] },
{ path: 'gateways', loadChildren: () => import('./gateway/gateway.module').then(m => m.GatewayModule), canActivate: [AuthGuard] },
{ path: 'profiles', loadChildren: () => import('./profiles/profiles.module').then(m => m.ProfilesModule), canActivate: [AuthGuard] },
Expand All @@ -19,7 +17,7 @@ const routes: Routes = [
{ path: 'search', component: SearchComponent, canActivate: [AuthGuard] },
{ path: 'not-found', component: ErrorPageComponent, data: { message: 'not-found', code: 404 } },
{ path: 'not-authorized', component: ErrorPageComponent },
{ path: '', redirectTo: '/dashboard', pathMatch: 'full' },
{ path: '', redirectTo: '/applications', pathMatch: 'full' },
{ path: '**', redirectTo: '/not-found', pathMatch: 'full' }
];

Expand Down
4 changes: 2 additions & 2 deletions src/app/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { ProfilesModule } from './profiles/profiles.module';
import { AuthJwtInterceptor } from '@shared/helpers/auth-jwt.interceptor';
import { AuthModule } from './auth/auth.module';
import { DashboardModule } from './dashboard/dashboard.module';
import { GatewayModule } from './gateway/gateway.module';
import { SharedVariableModule } from '@shared/shared-variable/shared-variable.module';
import { SAVER, getSaver } from '@shared/providers/saver.provider';
Expand All @@ -24,6 +23,7 @@ import { MatInputModule } from '@angular/material/input';
import { MatPaginatorIntl } from '@angular/material/paginator';
import { MatPaginatorIntlDa } from '@shared/helpers/mat-paginator-intl-da';
import { MatTooltipModule } from '@angular/material/tooltip';
import { WelcomeDialogModule } from '@shared/components/welcome-dialog/welcome-dialog.module';

export function HttpLoaderFactory(http: HttpClient) {
return new TranslateHttpLoader(http, './assets/i18n/', '.json');
Expand All @@ -45,7 +45,6 @@ export function tokenGetter() {
BrowserAnimationsModule,
HttpClientModule,
AppRoutingModule,
DashboardModule,
NavbarModule,
ProfilesModule,
TranslateModule.forRoot({
Expand All @@ -70,6 +69,7 @@ export function tokenGetter() {
},
}),
MonacoEditorModule.forRoot(),
WelcomeDialogModule,
],
bootstrap: [AppComponent],
exports: [TranslateModule],
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,31 @@
<ng-template #noPermissions>
<header class="header p-3">
<div class="header__text-box ">
<div class="heading-primary ">
<span class="row heading-primary--main mb-5">
<div class="col-12">
<h1>{{'WELCOME-DIALOG.WELCOME' | translate}}</h1>
<h2>{{'WELCOME-DIALOG.NO-ACCESS' | translate}}</h2>
</div>
</span>
</div>
</div>
</header>
</ng-template>
<app-top-bar [title]="'NAV.APPLICATIONS' | translate" [ctaLabel]="'FORM.CREATE-NEW-APPLICATION' | translate"
[ctaRouterLink]="'new-application'" (updatePageLimit)="updatePageLimit($event)">
[ctaRouterLink]="'new-application'">
</app-top-bar>
<div class="container-fluid">
<div class="row">
<div class="col-12">
<div class="jumbotron--table">
<!-- <app-applications-table [organizationId]="organizationId">
</app-applications-table> -->
<app-applications-table [organizationId]="organizationId"></app-applications-table>
<div class="container-fluid d-flex flex-column">
<ng-container *ngIf="!isLoadingResults">
<ng-container *ngIf="hasSomePermission" ; else noPermissions>
<div class="row">
<div class="col-12">
<div class="jumbotron--table">
<app-applications-table [organizationId]="organizationId"></app-applications-table>
</div>
</div>
</div>
</div>
</div>
</div>
</ng-container>
</ng-container>
<mat-spinner ngClass="align-self-center" *ngIf="isLoadingResults" ></mat-spinner>
</div>
115 changes: 101 additions & 14 deletions src/app/applications/applications-list/applications-list.component.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
import {
Component,
OnInit,
Input,
} from '@angular/core';
import { Component, Input, OnInit } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
import { Title } from '@angular/platform-browser';
import { ActivatedRoute, Router } from '@angular/router';
import { UserMinimalService } from '@app/admin/users/user-minimal.service';
import { NavbarComponent } from '@app/navbar/navbar.component';
import { Application } from '@applications/application.model';
import { AuthService } from '@auth/auth.service';
import { environment } from '@environments/environment';
import { TranslateService } from '@ngx-translate/core';
import { WelcomeDialogComponent } from '@shared/components/welcome-dialog/welcome-dialog.component';
import { SharedVariableService } from '@shared/shared-variable/shared-variable.service';
import { WelcomeDialogModel } from '@shared/models/dialog.model';

@Component({
providers: [NavbarComponent],
Expand All @@ -17,31 +19,116 @@ import { SharedVariableService } from '@shared/shared-variable/shared-variable.s
styleUrls: ['./applications-list.component.scss'],
})
export class ApplicationsListComponent implements OnInit {
isLoadingResults = false;
isLoadingResults = true;

public pageLimit = environment.tablePageSize;
public resultsLength: number;
public pageOffset = 0;
public applications: Application[];
@Input() organizationId: number;
private unauthorizedMessage: string;
private kombitError: string;
private noAccess: string;
hasSomePermission: boolean;
isGlobalAdmin = false;

constructor(
public translate: TranslateService,
private titleService: Title,
private globalService: SharedVariableService
private sharedVariableService: SharedVariableService,
private authService: AuthService,
private route: ActivatedRoute,
private router: Router,
private dialog: MatDialog,
private userMinimalService: UserMinimalService
) {
translate.use('da');
}

ngOnInit(): void {
this.translate.get(['TITLE.APPLICATION'])
.subscribe(translations => {
this.titleService.setTitle(translations['TITLE.APPLICATION']);
});
this.organizationId = this.globalService.getSelectedOrganisationId();
this.translate.get(['TITLE.APPLICATION']).subscribe((translations) => {
this.titleService.setTitle(translations['TITLE.APPLICATION']);
});
this.organizationId = this.sharedVariableService.getSelectedOrganisationId();

// Authenticate user
this.verifyUserAndInit();
}

updatePageLimit(limit: any) {
console.log(limit);
verifyUserAndInit() {
this.route.queryParams.subscribe(async (params) => {
await this.translate
.get([
'WELCOME-DIALOG.NO-JOB-ACCESS',
'TITLE.FRONTPAGE',
'WELCOME-DIALOG.KOMBIT-LOGIN-ERROR',
'WELCOME-DIALOG.USER-INACTIVE',
])
.toPromise()
.then((translations) => {
this.unauthorizedMessage = translations['WELCOME-DIALOG.NO-JOB-ACCESS'];
this.kombitError = translations['WELCOME-DIALOG.KOMBIT-LOGIN-ERROR'];
this.noAccess = translations['WELCOME-DIALOG.USER-INACTIVE'];
this.titleService.setTitle(translations['TITLE.FRONTPAGE']);
});
// this is used when a user is returned from Kombit login
const jwt = params['jwt'];
if (jwt) {
this.authService.setSession(jwt);
// Clear the URL from the parameter
this.router.navigate(['/applications']);
} else {
const error = params['error'];
if (error) {
if (
error === 'MESSAGE.KOMBIT-LOGIN-FAILED' ||
error === 'MESSAGE.API-KEY-AUTH-FAILED'
) {
this.router.navigate(['/not-authorized'], {
state: { message: this.kombitError, code: 401 },
});
} else if (error === 'MESSAGE.USER-INACTIVE') {
this.router.navigate(['/not-authorized'], {
state: { message: this.noAccess, code: 401 },
});
} else {
this.router.navigate(['/not-authorized'], {
state: { message: this.unauthorizedMessage, code: 401 },
});
}
}
}

const userInfo = await this.sharedVariableService.setUserInfo();
this.isGlobalAdmin = this.sharedVariableService.isGlobalAdmin();
const hasSeenWelcomeScreen = this.userMinimalService.getHasSeenWelcomeScreen();
this.hasSomePermission = this.sharedVariableService.getHasAnyPermission();

if (
!this.hasSomePermission ||
(!this.isGlobalAdmin &&
!hasSeenWelcomeScreen &&
userInfo?.user?.showWelcomeScreen)
) {
this.userMinimalService.setHasSeenWelcomeScreen();

this.dialog.open(WelcomeDialogComponent, {
disableClose: true,
closeOnNavigation: true,
panelClass: 'welcome-screen',
maxWidth: '60vw',
data: {
hasSomePermission: this.hasSomePermission,
} as WelcomeDialogModel
});
}

if (this.hasSomePermission) {
await this.sharedVariableService.setOrganizationInfo();
this.userMinimalService.setUserMinimalList();
}

this.isLoadingResults = false;
});
}
}
4 changes: 2 additions & 2 deletions src/app/auth/auth.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export class AuthComponent implements OnInit {
ngOnInit(): void {}

getKombitLoginUrl() {
const frontpage = encodeURI(window.location.origin + '/dashboard');
const frontpage = encodeURI(window.location.origin + '/applications');
return `${environment.baseUrl}auth/kombit/login?redirect=${frontpage}`;
}

Expand All @@ -49,7 +49,7 @@ export class AuthComponent implements OnInit {
this.userMinimalService.setUserMinimalList();
this.isLoading = false;
this.loggedinService.emitChange(true);
this.router.navigateByUrl('/dashboard');
this.router.navigateByUrl('/applications');
}

fail() {
Expand Down
73 changes: 0 additions & 73 deletions src/app/dashboard/dashboard.component.html

This file was deleted.

Loading