locationPower update REFACTOR

This commit is contained in:
Patrick Haßel 2025-11-21 11:54:06 +01:00
parent 9213c20116
commit f7c30d71d2
13 changed files with 185 additions and 187 deletions

View File

@ -20,16 +20,12 @@
</div> </div>
</div> </div>
@if (ws.connected) {
<div class="MainMenuDrawer NoUserSelect" [hidden]="!showDrawer"> <div class="MainMenuDrawer NoUserSelect" [hidden]="!showDrawer">
@for (location of locationList; track location.id) { @for (location of locationList; track location.id) {
@if (location.id !== locationService.id) { @if (location.id !== menuService.locationId) {
<div class="MainMenuItem" (click)="navigate(`Location/${location.id}`); showDrawer = false" routerLinkActive="MainMenuItemActive">{{ location.name }}</div> <div class="MainMenuItem" (click)="navigate(`Location/${location.id}`); showDrawer = false" routerLinkActive="MainMenuItemActive">{{ location.name }}</div>
} }
} }
</div> </div>
}
<router-outlet/> <router-outlet/>

View File

@ -1,4 +1,4 @@
import {Component, OnDestroy, OnInit} from '@angular/core'; import {Component, OnInit} from '@angular/core';
import {Router, RouterLink, RouterLinkActive, RouterOutlet} from '@angular/router'; import {Router, RouterLink, RouterLinkActive, RouterOutlet} from '@angular/router';
import {FaIconComponent} from '@fortawesome/angular-fontawesome'; import {FaIconComponent} from '@fortawesome/angular-fontawesome';
import {faBars, faGears} from '@fortawesome/free-solid-svg-icons'; import {faBars, faGears} from '@fortawesome/free-solid-svg-icons';
@ -14,7 +14,7 @@ import {faHome} from '@fortawesome/free-regular-svg-icons';
templateUrl: './app.html', templateUrl: './app.html',
styleUrl: './app.less' styleUrl: './app.less'
}) })
export class App implements OnInit, OnDestroy { export class App implements OnInit {
protected readonly faHome = faHome; protected readonly faHome = faHome;
@ -39,11 +39,6 @@ export class App implements OnInit, OnDestroy {
ngOnInit(): void { ngOnInit(): void {
this.locationService.findAll(list => this.locationList = list); this.locationService.findAll(list => this.locationList = list);
this.menuService.title = "Orte";
}
ngOnDestroy(): void {
this.menuService.title = "";
} }
navigate(url: string): void { navigate(url: string): void {

View File

@ -1,66 +1,26 @@
import {or, validateNumber, validateString} from '../common'; import {or, validateNumber, validateString} from '../common';
import {Series} from '../series/Series'; import {Series} from '../series/Series';
import {Value} from '../series/Value';
export class Location { export class Location {
powerSelf: Value = Value.NULL;
powerPurchasePercentConsume: Value = Value.NULL;
powerProducePercentConsume: Value = Value.NULL;
powerDeliveryPercentConsume: Value = Value.NULL;
powerDeliveryPercentProduce: Value = Value.NULL;
powerSelfPercentConsume: Value = Value.NULL;
powerSelfPercentProduce: Value = Value.NULL;
constructor( constructor(
readonly id: number, readonly id: number,
readonly name: string, readonly name: string,
readonly latitude: number, readonly latitude: number,
readonly longitude: number, readonly longitude: number,
private _energyPurchase: Series | null, readonly energyPurchase: Series | null,
private _energyDeliver: Series | null, readonly energyDeliver: Series | null,
private _energyProduce: Series | null, readonly energyProduce: Series | null,
private _powerPurchase: Series | null, readonly powerPurchase: Series | null,
private _powerDeliver: Series | null, readonly powerDeliver: Series | null,
private _powerProduce: Series | null, readonly powerProduce: Series | null,
private _outsideTemperature: Series | null, readonly outsideTemperature: Series | null,
private _outsideHumidityRelative: Series | null, readonly outsideHumidityRelative: Series | null,
private _outsideHumidityAbsolute: Series | null, readonly outsideHumidityAbsolute: Series | null,
private _powerConsume: Value = Value.NULL,
) { ) {
this.updateConsume(); //
} }
readonly updateSeries = (series: Series) => {
if (series.equals(this._energyPurchase)) {
this._energyPurchase = series;
}
if (series.equals(this._energyDeliver)) {
this._energyDeliver = series;
}
if (series.equals(this._energyProduce)) {
this._energyProduce = series;
}
if (series.equals(this._powerProduce)) {
this._powerProduce = series;
this.updateConsume();
}
if (series.equals(this._powerPurchase)) {
this._powerPurchase = series;
this.updateConsume();
}
if (series.equals(this._powerDeliver)) {
this._powerDeliver = series;
this.updateConsume();
}
};
static fromJson(json: any): Location { static fromJson(json: any): Location {
return new Location( return new Location(
validateNumber(json.id), validateNumber(json.id),
@ -79,55 +39,18 @@ export class Location {
); );
} }
private updateConsume() { getSeries(): Series[] {
this._powerConsume = Value.ZERO.plus(this._powerPurchase?.value, true).plus(this._powerProduce?.value, true).minus(this._powerDeliver?.value, true); return [
this.powerSelf = Value.ZERO.plus(this.powerProduce?.value.minus(this.powerDeliver?.value, true), true); this.energyPurchase,
this.powerPurchasePercentConsume = Value.ZERO.plus(this.powerPurchase?.value.percent(this.powerConsume, "%", 0), true); this.energyDeliver,
this.powerProducePercentConsume = Value.ZERO.plus(this.powerProduce?.value.percent(this.powerConsume, "%", 0), true); this.energyProduce,
this.powerDeliveryPercentConsume = Value.ZERO.plus(this.powerDeliver?.value.percent(this.powerConsume, "%", 0), true); this.powerPurchase,
this.powerDeliveryPercentProduce = Value.ZERO.plus(this.powerDeliver?.value.percent(this.powerProduce?.value, "%", 0), true); this.powerDeliver,
this.powerSelfPercentConsume = Value.ZERO.plus(this.powerSelf.percent(this.powerConsume, "%", 0), true); this.powerProduce,
this.powerSelfPercentProduce = Value.ZERO.plus(this.powerSelf.percent(this.powerProduce?.value, "%", 0), true); this.outsideTemperature,
} this.outsideHumidityRelative,
this.outsideHumidityAbsolute,
get energyPurchase(): Series | null { ].filter(s => s) as Series[];
return this._energyPurchase;
}
get energyDeliver(): Series | null {
return this._energyDeliver;
}
get energyProduce(): Series | null {
return this._energyProduce;
}
get powerPurchase(): Series | null {
return this._powerPurchase;
}
get powerDeliver(): Series | null {
return this._powerDeliver;
}
get powerProduce(): Series | null {
return this._powerProduce;
}
get powerConsume(): Value | null {
return this._powerConsume;
}
get outsideTemperature(): Series | null {
return this._outsideTemperature;
}
get outsideHumidityRelative(): Series | null {
return this._outsideHumidityRelative;
}
get outsideHumidityAbsolute(): Series | null {
return this._outsideHumidityAbsolute;
} }
} }

View File

@ -56,6 +56,8 @@ export class LocationDetail implements OnInit, OnDestroy {
protected readonly Math = Math; protected readonly Math = Math;
private locationId: number | null = null;
protected location: Location | null = null; protected location: Location | null = null;
private readonly subs: Subscription [] = []; private readonly subs: Subscription [] = [];
@ -85,19 +87,22 @@ export class LocationDetail implements OnInit, OnDestroy {
this.router.navigate(["Location/" + this.configService.locationId]); this.router.navigate(["Location/" + this.configService.locationId]);
return; return;
} }
setTimeout(() => this.locationService.id = id, 0); this.locationId = id;
if (this.locationId) {
this.locationService.getById(this.locationId, this.onLocationChange);
}
})); }));
this.subs.push(this.locationService.location$.subscribe(this.onLocationChange)); this.subs.push(this.locationService.subscribe(this.onLocationChange));
} }
private readonly onLocationChange = (location: Location | null): void => { private readonly onLocationChange = (location: Location | null): void => {
if (this.locationId === location?.id) {
this.location = location; this.location = location;
this.menuService.title = this.location?.name || ""; this.menuService.setLocation(location);
}
}; };
ngOnDestroy(): void { ngOnDestroy(): void {
this.location = null;
this.menuService.title = "";
this.subs.forEach(sub => sub.unsubscribe()); this.subs.forEach(sub => sub.unsubscribe());
this.subs.length = 0; this.subs.length = 0;
} }

View File

@ -1,4 +1,4 @@
import {Component, Inject, Input, LOCALE_ID, OnChanges, SimpleChanges, ViewChild} from '@angular/core'; import {Component, Inject, Input, LOCALE_ID, OnChanges, ViewChild} from '@angular/core';
import {Interval} from '../../../series/Interval'; import {Interval} from '../../../series/Interval';
import {PointService} from '../../../point/point-service'; import {PointService} from '../../../point/point-service';
import {Location} from '../../Location'; import {Location} from '../../Location';
@ -111,6 +111,8 @@ export class EnergyCharts implements OnChanges {
}, },
}; };
private refreshTimeout: number | undefined;
constructor( constructor(
readonly pointService: PointService, readonly pointService: PointService,
@Inject(LOCALE_ID) readonly locale: string, @Inject(LOCALE_ID) readonly locale: string,
@ -118,8 +120,10 @@ export class EnergyCharts implements OnChanges {
// //
} }
ngOnChanges(changes: SimpleChanges): void { ngOnChanges(): void {
console.log("ngOnChanges", changes); clearTimeout(this.refreshTimeout);
this.refreshTimeout = setTimeout(() => this.ngOnChanges(), 60 * 1000);
const series = [ const series = [
this.location.energyPurchase, this.location.energyPurchase,
this.location.energyDeliver, this.location.energyDeliver,

View File

@ -93,6 +93,7 @@ export class LocationEnergy implements OnInit, OnChanges, OnDestroy {
ngOnDestroy(): void { ngOnDestroy(): void {
this.subs.forEach(sub => sub.unsubscribe()); this.subs.forEach(sub => sub.unsubscribe());
this.subs.length = 0;
} }
protected readonly update = (fresh: Series): void => { protected readonly update = (fresh: Series): void => {
@ -109,12 +110,12 @@ export class LocationEnergy implements OnInit, OnChanges, OnDestroy {
next(value); next(value);
this.consume = this.purchase.plus(this.produce, true).minus(this.deliver, true); this.consume = this.purchase.plus(this.produce, true).minus(this.deliver, true);
this.self = this.produce.minus(this.deliver, true); this.self = this.produce.minus(this.deliver, true);
this.purchasePercentConsume = this.purchase.percent(this.consume, "%", 0); this.purchasePercentConsume = this.purchase.percent(this.consume);
this.producePercentConsume = this.produce.percent(this.consume, "%", 0); this.producePercentConsume = this.produce.percent(this.consume);
this.deliveryPercentConsume = this.deliver.percent(this.consume, "%", 0); this.deliveryPercentConsume = this.deliver.percent(this.consume);
this.deliveryPercentProduce = this.deliver.percent(this.produce, "%", 0); this.deliveryPercentProduce = this.deliver.percent(this.produce);
this.selfPercentConsume = this.self.percent(this.consume, "%", 0); this.selfPercentConsume = this.self.percent(this.consume);
this.selfPercentProduce = this.self.percent(this.produce, "%", 0); this.selfPercentProduce = this.self.percent(this.produce);
}; };
if (fresh !== null && fresh !== undefined) { if (fresh !== null && fresh !== undefined) {
if (fresh.id !== series?.id) { if (fresh.id !== series?.id) {

View File

@ -1,50 +1,17 @@
import {Injectable} from '@angular/core'; import {Injectable} from '@angular/core';
import {ApiService, CrudService, Next, WebsocketService} from '../common'; import {ApiService, CrudService, Next, WebsocketService} from '../common';
import {Location} from './Location' import {Location} from './Location'
import {SeriesService} from '../series/series-service';
import {BehaviorSubject, Observable} from 'rxjs';
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
}) })
export class LocationService extends CrudService<Location> { export class LocationService extends CrudService<Location> {
private readonly _location = new BehaviorSubject<Location | null>(null);
private _id: number | null = null;
constructor( constructor(
api: ApiService, api: ApiService,
ws: WebsocketService, ws: WebsocketService,
readonly seriesService: SeriesService,
) { ) {
super(api, ws, ['Location'], Location.fromJson); super(api, ws, ['Location'], Location.fromJson);
this.seriesService.subscribe(series => this._location.value?.updateSeries(series));
this.ws.onConnect(this.fetch);
this.ws.onDisconnect(() => this._location.next(null));
}
set id(id: number | null) {
if (this._id !== id) {
this._id = id;
this.fetch();
}
}
get id(): number | null {
return this._id;
}
private readonly fetch = () => {
if (this._id === null) {
this._location.next(null);
} else {
this.getById(this._id, location => this._location.next(location));
}
};
get location$(): Observable<Location | null> {
return this._location.asObservable();
} }
findAll(next: Next<Location[]>) { findAll(next: Next<Location[]>) {

View File

@ -11,11 +11,11 @@
Bezug Bezug
</div> </div>
<div class="SectionBody COLOR_FONT_PURCHASE"> <div class="SectionBody COLOR_FONT_PURCHASE">
{{ location.powerPurchase?.value?.toValueString(dateService.now) }} {{ powerPurchase.toValueString(dateService.now) }}
</div> </div>
@if (configService.energyPercent) { @if (configService.energyPercent) {
<div class="SectionBody COLOR_FONT_PURCHASE percent"> <div class="SectionBody COLOR_FONT_PURCHASE percent">
{{ location.powerPurchasePercentConsume.toValueString(dateService.now) }} {{ powerPurchasePercentConsume.toValueString(dateService.now) }}
<sub class="subscript">Verbrauch</sub> <sub class="subscript">Verbrauch</sub>
</div> </div>
} }
@ -26,11 +26,11 @@
Solar Solar
</div> </div>
<div class="SectionBody COLOR_FONT_PRODUCE"> <div class="SectionBody COLOR_FONT_PRODUCE">
{{ location.powerProduce?.value?.toValueString(dateService.now) }} {{ powerProduce.toValueString(dateService.now) }}
</div> </div>
@if (configService.energyPercent) { @if (configService.energyPercent) {
<div class="SectionBody COLOR_FONT_PRODUCE percent"> <div class="SectionBody COLOR_FONT_PRODUCE percent">
{{ location.powerProducePercentConsume.toValueString(dateService.now) }} {{ powerProducePercentConsume.toValueString(dateService.now) }}
<sub class="subscript">Verbrauch</sub> <sub class="subscript">Verbrauch</sub>
</div> </div>
} }
@ -41,15 +41,15 @@
Selbst Selbst
</div> </div>
<div class="SectionBody COLOR_FONT_SELF"> <div class="SectionBody COLOR_FONT_SELF">
{{ location.powerSelf.toValueString(dateService.now) }} {{ powerSelf.toValueString(dateService.now) }}
</div> </div>
@if (configService.energyPercent) { @if (configService.energyPercent) {
<div class="SectionBody COLOR_FONT_SELF percent"> <div class="SectionBody COLOR_FONT_SELF percent">
{{ location.powerSelfPercentConsume.toValueString(dateService.now) }} {{ powerSelfPercentConsume.toValueString(dateService.now) }}
<sub class="subscript">Verbrauch</sub> <sub class="subscript">Verbrauch</sub>
</div> </div>
<div class="SectionBody COLOR_FONT_SELF percent"> <div class="SectionBody COLOR_FONT_SELF percent">
{{ location.powerSelfPercentProduce.toValueString(dateService.now) }} {{ powerSelfPercentProduce.toValueString(dateService.now) }}
<sub class="subscript">Produktion</sub> <sub class="subscript">Produktion</sub>
</div> </div>
} }
@ -60,7 +60,7 @@
Verbrauch Verbrauch
</div> </div>
<div class="SectionBody COLOR_FONT_CONSUME"> <div class="SectionBody COLOR_FONT_CONSUME">
{{ location.powerConsume?.toValueString(dateService.now) }} {{ powerConsume.toValueString(dateService.now) }}
</div> </div>
</div> </div>
@ -69,15 +69,15 @@
Einspeisung Einspeisung
</div> </div>
<div class="SectionBody COLOR_FONT_DELIVER"> <div class="SectionBody COLOR_FONT_DELIVER">
{{ location.powerDeliver?.value?.toValueString(dateService.now) }} {{ powerDeliver.toValueString(dateService.now) }}
</div> </div>
@if (configService.energyPercent) { @if (configService.energyPercent) {
<div class="SectionBody COLOR_FONT_DELIVER percent"> <div class="SectionBody COLOR_FONT_DELIVER percent">
{{ location.powerDeliveryPercentConsume.toValueString(dateService.now) }} {{ powerDeliverPercentConsume.toValueString(dateService.now) }}
<sub class="subscript">Verbrauch</sub> <sub class="subscript">Verbrauch</sub>
</div> </div>
<div class="SectionBody COLOR_FONT_DELIVER percent"> <div class="SectionBody COLOR_FONT_DELIVER percent">
{{ location.powerDeliveryPercentProduce.toValueString(dateService.now) }} {{ powerDeliverPercentProduce.toValueString(dateService.now) }}
<sub class="subscript">Produktion</sub> <sub class="subscript">Produktion</sub>
</div> </div>
} }

View File

@ -1,7 +1,11 @@
import {Component, Input} from '@angular/core'; import {Component, Input, OnChanges, OnDestroy, OnInit} from '@angular/core';
import {Location} from '../Location'; import {Location} from '../Location';
import {DateService} from '../../date.service'; import {DateService} from '../../date.service';
import {ConfigService} from '../../config.service'; import {ConfigService} from '../../config.service';
import {Value} from '../../series/Value';
import {SeriesService} from '../../series/series-service';
import {Subscription} from 'rxjs';
import {Series} from '../../series/Series';
@Component({ @Component({
selector: 'app-location-power', selector: 'app-location-power',
@ -9,16 +13,86 @@ import {ConfigService} from '../../config.service';
templateUrl: './location-power.html', templateUrl: './location-power.html',
styleUrl: './location-power.less', styleUrl: './location-power.less',
}) })
export class LocationPower { export class LocationPower implements OnInit, OnChanges, OnDestroy {
@Input() @Input()
location!: Location; location!: Location;
private readonly subs: Subscription[] = [];
protected energyPurchase: Value = Value.NULL;
protected energyDeliver: Value = Value.NULL;
protected energyProduce: Value = Value.NULL;
protected powerPurchase: Value = Value.NULL;
protected powerDeliver: Value = Value.NULL;
protected powerProduce: Value = Value.NULL;
protected outsideTemperature: Value = Value.NULL;
protected outsideHumidityRelative: Value = Value.NULL;
protected outsideHumidityAbsolute: Value = Value.NULL;
protected powerConsume: Value = Value.NULL;
protected powerSelf: Value = Value.NULL;
protected powerPurchasePercentConsume: Value = Value.NULL;
protected powerProducePercentConsume: Value = Value.NULL;
protected powerDeliverPercentConsume: Value = Value.NULL;
protected powerDeliverPercentProduce: Value = Value.NULL;
protected powerSelfPercentConsume: Value = Value.NULL;
protected powerSelfPercentProduce: Value = Value.NULL;
constructor( constructor(
readonly dateService: DateService, readonly dateService: DateService,
readonly configService: ConfigService, readonly configService: ConfigService,
readonly seriesService: SeriesService,
) { ) {
// //
} }
ngOnInit(): void {
this.subs.push(this.seriesService.subscribe(this.seriesUpdate));
}
ngOnChanges(): void {
this.location.getSeries().forEach(this.seriesUpdate);
}
ngOnDestroy(): void {
this.subs.forEach(sub => sub.unsubscribe());
this.subs.length = 0;
}
private readonly seriesUpdate = (series: Series): void => {
if (series.id === this.location.energyPurchase?.id) this.energyPurchase = series.value;
if (series.id === this.location.energyDeliver?.id) this.energyDeliver = series.value;
if (series.id === this.location.energyProduce?.id) this.energyProduce = series.value;
if (series.id === this.location.powerPurchase?.id) this.powerPurchase = series.value;
if (series.id === this.location.powerDeliver?.id) this.powerDeliver = series.value;
if (series.id === this.location.powerProduce?.id) this.powerProduce = series.value;
if (series.id === this.location.outsideTemperature?.id) this.outsideTemperature = series.value;
if (series.id === this.location.outsideHumidityRelative?.id) this.outsideHumidityRelative = series.value;
if (series.id === this.location.outsideHumidityAbsolute?.id) this.outsideHumidityAbsolute = series.value;
this.powerSelf = Value.ZERO.plus(this.powerProduce).minus(this.powerDeliver);
this.powerConsume = Value.ZERO.plus(this.powerPurchase).plus(this.powerSelf);
this.powerPurchasePercentConsume = this.powerPurchase.percent(this.powerConsume);
this.powerProducePercentConsume = this.powerProduce.percent(this.powerConsume);
this.powerDeliverPercentConsume = this.powerDeliver.percent(this.powerConsume)
this.powerDeliverPercentProduce = this.powerDeliver.percent(this.powerProduce)
this.powerSelfPercentConsume = this.powerSelf.percent(this.powerConsume);
this.powerSelfPercentProduce = this.powerSelf.percent(this.powerProduce);
};
} }

View File

@ -1,18 +1,31 @@
import {Injectable} from '@angular/core'; import {Injectable} from '@angular/core';
import {Location} from './location/Location';
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
}) })
export class MenuService { export class MenuService {
private _locationId: number | null = null;
private _title: string = ""; private _title: string = "";
get locationId(): number | null {
return this._locationId;
}
get title(): string { get title(): string {
return this._title; return this._title;
} }
set title(value: string) { setLocation(location: Location): void {
setTimeout(() => this._title = value, 0); this._locationId = location.id;
this._title = location.name;
}
setNonLocation(title: string) {
this._title = title;
this._locationId = null;
} }
} }

View File

@ -0,0 +1,22 @@
import {Series} from "./Series";
import {validateList} from "../common";
export class SeriesListResponse {
constructor(
readonly series: Series[]
) {
//
}
static fromJson(json: any): SeriesListResponse {
return new SeriesListResponse(
validateList(json, Series.fromJson),
);
}
findSeries(series: Series | null): Series | null {
return series ? this.series.filter(s => s.id === series.id)[0] || null : null;
}
}

View File

@ -39,14 +39,14 @@ export class Value {
return formatNumber(this.value, "de-DE", `0.${-rest}-${-rest}`) + ' ' + this.unit; return formatNumber(this.value, "de-DE", `0.${-rest}-${-rest}`) + ' ' + this.unit;
} }
plus(other: Value | null | undefined, nullToZero: boolean): Value { plus(other: Value | null | undefined, nullToZero: boolean = true): Value {
if (!nullToZero && (other === null || other === undefined)) { if (!nullToZero && (other === null || other === undefined)) {
return Value.NULL; return Value.NULL;
} }
return new BiValue(this, other || Value.ZERO, (a, b) => a + b); return new BiValue(this, other || Value.ZERO, (a, b) => a + b);
} }
minus(other: Value | null | undefined, nullToZero: boolean): Value { minus(other: Value | null | undefined, nullToZero: boolean = true): Value {
if (!nullToZero && (other === null || other === undefined)) { if (!nullToZero && (other === null || other === undefined)) {
return Value.NULL; return Value.NULL;
} }
@ -86,11 +86,11 @@ export class Value {
return ageSeconds > this.seconds * 2.1; return ageSeconds > this.seconds * 2.1;
} }
percent(other: Value | null | undefined, unit: string | null = null, precision: number | null = null): Value { percent(other: Value | null | undefined): Value {
if (other === null || other === undefined) { if (other === null || other === undefined) {
return Value.NULL; return Value.NULL;
} }
return new BiValue(this, other, (a, b) => a / b * 100, unit, precision); return new BiValue(this, other, (a, b) => a / b * 100, '%', 0);
} }
} }

View File

@ -1,6 +1,5 @@
import {Component, OnInit} from '@angular/core'; import {Component, OnInit} from '@angular/core';
import {LocationSelect} from '../location/select/location-select'; import {LocationSelect} from '../location/select/location-select';
import {LocationService} from '../location/location-service';
import {Location} from '../location/Location' import {Location} from '../location/Location'
import {ConfigService} from '../config.service'; import {ConfigService} from '../config.service';
import {FormsModule} from '@angular/forms'; import {FormsModule} from '@angular/forms';
@ -22,7 +21,6 @@ export class SettingsComponent implements OnInit {
protected location: Location | null = null; protected location: Location | null = null;
constructor( constructor(
readonly locationService: LocationService,
readonly configService: ConfigService, readonly configService: ConfigService,
readonly menuService: MenuService, readonly menuService: MenuService,
) { ) {
@ -30,7 +28,7 @@ export class SettingsComponent implements OnInit {
} }
ngOnInit(): void { ngOnInit(): void {
this.menuService.title = "Einstellungen"; this.menuService.setNonLocation("Einstellungen");
} }
} }