Main view improvements
This commit is contained in:
@@ -12,7 +12,13 @@ const routes: Routes = [
|
|||||||
{
|
{
|
||||||
path: 'app',
|
path: 'app',
|
||||||
component: MainViewComponent,
|
component: MainViewComponent,
|
||||||
canActivate: [AuthGuard]
|
canActivate: [AuthGuard],
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: '',
|
||||||
|
loadChildren: () => import('./modules/dashboard/dashboard.module').then(m => m.DashboardModule)
|
||||||
|
},
|
||||||
|
]
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -7,8 +7,9 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
|||||||
import { MainViewComponent } from './main-view/main-view.component';
|
import { MainViewComponent } from './main-view/main-view.component';
|
||||||
import { MaterialModule } from './material.module';
|
import { MaterialModule } from './material.module';
|
||||||
import { LoginPageComponent } from './components/login-page/login-page.component';
|
import { LoginPageComponent } from './components/login-page/login-page.component';
|
||||||
import { HttpClientModule } from '@angular/common/http';
|
import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
|
||||||
import { ServiceWorkerModule } from '@angular/service-worker';
|
import { ServiceWorkerModule } from '@angular/service-worker';
|
||||||
|
import { LoaderInterceptor } from './interceptors/loader.interceptor';
|
||||||
|
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
@@ -30,7 +31,13 @@ import { ServiceWorkerModule } from '@angular/service-worker';
|
|||||||
registrationStrategy: 'registerWhenStable:30000'
|
registrationStrategy: 'registerWhenStable:30000'
|
||||||
})
|
})
|
||||||
],
|
],
|
||||||
providers: [],
|
providers: [
|
||||||
|
{
|
||||||
|
provide: HTTP_INTERCEPTORS,
|
||||||
|
useClass: LoaderInterceptor,
|
||||||
|
multi: true
|
||||||
|
},
|
||||||
|
],
|
||||||
bootstrap: [AppComponent]
|
bootstrap: [AppComponent]
|
||||||
})
|
})
|
||||||
export class AppModule { }
|
export class AppModule { }
|
||||||
|
|||||||
@@ -39,4 +39,8 @@ mat-form-field {
|
|||||||
.container {
|
.container {
|
||||||
width: 90%;
|
width: 90%;
|
||||||
}
|
}
|
||||||
|
.logo {
|
||||||
|
width: 150px;
|
||||||
|
height: 150px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, NgZone, OnInit } from '@angular/core';
|
||||||
import { Router } from '@angular/router';
|
import { Router } from '@angular/router';
|
||||||
import jwt_decode from "jwt-decode";
|
import jwt_decode from "jwt-decode";
|
||||||
import { AuthService } from 'src/app/auth/auth.service';
|
import { AuthService } from 'src/app/auth/auth.service';
|
||||||
@@ -16,7 +16,8 @@ export class LoginPageComponent implements OnInit {
|
|||||||
constructor(
|
constructor(
|
||||||
private data$: DataService,
|
private data$: DataService,
|
||||||
private router$: Router,
|
private router$: Router,
|
||||||
private auth$: AuthService
|
private auth$: AuthService,
|
||||||
|
private ngZone$: NgZone
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
ngOnInit(): void {
|
ngOnInit(): void {
|
||||||
@@ -51,10 +52,12 @@ export class LoginPageComponent implements OnInit {
|
|||||||
avatar: responsePayload.picture
|
avatar: responsePayload.picture
|
||||||
});
|
});
|
||||||
// this.auth$.loadDbUser();
|
// this.auth$.loadDbUser();
|
||||||
this.router$.navigate(['/app']);
|
|
||||||
console.log("USer", this.data$.currentUser);
|
console.log("USer", this.data$.currentUser);
|
||||||
await this.auth$.getAPIToken(response.credential);
|
await this.auth$.getAPIToken(response.credential);
|
||||||
this.auth$.loadDbUser();
|
// this.auth$.loadDbUser();
|
||||||
|
this.ngZone$.run(() => {
|
||||||
|
this.router$.navigate(['/app']);
|
||||||
|
});
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('Get user error', e);
|
console.error('Get user error', e);
|
||||||
}
|
}
|
||||||
|
|||||||
42
Frontend/src/app/interceptors/loader.interceptor.ts
Normal file
42
Frontend/src/app/interceptors/loader.interceptor.ts
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
import { Injectable } from '@angular/core';
|
||||||
|
import {
|
||||||
|
HttpRequest,
|
||||||
|
HttpHandler,
|
||||||
|
HttpEvent,
|
||||||
|
HttpInterceptor
|
||||||
|
} from '@angular/common/http';
|
||||||
|
import { finalize, Observable } from 'rxjs';
|
||||||
|
import { DataService } from '../services/data.service';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class LoaderInterceptor implements HttpInterceptor {
|
||||||
|
|
||||||
|
private tasks: number = 0;
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
private _data: DataService
|
||||||
|
) { }
|
||||||
|
|
||||||
|
intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {
|
||||||
|
this.addTask();
|
||||||
|
return next.handle(request).pipe(
|
||||||
|
finalize(() => {
|
||||||
|
this.removeTask();
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
addTask() {
|
||||||
|
this.tasks++;
|
||||||
|
if (this.tasks === 1) {
|
||||||
|
this._data.showLoader.next(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
removeTask() {
|
||||||
|
this.tasks--;
|
||||||
|
if (this.tasks === 0) {
|
||||||
|
this._data.showLoader.next(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,18 +1,18 @@
|
|||||||
<div class="loading-container" *ngIf="loading">
|
<div class="loading-container" *ngIf="loading">
|
||||||
<img class="loading-img" src="../../assets/loader.gif" />
|
<img class="loading-img" src="../../assets/loader.gif" />
|
||||||
</div>
|
</div>
|
||||||
<div class="flip-container" *ngIf="device$.flipPhone">
|
<div class="flip-container" *ngIf="device$.flipPhone">
|
||||||
<div class="flip-msg">
|
<div class="flip-msg">
|
||||||
Obróć telefon.<br>
|
Obróć telefon.<br>
|
||||||
<mat-icon>screen_rotation</mat-icon>
|
<mat-icon>screen_rotation</mat-icon>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="main-container">
|
<div class="main-container">
|
||||||
<mat-toolbar color="primary">
|
<mat-toolbar color="primary">
|
||||||
<button mat-icon-button (click)="snav.toggle()">
|
<button mat-icon-button (click)="snav.toggle()">
|
||||||
<mat-icon>menu</mat-icon>
|
<mat-icon>menu</mat-icon>
|
||||||
</button>
|
</button>
|
||||||
<h1>Diuna</h1>
|
<h1 class="topbar-app-name">Diuna</h1>
|
||||||
<span class="fill-to-right"></span>
|
<span class="fill-to-right"></span>
|
||||||
<span class="topbar-user-name" *ngIf="data$.currentUser">
|
<span class="topbar-user-name" *ngIf="data$.currentUser">
|
||||||
<img *ngIf="data$.currentUser.avatar" src="{{data$.currentUser.avatar}}" class="avatar">
|
<img *ngIf="data$.currentUser.avatar" src="{{data$.currentUser.avatar}}" class="avatar">
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ span.topbar-user-name {
|
|||||||
font-size: small;
|
font-size: small;
|
||||||
}
|
}
|
||||||
h1.topbar-app-name {
|
h1.topbar-app-name {
|
||||||
margin-left: 8px;
|
margin-bottom: 0px;
|
||||||
}
|
}
|
||||||
mat-sidenav {
|
mat-sidenav {
|
||||||
width: 200px;
|
width: 200px;
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
import { Component, ViewChild } from '@angular/core';
|
import { Component, ViewChild } from '@angular/core';
|
||||||
import { MatSidenav } from '@angular/material/sidenav';
|
import { MatSidenav } from '@angular/material/sidenav';
|
||||||
import { Router } from '@angular/router';
|
import { NavigationStart, Router } from '@angular/router';
|
||||||
|
import { SwUpdate } from '@angular/service-worker';
|
||||||
import * as moment from 'moment';
|
import * as moment from 'moment';
|
||||||
import packageInfo from 'package.json';
|
import packageInfo from 'package.json';
|
||||||
|
import { delay } from 'rxjs';
|
||||||
import { DataService } from '../services/data.service';
|
import { DataService } from '../services/data.service';
|
||||||
import { DeviceService } from '../services/device.service';
|
import { DeviceService } from '../services/device.service';
|
||||||
|
|
||||||
@@ -15,9 +17,6 @@ export class MainViewComponent {
|
|||||||
@ViewChild('snav') snav?: MatSidenav;
|
@ViewChild('snav') snav?: MatSidenav;
|
||||||
appVersion = packageInfo.version;
|
appVersion = packageInfo.version;
|
||||||
|
|
||||||
submenus = {
|
|
||||||
administration: false,
|
|
||||||
};
|
|
||||||
currentDate = moment().toDate();
|
currentDate = moment().toDate();
|
||||||
flipPhone: boolean = false;
|
flipPhone: boolean = false;
|
||||||
loading: boolean = false;
|
loading: boolean = false;
|
||||||
@@ -25,8 +24,23 @@ export class MainViewComponent {
|
|||||||
constructor(
|
constructor(
|
||||||
public data$: DataService,
|
public data$: DataService,
|
||||||
public device$: DeviceService,
|
public device$: DeviceService,
|
||||||
private router$: Router
|
private router$: Router,
|
||||||
) { }
|
private swUpdate$: SwUpdate,
|
||||||
|
) {
|
||||||
|
this.swUpdate$.versionUpdates.subscribe(() => {
|
||||||
|
this.reloadApp();
|
||||||
|
});
|
||||||
|
this.router$.events.subscribe((event) => {
|
||||||
|
if (event instanceof NavigationStart && device$.isMobile()) {
|
||||||
|
this.snav?.close();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
//listen to loading subject
|
||||||
|
data$.showLoader.pipe(delay(0)).subscribe(loading => {
|
||||||
|
this.loading = loading;
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
reloadApp() {
|
reloadApp() {
|
||||||
document.location.reload();
|
document.location.reload();
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
{{ _device.toString()}}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
|
import { BoardComponent } from './board.component';
|
||||||
|
|
||||||
|
describe('BoardComponent', () => {
|
||||||
|
let component: BoardComponent;
|
||||||
|
let fixture: ComponentFixture<BoardComponent>;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
await TestBed.configureTestingModule({
|
||||||
|
declarations: [ BoardComponent ]
|
||||||
|
})
|
||||||
|
.compileComponents();
|
||||||
|
});
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
fixture = TestBed.createComponent(BoardComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
19
Frontend/src/app/modules/dashboard/board/board.component.ts
Normal file
19
Frontend/src/app/modules/dashboard/board/board.component.ts
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import { HttpClient } from '@angular/common/http';
|
||||||
|
import { Component, OnInit } from '@angular/core';
|
||||||
|
import moment, { Moment } from 'moment';
|
||||||
|
import { DeviceService } from 'src/app/services/device.service';
|
||||||
|
import { environment } from 'src/environments/environment';
|
||||||
|
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'b-crm-board',
|
||||||
|
templateUrl: './board.component.html',
|
||||||
|
styleUrls: ['./board.component.scss']
|
||||||
|
})
|
||||||
|
export class BoardComponent {
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
public _device: DeviceService
|
||||||
|
) { }
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
import { NgModule } from '@angular/core';
|
||||||
|
import { RouterModule, Routes } from '@angular/router';
|
||||||
|
import { BoardComponent } from './board/board.component';
|
||||||
|
|
||||||
|
const routes: Routes = [
|
||||||
|
{
|
||||||
|
path: '',
|
||||||
|
component: BoardComponent
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
imports: [RouterModule.forChild(routes)],
|
||||||
|
exports: [RouterModule]
|
||||||
|
})
|
||||||
|
export class DashboardRoutingModule { }
|
||||||
17
Frontend/src/app/modules/dashboard/dashboard.module.ts
Normal file
17
Frontend/src/app/modules/dashboard/dashboard.module.ts
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
import { NgModule } from '@angular/core';
|
||||||
|
import { CommonModule } from '@angular/common';
|
||||||
|
|
||||||
|
import { DashboardRoutingModule } from './dashboard-routing.module';
|
||||||
|
import { BoardComponent } from './board/board.component';
|
||||||
|
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
declarations: [
|
||||||
|
BoardComponent
|
||||||
|
],
|
||||||
|
imports: [
|
||||||
|
CommonModule,
|
||||||
|
DashboardRoutingModule
|
||||||
|
]
|
||||||
|
})
|
||||||
|
export class DashboardModule { }
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 55 KiB |
@@ -5,7 +5,8 @@
|
|||||||
export const environment = {
|
export const environment = {
|
||||||
production: false,
|
production: false,
|
||||||
api: {
|
api: {
|
||||||
url: "http://localhost:5183/api"
|
//url: "http://localhost:5183/api"
|
||||||
|
url: "https://diuna.bim-it.pl/api"
|
||||||
},
|
},
|
||||||
google: {
|
google: {
|
||||||
clientId: "107631825312-bkfe438ehr9k9ecb2h76g802tj6advma.apps.googleusercontent.com"
|
clientId: "107631825312-bkfe438ehr9k9ecb2h76g802tj6advma.apps.googleusercontent.com"
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "Diuna",
|
"name": "Diuna",
|
||||||
"short_name": "Diuna",
|
"short_name": "Diuna",
|
||||||
"theme_color": "#1976d2",
|
"theme_color": "#FF9800",
|
||||||
"background_color": "#fafafa",
|
"background_color": "#fafafa",
|
||||||
"display": "standalone",
|
"display": "standalone",
|
||||||
"scope": "./",
|
"scope": "./",
|
||||||
"start_url": "./",
|
"start_url": "./",
|
||||||
|
"orientation": "landscape",
|
||||||
"icons": [
|
"icons": [
|
||||||
{
|
{
|
||||||
"src": "assets/icons/icon-72x72.png",
|
"src": "assets/icons/icon-72x72.png",
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
@include mat.core();
|
@include mat.core();
|
||||||
|
|
||||||
$my-app-primary: mat.define-palette(mat.$indigo-palette);
|
$my-app-primary: mat.define-palette(mat.$orange-palette);
|
||||||
$my-app-accent: mat.define-palette(mat.$pink-palette, A200, A100, A400);
|
$my-app-accent: mat.define-palette(mat.$pink-palette, A200, A100, A400);
|
||||||
$my-app-warn: mat.define-palette(mat.$red-palette);
|
$my-app-warn: mat.define-palette(mat.$red-palette);
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
},
|
},
|
||||||
"AllowedHosts": "*",
|
"AllowedHosts": "*",
|
||||||
"ConnectionStrings": {
|
"ConnectionStrings": {
|
||||||
"SQLDatabase": "Server=tcp:localhost,1433;Initial Catalog=diuna;Persist Security Info=False;User ID=SA;Password=v](8Lc|RfG;MultipleActiveResultSets=False;Encrypt=False;TrustServerCertificate=False;Connection Timeout=30;"
|
"SQLDatabase": "Server=tcp:127.0.0.1,1433;Initial Catalog=diuna;Persist Security Info=False;User ID=SA;Password=v](8Lc|RfG;MultipleActiveResultSets=False;Encrypt=False;TrustServerCertificate=False;Connection Timeout=30;"
|
||||||
},
|
},
|
||||||
"GoogleCLientId": "107631825312-bkfe438ehr9k9ecb2h76g802tj6advma.apps.googleusercontent.com",
|
"GoogleCLientId": "107631825312-bkfe438ehr9k9ecb2h76g802tj6advma.apps.googleusercontent.com",
|
||||||
"Secret": "8393AF8EAEF8478CB738D44858690F9C7E2D19F65896DD9FBAA3EB2A6F493E80",
|
"Secret": "8393AF8EAEF8478CB738D44858690F9C7E2D19F65896DD9FBAA3EB2A6F493E80",
|
||||||
|
|||||||
Reference in New Issue
Block a user