AW-6046 Angular improvement
All checks were successful
FarmMaps.Develop/FarmMapsLib/pipeline/head This commit looks good

This commit is contained in:
2024-04-15 10:29:47 +02:00
parent ede75f63f5
commit 84a1a04b19
104 changed files with 592 additions and 796 deletions

View File

@@ -18,5 +18,6 @@ module.exports = {
"@typescript-eslint"
],
"rules": {
"@typescript-eslint/no-explicit-any": "off"
}
}

View File

@@ -1,12 +1,11 @@
import {NgModule} from '@angular/core';
import {RouterModule} from '@angular/router';
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import {AuthCallbackComponent} from './components/auth-callback/auth-callback.component';
import {AuthCallbackGuard} from './components/auth-callback/auth-callback.guard';
import {NavBarGuard} from './services/nav-bar-guard.service';
import {FullScreenGuard} from './services/full-screen-guard.service';
import {SessionClearedComponent} from './components/session-cleared/session-cleared.component';
import {NotFoundComponent} from './components/not-found/not-found.component';
import { AuthCallbackComponent } from './components/auth-callback/auth-callback.component';
import { NotFoundComponent } from './components/not-found/not-found.component';
import { SessionClearedComponent } from './components/session-cleared/session-cleared.component';
import { FullScreenGuard } from './services/full-screen-guard.service';
import { NavBarGuard } from './services/nav-bar-guard.service';
import { ProductionGuard } from './services/production-guard.service';

View File

@@ -1,16 +1,16 @@
// angular modules
import { NgModule, APP_INITIALIZER, ModuleWithProviders, Injector, Optional, SkipSelf,InjectionToken } from '@angular/core';
import { CommonModule, DatePipe } from '@angular/common';
import { HttpClientModule, HttpClient, HTTP_INTERCEPTORS } from '@angular/common/http';
import { CommonModule } from '@angular/common';
import { HttpClientModule } from '@angular/common/http';
import { InjectionToken, NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
// external modules
import { OAuthModule, AuthConfig, OAuthService, OAuthStorage } from 'angular-oauth2-oidc';
import { StoreModule, Store } from '@ngrx/store';
import { EffectsModule } from '@ngrx/effects';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
import { UploadxModule } from 'ngx-uploadx';
import { EffectsModule } from '@ngrx/effects';
import { StoreModule } from '@ngrx/store';
import { OAuthModule } from 'angular-oauth2-oidc';
import { ClipboardModule } from 'ngx-clipboard';
import { UploadxModule } from 'ngx-uploadx';
// routing module
@@ -19,111 +19,67 @@ import { AppCommonRoutingModule } from './common-routing.module';
import { MODULE_NAME } from './module-name';
//components
import { SafePipe } from './shared/safe.pipe';
import { AuthConfigFactory, IAuthconfigFactory } from './shared/authconfigFactory';
import { AppComponent } from './components/app/app.component';
import { AuthCallbackComponent } from './components/auth-callback/auth-callback.component';
import { SessionClearedComponent } from './components/session-cleared/session-cleared.component';
import { ResumableFileUploadComponent } from './components/resumable-file-upload/resumable-file-upload.component';
import { NotFoundComponent } from './components/not-found/not-found.component';
import { NotImplementedComponent } from './components/not-implemented/not-implemented.component';
import { SidePanelComponent } from './components/side-panel/side-panel.component';
import { TimespanComponent } from './components/timespan/timespan.component';
import { TagInputComponent } from './components/tag-input/tag-input.component';
import { MenuBackgroundComponent } from './components/menu-background/menu-background.component';
import { HasPackageDirective} from './components/has-package/has-package.directive';
import { PackageExistsDirective} from './components/package-exists/package-exists.directive';
import { HasClaimDirective } from './components/has-claim/has-claim.directive';
import { HasRoleDirective } from './components/has-role/has-role.directive';
import { UserMenuComponent} from './components/user-menu/user-menu.component';
import { ThumbnailComponent } from './components/thumbnail/thumbnail.component';
import { Alert } from './enumerations/alert.enum';
import { IEventMessage } from './models/event.message';
import { IItem, Item } from './models/item';
import { WeatherCurrentObservation } from './models/weatherCurrentObservation';
import { IItemType } from './models/item.type';
import { IItemLinkType} from './models/itemlink.type';
import {IUrlType} from './models/url.type';
import { IItemTypes } from './models/item.types';
import { IItemTask, ItemTask } from './models/itemTask';
import { IListItem } from './models/list.item';
import { ITypeaheadItem } from './models/typeahead.item'
import { IJsonline } from './models/json-line';
import { ISenMLItem } from './models/senml-item';
import { IPackage,IPackages } from './models/package';
import { IUser } from './models/user';
import { IQueryState } from './models/query.state';
import { IDataLayer } from './models/data.layer';
import { IColor,IGradientstop} from './models/gradient';
import * as commonActions from './actions/app-common.actions';
import * as commonReducers from './reducers/app-common.reducer';
import * as commonEffects from './effects/app-common.effects';
import { SecureOAuthStorage} from './shared/secureOAuthStorage';
import { GradientComponent } from './components/gradient/gradient.component';
import { GradientSelectComponent } from './components/gradient-select/gradient-select.component';
import { AppMenuComponent } from './components/app-menu/app-menu.component';
import { NotificationMenuComponent} from './components/notification-menu/notification-menu.component';
import { HelpMenuComponent} from './components/help-menu/help-menu.component';
import { BackButtonComponent } from './components/back-button/back-button.component';
import { EditImageModalComponent } from './components/edit-image-modal/edit-image-modal.component';
import { AvatarComponent } from './components/avatar/avatar.component';
import { ItemLinkComponent } from './components/item-link/item-link.component';
import { AvatarModule } from 'ngx-avatars';
import { ImageCropperModule } from 'ngx-image-cropper';
import * as commonActions from './actions/app-common.actions';
import { AppMenuComponent } from './components/app-menu/app-menu.component';
import { AppComponent } from './components/app/app.component';
import { AuthCallbackComponent } from './components/auth-callback/auth-callback.component';
import { AvatarComponent } from './components/avatar/avatar.component';
import { BackButtonComponent } from './components/back-button/back-button.component';
import { EditImageModalComponent } from './components/edit-image-modal/edit-image-modal.component';
import { GradientSelectComponent } from './components/gradient-select/gradient-select.component';
import { GradientComponent } from './components/gradient/gradient.component';
import { HasClaimDirective } from './components/has-claim/has-claim.directive';
import { HasPackageDirective } from './components/has-package/has-package.directive';
import { HasRoleDirective } from './components/has-role/has-role.directive';
import { HelpMenuComponent } from './components/help-menu/help-menu.component';
import { ItemLinkComponent } from './components/item-link/item-link.component';
import { MenuBackgroundComponent } from './components/menu-background/menu-background.component';
import { NotFoundComponent } from './components/not-found/not-found.component';
import { NotImplementedComponent } from './components/not-implemented/not-implemented.component';
import { NotificationMenuComponent } from './components/notification-menu/notification-menu.component';
import { PackageExistsDirective } from './components/package-exists/package-exists.directive';
import { ResumableFileUploadComponent } from './components/resumable-file-upload/resumable-file-upload.component';
import { SessionClearedComponent } from './components/session-cleared/session-cleared.component';
import { SidePanelComponent } from './components/side-panel/side-panel.component';
import { TagInputComponent } from './components/tag-input/tag-input.component';
import { ThumbnailComponent } from './components/thumbnail/thumbnail.component';
import { TimespanComponent } from './components/timespan/timespan.component';
import { UserMenuComponent } from './components/user-menu/user-menu.component';
import * as commonEffects from './effects/app-common.effects';
import { Alert } from './enumerations/alert.enum';
import { IDataLayer } from './models/data.layer';
import { IEventMessage } from './models/event.message';
import { IColor, IGradientstop } from './models/gradient';
import { IItem, Item } from './models/item';
import { IItemType } from './models/item.type';
import { IItemTypes } from './models/item.types';
import { IItemTask, ItemTask } from './models/itemTask';
import { IItemLinkType } from './models/itemlink.type';
import { IJsonline } from './models/json-line';
import { IListItem } from './models/list.item';
import { IPackage, IPackages } from './models/package';
import { IQueryState } from './models/query.state';
import { ISenMLItem } from './models/senml-item';
import { ITypeaheadItem } from './models/typeahead.item';
import { IUrlType } from './models/url.type';
import { IUser } from './models/user';
import { WeatherCurrentObservation } from './models/weatherCurrentObservation';
import * as commonReducers from './reducers/app-common.reducer';
import { AuthConfigFactory, IAuthconfigFactory } from './shared/authconfigFactory';
import { SafePipe } from './shared/safe.pipe';
import { SecureOAuthStorage } from './shared/secureOAuthStorage';
export const FM_COMMON_STARTPAGE = new InjectionToken<string>('fm-common-startpage');
export {
SafePipe,
AuthCallbackComponent,
AppComponent,
SessionClearedComponent,
ResumableFileUploadComponent,
NotFoundComponent,
NotImplementedComponent,
SidePanelComponent,
TimespanComponent,
TagInputComponent,
UserMenuComponent,
ThumbnailComponent,
HasPackageDirective,
PackageExistsDirective,
HasClaimDirective,
HasRoleDirective,
Alert,
IEventMessage,
IItem,
Item,
IItemType,
IItemLinkType,
IUrlType,
IItemTypes,
IItemTask,
ItemTask,
IListItem,
ITypeaheadItem,
IUser,
IQueryState,
IPackage,
IPackages,
commonActions,
commonReducers,
IAuthconfigFactory,
AuthConfigFactory,
MenuBackgroundComponent,
SecureOAuthStorage,
WeatherCurrentObservation,
IJsonline,
ISenMLItem,
IDataLayer,
IColor,
IGradientstop,
BackButtonComponent,
AvatarComponent,
ItemLinkComponent,
EditImageModalComponent,
Alert, AppComponent, AuthCallbackComponent, AuthConfigFactory, AvatarComponent, BackButtonComponent, EditImageModalComponent,
GradientComponent,
GradientSelectComponent
GradientSelectComponent, HasClaimDirective, HasPackageDirective, HasRoleDirective, IAuthconfigFactory, IColor, IDataLayer, IEventMessage, IGradientstop, IItem, IItemLinkType, IItemTask, IItemType, IItemTypes, IJsonline, IListItem, IPackage,
IPackages, IQueryState, ISenMLItem, ITypeaheadItem, IUrlType, IUser, Item, ItemLinkComponent, ItemTask, MenuBackgroundComponent, NotFoundComponent,
NotImplementedComponent, PackageExistsDirective, ResumableFileUploadComponent, SafePipe, SecureOAuthStorage, SessionClearedComponent, SidePanelComponent, TagInputComponent, ThumbnailComponent, TimespanComponent, UserMenuComponent, WeatherCurrentObservation, commonActions,
commonReducers
};
@NgModule({

View File

@@ -1,4 +1,4 @@
<div class="app fullscreen" (click)="handleClick($event)" [ngClass]="{'fullscreen' :(fullScreen|async),'pagemode':(isPageMode|async),'appmode':!(isPageMode|async)}">
<div class="app fullscreen" (click)="handleClick()" [ngClass]="{'fullscreen' :(fullScreen|async),'pagemode':(isPageMode|async),'appmode':!(isPageMode|async)}">
<nav class="navbar navbar-light navbar-expand bg-light navigation-clean">
<div class="container-fluid p-3 justify-content-start">
<div class="header-logo pageonly"><router-outlet name="header-logo"></router-outlet></div>
@@ -20,7 +20,7 @@
<div class="container-fluid">
<div class="body">
<div class="d-flex flex-row">
<div class="mt-2 mb-2 flex-grow-1 logo" (click)="handleHome($event)"><router-outlet name="side-panel-logo"></router-outlet></div>
<div class="mt-2 mb-2 flex-grow-1 logo" (click)="handleHome()"><router-outlet name="side-panel-logo"></router-outlet></div>
<div class="mt-2 mb-2 ms-2"><button type="button" class="btn btn-outline-secondary" (click)="handleToggleMenu($event)"><i class="fal fa-times" aria-hidden="true"></i></button></div>
</div>
<div class="d-flex flex-column cards">

View File

@@ -1,21 +1,18 @@
import { Component, OnInit, OnDestroy, Inject, Optional, ViewEncapsulation, RendererFactory2, PLATFORM_ID, ChangeDetectionStrategy, HostListener, Input } from '@angular/core';
import { Router, NavigationStart, NavigationEnd, RouteConfigLoadStart, RouteConfigLoadEnd, ActivatedRoute, PRIMARY_OUTLET } from '@angular/router';
import { Meta, Title, MetaDefinition } from '@angular/platform-browser'; import { DOCUMENT } from "@angular/common";
import { Subscription, Observable } from 'rxjs';
import { ChangeDetectionStrategy, Component, HostListener, Inject, Input, OnDestroy, OnInit, Optional, ViewEncapsulation } from '@angular/core';
import { NavigationEnd, NavigationStart, RouteConfigLoadEnd, RouteConfigLoadStart, Router } from '@angular/router';
import { Action, Store } from '@ngrx/store';
import { OAuthErrorEvent, OAuthService } from 'angular-oauth2-oidc';
import { Observable, Subscription } from 'rxjs';
import { distinctUntilChanged } from 'rxjs/operators';
import { Store, Action } from '@ngrx/store';
import { IUser } from '../../models/user';
import { OAuthService, OAuthErrorEvent } from 'angular-oauth2-oidc';
import { FM_COMMON_STARTPAGE } from '../../common.module';
import { IUser } from '../../models/user';
//AppCommon
import * as commonActions from '../../actions/app-common.actions';
import { IEventMessage } from '../../models/event.message';
import { IListItem } from '../../models/list.item';
import { EventService } from '../../services/event.service';
import { ItemTypeService } from '../../services/itemtype.service';
import * as commonActions from '../../actions/app-common.actions';
import { HealthCheckService } from '../../services/healthcheck.service';
import { AppConfig } from '../../shared/app.config';
import * as appReducers from '../../reducers/app-common.reducer';
@@ -27,12 +24,6 @@ import * as appReducers from '../../reducers/app-common.reducer';
changeDetection: ChangeDetectionStrategy.OnPush
})
export class AppComponent implements OnInit, OnDestroy {
// This will go at the END of your title for example "Home - Angular Universal..." <-- after the dash (-)
private endPageTitle = 'Farmmaps';
// If no Title is provided, we'll use a default one before the dash(-)
private defaultPageTitle = 'Farmmaps';
private routerSub$: Subscription;
private eventSub$: Subscription;
@@ -54,19 +45,12 @@ export class AppComponent implements OnInit, OnDestroy {
constructor(
@Optional() @Inject(FM_COMMON_STARTPAGE) public startPage: string,
public router: Router,
private activatedRoute$: ActivatedRoute,
private title$: Title,
private meta$: Meta,
private store$: Store<appReducers.State>,
private eventService$: EventService,
private healthCheckService$: HealthCheckService,
private itemTypeService$: ItemTypeService,
private oauthService$: OAuthService,
private appConfig$: AppConfig
) {
private oauthService$: OAuthService) {
}
getActionFromEvent(event: IEventMessage): Action {
let action: Action = null;
//console.debug(`${event.eventType} Event received`);
@@ -163,30 +147,28 @@ export class AppComponent implements OnInit, OnDestroy {
}
private InstallRouteEventHandler() {
const other = this;
this.routerSub$ = this.router.events.subscribe(event => {
if (event instanceof RouteConfigLoadStart) {
other.store$.dispatch(new commonActions.StartRouteLoading());
this.store$.dispatch(new commonActions.StartRouteLoading());
}
if (event instanceof NavigationEnd && (event.url == "/" || event.url.startsWith("/content"))) {
other.store$.dispatch(new commonActions.SetPageMode(true));
this.store$.dispatch(new commonActions.SetPageMode(true));
} else if (event instanceof NavigationEnd) {
other.store$.dispatch(new commonActions.SetPageMode(false));
this.store$.dispatch(new commonActions.SetPageMode(false));
}
if (event instanceof RouteConfigLoadEnd) {
other.store$.dispatch(new commonActions.EndRouteLoading());
this.store$.dispatch(new commonActions.EndRouteLoading());
}
if (event instanceof NavigationStart) {
other.store$.dispatch(new commonActions.SetMenuVisible(false));
this.store$.dispatch(new commonActions.SetMenuVisible(false));
}
});
}
private InstallEventServiceEventHandler() {
const other = this;
this.eventSub$ = this.eventService$.event.subscribe(event => {
const action = other.getActionFromEvent(event);
if (action) other.store$.dispatch(action);
const action = this.getActionFromEvent(event);
if (action) this.store$.dispatch(action);
});
}
@@ -201,7 +183,7 @@ export class AppComponent implements OnInit, OnDestroy {
});
}
handleClick(event: MouseEvent) {
handleClick() {
this.store$.dispatch(new commonActions.Escape(false, true));
}
@@ -214,7 +196,7 @@ export class AppComponent implements OnInit, OnDestroy {
this.store$.dispatch(new commonActions.ToggleMenu());
}
handleHome(event: MouseEvent) {
handleHome() {
this.router.navigate(['/']);
}
}

View File

@@ -1,7 +1,6 @@
import { Component } from '@angular/core';
import { Router } from '@angular/router';
import { OAuthService } from 'angular-oauth2-oidc';
import { Location} from '@angular/common';
@Component({
selector: 'fm-auth-callback',
@@ -10,11 +9,11 @@ import { Location} from '@angular/common';
export class AuthCallbackComponent {
constructor(private router$: Router,private oauthService$:OAuthService) {
oauthService$.loadDiscoveryDocument().then(() => {
oauthService$.tryLoginCodeFlow().then(() => {
router$.navigateByUrl((oauthService$.state && oauthService$.state!="")?decodeURIComponent(oauthService$.state):"");
this.oauthService$.loadDiscoveryDocument().then(() => {
this.oauthService$.tryLoginCodeFlow().then(() => {
this.router$.navigateByUrl((this.oauthService$.state && this.oauthService$.state!="")?decodeURIComponent(this.oauthService$.state):"");
}).catch(() => {
router$.navigateByUrl("/");
this.router$.navigateByUrl("/");
});
})
}

View File

@@ -1,8 +1,7 @@
import { Component, OnInit,ViewChild,ElementRef,EventEmitter, Output } from '@angular/core';
import { HttpClient, HttpParams,HttpHeaders } from "@angular/common/http";
import {NgbModal} from "@ng-bootstrap/ng-bootstrap"
import { ImageCroppedEvent,LoadedImage } from 'ngx-image-cropper';
import {ImageService } from '../../services/image.service';
import { Component, ElementRef, EventEmitter, OnInit, Output, ViewChild } from '@angular/core';
import { NgbModal } from "@ng-bootstrap/ng-bootstrap";
import { ImageCroppedEvent, LoadedImage } from 'ngx-image-cropper';
import { ImageService } from '../../services/image.service';
@Component({
selector: 'fm-edit-image-modal',
@@ -47,7 +46,8 @@ export class EditImageModalComponent implements OnInit {
imageCropped(event: ImageCroppedEvent) {
this.croppedImage = event.base64;
}
imageLoaded(image: LoadedImage) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
imageLoaded(_image: LoadedImage) {
this.isImageLoaded=true;
}
cropperReady() {

View File

@@ -1,11 +1,8 @@
import { Directive, ViewContainerRef,TemplateRef,OnInit,Input,OnDestroy } from '@angular/core';
import { Store} from '@ngrx/store';
import * as appCommonReducer from '../../reducers/app-common.reducer'
import { IPackages } from '../../models/package';
import { Observable, Subscription } from 'rxjs';
import { skip } from 'rxjs/operators';
import {OAuthService } from 'angular-oauth2-oidc';
import { Directive, Input, OnInit, TemplateRef, ViewContainerRef } from '@angular/core';
import { Store } from '@ngrx/store';
import { Observable } from 'rxjs';
import { IUser } from '../../models/user';
import * as appCommonReducer from '../../reducers/app-common.reducer';
@Directive({
selector: '[fm-hasclaim]',

View File

@@ -34,8 +34,8 @@ export class HasPackageDirective implements OnDestroy, AfterViewInit {
constructor(private hostTemplateRef: TemplateRef<any>, private viewContainerRef: ViewContainerRef,
private store: Store<appCommonReducer.State>, private packageService: PackageService) {
this.thenTemplate = hostTemplateRef;
this.packSub = this.store.select(appCommonReducer.SelectGetValidUserPackages).subscribe((_) => {
this.thenTemplate = this.hostTemplateRef;
this.packSub = this.store.select(appCommonReducer.SelectGetValidUserPackages).subscribe(() => {
this.updateView();
});
}

View File

@@ -1,7 +1,7 @@
import { Component, OnInit,Input } from '@angular/core';
import { Store, Action } from '@ngrx/store';
import { Component, Input, OnInit } from '@angular/core';
import { Store } from '@ngrx/store';
import * as commonActions from '../../actions/app-common.actions';
import * as appReducers from '../../reducers/app-common.reducer';
import * as commonActions from '../../actions/app-common.actions';
@Component({
selector: 'fm-menu-background',

View File

@@ -34,8 +34,8 @@ export class PackageExistsDirective implements OnDestroy, AfterViewInit {
constructor(private hostTemplateRef: TemplateRef<any>, private viewContainerRef: ViewContainerRef,
private store: Store<appCommonReducer.State>, private packageService: PackageService) {
this.thenTemplate = hostTemplateRef;
this.packSub = this.store.select(appCommonReducer.SelectGetPackages).subscribe((_) => {
this.thenTemplate = this.hostTemplateRef;
this.packSub = this.store.select(appCommonReducer.SelectGetPackages).subscribe(() => {
this.updateView();
});
}

View File

@@ -1,9 +1,9 @@
import { Component, Input,Output, HostListener, ChangeDetectorRef, OnDestroy, OnInit,EventEmitter } from '@angular/core';
import { ResumableFileUploadService, File } from './resumable-file-upload.service';
import { Subscription } from 'rxjs';
import { ChangeDetectorRef, Component, HostListener, Input, OnDestroy, OnInit } from '@angular/core';
import { Store } from '@ngrx/store';
import * as commonReducer from '../../reducers/app-common.reducer';
import { Subscription } from 'rxjs';
import * as commonActions from '../../actions/app-common.actions';
import * as commonReducer from '../../reducers/app-common.reducer';
import { File, ResumableFileUploadService } from './resumable-file-upload.service';
@Component({
@@ -29,7 +29,7 @@ export class ResumableFileUploadComponent implements OnInit, OnDestroy {
ngOnInit() {
this.uploadService.init();
this.refreshSub = this.uploadService.refresh.subscribe((e: any) => {
this.refreshSub = this.uploadService.refresh.subscribe(() => {
this.cd.markForCheck();
});
}

View File

@@ -1,8 +1,7 @@
import { Injectable, OnDestroy } from '@angular/core';
import { OAuthService } from 'angular-oauth2-oidc';
import { Subject , Subscription } from 'rxjs';
import { HttpClient } from "@angular/common/http";
import { UploadxService, UploadState,UploadxOptions} from 'ngx-uploadx';
import { UploadState, UploadxOptions, UploadxService } from 'ngx-uploadx';
import { Subject, Subscription } from 'rxjs';
import { AppConfig } from '../../shared/app.config';
@@ -19,7 +18,7 @@ export class ResumableFileUploadService implements OnDestroy{
private _eventSub:Subscription;
private initialized = false;
constructor(private httpClient: HttpClient,private oauthService: OAuthService,private uploadService: UploadxService,public appConfig: AppConfig) {
constructor(private oauthService: OAuthService,private uploadService: UploadxService,public appConfig: AppConfig) {
}
@@ -41,11 +40,9 @@ export class ResumableFileUploadService implements OnDestroy{
updatetotalprogress() {
let totalProgress =0;
let n=0;
for(let i =0;i<this.files.length;i++) {
if(!this.files[i].error) {
totalProgress+=this.files[i].progress;
n++;
}
}
this.totalProgress=totalProgress/this.files.length;
@@ -86,7 +83,7 @@ export class ResumableFileUploadService implements OnDestroy{
this.refresh.next({});
}
addFiles = (files: any[], event: any, metadata:any) => {
addFiles = (files: any[], _event: any, metadata:any) => {
for (const f of files) {
const options:UploadxOptions = {metadata:metadata};
this.uploadService.handleFiles(f,options);
@@ -133,7 +130,6 @@ export class ResumableFileUploadService implements OnDestroy{
}
export class File {
private file: any;
public fileName: string;
public progress: number;
public identifier: string;
@@ -142,9 +138,7 @@ export class File {
public error: boolean;
public errorMessage: string;
constructor(state: UploadState) {
this.file = state;
this.fileName = state.file.name;
this.progress = state.progress?state.progress:0;
this.identifier = state.uploadId;

View File

@@ -1,8 +1,8 @@
import { Component, Input } from '@angular/core';
import { Router, ActivatedRoute, ParamMap } from '@angular/router';
import { Component } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { Store } from '@ngrx/store';
import * as appCommonReducers from '../../reducers/app-common.reducer';
import * as appCommonActions from '../../actions/app-common.actions';
import * as appCommonReducers from '../../reducers/app-common.reducer';

View File

@@ -1,5 +1,5 @@
<div class="side-panel hidden" [ngClass]="{'hidden':!visible,'collapsed':collapsed,'resizeable':(resizeable && mobile),'resizing':resizing,'left':left,'extrawide':extrawide}" [ngStyle]="{'top':top}">
<div *ngIf="collapsable" class="arrow rounded-end p-2" (click)="handleToggleClick($event)">
<div *ngIf="collapsable" class="arrow rounded-end p-2" (click)="handleToggleClick()">
<i class="fal fa-chevron-left" aria-hidden="true"></i>
</div>
<div draggable="true" class="resizegrip" (dragstart)="handleStartGripDrag($event)" (touchstart)="handleStartGripDrag($event)" (dragend)="handleEndGripDrag()" (touchend)="handleEndGripDrag()" (drag)="handleGripDrag($event)" (touchmove)="handleGripDrag($event)">

View File

@@ -1,4 +1,4 @@
import { Component, Input,Output,ViewChild,EventEmitter, ElementRef,OnChanges,SimpleChanges,HostListener,ChangeDetectorRef, ViewEncapsulation } from '@angular/core';
import { Component, ElementRef, EventEmitter, HostListener, Input, OnChanges, Output, SimpleChanges, ViewChild } from '@angular/core';
@Component({
selector: 'fm-side-panel',
@@ -22,7 +22,7 @@ export class SidePanelComponent implements OnChanges {
private resizeTop=50;
public resizing=false;
constructor(private element: ElementRef,private ref: ChangeDetectorRef) {
constructor(private element: ElementRef) {
this.collapsable = false;
this.setTop();
}
@@ -46,7 +46,7 @@ export class SidePanelComponent implements OnChanges {
this.setTop();
}
handleToggleClick(event) {
handleToggleClick() {
if (this.collapsable) {
this.collapsed = !this.collapsed;
}
@@ -85,7 +85,7 @@ export class SidePanelComponent implements OnChanges {
}
@HostListener('window:resize', ['$event'])
handleResize(event) {
handleResize() {
this.setTop();
}
}

View File

@@ -2,7 +2,7 @@
<span class="tag rounded bg-primary text-white" *ngFor="let tag of tags;"><span>{{tag}}</span> <i
(click)="handleDeleteTag(tag)" class="fal fa-times" aria-hidden="true"></i></span><input
type="text" #tagInputElement
(blur)="handleBlur($event, false)"
(blur)="handleBlur(false)"
(keyup)="handleKeyUp($event)"
[(ngModel)]="tag"
[ngbTypeahead]="findTag"

View File

@@ -65,7 +65,7 @@ export class TagInputComponent implements ControlValueAccessor {
this.propagateChange(tags);
}
handleBlur(event, keepFocus = true) {
handleBlur(keepFocus = true) {
if (!this.typeahead.isPopupOpen()) {
this.addTag(this.tag, keepFocus);
} else {
@@ -89,6 +89,7 @@ export class TagInputComponent implements ControlValueAccessor {
this.tag = '';
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
propagateChange = (_: any) => {
};

View File

@@ -1,4 +1,4 @@
<div class="timespan p-1" (window:resize)="handleResize($event)">
<div class="timespan p-1" (window:resize)="handleResize()">
<div (click)="handleClick()">{{caption}}</div>
<ng-template #popoverContent let-caption="popoverCaption">{{caption}}</ng-template>
<div class="popover-anchor" [style.left.px] = "startPopoverLeft" [ngbPopover]="popoverContent" #popoverStart="ngbPopover">&nbsp;</div>
@@ -17,13 +17,13 @@
<option value="8">Year</option>
</select>
</div> -->
<div class="timeline" (window:mousemove)="handleMouseMove($event)" (window:touchmove)="handleMouseMove($event)" (window:mouseup)="handleMouseUp($event)" (window:touchend)="handleMouseUp($event)" (wheel)="handleMouseWheel($event)" [style.height.px]="height">
<canvas #timeLine (mousedown)="handleViewPanMouseDown($event)" (touchstart)="handleViewPanMouseDown($event)" (mousemove)="handleCanvasMouseMove($event)" (mouseleave)="handleCanvasMouseLeave($event)">
<div class="timeline" (window:mousemove)="handleMouseMove($event)" (window:touchmove)="handleMouseMove($event)" (window:mouseup)="handleMouseUp()" (window:touchend)="handleMouseUp()" (wheel)="handleMouseWheel($event)" [style.height.px]="height">
<canvas #timeLine (mousedown)="handleViewPanMouseDown($event)" (touchstart)="handleViewPanMouseDown($event)" (mousemove)="handleCanvasMouseMove($event)" (mouseleave)="handleCanvasMouseLeave()">
</canvas>
<div class="control-container" [style.margin-left.px]="marginLeft" [style.height.px]="lineHeight" >
<div class="leftGrip rounded-start" (mousedown)="handleLeftGripMouseDown($event)" (touchstart)="handleLeftGripMouseDown($event)" (mouseenter)="handleLeftGripMouseEnter($event)" (mouseleave)="handleLeftGripMouseLeave($event)"><i class="fal fa-ellipsis-v" aria-hidden="true"></i></div>
<div class="range" [style.width.px]="rangeWidth" (mousedown)="handleRangeGripMouseDown($event)" (touchstart)="handleRangeGripMouseDown($event)" (mouseenter)="handleRangeGripMouseEnter($event)"></div>
<div class="rightGrip rounded-end" (mousedown)="handleRightGripMouseDown($event)" (touchstart)="handleRightGripMouseDown($event)" (mouseenter)="handleRightGripMouseEnter($event)" (mouseleave)="handleRightGripMouseLeave($event)"><i class="fal fa-ellipsis-v" aria-hidden="true"></i></div>
<div class="leftGrip rounded-start" (mousedown)="handleLeftGripMouseDown($event)" (touchstart)="handleLeftGripMouseDown($event)" (mouseenter)="handleLeftGripMouseEnter()" (mouseleave)="handleLeftGripMouseLeave()"><i class="fal fa-ellipsis-v" aria-hidden="true"></i></div>
<div class="range" [style.width.px]="rangeWidth" (mousedown)="handleRangeGripMouseDown($event)" (touchstart)="handleRangeGripMouseDown($event)" (mouseenter)="handleRangeGripMouseEnter()"></div>
<div class="rightGrip rounded-end" (mousedown)="handleRightGripMouseDown($event)" (touchstart)="handleRightGripMouseDown($event)" (mouseenter)="handleRightGripMouseEnter()" (mouseleave)="handleRightGripMouseLeave()"><i class="fal fa-ellipsis-v" aria-hidden="true"></i></div>
</div>
</div>
<!-- <div>

View File

@@ -1,6 +1,6 @@
import { Component, OnInit,Input,ViewChild,OnChanges,ChangeDetectorRef,Output, EventEmitter,SimpleChanges } from '@angular/core';
import { DatePipe } from '@angular/common';
import {NgbPopover} from '@ng-bootstrap/ng-bootstrap';
import { ChangeDetectorRef, Component, EventEmitter, Input, OnChanges, OnInit, Output, ViewChild } from '@angular/core';
import { NgbPopover } from '@ng-bootstrap/ng-bootstrap';
export interface TimeSpan {
startDate:Date;
@@ -73,7 +73,8 @@ export class TimespanComponent implements OnInit, OnChanges {
canvas.width = this.elementWidth * this.ratio;
}
getPosibleUnits(scale:number):number[] {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
getPosibleUnits(_scale:number):number[] {
const posibleUnits = [];
for(const u of [3,4,6,8]) {
if((this.unitScale <=u) )
@@ -119,7 +120,6 @@ export class TimespanComponent implements OnInit, OnChanges {
}
getStartEndCaption(date:Date,otherDate:Date,unitScale:number,suffix = false,extended=true):string {
const showSuffix = false;
otherDate=new Date(otherDate.getTime()-1); // fix year edge case
if(unitScale == 3) {
let format="HH:00";
@@ -234,9 +234,6 @@ export class TimespanComponent implements OnInit, OnChanges {
}
getNextTick(viewStartDate:Date, tick:number,step:number,unitScale:number):number {
const unitTextWidth = this.getUnitTextWidth(unitScale);
const dateOffset =this.getUnitDateOffset(viewStartDate,unitScale,tick);
const date = new Date(viewStartDate.getTime() + dateOffset);
let nextTick=tick+step+Math.trunc(step/2);
const nextDateOffset =this.getUnitDateOffset(viewStartDate,unitScale,nextTick);
const nextDate = new Date(viewStartDate.getTime() + nextDateOffset);
@@ -347,7 +344,8 @@ export class TimespanComponent implements OnInit, OnChanges {
this.caption=this.getCaption(startDate,endDate,this.unitScale);
}
snapToUnit(date:Date,unitScale:number):Date {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
snapToUnit(date:Date,_unitScale:number):Date {
const d = new Date(date.getTime() + (this.unitScales[this.unitScale]/2));
const offsetInMilliseconds =this.getUnitDateOffset(d,this.unitScale,0)
return new Date(d.getTime()+offsetInMilliseconds);
@@ -417,14 +415,14 @@ export class TimespanComponent implements OnInit, OnChanges {
event.preventDefault();
}
handleRightGripMouseEnter(event:MouseEvent) {
handleRightGripMouseEnter() {
this.mouseX=-1;
this.mouseY=-1;
this.redraw();
if(!this.rangeGripMove && !this.leftGripMove && !this.rightGripMove) this.popoverEnd.open(this.endCaption);
}
handleRightGripMouseLeave(event:MouseEvent) {
handleRightGripMouseLeave() {
if(!this.rightGripMove) this.popoverEnd.close();
}
@@ -435,18 +433,18 @@ export class TimespanComponent implements OnInit, OnChanges {
event.preventDefault();
}
handleLeftGripMouseEnter(event:MouseEvent|TouchEvent) {
handleLeftGripMouseEnter() {
this.mouseX=-1;
this.mouseY=-1;
this.redraw();
if(!this.rangeGripMove && !this.leftGripMove && !this.rightGripMove) this.popoverStart.open(this.startCaption);
}
handleLeftGripMouseLeave(event:MouseEvent) {
handleLeftGripMouseLeave() {
if(!this.leftGripMove) this.popoverStart.close();
}
handleRangeGripMouseEnter(event:MouseEvent) {
handleRangeGripMouseEnter() {
this.mouseX=-1;
this.mouseY=-1;
this.redraw();
@@ -464,7 +462,7 @@ export class TimespanComponent implements OnInit, OnChanges {
event.preventDefault();
}
handleMouseUp(event:MouseEvent|TouchEvent) {
handleMouseUp() {
//this.updateControl(event);
this.startDate = this.getStartDate(this.lastOffsetInPixels);
this.endDate = this.getEndDate(this.lastOffsetInPixels);
@@ -498,7 +496,7 @@ export class TimespanComponent implements OnInit, OnChanges {
this.redraw();
}
handleCanvasMouseLeave(event:MouseEvent) {
handleCanvasMouseLeave() {
this.mouseX = -1;
this.mouseY = -1;
this.redraw();
@@ -510,7 +508,6 @@ export class TimespanComponent implements OnInit, OnChanges {
return true;
} else {
nextScale*=1.1;
const canZoom=false;
const oneUnit = (this.getUnitDateOffset(this.viewMinDate,8,1)- this.getUnitDateOffset(this.viewMinDate,8,0)) / nextScale;
const unitTextWidth=this.getUnitTextWidth(8);
const steps=this.getSteps(8);
@@ -565,7 +562,7 @@ export class TimespanComponent implements OnInit, OnChanges {
this.updateStyle(this.startDate,this.endDate);
}
handleResize(event:any) {
handleResize() {
if(this.initialized) {
this.setCanvasSize();
this.updateStyle(this.startDate,this.endDate);
@@ -573,7 +570,7 @@ export class TimespanComponent implements OnInit, OnChanges {
}
}
ngOnChanges (changes: SimpleChanges) {
ngOnChanges() {
if(this.initialized) {
this.setCanvasSize();
this.updateStyle(this.startDate,this.endDate);

View File

@@ -20,7 +20,7 @@ export class AppCommonEffects {
login$ = createEffect(() => this.actions$.pipe(
ofType(appCommonActions.LOGIN),
withLatestFrom(this.store$.select(appCommonReducers.selectGetInitialized)),
mergeMap(([action, initialized]) => {
mergeMap(([action]) => {
const a = (action as appCommonActions.Login);
this.oauthService$.initCodeFlow(a.url,{"prompt":"login"});
return [];
@@ -28,14 +28,14 @@ export class AppCommonEffects {
logout$ = createEffect(() => this.actions$.pipe(
ofType(appCommonActions.LOGOUT),
mergeMap((action) => {
mergeMap(() => {
this.oauthService$.revokeTokenAndLogout();
return [];
})),{dispatch:false});
loadItemTypes$ = createEffect(() => this.actions$.pipe(
ofType(appCommonActions.LOADITEMTYPES),
switchMap((action) => {
switchMap(() => {
return this.itemService$.getItemTypes().pipe(
map((itemTypes: IItemTypes) => new appCommonActions.LoadItemTypesSuccess(itemTypes)),
catchError(error => of(new appCommonActions.Fail(error))))
@@ -45,7 +45,7 @@ export class AppCommonEffects {
initUser$ = createEffect(() => this.actions$.pipe(
ofType(appCommonActions.INITUSER),
first(),
switchMap((action) => {
switchMap(() => {
return zip(this.userService$.getCurrentUser(),from(this.oauthService$.loadUserProfile())).pipe(
switchMap(([user,userInfo]) => {return of(new appCommonActions.InitUserSuccess(user,userInfo as UserInfo))} ),
catchError(error => of(new appCommonActions.Fail(error))))
@@ -85,7 +85,7 @@ export class AppCommonEffects {
initUserSettingsRoot$ = createEffect(() => this.actions$.pipe(
ofType(appCommonActions.INITUSERSETTINGSROOT),
switchMap(_ => {
switchMap(() => {
return this.folderService$.getFolder('my_settings').pipe(
switchMap((item) => of(new appCommonActions.InitUserSettingsRootSuccess(item))),
catchError(error => of(new appCommonActions.Fail(error)))
@@ -134,10 +134,10 @@ export class AppCommonEffects {
withLatestFrom(this.store$.select(appCommonReducers.selectGetItemTypes)),
switchMap(([action, itemtypes]) => {
const a = action as appCommonActions.EditItem;
var editor = "property";
let editor = "property";
if(a.item.itemType) {
const itemType = itemtypes[a.item.itemType];
var editor = itemType && itemType.editor ? itemType.editor : editor;
editor = itemType && itemType.editor ? itemType.editor : editor;
}
this.router$.navigate(['/editor',editor,'item', a.item.code])
return [];
@@ -179,15 +179,14 @@ export class AppCommonEffects {
fail$ = createEffect(() => this.actions$.pipe(
ofType(appCommonActions.FAIL),
map((action) => {
const failAction = action as appCommonActions.Fail;
map(() => {
//console.debug(failAction.payload)
return null;
})),{dispatch:false});
online$ = createEffect(() => this.actions$.pipe(
ofType(appCommonActions.ONLINE),
switchMap((action) => {
switchMap(() => {
//console.debug("Online: Check token");
if(!this.oauthService$.hasValidAccessToken()) {
//console.debug("No valid token, try to refresh");

View File

@@ -1,14 +1,14 @@
import { createFeatureSelector, createSelector } from '@ngrx/store';
import { tassign } from 'tassign';
import { IItemTypes} from '../models/item.types';
import { IListItem } from '../models/list.item';
import { IUser } from '../models/user';
import { IPackage,IPackageMap,IPackages} from '../models/package';
import * as appCommonActions from '../actions/app-common.actions';
import { createSelector, createFeatureSelector, ActionReducerMap } from '@ngrx/store';
import { IItemTypes } from '../models/item.types';
import { IListItem } from '../models/list.item';
import { IPackageMap, IPackages } from '../models/package';
import { IUser } from '../models/user';
import { MODULE_NAME } from '../module-name';
import { IItem } from '../models/item';
import {getValidPackages, isValidPackage} from '../services/package.service';
import { MODULE_NAME } from '../module-name';
import { getValidPackages } from '../services/package.service';
export interface State {
openedModalName: string,

View File

@@ -1,15 +1,14 @@
import { HttpClient, HttpParams } from "@angular/common/http";
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { IItem } from '../models/item';
import { HttpClient, HttpParams } from "@angular/common/http";
import { AppConfig } from "../shared/app.config";
import {ItemTypeService} from './itemtype.service';
@Injectable({
providedIn: 'root',
})
export class AdminService {
constructor(public httpClient: HttpClient, public appConfig: AppConfig,private itemTypeService:ItemTypeService) {
constructor(public httpClient: HttpClient, public appConfig: AppConfig) {
}
ApiEndpoint() {

View File

@@ -1,21 +1,14 @@
import { Injectable } from '@angular/core';
import { Router, Route, ActivatedRouteSnapshot, RouterStateSnapshot, UrlSegment, UrlTree } from '@angular/router';
import { Store } from '@ngrx/store';
import { ActivatedRouteSnapshot, Route, RouterStateSnapshot, UrlSegment, UrlTree } from '@angular/router';
import { OAuthService } from 'angular-oauth2-oidc';
import { Observable } from 'rxjs';
import * as appCommonReducer from '../reducers/app-common.reducer';
@Injectable({
providedIn: 'root',
})
export class AuthGuard {
constructor(private oauthService: OAuthService, private router: Router, private store: Store<appCommonReducer.State>) { }
constructor(private oauthService: OAuthService) { }
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | UrlTree | Observable<boolean | UrlTree> | Promise<boolean | UrlTree> {
//console.debug("AuthGuard->canActivate", route, state);
@@ -31,7 +24,8 @@ export class AuthGuard {
return this.checkLogin(url, childRoute);
}
canLoad(route: Route, segments: UrlSegment[]): boolean | UrlTree | Observable<boolean | UrlTree> | Promise<boolean | UrlTree> {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
canLoad(route: Route, _segments: UrlSegment[]): boolean | UrlTree | Observable<boolean | UrlTree> | Promise<boolean | UrlTree> {
//console.debug("AuthGuard->canLoad", route, segments);
return this.checkLogin(route.path, null);
}

View File

@@ -1,4 +1,4 @@
import { Component, Injectable } from '@angular/core';
import { Injectable } from '@angular/core';
import { NgbDateAdapter, NgbDateStruct } from '@ng-bootstrap/ng-bootstrap';
@Injectable({

View File

@@ -1,15 +1,14 @@
import { HttpClient } from "@angular/common/http";
import { Injectable } from '@angular/core';
import { Observable, of } from 'rxjs';
import { IItem } from '../models/item';
import { HttpClient } from "@angular/common/http";
import { AppConfig } from "../shared/app.config";
import {ItemTypeService} from './itemtype.service';
@Injectable({
providedIn: 'root',
})
export class DownloadService {
constructor(public httpClient: HttpClient, public appConfig: AppConfig,private itemTypeService:ItemTypeService) {
constructor(public httpClient: HttpClient, public appConfig: AppConfig) {
}
ApiEndpoint() {

View File

@@ -1,8 +1,8 @@
import { Injectable } from '@angular/core';
import { IEventMessage } from '../models/event.message';
import { Subject, timer } from 'rxjs';
import { HttpTransportType, HubConnection, HubConnectionBuilder, HubConnectionState, LogLevel } from '@microsoft/signalr';
import { OAuthService } from 'angular-oauth2-oidc';
import { HubConnection, HubConnectionBuilder, LogLevel ,HttpTransportType,HubConnectionState} from '@microsoft/signalr';
import { Subject } from 'rxjs';
import { IEventMessage } from '../models/event.message';
import { AppConfig } from "../shared/app.config";
@@ -17,7 +17,7 @@ export class EventService {
public authenticated = false;
constructor(private oauthService: OAuthService, private appConfig: AppConfig) {
this._apiEndPoint = appConfig.getConfig("apiEndPoint");
this._apiEndPoint = this.appConfig.getConfig("apiEndPoint");
this._connection = new HubConnectionBuilder().withUrl(`${ this._apiEndPoint}/eventHub`,
{ transport: HttpTransportType.WebSockets,
// accessTokenFactory: () => {
@@ -28,7 +28,7 @@ export class EventService {
this._connection.on('event', eventMessage => {
this.event.next(eventMessage);
});
this._connection.onreconnected( event => {
this._connection.onreconnected(() => {
this.Authenticate();
});
this.Start();
@@ -42,7 +42,6 @@ export class EventService {
}
private Authenticate() {
const accessToken = this.oauthService.getAccessToken();
if (this.oauthService.hasValidAccessToken()) {
this._connection.send('authenticate', this.oauthService.getAccessToken());
this.authenticated=true;

View File

@@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/no-unused-vars */
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
@@ -12,7 +13,6 @@ import * as appCommonActions from '../actions/app-common.actions';
})
export class FullScreenGuard {
private loginDispatched = false;
constructor(private store: Store<appCommonReducer.State> ) { }
setFullScreen():boolean {
@@ -20,11 +20,11 @@ export class FullScreenGuard {
return true;
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
canActivate(_route: ActivatedRouteSnapshot, _state: RouterStateSnapshot): boolean {
return this.setFullScreen();
}
canActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
canActivateChild(_route: ActivatedRouteSnapshot, _state: RouterStateSnapshot): boolean {
return this.setFullScreen();
}
}

View File

@@ -1,7 +1,6 @@
import { HttpClient } from "@angular/common/http";
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { IUser } from '../models/user';
import { HttpClient,HttpHeaders } from "@angular/common/http";
import { AppConfig } from "../shared/app.config";
@Injectable({

View File

@@ -16,7 +16,7 @@ export class GradientService {
gd += `rgba(${gs.color.red},${gs.color.green},${gs.color.blue},${gs.color.alpha/255})`;
gd +=` ${gs.relativestop*100}%`
}
gradient.forEach((gs) => {
gradient.forEach(() => {
});
gd+=')"}';

View File

@@ -21,7 +21,7 @@ import { AppConfig } from "../shared/app.config";
check(interval:number): Observable<boolean> {
const retval = new BehaviorSubject<boolean>(true);
setInterval(() => {
this.httpClient.get(`${this.ApiEndpoint()}/api/v1/healthcheck`).pipe(map(() => true),catchError((error) => of(false))).toPromise().then((status) => {
this.httpClient.get(`${this.ApiEndpoint()}/api/v1/healthcheck`).pipe(map(() => true),catchError(() => of(false))).toPromise().then((status) => {
retval.next(status);
});
},interval);

View File

@@ -1,7 +1,5 @@
import { HttpClient } from "@angular/common/http";
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { IUser } from '../models/user';
import { HttpClient,HttpHeaders } from "@angular/common/http";
import { AppConfig } from "../shared/app.config";
@Injectable({

View File

@@ -1,16 +1,14 @@
import { HttpClient, HttpHeaders, HttpParams } from "@angular/common/http";
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { IItemType } from '../models/item.type';
import { IItemLinkType } from '../models/itemlink.type';
import { IUrlType } from '../models/url.type';
import { IItem } from '../models/item';
import { IJsonline } from '../models/json-line';
import { IItemType } from '../models/item.type';
import { IItemTask } from '../models/itemTask';
import { HttpClient, HttpParams,HttpHeaders } from "@angular/common/http";
import { IItemLinkType } from '../models/itemlink.type';
import { IJsonline } from '../models/json-line';
import { IListItem } from '../models/list.item';
import { AppConfig } from "../shared/app.config";
import {ItemTypeService} from './itemtype.service';
import {IListItem} from '../models/list.item';
import { ItemTypeService } from './itemtype.service';
@Injectable({
providedIn: 'root',

View File

@@ -63,7 +63,7 @@ export class ItemTypeService {
this.itemTypes = itemTypes;
//return data;
})
.catch(error => this.itemTypes = null);
.catch(() => this.itemTypes = null);
} else {
return new Promise<void>((resolve) => {resolve()});
}

View File

@@ -1,10 +1,11 @@
/* eslint-disable @typescript-eslint/no-unused-vars */
import { Injectable } from '@angular/core';
import { Route, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { Store } from '@ngrx/store';
import * as appCommonReducer from '../reducers/app-common.reducer'
import * as appCommonActions from '../actions/app-common.actions';
import * as appCommonReducer from '../reducers/app-common.reducer';
@Injectable({
@@ -12,7 +13,6 @@ import * as appCommonActions from '../actions/app-common.actions';
})
export class NavBarGuard {
private loginDispatched = false;
constructor(private store: Store<appCommonReducer.State>) { }
setNavBar():boolean {
@@ -20,11 +20,11 @@ export class NavBarGuard {
return true;
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
canActivate(_route: ActivatedRouteSnapshot, _state: RouterStateSnapshot): boolean {
return this.setNavBar();
}
canActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
canActivateChild(_route: ActivatedRouteSnapshot, _state: RouterStateSnapshot): boolean {
return this.setNavBar();
}
}

View File

@@ -9,7 +9,8 @@ export class PackageGuard {
constructor(private packageService: PackageService) { }
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
canActivate(route: ActivatedRouteSnapshot, _state: RouterStateSnapshot): boolean {
return route.data && route.data.package && this.hasPackageForRoute(route.data.package);
}

View File

@@ -1,14 +1,14 @@
import {Injectable} from '@angular/core';
import {Store} from '@ngrx/store';
import { Injectable } from '@angular/core';
import { Store } from '@ngrx/store';
import { IPackage, IPackages } from '../models/package';
import * as appCommonReducer from '../reducers/app-common.reducer';
import {IPackage, IPackages} from '../models/package';
import {IItem} from '../models/item';
import {IItemTask} from '../models/itemTask';
import {HttpClient} from '@angular/common/http';
import {AppConfig} from '../shared/app.config';
import {Observable,iif,of} from 'rxjs';
import {switchMap} from 'rxjs/operators';
import { HttpClient } from '@angular/common/http';
import { Observable, iif } from 'rxjs';
import { switchMap } from 'rxjs/operators';
import { IItem } from '../models/item';
import { IItemTask } from '../models/itemTask';
import { AppConfig } from '../shared/app.config';
@Injectable({
providedIn: 'root',

View File

@@ -31,10 +31,8 @@ export class SchemaService {
Observable<{schemaJson: any, schemaLayout: any}> {
return this.getSchema(schemaUrl).pipe(
switchMap(
schemaJson => this.getSchemaLayout(schemaUrl, locale)
.pipe(catchError(err => {
return of(undefined);
})),
() => this.getSchemaLayout(schemaUrl, locale)
.pipe(catchError(() => of(undefined))),
(schemaJson, schemaLayout) => {
return ({schemaJson, schemaLayout});
}

View File

@@ -1,4 +1,4 @@
import { Injectable, Query } from '@angular/core';
import { Injectable } from '@angular/core';
import { IQueryState } from '../models/query.state';
@Injectable({

View File

@@ -1,7 +1,5 @@
import { Injectable } from '@angular/core';
import { DatePipe } from '@angular/common';
import { Observable , Observer } from 'rxjs';
import { ITypeaheadItem } from '../models/typeahead.item';
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root',
@@ -14,7 +12,6 @@ export class TimespanService {
quarters: string[] = ['KW1', 'KW2', 'KW3', 'KW4'];
getStartEndCaption(date: Date, otherDate: Date, unitScale: number, suffix = false, extended = true): string {
const showSuffix = false;
otherDate = new Date(otherDate.getTime() - 1); // fix year edge case
if (unitScale == 3) {
let format = "HH:00";

View File

@@ -1,7 +1,7 @@
import { HttpClient } from "@angular/common/http";
import { Injectable } from '@angular/core';
import { Observable , Observer } from 'rxjs';
import { Observable } from 'rxjs';
import { ITypeaheadItem } from '../models/typeahead.item';
import { HttpClient, HttpParams } from "@angular/common/http";
import { AppConfig } from "../shared/app.config";
@Injectable({

View File

@@ -1,14 +1,14 @@
import {Injectable} from '@angular/core';
import {HttpClient} from '@angular/common/http';
import {Observable} from 'rxjs';
import {GeoJSON} from 'ol/format';
import {map, switchMap} from 'rxjs/operators';
import {getCenter} from 'ol/extent';
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import moment from 'moment';
import {AppConfig} from '../shared/app.config';
import {WeatherCurrentObservation} from '../models/weatherCurrentObservation';
import {IItem} from '../models/item';
import {HourlyWeatherData, WeatherData} from '../models/WeatherData';
import { getCenter } from 'ol/extent';
import { GeoJSON } from 'ol/format';
import { Observable } from 'rxjs';
import { map, switchMap } from 'rxjs/operators';
import { HourlyWeatherData, WeatherData } from '../models/WeatherData';
import { IItem } from '../models/item';
import { WeatherCurrentObservation } from '../models/weatherCurrentObservation';
import { AppConfig } from '../shared/app.config';
@Injectable({
providedIn: 'root',
@@ -49,7 +49,7 @@ export class WeatherService {
return this.getWeatherRange(centroid, startDateString, endDateString);
}
public getDailyHistoricalObservations(centroid: number[], startDate: string, endDate: string): Observable<HourlyWeatherData[]> {
public getDailyHistoricalObservations(centroid: number[], startDate: string): Observable<HourlyWeatherData[]> {
const endpoint = this.appConfig.getConfig('weatherApiEndPoint');
const apiKey = this.appConfig.getConfig('weatherApiKey');

View File

@@ -17,7 +17,7 @@ export class AccessTokenInterceptor implements HttpInterceptor {
private base: string;
constructor(private injector: Injector, private appConfig: AppConfig, @Inject(DOCUMENT) private document: any) {
this.base = document.location.href;
this.base = this.document.location.href;
}
hasAudience(url: string): boolean {

View File

@@ -1,14 +1,11 @@
import { Injector } from '@angular/core';
import { Location} from '@angular/common';
import { Router,UrlSerializer } from '@angular/router';
import { AuthConfig, OAuthService, OAuthErrorEvent, OAuthStorage } from 'angular-oauth2-oidc';
import { OAuthService, OAuthStorage } from 'angular-oauth2-oidc';
import { ItemTypeService } from '../services/itemtype.service';
import { AppConfig } from "./app.config";
import {ItemTypeService} from '../services/itemtype.service';
import { IAuthconfigFactory } from './authconfigFactory';
export function appConfigFactory(injector:Injector, appConfig: AppConfig, oauthService: OAuthService, authconfigFactory:IAuthconfigFactory,authStorage:OAuthStorage,itemtypeService:ItemTypeService): () => Promise<any> {
export function appConfigFactory(appConfig: AppConfig, oauthService: OAuthService, authconfigFactory:IAuthconfigFactory,authStorage:OAuthStorage,itemtypeService:ItemTypeService): () => Promise<any> {
return (): Promise<any> => {
return new Promise<void>((resolve,reject) => {
appConfig.load().then(() => {

View File

@@ -1,12 +1,11 @@
import {Inject, Injectable} from '@angular/core';
import { Location,PathLocationStrategy,LocationStrategy } from '@angular/common';
import {HttpClient, HttpXhrBackend} from '@angular/common/http';
import {Observable} from 'rxjs';
import { Location } from '@angular/common';
import { HttpClient, HttpXhrBackend } from '@angular/common/http';
import { Injectable } from '@angular/core';
@Injectable()
export class AppConfig {
private config: Object = null;
private config: object = null;
private httpClient: HttpClient;
constructor(xhrBackend: HttpXhrBackend,private location:Location) {
@@ -15,6 +14,7 @@ export class AppConfig {
}
public getConfig(key: any) {
// eslint-disable-next-line no-prototype-builtins
if (!this.config.hasOwnProperty(key)) {
console.error(`Config key ${key} not set`);
}
@@ -29,6 +29,6 @@ export class AppConfig {
this.config = data;
//return data;
})
.catch(error => this.config = null);
.catch(() => this.config = null);
}
}

View File

@@ -1,5 +1,5 @@
import {OAuthStorage} from 'angular-oauth2-oidc';
import {Inject, Injectable} from '@angular/core';
import { Injectable } from '@angular/core';
import { OAuthStorage } from 'angular-oauth2-oidc';
@Injectable()
export class SecureOAuthStorage extends OAuthStorage {

View File

@@ -22,7 +22,9 @@
"node_modules/@angular/*"
]
}
},
"noUnusedLocals": true,
"noUnusedParameters": true
},
"angularCompilerOptions": {
"skipTemplateCodegen": true,

View File

@@ -22,7 +22,9 @@
"node_modules/@angular/*"
]
}
},
"noUnusedLocals": true,
"noUnusedParameters": true
},
"angularCompilerOptions": {
"skipTemplateCodegen": true,