Adjust data and components.

This commit is contained in:
Peter
2023-10-05 13:18:57 +02:00
parent b32c5b165c
commit bba6229c2b
22 changed files with 184 additions and 87 deletions

View File

@@ -1,5 +1,5 @@
INSERT INTO meters (name) VALUES ('1LOG'); INSERT INTO meters (name) VALUES ('1LOG');
INSERT INTO meters (name) VALUES ('1HEM'); INSERT INTO meters (name) VALUES ('1EHM');
INSERT INTO meters (name) VALUES ('WATER'); INSERT INTO meters (name) VALUES ('WATER');
INSERT INTO meters (name) VALUES ('GARDEN'); INSERT INTO meters (name) VALUES ('GARDEN');

View File

@@ -1,3 +1,9 @@
<div class="app-wrapper">
<app-header></app-header> <app-header></app-header>
<router-outlet></router-outlet> <router-outlet></router-outlet>
<app-footer></app-footer>
</div>

View File

@@ -0,0 +1,6 @@
div.app-wrapper {
height: 100%;
display: flex;
flex-direction: column;
justify-content: space-between;
}

View File

@@ -3,7 +3,7 @@ import { Component } from '@angular/core';
@Component({ @Component({
selector: 'app-root', selector: 'app-root',
templateUrl: './app.component.html', templateUrl: './app.component.html',
styleUrls: ['./app.component.css'], styleUrls: ['./app.component.scss'],
}) })
export class AppComponent { export class AppComponent {
title = 'rossa-tech'; title = 'rossa-tech';

View File

@@ -34,6 +34,7 @@ import { MatDatepickerModule } from '@angular/material/datepicker';
import { MatNativeDateModule } from '@angular/material/core'; import { MatNativeDateModule } from '@angular/material/core';
import { MatSnackBarModule } from '@angular/material/snack-bar'; import { MatSnackBarModule } from '@angular/material/snack-bar';
import { HeaderComponent } from './components/header/header.component'; import { HeaderComponent } from './components/header/header.component';
import { FooterComponent } from './components/footer/footer.component';
// import { ChartComponent } from './components/subcomponents/chart/chart.component'; // import { ChartComponent } from './components/subcomponents/chart/chart.component';
// import { NgChartsModule } from 'ng2-charts'; // import { NgChartsModule } from 'ng2-charts';
@@ -73,6 +74,7 @@ import { HeaderComponent } from './components/header/header.component';
MatNativeDateModule, MatNativeDateModule,
MatSnackBarModule, MatSnackBarModule,
HeaderComponent, HeaderComponent,
FooterComponent,
// NgChartsModule, // NgChartsModule,
], ],
providers: [ providers: [

View File

@@ -1,29 +1,39 @@
<div class="content"> <div class="content-wrapper">
<div class="content-header"> <div class="content-header">
<button mat-raised-button color="primary" (click)="addMeterData()">Neuer Eintrag</button> <button mat-raised-button color="primary" (click)="addMeterData()">Neuer Eintrag</button>
</div> </div>
<mat-grid-list cols="2" rowHeight="300px"> <div class="content">
<mat-grid-tile> <div class="meter-list">
<app-meter-data-list class="full-width" [meterData]="meterDataService.getMeterDataByType(this.usageTypes.ENERGY)" <h2 class="headline">
MeterList
</h2>
<div class="divider">
<div style="margin-right: 15px">
<app-meter-data-list class="full-width"
[meterData]="meterDataService.getMeterDataByType(this.usageTypes.ENERGY)"
[type]="this.usageTypes.ENERGY"></app-meter-data-list> [type]="this.usageTypes.ENERGY"></app-meter-data-list>
</mat-grid-tile> </div>
<div style="margin-left: 15px;">
<mat-grid-tile> <app-meter-data-list class="full-width"
<!-- <app-meter-data-list class="full-width" [meterData]="preparedMeterData[1]"></app-meter-data-list> --> [meterData]="meterDataService.getMeterDataByType(this.usageTypes.WATER)"
<app-meter-data-list class="full-width" [meterData]="meterDataService.getMeterDataByType(this.usageTypes.WATER)"
[type]="this.usageTypes.WATER"></app-meter-data-list> [type]="this.usageTypes.WATER"></app-meter-data-list>
</mat-grid-tile> </div>
<!-- <mat-grid-tile> </div>
<app-meter-data-list class="full-width" [meterData]="preparedMeterData[2]"></app-meter-data-list> </div>
</mat-grid-tile> <div class="charts">
<mat-grid-tile> <h2 class="headline">
<app-meter-data-list class="full-width" [meterData]="preparedMeterData[3]"></app-meter-data-list> Charts
</mat-grid-tile> --> </h2>
<div class="divider">
<mat-grid-tile> <div style="margin-right: 15px">
<app-chart [meterData]="meterDataEnergy"></app-chart> <app-chart [meterData]="meterDataEnergy"></app-chart>
</mat-grid-tile> </div>
</mat-grid-list> <div style="margin-left: 15px;">
<app-chart [meterData]="meterDataWater"></app-chart>
</div>
</div>
</div> </div>
</div>
</div>

View File

@@ -16,6 +16,7 @@ import { MeterDataService } from 'src/app/core/services/meterData.service';
import { MeterDataAddDialogComponent } from 'src/app/dialogs/meter-data-add-dialog/meter-data-add-dialog.component'; import { MeterDataAddDialogComponent } from 'src/app/dialogs/meter-data-add-dialog/meter-data-add-dialog.component';
import { MeterDataListComponent } from '../subcomponents/meter-data-list/meter-data-list.component'; import { MeterDataListComponent } from '../subcomponents/meter-data-list/meter-data-list.component';
import { ChartComponent } from '../subcomponents/chart/chart.component'; import { ChartComponent } from '../subcomponents/chart/chart.component';
import { MatButtonModule } from '@angular/material/button';
@Component({ @Component({
selector: 'app-dashboard', selector: 'app-dashboard',
@@ -27,13 +28,14 @@ import { ChartComponent } from '../subcomponents/chart/chart.component';
MatGridListModule, MatGridListModule,
MeterDataListComponent, MeterDataListComponent,
ChartComponent, ChartComponent,
MatButtonModule,
], ],
}) })
export class DashboardComponent { export class DashboardComponent {
usageTypes = UsageType; usageTypes = UsageType;
preparedMeterData: PreparedMeterData[] = []; preparedMeterData: PreparedMeterData[] = [];
meterDataEnergy: PreparedMeterData[] = []; meterDataEnergy: PreparedMeterData[] = [];
// meterDataWater: MeterData[] = []; meterDataWater: PreparedMeterData[] = [];
displayedColumns: string[] = ['date', 'amount', 'meter']; displayedColumns: string[] = ['date', 'amount', 'meter'];
// injects // injects
@@ -61,6 +63,11 @@ export class DashboardComponent {
this.meterDataEnergy = data; this.meterDataEnergy = data;
}, },
}); });
this.meterDataService.waterMeterData.subscribe({
next: (data: PreparedMeterData[]) => {
this.meterDataWater = data;
},
});
this.meterDataService.preparedMeterData.subscribe({ this.meterDataService.preparedMeterData.subscribe({
next: (data: PreparedMeterData[]) => { next: (data: PreparedMeterData[]) => {
this.preparedMeterData = data; this.preparedMeterData = data;

View File

@@ -0,0 +1,8 @@
<div class="footer-wrapper" *ngIf="userLoggedIn">
<div class="version-web" *ngIf="versionWeb">
Web: v{{versionWeb}}
</div>
<div class="version-api" *ngIf="versionApi">
API: v{{versionApi}}
</div>
</div>

View File

@@ -0,0 +1,8 @@
div.footer-wrapper {
display: flex;
flex-direction: row;
height: 36px;
justify-content: flex-end;
padding-right: 16px;
align-items: center;
}

View File

@@ -0,0 +1,31 @@
import { Component, OnInit, inject } from '@angular/core';
import { CommonModule } from '@angular/common';
import { HttpErrorResponse } from '@angular/common/http';
import { LoaderService } from '../loader/loader.service';
import { environment } from 'src/environments/environment';
import { AuthService } from 'src/app/auth/auth.service';
@Component({
selector: 'app-footer',
templateUrl: './footer.component.html',
styleUrls: ['./footer.component.scss'],
standalone: true,
imports: [CommonModule],
})
export class FooterComponent implements OnInit {
versionWeb: number | undefined = environment.version;
versionApi: number | undefined;
userLoggedIn: Boolean = false;
//injects
private authService: AuthService = inject(AuthService);
// private loaderService: LoaderService = inject(LoaderService);
constructor() {}
ngOnInit(): void {
this.authService.isLoggedIn.subscribe((res) => {
this.userLoggedIn = res;
});
}
}

View File

@@ -1 +1 @@
export const METERS = ['1LOG', '1HEM', 'WATER', 'GARDEN']; export const METERS = ['1LOG', '1EHM', 'WATER', 'GARDEN'];

View File

@@ -1,22 +0,0 @@
export class Meter {
id: number;
name: '1LOG' | '1HEM' | 'WATER' | 'GARDEN';
type?: 'ENERGY' | 'WATER';
constructor(
id: number,
name?: '1LOG' | '1HEM' | 'WATER' | 'GARDEN',
type?: 'ENERGY' | 'WATER'
) {
this.id = id || 0;
this.name = name || '1LOG';
this.type = type || 'ENERGY';
}
}
export enum Meters {
'1LOG' = '1LOG',
'1HEM' = '1HEM',
'WATER' = 'WATER',
'GARDEN' = 'GARDEN',
}

View File

@@ -1,11 +1,11 @@
export class Meter { export class Meter {
id: number; id: number;
name: '1LOG' | '1HEM' | 'WATER' | 'GARDEN'; name: '1LOG' | '1EHM' | 'WATER' | 'GARDEN';
type?: 'ENERGY' | 'WATER'; type?: 'ENERGY' | 'WATER';
constructor( constructor(
id: number, id: number,
name?: '1LOG' | '1HEM' | 'WATER' | 'GARDEN', name?: '1LOG' | '1EHM' | 'WATER' | 'GARDEN',
type?: 'ENERGY' | 'WATER' type?: 'ENERGY' | 'WATER'
) { ) {
this.id = id || 0; this.id = id || 0;
@@ -16,7 +16,7 @@ export class Meter {
export enum Meters { export enum Meters {
'1LOG' = '1LOG', '1LOG' = '1LOG',
'1HEM' = '1HEM', '1EHM' = '1EHM',
'WATER' = 'WATER', 'WATER' = 'WATER',
'GARDEN' = 'GARDEN', 'GARDEN' = 'GARDEN',
} }

View File

@@ -7,8 +7,7 @@ import {
import { Observable, throwError } from 'rxjs'; import { Observable, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators'; import { catchError } from 'rxjs/operators';
import { environment } from 'src/environments/environment'; import { environment } from 'src/environments/environment';
import { MeterData } from '../dataModels/Meterdata'; import { Meter, MeterData } from '../dataModels/Meterdata';
import { Meter } from '../dataModels/Meter';
@Injectable({ @Injectable({
providedIn: 'root', providedIn: 'root',

View File

@@ -2,6 +2,7 @@ import { Injectable } from '@angular/core';
import { import {
MeterData, MeterData,
MeterDataForYear, MeterDataForYear,
Meters,
PreparedMeterData, PreparedMeterData,
} from '../dataModels/Meterdata'; } from '../dataModels/Meterdata';
import { UsageType } from '../dataModels/UsageType'; import { UsageType } from '../dataModels/UsageType';
@@ -13,7 +14,6 @@ import { Observable, of } from 'rxjs';
export class MeterDataService { export class MeterDataService {
public preparedMeterDataObject: PreparedMeterData[] = []; public preparedMeterDataObject: PreparedMeterData[] = [];
private meterDataObject: MeterData[] = new Array(); private meterDataObject: MeterData[] = new Array();
// public energyMeterDataObject: MeterData[] = [];
constructor() {} constructor() {}
@@ -21,18 +21,28 @@ export class MeterDataService {
this.meterDataObject = meterData; this.meterDataObject = meterData;
} }
// get meterData(): Observable<MeterData[]> {
// return
// }
get preparedMeterData(): Observable<PreparedMeterData[]> { get preparedMeterData(): Observable<PreparedMeterData[]> {
return of(this.preparedMeterDataObject); return of(this.preparedMeterDataObject);
} }
get energyMeterData(): Observable<PreparedMeterData[]> { get energyMeterData(): Observable<PreparedMeterData[]> {
// console.log(this.energyMeterDataObject); const energyMeters: PreparedMeterData[] =
return of(this.preparedMeterDataObject.slice(0, 2)); this.preparedMeterDataObject.filter(
// return of(this.energyMeterDataObject); (md: PreparedMeterData) =>
md.meter.name === Meters['1EHM'] || md.meter.name === Meters['1LOG']
);
console.log({ energyMeters });
return of(energyMeters);
}
get waterMeterData(): Observable<PreparedMeterData[]> {
const waterMeters: PreparedMeterData[] =
this.preparedMeterDataObject.filter(
(md: PreparedMeterData) =>
md.meter.name === Meters.GARDEN || md.meter.name === Meters.WATER
);
console.log({ waterMeters });
return of(waterMeters);
} }
getMeterAmoutforYear(meterName: string, year: number): number { getMeterAmoutforYear(meterName: string, year: number): number {

View File

@@ -7,12 +7,12 @@ import {
ReactiveFormsModule, ReactiveFormsModule,
Validators, Validators,
} from '@angular/forms'; } from '@angular/forms';
import { MatButtonModule } from '@angular/material/button';
import { MatDatepickerModule } from '@angular/material/datepicker'; import { MatDatepickerModule } from '@angular/material/datepicker';
import { MatDialogModule, MatDialogRef } from '@angular/material/dialog'; import { MatDialogModule, MatDialogRef } from '@angular/material/dialog';
import { MatInputModule } from '@angular/material/input'; import { MatInputModule } from '@angular/material/input';
import { MatSelectModule } from '@angular/material/select'; import { MatSelectModule } from '@angular/material/select';
import { Meter, Meters } from 'src/app/core/dataModels/Meter'; import { Meter, MeterData, Meters } from 'src/app/core/dataModels/Meterdata';
import { MeterData } from 'src/app/core/dataModels/Meterdata';
import { UsageType } from 'src/app/core/dataModels/UsageType'; import { UsageType } from 'src/app/core/dataModels/UsageType';
import { DatabaseService } from 'src/app/core/services/database.service'; import { DatabaseService } from 'src/app/core/services/database.service';
@@ -29,6 +29,7 @@ import { DatabaseService } from 'src/app/core/services/database.service';
FormsModule, FormsModule,
ReactiveFormsModule, ReactiveFormsModule,
CommonModule, CommonModule,
MatButtonModule,
], ],
}) })
export class MeterDataAddDialogComponent implements OnInit { export class MeterDataAddDialogComponent implements OnInit {
@@ -78,7 +79,7 @@ export class MeterDataAddDialogComponent implements OnInit {
} }
setUsageType(meterName: string): void { setUsageType(meterName: string): void {
if (meterName === Meters['1HEM'] || meterName === Meters['1LOG']) { if (meterName === Meters['1EHM'] || meterName === Meters['1LOG']) {
this.usageType = this.usageTypes.ENERGY; this.usageType = this.usageTypes.ENERGY;
} else if (meterName === Meters.GARDEN || meterName === Meters.WATER) { } else if (meterName === Meters.GARDEN || meterName === Meters.WATER) {
this.usageType = this.usageTypes.WATER; this.usageType = this.usageTypes.WATER;

View File

@@ -1,5 +1,6 @@
export const environment = { export const environment = {
production: true, production: true,
env: "prod", env: 'prod',
apiBaseUrl: "http://192.168.178.21:8182/api", apiBaseUrl: 'http://192.168.178.21:8182/api',
version: 0.2,
}; };

View File

@@ -6,6 +6,7 @@ export const environment = {
production: false, production: false,
env: 'local', env: 'local',
apiBaseUrl: 'http://localhost:8080', apiBaseUrl: 'http://localhost:8080',
version: 0.2,
// apiBaseUrl: 'http://192.168.178.21:8182/api', // apiBaseUrl: 'http://192.168.178.21:8182/api',
}; };

View File

@@ -71,7 +71,7 @@ button {
border-top: #a6a6a6 1px solid; border-top: #a6a6a6 1px solid;
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: end; justify-content: flex-end;
} }
} }
@@ -79,3 +79,35 @@ button {
.mat-mdc-table .mat-mdc-row { .mat-mdc-table .mat-mdc-row {
height: 42px; height: 42px;
} }
div.content-wrapper {
display: flex;
flex-direction: column;
width: 100%;
div.content {
min-height: 500px;
overflow: auto;
height: 100%;
padding: 16px;
div.meter-list,
div.charts {
display: flex;
flex-direction: column;
h2.headline {
font-size: 26px;
}
div.divider {
display: flex;
flex-direction: row;
div {
flex: 1;
}
}
}
}
}

View File

@@ -17,10 +17,7 @@
"importHelpers": true, "importHelpers": true,
"target": "ES2022", "target": "ES2022",
"module": "es2020", "module": "es2020",
"lib": [ "lib": ["es2020", "dom"],
"es2020",
"dom"
],
"useDefineForClassFields": false "useDefineForClassFields": false
}, },
"angularCompilerOptions": { "angularCompilerOptions": {