MainView refactor

This commit is contained in:
Michał Zieliński
2023-08-22 18:32:17 +02:00
parent ed5eed101e
commit f4978009b5
25 changed files with 193 additions and 169 deletions

View File

@@ -19,7 +19,7 @@
"error", "error",
{ {
"type": "attribute", "type": "attribute",
"prefix": "app", "prefix": "diunabi",
"style": "camelCase" "style": "camelCase"
} }
], ],
@@ -27,7 +27,7 @@
"error", "error",
{ {
"type": "element", "type": "element",
"prefix": "app", "prefix": "diunabi",
"style": "kebab-case" "style": "kebab-case"
} }
] ]

View File

@@ -12,7 +12,7 @@
}, },
"root": "", "root": "",
"sourceRoot": "src", "sourceRoot": "src",
"prefix": "app", "prefix": "ipms",
"architect": { "architect": {
"build": { "build": {
"builder": "@angular-devkit/build-angular:browser", "builder": "@angular-devkit/build-angular:browser",

View File

@@ -3,7 +3,7 @@
"index": "/index.html", "index": "/index.html",
"assetGroups": [ "assetGroups": [
{ {
"name": "app", "name": "diunabi",
"installMode": "prefetch", "installMode": "prefetch",
"resources": { "resources": {
"files": [ "files": [

View File

@@ -6,7 +6,7 @@ import { NotificationsService } from './services/notifications.service';
import { filter } from 'rxjs'; import { filter } from 'rxjs';
@Component({ @Component({
selector: 'app-root', selector: 'diunabi-root',
templateUrl: './app.component.html', templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'], styleUrls: ['./app.component.scss'],
standalone: true, standalone: true,

View File

@@ -1,12 +1,12 @@
import { Route } from '@angular/router'; import { Route } from '@angular/router';
import { AuthGuard } from './auth/auth.guard'; import { AuthGuard } from './auth/auth.guard';
import { LoginPageComponent } from './components/login-page/login-page.component'; import { LoginViewComponent } from './views/login/login-view.component';
import { MainViewComponent } from './main-view/main-view.component'; import { MainViewComponent } from './views/main/main-view.component';
export const APP_ROUTES: Route[] = [ export const APP_ROUTES: Route[] = [
{ {
path: '', path: '',
component: LoginPageComponent, component: LoginViewComponent,
}, },
{ {
path: 'app', path: 'app',

View File

@@ -0,0 +1,10 @@
<mat-nav-list>
<a mat-list-item routerLink="/app/" routerLinkActive="active" [routerLinkActiveOptions]="{exact : true}">
<mat-icon>dashboard</mat-icon>
Dashboard
</a>
<a mat-list-item routerLink="/app/layers" routerLinkActive="active" [routerLinkActiveOptions]="{exact : true}">
<mat-icon>table</mat-icon>
Layers
</a>
</mat-nav-list>

View File

@@ -0,0 +1,17 @@
import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { MatSidenavModule } from '@angular/material/sidenav';
import { MatIconModule } from '@angular/material/icon';
import { MatListModule } from '@angular/material/list';
import { RouterLink, RouterLinkActive } from '@angular/router';
@Component({
selector: 'diunabi-main-menu',
standalone: true,
imports: [CommonModule, MatSidenavModule, MatIconModule, MatListModule, RouterLink, RouterLinkActive],
templateUrl: './main-menu.component.html',
styleUrls: ['./main-menu.component.scss']
})
export class MainMenuComponent {
}

View File

@@ -4,7 +4,7 @@ import { MatCardModule } from '@angular/material/card';
import { NgFor, NgIf } from '@angular/common'; import { NgFor, NgIf } from '@angular/common';
@Component({ @Component({
selector: 'app-notifications', selector: 'diunabi-notifications',
templateUrl: './notifications.component.html', templateUrl: './notifications.component.html',
styleUrls: ['./notifications.component.scss'], styleUrls: ['./notifications.component.scss'],
standalone: true, standalone: true,

View File

@@ -1,49 +0,0 @@
<div class="loading-container" *ngIf="loading">
<img class="loading-img" src="../../assets/loader.gif" />
</div>
<div class="flip-container" *ngIf="device$.flipPhone">
<div class="flip-msg">
Flip the device.<br>
<mat-icon>screen_rotation</mat-icon>
</div>
</div>
<div class="main-container">
<mat-toolbar color="primary">
<button mat-icon-button (click)="snav.toggle()">
<mat-icon>menu</mat-icon>
</button>
<h1 class="topbar-app-name">{{environment.appName}}</h1>
<span class="fill-to-right"></span>
<span class="topbar-user-name" *ngIf="auth$.user">
<img *ngIf="auth$.user.avatar" src="{{auth$.user.avatar}}" class="avatar">
{{auth$.user.userName}}
</span>
<button mat-icon-button (click)="logout()">
<mat-icon>exit_to_app</mat-icon>
</button>
</mat-toolbar>
<mat-sidenav-container class="sidenav-container">
<mat-sidenav #snav fixedTopGap="56" mode="side" opened="true">
<mat-nav-list>
<a mat-list-item routerLink=".">
<mat-icon class="menu-icon">dashboard</mat-icon>
Dashboard
</a>
<a mat-list-item routerLink="./layers">
<mat-icon class="menu-icon">table</mat-icon>
Layers
</a>
<mat-divider></mat-divider>
<a mat-list-item>
{{appVersion}}
</a>
</mat-nav-list>
<small>
&nbsp;&copy;&nbsp;DiunaBI {{currentDate | date: 'yyyy'}}
</small>
</mat-sidenav>
<mat-sidenav-content>
<router-outlet></router-outlet>
</mat-sidenav-content>
</mat-sidenav-container>
</div>

View File

@@ -1,84 +0,0 @@
.main-container {
display: flex;
flex-direction: column;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
}
.sidenav-container {
flex: 1;
}
mat-icon.menu-icon {
margin-right: 3px;
color: gray;
}
mat-nav-list.menu-sublist {
padding-left: 10px;
}
mat-nav-list.menu-sublist > a {
font-size: small;
}
.fill-to-right {
flex: 1 1 auto;
}
span.topbar-user-name {
font-size: small;
}
h1.topbar-app-name {
margin-bottom: 0px;
}
mat-sidenav {
width: 200px;
}
input[disabled] {
color: black;
-webkit-text-fill-color: black;
opacity: 1; /* required on iOS */
}
textarea[disabled] {
color: black;
-webkit-text-fill-color: black;
opacity: 1; /* required on iOS */
}
.loading-container {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
background-color: rgba(100, 100, 100, 0.3);
z-index: 1400;
}
.loading-img {
position: absolute;
margin: auto;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
.flip-container {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
background-color: rgba(100, 100, 100, 0.95);
z-index: 1500;
}
.flip-msg {
margin: auto;
text-align: center;
padding-top: 45vh;
color: rgb(205, 206, 177);
font-size: larger;
}
/* links */
a:link,
a:visited {
color: black;
}

View File

@@ -3,7 +3,7 @@ import { DeviceService } from 'src/app/services/device.service';
@Component({ @Component({
selector: 'app-board', selector: 'diunabi-board',
templateUrl: './board.component.html', templateUrl: './board.component.html',
styleUrls: ['./board.component.scss'], styleUrls: ['./board.component.scss'],
standalone: true standalone: true

View File

@@ -1 +0,0 @@
@import "../../../main-view/main-view.component.scss";

View File

@@ -17,7 +17,7 @@ import { MatToolbarModule } from '@angular/material/toolbar';
import { MatCardModule } from '@angular/material/card'; import { MatCardModule } from '@angular/material/card';
@Component({ @Component({
selector: 'app-layer-detail', selector: 'diunabi-layer-detail',
templateUrl: './layer-detail.component.html', templateUrl: './layer-detail.component.html',
styleUrls: ['./layer-detail.component.scss'], styleUrls: ['./layer-detail.component.scss'],
standalone: true, standalone: true,

View File

@@ -1,5 +1,3 @@
@import "../../../main-view/main-view.component.scss";
.file-input { .file-input {
display: none; display: none;
} }

View File

@@ -22,7 +22,7 @@ import { MatToolbarModule } from '@angular/material/toolbar';
import { MatCardModule } from '@angular/material/card'; import { MatCardModule } from '@angular/material/card';
@Component({ @Component({
selector: 'app-layer-edit', selector: 'diunabi-layer-edit',
templateUrl: './layer-edit.component.html', templateUrl: './layer-edit.component.html',
styleUrls: ['./layer-edit.component.scss'], styleUrls: ['./layer-edit.component.scss'],
standalone: true, standalone: true,

View File

@@ -1 +0,0 @@
@import "../../../main-view/main-view.component.scss";

View File

@@ -15,7 +15,7 @@ import { MatIconModule } from '@angular/material/icon';
import { NgFor } from '@angular/common'; import { NgFor } from '@angular/common';
@Component({ @Component({
selector: 'app-layers-list', selector: 'diunabi-layers-list',
templateUrl: './layers-list.component.html', templateUrl: './layers-list.component.html',
styleUrls: ['./layers-list.component.scss'], styleUrls: ['./layers-list.component.scss'],
standalone: true, standalone: true,

View File

@@ -4,17 +4,20 @@
background-size: cover; background-size: cover;
padding-top: 30vh; padding-top: 30vh;
} }
.container { .container {
width: fit-content; width: fit-content;
display: block; display: block;
margin: auto; margin: auto;
} }
.form { .form {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
} }
.logo { .logo {
background-image: url('../../../assets/logo.png'); background-image: url('../../../assets/logo.png');
background-size: cover; background-size: cover;
@@ -24,16 +27,20 @@
width: 250px; width: 250px;
height: 250px; height: 250px;
opacity: 0.6; opacity: 0.6;
} }
mat-form-field { mat-form-field {
width: 100%; width: 100%;
} }
.user { .user {
text-align: right; text-align: right;
} }
.load { .load {
text-align: center; text-align: center;
} }
.loading-container { .loading-container {
position: absolute; position: absolute;
left: 0; left: 0;
@@ -42,20 +49,23 @@ mat-form-field {
bottom: 0; bottom: 0;
background-color: rgba(100, 100, 100, 0.3); background-color: rgba(100, 100, 100, 0.3);
z-index: 1400; z-index: 1400;
} }
.loading-img {
.loading-img {
position: absolute; position: absolute;
margin: auto; margin: auto;
top: 0; top: 0;
left: 0; left: 0;
right: 0; right: 0;
bottom: 0; bottom: 0;
} }
/* for mobile */ /* for mobile */
@media screen and (max-width: 700px) { @media screen and (max-width: 700px) {
.container { .container {
width: 90%; width: 90%;
} }
.logo { .logo {
width: 150px; width: 150px;
height: 150px; height: 150px;

View File

@@ -10,14 +10,14 @@ import { NgIf } from '@angular/common';
import { MatBottomSheetModule } from '@angular/material/bottom-sheet'; import { MatBottomSheetModule } from '@angular/material/bottom-sheet';
@Component({ @Component({
selector: 'app-login-page', selector: 'diunabi-view-page',
templateUrl: './login-page.component.html', templateUrl: './login-view.component.html',
styleUrls: ['./login-page.component.scss'], styleUrls: ['./login-view.component.scss'],
standalone: true, standalone: true,
imports: [NgIf, MatCardModule, MatBottomSheetModule] imports: [NgIf, MatCardModule, MatBottomSheetModule]
}) })
export class LoginPageComponent implements OnInit { export class LoginViewComponent implements OnInit {
constructor( constructor(
private router$: Router, private router$: Router,
private auth$: AuthService, private auth$: AuthService,

View File

@@ -0,0 +1,45 @@
<div class="loading-container" *ngIf="loading">
<img class="loading-img" src="../../assets/loader.gif" />
</div>
<div class="flip-container" *ngIf="device$.flipPhone">
<div class="flip-msg">
Flip the device.<br>
<mat-icon>screen_rotation</mat-icon>
</div>
</div>
<mat-drawer-container fullscreen>
<mat-drawer #drawer mode="side" opened>
<diunabi-main-menu></diunabi-main-menu>
<mat-divider></mat-divider>
<small>
&nbsp;&copy;&nbsp;DiunaBI {{currentDate | date: 'yyyy'}}
</small>
</mat-drawer>
<mat-toolbar class="toolbar" color="primary">
<button mat-icon-button aria-label="Menu" (click)="drawer.toggle()">
<mat-icon>menu</mat-icon>
</button>
{{environment.appName}}
<span style="font-size: x-small;">&nbsp;{{appVersion}}</span>
<div class="fill-space"></div>
<a mat-icon-button [matMenuTriggerFor]="userMenu">
<mat-icon *ngIf="!auth$.user.avatar">account_circle</mat-icon>
<img *ngIf="auth$.user.avatar" [src]="auth$.user.avatar" class="profile-photo-small"
alt="Profile photo">
</a>
<mat-menu #userMenu="matMenu">
<div class="profile-info">
<img [src]="auth$.user.avatar" class="profile-photo-big" alt="Profile photo">
<p>{{auth$.user.userName}}</p>
</div>
<button mat-menu-item (click)="logout()">
<mat-icon>exit_to_app</mat-icon>
<span>Logout</span>
</button>
</mat-menu>
</mat-toolbar>
<div class="app-content">
<router-outlet></router-outlet>
</div>
</mat-drawer-container>

View File

@@ -0,0 +1,77 @@
.loading-container {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
background-color: rgba(100, 100, 100, 0.3);
z-index: 1400;
}
.loading-img {
position: absolute;
margin: auto;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
.flip-container {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
background-color: rgba(100, 100, 100, 0.95);
z-index: 1500;
}
.flip-msg {
margin: auto;
text-align: center;
padding-top: 45vh;
color: rgb(205, 206, 177);
font-size: larger;
}
.fill-space {
flex: 1;
}
.fill-to-right {
flex: 1 1 auto;
}
.logo {
height: 4vh;
margin: 5px;
}
.sidenav-content {
flex-direction: column;
}
.mat-toolbar.mat-primary {
color: white;
}
.app-content {
flex: 1;
margin: 0 auto;
padding: 2em;
}
.profile-photo-small {
border-radius: 50%;
}
.profile-photo-big {
width: 100px;
border-radius: 50%;
}
.profile-info {
margin: 10px;
text-align: center;
}

View File

@@ -1,27 +1,29 @@
import { Component, NgZone, ViewChild } from '@angular/core'; import { Component, NgZone, ViewChild } from '@angular/core';
import { MatSidenav, MatSidenavModule } from '@angular/material/sidenav'; import { MatSidenav, MatSidenavModule } from '@angular/material/sidenav';
import { NavigationStart, Router, RouterLink, RouterOutlet } from '@angular/router'; import { NavigationStart, Router, RouterLink, RouterOutlet } from '@angular/router';
import { MatMenuModule } from '@angular/material/menu';
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 { delay } from 'rxjs';
import { environment } from 'src/environments/environment'; import { environment } from 'src/environments/environment';
import { AuthService } from '../auth/auth.service'; import { AuthService } from '../../auth/auth.service';
import { DataService } from '../services/data.service'; import { DataService } from '../../services/data.service';
import { DeviceService } from '../services/device.service'; import { DeviceService } from '../../services/device.service';
import { MatDividerModule } from '@angular/material/divider'; import { MatDividerModule } from '@angular/material/divider';
import { MatListModule } from '@angular/material/list'; import { MatListModule } from '@angular/material/list';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { MatToolbarModule } from '@angular/material/toolbar'; import { MatToolbarModule } from '@angular/material/toolbar';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { NgIf, DatePipe } from '@angular/common'; import { NgIf, DatePipe } from '@angular/common';
import { MainMenuComponent } from 'src/app/components/main-menu/main-menu.component';
@Component({ @Component({
selector: 'app-main-view', selector: 'diunabi-main-view',
templateUrl: './main-view.component.html', templateUrl: './main-view.component.html',
styleUrls: ['./main-view.component.scss'], styleUrls: ['./main-view.component.scss'],
standalone: true, standalone: true,
imports: [NgIf, MatIconModule, MatToolbarModule, MatButtonModule, MatSidenavModule, imports: [NgIf, MatIconModule, MatToolbarModule, MatButtonModule, MatSidenavModule,
MatListModule, RouterLink, MatDividerModule, RouterOutlet, DatePipe] MatListModule, RouterLink, MatDividerModule, RouterOutlet, DatePipe, MatMenuModule, MainMenuComponent]
}) })
export class MainViewComponent { export class MainViewComponent {
@ViewChild('snav') snav?: MatSidenav; @ViewChild('snav') snav?: MatSidenav;

View File

@@ -15,7 +15,7 @@
<link rel="apple-touch-icon" sizes="180x180" href="assets/icons/icon-192x192.png"> <link rel="apple-touch-icon" sizes="180x180" href="assets/icons/icon-192x192.png">
</head> </head>
<body class="mat-typography"> <body class="mat-typography">
<app-root></app-root> <diunabi-root></diunabi-root>
<noscript>Please enable JavaScript to continue using this application.</noscript> <noscript>Please enable JavaScript to continue using this application.</noscript>
</body> </body>
</html> </html>