\r\n \r\n","import { Component, OnInit } from '@angular/core';\r\nimport { AuthguardGuard } from 'src/app/guards/authguard.guard';\r\nimport { AuthService } from 'src/app/services/auth/auth.service';\r\nimport { Input } from '@angular/core';\r\n\r\n\r\n@Component({\r\n selector: 'app-side-navbar',\r\n templateUrl: './side-navbar.component.html',\r\n styleUrls: ['./side-navbar.component.scss']\r\n \r\n})\r\nexport class SideNavbarComponent implements OnInit {\r\n showInvoiceDropdown: boolean = false;\r\n showTariffsDropdown: boolean = false;\r\n showCompaniesDropdown: boolean = false;\r\n showMapsDropdown: boolean = false;\r\n showKeyFobAddressRequestDropdown: boolean = false;\r\n name: string = '';\r\n userRole: string = '';\r\n\r\n constructor(public authGuard: AuthguardGuard, public authService: AuthService) { }\r\n\r\n ngOnInit(): void {\r\n this.name = this.authService.user.name.replace('_', ' ');\r\n if(this.authService.user.roles.includes('ROLE_MODERATOR')) {\r\n this.userRole = 'Admin';\r\n document.getElementById('nameColour').style.backgroundColor = '#ff2222';\r\n document.getElementById('roleBgColour').style.backgroundColor = '#bb0000';\r\n } else if(this.authService.user.roles.includes('ROLE_SALES')) {\r\n this.userRole = 'Sales';\r\n }\r\n }\r\n\r\n invoicesDropdown() {\r\n this.showInvoiceDropdown = !this.showInvoiceDropdown;\r\n }\r\n\r\n tariffsDropdown() {\r\n this.showTariffsDropdown = !this.showTariffsDropdown;\r\n }\r\n\r\n companiesDropdown() {\r\n this.showCompaniesDropdown = !this.showCompaniesDropdown;\r\n }\r\n\r\n mapsDropdown() {\r\n this.showMapsDropdown = !this.showMapsDropdown;\r\n }\r\n\r\n keyFobAddressesRequestDropdown() {\r\n this.showKeyFobAddressRequestDropdown = !this.showKeyFobAddressRequestDropdown;\r\n }\r\n\r\n}\r\n","// This file can be replaced during build by using the `fileReplacements` array.\r\n// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`.\r\n// The list of file replacements can be found in `angular.json`.\r\n\r\nexport const environment = {\r\n production: false,\r\n apiUrl: 'https://localhost:8300'\r\n};\r\n\r\n/*\r\n * For easier debugging in development mode, you can import the following file\r\n * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`.\r\n *\r\n * This import should be commented out in production mode because it will have a negative impact\r\n * on performance if an error is thrown.\r\n */\r\n// import 'zone.js/dist/zone-error'; // Included with Angular CLI.\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\n\r\n@Component({\r\n selector: 'app-tab-navigator',\r\n templateUrl: './tab-navigator.component.html',\r\n styleUrls: ['./tab-navigator.component.scss']\r\n})\r\nexport class TabNavigatorComponent implements OnInit {\r\n @Input() mapType = \"charger-map\";\r\n constructor(private router: Router) { }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n onMapChange(e) {\r\n this.router.navigate([e.value]);\r\n }\r\n}\r\n","
\r\n Heatmap \r\n Charger Map \r\n \r\n","import { Injectable } from '@angular/core';\r\n\r\nconst TOKEN_KEY = 'auth-token';\r\nconst USER_KEY = 'auth-user';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class TokenStorageService {\r\n\r\n constructor() {}\r\n\r\n signOut(): void {\r\n window.sessionStorage.clear();\r\n }\r\n\r\n public saveToken(token: string): void {\r\n window.sessionStorage.removeItem(TOKEN_KEY);\r\n window.sessionStorage.setItem(TOKEN_KEY, token);\r\n }\r\n\r\n public getToken(): string | null {\r\n return window.sessionStorage.getItem(TOKEN_KEY);\r\n }\r\n\r\n public saveUser(user: any): void {\r\n window.sessionStorage.removeItem(USER_KEY);\r\n window.sessionStorage.setItem(USER_KEY, JSON.stringify(user));\r\n }\r\n\r\n public getUser(): any {\r\n const user = window.sessionStorage.getItem(USER_KEY);\r\n if (user) {\r\n return JSON.parse(user);\r\n }\r\n\r\n return {};\r\n }\r\n}\r\n","import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { EMPTY } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class HeatmapService {\r\n\r\n url: string = 'https://www.easygo-dev.com:8030/v1';\r\n\r\n url2: string = 'https://www.easygo-dev.com:8030/api';\r\n constructor(private http: HttpClient) { }\r\n\r\n esbData: Object;\r\n\r\n public getAllEsbChargingSessions() {\r\n try {\r\n return this.http.get
(this.url + '/getAllEsbSessions');\r\n } catch (error) {\r\n console.error(error);\r\n return EMPTY;\r\n }\r\n }\r\n\r\n public postZipFile(file: any) {\r\n const data = new FormData();\r\n data.append('zipFile', file);\r\n try {\r\n return this.http.post(`${this.url}/saveEsbSessions`, data);\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n\r\n getESBChargingSessionsWithinDateRange(dayRange: any) {\r\n try {\r\n let headers = new HttpHeaders();\r\n headers = headers\r\n .set('Accept', 'application/json')\r\n .set('Access-Control-Allow-Origin', '*')\r\n .set('Content-Type', 'application/json')\r\n .set('Access-Control-Allow-Methods', 'POST');\r\n let httpParams = new HttpParams().set('days', dayRange)\r\n const req = this.http.get(`${this.url}/getSpecificEsbSessionsDaily`,\r\n { headers: headers, params: httpParams, responseType: 'text' as 'json' });\r\n req.subscribe(response => {\r\n })\r\n } catch (error) {\r\n console.error(error);\r\n return EMPTY;\r\n }\r\n }\r\n\r\n getTimesAndSessionsPerSiteMonthly(monthlySessions) {\r\n try {\r\n let headers = new HttpHeaders();\r\n headers = headers\r\n .set('Accept', 'application/json')\r\n .set('Access-Control-Allow-Origin', 'https://www.easygo-dev.com')\r\n .set('Content-Type', 'application/json')\r\n .set('Access-Control-Allow-Methods', 'GET');\r\n\r\n\r\n let esbButtonContainer = document.getElementById('esbDataSubmit') as HTMLElement;\r\n if (document.getElementById('esbReturnedMessage') != null) {\r\n document.getElementById('esbReturnedMessage').remove();\r\n }\r\n let returnedMessageContainer = document.createElement('div');\r\n returnedMessageContainer.style.marginTop = '.6rem';\r\n returnedMessageContainer.style.opacity = '0';\r\n setTimeout(() => {\r\n returnedMessageContainer.style.opacity = '1';\r\n returnedMessageContainer.style.transition = '1.6s';\r\n }, 10);\r\n\r\n\r\n returnedMessageContainer.id = 'esbReturnedMessage';\r\n returnedMessageContainer.textContent = 'Please wait, this is a large dataset';\r\n esbButtonContainer.appendChild(returnedMessageContainer);\r\n\r\n const body = JSON.stringify(monthlySessions);\r\n return this.http.post(`${this.url}/getSessionsByMonths`,\r\n body,\r\n { headers: headers, responseType: 'json' })\r\n\r\n } catch (error) {\r\n console.error(error);\r\n return EMPTY;\r\n }\r\n\r\n }\r\n\r\n getMarkersPerSiteMonthly(monthlySessions) {\r\n try {\r\n let headers = new HttpHeaders();\r\n headers = headers\r\n .set('Accept', 'application/json')\r\n .set('Access-Control-Allow-Origin', 'https://www.easygo-dev.com')\r\n .set('Content-Type', 'application/json')\r\n .set('Access-Control-Allow-Methods', 'GET');\r\n\r\n\r\n const body = JSON.stringify(monthlySessions);\r\n return this.http.post(`${this.url}/getSessionsByMonths`,\r\n body,\r\n { headers: headers, responseType: 'json' })\r\n\r\n } catch (error) {\r\n console.error(error);\r\n return EMPTY;\r\n }\r\n\r\n }\r\n\r\n getLocations() {\r\n try {\r\n let headers = new HttpHeaders();\r\n headers = headers\r\n .set('Accept', 'application/json')\r\n .set('Access-Control-Allow-Origin', 'https://www.easygo-dev.com')\r\n .set('Content-Type', 'application/json')\r\n .set('Access-Control-Allow-Methods', 'GET');\r\n\r\n return this.http.post(`${this.url2}/getEasyGoLocations`, {}, \r\n { headers: headers, responseType: 'json' })\r\n } catch (error) {\r\n }\r\n }\r\n\r\n getAllLocations() {\r\n try {\r\n let headers = new HttpHeaders();\r\n headers = headers\r\n .set('Accept', 'application/json')\r\n .set('Access-Control-Allow-Origin', 'https://www.easygo-dev.com')\r\n .set('Content-Type', 'application/json')\r\n .set('Access-Control-Allow-Methods', 'GET');\r\n\r\n return this.http.get(`${this.url2}/getEasyGoLocations`, \r\n { headers: headers, responseType: 'json' })\r\n } catch (error) {\r\n }\r\n }\r\n\r\n getLocationsWithFilter(data) {\r\n try {\r\n let headers = new HttpHeaders();\r\n headers = headers\r\n .set('Accept', 'application/json')\r\n .set('Access-Control-Allow-Origin', 'https://www.easygo-dev.com')\r\n .set('Content-Type', 'application/json')\r\n .set('Access-Control-Allow-Methods', 'GET');\r\n\r\n let url = `${this.url2}/getEasyGoLocations`;\r\n\r\n return this.http.post(url, data,\r\n { headers: headers, responseType: 'json' })\r\n } catch (error) {\r\n }\r\n }\r\n\r\n getIonityLocations(data) {\r\n try {\r\n let headers = new HttpHeaders();\r\n headers = headers\r\n .set('Accept', 'application/json')\r\n .set('Access-Control-Allow-Origin', 'https://www.easygo-dev.com')\r\n .set('Content-Type', 'application/json')\r\n .set('Access-Control-Allow-Methods', 'GET');\r\n\r\n let url = `${this.url2}/getIonityLocations`;\r\n\r\n\r\n return this.http.post(url, \r\n data,\r\n { headers: headers, responseType: 'json' })\r\n } catch (error) {\r\n }\r\n }\r\n\r\n getTeslaLocations(data) {\r\n try {\r\n let headers = new HttpHeaders();\r\n headers = headers\r\n .set('Accept', 'application/json')\r\n .set('Access-Control-Allow-Origin', 'https://www.easygo-dev.com')\r\n .set('Content-Type', 'application/json')\r\n .set('Access-Control-Allow-Methods', 'GET');\r\n\r\n let url = `${this.url2}/getTeslaLocations`;\r\n\r\n return this.http.post(url, \r\n data,\r\n { headers: headers, responseType: 'json' })\r\n } catch (error) {\r\n }\r\n }\r\n\r\n getESBLocations(data) {\r\n try {\r\n let headers = new HttpHeaders();\r\n headers = headers\r\n .set('Accept', 'application/json')\r\n .set('Access-Control-Allow-Origin', 'https://www.easygo-dev.com')\r\n .set('Content-Type', 'application/json')\r\n .set('Access-Control-Allow-Methods', 'GET');\r\n\r\n let url = `${this.url2}/getEsbLocations`;\r\n\r\n return this.http.post(url, \r\n data,\r\n { headers: headers, responseType: 'json' })\r\n } catch (error) {\r\n }\r\n }\r\n\r\n getEirLocations(type: string) {\r\n try {\r\n let headers = new HttpHeaders();\r\n headers = headers\r\n .set('Accept', 'application/json')\r\n .set('Access-Control-Allow-Origin', 'https://www.easygo-dev.com')\r\n .set('Content-Type', 'application/json')\r\n .set('Access-Control-Allow-Methods', 'GET');\r\n\r\n return this.http.get(`${this.url2}/getEirLocations/${type}`, \r\n { headers: headers, responseType: 'json' })\r\n } catch (error) {\r\n }\r\n }\r\n\r\n getHeatmapSessions(data) {\r\n try {\r\n let headers = new HttpHeaders();\r\n headers = headers\r\n .set('Accept', 'application/json')\r\n .set('Access-Control-Allow-Origin', 'https://www.easygo-dev.com')\r\n .set('Content-Type', 'application/json')\r\n .set('Access-Control-Allow-Methods', 'GET');\r\n\r\n return this.http.post(`${this.url2}/getHeatmapSessions`, data,\r\n { headers: headers, responseType: 'json' })\r\n } catch (error) {\r\n }\r\n }\r\n\r\n getLocationMarker(data) {\r\n try {\r\n let headers = new HttpHeaders();\r\n headers = headers\r\n .set('Accept', 'application/json')\r\n .set('Access-Control-Allow-Origin', 'https://www.easygo-dev.com')\r\n .set('Content-Type', 'application/json')\r\n .set('Access-Control-Allow-Methods', 'GET');\r\n\r\n return this.http.post(`${this.url2}/getEasyGoSessions`, data,\r\n { headers: headers, responseType: 'json' })\r\n } catch (error) {\r\n }\r\n }\r\n\r\n getESBMarker(data) {\r\n try {\r\n let headers = new HttpHeaders();\r\n headers = headers\r\n .set('Accept', 'application/json')\r\n .set('Access-Control-Allow-Origin', 'https://www.easygo-dev.com')\r\n .set('Content-Type', 'application/json')\r\n .set('Access-Control-Allow-Methods', 'GET');\r\n\r\n return this.http.post(`${this.url2}/getEsbSessions`, data,\r\n { headers: headers, responseType: 'json' })\r\n } catch (error) {\r\n }\r\n }\r\n\r\n getCounts(data) {\r\n try {\r\n let headers = new HttpHeaders();\r\n headers = headers\r\n .set('Accept', 'application/json')\r\n .set('Access-Control-Allow-Origin', 'https://www.easygo-dev.com')\r\n .set('Content-Type', 'application/json')\r\n .set('Access-Control-Allow-Methods', 'GET');\r\n\r\n return this.http.post(`${this.url2}/getEasyGoSessionsCounts`, data,\r\n { headers: headers, responseType: 'json' })\r\n } catch (error) {\r\n }\r\n }\r\n\r\n getChartData(data) {\r\n try {\r\n let headers = new HttpHeaders();\r\n headers = headers\r\n .set('Accept', 'application/json')\r\n .set('Access-Control-Allow-Origin', 'https://www.easygo-dev.com')\r\n .set('Content-Type', 'application/json')\r\n .set('Access-Control-Allow-Methods', 'GET');\r\n\r\n return this.http.post(`${this.url2}/getEasyGoSessionsChartData`, data,\r\n { headers: headers, responseType: 'json' })\r\n } catch (error) {\r\n }\r\n }\r\n\r\n\r\n}\r\n\r\n","export class CompanyCrudUtils {\r\n\r\n createMinusButton(): Element {\r\n \r\n let minusButton = document.createElement('button');\r\n minusButton.className = 'fa fa-minus';\r\n minusButton.id = 'minusId';\r\n minusButton.onclick = () => {\r\n \r\n let tableRows = document.querySelector('table').querySelectorAll('tr');\r\n for(let row = 0; row < tableRows.length; row++) {\r\n tableRows.item(row).id = `row_${row}`;\r\n }\r\n }\r\n \r\n minusButton.onmouseenter = () => {\r\n minusButton.style.backgroundColor = 'rgb(255 221 220 / 1)';\r\n minusButton.style.color = '#960000';\r\n }\r\n minusButton.onmouseleave = () => {\r\n minusButton.style.backgroundColor = 'red';\r\n minusButton.style.color = 'white';\r\n }\r\n \r\n minusButton.style.backgroundColor = 'red';\r\n return minusButton;\r\n }\r\n\r\n sortCompany(company: any) {\r\n company.sort((companyA, companyB) => {\r\n if(companyA.name.toLowerCase() < companyB.name.toLowerCase()) {\r\n return -1;\r\n }\r\n if(companyA.name.toLowerCase() > companyB.name.toLowerCase()) {\r\n return 1;\r\n }\r\n return 0\r\n });\r\n }\r\n}","import { Component, OnInit, ViewChild } from '@angular/core';\r\nimport { GoogleMap, MapInfoWindow, MapMarker } from '@angular/google-maps';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { Router } from '@angular/router';\r\nimport { HeatmapService } from 'src/app/services/heatmap-service/heatmap.service';\r\n\r\n@Component({\r\n selector: 'app-chargers-map-new',\r\n templateUrl: './chargers-map-new.component.html',\r\n styleUrls: ['./chargers-map-new.component.scss']\r\n})\r\nexport class ChargersMapNewComponent implements OnInit {\r\n @ViewChild('gMap', { static: false }) gMap: GoogleMap;\r\n @ViewChild(MapInfoWindow) infoWindow: MapInfoWindow;\r\n\r\n options: google.maps.MapOptions = {\r\n center: { lat: 53.355603353851706, lng: -8.208030896545232 },\r\n zoom: 7,\r\n minZoom: 7,\r\n styles: []\r\n };\r\n heatmapOptions = { radius: 5 };\r\n mapMarkers: any = [];\r\n currentZoomLevel = 7;\r\n isLoading: boolean;\r\n currentFilter: any;\r\n selectedMarker: any;\r\n hoveredMarker: any = {};\r\n\r\n constructor(private heatMapService: HeatmapService,\r\n private _snackBar: MatSnackBar,\r\n private router: Router) { }\r\n\r\n ngOnInit(): void {\r\n const today = new Date();\r\n const month = today.toLocaleString('en', { month: 'short' });\r\n const year = today.getFullYear();\r\n // this.getLocations({});\r\n // this.getIonityLocations({});\r\n }\r\n\r\n\r\n generateMarkers(res, icon, isEir = false) {\r\n const locations = res.locations;\r\n const mapMarkers = locations.map((location) => {\r\n location.lat = Number(location.latitude);\r\n location.lng = Number(location.longitude);\r\n if(isEir) {\r\n const customIcon = icon.replace(\"{eir-icon}\", location.status);\r\n location.options = {\r\n icon: customIcon\r\n }\r\n } else {\r\n if(location.friendlyCode.includes('EGO')) {\r\n const egoIcon = location.chargePointOwner === 'Client' ? 'easygo-client-marker' : 'easygo-marker';\r\n\r\n location.options = {\r\n icon: `../../../assets/${egoIcon}.png`\r\n }\r\n } else {\r\n location.options = {\r\n icon: icon\r\n }\r\n }\r\n \r\n }\r\n\r\n return location;\r\n });\r\n\r\n this.mapMarkers = [...this.mapMarkers, ...mapMarkers];\r\n }\r\n\r\n getMarkers(filter) {\r\n this.mapMarkers = [];\r\n this.currentFilter = filter;\r\n\r\n if(filter.charger.includes('EasyGo')) {\r\n this.getLocations(filter);\r\n } \r\n\r\n if(filter.charger.includes('Ionity')) {\r\n this.getIonityLocations(filter);\r\n }\r\n if(filter.charger.includes('Eir')) {\r\n this.getEirLocations(filter);\r\n } \r\n\r\n if(filter.charger.includes('Tesla')) {\r\n this.getTeslaLocations(filter);\r\n }\r\n\r\n if(filter.charger.includes(\"ESB\")) {\r\n this.getESBLocations(filter);\r\n }\r\n \r\n if(!filter.charger.length) {\r\n this.mapMarkers = [];\r\n this.selectedMarker = null;\r\n this.currentFilter = null;\r\n }\r\n }\r\n\r\n getLocations(data) {\r\n this.isLoading = true;\r\n const params = {\r\n chargeType: data.chargeType,\r\n accessType: data.accessType,\r\n chargePointOwnerType: data.chargePointOwnerType\r\n }\r\n this.heatMapService.getLocationsWithFilter(params).subscribe((res: any) => {\r\n\r\n if (res.locations.length) {\r\n this.generateMarkers(res, \"../../../assets/easygo-marker.png\");\r\n }\r\n else {\r\n this.isLoading = false;\r\n this.openSnackBar(\"No data found in the selected period\", \"Close\");\r\n }\r\n this.isLoading = false;\r\n }, (error) => {\r\n this.isLoading = false;\r\n this.openSnackBar(\"Something went wrong!\", \"Close\")\r\n })\r\n }\r\n\r\n getIonityLocations(data) {\r\n this.isLoading = true;\r\n const params = {\r\n chargeType: data.chargeType,\r\n accessType: data.accessType,\r\n chargePointOwnerType: data.chargePointOwnerType\r\n }\r\n this.heatMapService.getIonityLocations(params).subscribe((res: any) => {\r\n \r\n if (res.locations.length) {\r\n this.generateMarkers(res, \"../../../assets/ionity-marker.png\");\r\n }\r\n else {\r\n this.openSnackBar(\"No data found in the selected period\", \"Close\");\r\n }\r\n this.isLoading = false;\r\n }, (error) => {\r\n this.isLoading = false;\r\n this.openSnackBar(\"Something went wrong!\", \"Close\")\r\n })\r\n }\r\n\r\n getTeslaLocations(data) {\r\n this.isLoading = true;\r\n const params = {\r\n chargeType: data.chargeType,\r\n accessType: data.accessType,\r\n chargePointOwnerType: data.chargePointOwnerType\r\n }\r\n this.heatMapService.getTeslaLocations(params).subscribe((res: any) => {\r\n if (res.locations.length) {\r\n this.generateMarkers(res, \"../../../assets/tesla-marker.png\");\r\n }\r\n else {\r\n this.openSnackBar(\"No data found in the selected period\", \"Close\");\r\n }\r\n this.isLoading = false;\r\n }, (error) => {\r\n this.isLoading = false;\r\n this.openSnackBar(\"Something went wrong!\", \"Close\")\r\n })\r\n }\r\n\r\n getESBLocations(data) {\r\n this.isLoading = true;\r\n const params = {\r\n chargeType: data.chargeType,\r\n accessType: data.accessType,\r\n chargePointOwnerType: data.chargePointOwnerType\r\n }\r\n this.heatMapService.getESBLocations(params).subscribe((res: any) => {\r\n if (res.locations.length) {\r\n this.generateMarkers(res, \"../../../assets/esb-marker.png\");\r\n }\r\n else {\r\n this.openSnackBar(\"No data found in the selected period\", \"Close\");\r\n }\r\n this.isLoading = false;\r\n }, (error) => {\r\n this.isLoading = false;\r\n this.openSnackBar(\"Something went wrong!\", \"Close\")\r\n })\r\n }\r\n\r\n getEirLocations(data) {\r\n this.isLoading = true;\r\n this.heatMapService.getEirLocations(data.eirType.toString()).subscribe((res: any) => {\r\n\r\n if (res.locations.length) {\r\n this.generateMarkers(res, `../../../assets/eir/{eir-icon}.png`, true);\r\n }\r\n else {\r\n this.openSnackBar(\"No data found in the selected period\", \"Close\");\r\n }\r\n this.isLoading = false;\r\n }, (error) => {\r\n this.isLoading = false;\r\n this.openSnackBar(\"Something went wrong!\", \"Close\")\r\n })\r\n }\r\n\r\n\r\n zoomChange() {\r\n this.currentZoomLevel = this.gMap.getZoom();\r\n }\r\n\r\n openSnackBar(message: string, action: string) {\r\n this._snackBar.open(message, action, {\r\n duration: 5000\r\n });\r\n }\r\n\r\n openInfoWindow(markerEle: MapMarker, marker) {\r\n this.hoveredMarker = {...marker};\r\n this.infoWindow.open(markerEle);\r\n }\r\n\r\n closeInfoWindow() {\r\n this.hoveredMarker = {};\r\n this.infoWindow.close();\r\n }\r\n\r\n onMarkClick(e, marker) {\r\n this.selectedMarker = { ...marker };\r\n // marker.locationId = \"IE*EGO0526\";\r\n // this.router.navigate(['/chart'], {\r\n // queryParams: {\r\n // locationId: marker.locationId,\r\n // year: this.currentFilter.year,\r\n // months: this.currentFilter.months.toString(),\r\n // charger: 'DC'\r\n // }\r\n // })\r\n // console.log(\"MARK CLIENT\", marker);\r\n }\r\n\r\n\r\n}\r\n","\r\n \r\n
\r\n\r\n\r\n
\r\n \r\n \r\n \r\n \r\n \r\n {{ hoveredMarker.friendlyName || hoveredMarker.address }} \r\n \r\n \r\n \r\n
\r\n \r\n
\r\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { EMPTY } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class RegistrationFormService {\r\n\r\n url: string = 'https://www.easygo-dev.com:8081/v1/'; // production\r\n // url: string = 'https://localhost:8081/v1/'; // development\r\n\r\n\r\n\r\n returnedMessage: string = '';\r\n userCreationCounter: number = 0;\r\n\r\n constructor(private http: HttpClient) {}\r\n\r\n postNewUsers(user: {}) {\r\n\r\n try {\r\n let headers = new HttpHeaders();\r\n headers = headers.set('Accept', 'application/json')\r\n .set('Content-Type', 'application/json')\r\n .set('Access-Control-Allow-Origin', 'https://www.easygo-dev.com')\r\n .set('Access-Control-Allow-Methods', 'POST');\r\n \r\n let body = JSON.stringify(user);\r\n const req = this.http.post(`${this.url}postUser/`, body, { headers: headers, responseType: 'json'});\r\n req.subscribe(data => {\r\n\r\n let message = document.createElement('div');\r\n message.textContent = data;\r\n message.style.opacity = '0';\r\n message.style.margin = '.25rem';\r\n setTimeout(() => {\r\n message.style.opacity = '1';\r\n message.style.transition = '.5s';\r\n }, 10);\r\n document.getElementById('returnedMessages').appendChild(message);\r\n this.userCreationCounter++;\r\n })\r\n } catch(error) {\r\n console.error(error);\r\n return EMPTY;\r\n }\r\n }\r\n}\r\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { EMPTY } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class TariffLocationsService {\r\n\r\n url:string = 'https://www.easygo-dev.com:8081/v1' // for production in digitalocean TODO: change url\r\n\r\n tariffLocationsList: any;\r\n responseMessage: string;\r\n\r\n constructor(private http: HttpClient) { }\r\n\r\n public getAllTariffLocations() {\r\n try {\r\n return this.http.get(`${this.url}/tariffLocations`)\r\n } catch (error) {\r\n console.error(error);\r\n return EMPTY;\r\n }\r\n }\r\n\r\n public getAllCompanies() {\r\n try {\r\n return this.http.get(`${this.url}/companies`)\r\n } catch (error) {\r\n console.error(error());\r\n return EMPTY;\r\n }\r\n }\r\n\r\n public postTariffLocations(tariffLocationsObject: any) {\r\n try { \r\n let headers = new HttpHeaders();\r\n headers = headers.set('Accept', 'application/json')\r\n .set('Content-Type', 'application/json')\r\n .set('Access-Control-Allow-Origin', '*')\r\n .set('Access-Control-Allow-Methods', 'POST');\r\n let body = `{\"tariffData\":${JSON.stringify(tariffLocationsObject)}}`;\r\n const req = this.http.post(`${this.url}/postLocationTariffs`, body, {headers: headers, responseType: 'json'});\r\n req.subscribe( (response) => {\r\n this.responseMessage = response;\r\n });\r\n\r\n } catch(error) {\r\n console.error(error);\r\n return EMPTY;\r\n }\r\n }\r\n\r\n}\r\n","var map = {\n\t\"./af\": \"K/tc\",\n\t\"./af.js\": \"K/tc\",\n\t\"./ar\": \"jnO4\",\n\t\"./ar-dz\": \"o1bE\",\n\t\"./ar-dz.js\": \"o1bE\",\n\t\"./ar-kw\": \"Qj4J\",\n\t\"./ar-kw.js\": \"Qj4J\",\n\t\"./ar-ly\": \"HP3h\",\n\t\"./ar-ly.js\": \"HP3h\",\n\t\"./ar-ma\": \"CoRJ\",\n\t\"./ar-ma.js\": \"CoRJ\",\n\t\"./ar-sa\": \"gjCT\",\n\t\"./ar-sa.js\": \"gjCT\",\n\t\"./ar-tn\": \"bYM6\",\n\t\"./ar-tn.js\": \"bYM6\",\n\t\"./ar.js\": \"jnO4\",\n\t\"./az\": \"SFxW\",\n\t\"./az.js\": \"SFxW\",\n\t\"./be\": \"H8ED\",\n\t\"./be.js\": \"H8ED\",\n\t\"./bg\": \"hKrs\",\n\t\"./bg.js\": \"hKrs\",\n\t\"./bm\": \"p/rL\",\n\t\"./bm.js\": \"p/rL\",\n\t\"./bn\": \"kEOa\",\n\t\"./bn-bd\": \"loYQ\",\n\t\"./bn-bd.js\": \"loYQ\",\n\t\"./bn.js\": \"kEOa\",\n\t\"./bo\": \"0mo+\",\n\t\"./bo.js\": \"0mo+\",\n\t\"./br\": \"aIdf\",\n\t\"./br.js\": \"aIdf\",\n\t\"./bs\": \"JVSJ\",\n\t\"./bs.js\": \"JVSJ\",\n\t\"./ca\": \"1xZ4\",\n\t\"./ca.js\": \"1xZ4\",\n\t\"./cs\": \"PA2r\",\n\t\"./cs.js\": \"PA2r\",\n\t\"./cv\": \"A+xa\",\n\t\"./cv.js\": \"A+xa\",\n\t\"./cy\": \"l5ep\",\n\t\"./cy.js\": \"l5ep\",\n\t\"./da\": \"DxQv\",\n\t\"./da.js\": \"DxQv\",\n\t\"./de\": \"tGlX\",\n\t\"./de-at\": \"s+uk\",\n\t\"./de-at.js\": \"s+uk\",\n\t\"./de-ch\": \"u3GI\",\n\t\"./de-ch.js\": \"u3GI\",\n\t\"./de.js\": \"tGlX\",\n\t\"./dv\": \"WYrj\",\n\t\"./dv.js\": \"WYrj\",\n\t\"./el\": \"jUeY\",\n\t\"./el.js\": \"jUeY\",\n\t\"./en-au\": \"Dmvi\",\n\t\"./en-au.js\": \"Dmvi\",\n\t\"./en-ca\": \"OIYi\",\n\t\"./en-ca.js\": \"OIYi\",\n\t\"./en-gb\": \"Oaa7\",\n\t\"./en-gb.js\": \"Oaa7\",\n\t\"./en-ie\": \"4dOw\",\n\t\"./en-ie.js\": \"4dOw\",\n\t\"./en-il\": \"czMo\",\n\t\"./en-il.js\": \"czMo\",\n\t\"./en-in\": \"7C5Q\",\n\t\"./en-in.js\": \"7C5Q\",\n\t\"./en-nz\": \"b1Dy\",\n\t\"./en-nz.js\": \"b1Dy\",\n\t\"./en-sg\": \"t+mt\",\n\t\"./en-sg.js\": \"t+mt\",\n\t\"./eo\": \"Zduo\",\n\t\"./eo.js\": \"Zduo\",\n\t\"./es\": \"iYuL\",\n\t\"./es-do\": \"CjzT\",\n\t\"./es-do.js\": \"CjzT\",\n\t\"./es-mx\": \"tbfe\",\n\t\"./es-mx.js\": \"tbfe\",\n\t\"./es-us\": \"Vclq\",\n\t\"./es-us.js\": \"Vclq\",\n\t\"./es.js\": \"iYuL\",\n\t\"./et\": \"7BjC\",\n\t\"./et.js\": \"7BjC\",\n\t\"./eu\": \"D/JM\",\n\t\"./eu.js\": \"D/JM\",\n\t\"./fa\": \"jfSC\",\n\t\"./fa.js\": \"jfSC\",\n\t\"./fi\": \"gekB\",\n\t\"./fi.js\": \"gekB\",\n\t\"./fil\": \"1ppg\",\n\t\"./fil.js\": \"1ppg\",\n\t\"./fo\": \"ByF4\",\n\t\"./fo.js\": \"ByF4\",\n\t\"./fr\": \"nyYc\",\n\t\"./fr-ca\": \"2fjn\",\n\t\"./fr-ca.js\": \"2fjn\",\n\t\"./fr-ch\": \"Dkky\",\n\t\"./fr-ch.js\": \"Dkky\",\n\t\"./fr.js\": \"nyYc\",\n\t\"./fy\": \"cRix\",\n\t\"./fy.js\": \"cRix\",\n\t\"./ga\": \"USCx\",\n\t\"./ga.js\": \"USCx\",\n\t\"./gd\": \"9rRi\",\n\t\"./gd.js\": \"9rRi\",\n\t\"./gl\": \"iEDd\",\n\t\"./gl.js\": \"iEDd\",\n\t\"./gom-deva\": \"qvJo\",\n\t\"./gom-deva.js\": \"qvJo\",\n\t\"./gom-latn\": \"DKr+\",\n\t\"./gom-latn.js\": \"DKr+\",\n\t\"./gu\": \"4MV3\",\n\t\"./gu.js\": \"4MV3\",\n\t\"./he\": \"x6pH\",\n\t\"./he.js\": \"x6pH\",\n\t\"./hi\": \"3E1r\",\n\t\"./hi.js\": \"3E1r\",\n\t\"./hr\": \"S6ln\",\n\t\"./hr.js\": \"S6ln\",\n\t\"./hu\": \"WxRl\",\n\t\"./hu.js\": \"WxRl\",\n\t\"./hy-am\": \"1rYy\",\n\t\"./hy-am.js\": \"1rYy\",\n\t\"./id\": \"UDhR\",\n\t\"./id.js\": \"UDhR\",\n\t\"./is\": \"BVg3\",\n\t\"./is.js\": \"BVg3\",\n\t\"./it\": \"bpih\",\n\t\"./it-ch\": \"bxKX\",\n\t\"./it-ch.js\": \"bxKX\",\n\t\"./it.js\": \"bpih\",\n\t\"./ja\": \"B55N\",\n\t\"./ja.js\": \"B55N\",\n\t\"./jv\": \"tUCv\",\n\t\"./jv.js\": \"tUCv\",\n\t\"./ka\": \"IBtZ\",\n\t\"./ka.js\": \"IBtZ\",\n\t\"./kk\": \"bXm7\",\n\t\"./kk.js\": \"bXm7\",\n\t\"./km\": \"6B0Y\",\n\t\"./km.js\": \"6B0Y\",\n\t\"./kn\": \"PpIw\",\n\t\"./kn.js\": \"PpIw\",\n\t\"./ko\": \"Ivi+\",\n\t\"./ko.js\": \"Ivi+\",\n\t\"./ku\": \"JCF/\",\n\t\"./ku.js\": \"JCF/\",\n\t\"./ky\": \"lgnt\",\n\t\"./ky.js\": \"lgnt\",\n\t\"./lb\": \"RAwQ\",\n\t\"./lb.js\": \"RAwQ\",\n\t\"./lo\": \"sp3z\",\n\t\"./lo.js\": \"sp3z\",\n\t\"./lt\": \"JvlW\",\n\t\"./lt.js\": \"JvlW\",\n\t\"./lv\": \"uXwI\",\n\t\"./lv.js\": \"uXwI\",\n\t\"./me\": \"KTz0\",\n\t\"./me.js\": \"KTz0\",\n\t\"./mi\": \"aIsn\",\n\t\"./mi.js\": \"aIsn\",\n\t\"./mk\": \"aQkU\",\n\t\"./mk.js\": \"aQkU\",\n\t\"./ml\": \"AvvY\",\n\t\"./ml.js\": \"AvvY\",\n\t\"./mn\": \"lYtQ\",\n\t\"./mn.js\": \"lYtQ\",\n\t\"./mr\": \"Ob0Z\",\n\t\"./mr.js\": \"Ob0Z\",\n\t\"./ms\": \"6+QB\",\n\t\"./ms-my\": \"ZAMP\",\n\t\"./ms-my.js\": \"ZAMP\",\n\t\"./ms.js\": \"6+QB\",\n\t\"./mt\": \"G0Uy\",\n\t\"./mt.js\": \"G0Uy\",\n\t\"./my\": \"honF\",\n\t\"./my.js\": \"honF\",\n\t\"./nb\": \"bOMt\",\n\t\"./nb.js\": \"bOMt\",\n\t\"./ne\": \"OjkT\",\n\t\"./ne.js\": \"OjkT\",\n\t\"./nl\": \"+s0g\",\n\t\"./nl-be\": \"2ykv\",\n\t\"./nl-be.js\": \"2ykv\",\n\t\"./nl.js\": \"+s0g\",\n\t\"./nn\": \"uEye\",\n\t\"./nn.js\": \"uEye\",\n\t\"./oc-lnc\": \"Fnuy\",\n\t\"./oc-lnc.js\": \"Fnuy\",\n\t\"./pa-in\": \"8/+R\",\n\t\"./pa-in.js\": \"8/+R\",\n\t\"./pl\": \"jVdC\",\n\t\"./pl.js\": \"jVdC\",\n\t\"./pt\": \"8mBD\",\n\t\"./pt-br\": \"0tRk\",\n\t\"./pt-br.js\": \"0tRk\",\n\t\"./pt.js\": \"8mBD\",\n\t\"./ro\": \"lyxo\",\n\t\"./ro.js\": \"lyxo\",\n\t\"./ru\": \"lXzo\",\n\t\"./ru.js\": \"lXzo\",\n\t\"./sd\": \"Z4QM\",\n\t\"./sd.js\": \"Z4QM\",\n\t\"./se\": \"//9w\",\n\t\"./se.js\": \"//9w\",\n\t\"./si\": \"7aV9\",\n\t\"./si.js\": \"7aV9\",\n\t\"./sk\": \"e+ae\",\n\t\"./sk.js\": \"e+ae\",\n\t\"./sl\": \"gVVK\",\n\t\"./sl.js\": \"gVVK\",\n\t\"./sq\": \"yPMs\",\n\t\"./sq.js\": \"yPMs\",\n\t\"./sr\": \"zx6S\",\n\t\"./sr-cyrl\": \"E+lV\",\n\t\"./sr-cyrl.js\": \"E+lV\",\n\t\"./sr.js\": \"zx6S\",\n\t\"./ss\": \"Ur1D\",\n\t\"./ss.js\": \"Ur1D\",\n\t\"./sv\": \"X709\",\n\t\"./sv.js\": \"X709\",\n\t\"./sw\": \"dNwA\",\n\t\"./sw.js\": \"dNwA\",\n\t\"./ta\": \"PeUW\",\n\t\"./ta.js\": \"PeUW\",\n\t\"./te\": \"XLvN\",\n\t\"./te.js\": \"XLvN\",\n\t\"./tet\": \"V2x9\",\n\t\"./tet.js\": \"V2x9\",\n\t\"./tg\": \"Oxv6\",\n\t\"./tg.js\": \"Oxv6\",\n\t\"./th\": \"EOgW\",\n\t\"./th.js\": \"EOgW\",\n\t\"./tk\": \"Wv91\",\n\t\"./tk.js\": \"Wv91\",\n\t\"./tl-ph\": \"Dzi0\",\n\t\"./tl-ph.js\": \"Dzi0\",\n\t\"./tlh\": \"z3Vd\",\n\t\"./tlh.js\": \"z3Vd\",\n\t\"./tr\": \"DoHr\",\n\t\"./tr.js\": \"DoHr\",\n\t\"./tzl\": \"z1FC\",\n\t\"./tzl.js\": \"z1FC\",\n\t\"./tzm\": \"wQk9\",\n\t\"./tzm-latn\": \"tT3J\",\n\t\"./tzm-latn.js\": \"tT3J\",\n\t\"./tzm.js\": \"wQk9\",\n\t\"./ug-cn\": \"YRex\",\n\t\"./ug-cn.js\": \"YRex\",\n\t\"./uk\": \"raLr\",\n\t\"./uk.js\": \"raLr\",\n\t\"./ur\": \"UpQW\",\n\t\"./ur.js\": \"UpQW\",\n\t\"./uz\": \"Loxo\",\n\t\"./uz-latn\": \"AQ68\",\n\t\"./uz-latn.js\": \"AQ68\",\n\t\"./uz.js\": \"Loxo\",\n\t\"./vi\": \"KSF8\",\n\t\"./vi.js\": \"KSF8\",\n\t\"./x-pseudo\": \"/X5v\",\n\t\"./x-pseudo.js\": \"/X5v\",\n\t\"./yo\": \"fzPg\",\n\t\"./yo.js\": \"fzPg\",\n\t\"./zh-cn\": \"XDpg\",\n\t\"./zh-cn.js\": \"XDpg\",\n\t\"./zh-hk\": \"SatO\",\n\t\"./zh-hk.js\": \"SatO\",\n\t\"./zh-mo\": \"OmwH\",\n\t\"./zh-mo.js\": \"OmwH\",\n\t\"./zh-tw\": \"kOpN\",\n\t\"./zh-tw.js\": \"kOpN\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"RnhZ\";","\r\n \r\n\r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n ","import { Component } from '@angular/core';\r\nimport { AuthguardGuard } from './guards/authguard.guard';\r\n\r\n@Component({\r\n selector: 'app-root',\r\n templateUrl: './app.component.html',\r\n styleUrls: ['./app.component.scss']\r\n})\r\nexport class AppComponent {\r\n isLoggedOn:boolean;\r\n title:string = 'Easy Go Client Side';\r\n\r\n constructor(public authGuard : AuthguardGuard) {}\r\n\r\n ngOnInit(): void {\r\n this.isLoggedOn = this.authGuard.isUserLoggedIn();\r\n }\r\n\r\n\r\n}\r\n","import { Component } from '@angular/core';\r\nimport * as XLSX from 'xlsx';\r\nimport * as moment from 'moment';\r\nimport { RegistrationFormService } from 'src/app/services/registration_form_service/registration-form.service';\r\n\r\n@Component({\r\n selector: 'app-registration-form',\r\n templateUrl: './registration-form.component.html',\r\n styleUrls: ['./registration-form.component.scss']\r\n})\r\nexport class RegistrationFormComponent {\r\n\r\n excelData: any;\r\n excelData2: any;\r\n usersNumber: number = 0;\r\n createButtonPressed: boolean = false;\r\n \r\n constructor(public registerFormService: RegistrationFormService) { }\r\n\r\n \r\n onFileChange(e : any) {\r\n const target : DataTransfer = (e.target);\r\n if (target.files.length !== 1) throw new Error('Cannot use multiple files!');\r\n const reader: FileReader = new FileReader();\r\n\r\n reader.onload = (event: any) => {\r\n const bStr: string = event.target.result;\r\n const wb: XLSX.WorkBook = XLSX.read(bStr, { type: 'binary'});\r\n const wsname = wb.SheetNames[1];\r\n const ws: XLSX.WorkSheet = wb.Sheets[wsname];\r\n this.excelData = (XLSX.utils.sheet_to_json(ws, {header: 1})) as any;\r\n\r\n const wsname2: string = wb.SheetNames[0];\r\n const ws2: XLSX.WorkSheet = wb.Sheets[wsname2];\r\n this.excelData2 = (XLSX.utils.sheet_to_json(ws2, {header: 1}))\r\n\r\n const companyName = this.excelData2[9];\r\n if(companyName[2] === undefined) {\r\n document.getElementById('companyNameWarning').style.display = 'block';\r\n document.getElementById('companyNameWarning').style.visibility = 'visible';\r\n\r\n } else {\r\n\r\n if(document.getElementById('companyNameWarning').style.display === 'block') {\r\n document.getElementById('companyNameWarning').style.display = 'none';\r\n }\r\n if(document.getElementById('companyNameWarning').style.visibility === 'visible') {\r\n document.getElementById('companyNameWarning').style.visibility = 'hidden';\r\n }\r\n\r\n let companyN: string = companyName[2];\r\n if(companyN !== undefined) {\r\n companyN = companyN.trim();\r\n }\r\n \r\n const companyNumber = this.excelData2[21];\r\n const companyNum: string = companyNumber[2];\r\n \r\n let fleetSubUsers = [];\r\n \r\n for (let i = 11; i < this.excelData.length; i++) {\r\n \r\n if(this.excelData[i][2] === undefined) {\r\n continue;\r\n } else {\r\n fleetSubUsers.push(this.excelData[i]);\r\n }\r\n }\r\n \r\n for (let i = 0; i < fleetSubUsers.length; i++) {\r\n if(fleetSubUsers[i][6] === false && fleetSubUsers[i][7] === false) {\r\n continue;\r\n } else {\r\n fleetSubUsers[i] = fleetSubUsers[i].splice(1, fleetSubUsers[i].length);\r\n fleetSubUsers[i][2] = fleetSubUsers[i][2].toString();\r\n }\r\n }\r\n \r\n \r\n const companyDetails = {\r\n name: companyN,\r\n companyNumber: companyNum,\r\n countryId: 140\r\n }\r\n this.populateTable(fleetSubUsers, companyDetails);\r\n }\r\n \r\n };\r\n\r\n reader.readAsBinaryString(target.files[0]);\r\n }\r\n\r\n populateTable(fleetUsers: [][], companyDetails: any) : void {\r\n\r\n // console.log(fleetUsers);\r\n\r\n for(let row = 0; row < fleetUsers.length; row++) {\r\n let tempNameArr = [];\r\n for(let col = 0; col < fleetUsers[row].length; col++) {\r\n let firstName = (fleetUsers[row][col] as string).split(' ')[0];\r\n let lastName = '';\r\n for(let i = 1; i < ((fleetUsers[row][col]) as string).split(' ').length; i++ ) {\r\n lastName += (fleetUsers[row][col] as string).split(' ')[i] + ' ';\r\n }\r\n lastName = lastName.trim();\r\n\r\n // Double first name checks\r\n if(lastName.startsWith('Jane')) {\r\n lastName = lastName.split('Jane')[1];\r\n firstName = firstName + ' ' + 'Jane';\r\n } else if(lastName.startsWith('John')) {\r\n lastName = lastName.split('John')[1];\r\n firstName = firstName + ' ' + 'John';\r\n } else if(lastName.startsWith('Jack')) {\r\n lastName = lastName.split('Jack')[1];\r\n firstName = firstName + ' ' + 'Jack';\r\n } else if(lastName.startsWith('Jon')) {\r\n lastName = lastName.split('Jon')[1];\r\n firstName = firstName + ' ' + 'Jon';\r\n } else if(lastName.startsWith('Jonny')) {\r\n lastName = lastName.split('Jonny')[1];\r\n firstName = firstName + ' ' + 'Jonny';\r\n } else if(lastName.startsWith('Johny')) {\r\n lastName = lastName.split('Johny')[1];\r\n firstName = firstName + ' ' + 'Johny';\r\n } else if(lastName.startsWith('Paul')) {\r\n lastName = lastName.split('Paul')[1];\r\n firstName = firstName + ' ' + 'Paul';\r\n } else if(lastName.startsWith('James')) {\r\n lastName = lastName.split('James')[1];\r\n firstName = firstName + ' ' + 'James';\r\n } else if(lastName.startsWith('Jamie')) {\r\n lastName = lastName.split('Jamie')[1];\r\n firstName = firstName + ' ' + 'Jamie';\r\n } else if(lastName.startsWith('Jimmy')) {\r\n lastName = lastName.split('Jimmy')[1];\r\n firstName = firstName + ' ' + 'Jimmy';\r\n } else if(lastName.startsWith('Jim')) {\r\n lastName = lastName.split('Jim')[1];\r\n firstName = firstName + ' ' + 'Jim';\r\n } else if(lastName.startsWith('Joe')) {\r\n lastName = lastName.split('Joe')[1];\r\n firstName = firstName + ' ' + 'Joe';\r\n } else if(lastName.startsWith('Joseph')) {\r\n lastName = lastName.split('Joseph')[1];\r\n firstName = firstName + ' ' + 'Joseph';\r\n } else if(lastName.startsWith('Mike')) {\r\n lastName = lastName.split('Mike')[1];\r\n firstName = firstName + ' ' + 'Mike';\r\n } else if(lastName.startsWith('Mic')) {\r\n lastName = lastName.split('Mic')[1];\r\n firstName = firstName + ' ' + 'Mic';\r\n } else if(lastName.startsWith('Mick')) {\r\n lastName = lastName.split('Mick')[1];\r\n firstName = firstName + ' ' + 'Mick';\r\n } else if(lastName.startsWith('Mark')) {\r\n lastName = lastName.split('Mark')[1];\r\n firstName = firstName + ' ' + 'Mark';\r\n } else if(lastName.startsWith('Markus')) {\r\n lastName = lastName.split('Markus')[1];\r\n firstName = firstName + ' ' + 'Markus';\r\n } else if(lastName.startsWith('Peter')) {\r\n lastName = lastName.split('Peter')[1];\r\n firstName = firstName + ' ' + 'Peter';\r\n } else if(lastName.startsWith('Pete')) {\r\n lastName = lastName.split('Pete')[1];\r\n firstName = firstName + ' ' + 'Pete';\r\n } else if(lastName.startsWith('Dave')) {\r\n lastName = lastName.split('Dave')[1];\r\n firstName = firstName + ' ' + 'Dave';\r\n } else if(lastName.startsWith('Brian')) {\r\n lastName = lastName.split('Brian')[1];\r\n firstName = firstName + ' ' + 'Brian';\r\n } else if(lastName.startsWith('Michael')) {\r\n lastName = lastName.split('Michael')[1];\r\n firstName = firstName + ' ' + 'Michael';\r\n } else if(lastName.startsWith('David')) {\r\n lastName = lastName.split('David')[1];\r\n firstName = firstName + ' ' + 'David';\r\n } else if(lastName.startsWith('Patrick')) {\r\n lastName = lastName.split('Patrick')[1];\r\n firstName = firstName + ' ' + 'Patrick';\r\n } else if(lastName.startsWith('Pat')) {\r\n lastName = lastName.split('Pat')[1];\r\n firstName = firstName + ' ' + 'Pat';\r\n } else if(lastName.startsWith('Paddy')) {\r\n lastName = lastName.split('Paddy')[1];\r\n firstName = firstName + ' ' + 'Paddy';\r\n }\r\n\r\n else if(lastName.startsWith('Grace')) {\r\n lastName = lastName.split('Grace')[1];\r\n firstName = firstName + ' ' + 'Grace';\r\n } else if(lastName.startsWith('Fiadh')) {\r\n lastName = lastName.split('Fiadh')[1];\r\n firstName = firstName + ' ' + 'Fiadh';\r\n } else if(lastName.startsWith('Emily')) {\r\n lastName = lastName.split('Emily')[1];\r\n firstName = firstName + ' ' + 'Emily';\r\n } else if(lastName.startsWith('Sarah')) {\r\n lastName = lastName.split('Sarah')[1];\r\n firstName = firstName + ' ' + 'Sarah';\r\n } else if(lastName.startsWith('Sara')) {\r\n lastName = lastName.split('Sara')[1];\r\n firstName = firstName + ' ' + 'Sara';\r\n } else if(lastName.startsWith('Ann')) {\r\n lastName = lastName.split('Ann')[1];\r\n firstName = firstName + ' ' + 'Ann';\r\n } else if(lastName.startsWith('Anne')) {\r\n lastName = lastName.split('Anne')[1];\r\n firstName = firstName + ' ' + 'Anne';\r\n } else if(lastName.startsWith('Lily')) {\r\n lastName = lastName.split('Lily')[1];\r\n firstName = firstName + ' ' + 'Lily';\r\n } else if(lastName.startsWith('Ellie')) {\r\n lastName = lastName.split('Ellie')[1];\r\n firstName = firstName + ' ' + 'Ellie';\r\n } else if(lastName.startsWith('Molly')) {\r\n lastName = lastName.split('Molly')[1];\r\n firstName = firstName + ' ' + 'Molly';\r\n } else if(lastName.startsWith('Katie')) {\r\n lastName = lastName.split('Katie')[1];\r\n firstName = firstName + ' ' + 'Katie';\r\n } else if(lastName.startsWith('Kate')) {\r\n lastName = lastName.split('Kate')[1];\r\n firstName = firstName + ' ' + 'Kate';\r\n } else if(lastName.startsWith('Alice')) {\r\n lastName = lastName.split('Alice')[1];\r\n firstName = firstName + ' ' + 'Alice';\r\n } else if(lastName.startsWith('Leah')) {\r\n lastName = lastName.split('Leah')[1];\r\n firstName = firstName + ' ' + 'Leah';\r\n } else if(lastName.startsWith('Ciara')) {\r\n lastName = lastName.split('Ciara')[1];\r\n firstName = firstName + ' ' + 'Ciara';\r\n }\r\n\r\n tempNameArr.push(firstName);\r\n tempNameArr.push(lastName);\r\n\r\n break;\r\n }\r\n fleetUsers[row] = (tempNameArr as any).concat(fleetUsers[row].splice(1, fleetUsers[row].length));\r\n }\r\n\r\n const tableContainer = document.getElementById('tableContainer');\r\n\r\n let table = document.createElement('table');\r\n table.style.backgroundColor = 'rgb(177, 177, 177)';\r\n table.style.opacity = '0';\r\n \r\n setTimeout(() => {\r\n table.style.transition = 'opacity 1s';\r\n table.style.opacity = '1';\r\n\r\n }, 10)\r\n\r\n tableContainer.appendChild(table);\r\n\r\n let firstNameHeaderCell = document.createElement('th');\r\n firstNameHeaderCell.style.backgroundColor = 'rgb(168, 202, 153)';\r\n firstNameHeaderCell.style.color = 'rgb(52, 52, 52)';\r\n firstNameHeaderCell.style.marginLeft = '0.3rem';\r\n firstNameHeaderCell.style.marginRight = '0.3rem';\r\n firstNameHeaderCell.style.paddingLeft = '0.3rem';\r\n firstNameHeaderCell.style.paddingRight = '0.3rem';\r\n firstNameHeaderCell.textContent = 'First Name';\r\n\r\n\r\n let lastNameHeaderCell = document.createElement('th');\r\n lastNameHeaderCell.textContent = 'Last Name';\r\n lastNameHeaderCell.style.backgroundColor = 'rgb(168, 202, 153)';\r\n lastNameHeaderCell.style.color = 'rgb(52, 52, 52)';\r\n lastNameHeaderCell.style.marginLeft = '0.3rem';\r\n lastNameHeaderCell.style.marginRight = '0.3rem';\r\n lastNameHeaderCell.style.paddingLeft = '0.3rem';\r\n lastNameHeaderCell.style.paddingRight = '0.3rem';\r\n\r\n let emailHeaderCell = document.createElement('th')\r\n emailHeaderCell.textContent = 'Email';\r\n emailHeaderCell.style.backgroundColor = 'rgb(168, 202, 153)';\r\n emailHeaderCell.style.color = 'rgb(52, 52, 52)';\r\n emailHeaderCell.style.marginLeft = '0.3rem';\r\n emailHeaderCell.style.marginRight = '0.3rem';\r\n emailHeaderCell.style.paddingLeft = '0.3rem';\r\n emailHeaderCell.style.paddingRight = '0.3rem';\r\n\r\n let phoneNumberHeaderCell = document.createElement('th');\r\n phoneNumberHeaderCell.textContent = 'Phone Number';\r\n phoneNumberHeaderCell.style.backgroundColor = 'rgb(168, 202, 153)';\r\n phoneNumberHeaderCell.style.color = 'rgb(52, 52, 52)';\r\n phoneNumberHeaderCell.style.marginLeft = '0.3rem';\r\n phoneNumberHeaderCell.style.marginRight = '0.3rem';\r\n phoneNumberHeaderCell.style.paddingLeft = '0.3rem';\r\n phoneNumberHeaderCell.style.paddingRight = '0.3rem';\r\n\r\n let countryHeaderCell = document.createElement('th');\r\n countryHeaderCell.textContent = 'County';\r\n countryHeaderCell.style.backgroundColor = 'rgb(168, 202, 153)';\r\n countryHeaderCell.style.color = 'rgb(52, 52, 52)';\r\n countryHeaderCell.style.marginLeft = '0.3rem';\r\n countryHeaderCell.style.marginRight = '0.3rem';\r\n countryHeaderCell.style.paddingLeft = '0.3rem';\r\n countryHeaderCell.style.paddingRight = '0.3rem';\r\n\r\n let districtHeaderCell = document.createElement('th');\r\n districtHeaderCell.textContent = 'District';\r\n districtHeaderCell.style.backgroundColor = 'rgb(168, 202, 153)';\r\n districtHeaderCell.style.color = 'rgb(52, 52, 52)';\r\n districtHeaderCell.style.marginLeft = '0.3rem';\r\n districtHeaderCell.style.marginRight = '0.3rem';\r\n districtHeaderCell.style.paddingLeft = '0.3rem';\r\n districtHeaderCell.style.paddingRight = '0.3rem';\r\n\r\n let postalCodeHeaderCell = document.createElement('th');\r\n postalCodeHeaderCell.textContent = 'Postal Code';\r\n postalCodeHeaderCell.style.backgroundColor = 'rgb(168, 202, 153)';\r\n postalCodeHeaderCell.style.color = 'rgb(52, 52, 52)';\r\n postalCodeHeaderCell.style.marginLeft = '0.3rem';\r\n postalCodeHeaderCell.style.marginRight = '0.3rem';\r\n postalCodeHeaderCell.style.paddingLeft = '0.3rem';\r\n postalCodeHeaderCell.style.paddingRight = '0.3rem';\r\n\r\n let streetNameHeaderCell = document.createElement('th');\r\n streetNameHeaderCell.textContent = 'Street Name';\r\n streetNameHeaderCell.style.backgroundColor = 'rgb(168, 202, 153)';\r\n streetNameHeaderCell.style.color = 'rgb(52, 52, 52)';\r\n streetNameHeaderCell.style.marginLeft = '0.3rem';\r\n streetNameHeaderCell.style.marginRight = '0.3rem';\r\n streetNameHeaderCell.style.paddingLeft = '0.3rem';\r\n streetNameHeaderCell.style.paddingRight = '0.3rem';\r\n\r\n let fobHeaderCell = document.createElement('th');\r\n fobHeaderCell.textContent = 'Fob';\r\n fobHeaderCell.style.backgroundColor = 'rgb(168, 202, 153)';\r\n fobHeaderCell.style.color = 'rgb(52, 52, 52)';\r\n fobHeaderCell.style.marginLeft = '0.3rem';\r\n fobHeaderCell.style.marginRight = '0.3rem';\r\n fobHeaderCell.style.paddingLeft = '0.3rem';\r\n fobHeaderCell.style.paddingRight = '0.3rem';\r\n\r\n let appAccess = document.createElement('th');\r\n appAccess.textContent = 'App Access';\r\n appAccess.style.backgroundColor = 'rgb(168, 202, 153)';\r\n appAccess.style.color = 'rgb(52, 52, 52)';\r\n appAccess.style.marginLeft = '0.3rem';\r\n appAccess.style.marginRight = '0.3rem';\r\n appAccess.style.paddingLeft = '0.3rem';\r\n appAccess.style.paddingRight = '0.3rem';\r\n\r\n table.appendChild(firstNameHeaderCell);\r\n table.appendChild(lastNameHeaderCell);\r\n table.appendChild(emailHeaderCell);\r\n table.appendChild(phoneNumberHeaderCell);\r\n table.appendChild(countryHeaderCell);\r\n table.appendChild(districtHeaderCell);\r\n table.appendChild(postalCodeHeaderCell);\r\n table.appendChild(streetNameHeaderCell);\r\n table.appendChild(fobHeaderCell);\r\n table.appendChild(appAccess);\r\n\r\n for(let row = 0; row < fleetUsers.length; row++) {\r\n let newRow = document.createElement('tr');\r\n newRow.contentEditable = 'true';\r\n newRow.style.cursor = 'text';\r\n newRow.style.color = 'rgb(52, 52, 52)';\r\n let defaultBackgroundColour = '';\r\n \r\n if(row % 2 === 0) {\r\n newRow.style.backgroundColor = 'white';\r\n defaultBackgroundColour = 'white';\r\n } else {\r\n newRow.style.backgroundColor = 'rgb(238, 238, 238)';\r\n defaultBackgroundColour = 'rgb(238, 238, 238)';\r\n }\r\n \r\n newRow.onmouseenter = () => {\r\n newRow.style.backgroundColor = '#ffffd4';\r\n }\r\n\r\n newRow.onmouseleave = () => {\r\n newRow.style.backgroundColor = defaultBackgroundColour;\r\n }\r\n\r\n for(let cell = 0; cell < fleetUsers[row].length; cell++) {\r\n let newCell = document.createElement('td');\r\n newCell.style.paddingLeft = '0.3rem';\r\n newCell.style.paddingRight = '0.3rem';\r\n let currentRow = fleetUsers[row] as any;\r\n let cellText = currentRow[cell];\r\n newCell.append(cellText);\r\n if(cell === 8 || cell === 9) {\r\n const oldBgColourOfCell = newCell.style.backgroundColor;\r\n\r\n newCell.onmouseenter = (event) => {\r\n (event.target as HTMLElement).style.cursor = 'pointer';\r\n (event.target as HTMLElement).style.backgroundColor = '#ff6d35';\r\n }\r\n newCell.onmouseleave = (event) => {\r\n (event.target as HTMLElement).style.backgroundColor = oldBgColourOfCell;\r\n }\r\n newCell.onclick = (event) => {\r\n (event.target as HTMLElement).style.backgroundColor = '#ffc3ad';\r\n if( (event.target as HTMLElement).textContent == 'false') {\r\n newCell.textContent = 'true';\r\n } else {\r\n newCell.textContent = 'false';\r\n }\r\n }\r\n }\r\n newRow.appendChild(newCell);\r\n }\r\n table.appendChild(newRow);\r\n }\r\n\r\n const users: any = [];\r\n let tableRows = document.getElementById('tableContainer').querySelectorAll('tr');\r\n\r\n for(let i = 0; i < tableRows.length; i++) {\r\n let user = {\r\n FirstName: tableRows[i].childNodes[0].textContent.trim(),\r\n LastName: tableRows[i].childNodes[1].textContent.trim(),\r\n CompanyName: companyDetails.name.trim(),\r\n IsCompany: true,\r\n CompanyRegistrationNumber : null,\r\n Nationality: null,\r\n Email: tableRows[i].childNodes[2].textContent.trim(),\r\n Address: {\r\n Country: {\r\n Id: 140\r\n },\r\n CityName: tableRows[i].childNodes[4].textContent.trim(),\r\n CityDistrictName : tableRows[i].childNodes[5].textContent.trim(),\r\n PostNumber: tableRows[i].childNodes[6].textContent.trim(),\r\n StreetName: tableRows[i].childNodes[7].textContent.trim(),\r\n HouseNumber: '',\r\n RoomNumber: ''\r\n },\r\n LocalEmsp: {\r\n Id: null\r\n },\r\n ExternalCode: null,\r\n ExternalCodeSecondary: null,\r\n TelephoneNumber: null,\r\n GSM: tableRows[i].childNodes[3].textContent.trim().replace(' ', ''),\r\n TaxNumber: null,\r\n NationalIdentityNumber: null,\r\n UiCulture: {\r\n Id: 'en-ie'\r\n },\r\n CommunicationChannel: {\r\n Id: 4\r\n },\r\n DateOfBirth: '',\r\n DefaultTimeZone: 0,\r\n DaylightSavingEnabled: moment().isDST()\r\n }\r\n users.push(user);\r\n }\r\n this.createUsers(users);\r\n }\r\n\r\n createUsers( users: []): void {\r\n let tableCell = document.getElementById('tableContainer');\r\n let buttonContainer = document.createElement('div');\r\n let createUsersButton = document.createElement('button');\r\n createUsersButton.textContent = 'Create New Users';\r\n createUsersButton.style.marginTop = '1.3rem';\r\n createUsersButton.style.opacity = '0';\r\n createUsersButton.style.backgroundColor = 'rgb(31, 76, 255)';\r\n createUsersButton.style.color = 'white';\r\n\r\n createUsersButton.onmouseenter = (event) => {\r\n (event.target as HTMLElement).style.backgroundColor = 'rgb(217, 225, 255)';\r\n (event.target as HTMLElement).style.color = '#555';\r\n }\r\n createUsersButton.onmouseleave = (event) => {\r\n (event.target as HTMLElement).style.backgroundColor = 'rgb(31, 76, 255)';\r\n (event.target as HTMLElement).style.color = 'white';\r\n }\r\n\r\n setTimeout(() => {\r\n createUsersButton.style.opacity = '1';\r\n createUsersButton.style.transition = '.5s';\r\n }, 10);\r\n\r\n buttonContainer.appendChild(createUsersButton);\r\n tableCell.appendChild(buttonContainer);\r\n\r\n createUsersButton.onclick = () => {\r\n this.createButtonPressed = true;\r\n for(let i = 0; i < users.length; i++ ) {\r\n this.registerFormService.postNewUsers(users[i]);\r\n }\r\n }\r\n this.usersNumber = users.length;\r\n }\r\n\r\n}\r\n","\r\n\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n\r\n
\r\n
\r\n \r\n\r\n
\r\n There is a bug in the Etrel Urchin API when it comes to creating users. Please press the create button again to add the missing remaining users.\r\n
\r\n
\r\n Please select a company name in the first sheet\r\n
\r\n
\r\n
\r\n\r\n","\r\n\r\n
\r\n\r\n
\r\n
\r\n
\r\n\r\n
\r\n Logged in as {{ roles }}.\r\n
\r\n\r\n
\r\n\r\n
\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { AuthService } from 'src/app/services/auth/auth.service';\r\nimport { TokenStorageService } from 'src/app/services/token-storage/token-storage.service';\r\n\r\n@Component({\r\n selector: 'app-login',\r\n templateUrl: './login.component.html',\r\n styleUrls: ['./login.component.scss']\r\n})\r\nexport class LoginComponent implements OnInit {\r\n form: any = {\r\n username: null,\r\n password: null\r\n };\r\n isLoggedIn = false;\r\n isLoginFailed = false;\r\n errorMessage = '';\r\n roles: string[] = [];\r\n\r\n\r\n constructor(private authService: AuthService, private tokenStorage: TokenStorageService) { }\r\n\r\n ngOnInit(): void {\r\n if (this.tokenStorage.getToken()) {\r\n this.isLoggedIn = true;\r\n this.roles = this.tokenStorage.getUser().roles;\r\n }\r\n }\r\n\r\n onSubmit(): void {\r\n const { username, password } = this.form;\r\n\r\n this.authService.login(username, password).subscribe(\r\n data => {\r\n this.tokenStorage.saveToken(data.accessToken);\r\n this.tokenStorage.saveUser(data);\r\n\r\n this.isLoginFailed = false;\r\n this.isLoggedIn = true;\r\n\r\n \r\n const userDetails = this.tokenStorage.getUser();\r\n this.authService.user.roles = JSON.parse(atob(userDetails.accessToken.split('.')[1])).authorisations;\r\n this.authService.user.name = JSON.parse(atob(userDetails.accessToken.split('.')[1])).sub.replace('_', ' ');\r\n this.authService.user.id = JSON.parse(sessionStorage.getItem('auth-user')).id;\r\n this.reloadPage();\r\n },\r\n err => {\r\n this.errorMessage = err.error.message;\r\n this.isLoginFailed = true;\r\n }\r\n )\r\n }\r\n\r\n reloadPage(): void {\r\n window.location.reload();\r\n }\r\n\r\n}\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { TariffLocationsService } from '../../services/tariff-locations-service/tariff-locations-service.service';\r\nimport { SaveFleetSubsService } from '../../services/save-fleet-subs-service/save-fleet-subs.service';\r\nimport { CompanyCrudUtils } from './companies-crud-utils';\r\nimport { CompanyCrudHelper } from './companies-crud-helper';\r\n\r\n@Component({\r\n selector: 'app-companies-crud',\r\n templateUrl: './companies-crud.component.html',\r\n styleUrls: ['./companies-crud.component.scss']\r\n})\r\nexport class CompaniesCrudComponent implements OnInit {\r\n\r\n private companyCrudUtils: any = new CompanyCrudUtils();\r\n private companyCrudHelper: any = new CompanyCrudHelper();\r\n\r\n fleetSubscribers: any;\r\n singleCompanies: any;\r\n freeAccess: any;\r\n createTable: any;\r\n deleteWarning: boolean;\r\n clickedRow: any;\r\n\r\n constructor( public companies: TariffLocationsService, public fleetSubsService: SaveFleetSubsService) { }\r\n\r\n ngOnInit() {\r\n this.companies.getAllCompanies().toPromise()\r\n .then(response => this.createFleetSubTable(response[response.length - 1].company.fleetplan))\r\n .then(tableFragment => this.renderButton(tableFragment))\r\n .then(res => console.log(res))\r\n .catch(err => { console.log(err)})\r\n }\r\n\r\n removeModal(e:any) {\r\n this.clickedRow = e.id;\r\n document.getElementById('warningModal').style.visibility = 'visible';\r\n document.getElementById('warningModal').style.transition = 'visibility 0s, opacity 2.5s linear';\r\n }\r\n\r\n\r\n removeCompanyYes() {\r\n document.getElementById('warningModal').style.visibility = 'hidden';\r\n document.getElementById(this.clickedRow).remove();\r\n\r\n // TODO change the ids of all the rows\r\n let tableRows = document.querySelector('table').getElementsByTagName('tr');\r\n for(let i = 1; i < tableRows.length; i++) {\r\n tableRows[i].id = `row_${i}`;\r\n }\r\n }\r\n\r\n removeCompanyNo() {\r\n document.getElementById('warningModal').style.visibility = 'hidden';\r\n }\r\n\r\n\r\n createFleetSubTable(fleetSubscribers: any): any {\r\n\r\n this.fleetSubscribers = this.companyCrudUtils.sortCompany(fleetSubscribers) // Sorting by alphabetical order\r\n try {\r\n this.createTable = document.createDocumentFragment();\r\n const table = document.createElement('table');\r\n table.style.backgroundColor = '#b1b1b1';\r\n const tableRow = document.createElement('tr');\r\n tableRow.appendChild(document.createElement('th'));\r\n tableRow.style.backgroundColor = '#a8ca99';\r\n tableRow.style.color = '#343434';\r\n\r\n this.companyCrudHelper.createTableHeaders(table, tableRow);\r\n\r\n // Create appropriate cell for each row/fleet subscriber\r\n let counter = 0;\r\n for(let company = 0; company < fleetSubscribers.length; company++) {\r\n counter++;\r\n\r\n let newRow = document.createElement('tr')\r\n newRow.id = `row_${counter}`; \r\n\r\n let removeRow = document.createElement('td')\r\n let minusButton = this.createMinusButton(table) as any;\r\n removeRow.appendChild(minusButton);\r\n\r\n removeRow.style.color = '#ff4503';\r\n minusButton.style.cursor = 'pointer';\r\n\r\n counter % 2 === 0 ? removeRow.style.backgroundColor = 'white' : removeRow.style.backgroundColor = 'rgb(238, 238, 238)';\r\n\r\n removeRow.addEventListener('click', () => this.removeModal(newRow) );\r\n newRow.appendChild(removeRow);\r\n\r\n this.companyCrudHelper.createFleetRow(newRow, fleetSubscribers[company], counter);\r\n\r\n table.appendChild(newRow);\r\n }\r\n this.createTable.appendChild(table);\r\n\r\n return this.createTable;\r\n } catch(e) {\r\n console.error(e);\r\n }\r\n }\r\n\r\n renderButton(area: any) {\r\n let createRowButtonContainer = document.createElement('div');\r\n\r\n // Add Client button\r\n let addRowButton = document.createElement('button');\r\n addRowButton.append('Add Client');\r\n addRowButton.style.marginTop = '1rem';\r\n addRowButton.style.marginRight = '.5rem';\r\n addRowButton.style.maxWidth = '6rem';\r\n \r\n\r\n addRowButton.onclick = () => {\r\n this.createNewRow(this.companyCrudUtils);\r\n }\r\n\r\n area.appendChild(createRowButtonContainer);\r\n\r\n let buttonsContainer = document.createElement('buttonsContainer');\r\n buttonsContainer.style.display = 'grid';\r\n buttonsContainer.style.gridTemplateColumns = '1fr 1fr';\r\n buttonsContainer.style.maxWidth = '18rem';\r\n\r\n let saveButton = document.createElement('button');\r\n saveButton.append('Save All');\r\n saveButton.style.marginLeft = '.5rem';\r\n saveButton.style.maxWidth = '6rem';\r\n saveButton.style.marginTop = '1rem';\r\n saveButton.style.float = 'right';\r\n saveButton.style.backgroundColor = '#1f4cff';\r\n saveButton.id = 'saveButton';\r\n saveButton.onclick = (event: any) => {\r\n this.gatherFleetSubTableData(event.target.parentElement.parentElement.parentElement.querySelector('table'));\r\n }\r\n saveButton.onmouseenter = () => {\r\n saveButton.style.backgroundColor = '#d9e1ff';\r\n }\r\n saveButton.onmouseleave = () => {\r\n saveButton.style.backgroundColor = '#1f4cff';\r\n }\r\n\r\n buttonsContainer.appendChild(addRowButton)\r\n buttonsContainer.appendChild(saveButton);\r\n\r\n createRowButtonContainer.appendChild(buttonsContainer)\r\n area.appendChild(createRowButtonContainer)\r\n document.querySelector('#table-container').appendChild(area);\r\n }\r\n\r\n gatherFleetSubTableData(table: any): void {\r\n\r\n let fleetSubs = []\r\n for(let row = 1; row < table.querySelectorAll('tr').length; row++) {\r\n let sub = table.querySelectorAll('tr')[row];\r\n\r\n let fleetSub = {\r\n 'name' : sub.querySelectorAll('td')[1].textContent,\r\n 'clientId' : sub.querySelectorAll('td')[2].textContent,\r\n 'contactName' : sub.querySelectorAll('td')[3].textContent,\r\n 'contactEmail' : sub.querySelectorAll('td')[4].textContent,\r\n 'driverInvoicing' : sub.querySelector('.driverCheckbox').checked,\r\n 'oceanUK' : sub.querySelector('.oceanCheckbox').checked\r\n }\r\n fleetSubs.push(fleetSub)\r\n }\r\n\r\n this.fleetSubsService.postFleetSubAccounts(fleetSubs);\r\n }\r\n\r\n\r\n createMinusButton(table: any) {\r\n \r\n let minusButton = document.createElement('button');\r\n minusButton.className = 'fa fa-minus';\r\n minusButton.id = 'minusId';\r\n minusButton.onclick = () => {\r\n \r\n let tableRows = table.querySelectorAll('tr');\r\n for(let row = 0; row < tableRows.length; row++) {\r\n tableRows.item(row).id = `row_${row}`;\r\n }\r\n }\r\n\r\n minusButton.onmouseenter = () => {\r\n minusButton.style.backgroundColor = 'rgb(255 221 220 / 1)';\r\n minusButton.style.color = '#960000';\r\n }\r\n minusButton.onmouseleave = () => {\r\n minusButton.style.backgroundColor = 'red';\r\n minusButton.style.color = 'white';\r\n }\r\n\r\n minusButton.style.backgroundColor = 'red';\r\n return minusButton;\r\n }\r\n\r\n sortCompany(company: any) {\r\n company.sort((companyA, companyB) => {\r\n if(companyA.name.toLowerCase() < companyB.name.toLowerCase()) {\r\n return -1;\r\n }\r\n if(companyA.name.toLowerCase() > companyB.name.toLowerCase()) {\r\n return 1;\r\n }\r\n return 0\r\n });\r\n }\r\n\r\n createNewRow(companyCrudUtils: any) {\r\n let table = document.querySelector('table');\r\n let rowCount = table.querySelectorAll('tr').length;\r\n let newRow = document.createElement('tr');\r\n newRow.id = `row_${rowCount}`;\r\n let newMinusButton = companyCrudUtils.createMinusButton();\r\n let newMinusButtonContainer = document.createElement('td');\r\n newMinusButtonContainer.appendChild(newMinusButton);\r\n\r\n newMinusButton.onclick = (e) => {\r\n this.removeModal(e.target.parentElement.parentElement)\r\n }\r\n\r\n let newUserPayerId = document.createElement('td');\r\n let newClient = document.createElement('td');\r\n let newName = document.createElement('td');\r\n let newEmail = document.createElement('td');\r\n let newDriverInvoicing = document.createElement('td');\r\n let newOceanUK = document.createElement('td');\r\n\r\n if(rowCount % 2 == 0) {\r\n newMinusButtonContainer.style.backgroundColor = 'rgb(238, 238, 238)';\r\n newUserPayerId.style.backgroundColor = 'rgb(238, 238, 238)';\r\n newClient.style.backgroundColor = 'rgb(238, 238, 238)';\r\n newName.style.backgroundColor = 'rgb(238, 238, 238)';\r\n newEmail.style.backgroundColor = 'rgb(238, 238, 238)';\r\n newDriverInvoicing.style.backgroundColor = 'rgb(238, 238, 238)';\r\n newOceanUK.style.backgroundColor = 'rgb(238, 238, 238)';\r\n } else {\r\n newMinusButtonContainer.style.backgroundColor = 'white';\r\n newUserPayerId.style.backgroundColor = 'white';\r\n newClient.style.backgroundColor = 'white';\r\n newName.style.backgroundColor = 'white';\r\n newEmail.style.backgroundColor = 'white';\r\n newDriverInvoicing.style.backgroundColor = 'white';\r\n newOceanUK.style.backgroundColor = 'white';\r\n }\r\n newUserPayerId.append('-');\r\n newUserPayerId.style.color = 'rgb(52, 52, 52)';\r\n newUserPayerId.style.textAlign = 'centre';\r\n newUserPayerId.contentEditable = 'true';\r\n newUserPayerId.style.cursor = 'default';\r\n\r\n newClient.append('-');\r\n newClient.style.color = 'rgb(52, 52, 52)';\r\n newClient.style.textAlign = 'center';\r\n newClient.contentEditable = 'true';\r\n\r\n newName.append('-');\r\n newName.style.color = 'rgb(52, 52, 52)';\r\n newName.style.textAlign = 'center';\r\n newName.contentEditable = 'true';\r\n\r\n newEmail.append('-');\r\n newEmail.style.color = 'rgb(52, 52, 52)';\r\n newEmail.style.textAlign = 'center';\r\n newEmail.contentEditable = 'true';\r\n\r\n let driverCheckbox = document.createElement('input');\r\n driverCheckbox.type = \"checkbox\";\r\n driverCheckbox.className = \"driverCheckbox\";\r\n newDriverInvoicing.append(driverCheckbox);\r\n newDriverInvoicing.style.color = 'rgb(52, 52, 52)';\r\n newDriverInvoicing.style.textAlign = 'center';\r\n newDriverInvoicing.contentEditable = 'true';\r\n\r\n let oceanUkCheckbox = document.createElement('input');\r\n oceanUkCheckbox.type = \"checkbox\";\r\n oceanUkCheckbox.className = \"oceanCheckbox\";\r\n newOceanUK.append(oceanUkCheckbox);\r\n newOceanUK.style.color = 'rgb(52, 52, 52)';\r\n newOceanUK.style.textAlign = 'center';\r\n newOceanUK.contentEditable = 'true';\r\n\r\n newRow.appendChild(newMinusButtonContainer);\r\n newRow.appendChild(newUserPayerId);\r\n newRow.appendChild(newClient);\r\n newRow.appendChild(newName);\r\n newRow.appendChild(newEmail);\r\n newRow.appendChild(newDriverInvoicing);\r\n newRow.appendChild(newOceanUK);\r\n table.appendChild(newRow);\r\n}\r\n\r\n}","\r\n\r\n\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n
Are you sure?\r\n
\r\n \r\n Yes \r\n \r\n \r\n No \r\n \r\n
\r\n
\r\n\r\n
\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class StateManagementService {\r\n showSingleCompanies: boolean = false;\r\n\r\n\r\n}\r\n","import { HTTP_INTERCEPTORS, HttpEvent } from '@angular/common/http';\r\nimport { HttpInterceptor, HttpRequest, HttpHandler } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { TokenStorageService } from '../../services/token-storage/token-storage.service';\r\n\r\nconst TOKEN_HEADER_KEY = 'Authorization';\r\n\r\n@Injectable()\r\nexport class AuthInterceptorService implements HttpInterceptor {\r\n isLoggedIn: boolean = false;\r\n\r\n constructor(private token: TokenStorageService) { }\r\n\r\n intercept(req: HttpRequest, next: HttpHandler): Observable> {\r\n let authReq = req;\r\n const token = this.token.getToken();\r\n if (token != null) {\r\n authReq = req.clone({headers: req.headers.set(TOKEN_HEADER_KEY, 'Bearer ' + token)})\r\n }\r\n this.isLoggedIn = true;\r\n return next.handle(authReq);\r\n }\r\n\r\n checkLoggedInStatus() {\r\n if(this.isLoggedIn) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n\r\nexport const authInterceptorProviders = [\r\n { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptorService, multi: true }\r\n]\r\n","import { Component, OnChanges, OnInit } from '@angular/core';\r\nimport { TariffsService } from '../../services/tariffs-service/tariffs.service';\r\n\r\n@Component({\r\n selector: 'app-tariff-data',\r\n templateUrl: './tariffs.component.html',\r\n styleUrls: ['./tariffs.component.scss']\r\n})\r\nexport class TariffsComponent implements OnInit, OnChanges {\r\n\r\n private tariffsList: any;\r\n private tariffsInBackend: number;\r\n private rowsAdded = 0;\r\n private disableSave = true;\r\n private previousRowColour: string;\r\n private isTableSort: boolean = false;\r\n private sortCounter: number = 0;\r\n private tableBackendLoaded: boolean = false;\r\n\r\n constructor(public tariffData: TariffsService) { }\r\n\r\n public ngOnInit(): void {\r\n if(!this.isTableSort) {\r\n this.populateTable();\r\n }\r\n }\r\n\r\n public ngOnChanges(): void {\r\n this.checkTableForDashes();\r\n }\r\n\r\n public sortByTariffName(e): void {\r\n let faArrow = e.path[0]. querySelector('i');\r\n let sortBy;\r\n\r\n if(this.sortCounter % 2 == 0) {\r\n faArrow.classList.remove('fa-angle-down');\r\n faArrow.classList.add('fa-angle-up');\r\n sortBy = 'desc';\r\n } else {\r\n faArrow.classList.add('fa-angle-down');\r\n faArrow.classList.remove('fa-angle-up');\r\n sortBy = 'asc';\r\n }\r\n \r\n this.isTableSort = true;\r\n let tableBody = e.path[1].querySelector('tbody');\r\n let tableRows = tableBody.querySelectorAll('tr');\r\n let tableRowsCount = tableRows.length;\r\n\r\n const sortedTariffsList = [];\r\n\r\n for(let i = 0; i < tableRowsCount; i++) {\r\n \r\n const rowData = { \r\n tariffName : '',\r\n type: '',\r\n accessFee: '',\r\n accessFeeValidAfter: '',\r\n chargeTimeFee: '',\r\n chargeTimeFeeValidAfter: '',\r\n consumedEnergyFee: '',\r\n consumedEnergyFeeValidAfter: '',\r\n parkingTimeFee: '',\r\n parkingTimeFeeValidAfter: '',\r\n overstayFee: '',\r\n overstayFeeValidAfter: '',\r\n validFrom: '',\r\n validTo: '',\r\n tested: ''\r\n \r\n };\r\n rowData.tariffName = tableRows[i].querySelectorAll('td')[0].innerText;\r\n rowData.type = tableRows[i].querySelectorAll('td')[1].innerText;\r\n\r\n rowData.accessFee = tableRows[i].querySelectorAll('td')[2].innerText;\r\n rowData.accessFeeValidAfter = tableRows[i].querySelectorAll('td')[3].innerText;\r\n \r\n rowData.chargeTimeFee = tableRows[i].querySelectorAll('td')[4].innerText;\r\n rowData.chargeTimeFeeValidAfter = tableRows[i].querySelectorAll('td')[5].innerText;\r\n \r\n rowData.consumedEnergyFee = tableRows[i].querySelectorAll('td')[6].innerText;\r\n rowData.consumedEnergyFeeValidAfter = tableRows[i].querySelectorAll('td')[7].innerText;\r\n \r\n rowData.parkingTimeFee = tableRows[i].querySelectorAll('td')[8].innerText;\r\n rowData.parkingTimeFeeValidAfter = tableRows[i].querySelectorAll('td')[9].innerText;\r\n \r\n rowData.overstayFee = tableRows[i].querySelectorAll('td')[10].innerText;\r\n rowData.overstayFeeValidAfter = tableRows[i].querySelectorAll('td')[11].innerText;\r\n rowData.validFrom = tableRows[i].querySelectorAll('td')[12].innerText;\r\n rowData.validTo = tableRows[i].querySelectorAll('td')[13].innerText;\r\n rowData.tested = tableRows[i].querySelectorAll('td')[14].innerText;\r\n\r\n sortedTariffsList.length = 0;\r\n sortedTariffsList.push(rowData);\r\n }\r\n\r\n // TODO flush older data before using newer, then recreate table\r\n if(sortBy === 'asc') {\r\n sortedTariffsList.sort( (a, b) => a.tariffName.localeCompare(b.tariffName) )\r\n } else if (sortBy === 'desc') {\r\n sortedTariffsList.sort( (a, b) => b.tariffName.localeCompare(a.tariffName) )\r\n }\r\n\r\n this.generateNewTable(sortedTariffsList);\r\n\r\n this.isTableSort = false;\r\n this.sortCounter++;\r\n }\r\n\r\n public generateNewTable(sortedTariffsList: any) {\r\n }\r\n\r\n public generateTable(): void {\r\n const table = document.getElementById('tariffTable') as any;\r\n this.tariffsInBackend = this.tariffsList.length;\r\n const tableLength = document.getElementById('tariffTable').querySelectorAll('th').length;\r\n\r\n table.style.borderRadius = '.3rem';\r\n for(let i = 0; i < this.tariffsList.length; i++) {\r\n let tableRow = table.insertRow(); \r\n \r\n for(let j = 0; j < tableLength; j++) {\r\n if(j === 0) {\r\n tableRow.insertCell(0).innerText = this.tariffsList[i].tariffName;\r\n }\r\n if(j === 1) {\r\n tableRow.insertCell(1).innerText = this.tariffsList[i].type;\r\n }\r\n\r\n if(j === 2) {\r\n tableRow.insertCell(2).innerText = this.tariffsList[i].accessFee;\r\n }\r\n if(j === 3) {\r\n tableRow.insertCell(3).innerText = this.tariffsList[i].accessFeeValidAfter;\r\n }\r\n if(j === 4) {\r\n tableRow.insertCell(4).innerText = this.tariffsList[i].chargeTimeFee;\r\n }\r\n if(j === 5) {\r\n tableRow.insertCell(5).innerText = this.tariffsList[i].chargeTimeFeeValidAfter;\r\n }\r\n if(j === 6) {\r\n tableRow.insertCell(6).innerText = this.tariffsList[i].consumedEnergyFee;\r\n }\r\n if(j === 7) {\r\n tableRow.insertCell(7).innerText = this.tariffsList[i].consumedEnergyFeeValidAfter;\r\n }\r\n if(j === 8) {\r\n tableRow.insertCell(8).innerText = this.tariffsList[i].parkingTimeFee;\r\n }\r\n if(j === 9) {\r\n tableRow.insertCell(9).innerText = this.tariffsList[i].parkingTimeFeeValidAfter;\r\n }\r\n if(j === 10) {\r\n tableRow.insertCell(10).innerText = this.tariffsList[i].overstayFee;\r\n }\r\n if(j === 11) {\r\n tableRow.insertCell(11).innerText = this.tariffsList[i].overstayFeeValidAfter;\r\n }\r\n if(j === 12) {\r\n tableRow.insertCell(12).innerText = this.tariffsList[i].validFrom;\r\n }\r\n if(j === 13) {\r\n tableRow.insertCell(13).innerText = this.tariffsList[i].validTo;\r\n }\r\n if(j === 14) {\r\n tableRow.insertCell(14).innerText = this.tariffsList[i].tested;\r\n tableRow.cells[14].style.backgroundColor = '#c55252';\r\n tableRow.cells[14].style.color = '#fff';\r\n\r\n }\r\n } \r\n tableRow.contentEditable = true;\r\n tableRow.style.textAlign = \"center\";\r\n document.getElementById('tariffTable').querySelector('th').style.paddingBottom = '.3rem';\r\n document.getElementById('tariffTable').querySelector('th').style.paddingTop = '.1rem';\r\n\r\n let numOfRows = table.rows.length as any;\r\n for(let k = 0; k < numOfRows; k++) {\r\n if(k % 2 === 0) {\r\n tableRow.style.backgroundColor = \"#fff\";\r\n } else {\r\n tableRow.style.backgroundColor = \"#eee\";\r\n }\r\n }\r\n }\r\n }\r\n\r\n public populateTable(): void {\r\n this.tariffData.getAllTariffs().subscribe((data: any) => {\r\n this.tariffsList = data[data.length-1].tariffs;\r\n this.generateTable();\r\n this.tableBackendLoaded = true;\r\n this.checkTableForDashes();\r\n });\r\n }\r\n\r\n public addTableRow(): void {\r\n const table = document.getElementById('tariffTable') as any;\r\n let tableRow = table.insertRow();\r\n const tableLength = document.getElementById('tariffTable').querySelectorAll('th').length;\r\n for(let i = 0; i < 2; i++) {\r\n tableRow.insertCell(i).textContent = \"-\"; \r\n }\r\n for(let i = 2; i < tableLength-3; i++) {\r\n tableRow.insertCell(i).textContent = \"0\"; \r\n }\r\n tableRow.insertCell(12).textContent = \"no date\"; \r\n tableRow.insertCell(13).textContent = \"no date\"; \r\n tableRow.insertCell(tableLength-1).textContent = \"false\";\r\n tableRow.cells[tableLength-1].style.backgroundColor = '#c55252';\r\n tableRow.cells[tableLength-1].style.color = '#eee';\r\n\r\n tableRow.contentEditable = true;\r\n tableRow.style.textAlign = \"center\";\r\n\r\n let numOfRows = table.rows.length as any;\r\n for(let k = 0; k < numOfRows; k++) {\r\n if(k % 2 === 0) {\r\n tableRow.style.backgroundColor = \"#fff\";\r\n } else {\r\n tableRow.style.backgroundColor = \"#eee\";\r\n }\r\n }\r\n this.rowsAdded++;\r\n this.checkTableForDashes();\r\n }\r\n\r\n\r\n public removeTableRow(): void {\r\n const table = document.getElementById('tariffTable') as any;\r\n \r\n let newestRow = table.rows.length;\r\n if(newestRow > this.tariffsInBackend) {\r\n table.deleteRow(newestRow - 1);\r\n this.rowsAdded--;\r\n }\r\n this.checkTableForDashes();\r\n }\r\n\r\n\r\n public updateTariffData(): void {\r\n const table = document.getElementById('tariffTable') as any;\r\n let allTariffs = [];\r\n \r\n for(let i = 0; i < table.rows.length; i++) {\r\n \r\n for (let j = 0; j < table.rows[i].cells.length; j++) {\r\n let tariffModel = new Map;\r\n tariffModel.set('tariffName', table.rows[i].cells[j].textContent);\r\n tariffModel.set('type', table.rows[i].cells[j+1].textContent);\r\n\r\n tariffModel.set('accessFee', table.rows[i].cells[j+2].textContent);\r\n tariffModel.set('accessFeeValidAfter', table.rows[i].cells[j+3].textContent);\r\n\r\n tariffModel.set('chargeTimeFee', table.rows[i].cells[j+4].textContent);\r\n tariffModel.set('chargeTimeFeeValidAfter', table.rows[i].cells[j+5].textContent);\r\n\r\n tariffModel.set('consumedEnergyFee', table.rows[i].cells[j+6].textContent);\r\n tariffModel.set('consumedEnergyFeeValidAfter', table.rows[i].cells[j+7].textContent);\r\n\r\n tariffModel.set('parkingTimeFee', table.rows[i].cells[j+8].textContent);\r\n tariffModel.set('parkingTimeFeeValidAfter', table.rows[i].cells[j+9].textContent);\r\n\r\n tariffModel.set('overstayFee', table.rows[i].cells[j+10].textContent);\r\n tariffModel.set('overstayFeeValidAfter', table.rows[i].cells[j+11].textContent);\r\n tariffModel.set('validFrom', table.rows[i].cells[j+12].textContent);\r\n tariffModel.set('validTo', table.rows[i].cells[j+13].textContent);\r\n tariffModel.set('tested', table.rows[i].cells[j+14].textContent);\r\n let obj = {};\r\n tariffModel.forEach((value, key) => {\r\n obj[key] = value;\r\n })\r\n allTariffs.push(obj);\r\n break;\r\n }\r\n }\r\n this.tariffData.postTariffs(allTariffs);\r\n }\r\n\r\n public checkTableForDashes(): void {\r\n if(this.rowsAdded > 0) {\r\n const table = document.getElementById('tariffTable') as any;\r\n let rowsLength = table.rows.length;\r\n let columnsLength = table.rows[0].cells.length;\r\n let foundDash = false;\r\n for(let i = 0; i < rowsLength; i++) {\r\n for(let j = 0; j < columnsLength; j++) {\r\n if(table.rows[i].cells[j].innerText === \"-\") {\r\n foundDash = true;\r\n }\r\n }\r\n }\r\n if(!foundDash) {\r\n this.disableSave = true;\r\n } else {\r\n this.disableSave = false;\r\n }\r\n }\r\n }\r\n\r\n public highlightRow(e: any): void {\r\n let highlightedRow = e.path[0].closest('tr');\r\n\r\n if(highlightedRow !== null) {\r\n if(highlightedRow.style.backgroundColor !== 'rgb(255, 255, 146)') {\r\n this.previousRowColour = highlightedRow.style.backgroundColor;\r\n }\r\n if(highlightedRow.style.backgroundColor !== 'rgb(255, 255, 146)') {\r\n\r\n highlightedRow.style.backgroundColor = 'rgb(255, 255, 146)';\r\n } else {\r\n highlightedRow.style.backgroundColor = this.previousRowColour;\r\n \r\n }\r\n }\r\n }\r\n\r\n}\r\n","\r\n\r\n
\r\n
\r\n Tariff Name \r\n Contract Type \r\n Access Fee(€) \r\n Access Fee Valid After(mins) \r\n Charge Time Fee(€) \r\n Chargetime Fee Valid After(mins) \r\n Consumed Energy Fee(€) \r\n Consumed Energy Fee After(mins) \r\n Parking fee(€) \r\n Parking fee valid after(mins) \r\n Overstay Fee(€) \r\n Overstay Fee Valid After(hrs) \r\n Valid From \r\n Valid To \r\n Tested \r\n
\r\n
\r\n
\r\n \r\n add tariff \r\n \r\n \r\n delete bottom row \r\n \r\n \r\n save changes \r\n \r\n
\r\n
\r\n {{this.tariffData.savedConfirm}}\r\n
\r\n
\r\n","import { Component, OnInit } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-tariff-test-records',\r\n templateUrl: './tariff-test-records.component.html',\r\n styleUrls: ['./tariff-test-records.component.scss']\r\n})\r\nexport class TariffTestRecordsComponent implements OnInit {\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n}\r\n","tariff-test-records works!
\r\n","import { NgModule } from '@angular/core';\r\nimport { BrowserModule } from '@angular/platform-browser';\r\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\n\r\nimport { StoreModule } from '@ngrx/store';\r\nimport { simpleReducer } from '../app/reducers/simpleReducer';\r\n\r\nimport { CsvInvoiceComponent } from './components/csv-invoice/csv-invoice.component';\r\nimport { ApiInvoiceComponent } from './components/api-invoice/api-invoice.component';\r\nimport { ApiInvoiceSiteComponent } from './components/api-invoice-site/api-invoice-site.component';\r\nimport { RfidAddressesComponent } from './components/rfid-addresses/rfid-addresses.component';\r\nimport { TariffsComponent } from './components/tariffs/tariffs.component';\r\nimport { TariffLocationsComponent } from './components/tariff-locations/tariff-locations.component';\r\nimport { TariffTestRecordsComponent } from './components/tariff-test-records/tariff-test-records.component';\r\n\r\nimport { RegistrationFormComponent } from './components/registration-form/registration-form.component';\r\nimport { ChargingSessionsCsvGenComponent } from './components/charging-sessions-csv-gen/charging-sessions-csv-gen.component';\r\nimport { CompaniesCrudComponent } from './components/companies-crud/companies-crud.component';\r\n\r\nimport { AppComponent } from './app.component';\r\nimport { AppRoutingModule } from './app-routing.module';\r\nimport { HttpClientModule } from '@angular/common/http';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { SideNavbarComponent } from './components/side-navbar/side-navbar.component';\r\nimport { AngularFileUploaderModule } from 'angular-file-uploader';\r\nimport { CommonModule } from '@angular/common';\r\nimport { NpnSliderModule } from 'npn-slider';\r\nimport { LoginComponent } from './components/login/login.component';\r\n\r\nimport { authInterceptorProviders } from '../app/helper/auth-interceptor/auth-interceptor.service';\r\nimport { GHeatMapComponent } from './components/g-heat-map/g-heat-map.component';\r\nimport { GoogleMapsModule } from \"@angular/google-maps\";\r\nimport { MapSidebarComponent } from './components/map-sidebar/map-sidebar.component';\r\nimport {\r\n MatSelectModule\r\n} from '@angular/material/select';\r\nimport {\r\n MatButtonModule\r\n} from '@angular/material/button';\r\nimport {\r\n MatCheckboxModule\r\n} from '@angular/material/checkbox';\r\nimport {\r\n MatDatepickerModule\r\n} from '@angular/material/datepicker';\r\nimport {\r\n MatNativeDateModule\r\n} from '@angular/material/core';\r\nimport {\r\n MatFormFieldModule,\r\n} from '@angular/material/form-field';\r\nimport {\r\n MatProgressBarModule\r\n} from '@angular/material/progress-bar';\r\nimport {\r\n MatProgressSpinnerModule\r\n} from '@angular/material/progress-spinner';\r\nimport {\r\n MatRadioModule\r\n} from '@angular/material/radio';\r\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\r\nimport { SiteDetailsComponent } from './components/site-details/site-details.component';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { CardContentComponent } from './components/card-content/card-content.component';\r\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { ChargersMapNewComponent } from './components/chargers-map-new/chargers-map-new.component';\r\nimport { ChargerSidebarComponent } from './components/charger-sidebar/charger-sidebar.component';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { TabNavigatorComponent } from './components/tab-navigator/tab-navigator.component';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatInputModule } from '@angular/material/input';\r\n\r\n@NgModule({\r\n declarations: [\r\n AppComponent,\r\n CsvInvoiceComponent,\r\n ApiInvoiceComponent,\r\n ApiInvoiceSiteComponent,\r\n RfidAddressesComponent,\r\n SideNavbarComponent,\r\n TariffsComponent,\r\n TariffLocationsComponent,\r\n TariffTestRecordsComponent,\r\n CompaniesCrudComponent,\r\n ChargingSessionsCsvGenComponent,\r\n RegistrationFormComponent,\r\n LoginComponent,\r\n GHeatMapComponent,\r\n MapSidebarComponent,\r\n SiteDetailsComponent,\r\n CardContentComponent,\r\n ChargersMapNewComponent,\r\n ChargerSidebarComponent,\r\n TabNavigatorComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n BrowserModule,\r\n BrowserAnimationsModule,\r\n AppRoutingModule,\r\n HttpClientModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n AngularFileUploaderModule,\r\n NpnSliderModule,\r\n GoogleMapsModule,\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n MatDatepickerModule,\r\n MatNativeDateModule,\r\n MatFormFieldModule,\r\n MatProgressBarModule,\r\n MatProgressSpinnerModule,\r\n MatRadioModule,\r\n MatSelectModule,\r\n MatSnackBarModule,\r\n MatCardModule,\r\n MatAutocompleteModule,\r\n MatIconModule,\r\n ReactiveFormsModule,\r\n MatButtonToggleModule,\r\n MatTabsModule,\r\n MatInputModule,\r\n StoreModule.forRoot({ message: simpleReducer })\r\n ],\r\n exports: [\r\n FormsModule\r\n ],\r\n providers: [authInterceptorProviders],\r\n bootstrap: [AppComponent]\r\n})\r\nexport class AppModule { }\r\n","import { Component, OnInit, ViewChild } from '@angular/core';\r\nimport { GoogleMap, MapInfoWindow, MapMarker } from '@angular/google-maps';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { Router } from '@angular/router';\r\nimport { HeatmapService } from 'src/app/services/heatmap-service/heatmap.service';\r\n\r\n@Component({\r\n selector: 'app-g-heat-map',\r\n templateUrl: './g-heat-map.component.html',\r\n styleUrls: ['./g-heat-map.component.scss']\r\n})\r\nexport class GHeatMapComponent implements OnInit {\r\n @ViewChild('gMap', { static: false }) gMap: GoogleMap;\r\n @ViewChild(MapInfoWindow) infoWindow: MapInfoWindow;\r\n options: google.maps.MapOptions = {\r\n center: { lat: 53.355603353851706, lng: -8.208030896545232 },\r\n zoom: 7,\r\n minZoom: 7,\r\n styles: []\r\n };\r\n heatmapOptions = { radius: 5 };\r\n mapMarkers: any = [];\r\n currentZoomLevel = 7;\r\n isLoading: boolean = true;\r\n currentFilter: any;\r\n selectedMarker: any = null;\r\n hoveredMarker: any = {};\r\n heatMap: google.maps.visualization.HeatmapLayer;\r\n\r\n constructor(private heatMapService: HeatmapService,\r\n private _snackBar: MatSnackBar,\r\n private router: Router) { }\r\n\r\n ngOnInit(): void {\r\n const today = new Date();\r\n const month = today.toLocaleString('en', { month: 'short' });\r\n const year = today.getFullYear();\r\n // this.getEasyGodata([`${month} ${year}`]);\r\n }\r\n\r\n\r\n filterChange(data) {\r\n this.mapMarkers = [];\r\n this.selectedMarker = null;\r\n this.currentFilter = null;\r\n if(this.heatMap) {\r\n this.heatMap.setMap(null);\r\n }\r\n\r\n\r\n if (!data) {\r\n return;\r\n }\r\n\r\n // if (data.sessionType === 'EasyGo') {\r\n // this.getEasyGodata(data);\r\n // } else if (data.sessionType === 'ESB') {\r\n // this.getESBdata(data);\r\n // }\r\n\r\n this.getMapData(data)\r\n }\r\n\r\n generateMarker(res) {\r\n const markers = []\r\n for (let key in res) {\r\n let icon = '';\r\n const isEasyGo = key.includes('EGO') ? true : false;\r\n \r\n const currentData = res[key];\r\n currentData.lat = Number(currentData.latitude);\r\n currentData.lng = Number(currentData.longitude);\r\n currentData.friendlyCode = key;\r\n\r\n if(isEasyGo) {\r\n icon = currentData.chargePointOwner === 'Client' ? 'easygo-client-marker' : 'easygo-marker';\r\n currentData.options = {\r\n icon: `../../../assets/${icon}.png`\r\n }\r\n } else {\r\n icon = 'esb-marker'\r\n currentData.options = {\r\n icon: `../../../assets/${icon}.png`\r\n }\r\n }\r\n\r\n \r\n markers.push(currentData);\r\n }\r\n this.mapMarkers = markers;\r\n }\r\n\r\n getMapData(data) {\r\n\r\n this.currentFilter = { year: data.year, months: data.months };\r\n this.isLoading = true;\r\n\r\n this.heatMapService.getHeatmapSessions(data).subscribe((res: any) => {\r\n if (Object.keys(res).length) {\r\n // this.generateMarker(res, 'easygo-marker');\r\n this.generateMarker(res);\r\n\r\n this.initHeatMap();\r\n this.isLoading = false;\r\n }\r\n else {\r\n this.isLoading = false;\r\n this.openSnackBar(\"No data found in the selected period\", \"Close\");\r\n }\r\n\r\n }, (error) => {\r\n this.isLoading = false;\r\n this.openSnackBar(\"Something went wrong!\", \"Close\")\r\n })\r\n }\r\n\r\n getEasyGodata(data) {\r\n\r\n this.currentFilter = { year: data.year, months: data.months };\r\n this.isLoading = true;\r\n\r\n this.heatMapService.getLocationMarker(data).subscribe((res: any) => {\r\n if (Object.keys(res).length) {\r\n this.generateMarker(res);\r\n this.initHeatMap();\r\n this.isLoading = false;\r\n }\r\n else {\r\n this.isLoading = false;\r\n this.openSnackBar(\"No data found in the selected period\", \"Close\");\r\n }\r\n\r\n }, (error) => {\r\n this.isLoading = false;\r\n this.openSnackBar(\"Something went wrong!\", \"Close\")\r\n })\r\n }\r\n\r\n getESBdata(data) {\r\n\r\n this.currentFilter = { year: data.year, months: data.months };\r\n this.isLoading = true;\r\n this.heatMapService.getESBMarker(data).subscribe((res: any) => {\r\n if (Object.keys(res).length) {\r\n this.generateMarker(res);\r\n this.initHeatMap();\r\n this.isLoading = false;\r\n }\r\n else {\r\n this.isLoading = false;\r\n this.openSnackBar(\"No data found in the selected period\", \"Close\");\r\n }\r\n\r\n }, (error) => {\r\n this.isLoading = false;\r\n this.openSnackBar(\"Something went wrong!\", \"Close\")\r\n })\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.initHeatMap();\r\n }\r\n\r\n initHeatMap() {\r\n if (this.heatMap) {\r\n this.heatMap.setMap(null);\r\n }\r\n\r\n if (this.mapMarkers.length) {\r\n this.heatMap = new google.maps.visualization.HeatmapLayer({\r\n radius: 12,\r\n opacity: .8,\r\n maxIntensity: 600,\r\n data: this.mapMarkers.map((d) => {\r\n return {location: new google.maps.LatLng(d.lat, d.lng), weight: d.noOfSessions};\r\n })\r\n });\r\n this.heatMap.setMap(this.gMap.googleMap);\r\n }\r\n\r\n }\r\n\r\n zoomChange() {\r\n this.currentZoomLevel = this.gMap.getZoom();\r\n }\r\n\r\n openSnackBar(message: string, action: string) {\r\n this._snackBar.open(message, action, {\r\n duration: 5000\r\n });\r\n }\r\n\r\n openInfoWindow(markerEle: MapMarker, marker) {\r\n this.hoveredMarker = { ...marker };\r\n this.infoWindow.open(markerEle);\r\n }\r\n\r\n closeInfoWindow() {\r\n this.hoveredMarker = {};\r\n this.infoWindow.close();\r\n }\r\n\r\n onMarkClick(e, marker) {\r\n this.selectedMarker = { ...marker };\r\n // marker.locationId = \"IE*EGO0526\";\r\n // this.router.navigate(['/chart'], {\r\n // queryParams: {\r\n // locationId: marker.locationId,\r\n // year: this.currentFilter.year,\r\n // months: this.currentFilter.months.toString(),\r\n // chargeType: 'DC'\r\n // }\r\n // })\r\n // console.log(\"MARK CLIENT\", marker);\r\n }\r\n\r\n}\r\n","\r\n \r\n
\r\n\r\n\r\n
\r\n
\r\n = 10\">\r\n \r\n \r\n {{\r\n hoveredMarker.friendlyName || hoveredMarker.address\r\n }}
\r\n \r\n Number of Sessions: {{\r\n hoveredMarker.noOfSessions\r\n }}\r\n
\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { EMPTY } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CouponService {\r\n\r\n getUrl:string = 'https://www.easygo-dev.com:8081/v1/getCouponTypes'; // production\r\n // getUrl:string = 'https://localhost:8081/v1/getCouponTypes'; // development\r\n\r\n postUrl:string = \"https://www.easygo-dev.com:8081/v1/issueMerchantCoupons\" // production\r\n // postUrl:string = \"https://localhost:8081/v1/issueMerchantCoupons\" // development\r\n\r\n returnedMessage: string = '';\r\n\r\n constructor(private http: HttpClient) { }\r\n\r\n postCouponsInstructions(couponPostData: Object): any {\r\n \r\n try { \r\n const headers = { 'Content-Type': 'application/json'};\r\n let body = `${JSON.stringify(couponPostData)}`;\r\n const req = this.http.post(`${this.postUrl}`, body, {'headers': headers});\r\n req.subscribe(data => {\r\n if(data.IsSuccessful) {\r\n this.returnedMessage = `Successfully added ${data.ResultCode} coupons from coupon ID of ${data.Id}`;\r\n\r\n }\r\n });\r\n\r\n } catch(error) {\r\n console.error(error);\r\n return EMPTY;\r\n }\r\n }\r\n\r\n public getCouponTypes() {\r\n try {\r\n return this.http.get(`${this.getUrl}`)\r\n } catch(error) {\r\n console.error(error)\r\n return EMPTY;\r\n }\r\n }\r\n}\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';\r\nimport { InvoiceApiRetrieveService } from '../../services/invoice-api-retrieve-service/invoice-api-retrieve.service';\r\nimport { ChargingSessionsQuery } from '../../interfaces/chargingSessionsQuery';\r\nimport { ChargingSessionsFleetQuery } from '../../interfaces/chargingSessionsFleetQuery';\r\nimport * as moment from 'moment';\r\nimport { StateManagementService } from 'src/app/services/state-management-service/state-management-service.service';\r\nimport { EMPTY } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'app-api-invoice',\r\n templateUrl: './api-invoice.component.html',\r\n styleUrls: ['./api-invoice.component.scss']\r\n})\r\nexport class ApiInvoiceComponent implements OnInit {\r\n\r\n private chargingFromMultiple: string = '';\r\n private chargingToMultiple: string = '';\r\n public flaggedSessions = [];\r\n public uniqueFlaggedSessions = [];\r\n\r\n private chargingSessionsQuery: ChargingSessionsQuery = { \r\n companies : [],\r\n accessTypes: '',\r\n chargingFrom: '',\r\n chargingTo: ''\r\n };\r\n\r\n private chargingSessionsFleetQuery: ChargingSessionsFleetQuery = {\r\n company: '',\r\n chargingFrom: '',\r\n chargingTo: '',\r\n userPayerId: ''\r\n }\r\n\r\n public profileForm = new FormGroup({\r\n chargingFrom : new FormControl(''),\r\n chargingTo : new FormControl(''),\r\n singleCompany: new FormControl(''),\r\n accessType: new FormControl('')\r\n });\r\n\r\n public multipleFleetSubReportForm = new FormGroup({\r\n fleetSubCompanies: new FormControl(''),\r\n chargingFrom : new FormControl(''),\r\n chargingTo : new FormControl('')\r\n });\r\n\r\n public showTable: boolean;\r\n public singleCompaniesList: any[];\r\n public fleetplanCompaniesList: any[];\r\n private data: any;\r\n private showFleetPlanCompanies = false;\r\n private returnedData: any;\r\n public noDataFound = false;\r\n public dataFound = false;\r\n private chargingFromFleet: any;\r\n private chargingToFleet: any;\r\n\r\n private fleetCompany: string;\r\n private fleetFormMessage: string;\r\n private userPayerId: string;\r\n public showSubmitButton: boolean;\r\n public selectAllFleetSubs:boolean;\r\n\r\n public showFormInputs: boolean;\r\n public showFleetFormInputs: boolean;\r\n\r\n constructor(\r\n public companies: InvoiceApiRetrieveService,\r\n private formBuilder: FormBuilder,\r\n public stateManagement: StateManagementService\r\n ) { \r\n this.profileForm = this.formBuilder.group({\r\n companies: [ false, Validators.requiredTrue],\r\n chargingFrom: [''],\r\n chargingTo: [''],\r\n accessType: ['', Validators.required]\r\n })\r\n this.multipleFleetSubReportForm = this.formBuilder.group({\r\n fleetSubCompanies: [ '', Validators.required],\r\n chargingFrom: [''],\r\n chargingTo: ['']\r\n })\r\n }\r\n\r\n \r\n public getFreeAccessCompaniesList() {\r\n this.companies.getFreeAccessCompaniesList().subscribe(() => {\r\n this.fleetplanCompaniesList = this.data[0][1];\r\n })\r\n }\r\n\r\n public ngOnInit() :void {\r\n this.getFleetplanCompaniesListForMultipleReportGen();\r\n if(this.stateManagement.showSingleCompanies) {\r\n this.getSingleCompaniesList();\r\n }\r\n this.companies.getBadSessions().subscribe( (res: any) => {\r\n for(let sessionList of res) {\r\n for ( let session of sessionList.sessions) {\r\n this.flaggedSessions.push(session);\r\n }\r\n }\r\n this.uniqueFlaggedSessions = this.getUniqueListBy(this.flaggedSessions, 'sessionId');\r\n console.log(this.uniqueFlaggedSessions);\r\n \r\n })\r\n }\r\n\r\n public getUniqueListBy(flaggedSessions, key) {\r\n return [ ...new Map(flaggedSessions.map(session => [session[key], session])).values()]\r\n }\r\n\r\n public hideFleetDropdown() :void {\r\n (document.getElementsByClassName('dropdownContent')[0] as HTMLElement).style.visibility = 'hidden';\r\n }\r\n\r\n public highlightCompanyChecks(e: any) {\r\n if (e.path[2].localName !== 'form' && (e.path[0].innerText !== 'Private access - home' && e.path[0].innerText !== 'Private - only for employees' &&\r\n e.path[0].innerText !== 'Public accessible - Free access' && e.path[0].innerText !== 'Public access - payable')) {\r\n e.path[0].checked ? e.path[2].style.backgroundColor = '#6c9603' : e.path[2].style.backgroundColor = '#555'\r\n }\r\n }\r\n\r\n public getSingleCompaniesList() :void {\r\n this.companies.getSingleCompaniesList().subscribe((data: any) => {\r\n this.singleCompaniesList = data;\r\n\r\n // save boolean in service\r\n this.stateManagement.showSingleCompanies = true;\r\n this.companies.dateTo = moment().format('yyyy-MM-DDTHH:mm');\r\n this.companies.dateFrom = moment().startOf('month').format('yyyy-MM-DDTHH:mm');\r\n \r\n });\r\n this.showFormInputs = true;\r\n this.showFleetPlanCompanies = true;\r\n }\r\n\r\n public getFleetplanCompaniesListForMultipleReportGen() :void {\r\n this.companies.getFleetPlanCompaniesList().subscribe((data: any) => {\r\n this.fleetplanCompaniesList = data;\r\n console.log(this.fleetplanCompaniesList)\r\n\r\n let currentDate = new Date();\r\n let startOfPreviousMonth = new Date(currentDate.getFullYear(), currentDate.getMonth()-1, 1);\r\n let endOfPreviousMonth = new Date(currentDate.getFullYear(), currentDate.getMonth(), 0, 23, 59, 59);\r\n\r\n this.companies.dateTo = moment(startOfPreviousMonth).format('yyyy-MM-DDTHH:mm');\r\n this.companies.dateFrom = moment(endOfPreviousMonth).startOf('month').format('yyyy-MM-DDTHH:mm');\r\n (document.getElementById('fleetSubscriberMultipleChargingTo') as any).value = moment().format('yyyy-MM-DDTHH:mm');\r\n (document.getElementById('fleetSubscriberMultipleChargingFrom') as any).value = moment().startOf('month').format('yyyy-MM-DDTHH:mm');\r\n });\r\n\r\n }\r\n \r\n public getFleetplanCompaniesList(event) :void {\r\n this.companies.getFleetPlanCompaniesList().subscribe((data: any) => {\r\n this.fleetplanCompaniesList = data;\r\n\r\n (document.getElementById('fleetDropdownList') as any).style.visibility = 'visible';\r\n \r\n let currentDate = new Date();\r\n\r\n let startOfPreviousMonth = new Date(currentDate.getFullYear(), currentDate.getMonth()-1, 1);\r\n let endOfPreviousMonth = new Date(currentDate.getFullYear(), currentDate.getMonth(), 0, 23, 59, 59);\r\n\r\n this.companies.dateTo = moment(startOfPreviousMonth).format('yyyy-MM-DDTHH:mm');\r\n this.companies.dateFrom = moment(endOfPreviousMonth).startOf('month').format('yyyy-MM-DDTHH:mm');\r\n let chargingTimes = event.target.parentElement.parentElement.parentElement.parentElement.getElementsByClassName('charging')\r\n let chargingFrom = chargingTimes[0].lastChild.children[1];\r\n let chargingTo = chargingTimes[1].lastChild.children[1];\r\n\r\n chargingFrom.value = moment(startOfPreviousMonth).format('yyyy-MM-DDTHH:mm');\r\n chargingTo.value = moment(endOfPreviousMonth).format('yyyy-MM-DDTHH:mm');\r\n\r\n (document.getElementById('fleetSubscriberChargingFrom') as any).value = chargingFrom.value;\r\n (document.getElementById('fleetSubscriberChargingTo') as any).value = chargingTo.value;\r\n });\r\n \r\n }\r\n\r\n public getCompanyUserPayers(): void {\r\n this.companies.getCompanyUserPayers().subscribe((data: any) => {\r\n this.sendFormQuery(data);\r\n\r\n });\r\n }\r\n\r\n public getFleetCompanySessions(e: any) :void {\r\n this.chargingFromFleet = (document.getElementsByClassName('input-group')[0].firstElementChild as any).value;\r\n this.chargingToFleet = (document.getElementsByClassName('input-group')[1].firstElementChild as any).value;\r\n this.fleetFormMessage = '';\r\n \r\n if(this.chargingFromFleet > this.chargingToFleet) {\r\n this.fleetFormMessage = 'The to date must be before the from date. ';\r\n }\r\n if(this.chargingFromFleet === '') {\r\n this.fleetFormMessage += 'Charging from date must not be empty. ';\r\n }\r\n if(this.chargingToFleet === '') {\r\n this.fleetFormMessage += 'Charging to date must not be empty. ';\r\n }\r\n if(this.fleetFormMessage.length > 0) {\r\n this.fleetFormMessage = 'Sorry, unable to post request due to the following: ' + this.fleetFormMessage;\r\n }\r\n if(this.fleetFormMessage === '') {\r\n\r\n let toDisplayDate = this.chargingToFleet.split('T')[0];\r\n let fromDisplayDate = this.chargingFromFleet.split('T')[0];\r\n let toDate = toDisplayDate.split('-')[2] + '-' + toDisplayDate.split('-')[1] + '-' + toDisplayDate.split('-')[0];\r\n let fromDate = fromDisplayDate.split('-')[2] + '-' + fromDisplayDate.split('-')[1] + '-' + fromDisplayDate.split('-')[0];\r\n\r\n this.fleetFormMessage = `Attempting to generate report for ${this.fleetCompany} \r\n from ${fromDate} to ${toDate}`;\r\n }\r\n this.chargingSessionsFleetQuery.company = this.fleetCompany;\r\n this.chargingSessionsFleetQuery.chargingFrom = this.chargingFromFleet\r\n this.chargingSessionsFleetQuery.chargingTo = this.chargingToFleet\r\n this.chargingSessionsFleetQuery.userPayerId = this.userPayerId;\r\n this.companies.sendFleetApiQuery(this.chargingSessionsFleetQuery);\r\n }\r\n\r\n\r\n public createFleetSubscriberForm(event: any) :void {\r\n this.showSubmitButton = true;\r\n this.fleetCompany = event.target.value;\r\n \r\n this.fleetplanCompaniesList.forEach(val => {\r\n if(val.name === this.fleetCompany) {\r\n this.userPayerId = val.clientId;\r\n }\r\n });\r\n\r\n // need to generate form\r\n this.companies.dateTo = moment().format('yyyy-MM-DDTHH:mm');\r\n this.companies.dateFrom = moment().startOf('month').format('yyyy-MM-DDTHH:mm');\r\n this.showFleetFormInputs = true;\r\n }\r\n\r\n submitMultipleFleetsubs(event): void { \r\n let arrOfCompanies = event.target.parentElement.parentElement;\r\n let selectedCompanies = arrOfCompanies.querySelectorAll('input[type=checkbox]:checked');\r\n let selectedCompaniesListNames: string[] = [];\r\n\r\n for(let node of selectedCompanies) {\r\n selectedCompaniesListNames.push(node.name as string);\r\n }\r\n let selectedCompaniesList: ChargingSessionsFleetQuery[] = [];\r\n\r\n if(!this.selectAllFleetSubs) {\r\n for(let selectedCompany of selectedCompaniesListNames) {\r\n for(let fleetCompany of this.fleetplanCompaniesList) {\r\n if(selectedCompany === fleetCompany.name) {\r\n selectedCompaniesList.push(fleetCompany);\r\n }\r\n }\r\n }\r\n } else {\r\n selectedCompaniesList = this.fleetplanCompaniesList;\r\n }\r\n \r\n this.chargingFromMultiple = (document.getElementById('fleetSubscriberMultipleChargingFrom') as any).value;\r\n this.chargingToMultiple = (document.getElementById('fleetSubscriberMultipleChargingTo') as any).value;\r\n\r\n this.companies.sendFleetsApiQuery(selectedCompaniesList, this.chargingFromMultiple, this.chargingToMultiple);\r\n }\r\n\r\n sendFormQuery(companyUserPayersList) {\r\n\r\n let checkedElements: Array = document.querySelectorAll ('input[type=\"checkbox\"]:checked') as any; \r\n let checkedValues = []; \r\n for(let i = 0; i 0 && this.chargingSessionsQuery.accessTypes.length > 0 && \r\n fromDate != null && toDate != null) {\r\n (document.getElementById('submitButton') as any as HTMLElement).style.display = 'block';\r\n try {\r\n\r\n this.companies.sendApiQuery(this.chargingSessionsQuery)\r\n .subscribe(result => {\r\n this.returnedData = result;\r\n if(this.returnedData === \"No charging sessions found\") {\r\n this.noDataFound = true;\r\n this.dataFound = false;\r\n } else if (typeof this.returnedData === 'object' && this.returnedData !== null) {\r\n this.dataFound = true;\r\n this.noDataFound = false;\r\n }\r\n });\r\n } catch(error) {\r\n return EMPTY;\r\n }\r\n }\r\n\r\n }\r\n\r\n getAllFleetSubs() {\r\n this.selectAllFleetSubs = !this.selectAllFleetSubs;\r\n }\r\n\r\n}\r\n","\r\n\r\n
\r\n \r\n \r\n \r\n\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n Fleet Subscriber Companies\r\n \r\n
\r\n \r\n {{fleetplanCompanies.name}} \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n Single Companies \r\n
\r\n
\r\n\r\n \r\n\r\n \r\n
\r\n\r\n
\r\n\r\n\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n Charging From \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n Charging To \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n Create PDF Report for {{fleetCompany}} charging sessions \r\n
\r\n \r\n
\r\n
\r\n \r\n\r\n\r\n\r\n
\r\n\r\n \r\n
\r\n
\r\n
\r\n
{{returnedData}}
\r\n
\r\n
\r\n Data found for: \r\n
\r\n {{companySaved}}, \r\n \r\n \r\n
\r\n \r\n CSV Invoice template and charging sessions report for {{companySaved}} has been saved to \"Invoices/{{companySaved}}\" \r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n
\r\n
Attempting to retrieve charging sessions and generate invoice report
\r\n
\r\n
\r\n \r\n \r\n
\r\n {{companies.pdfFleetStatus}}\r\n
\r\n
\r\n\r\n\r\n
\r\n
\r\n\r\n \r\n\r\n
\r\n
\r\n
\r\n
\r\n
Attempting to retrieve charging sessions for selected fleet subscribers and generate invoice reports
\r\n
\r\n
\r\n\r\n
\r\n
\r\n \r\n Session Id \r\n User Id \r\n Sum of Costs \r\n Energy Consumed \r\n Location Name \r\n Charging From \r\n Charging To \r\n Mins Charging \r\n Access Type \r\n \r\n \r\n {{company.sessionId}} \r\n {{company.identificationUserId}} \r\n {{company.sumOfCosts | number : '1.0-2' }} \r\n {{company.activeEnergyConsumption | number : '1.0-2' }} \r\n {{company.locationName}} \r\n {{company.chargingFrom | date : 'short' }} \r\n {{company.chargingTo | date : 'short' }} \r\n {{company.minsCharging | number : '1.0-2' }} \r\n {{company.accessType}} \r\n \r\n
\r\n
\r\n\r\n\r\n
\r\n\r\n\r\n","export class CompanyCrudHelper {\r\n\r\n createTableHeaders(table: any, tableRow: any) {\r\n // Client header cell\r\n const tdCompany = document.createElement('th');\r\n this.createHeaderCell(tdCompany, \"Client\");\r\n tableRow.appendChild(tdCompany);\r\n table.appendChild(tableRow);\r\n\r\n // UserPayerID header cell\r\n const tdUserPayerId = document.createElement('th');\r\n this.createHeaderCell(tdUserPayerId, \"Payer ID\");\r\n tableRow.appendChild(tdUserPayerId);\r\n table.appendChild(tableRow);\r\n\r\n // Name header cell\r\n const tdName = document.createElement('th');\r\n this.createHeaderCell(tdName, \"Name\");\r\n tableRow.appendChild(tdName);\r\n table.appendChild(tableRow);\r\n\r\n // Email header cell\r\n const tdEmail = document.createElement('th');\r\n this.createHeaderCell(tdEmail, \"Email\");\r\n tableRow.appendChild(tdEmail);\r\n table.appendChild(tableRow);\r\n\r\n // Driver Invoicing header cell\r\n const tdDriver = document.createElement('th');\r\n this.createHeaderCell(tdDriver, \"Driver Invoicing\");\r\n tableRow.appendChild(tdDriver);\r\n table.appendChild(tableRow);\r\n\r\n // OceanUK Fleet header cell\r\n const tdOceanUk = document.createElement('th');\r\n this.createHeaderCell(tdOceanUk, \"Ocean UK\");\r\n tableRow.appendChild(tdOceanUk);\r\n table.appendChild(tableRow);\r\n }\r\n\r\n private createHeaderCell(element: any, heading: string) {\r\n element.style.marginLeft = '0.3rem';\r\n element.style.marginRight = '0.3rem';\r\n element.style.paddingLeft = '0.3rem';\r\n element.style.paddingRight = '0.3rem';\r\n element.append(heading);\r\n }\r\n\r\n createFleetRow(newFleetRow: any, company: any, counter: number) {\r\n // Client\r\n let companyRowCell = document.createElement('td');\r\n this.createTextRowCell(companyRowCell, company.name, counter);\r\n newFleetRow.appendChild(companyRowCell);\r\n\r\n // User Payer ID\r\n let userPayerIdRowCell = document.createElement('td');\r\n this.createTextRowCell(userPayerIdRowCell, company.clientId, counter);\r\n newFleetRow.appendChild(userPayerIdRowCell);\r\n\r\n // Contact Name\r\n let nameRowCell = document.createElement('td');\r\n this.createTextRowCell(nameRowCell, company.contactName, counter);\r\n newFleetRow.appendChild(nameRowCell);\r\n\r\n // Contact Email\r\n let emailRowCell = document.createElement('td');\r\n this.createTextRowCell(emailRowCell, company.email, counter);\r\n newFleetRow.appendChild(emailRowCell);\r\n\r\n // Driver Invoicing checkbox\r\n // To determine if fleet should receive invoice/reports based on number of drivers\r\n let driverInvoicingRowCell = document.createElement('td');\r\n this.createCheckboxRowCell(driverInvoicingRowCell, company.driverInvoicing, counter, \"driverCheckbox\");\r\n newFleetRow.appendChild(driverInvoicingRowCell);\r\n\r\n // Ocean UK fleet checkbox\r\n // To determine if a fleet is on Ocean UK or Ireland\r\n let oceanUkRowCell = document.createElement('td');\r\n this.createCheckboxRowCell(oceanUkRowCell, company.oceanUK, counter, \"oceanCheckbox\");\r\n newFleetRow.appendChild(oceanUkRowCell);\r\n }\r\n\r\n private createTextRowCell(element: any, text: string, counter: number) {\r\n element.append(text);\r\n element.style.paddingRight = '.5rem';\r\n element.style.paddingLeft = '.5rem';\r\n element.style.marginRight = '1.3rem';\r\n element.style.marginLeft = '1.3rem';\r\n element.style.textAlign = 'center';\r\n element.style.color = '#343434';\r\n element.style.cursor = 'default';\r\n counter % 2 === 0 ? element.style.backgroundColor = 'white' : element.style.backgroundColor = 'rgb(238, 238, 238)';\r\n }\r\n\r\n private createCheckboxRowCell(element: any, checkboxTicked: boolean, counter: number, className: string) {\r\n let checkbox = document.createElement('input');\r\n checkbox.type = \"checkbox\";\r\n checkbox.name = \"checkbox\" + counter;\r\n checkbox.checked = checkboxTicked;\r\n checkbox.className = className;\r\n\r\n element.append(checkbox);\r\n this.createTextRowCell(element, \"\", counter);\r\n }\r\n\r\n}","import { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { EMPTY } from 'rxjs';\r\nimport * as FileSaver from 'file-saver';\r\nimport * as moment from 'moment';\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class RfidAddressesService {\r\n\r\n url:string = 'https://www.easygo-dev.com:8081/v1/';\r\n // url:string = 'https://localhost:8081/v1/';\r\n\r\n returnedMessage: string;\r\n\r\n constructor(private http: HttpClient) {}\r\n\r\n public getRfidAddressesPdf() {\r\n try {\r\n let headers = new HttpHeaders();\r\n headers = headers.set('Accept', 'application/pdf')\r\n .set('Access-Control-Allow-Origin', 'https://www.easygo-dev.com')\r\n .set('Access-Control-Allow-Methods', 'POST')\r\n\r\n let body = null;\r\n let req = this.http.post(`${this.url}getRfidAddresses`, body, \r\n { headers: headers, responseType: 'blob' as 'json'});\r\n req.subscribe( (response) => {\r\n console.log(response);\r\n // moment().format('MM/DD/YYYY')\r\n const momento = moment().format('MM-DD-YYYY');\r\n let stringDate = momento.replace('-', '_');\r\n FileSaver.saveAs(response, `RfidRequest_${stringDate}.pdf`);\r\n\r\n const momentForResponesMessage = moment().format('MMMM Do YYYY, h:mm:ss a');\r\n if(response.size > 0) {\r\n this.returnedMessage = `PDF file with names and addresses for key fob requests for printing has been successfully created on ${momentForResponesMessage}`;\r\n } else {\r\n this.returnedMessage = `The PDF file is empty. Either something went wrong creating the PDF or there are currently no key fob ticket requests`;\r\n }\r\n });\r\n } catch (error) {\r\n console.error(error);\r\n return EMPTY;\r\n }\r\n }\r\n}\r\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { EMPTY } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SaveFleetSubsService {\r\n\r\n url:string = \"https://www.easygo-dev.com:8081/v1/\"; // for production in digitalocean TODO: change url\r\n //url:string = \"http://localhost:8081/v1/\"; // for dev\r\n\r\n\r\n constructor(private http: HttpClient) {}\r\n\r\n public postFleetSubAccounts(fleetSubs : any) {\r\n try { \r\n let headers = new HttpHeaders();\r\n headers = headers.set('Accept', 'application/json')\r\n .set('Content-Type', 'application/json')\r\n .set('Access-Control-Allow-Origin', 'https://www.easygo-dev.com')\r\n .set('Access-Control-Allow-Methods', 'POST');\r\n \r\n let body = `{fleetSubs:${JSON.stringify(fleetSubs)}}`;\r\n\r\n const req = this.http.post(`${this.url}postFleetSubs/`, body, \r\n { headers: headers, responseType: 'json'});\r\n req.subscribe( () => {\r\n });\r\n } catch(error) {\r\n console.error(error);\r\n return EMPTY;\r\n }\r\n }\r\n}\r\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { EMPTY } from 'rxjs';\r\nimport * as FileSaver from 'file-saver';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LocationsService {\r\n\r\n url:string = 'https://www.easygo-dev.com:8081/v1';\r\n // url:string = 'https://localhost:8081/v1';\r\n\r\n constructor(private http: HttpClient) { }\r\n \r\n \r\n public getAllLocations() {\r\n try {\r\n return this.http.get(this.url + '/locationsOfChargingStations');\r\n } catch (error) {\r\n console.error(error);\r\n return EMPTY;\r\n }\r\n }\r\n \r\n public postLocationsForCsvCreation(postObject: any) {\r\n try {\r\n let headers = new HttpHeaders();\r\n headers = headers.set('Accept', 'application/json')\r\n .set('Content-Type', 'application/json')\r\n .set('Access-Control-Allow-Origin', '*')\r\n .set('Access-Control-Allow-Methods', 'POST');\r\n\r\n let body = JSON.stringify(postObject);\r\n\r\n let req = this.http.post(`${this.url}/postLocations`, body, \r\n { headers: headers, responseType: 'json'});\r\n\r\n req.subscribe( response => {\r\n FileSaver.saveAs(response, 'test');\r\n\r\n })\r\n } catch(error) {\r\n console.error(error);\r\n return EMPTY;\r\n }\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { EMPTY } from 'rxjs';\r\nimport { ChargingSessionsQuery } from '../../interfaces/chargingSessionsQuery';\r\nimport { ChargingSessionsFleetQuery } from '../../interfaces/chargingSessionsFleetQuery';\r\nimport * as FileSaver from 'file-saver';\r\n\r\nimport * as moment from 'moment';\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class InvoiceApiRetrieveService {\r\n\r\n url:string = 'https://www.easygo-dev.com:6502/api/' // for production in digitalocean\r\n // url:string = 'https://localhost:6502/api/'; // for development\r\n\r\n private singleCompaniesList: any;\r\n private fleetPlanCompaniesList:any;\r\n private freeAccessCompaniesList:any;\r\n private companyUserPayers:any;\r\n private badSessions:any;\r\n public pdfStatus: string;\r\n private zipStatus: string;\r\n public pdfFleetStatus: string;\r\n public dateTo: string;\r\n public dateFrom: string;\r\n private fleetResponse: any;\r\n\r\n selectedCompany: any; // TODO later add an array and counter\r\n showWaitingSpinner = false;\r\n showFleetWaitingSpinner = false;\r\n showFleetsWaitingSpinner = false;\r\n\r\n // private flaggedSessions = [];\r\n // public uniqueFlaggedSessions: Array = [];\r\n\r\n constructor(private http: HttpClient) { }\r\n\r\n\r\n public getSingleCompaniesList(): any {\r\n try {\r\n this.singleCompaniesList =\r\n this.http.get(`${this.url}singleCompaniesList`);\r\n return this.singleCompaniesList;\r\n } catch (error) {\r\n console.error(error);\r\n return EMPTY;\r\n }\r\n }\r\n\r\n public getFleetPlanCompaniesList(): any {\r\n try {\r\n this.fleetPlanCompaniesList =\r\n this.http.get(`${this.url}fleetPlanCompaniesList`);\r\n return this.fleetPlanCompaniesList;\r\n } catch (error) {\r\n console.error(error());\r\n return EMPTY;\r\n }\r\n }\r\n\r\n public getFreeAccessCompaniesList(): any {\r\n try {\r\n this.freeAccessCompaniesList =\r\n this.http.get(`${this.url}freeAccessCompaniesList`);\r\n return this.freeAccessCompaniesList;\r\n } catch (error) {\r\n console.error(error);\r\n return EMPTY;\r\n }\r\n }\r\n\r\n public getCompanyUserPayers() {\r\n try {\r\n this.companyUserPayers = this.http.get(`${this.url}companyUserPayers`);\r\n return this.companyUserPayers;\r\n } catch(error) {\r\n console.error(error);\r\n return EMPTY;\r\n }\r\n }\r\n\r\n public getBadSessions() {\r\n try {\r\n this.badSessions = this.http.get('https://www.easygo-dev.com:8081/v1/naughtySessions');\r\n return this.badSessions;\r\n } catch(error) {\r\n console.error(error)\r\n return EMPTY;\r\n }\r\n\r\n }\r\n\r\n public sendApiQuery(queryObject: ChargingSessionsQuery): any {\r\n this.showWaitingSpinner = true;\r\n try {\r\n let headers = new HttpHeaders();\r\n headers = headers.set('Accept', 'application/pdf')\r\n .set('Content-Type', 'application/json')\r\n .set('Access-Control-Allow-Origin', '*')\r\n .set('Access-Control-Allow-Methods', 'GET,POST,OPTIONS,DELETE,PUT');\r\n const body = JSON.stringify(queryObject);\r\n const req = this.http.post(`${this.url}getApiQuery`, body, { headers: headers, responseType: 'blob' as 'json'} );\r\n req.subscribe( response => {\r\n FileSaver.saveAs(response, `${this.selectedCompany}_${queryObject.chargingFrom.substring(0, 10)}_to_${queryObject.chargingTo.substring(0, 10)}_Charging_Sessions`);\r\n this.showWaitingSpinner = false;\r\n const momento = moment().format('MMMM Do YYYY, h:mm:ss a');\r\n this.pdfStatus = `Successfully generated and downloaded ${this.selectedCompany}_${queryObject.chargingFrom.substring(0, 10)}_to_${queryObject.chargingTo.substring(0, 10)}_Charging_Sessions on ${momento}`;\r\n });\r\n } catch(error) {\r\n console.error(error);\r\n this.pdfStatus = 'Sorry, something went wrong. Please check the logs of the service.'\r\n return EMPTY;\r\n }\r\n }\r\n\r\n public sendFleetsApiQuery(selectedCompanies: ChargingSessionsFleetQuery[], chargingFrom: string, chargingTo: string) {\r\n this.showFleetsWaitingSpinner = true;\r\n console.log(this.showFleetsWaitingSpinner);\r\n let uniqueFlaggedSessions = [];\r\n\r\n try {\r\n let headers = new HttpHeaders();\r\n headers = headers.set('Accept', 'application/zip')\r\n .set('Content-Type', 'application/json')\r\n .set('Allow-Control-Allow-Origin', '*')\r\n .set('Access-Control-Allow-Methods', 'POST')\r\n let queryParams = {\r\n selectedCompanies : selectedCompanies,\r\n chargingFrom : chargingFrom,\r\n chargingTo : chargingTo\r\n };\r\n const body = JSON.stringify(queryParams);\r\n const req = this.http.post(`${this.url}getMultipleFleetSubReports`, body, {headers: headers, responseType: 'blob' as 'arraybuffer'});\r\n req.subscribe( response => {\r\n console.log(response);\r\n \r\n const date = moment().format('LLLL');;\r\n const momento = moment().format('L').replace('/', '_');\r\n \r\n const fileName = `fleetSubscribersPdfs_${momento}.zip`;\r\n FileSaver.saveAs(response, fileName )\r\n this.zipStatus = `Successfully generated and downloaded ${fileName} on ${date}`;\r\n \r\n this.showFleetsWaitingSpinner = false;\r\n });\r\n \r\n } catch(error) {\r\n this.zipStatus = 'Sorry, something went wrong. Please check the logs of the service at.'\r\n\r\n console.error(error);\r\n\r\n return EMPTY;\r\n }\r\n }\r\n \r\n public sendFleetApiQuery(queryObject: ChargingSessionsFleetQuery): any {\r\n this.showFleetWaitingSpinner = true;\r\n try {\r\n let headers = new HttpHeaders();\r\n headers = headers.set('Accept', 'application/pdf')\r\n .set('Content-Type', 'application/json')\r\n .set('Access-Control-Allow-Origin', '*')\r\n .set('Access-Control-Allow-Methods', 'GET,POST,OPTIONS,DELETE,PUT');\r\n const body = JSON.stringify(queryObject);\r\n const req = this.http.post(`${this.url}getFleetApiQuery/`, body, { headers: headers, responseType: 'blob' as 'json'});\r\n\r\n req.subscribe( response => {\r\n this.fleetResponse = response;\r\n if(this.fleetResponse.size === 0) {\r\n this.pdfFleetStatus = `Failed to generate a pdf file as no charging sessions have been found for ${queryObject.company} from ${queryObject.chargingFrom.substring(0, 10)} to ${queryObject.chargingTo.substring(0, 10)}`;\r\n } else {\r\n\r\n FileSaver.saveAs(response, `${queryObject.company.replace('_', '').replace(',', '_').replace(\".\", \"_\")}_${queryObject.chargingFrom.substring(0, 10)}_to_${queryObject.chargingTo.substring(0, 10)}_Charging_Sessions`);\r\n const momento = moment().format('MMMM Do YYYY, h:mm:ss a');\r\n this.pdfFleetStatus = `Successfully generated and downloaded ${queryObject.company}_${queryObject.chargingFrom.substring(0, 10)}_to_${queryObject.chargingTo.substring(0, 10)}_Charging_Sessions on ${momento}`; \r\n }\r\n\r\n });\r\n } catch(error) {\r\n console.error(error);\r\n this.pdfFleetStatus = 'Sorry, something went wrong. Please check the logs of the service.'\r\n return EMPTY;\r\n }\r\n }\r\n\r\n\r\n}\r\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { Component } from '@angular/core';\r\nimport * as FileSaver from 'file-saver';\r\nimport * as moment from 'moment';\r\n\r\n@Component({\r\n selector: 'app-csv-invoice',\r\n templateUrl: './csv-invoice.component.html',\r\n styleUrls: ['./csv-invoice.component.scss']\r\n})\r\nexport class CsvInvoiceComponent {\r\n\r\n private url: string = \"https://www.easygo-dev.com:6502/api/uploadCsvFileAng\";\r\n private selectedFile: File = null;\r\n public returnedMessage: string;\r\n public waitingMessage: string;\r\n private waiting: boolean;\r\n\r\n constructor(private http: HttpClient) { }\r\n\r\n public onFileSelected(event: any): void {\r\n this.selectedFile = event.target.files[0];\r\n }\r\n\r\n public onUpload(): void {\r\n\r\n let headers = new HttpHeaders();\r\n headers = headers.set('Accept', 'application/pdf');\r\n let fileName = this.selectedFile.name;\r\n\r\n if(fileName.endsWith('csv')) {\r\n fileName = fileName.replace('.csv', '');\r\n }\r\n\r\n this.waiting = true;\r\n\r\n if(this.waiting) {\r\n this.waitingMessage = \"working...\";\r\n this.returnedMessage = \"\";\r\n let placeholder = \"\";\r\n\r\n setTimeout(function(){\r\n placeholder = \"Please be patient, the service is still generating the file...\";\r\n this.waitingMessage = placeholder;\r\n }, 10000);\r\n\r\n }\r\n\r\n const fd = new FormData();\r\n fd.append('file', this.selectedFile, this.selectedFile.name);\r\n\r\n this.http.post(this.url, fd, { headers: headers, responseType: 'blob'})\r\n .subscribe(res => {\r\n\r\n FileSaver.saveAs(res, `${fileName}_Charging_Sessions`);\r\n const momento = moment().format('MMMM Do YYYY, h:mm:ss a');\r\n\r\n // \"res\" = response\r\n // This represents the size of the generated PDF file\r\n if(res.size > 0) {\r\n\r\n this.returnedMessage = `PDF successfully generated on ${momento}`;\r\n } else {\r\n this.returnedMessage = `Failed to successfully generated PDF on ${momento}`;\r\n }\r\n\r\n this.waiting = false;\r\n\r\n if(!this.waiting) {\r\n this.waitingMessage = \"\";\r\n }\r\n\r\n },\r\n error => { // Comes down here in the event of an error (Which happens with Hospice report)\r\n console.error();\r\n const momento = moment().format('MMMM Do YYYY, h:mm:ss a');\r\n\r\n this.returnedMessage = `Failed to successfully generated PDF on ${momento}`;\r\n this.waitingMessage = \"\";\r\n\r\n }\r\n );\r\n\r\n } // End of onUpload method\r\n\r\n} // End of CsvInvoiceComponent class\r\n","\r\n\r\n
\r\n \r\n
\r\n\r\n
\r\n\r\n
\r\n
\r\n Step 1: Select a CSV file to a generate PDF report from: \r\n
\r\n
\r\n\r\n
\r\n\r\n
\r\n \r\n \r\n\r\n
\r\n
\r\n Step 2: Generate PDF report from the selected CSV file:\r\n
\r\n
\r\n\r\n
\r\n Upload CSV File \r\n
\r\n\r\n
\r\n\r\n
\r\n \r\n
\r\n\r\n {{this.waitingMessage}} \r\n\r\n {{this.returnedMessage}} \r\n
\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { TariffLocationsService } from '../../services/tariff-locations-service/tariff-locations-service.service';\r\n\r\n@Component({\r\n selector: 'app-tariff-locations',\r\n templateUrl: './tariff-locations.component.html',\r\n styleUrls: ['./tariff-locations.component.scss']\r\n})\r\nexport class TariffLocationsComponent implements OnInit {\r\n\r\n private tariffLocations: any;\r\n private newLocation: any;\r\n private previousRowColour: string;\r\n\r\n constructor(public tariffLocationData: TariffLocationsService) { }\r\n\r\n public ngOnInit(): void {\r\n this.generateTariffLocationsTable();\r\n }\r\n\r\n public generateTariffLocationsTable(): void {\r\n this.tariffLocationData.getAllTariffLocations().subscribe((data: any) => {\r\n \r\n this.tariffLocations = data[data.length-1].tariff;\r\n\r\n let table = document.getElementById('tariff-locations-table') as any;\r\n\r\n for(let i = 0; i < this.tariffLocations.length; i++) {\r\n let temp = table.insertRow().insertCell();\r\n temp.innerText = this.tariffLocations[i].title;\r\n temp.contentEditable = true;\r\n }\r\n let table2 = document.getElementById('tariff-locations-table-details') as any;\r\n \r\n for(let i = 0; i < this.tariffLocations.length; i++) {\r\n \r\n let row = table2.insertRow()\r\n if(i % 2 === 0) {\r\n row.style.backgroundColor = '#eee';\r\n } else {\r\n row.style.backgroundColor = '#d9d9d9';\r\n }\r\n\r\n row.style.color = '#222'\r\n\r\n for(let k = 0; k < this.tariffLocations[i].locations.length; k++) {\r\n let cell = row.insertCell();\r\n cell.contentEditable = true;\r\n cell.innerText = this.tariffLocations[i].locations[k];\r\n cell.style.margin = '3px';\r\n cell.style.padding = '5px';\r\n cell.style.cursor = 'cell';\r\n }\r\n \r\n let addLocations = document.getElementsByClassName('add_locations') as any;\r\n for(let loc = 0; loc < addLocations.length; loc++) {\r\n addLocations[loc].style.float = 'right';\r\n addLocations[loc].style.marginRight = '12px';\r\n }\r\n let removePre = row.insertCell();\r\n let plusIcon = document.createElement('i');\r\n plusIcon.className = ('fa fa-minus');\r\n removePre.appendChild(plusIcon);\r\n plusIcon.style.marginRight = '8px';\r\n plusIcon.style.float = 'right';\r\n plusIcon.style.cursor = 'pointer';\r\n }\r\n\r\n let menuCells = document.getElementById('tariff-locations-table').querySelectorAll('td') as any;\r\n\r\n for(let i = 0; i < menuCells.length; i++) {\r\n\r\n menuCells[i].style.color = '#333';\r\n if(i % 2 === 0) {\r\n menuCells[i].style.backgroundColor = '#eee';\r\n } else {\r\n menuCells[i].style.backgroundColor = '#dedede';\r\n }\r\n menuCells[i].style.padding = \"5px\";\r\n }\r\n\r\n });\r\n }\r\n\r\n public addLocation(e: any): void {\r\n e.path[1].querySelectorAll('td')[e.path[1].querySelectorAll('td').length-1].querySelector('i').remove();\r\n e.path[1].querySelectorAll('td')[e.path[1].querySelectorAll('td').length-1].contentEditable = true;\r\n let positionToAddLocation = e.path[0].closest('tr'); \r\n this.newLocation = positionToAddLocation.insertCell();\r\n this.newLocation.contentEditable = true;\r\n this.newLocation.style.minWidth = '69px';\r\n\r\n let plusIcon = document.createElement('i');\r\n plusIcon.className = ('fa fa-minus');\r\n plusIcon.id = ('minus');\r\n e.path[1].querySelectorAll('td')[e.path[1].querySelectorAll('td').length-1].appendChild(plusIcon);\r\n plusIcon.style.marginRight = '8px';\r\n plusIcon.style.float = 'right';\r\n plusIcon.style.cursor = 'pointer';\r\n }\r\n\r\n public highlightRowLocations(e: any): void {\r\n if(e.path[0].attributes[0] !== undefined && e.path[0].attributes[0].textContent === 'fa fa-minus') {\r\n let rowCells = e.path[2].querySelectorAll('td').length - 2;\r\n for(let i = 0; i < e.path[2].querySelectorAll('td').length; i++) {\r\n if(i === rowCells) {\r\n e.path[2].querySelectorAll('td')[i].remove();\r\n break;\r\n }\r\n }\r\n }\r\n\r\n let highlightedRow = e.path[1];\r\n\r\n if(highlightedRow.style.backgroundColor !== 'rgb(255, 255, 146)') {\r\n this.previousRowColour = highlightedRow.style.backgroundColor;\r\n }\r\n if(highlightedRow.style.backgroundColor !== 'rgb(255, 255, 146)') {\r\n highlightedRow.style.backgroundColor = 'rgb(255, 255, 146)';\r\n } else {\r\n highlightedRow.style.backgroundColor = this.previousRowColour;\r\n }\r\n }\r\n\r\n public highlightRowHeaders(e: any): void {\r\n let highlightedRow = e.path[0];\r\n\r\n if(highlightedRow.style.backgroundColor !== 'rgb(255, 255, 146)') {\r\n this.previousRowColour = highlightedRow.style.backgroundColor;\r\n }\r\n if(highlightedRow.style.backgroundColor !== 'rgb(255, 255, 146)') {\r\n highlightedRow.style.backgroundColor = 'rgb(255, 255, 146)';\r\n } else {\r\n highlightedRow.style.backgroundColor = this.previousRowColour;\r\n }\r\n }\r\n\r\n public saveNewLocations(): void {\r\n const tariffLocationsArr = [];\r\n const tableLocationsHeaders = document.getElementById('tariff-locations-table').querySelectorAll('td') as any;\r\n const tableLocationsRows = document.getElementById('tariff-locations-table-details').querySelectorAll('tr') as any;\r\n \r\n for(let i = 0; i < tableLocationsRows.length; i++) {\r\n let tr = []\r\n for(let j = 0; j < tableLocationsRows[i].childNodes.length; j++) {\r\n\r\n if(tableLocationsRows[i].childNodes[j].innerText !== \"\") {\r\n\r\n tr.push( (tableLocationsRows[i].childNodes[j].innerText) )\r\n }\r\n }\r\n tariffLocationsArr.push( \r\n { \r\n 'Title': tableLocationsHeaders[i].textContent, \r\n 'Locations': tr\r\n }\r\n );\r\n }\r\n this.tariffLocationData.postTariffLocations(tariffLocationsArr);\r\n }\r\n\r\n \r\n}\r\n","\r\n\r\n\r\n\r\n \r\n {{this.tariffLocationData.responseMessage}}\r\n \r\n \r\n Save Locations\r\n \r\n
\r\n\r\n","import { Action } from '@ngrx/store';\r\n\r\nexport function simpleReducer(state: string = 'false', action: Action) {\r\n\r\n switch (action.type) {\r\n case 'FALSE' :\r\n return state = 'false';\r\n case 'TRUE' :\r\n return state = 'true';\r\n }\r\n\r\n}","import { Component, OnInit } from '@angular/core';\r\nimport { RfidAddressesService } from 'src/app/services/rfid-addresses-service/rfid-addresses.service';\r\n\r\n@Component({\r\n selector: 'app-rfid-addresses',\r\n templateUrl: './rfid-addresses.component.html',\r\n styleUrls: ['./rfid-addresses.component.scss']\r\n})\r\nexport class RfidAddressesComponent implements OnInit {\r\n\r\n constructor(\r\n public rfidAddressesService: RfidAddressesService\r\n ) { }\r\n\r\n ngOnInit(): void {}\r\n\r\n getRfidAddressesPDF() {\r\n this.rfidAddressesService.getRfidAddressesPdf();\r\n }\r\n\r\n}\r\n","\r\n
\r\n\r\n
\r\n
\r\n Generate addresses for key fob postage ->\r\n
\r\n \r\n
\r\n Get RFID Addresses PDF \r\n\r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n \r\n
\r\n\r\n\r\n {{this.rfidAddressesService.returnedMessage}}\r\n
","import { Injectable } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { EMPTY } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class TariffsService {\r\n\r\n url:string = \"https://www.easygo-dev.com:8081/v1\"; // for production in digitalocean TODO change url\r\n\r\n savedConfirm: string;\r\n timestamp: Date;\r\n\r\n constructor(private http: HttpClient) { }\r\n\r\n public getAllTariffs() {\r\n try {\r\n return this.http.get(`${this.url}/tariffs`);\r\n } catch (error) {\r\n console.error(console.error());\r\n return EMPTY;\r\n }\r\n }\r\n\r\n public postTariffs(tariffObject: any) {\r\n try {\r\n const headers = { 'Content-Type': 'application/json'};\r\n let body = `{\"tariffs\":${JSON.stringify(tariffObject)}}`;\r\n\r\n const req = this.http.post(`${this.url}/postTariffs`, body, {'headers': headers});\r\n req.subscribe(data => {\r\n this.timestamp = new Date();\r\n this.savedConfirm = data + ' at ' + this.timestamp;\r\n });\r\n\r\n } catch(error) {\r\n console.error(error);\r\n return EMPTY;\r\n }\r\n }\r\n}\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { FormControl, FormGroup } from '@angular/forms';\r\nimport * as moment from 'moment';\r\nimport { CouponService } from 'src/app/services/coupon-service/coupon.service';\r\n\r\n@Component({\r\n selector: 'app-coupon-interface',\r\n templateUrl: './coupon-interface.component.html',\r\n styleUrls: ['./coupon-interface.component.scss']\r\n})\r\nexport class CouponInterfaceComponent implements OnInit {\r\n\r\n coupons: any;\r\n couponSelected : boolean = false;\r\n selectedCoupon:number = 0;\r\n\r\n showCouponsMessage: boolean = false;\r\n numberOfCoupons:string = '';\r\n\r\n couponForm = new FormGroup({\r\n couponTypeId: new FormControl(''),\r\n numberOfCoupons: new FormControl('')\r\n\r\n });\r\n\r\n constructor(public couponService: CouponService) { }\r\n\r\n ngOnInit() {\r\n let selectedCoupon;\r\n this.couponService.getCouponTypes().toPromise()\r\n .then(response => {\r\n this.coupons = response\r\n return this.createCouponHtml(this.coupons);\r\n }).then(e => {\r\n e.onclick = (el: any) => {\r\n let bgColour = el.target.parentElement.style.backgroundColor;\r\n if(bgColour !== 'white') {\r\n bgColour = 'white';\r\n }\r\n if(bgColour == '#ff8282') {\r\n el.target.parentElement.style.backgroundColor = 'white';\r\n }\r\n selectedCoupon = el.target.parentElement.children[0].textContent;\r\n if(selectedCoupon.length > 10) {\r\n selectedCoupon = '';\r\n }\r\n this.selectedCoupon = selectedCoupon\r\n\r\n let selectedCouponsContainer = document.createElement('span') as any;\r\n selectedCouponsContainer.id = 'number';\r\n selectedCouponsContainer.textContent = (this.selectedCoupon);\r\n if(!this.couponSelected) { \r\n document.getElementById('idContainer').appendChild(selectedCouponsContainer);\r\n } else {\r\n document.getElementById('idContainer').removeChild(document.getElementById('number'));\r\n document.getElementById('idContainer').appendChild(selectedCouponsContainer);\r\n }\r\n this.couponSelected = true;\r\n }\r\n \r\n });\r\n }\r\n\r\n createCoupon(e): Object {\r\n let couponQuantity = e.target.parentElement.parentElement.children[0][0].value as number;\r\n if(e.target.parentElement.parentElement.children[0].children[2].children[1] === undefined) {\r\n let warningMessage = document.createElement('div');\r\n warningMessage.id = 'warningMessage';\r\n warningMessage.style.marginTop = '.4rem';\r\n warningMessage.append('Please select a coupon');\r\n if(!document.getElementById('warningMessage')) {\r\n document.getElementsByClassName('formContainer')[0].appendChild(warningMessage);\r\n }\r\n return;\r\n }\r\n if(document.getElementById('warningMessage') && e.target.parentElement.parentElement.children[0].children[2].children[1]) {\r\n document.getElementById('warningMessage').textContent = '';\r\n }\r\n let couponId = e.target.parentElement.parentElement.children[0].children[2].children[1].textContent as number;\r\n\r\n this.showCouponsMessage = true;\r\n this.numberOfCoupons = `The amount of ${couponQuantity}`;\r\n let postValues = {\r\n CouponType: {\r\n Id : couponId\r\n },\r\n NumberOfCoupons: couponQuantity,\r\n UserEmail: null,\r\n UserExternalCode: null,\r\n UserId: null\r\n }\r\n let temp = this.couponService.postCouponsInstructions(postValues);\r\n if(temp === undefined) {\r\n this.numberOfCoupons = '';\r\n this.couponService.returnedMessage = 'Failed to generate coupons, error found';\r\n (document.getElementsByClassName('returnedMessage')[0] as any).style.color = 'hsl(360deg 94% 48%)';\r\n (document.getElementsByClassName('returnedMessage')[0] as any).style.backgroundColor = 'white';\r\n (document.getElementsByClassName('returnedMessage')[0] as any).style.paddingTop = '.2rem';\r\n (document.getElementsByClassName('returnedMessage')[0] as any).style.paddingBottom = '.2rem';\r\n (document.getElementsByClassName('returnedMessage')[0] as any).style.marginLeft = '3.5rem';\r\n (document.getElementsByClassName('returnedMessage')[0] as any).style.marginRight = '3.5rem';\r\n (document.getElementsByClassName('returnedMessage')[0] as any).style.borderRadius = '.4rem';\r\n\r\n\r\n let table = document.getElementById('couponsTable');\r\n let selectedNumber = document.getElementById('number').textContent;\r\n\r\n let tableRows = table.querySelectorAll('tr');\r\n\r\n for(let i = 1; i < tableRows.length; i++) {\r\n if(tableRows[i].children[0].textContent === selectedNumber) {\r\n let validFrom = tableRows[i].children[3].textContent as any;\r\n let validTo = tableRows[i].children[4].textContent as any;\r\n let currentDate = moment().format('DD-MM-YYYY');\r\n\r\n if(validFrom < currentDate || validTo < currentDate) {\r\n this.couponService.returnedMessage = `Failed to generate coupons, error found. Coupon with id ${selectedNumber} date is invalid.`;\r\n if(validFrom > currentDate) {\r\n this.couponService.returnedMessage += ` Coupon is not valid until ${validFrom}`; \r\n }\r\n if(validTo < currentDate) {\r\n this.couponService.returnedMessage += ` Coupon validation date expired at ${validTo}`; \r\n }\r\n\r\n }\r\n }\r\n }\r\n\r\n } \r\n\r\n }\r\n\r\n\r\n createCouponHtml(coupons: any) {\r\n let couponsTable = document.getElementById('couponsTable');\r\n\r\n for(let coupon of coupons) {\r\n\r\n let couponContainer = document.createElement('tr');\r\n couponContainer.style.backgroundColor = 'white';\r\n couponContainer.style.cursor = 'pointer';\r\n\r\n couponContainer.onmouseenter = () => {\r\n if(couponContainer.style.backgroundColor !== 'white') {\r\n couponContainer.style.backgroundColor = 'rbg(255, 180, 180)';\r\n } else {\r\n couponContainer.style.backgroundColor = '#ffffda';\r\n }\r\n }\r\n couponContainer.onmouseleave = () => {\r\n couponContainer.style.backgroundColor = 'white';\r\n }\r\n\r\n let couponTypeId = document.createElement('td');\r\n couponTypeId.style.padding = '.1rem';\r\n couponTypeId.style.paddingLeft = '.3rem';\r\n couponTypeId.style.paddingRight = '.3rem';\r\n\r\n couponTypeId.append(coupon.CouponTypeId);\r\n\r\n let couponTitle = document.createElement('td');\r\n couponTitle.style.padding = '.1rem';\r\n couponTitle.style.paddingLeft = '.3rem';\r\n couponTitle.style.paddingRight = '.3rem';\r\n couponTitle.append(coupon.Title);\r\n\r\n let couponDescription = document.createElement('td');\r\n couponDescription.style.padding = '.1rem';\r\n couponDescription.style.paddingLeft = '.3rem';\r\n couponDescription.style.paddingRight = '.3rem';\r\n couponDescription.append(coupon.Description);\r\n\r\n let couponValidFrom = document.createElement('td');\r\n couponValidFrom.style.padding = '.1rem';\r\n couponValidFrom.style.paddingLeft = '.3rem';\r\n couponValidFrom.style.paddingRight = '.3rem';\r\n const momentValidFrom = moment(coupon.ValidFrom).format('DD-MM-YYYY');\r\n couponValidFrom.append(momentValidFrom);\r\n\r\n let couponValidTo = document.createElement('td');\r\n couponValidTo.style.padding = '.1rem';\r\n couponValidTo.style.paddingLeft = '.3rem';\r\n couponValidTo.style.paddingRight = '.3rem';\r\n \r\n const momentValidTo = moment(coupon.ValidTo).format('DD-MM-YYYY');\r\n couponValidTo.append(momentValidTo);\r\n\r\n let couponUsageFlavourId = document.createElement('td');\r\n couponUsageFlavourId.style.padding = '.1rem';\r\n couponUsageFlavourId.style.paddingLeft = '.3rem';\r\n couponUsageFlavourId.style.paddingRight = '.3rem';\r\n couponUsageFlavourId.style.textAlign = 'center';\r\n\r\n couponUsageFlavourId.append(coupon.CouponUsageFlavourId.Id);\r\n\r\n let couponMerchantCompanyName = document.createElement('td');\r\n couponMerchantCompanyName.style.padding = '.1rem';\r\n couponMerchantCompanyName.style.paddingLeft = '.3rem';\r\n couponMerchantCompanyName.style.paddingRight = '.3rem';\r\n couponMerchantCompanyName.style.textAlign = 'center';\r\n couponMerchantCompanyName.append(coupon.MerchantCompanyName);\r\n\r\n couponContainer.appendChild(couponTypeId);\r\n couponContainer.appendChild(couponTitle);\r\n couponContainer.appendChild(couponDescription);\r\n couponContainer.appendChild(couponValidFrom);\r\n couponContainer.appendChild(couponValidTo);\r\n couponContainer.appendChild(couponUsageFlavourId)\r\n couponContainer.appendChild(couponMerchantCompanyName);\r\n\r\n couponsTable.appendChild(couponContainer);\r\n\r\n couponContainer.onclick = (e: any) => {\r\n let row = e.target.parentElement;\r\n\r\n row.style.backgroundColor = '#ff8282';\r\n };\r\n }\r\n return couponsTable;\r\n }\r\n\r\n \r\n\r\n}\r\n","\r\n
\r\n\r\n
\r\n
\r\n
\r\n Please select a coupon type:\r\n
\r\n
\r\n
\r\n \r\n Id \r\n Title \r\n \r\n Description \r\n \r\n Valid From \r\n Valid To \r\n Usage Flavour Id \r\n Merchant Company Name \r\n\r\n \r\n\r\n\r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n \r\n
\r\n
\r\n\r\n {{this.numberOfCoupons}} {{this.couponService.returnedMessage}}\r\n
\r\n","import { Component, OnInit } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-api-invoice-site',\r\n templateUrl: './api-invoice-site.component.html',\r\n styleUrls: ['./api-invoice-site.component.scss']\r\n})\r\nexport class ApiInvoiceSiteComponent implements OnInit {\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n}\r\n","api-invoice-site works!
\r\n","import { NgModule } from '@angular/core';\r\nimport { Routes, RouterModule } from '@angular/router';\r\nimport { ChargersMapNewComponent } from './components/chargers-map-new/chargers-map-new.component';\r\nimport { GHeatMapComponent } from './components/g-heat-map/g-heat-map.component';\r\nimport { LoginComponent } from './components/login/login.component';\r\nimport { SiteDetailsComponent } from './components/site-details/site-details.component';\r\nimport { AuthguardGuard as AuthGuard } from './guards/authguard.guard';\r\nimport { ApiInvoiceComponent } from './components/api-invoice/api-invoice.component';\r\nimport { ApiInvoiceSiteComponent } from './components/api-invoice-site/api-invoice-site.component';\r\nimport { CsvInvoiceComponent } from './components/csv-invoice/csv-invoice.component';\r\nimport { TariffsComponent } from './components/tariffs/tariffs.component';\r\nimport { TariffLocationsComponent } from './components/tariff-locations/tariff-locations.component';\r\nimport { TariffTestRecordsComponent } from './components/tariff-test-records/tariff-test-records.component';\r\nimport { RfidAddressesComponent } from './components/rfid-addresses/rfid-addresses.component';\r\nimport { ChargingSessionsCsvGenComponent } from './components/charging-sessions-csv-gen/charging-sessions-csv-gen.component';\r\nimport { CompaniesCrudComponent } from './components/companies-crud/companies-crud.component';\r\nimport { CouponInterfaceComponent } from './components/coupon-interface/coupon-interface.component';\r\nimport { RegistrationFormComponent } from './components/registration-form/registration-form.component';\r\n\r\nexport const routes: Routes = [\r\n\r\n { path: 'api-invoice', component: ApiInvoiceComponent, \r\n canActivate: [AuthGuard],\r\n data: { \r\n role: 'ROLE_MODERATOR' \r\n }\r\n },\r\n { path: 'api-invoice-site', component: ApiInvoiceSiteComponent, \r\n canActivate: [AuthGuard],\r\n data: { \r\n role: 'ROLE_MODERATOR' \r\n }\r\n },\r\n { path: 'csv-invoice', component: CsvInvoiceComponent, \r\n canActivate: [AuthGuard],\r\n data: {\r\n role: 'ROLE_MODERATOR'\r\n }\r\n },\r\n { path: 'tariffs', component: TariffsComponent, \r\n canActivate: [AuthGuard],\r\n data: {\r\n role: 'ROLE_MODERATOR'\r\n }\r\n \r\n },\r\n { path: 'tariff-locations', component: TariffLocationsComponent, \r\n canActivate: [AuthGuard],\r\n data: {\r\n role: 'ROLE_MODERATOR'\r\n }\r\n \r\n },\r\n { path: 'tariff-test-records', component: TariffTestRecordsComponent,\r\n canActivate: [AuthGuard],\r\n data: {\r\n role: 'ROLE_MODERATOR'\r\n }\r\n \r\n },\r\n {\r\n path: 'charger-map', component: ChargersMapNewComponent,\r\n canActivate: [AuthGuard],\r\n data: {\r\n role: 'ROLE_SALES'\r\n }\r\n },\r\n { path: 'fleetcompanies', component: CompaniesCrudComponent, \r\n canActivate: [AuthGuard], \r\n data: {\r\n role: 'ROLE_MODERATOR'\r\n }\r\n },\r\n { path: 'coupons', component: CouponInterfaceComponent,\r\n canActivate: [AuthGuard],\r\n data: {\r\n role: 'ROLE_MODERATOR'\r\n }\r\n },\r\n { path: 'company-users-reg', component: RegistrationFormComponent, \r\n canActivate: [AuthGuard], \r\n data: {\r\n role: 'ROLE_MODERATOR'\r\n }\r\n },\r\n { path: 'chargingSessionsCsvGen', component: ChargingSessionsCsvGenComponent, \r\n canActivate: [AuthGuard],\r\n data: {\r\n role: 'ROLE_MODERATOR'\r\n } \r\n },\r\n {\r\n path: 'heatmapnew', component: GHeatMapComponent,\r\n canActivate: [AuthGuard],\r\n data: {\r\n role: 'ROLE_SALES'\r\n }\r\n },\r\n {\r\n path: 'chart', component: SiteDetailsComponent,\r\n canActivate: [AuthGuard],\r\n data: {\r\n role: 'ROLE_SALES'\r\n }\r\n },\r\n { path: 'rfid-addresses', component: RfidAddressesComponent, \r\n canActivate: [AuthGuard],\r\n data: {\r\n role: 'ROLE_MODERATOR'\r\n } \r\n },\r\n { path: 'login', component: LoginComponent },\r\n { path: '', redirectTo: 'login', pathMatch: 'full' }\r\n];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forRoot(routes)],\r\n exports: [RouterModule]\r\n})\r\n\r\nexport class AppRoutingModule { }","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\nimport { FormGroup, FormControl } from \"@angular/forms\";\r\nimport { FormBuilder } from '@angular/forms';\r\nimport { HeatmapService } from 'src/app/services/heatmap-service/heatmap.service';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { Router } from '@angular/router';\r\n\r\n@Component({\r\n selector: 'app-map-sidebar',\r\n templateUrl: './map-sidebar.component.html',\r\n styleUrls: ['./map-sidebar.component.scss']\r\n})\r\nexport class MapSidebarComponent implements OnInit {\r\n dateForm: FormGroup;\r\n private zipFiles: File = null;\r\n isLoading = false;\r\n chargeTypes: any = ['AC', 'DC'];\r\n months: any = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\r\n years: any = [];\r\n sessionTypes: any = ['EasyGo', 'ESB'];\r\n easyGoTypes: any = ['Public', 'Private'];\r\n chargeTypeControl: FormControl = new FormControl(['AC'], []);\r\n sessionControl: FormControl = new FormControl(['EasyGo'], []);\r\n monthControl: FormControl = new FormControl([], []);\r\n yearControl: FormControl = new FormControl('', []);\r\n easyGoControl: FormControl = new FormControl(['Public', 'Private'], []);\r\n @Output() onDateApply = new EventEmitter();\r\n energyAverage: number;\r\n chargingAverage: any;\r\n timeAverage: number;\r\n _selectedLocation: any;\r\n @Input() set selectedLocation(value) {\r\n this._selectedLocation = value;\r\n if(this.sessionControl.value.includes(\"EasyGo\")) {\r\n this.applyFilter();\r\n }\r\n\r\n }\r\n\r\n countsData: any = {\r\n energyConsumption: 0,\r\n chargingTime: 0,\r\n noOfChargers: 0,\r\n noOfSessions: 0\r\n };\r\n\r\n chargePointOwnerType: any = ['EasyGo', 'Client', 'Multiple'];\r\n chargePointOwnerTypeControl: any = new FormControl(['EasyGo']);\r\n\r\n constructor(private fbBuilder: FormBuilder,\r\n public heatmap: HeatmapService, private _snackBar: MatSnackBar,\r\n private router: Router) { }\r\n\r\n ngOnInit(): void {\r\n const today = new Date();\r\n const month = today.getMonth();\r\n const year = today.getFullYear();\r\n this.monthControl.setValue([this.months[month - 1]]);\r\n this.yearControl.setValue(year);\r\n this.generateYears(2020);\r\n const heatMapFilters = localStorage.getItem(\"heatmap_filters\");\r\n if(heatMapFilters) {\r\n const parsedFilter = JSON.parse(heatMapFilters);\r\n this.yearControl.setValue(parsedFilter.year);\r\n this.monthControl.setValue(parsedFilter.fullMonths);\r\n this.chargeTypeControl.setValue(parsedFilter.chargeType);\r\n this.sessionControl.setValue(parsedFilter.network);\r\n this.easyGoControl.setValue(parsedFilter.accessType);\r\n \r\n }\r\n \r\n this.getMarkerData();\r\n }\r\n\r\n generateYears(startYear) {\r\n const year = Number(new Date().getFullYear());\r\n for (let i = startYear; i <= year; i++) {\r\n this.years.push(i);\r\n }\r\n }\r\n\r\n public onFileChange(event): void {\r\n const target: DataTransfer = (event.target);\r\n if (target.files.length !== 1) throw new Error('Cannot upload multiple files!');\r\n this.zipFiles = event.target.files[0];\r\n this.isLoading = true;\r\n this.heatmap.postZipFile(this.zipFiles).subscribe((res) => {\r\n this.isLoading = false;\r\n this.openSnackBar(\"File uploaded successfully\", \"Close\");\r\n }, (error) => {\r\n this.isLoading = false;\r\n this.openSnackBar(\"Something went wrong!\", \"Close\")\r\n })\r\n }\r\n\r\n\r\n // getFormattedMonthAndYear(fieldName) {\r\n // return `${this.dateForm.value[fieldName].toLocaleString('en', { month: 'short' })} ${this.dateForm.value[fieldName].getFullYear()}`\r\n // }\r\n\r\n generateData() {\r\n const months = this.monthControl.value.map((m) => `${m.slice(0, 3)}`);\r\n\r\n const data: any = {\r\n chargeType: this.chargeTypeControl.value,\r\n year: this.yearControl.value,\r\n months: months,\r\n accessType: this.easyGoControl.value,\r\n network: this.sessionControl.value,\r\n fullMonths: this.monthControl.value,\r\n chargePointOwnerType: this.chargePointOwnerTypeControl.value\r\n }\r\n\r\n if (this._selectedLocation) {\r\n data.locationId = this._selectedLocation.friendlyCode;\r\n }\r\n\r\n return data;\r\n }\r\n\r\n reset() {\r\n this.chargeTypeControl.setValue([]);\r\n this.yearControl.setValue(\"\");\r\n this.sessionControl.setValue([]);\r\n this.monthControl.setValue([]);\r\n this._selectedLocation = null;\r\n this.onDateApply.emit(null);\r\n }\r\n\r\n getMarkerData() {\r\n const data = this.generateData();\r\n localStorage.setItem(\"heatmap_filters\", JSON.stringify(data));\r\n this.onDateApply.emit(data);\r\n }\r\n\r\n applyFilter() {\r\n\r\n const data = this.generateData();\r\n\r\n if (this._selectedLocation) {\r\n this.getCounts(data)\r\n }\r\n // this.onDateApply.emit(data);\r\n\r\n }\r\n\r\n openSnackBar(message: string, action: string) {\r\n this._snackBar.open(message, action);\r\n }\r\n\r\n generateChartData(data): any {\r\n return {\r\n labels: Object.keys(data),\r\n dataset: Object.values(data)\r\n }\r\n }\r\n\r\n getCounts(data) {\r\n this.isLoading = true;\r\n\r\n\r\n this.heatmap.getCounts(data).subscribe((res) => {\r\n this.isLoading = false;\r\n this.countsData = res;\r\n }, (error) => {\r\n this.openSnackBar(\"Something Went Wrong!\", \"Close\");\r\n this.isLoading = false;\r\n \r\n })\r\n }\r\n\r\n getChartData(data) {\r\n this.isLoading = true;\r\n this.energyAverage = 0;\r\n this.timeAverage = 0;\r\n this.chargingAverage = 0;\r\n this.heatmap.getChartData(data).subscribe((res: any) => {\r\n this.isLoading = false;\r\n if (res.energyConsumption) {\r\n const { labels, dataset } = this.generateChartData(res.energyConsumption);\r\n this.energyAverage = dataset.reduce((a, b) => a + b, 0) / dataset.length;\r\n }\r\n\r\n if (res.noOfChargingSessions) {\r\n const { labels, dataset } = this.generateChartData(res.noOfChargingSessions);\r\n this.chargingAverage = dataset.reduce((a, b) => a + b, 0);\r\n }\r\n\r\n if (res.chargingTime) {\r\n const { labels, dataset } = this.generateChartData(res.chargingTime);\r\n this.timeAverage = dataset.reduce((a, b) => a + b, 0) / dataset.length;\r\n }\r\n }, (error) => {\r\n this.openSnackBar(\"Something Went Wrong!\", \"Close\");\r\n this.isLoading = false;\r\n })\r\n }\r\n\r\n navigateToChart() {\r\n const data = this.generateData();\r\n\r\n if (this._selectedLocation) {\r\n this.router.navigate(['/chart'], {\r\n queryParams: {\r\n locationId: data.locationId,\r\n year: data.year,\r\n months: this.monthControl.value.toString(),\r\n chargeType: data.chargeType,\r\n locationName: this._selectedLocation.friendlyName\r\n }\r\n })\r\n }\r\n\r\n }\r\n}\r\n","\r\n","import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';\r\nimport { FormControl } from '@angular/forms';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { ActivatedRoute, Params, Router } from '@angular/router';\r\n// import {\r\n// Chart, registerables\r\n// } from 'chart.js';\r\n// import { ChartConfiguration } from 'chart.js';\r\nimport { Observable, of } from 'rxjs';\r\nimport { map, startWith } from 'rxjs/operators';\r\nimport { HeatmapService } from 'src/app/services/heatmap-service/heatmap.service';\r\n//Chart.register(...registerables);\r\n\r\n@Component({\r\n selector: 'app-site-details',\r\n templateUrl: './site-details.component.html',\r\n styleUrls: ['./site-details.component.scss']\r\n})\r\nexport class SiteDetailsComponent implements OnInit {\r\n @ViewChild(\"line\") lineChart: ElementRef;\r\n @ViewChild(\"bar\") barChart: ElementRef;\r\n @ViewChild(\"barTime\") barTimeChart: ElementRef;\r\n\r\n chargeTypes: any = ['AC', 'DC'];\r\n months: any = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\r\n years: any = [];\r\n chargeTypeControl: FormControl = new FormControl('', []);\r\n monthControl: FormControl = new FormControl([], []);\r\n yearControl: FormControl = new FormControl('', []);\r\n locationControl: FormControl = new FormControl('', []);\r\n isLoading: boolean;\r\n locations: any[] = [];\r\n countsData: any = {\r\n energyConsumption: 0,\r\n chargingTime: 0,\r\n noOfChargers: 0\r\n };\r\n chartData: any = {};\r\n //energyChart: Chart;\r\n //timeChart: Chart;\r\n //chargingChart: Chart;\r\n energyAverage: number;\r\n timeAverage: number;\r\n chargingAverage: number;\r\n filteredOptions: Observable;\r\n myControl = new FormControl('');\r\n\r\n constructor(private heatMapService: HeatmapService,\r\n private _snackBar: MatSnackBar,\r\n private activatedRoute: ActivatedRoute,\r\n private router: Router) { }\r\n\r\n ngOnInit(): void {\r\n\r\n this.generateYears(2020);\r\n this.getLocations();\r\n\r\n this.activatedRoute.queryParams.subscribe((params: Params) => {\r\n if (params.months) {\r\n const monthsArr = params.months.split(',');\r\n this.monthControl.setValue(monthsArr);\r\n }\r\n\r\n if (params.year) {\r\n this.yearControl.setValue(Number(params.year));\r\n }\r\n\r\n if (params.locationId) {\r\n this.myControl.setValue({friendlyCode: params.locationId, friendlyName: params.locationName});\r\n }\r\n\r\n if (params.chargeType) {\r\n if (Array.isArray(params.chargeType)) {\r\n this.chargeTypeControl.setValue(params.chargeType);\r\n } else {\r\n this.chargeTypeControl.setValue(params.chargeType.split(','));\r\n }\r\n }\r\n\r\n if (this.myControl.value && this.chargeTypeControl.value && this.yearControl.value && this.monthControl.value) {\r\n this.applyFilter();\r\n }\r\n });\r\n\r\n }\r\n\r\n private _filter(value: any): string[] {\r\n\r\n const filterValue = (typeof value === \"object\") ? value.friendlyName.toLowerCase() : value.toLowerCase();\r\n\r\n if (!value || value == '') {\r\n return this.locations;\r\n }\r\n\r\n return this.locations.filter(option => option.friendlyName.toLowerCase().includes(filterValue));\r\n }\r\n\r\n goBack() {\r\n this.router.navigate(['/heatmapnew']);\r\n }\r\n\r\n displayFn(location) {\r\n return location.friendlyName;\r\n }\r\n\r\n getLocations() {\r\n this.isLoading = true;\r\n this.heatMapService.getAllLocations().subscribe((res: any) => {\r\n this.isLoading = false;\r\n if (res.locations.length) {\r\n this.locations = res.locations;\r\n this.filteredOptions = this.myControl.valueChanges.pipe(\r\n startWith(''),\r\n map(value => this._filter(value || '')),\r\n );\r\n }\r\n\r\n }, (error) => {\r\n this.isLoading = false;\r\n })\r\n }\r\n\r\n generateFilterParam() {\r\n const months = this.monthControl.value.map((m) => m.slice(0, 3));\r\n const data = {\r\n chargeType: this.chargeTypeControl.value,\r\n locationId: this.myControl.value.friendlyCode,\r\n months: months,\r\n year: this.yearControl.value,\r\n \"accessType\": [\"Public\", \"Private\"]\r\n }\r\n return data;\r\n }\r\n\r\n getCounts(data) {\r\n this.isLoading = true;\r\n\r\n\r\n this.heatMapService.getCounts(data).subscribe((res) => {\r\n this.isLoading = false;\r\n this.countsData = res;\r\n }, (error) => {\r\n this.openSnackBar(\"Something Went Wrong!\", \"Close\");\r\n this.isLoading = false;\r\n })\r\n }\r\n\r\n generateChartData(data): any {\r\n return {\r\n labels: Object.keys(data).map((d) => d.slice(0, 3)),\r\n dataset: Object.values(data)\r\n }\r\n }\r\n\r\n getChartData(data) {\r\n this.isLoading = true;\r\n\r\n this.heatMapService.getChartData(data).subscribe((res: any) => {\r\n this.isLoading = false;\r\n this.chartData = res;\r\n if (res.energyConsumption) {\r\n const { labels, dataset } = this.generateChartData(res.energyConsumption);\r\n this.energyAverage = dataset.reduce((a, b) => a + b, 0) / dataset.length;\r\n //this.energyChart.data.datasets[0].data = dataset;\r\n //this.energyChart.data.labels = labels;\r\n //this.energyChart.update();\r\n // this.energyConsumptionChart(dataset, labels);\r\n }\r\n\r\n if (res.noOfChargingSessions) {\r\n const { labels, dataset } = this.generateChartData(res.noOfChargingSessions);\r\n this.chargingAverage = dataset.reduce((a, b) => a + b, 0) / dataset.length;\r\n //this.chargingChart.data.datasets[0].data = dataset;\r\n //this.chargingChart.data.labels = labels;\r\n //this.chargingChart.update();\r\n }\r\n\r\n if (res.chargingTime) {\r\n const { labels, dataset } = this.generateChartData(res.chargingTime);\r\n this.timeAverage = dataset.reduce((a, b) => a + b, 0) / dataset.length;\r\n //this.timeChart.data.datasets[0].data = dataset;\r\n //this.timeChart.data.labels = labels;\r\n //this.timeChart.update();\r\n }\r\n }, (error) => {\r\n this.openSnackBar(\"Something Went Wrong!\", \"Close\");\r\n this.isLoading = false;\r\n })\r\n }\r\n\r\n applyFilter() {\r\n const data = this.generateFilterParam();\r\n this.getCounts(data);\r\n this.getChartData(data);\r\n }\r\n\r\n generateYears(startYear) {\r\n const year = Number(new Date().getFullYear());\r\n for (let i = startYear; i <= year; i++) {\r\n this.years.push(i);\r\n }\r\n }\r\n\r\n openSnackBar(message: string, action: string) {\r\n this._snackBar.open(message, action, {\r\n duration: 5000\r\n });\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.energyConsumptionChart();\r\n this.chargeSessionsChart();\r\n this.timeChargeChart();\r\n }\r\n\r\n onTabChange(e) {\r\n this.energyConsumptionChart();\r\n this.chargeSessionsChart();\r\n this.timeChargeChart();\r\n }\r\n\r\n energyConsumptionChart(dataset = [], labels = []) {\r\n const ctx = this.lineChart.nativeElement.getContext('2d');\r\n // this.energyChart = new Chart(ctx, {\r\n // type: 'line',\r\n // data: {\r\n // labels: labels,\r\n // datasets: [{\r\n // label: 'Energy Consumption (KW) by Month and Year',\r\n // data: dataset,\r\n // backgroundColor: [\r\n // '#3C5F3D',\r\n\r\n // ],\r\n // borderColor: [\r\n // '#4AA545',\r\n // ],\r\n // borderWidth: 1,\r\n // fill: true,\r\n // }]\r\n // },\r\n // options: {\r\n // scales: {\r\n // y: {\r\n // beginAtZero: true,\r\n // ticks: {\r\n // color: '#fff'\r\n // }\r\n // },\r\n // x: {\r\n // ticks: {\r\n // color: '#fff'\r\n // }\r\n // }\r\n // },\r\n // plugins: {\r\n // legend: {\r\n // labels: {\r\n // color: '#fff'\r\n // }\r\n // }\r\n // },\r\n // responsive: false\r\n // }\r\n // });\r\n }\r\n\r\n timeChargeChart(dataset = [], labels = []) {\r\n const ctx = this.barTimeChart.nativeElement.getContext('2d');\r\n // this.timeChart = new Chart(ctx, {\r\n // type: 'bar',\r\n // data: {\r\n // labels: labels,\r\n // datasets: [{\r\n // label: 'Time Charging (Hrs) by Month and Year',\r\n // data: dataset,\r\n // backgroundColor: [\r\n // '#3C5F3D',\r\n\r\n // ],\r\n // borderColor: [\r\n // '#4AA545',\r\n // ],\r\n // borderWidth: 1,\r\n // maxBarThickness: 80\r\n // }]\r\n // },\r\n // options: {\r\n // scales: {\r\n // y: {\r\n // beginAtZero: true,\r\n // ticks: {\r\n // color: '#fff'\r\n // }\r\n // },\r\n // x: {\r\n // ticks: {\r\n // color: '#fff'\r\n // }\r\n // },\r\n // },\r\n // plugins: {\r\n // legend: {\r\n // labels: {\r\n // color: '#fff'\r\n // }\r\n // }\r\n // },\r\n // responsive: false\r\n // }\r\n // });\r\n }\r\n\r\n chargeSessionsChart(dataset = [], labels = []) {\r\n const ctx = this.barChart.nativeElement.getContext('2d');\r\n // this.chargingChart = new Chart(ctx, {\r\n // type: 'bar',\r\n // data: {\r\n // labels: labels,\r\n // datasets: [{\r\n // label: 'No. of Charging Sessions by Month and Year',\r\n // data: dataset,\r\n // backgroundColor: [\r\n // '#3C5F3D',\r\n\r\n // ],\r\n // borderColor: [\r\n // '#4AA545',\r\n // ],\r\n // borderWidth: 1,\r\n // maxBarThickness: 80\r\n // }]\r\n // },\r\n // options: {\r\n // scales: {\r\n // y: {\r\n // beginAtZero: true,\r\n // ticks: {\r\n // color: '#fff'\r\n // }\r\n // },\r\n // x: {\r\n // ticks: {\r\n // color: '#fff'\r\n // }\r\n // }\r\n // },\r\n // plugins: {\r\n // legend: {\r\n // labels: {\r\n // color: '#fff'\r\n // }\r\n // }\r\n // },\r\n // responsive: false\r\n // }\r\n // });\r\n }\r\n\r\n}\r\n","\r\n \r\n
\r\n\r\n\r\n
\r\n Go Back \r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n","import { Injectable } from '@angular/core';\r\nimport { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot, UrlTree } from '@angular/router';\r\nimport { AuthService } from '../services/auth/auth.service';\r\nimport * as _ from 'lodash';\r\nimport { Observable } from 'rxjs';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class AuthguardGuard implements CanActivate {\r\n\r\n constructor(private authenticationService: AuthService, private router: Router) {}\r\n\r\n canActivate( \r\n route: ActivatedRouteSnapshot, \r\n state: RouterStateSnapshot): \r\n | Observable\r\n | Promise\r\n | UrlTree\r\n | boolean {\r\n return this.authenticationService.user.roles.includes(route.data.role);\r\n }\r\n\r\n public isUserLoggedIn(): boolean {\r\n if(this.authenticationService.isLoggedIn()) {\r\n\r\n return true;\r\n }\r\n this.router.navigate(['/login']);\r\n // Send notification to user\r\n return false;\r\n }\r\n\r\n \r\n}\r\n","import { enableProdMode } from '@angular/core';\r\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\r\n\r\nimport { AppModule } from './app/app.module';\r\nimport { environment } from './environments/environment';\r\n\r\nif (environment.production) {\r\n enableProdMode();\r\n}\r\n\r\nplatformBrowserDynamic().bootstrapModule(AppModule)\r\n .catch(err => console.error(err));\r\n","function webpackEmptyAsyncContext(req) {\n\t// Here Promise.resolve().then() is used instead of new Promise() to prevent\n\t// uncaught exception popping up in devtools\n\treturn Promise.resolve().then(function() {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t});\n}\nwebpackEmptyAsyncContext.keys = function() { return []; };\nwebpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;\nmodule.exports = webpackEmptyAsyncContext;\nwebpackEmptyAsyncContext.id = \"zn8P\";"],"sourceRoot":"webpack:///"}